diff --git a/lib/client/src/client.rs b/lib/client/src/client.rs index dbbec4f3d..6d4932c7e 100644 --- a/lib/client/src/client.rs +++ b/lib/client/src/client.rs @@ -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 } diff --git a/programs/mango-v4/src/lib.rs b/programs/mango-v4/src/lib.rs index 120008ceb..1bb04700d 100644 --- a/programs/mango-v4/src/lib.rs +++ b/programs/mango-v4/src/lib.rs @@ -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) -> 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 diff --git a/programs/mango-v4/tests/cases/test_serum.rs b/programs/mango-v4/tests/cases/test_serum.rs index 5ce10366a..a21149b1f 100644 --- a/programs/mango-v4/tests/cases/test_serum.rs +++ b/programs/mango-v4/tests/cases/test_serum.rs @@ -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) { diff --git a/programs/mango-v4/tests/program_test/mango_client.rs b/programs/mango-v4/tests/program_test/mango_client.rs index 9bc845d83..4a587376e 100644 --- a/programs/mango-v4/tests/program_test/mango_client.rs +++ b/programs/mango-v4/tests/program_test/mango_client.rs @@ -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::()], - ); - // 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 { - vec![self.owner] - } -} - pub struct Serum3SettleFundsV2Instruction { pub account: Pubkey, pub owner: TestKeypair, diff --git a/ts/client/src/client.ts b/ts/client/src/client.ts index a89331bd0..cbc3141fd 100644 --- a/ts/client/src/client.ts +++ b/ts/client/src/client.ts @@ -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(