本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
两项独立费用,四个目的地
CPMM 对每次交换收取两项独立费率的费用:- 交易费 — 按
AmmConfig.trade_fee_rate收取,分配给三个目的地:- LP 份额 — 留在金库中并增加
k。通过销毁 LP 代币隐式领取。 - 协议份额 — 累积到
PoolState.protocol_fees_token*;由protocol_owner通过CollectProtocolFee扫出。 - 基金份额 — 累积到
PoolState.fund_fees_token*;由fund_owner通过CollectFundFee扫出。
- LP 份额 — 留在金库中并增加
- 创建者费(可选,按池) — 按
AmmConfig.creator_fee_rate收取,独立于交易费,累积到PoolState.creator_fees_token*。创建者可以通过CollectCreatorFee扫出,或任何支付者可以触发目的地受限的CollectCreatorFeePermissionless路径。仅当池创建时enable_creator_fee = true时才活跃。
trade_fee 派生,永远不从 creator_fee 派生。一个 creator_fee_rate = 1000(0.10%)和 trade_fee_rate = 2500(0.25%)的池在创建者费按输入收取的交换中收取输入的 0.35%,其中创建者保留 0.10%,交易费桶获得 0.25%。
交易费费率(trade_fee_rate、protocol_fee_rate、fund_fee_rate)和 creator_fee_rate 都在 AmmConfig 上。每池的 enable_creator_fee 标志和 creator_fee_on 模式(从交易的哪一侧收取创建者费)在 PoolState 上。见 products/cpmm/accounts。
费率和单位
所有费率都是u64,单位为 1 / FEE_RATE_DENOMINATOR,其中 FEE_RATE_DENOMINATOR = 1_000_000。
trade_fee_rate是交换量的分数。2500⇒ 相关侧(输入或输出,取决于creator_fee_on— 见下面的”从交易的哪一侧收取费用”)的 0.25%。creator_fee_rate是交换量的分数,独立于交易费收取。1000⇒ 相关侧的 0.10%。protocol_fee_rate和fund_fee_rate是交易费的分数,不是交换量的分数。120_000⇒ 交易费的 12%。
AmmConfig[index=0](“标准” 0.25% 池)的默认参数,供参考:
所以在针对
AmmConfig[0] 的 $1,000 交换中,enable_creator_fee = false:$2.50 总交易费,其中 $2.10 留给 LP,$0.30 给协议,$0.10 给基金。创建者桶为 0,因为创建者费被禁用。
如果同一池有 enable_creator_fee = true 和 creator_fee_rate = 1000(0.10%),用户向创建者桶额外支付 $1.00 — 从 creator_fee_on 配置的同一侧收取 — 总费用为 $3.50。交易费桶及其协议/基金分割保持不变。
根据 GET https://api-v3.raydium.io/main/cpmm-config 确认当前主网值 — 费率由管理员可变,应该新鲜读取而不是硬编码。
代码中的分割
- 输入上的总费用四舍五入向上,所以池永远不会少收费用。
trade_fee的子分割(协议、基金)四舍五入向下,所以它们的总和永远不超过trade_fee;余数是 LP 份额。lp_share = trade_fee − protocol_fee − fund_fee(creator_fee 不在这里减去,因为它是自己的桶)。- 创建者费从输入或输出收取,取决于
PoolState.creator_fee_on(见下一部分)。费率无论哪种方式都不变。
从交易的哪一侧收取费用
CPMM 有一个每池的creator_fee_on 设置(BothToken / OnlyToken0 / OnlyToken1),决定创建者费是从给定交换的输入侧还是输出侧收取。运行时辅助函数 is_creator_fee_on_input(direction) 将其按交换折叠为布尔值:
当创建者费在输入侧时,交易费和创建者费都在曲线运行前从
amount_in 扣除。报价数学:从输入中取出组合的 trade_rate + creator_rate。
当创建者费在输出侧时,只有交易费从 amount_in 扣除;曲线产生无费用的输出,然后创建者费从该输出扣除。报价数学:从输入中取出 trade_rate;从输出中取出 creator_rate。
交易费本身始终在输入侧收取(标准 Uniswap-V2 模式)。只有创建者费可以在输出侧。
“累积”费用如何与曲线交互
一个重要的微妙之处:协议、基金和创建者费在物理上留在金库中,直到调用各自的Collect* 指令。但它们被排除在曲线对金库余额的视图之外。
一次交换后的具体情况:
k' ≥ k 时使用 curve_x(和类似的 curve_y)。这是非 LP 费用到达其目的地而不膨胀 LP 池份额的方式。
你应该围绕的后果:
- 从原始余额报价是错误的。 如果你从
getTokenAccountBalance构建报价器,你会一致地高估池将接受的价格。始终减去累积费用,或通过SwapBaseInput/ API 模拟。 CollectProtocolFee不移动价格。 它将代币移出金库并将protocol_fees_token*计数器清零,所以curve_x和curve_y不变。- LP 费用不累积到计数器。 它们隐含在金库余额中。LP 对累积 LP 费用的权利通过销毁 LP 代币(即通过
Withdraw)行使 — 没有CollectLpFee。
与 Token-2022 转账费的交互
Token-2022 转账费由铸币厂应用,不是由 CPMM 应用。它们作用于每次代币转账 — 交换、存款、提款和Collect* 扫出。CPMM 的交易费数学是根据实际进入金库的金额计算的,即净输入铸币厂的转账费(如果有的话)。
所以在最坏的情况下,用户在输入精确交换上支付三项不同的税:
- 输入铸币厂在
amount_in上的转账费(给铸币厂的费用权限)。 - 池的
trade_fee在余额上(按上面分割)。 - 输出铸币厂在
amount_out上的转账费(给铸币厂的费用权限)。
minimum_amount_out 以用户实际收到的形式计价。如果你在编写自己的报价器,镜像该行为,否则你的滑点检查将系统性地过于宽松。
见 algorithms/token-2022-transfer-fees 了解详细推导。
创建者费
创建者费是可选的且按池。费率在AmmConfig.creator_fee_rate 上;启用标志和侧(creator_fee_on)在 PoolState 上:
- 在池创建时启用。
Initialize默认设置enable_creator_fee = false;通过InitializeWithPermission创建的池(由 LaunchLab 毕业和其他门控路径使用)可以传递enable_creator_fee = true并选择creator_fee_on。 - 费率与费用等级共享。 费率本身是
AmmConfig.creator_fee_rate,绑定到该配置的每个池中的相同值。然后每个池决定是否收取它(enable_creator_fee)以及从交换的哪一侧收取它(creator_fee_on)。当enable_creator_fee = false时,池的有效创建者费率为零,无论配置值如何(见源中的PoolState::adjust_creator_fee_rate)。 - 独立于交易费。 创建者费永远不会减少 LP / 协议 / 基金份额 — 它是自己的费率,单独应用,在自己的计数器中累积。
- 通过
CollectCreatorFee或CollectCreatorFeePermissionless扫出。 原始路径需要PoolState.pool_creator签名。无权限路径让任何支付者触发收集,但将两个目的地固定为创建者的规范 ATA。 - 创建后无法重新启用或重新路由。 使用
enable_creator_fee = false初始化的池永远不会收取创建者费;使用特定creator_fee_on初始化的池无法切换侧。
收集操作流程
协议和基金所有者是主网上的 Raydium 多签;见
security/admin-and-multisig。在原始仅创建者路径上,创建者签名者是 PoolState 中记录的账户。在无权限路径上,调用者支付创建任何缺失的创建者 ATA。程序将 creator 约束为 pool_state.pool_creator 并从该创建者加上相应的金库铸币厂和代币程序派生每个目的地,所以调用者无法重定向资金。
更改费用等级
费率可以由管理员通过UpdateAmmConfig 更改(见 products/cpmm/instructions)。更改在下一次交换对绑定到该 AmmConfig 的每个池生效 — 没有迁移,因为池在每次交换时加载配置。
管理员不能做的:
- 将池从一个
AmmConfig移到另一个。 - 追溯重新定价已累积的费用。
- 在没有
protocol_owner/fund_owner签名者的情况下收集费用。
从运行中的池读取费用
与 CLMM 和 AMM v4 的比较
见reference/fee-comparison 了解并排矩阵。总结:
- AMM v4 使用固定 0.25% 交易费,具有不同的 LP/协议分割,没有基金费。
- CLMM 费用按每个 tick 间距等级,按位置累积(不是按池),并通过
DecreaseLiquidity或CollectFees领取。
接下来去哪里
products/cpmm/math— 交易费扣除插入曲线的位置。products/cpmm/instructions—Collect*指令账户列表。algorithms/token-2022-transfer-fees— 如何正确组合池交易费和铸币厂转账费。

