squads_multisig_program/instructions/
program_config.rs

1use anchor_lang::prelude::*;
2
3use crate::errors::MultisigError;
4use crate::state::*;
5
6#[derive(AnchorSerialize, AnchorDeserialize)]
7pub struct ProgramConfigSetAuthorityArgs {
8    pub new_authority: Pubkey,
9}
10
11#[derive(AnchorSerialize, AnchorDeserialize)]
12pub struct ProgramConfigSetMultisigCreationFeeArgs {
13    pub new_multisig_creation_fee: u64,
14}
15
16#[derive(AnchorSerialize, AnchorDeserialize)]
17pub struct ProgramConfigSetTreasuryArgs {
18    pub new_treasury: Pubkey,
19}
20
21#[derive(Accounts)]
22pub struct ProgramConfig<'info> {
23    #[account(
24        mut,
25        seeds = [SEED_PREFIX, SEED_PROGRAM_CONFIG],
26        bump,
27    )]
28    pub program_config: Account<'info, crate::state::ProgramConfig>,
29
30    pub authority: Signer<'info>,
31}
32
33impl ProgramConfig<'_> {
34    fn validate(&self) -> Result<()> {
35        let Self {
36            program_config,
37            authority,
38        } = self;
39
40        // authority
41        require_keys_eq!(
42            program_config.authority,
43            authority.key(),
44            MultisigError::Unauthorized
45        );
46
47        Ok(())
48    }
49
50    #[access_control(ctx.accounts.validate())]
51    pub fn program_config_set_authority(
52        ctx: Context<Self>,
53        args: ProgramConfigSetAuthorityArgs,
54    ) -> Result<()> {
55        let program_config = &mut ctx.accounts.program_config;
56
57        program_config.authority = args.new_authority;
58
59        program_config.invariant()?;
60
61        Ok(())
62    }
63
64    #[access_control(ctx.accounts.validate())]
65    pub fn program_config_set_multisig_creation_fee(
66        ctx: Context<Self>,
67        args: ProgramConfigSetMultisigCreationFeeArgs,
68    ) -> Result<()> {
69        let program_config = &mut ctx.accounts.program_config;
70
71        program_config.multisig_creation_fee = args.new_multisig_creation_fee;
72
73        program_config.invariant()?;
74
75        Ok(())
76    }
77
78    #[access_control(ctx.accounts.validate())]
79    pub fn program_config_set_treasury(
80        ctx: Context<Self>,
81        args: ProgramConfigSetTreasuryArgs,
82    ) -> Result<()> {
83        let program_config = &mut ctx.accounts.program_config;
84
85        program_config.treasury = args.new_treasury;
86
87        program_config.invariant()?;
88
89        Ok(())
90    }
91}