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 創建池時有效。自 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 的交易費數學是根據實際進入金庫的金額計算的,即淨輸入鑄幣廠的轉移費(如果有的話)。 因此,在最壞的情況下,用戶在輸入精確交易上支付三項不同的稅:
  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 / 協議 / 基金份額 — 它是自己的費率,單獨應用,在自己的計數器中累積。
  • 通過 CollectCreatorFee 或 CollectCreatorFeePermissionless 掃除。 原始路徑需要 PoolState.pool_creator 簽名。無許可路徑讓任何支付者觸發收集,但將兩個目的地固定為創作者的規範 ATA。兩條路徑都先結算協議的份額 — 見下一部分。
  • 創建後無法重新啟用或重新路由。 使用 enable_creator_fee = false 初始化的池將永遠不會收取創作者費;使用特定 creator_fee_on 初始化的池無法切換側面。
創作者費是 Raydium「燒毀與賺取」模式背後的機制:LP 代幣在 LP Lock 程序下鎖定,因此創作者無法提取流動性,但累積的創作者費仍可以無限期收集。

創作者費的協議份額

自 2026-09-19 升級以來,協議可以保留創作者費的可配置份額。交易沒有任何變化:創作者費仍按 creator_fee_rate 收取,仍完全累積到 creator_fees_token{0,1}。分割發生一次,在收集時,在 CollectCreatorFee 和 CollectCreatorFeePermissionless 內部。

費率來自何處

兩個來源,按優先順序:
  1. CreatorFeeShare PDA — 種子 ["creator_fee_share", creator, amm_config]。當此帳戶存在且由 CPMM 擁有時,其 share_rate 獲勝。它讓協議在給定費用層上協商按創作者費率,而無需觸及層本身。
  2. 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 相同方向,它們也從已累積的費用中切割份額。
  • 價值被保守。 creator_amount + shared_amount == creator_fee 對於每個費率和每個費用,包括 u64::MAX。
  • share_rate = 0 是無操作。 默認配置值和 CreatorFeeShare PDA 的缺失都將整個創作者費留給創作者,這是升級前的行為。

對集成商的含義

  • 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 費用按刻度間距層,按位置累積(不是按池),並通過 DecreaseLiquidity 或 CollectFees 領取。

下一步去哪裡

來源: