Deprecate Serum3SettleFunds, require use of V2 instruction (#606)

This commit is contained in:
Christian Kamm 2023-06-15 17:34:56 +02:00 committed by GitHub
parent c956f153b0
commit 0281a1b8ed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 36 additions and 150 deletions

View File

@ -595,26 +595,34 @@ impl MangoClient {
let ix = Instruction {
program_id: mango_v4::id(),
accounts: anchor_lang::ToAccountMetas::to_account_metas(
&mango_v4::accounts::Serum3SettleFunds {
group: self.group(),
account: self.mango_account_address,
open_orders,
quote_bank: quote.mint_info.first_bank(),
quote_vault: quote.mint_info.first_vault(),
base_bank: base.mint_info.first_bank(),
base_vault: base.mint_info.first_vault(),
serum_market: s3.address,
serum_program: s3.market.serum_program,
serum_market_external: s3.market.serum_market_external,
market_base_vault: s3.coin_vault,
market_quote_vault: s3.pc_vault,
market_vault_signer: s3.vault_signer,
owner: self.owner(),
token_program: Token::id(),
&mango_v4::accounts::Serum3SettleFundsV2 {
v1: mango_v4::accounts::Serum3SettleFunds {
group: self.group(),
account: self.mango_account_address,
open_orders,
quote_bank: quote.mint_info.first_bank(),
quote_vault: quote.mint_info.first_vault(),
base_bank: base.mint_info.first_bank(),
base_vault: base.mint_info.first_vault(),
serum_market: s3.address,
serum_program: s3.market.serum_program,
serum_market_external: s3.market.serum_market_external,
market_base_vault: s3.coin_vault,
market_quote_vault: s3.pc_vault,
market_vault_signer: s3.vault_signer,
owner: self.owner(),
token_program: Token::id(),
},
v2: mango_v4::accounts::Serum3SettleFundsV2Extra {
quote_oracle: quote.mint_info.oracle,
base_oracle: base.mint_info.oracle,
},
},
None,
),
data: anchor_lang::InstructionData::data(&mango_v4::instruction::Serum3SettleFunds {}),
data: anchor_lang::InstructionData::data(&mango_v4::instruction::Serum3SettleFundsV2 {
fees_to_dao: true,
}),
};
self.send_and_confirm_owner_tx(vec![ix]).await
}

View File

@ -487,13 +487,14 @@ pub mod mango_v4 {
Ok(())
}
/// Settles all free funds from the OpenOrders account into the MangoAccount.
/// Deprecated instruction that used to settles all free funds from the OpenOrders account
/// into the MangoAccount.
///
/// Any serum "referrer rebates" (ui fees) are considered Mango fees.
pub fn serum3_settle_funds(ctx: Context<Serum3SettleFunds>) -> Result<()> {
#[cfg(feature = "enable-gpl")]
instructions::serum3_settle_funds(ctx.accounts, None, true)?;
Ok(())
Err(error_msg!(
"Serum3SettleFunds was replaced by Serum3SettleFundsV2"
))
}
/// Like Serum3SettleFunds, but `fees_to_dao` determines if referrer rebates are considered fees

View File

@ -135,16 +135,7 @@ impl SerumOrderPlacer {
}
async fn settle(&self) {
send_tx(
&self.solana,
Serum3SettleFundsInstruction {
account: self.account,
owner: self.owner,
serum_market: self.serum_market,
},
)
.await
.unwrap();
self.settle_v2(true).await
}
async fn settle_v2(&self, fees_to_dao: bool) {

View File

@ -2383,83 +2383,6 @@ impl ClientInstruction for Serum3CancelAllOrdersInstruction {
}
}
pub struct Serum3SettleFundsInstruction {
pub account: Pubkey,
pub owner: TestKeypair,
pub serum_market: Pubkey,
}
#[async_trait::async_trait(?Send)]
impl ClientInstruction for Serum3SettleFundsInstruction {
type Accounts = mango_v4::accounts::Serum3SettleFunds;
type Instruction = mango_v4::instruction::Serum3SettleFunds;
async fn to_instruction(
&self,
account_loader: impl ClientAccountLoader + 'async_trait,
) -> (Self::Accounts, instruction::Instruction) {
let program_id = mango_v4::id();
let instruction = Self::Instruction {};
let account = account_loader
.load_mango_account(&self.account)
.await
.unwrap();
let serum_market: Serum3Market = account_loader.load(&self.serum_market).await.unwrap();
let open_orders = account
.serum3_orders(serum_market.market_index)
.unwrap()
.open_orders;
let quote_info =
get_mint_info_by_token_index(&account_loader, &account, serum_market.quote_token_index)
.await;
let base_info =
get_mint_info_by_token_index(&account_loader, &account, serum_market.base_token_index)
.await;
let market_external_bytes = account_loader
.load_bytes(&serum_market.serum_market_external)
.await
.unwrap();
let market_external: &serum_dex::state::MarketState = bytemuck::from_bytes(
&market_external_bytes[5..5 + std::mem::size_of::<serum_dex::state::MarketState>()],
);
// unpack the data, to avoid unaligned references
let coin_vault = market_external.coin_vault;
let pc_vault = market_external.pc_vault;
let vault_signer = serum_dex::state::gen_vault_signer_key(
market_external.vault_signer_nonce,
&serum_market.serum_market_external,
&serum_market.serum_program,
)
.unwrap();
let accounts = Self::Accounts {
group: account.fixed.group,
account: self.account,
open_orders,
quote_bank: quote_info.first_bank(),
quote_vault: quote_info.first_vault(),
base_bank: base_info.first_bank(),
base_vault: base_info.first_vault(),
serum_market: self.serum_market,
serum_program: serum_market.serum_program,
serum_market_external: serum_market.serum_market_external,
market_base_vault: from_serum_style_pubkey(&coin_vault),
market_quote_vault: from_serum_style_pubkey(&pc_vault),
market_vault_signer: vault_signer,
owner: self.owner.pubkey(),
token_program: Token::id(),
};
let instruction = make_instruction(program_id, &accounts, &instruction);
(accounts, instruction)
}
fn signers(&self) -> Vec<TestKeypair> {
vec![self.owner]
}
}
pub struct Serum3SettleFundsV2Instruction {
pub account: Pubkey,
pub owner: TestKeypair,

View File

@ -1768,48 +1768,11 @@ export class MangoClient {
);
}
const serum3Market = group.serum3MarketsMapByExternal.get(
externalMarketPk.toBase58(),
)!;
const serum3MarketExternal = group.serum3ExternalMarketsMap.get(
externalMarketPk.toBase58(),
)!;
const [serum3MarketExternalVaultSigner, openOrderPublicKey] =
await Promise.all([
generateSerum3MarketExternalVaultSignerAddress(
this.cluster,
serum3Market,
serum3MarketExternal,
),
serum3Market.findOoPda(this.program.programId, mangoAccount.publicKey),
]);
const ix = await this.program.methods
.serum3SettleFunds()
.accounts({
group: group.publicKey,
account: mangoAccount.publicKey,
owner: (this.program.provider as AnchorProvider).wallet.publicKey,
openOrders: openOrderPublicKey,
serumMarket: serum3Market.publicKey,
serumProgram: OPENBOOK_PROGRAM_ID[this.cluster],
serumMarketExternal: serum3Market.serumMarketExternal,
marketBaseVault: serum3MarketExternal.decoded.baseVault,
marketQuoteVault: serum3MarketExternal.decoded.quoteVault,
marketVaultSigner: serum3MarketExternalVaultSigner,
quoteBank: group.getFirstBankByTokenIndex(serum3Market.quoteTokenIndex)
.publicKey,
quoteVault: group.getFirstBankByTokenIndex(serum3Market.quoteTokenIndex)
.vault,
baseBank: group.getFirstBankByTokenIndex(serum3Market.baseTokenIndex)
.publicKey,
baseVault: group.getFirstBankByTokenIndex(serum3Market.baseTokenIndex)
.vault,
})
.instruction();
return ix;
return await this.serum3SettleFundsV2Ix(
group,
mangoAccount,
externalMarketPk,
);
}
public async serum3SettleFundsV2Ix(