use {
crate::{
error::PerpetualsError,
state::{
multisig::{AdminInstruction, Multisig},
perpetuals::Perpetuals,
},
},
anchor_lang::prelude::*,
};
#[derive(Accounts)]
pub struct SetPermissions<'info> {
#[account()]
pub admin: Signer<'info>,
#[account(
mut,
seeds = [b"multisig"],
bump = multisig.load()?.bump
)]
pub multisig: AccountLoader<'info, Multisig>,
#[account(
mut,
seeds = [b"perpetuals"],
bump = perpetuals.perpetuals_bump
)]
pub perpetuals: Box<Account<'info, Perpetuals>>,
}
#[derive(AnchorSerialize, AnchorDeserialize)]
pub struct SetPermissionsParams {
pub allow_swap: bool,
pub allow_add_liquidity: bool,
pub allow_remove_liquidity: bool,
pub allow_open_position: bool,
pub allow_close_position: bool,
pub allow_pnl_withdrawal: bool,
pub allow_collateral_withdrawal: bool,
pub allow_size_change: bool,
}
pub fn set_permissions<'info>(
ctx: Context<'_, '_, '_, 'info, SetPermissions<'info>>,
params: &SetPermissionsParams,
) -> Result<u8> {
let mut multisig = ctx.accounts.multisig.load_mut()?;
let signatures_left = multisig.sign_multisig(
&ctx.accounts.admin,
&Multisig::get_account_infos(&ctx)[1..],
&Multisig::get_instruction_data(AdminInstruction::SetPermissions, params)?,
)?;
if signatures_left > 0 {
msg!(
"Instruction has been signed but more signatures are required: {}",
signatures_left
);
return Ok(signatures_left);
}
let perpetuals = ctx.accounts.perpetuals.as_mut();
perpetuals.permissions.allow_swap = params.allow_swap;
perpetuals.permissions.allow_add_liquidity = params.allow_add_liquidity;
perpetuals.permissions.allow_remove_liquidity = params.allow_remove_liquidity;
perpetuals.permissions.allow_open_position = params.allow_open_position;
perpetuals.permissions.allow_close_position = params.allow_close_position;
perpetuals.permissions.allow_pnl_withdrawal = params.allow_pnl_withdrawal;
perpetuals.permissions.allow_collateral_withdrawal = params.allow_collateral_withdrawal;
perpetuals.permissions.allow_size_change = params.allow_size_change;
if !perpetuals.validate() {
err!(PerpetualsError::InvalidPerpetualsConfig)
} else {
Ok(0)
}
}