Skip to main content

antegen_thread_program/instructions/
config_update.rs

1use crate::{constants::*, errors::*, state::*};
2use anchor_lang::prelude::*;
3
4/// Parameters for updating the thread config
5#[derive(AnchorSerialize, AnchorDeserialize, Default)]
6pub struct ConfigUpdateParams {
7    pub admin: Option<Pubkey>,
8    pub paused: Option<bool>,
9    pub commission_fee: Option<u64>,
10    pub executor_fee_bps: Option<u64>,
11    pub core_team_bps: Option<u64>,
12    pub grace_period_seconds: Option<i64>,
13    pub fee_decay_seconds: Option<i64>,
14}
15
16/// Accounts required by the `config_update` instruction.
17#[derive(Accounts)]
18pub struct ConfigUpdate<'info> {
19    /// The admin updating the config
20    #[account(
21        mut,
22        constraint = admin.key() == config.admin @ AntegenThreadError::InvalidAuthority
23    )]
24    pub admin: Signer<'info>,
25
26    /// The config account to update
27    #[account(
28        mut,
29        seeds = [SEED_CONFIG],
30        bump = config.bump
31    )]
32    pub config: Account<'info, ThreadConfig>,
33}
34
35pub fn config_update(ctx: Context<ConfigUpdate>, params: ConfigUpdateParams) -> Result<()> {
36    let config = &mut ctx.accounts.config;
37
38    // Update admin if provided
39    if let Some(new_admin) = params.admin {
40        config.admin = new_admin;
41        msg!("Config admin updated to: {}", new_admin);
42    }
43
44    // Update pause state if provided
45    if let Some(paused) = params.paused {
46        config.paused = paused;
47        msg!("Config paused state updated to: {}", paused);
48    }
49
50    // Update commission fee if provided
51    if let Some(commission_fee) = params.commission_fee {
52        config.commission_fee = commission_fee;
53        msg!("Commission fee updated to: {} lamports", commission_fee);
54    }
55
56    // Update fee percentages if provided
57    if let Some(executor_fee_bps) = params.executor_fee_bps {
58        require!(
59            executor_fee_bps <= 10000,
60            AntegenThreadError::InvalidFeePercentage
61        );
62        config.executor_fee_bps = executor_fee_bps;
63        msg!("Executor fee updated to: {} bps", executor_fee_bps);
64    }
65
66    if let Some(core_team_bps) = params.core_team_bps {
67        require!(
68            core_team_bps <= 10000,
69            AntegenThreadError::InvalidFeePercentage
70        );
71        config.core_team_bps = core_team_bps;
72        msg!("Core team fee updated to: {} bps", core_team_bps);
73    }
74
75    // Update timing parameters if provided
76    if let Some(grace_period) = params.grace_period_seconds {
77        require!(
78            grace_period >= 0 && grace_period <= 60, // Max 60 seconds grace
79            AntegenThreadError::InvalidFeePercentage
80        );
81        config.grace_period_seconds = grace_period;
82        msg!("Grace period updated to: {} seconds", grace_period);
83    }
84
85    if let Some(decay_period) = params.fee_decay_seconds {
86        require!(
87            decay_period >= 0 && decay_period <= 600, // Max 10 minutes decay
88            AntegenThreadError::InvalidFeePercentage
89        );
90        config.fee_decay_seconds = decay_period;
91        msg!("Fee decay period updated to: {} seconds", decay_period);
92    }
93
94    // Validate that total fees equal 100%
95    let total_fees = config.executor_fee_bps + config.core_team_bps;
96    require!(
97        total_fees == 10000,
98        AntegenThreadError::InvalidFeePercentage
99    );
100
101    Ok(())
102}