本页内容由 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时才活跃。自 2026-09-19 升级以来,累积的创建者费在收集时再次分割:可配置的份额被移入池的协议桶,只有剩余部分到达创建者 — 见创建者费的协议份额。
trade_fee,从不来自 creator_fee。一个 creator_fee_rate = 1000(0.10%)和 trade_fee_rate = 2500(0.25%)的池在创建者费按输入计算的交易中收取输入的 0.35%,其中创建者桶获得 0.10%,交易费桶获得 0.25%。
创建者费的协议份额方向相反,容易与上述混淆:它是从创建者桶中切割出来的,不是从交易费中,也不是在交易时 — 它在 CollectCreatorFee 或 CollectCreatorFeePermissionless 结算累积余额时应用。交易数学不受其影响。
交易费费率(trade_fee_rate、protocol_fee_rate、fund_fee_rate)、creator_fee_rate 和默认 creator_fee_share_rate 都位于 AmmConfig 上。按池的 enable_creator_fee 标志和 creator_fee_on 模式(从交易的哪一侧收取创建者费)位于 PoolState 上。按创建者的份额费率覆盖位于其自己的 CreatorFeeShare PDA 上。见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%。creator_fee_share_rate是累积创建者费的一部分,不是交易量,也不是交易费。200_000⇒ 收集时creator_fees_token*中任何内容的 20%。0(默认值)将整个创建者费留给创建者。
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初始化的池无法切换侧。
创建者费的协议份额
自 2026-09-19 升级以来,协议可以保留创建者费的可配置份额。关于交易的任何内容都没有改变:创建者费仍然按creator_fee_rate 收取,仍然完全累积到 creator_fees_token{0,1}。分割发生一次,在收集时,在 CollectCreatorFee 和 CollectCreatorFeePermissionless 内部。
费率来自哪里
两个来源,按优先级顺序:CreatorFeeSharePDA — 种子["creator_fee_share", creator, amm_config]。当此账户存在且由 CPMM 拥有时,其share_rate获胜。它让协议在给定费用等级上协商按创建者费率,而无需触及等级本身。AmmConfig.creator_fee_share_rate— 该费用等级上每个创建者的默认值。在 PDA 不存在时使用。
FEE_RATE_DENOMINATOR = 1_000_000 上的 u64,两者都上限为分母。收集指令始终获取 creator_fee_share 账户,即使它从未被创建 — 程序检查它是否为空并回退到配置。传递错误的地址会失败 PDA 约束,而不是回退。
分割做什么
creator_fees_token_0 和 creator_fees_token_1,然后:
creator_amount_{0,1}从金库转出到创建者的代币账户。shared_amount_{0,1}被添加到protocol_fees_token_{0,1}并保留在金库中,直到协议所有者用CollectProtocolFee扫出。没有单独的指令,也没有单独的计数器。creator_fees_token_{0,1}被清零,完全如前所述。
- 四舍五入有利于创建者。 协议份额向下取整,所以灰尘留给创建者 — 与
protocol_fee和fund_fee相同的方向,它们也从已累积的费用中切割份额。 - 值被保守。 对于每个费率和每个费用,包括
u64::MAX,creator_amount + shared_amount == creator_fee。 share_rate = 0是无操作。 默认配置值和CreatorFeeSharePDA 的缺失都将整个创建者费留给创建者,这是升级前的行为。
对集成商的含义
- LP 和报价不受影响。 共享金额在两个计数器之间移动,这两个计数器都已经从曲线对金库的视图中排除(
vault_amount_without_fee),所以curve_x和curve_y在收集中不移动。k不变。 - 读取
creator_fees_token*的创建者费估计器现在高估了支付。 使用实际适用于该(creator, amm_config)对的费率乘以(1 − share_rate / 1_000_000),而不是配置默认值。 protocol_fees_token*在交易外增长。 监视协议累积与交易量的监视器将在每次创建者费收集时看到跳跃。协议累积不再仅仅是trade_fee × protocol_fee_rate。- 费率可以在累积和收集之间改变。 它在收集时读取,所以在某人调用
Collect*时,在一个费率下累积的费用以任何有效的费率结算。
CreatorFeeShare 账户由管理员或专用创建者费份额权限通过 CreateCreatorFeeShare / CloseCreatorFeeShare 创建和关闭;关闭它将对返回到 AmmConfig.creator_fee_share_rate。账户布局在 products/cpmm/accounts,地址在 reference/program-addresses。
收集操作流程
协议和基金所有者是主网上的 Raydium 多签;见
security/admin-and-multisig。在原始仅创建者路径上,创建者签名者是 PoolState 中记录的账户。在无权限路径上,调用者支付创建任何缺失的创建者 ATA。程序将 creator 约束为 pool_state.pool_creator 并从该创建者加上相应的金库铸币厂和代币程序派生每个目的地,所以调用者无法重定向资金。
更改费用等级
费率可以由管理员通过UpdateAmmConfig 更改(见 products/cpmm/instructions)。更改在下一笔交易对绑定到该 AmmConfig 的每个池生效 — 没有迁移,因为池在每笔交易时加载配置。
管理员不能做的:
- 将池从一个
AmmConfig移到另一个。 - 追溯重新定价已累积的费用。
- 在没有
protocol_owner/fund_owner签名者的情况下收集费用。
从运行中的池读取费用
在链上解析份额费率,而不是从缓存的配置。
creator_fee_share_rate 是新添加的 AmmConfig 字段,所以从账户读取它,而不是假设 REST 配置有效负载携带它,并在 ["creator_fee_share", creator, ammConfig] 检查 CreatorFeeShare PDA 是否存在,然后向创建者报价支付。缺失的 PDA 是常见情况,意味着配置默认值适用。与 CLMM 和 AMM v4 的比较
见reference/fee-comparison 了解并排矩阵。总结:
- AMM v4 使用固定的 0.25% 交易费,具有不同的 LP/协议分割,没有基金费。
- CLMM 费用按 tick 间距等级,按位置累积(不是按池),并通过
DecreaseLiquidity或CollectFees领取。
接下来去哪里
products/cpmm/math— 交易费扣除插入曲线的地方。products/cpmm/instructions—Collect*指令账户列表,包括两个创建者路径现在需要的creator_fee_share账户。algorithms/token-2022-transfer-fees— 如何正确组合池交易费和铸币厂转账费。

