Skip to main content
本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →

两项独立费用,四个目的地

CPMM 对每次交换收取两项独立费率的费用:
  1. 交易费 — 按 AmmConfig.trade_fee_rate 收取,分配给三个目的地:
    • LP 份额 — 留在金库中并增加 k。通过销毁 LP 代币隐式领取。
    • 协议份额 — 累积到 PoolState.protocol_fees_token*;由 protocol_owner 通过 CollectProtocolFee 扫出。
    • 基金份额 — 累积到 PoolState.fund_fees_token*;由 fund_owner 通过 CollectFundFee 扫出。
  2. 创建者费(可选,按池) — 按 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_rateprotocol_fee_ratefund_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_ratefund_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 = truecreator_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_xcurve_y 不变。
  • LP 费用不累积到计数器。 它们隐含在金库余额中。LP 对累积 LP 费用的权利通过销毁 LP 代币(即通过 Withdraw)行使 — 没有 CollectLpFee

与 Token-2022 转账费的交互

Token-2022 转账费由铸币厂应用,不是由 CPMM 应用。它们作用于每次代币转账 — 交换、存款、提款和 Collect* 扫出。CPMM 的交易费数学是根据实际进入金库的金额计算的,即净输入铸币厂的转账费(如果有的话)。 所以在最坏的情况下,用户在输入精确交换上支付三项不同的税:
  1. 输入铸币厂在 amount_in 上的转账费(给铸币厂的费用权限)。
  2. 池的 trade_fee 在余额上(按上面分割)。
  3. 输出铸币厂在 amount_out 上的转账费(给铸币厂的费用权限)。
SDK 的报价器考虑所有三项,所以 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 / 协议 / 基金份额 — 它是自己的费率,单独应用,在自己的计数器中累积。
  • 通过 CollectCreatorFeeCollectCreatorFeePermissionless 扫出。 原始路径需要 PoolState.pool_creator 签名。无权限路径让任何支付者触发收集,但将两个目的地固定为创建者的规范 ATA。
  • 创建后无法重新启用或重新路由。 使用 enable_creator_fee = false 初始化的池永远不会收取创建者费;使用特定 creator_fee_on 初始化的池无法切换侧。
创建者费是 Raydium “Burn & Earn” 模式背后的机制:LP 代币在 LP Lock 程序下锁定,所以创建者无法提取流动性,但累积的创建者费仍可以无限期收集。

收集操作流程

协议和基金所有者是主网上的 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 间距等级,按位置累积(不是按池),并通过 DecreaseLiquidityCollectFees 领取。

接下来去哪里

来源: