dloom_flow/instructions/
update_dlmm_parameters.rs

1// FILE: programs/dloom_flow/src/instructions/update_dlmm_parameters.rs
2
3use crate::{errors::DloomError, state::{DlmmParameter, DlmmParameters, ProtocolConfig}};
4use anchor_lang::prelude::*;
5use crate::{ParameterAction, ParameterList};
6
7pub fn handle_update_dlmm_parameters(
8    ctx: Context<UpdateDlmmParameters>,
9    list: ParameterList,
10    action: ParameterAction,    
11    bin_step: u16,
12    fee_rate: u16,
13) -> Result<()> {
14    let params_account = &mut ctx.accounts.dlmm_parameters;
15    let target_list = match list {
16        ParameterList::Official => &mut params_account.official_parameters,
17        ParameterList::Community => &mut params_account.community_parameters,
18    };
19    
20    let new_param = DlmmParameter { bin_step, fee_rate };
21
22    match action {
23        ParameterAction::Add => {
24            // Prevent duplicates
25            if !target_list.contains(&new_param) {
26                target_list.push(new_param);
27            }
28        }
29        ParameterAction::Remove => {
30            target_list.retain(|&p| p != new_param);
31        }
32    }
33
34    emit!(crate::events::DlmmParametersUpdated {
35    list,
36    action,
37    bin_step,
38    fee_rate,
39});
40
41    Ok(())
42}
43
44#[derive(Accounts)]
45pub struct UpdateDlmmParameters<'info> {
46    pub authority: Signer<'info>,
47    #[account(
48        seeds = [b"protocol_config"], 
49        bump, 
50        has_one = authority @ DloomError::Unauthorized
51    )]
52    pub protocol_config: Box<Account<'info, ProtocolConfig>>,
53
54    #[account(
55        mut,
56        seeds = [b"dlmm_parameters"],
57        bump,
58        has_one = authority @ DloomError::Unauthorized
59    )]
60    pub dlmm_parameters: Box<Account<'info, DlmmParameters>>,
61}