perpetuals/instructions/
remove_pool.rs

1//! RemovePool instruction handler
2
3use {
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    /// CHECK: empty PDA, authority for token accounts
28    #[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    // validate signatures
65    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    // remove pool from the list
86    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}