use {
crate::{
error::PerpetualsError,
state::{multisig::Multisig, perpetuals::Perpetuals},
},
anchor_lang::prelude::*,
anchor_spl::token::Token,
solana_program::program_error::ProgramError,
};
#[derive(Accounts)]
pub struct Init<'info> {
#[account(mut)]
pub upgrade_authority: Signer<'info>,
#[account(
init,
payer = upgrade_authority,
space = Multisig::LEN,
seeds = [b"multisig"],
bump
)]
pub multisig: AccountLoader<'info, Multisig>,
#[account(
init,
payer = upgrade_authority,
space = 0,
seeds = [b"transfer_authority"],
bump
)]
pub transfer_authority: AccountInfo<'info>,
#[account(
init,
payer = upgrade_authority,
space = Perpetuals::LEN,
seeds = [b"perpetuals"],
bump
)]
pub perpetuals: Box<Account<'info, Perpetuals>>,
#[account(
constraint = perpetuals_program.programdata_address()? == Some(perpetuals_program_data.key())
)]
pub perpetuals_program: Program<'info, Perpetuals>,
#[account(
constraint = perpetuals_program_data.upgrade_authority_address == Some(upgrade_authority.key())
)]
pub perpetuals_program_data: Account<'info, ProgramData>,
system_program: Program<'info, System>,
token_program: Program<'info, Token>,
}
#[derive(AnchorSerialize, AnchorDeserialize, Copy, Clone)]
pub struct InitParams {
pub min_signatures: u8,
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 init(ctx: Context<Init>, params: &InitParams) -> Result<()> {
let mut multisig = ctx.accounts.multisig.load_init()?;
multisig.set_signers(ctx.remaining_accounts, params.min_signatures)?;
multisig.bump = *ctx
.bumps
.get("multisig")
.ok_or(ProgramError::InvalidSeeds)?;
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;
perpetuals.transfer_authority_bump = *ctx
.bumps
.get("transfer_authority")
.ok_or(ProgramError::InvalidSeeds)?;
perpetuals.perpetuals_bump = *ctx
.bumps
.get("perpetuals")
.ok_or(ProgramError::InvalidSeeds)?;
perpetuals.inception_time = perpetuals.get_time()?;
if !perpetuals.validate() {
return err!(PerpetualsError::InvalidPerpetualsConfig);
}
Ok(())
}