perpetuals/instructions/
remove_pool.rs1use {
4 crate::{
5 error::PerpetualsError,
6 state::{
7 multisig::{AdminInstruction, Multisig},
8 perpetuals::Perpetuals,
9 pool::Pool,
10 },
11 },
12 anchor_lang::prelude::*,
13};
14
15#[derive(Accounts)]
16pub struct RemovePool<'info> {
17 #[account(mut)]
18 pub admin: Signer<'info>,
19
20 #[account(
21 mut,
22 seeds = [b"multisig"],
23 bump = multisig.load()?.bump
24 )]
25 pub multisig: AccountLoader<'info, Multisig>,
26
27 #[account(
29 mut,
30 seeds = [b"transfer_authority"],
31 bump = perpetuals.transfer_authority_bump
32 )]
33 pub transfer_authority: AccountInfo<'info>,
34
35 #[account(
36 mut,
37 realloc = Perpetuals::LEN + (perpetuals.pools.len() - 1) * 32,
38 realloc::payer = admin,
39 realloc::zero = false,
40 seeds = [b"perpetuals"],
41 bump = perpetuals.perpetuals_bump
42 )]
43 pub perpetuals: Box<Account<'info, Perpetuals>>,
44
45 #[account(
46 mut,
47 seeds = [b"pool",
48 pool.name.as_bytes()],
49 bump = pool.bump,
50 close = transfer_authority
51 )]
52 pub pool: Box<Account<'info, Pool>>,
53
54 system_program: Program<'info, System>,
55}
56
57#[derive(AnchorSerialize, AnchorDeserialize)]
58pub struct RemovePoolParams {}
59
60pub fn remove_pool<'info>(
61 ctx: Context<'_, '_, '_, 'info, RemovePool<'info>>,
62 params: &RemovePoolParams,
63) -> Result<u8> {
64 let mut multisig = ctx.accounts.multisig.load_mut()?;
66
67 let signatures_left = multisig.sign_multisig(
68 &ctx.accounts.admin,
69 &Multisig::get_account_infos(&ctx)[1..],
70 &Multisig::get_instruction_data(AdminInstruction::RemovePool, params)?,
71 )?;
72 if signatures_left > 0 {
73 msg!(
74 "Instruction has been signed but more signatures are required: {}",
75 signatures_left
76 );
77 return Ok(signatures_left);
78 }
79
80 require!(
81 ctx.accounts.pool.tokens.is_empty(),
82 PerpetualsError::InvalidPoolState
83 );
84
85 let perpetuals = ctx.accounts.perpetuals.as_mut();
87 let pool_idx = perpetuals
88 .pools
89 .iter()
90 .position(|x| *x == ctx.accounts.pool.key())
91 .ok_or::<Error>(PerpetualsError::InvalidPoolState.into())?;
92 perpetuals.pools.remove(pool_idx);
93
94 Ok(0)
95}