squads_multisig_program/instructions/
multisig_create.rs1#![allow(deprecated)]
2use anchor_lang::prelude::*;
3use anchor_lang::system_program;
4use solana_program::native_token::LAMPORTS_PER_SOL;
5
6use crate::errors::MultisigError;
7use crate::state::*;
8
9#[derive(Accounts)]
11pub struct Deprecated<'info> {
12 pub null: AccountInfo<'info>,
14}
15
16#[derive(AnchorSerialize, AnchorDeserialize)]
17pub struct MultisigCreateArgsV2 {
18 pub config_authority: Option<Pubkey>,
21 pub threshold: u16,
23 pub members: Vec<Member>,
25 pub time_lock: u32,
27 pub rent_collector: Option<Pubkey>,
30 pub memo: Option<String>,
32}
33
34#[derive(Accounts)]
35#[instruction(args: MultisigCreateArgsV2)]
36pub struct MultisigCreateV2<'info> {
37 #[account(seeds = [SEED_PREFIX, SEED_PROGRAM_CONFIG], bump)]
39 pub program_config: Account<'info, ProgramConfig>,
40
41 #[account(mut)]
44 pub treasury: AccountInfo<'info>,
45
46 #[account(
47 init,
48 payer = creator,
49 space = Multisig::size(args.members.len()),
50 seeds = [SEED_PREFIX, SEED_MULTISIG, create_key.key().as_ref()],
51 bump
52 )]
53 pub multisig: Account<'info, Multisig>,
54
55 pub create_key: Signer<'info>,
58
59 #[account(mut)]
61 pub creator: Signer<'info>,
62
63 pub system_program: Program<'info, System>,
64}
65
66impl MultisigCreateV2<'_> {
67 fn validate(&self) -> Result<()> {
68 require_keys_eq!(
70 self.treasury.key(),
71 self.program_config.treasury,
72 MultisigError::InvalidAccount
73 );
74 Ok(())
77 }
78
79 #[access_control(ctx.accounts.validate())]
81 pub fn multisig_create(ctx: Context<Self>, args: MultisigCreateArgsV2) -> Result<()> {
82 let mut members = args.members;
84 members.sort_by_key(|m| m.key);
85
86 let multisig = &mut ctx.accounts.multisig;
88 multisig.config_authority = args.config_authority.unwrap_or_default();
89 multisig.threshold = args.threshold;
90 multisig.time_lock = args.time_lock;
91 multisig.transaction_index = 0;
92 multisig.stale_transaction_index = 0;
93 multisig.create_key = ctx.accounts.create_key.key();
94 multisig.bump = ctx.bumps.multisig;
95 multisig.members = members;
96 multisig.rent_collector = args.rent_collector;
97
98 multisig.invariant()?;
99
100 let creation_fee = ctx.accounts.program_config.multisig_creation_fee;
101
102 if creation_fee > 0 {
103 system_program::transfer(
104 CpiContext::new(
105 ctx.accounts.system_program.to_account_info(),
106 system_program::Transfer {
107 from: ctx.accounts.creator.to_account_info(),
108 to: ctx.accounts.treasury.to_account_info(),
109 },
110 ),
111 creation_fee,
112 )?;
113 msg!("Creation fee: {}", creation_fee / LAMPORTS_PER_SOL);
114 }
115
116 Ok(())
117 }
118}