Deprecate Serum3SettleFunds, require use of V2 instruction (#606)
This commit is contained in:
parent
c956f153b0
commit
0281a1b8ed
|
@ -595,7 +595,8 @@ impl MangoClient {
|
|||
let ix = Instruction {
|
||||
program_id: mango_v4::id(),
|
||||
accounts: anchor_lang::ToAccountMetas::to_account_metas(
|
||||
&mango_v4::accounts::Serum3SettleFunds {
|
||||
&mango_v4::accounts::Serum3SettleFundsV2 {
|
||||
v1: mango_v4::accounts::Serum3SettleFunds {
|
||||
group: self.group(),
|
||||
account: self.mango_account_address,
|
||||
open_orders,
|
||||
|
@ -612,9 +613,16 @@ impl MangoClient {
|
|||
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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue