Skip to main content
本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →
CPMM 的程式 ID 和 PDA 種子在 reference/program-addresses 中有規範列表。本頁重點在於每個帳戶的用途和它維護的不變量,而非硬編碼的地址。

CPMM 資金池的六個帳戶

每個 CPMM 資金池完全由 CPMM 程式下的六個程式衍生地址(PDA)加上它引用的一個共享 AmmConfig 帳戶來描述。一旦你有了兩個 mint,就可以確定性地推導出所有內容,無需接觸網路。 以及共享配置:

僅從兩個 mint 推導資金池

推導資金池 PDA 前務必排序 mint。 種子按位元組順序雜湊兩個 mint,而非使用者順序。具有 (A, B)(B, A) 的兩個資金池會在鏈上碰撞——排序是程式使映射規範化的方式。
資金池 ID 並非總是規範 PDA。 Initialize 除了上述 PDA 外,還接受任意簽署者金鑰對作為 pool_state。如果傳遞的帳戶與規範 PDA 不符,程式要求它是簽署者——即建立者傳遞一個他們簽署的新金鑰對。這是搶先防禦:任何競速搶佔規範 PDA 的第三方都可以被合法建立者使用隨機金鑰對繞過。下游 PDA(lpMintvault0vault1observation)仍從 poolState.key() 衍生,因此它們對於使用的任何地址都保持唯一。索引資金池時,始終從鏈上狀態發現資金池 ID(例如 CPMM 程式下的 PoolState 帳戶),而非推導規範 PDA——後者會遺漏隨機金鑰對資金池。

帳戶佈局

完整的 Rust 定義位於 raydium-cp-swap 源碼中。下面的欄位是你在整合中會讀取的。

PoolState

實際要讀取的內容:
  • lp_supply ——資金池對 LP mint 總供應量的內部鏡像。用於 LP 份額計算;該值應與 mint 的鏈上供應量相符,但從 PoolState 讀取可避免額外的帳戶提取。
  • protocol_fees_token{0,1}fund_fees_token{0,1} ——累積的未掃除費用。這些不影響交換定價;它們位於金庫中,直到呼叫 CollectProtocolFee / CollectFundFee
  • status ——控制是否允許 SwapDepositWithdraw 的位元遮罩。由管理員透過 UpdatePoolStatus 更新。SDK 在建立交易前檢查此項;如果你直接進行 CPI,請自行檢查。
  • token0_program / token1_program ——為每個金庫 CPI 的代幣程式。一個可以是經典 SPL Token,另一個是 Token-2022;它們是獨立的。
  • open_time ——Unix 時間戳。此時間前的交換失敗。存款在 open_time 前被允許,以便資金池可以被初始化。
  • creator_fee_on / enable_creator_fee ——共同控制此資金池是否啟用可選建立者費用以及從交換的哪一側收取。enable_creator_fee == false 完全清零建立者費用路徑。啟用時,creator_fee_on 選擇:0 = 從交換輸入的任何代幣收取費用(BothToken);1 = 僅從 token_0 收取費用(跳過 token_1 → token_0 交換);2 = 僅從 token_1 收取費用。在資金池建立時透過 InitializeWithPermission 設定;之後無法更改。
  • creator_fees_token_{0,1} ——累積的建立者費用,由 CollectCreatorFeeCollectCreatorFeePermissionless 掃除。兩條路徑都清零完整計數器;無許可路徑將收款人固定為 pool_creator 的規範 ATA。

AmmConfig

需要注意三件事:
  1. trade_fee_ratecreator_fee_rate 是交易量的分數,兩者都以 1/1_000_000 單位計。2500 表示交易量的 0.25%。protocol_fee_ratefund_fee_rate交易費用的分數(不是交易量),使用相同的 1/1_000_000 分母。建立者費用不是交易費用的分數——它是自己獨立的費率。完整算術在 products/cpmm/fees
  2. indexu16,所以種子雜湊使用 2 位元組大端序。位元組順序偏差一是常見的整合錯誤。
  3. AmmConfig 在資金池層級是不可變的。 資金池在建立時指向一個 AmmConfig,之後永不切換。費用變更會傳播,因為資金池在每次交換時讀取配置——但資金池無法在費用層級間移動。
關於建立者費用的說明:費率本身creator_fee_rate)位於 AmmConfig 上,在費用層級間共享。特定資金池是否實際收取它(enable_creator_fee)以及它在交換的哪一側(creator_fee_on)位於 PoolState 上。建立者費用獨立於交易費用——它是自己的費率,累積到自己的計數器(creator_fees_token_{0,1}),永不減少交易費用的 LP / 協議 / 基金份額。掃除透過 CollectCreatorFee 或目標受限的 CollectCreatorFeePermissionless。完整機制見 products/cpmm/fees

Permission

InitializeWithPermission 使用的小型存取控制帳戶。CPMM 程式支持許可資金池建立路徑,以便其他程式(例如 LaunchLab 在將代幣升級到 CPMM 時)可以證明他們有權針對給定 AmmConfig 建立資金池。
Permission PDA 由 CPMM 管理員或專用許可 PDA 建立者權限透過 CreatePermissionPda 建立。只有 CPMM 管理員可以透過 ClosePermissionPda 撤銷它。終端使用者不直接與此帳戶互動——它是跨程式流的管道。見 security/admin-and-multisig 了解角色邊界,見 reference/program-addresses 了解規範地址。

金庫和 Token-2022

vault0vault1 由 CPMM authority PDA 擁有,其代幣程式擁有者(token_program)是 SPL Token 或 Token-2022,由 mint 的程式在資金池建立時決定。資金池透明地處理兩種情況——你在 Swap / Deposit / Withdraw 指令帳戶中為每一側傳遞正確的代幣程式 ID。 CPMM 在資金池建立時強制執行嚴格的擴展允許清單utils/token.rs 中的 is_supported_mint)。Token-2022 mint 只有在它攜帶的每個擴展都在此清單上時,才能在 CPMM 資金池中使用:
  • TransferFeeConfig 由 mint 在每次轉移時應用。資金池在 SwapBaseInput 存款時位於接收方,在提款時位於發送方。程式計算登陸金庫的金額並相應設定曲線。見 algorithms/token-2022-transfer-fees
  • MetadataPointerTokenMetadata 標準鏈上 mint 元資料。對交換數學無影響。
  • InterestBearingConfig Mint 的 UI 金額累積利息。金庫儲存原始金額;曲線僅在原始金額上運作。顯示 APR 的 UI 應呼叫 Token-2022 幫助程式來呈現 UI 金額。
  • ScaledUiAmount UI 顯示縮放擴展。與 InterestBearingConfig 相同的處理——曲線使用原始金額。
任何其他擴展——PermanentDelegateTransferHookDefaultAccountStateNonTransferableConfidentialTransferGroup/GroupMemberMintCloseAuthority 等——導致 InitializeNotSupportMint 拒絕。例外是程式中的小型硬編碼 mint 白名單(少數特定公鑰),它繞過擴展檢查;用於逐案例登錄特定 mint。 經過驗證的擴展清單和 mint 白名單位於 CP-Swap 源碼中的 programs/cp-swap/src/utils/token.rs,可能隨未來程式升級而變更。

Observation

觀察帳戶是 ObservationState 項目的環形緩衝區,每個項目儲存 block_timestamp累積價格。在每次交換時,如果自上次以來經過足夠時間,程式會附加新觀察。TWAP 透過讀取兩個觀察並除以 Δcumulative / Δtime 計算。
環形緩衝區大小為100 個觀察。每個觀察 40 位元組,所以陣列單獨就是 4,000 位元組;完整 ObservationState PDA 在周圍欄位和判別器後約 4,100 位元組。 兩個消費者規則:
  • 不要將單個觀察用作價格。 它是累積,不是現貨價格。使用其中兩個計算 TWAP。
  • 選擇至少相隔一個區塊的觀察。 同一區塊內的交換可能不會產生新觀察;讀取連續的可能返回相同記錄。
更多數學見 products/clmm/accounts

帳戶生命週期

CPMM 資金池及其 PDA 永不關閉。即使在零流動性時,poolState 仍然存在。這是刻意的:稍後重新初始化相同資金池會保留其歷史觀察緩衝區,其 PDA 推導保持穩定。

在何處讀取什麼

來源: