IB-Solana-Defi项目拆解2
Admin 命令详解
create_amm_config(创建 AMM 配置)
src/instructions/lib.rs:
1 | pub fn create_amm_config( |
src/instructions/admin/create_config.rs:
1 |
|
作用
创建 AMM 的全局配置,定义交易费率、协议费率、资金费率等参数。这是整个系统的基础设置,通常由管理员在部署时调用一次
工作内容
输入参数
index:配置的唯一索引trade_fee_rate:交易手续费率(例如 0.25%,即 2500 表示 2500/1e6)protocol_fee_rate:协议费率(从交易费中分配给协议所有者的部分)fund_fee_rate:资金费率(从交易费中分配给资金所有者的部分)create_pool_fee:创建池子的费用
账户
owner:调用者,必须是管理员(crate::admin::id())amm_config:新创建的配置账户,使用种子(AMM_CONFIG_SEED和index)生成system_program:用于支付账户创建费用
逻辑
- 验证调用者是管理员
- 初始化
amm_config账户,设置以下字段:
protocol_owner和fund_owner设置为调用者trade_fee_rate,protocol_fee_rate,fund_fee_rate,create_pool_fee设置为输入值disable_create_pool默认 falsebump和index记录
collect_protocol_fee(收取流动池中累积的协议费)
src/instructions/lib.rs:
1 | pub fn collect_protocol_fee( |
src/instructions/admin/collect_protocol_fee.rs:
1 |
|
作用
提取流动性池中累积的协议费用(protocol_fees_token_0 和 protocol_fees_token_1),由协议所有者或管理员调用
工作内容
输入参数
amount_0_requested: 希望提取的 token_0 最大数量amount_1_requested: 希望提取的 token_1 最大数量
账户
owner:调用者,必须是amm_config.protocol_owner或管理员authority:池子的权限账户(种子生成)pool_state:池子状态,记录累积费用amm_config:配置账户,用于验证所有者token_0_vault和token_1_vault:池子的代币储备recipient_token_0_account和recipient_token_1_account:接收费用的账户token_program和token_program_2022:代币转账程序
逻辑
- 验证调用者权限
- 从
pool_state加载费用数据
amount_0 = min(amount_0_requested, pool_state.protocol_fees_token_0)amount_1 = min(amount_1_requested, pool_state.protocol_fees_token_1)- 更新
pool_state- 减去提取的费用
- 更新
recent_epoch
- 执行转账
- 从
token_0_vault和token_1_vault转账到接收账户,使用authority签名
- 从
原理
- 协议费用来源于交易手续费的一部分(由
protocol_fee_rate决定),累积在池子中 - 提取时确保不超过实际累积量,防止超额提取
collect_fund_fee(收取流动池中累积的基金费)
代码与 collect_protocol_fee 相近,只是将 protocol 换为 fund
作用
提取流动性池中累积的资金费用(fund_fees_token_0 和 fund_fees_token_1),由资金所有者或管理员调用
工作内容
- 输入参数、账户、逻辑
- 与
collect_protocol_fee相同,只是权限检查基于amm_config.fund_owner
- 与
原理、逻辑
- 资金费用是交易费的另一部分(由
fund_fee_rate决定),与协议费用分离,用于不同的受益人。 - 实现逻辑与
collect_protocol_fee几乎相同,仅权限和字段不同
update_amm_config(更新 AMM 配置)
src/instructions/lib.rs:
1 | pub fn update_amm_config(ctx: Context<UpdateAmmConfig>, param: u8, value: u64) -> Result<()> { |
src/instructions/admin/update_config.rs:
1 | /// 更新 AMM 配置的账户结构 |
作用
更新 AMM 配置的某个参数(例如费率或所有者),由管理员调用
工作内容
输入参数
- param:要更新的参数(0: 交易费率,1: 协议费率,2: 资金费率,3: 新协议所有者,4: 新资金所有者,5: 创建池子费用,6: 是否禁用创建池子)
- value:新值
账户
- owner:必须是管理员
- amm_config:要修改的配置账户
逻辑
- 验证调用者是管理员。
- 根据 param 执行更新
0:更新trade_fee_rate,确保小于FEE_RATE_DENOMINATOR_VALUE1:更新protocol_fee_rate,确保总和不超过 100%2:更新fund_fee_rate,同上3:设置新protocol_owner(从remaining_accounts获取)4:设置新fund_owner5:更新create_pool_fee6:设置disable_create_pool(0 为 false,其他为 true)
原理
- 提供动态调整配置的能力,确保系统灵活性
- 费率检查防止配置错误(如超额分配)
update_pool_status(更新流动池的状态)
src/instructions/lib.rs:
1 | pub fn update_pool_status(ctx: Context<UpdatePoolStatus>, status: u8) -> Result<()> { |
src/instructions/admin/update_pool_status.rs:
1 | /// 更新池状态的账户结构 |
作用
更新流动性池的状态(例如启用/禁用存款、交易等),由管理员调用
工作内容
输入参数
status:新状态值(8位掩码,0-255)
账户
authority:必须是管理员pool_state:要修改的池子状态
逻辑
- 验证调用者是管理员
- 更新
pool_state.status为输入值 - 更新
recent_epoch
原理
- 状态通过位掩码控制多种功能(例如存款、取款、交易)
- 管理员可以动态启用/禁用池子操作
- Title: IB-Solana-Defi项目拆解2
- Author: Gabrielle
- Created at : 2025-07-09 11:22:44
- Updated at : 2025-07-09 11:44:27
- Link: https://zoella-w.github.io/2025/07/09/92-IB-Solana-Defi项目拆解2/
- License: This work is licensed under CC BY-NC-SA 4.0.