use anchor_lang::prelude::*;
use crate::state::*;
#[derive(AnchorSerialize, AnchorDeserialize)]
pub struct MultisigCreateArgs {
pub config_authority: Option<Pubkey>,
pub threshold: u16,
pub members: Vec<Member>,
pub time_lock: u32,
pub memo: Option<String>,
}
#[derive(Accounts)]
#[instruction(args: MultisigCreateArgs)]
pub struct MultisigCreate<'info> {
#[account(
init,
payer = creator,
space = Multisig::size(args.members.len()),
seeds = [SEED_PREFIX, SEED_MULTISIG, create_key.key().as_ref()],
bump
)]
pub multisig: Account<'info, Multisig>,
pub create_key: AccountInfo<'info>,
#[account(mut)]
pub creator: Signer<'info>,
pub system_program: Program<'info, System>,
}
impl MultisigCreate<'_> {
fn validate(&self) -> Result<()> {
Ok(())
}
#[access_control(ctx.accounts.validate())]
pub fn multisig_create(ctx: Context<Self>, args: MultisigCreateArgs) -> Result<()> {
let mut members = args.members;
members.sort_by_key(|m| m.key);
let multisig = &mut ctx.accounts.multisig;
multisig.config_authority = args.config_authority.unwrap_or_default();
multisig.threshold = args.threshold;
multisig.time_lock = args.time_lock;
multisig.transaction_index = 0;
multisig.stale_transaction_index = 0;
multisig.create_key = ctx.accounts.create_key.to_account_info().key();
multisig.bump = *ctx.bumps.get("multisig").unwrap();
multisig.members = members;
multisig.invariant()?;
Ok(())
}
}