本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →
CPMM 的程式 ID 和 PDA 種子在
reference/program-addresses 中有規範列表。本頁重點在於每個帳戶的用途和它維護的不變量,而非硬編碼的地址。CPMM 資金池的六個帳戶
每個 CPMM 資金池完全由 CPMM 程式下的六個程式衍生地址(PDA)加上它引用的一個共享AmmConfig 帳戶來描述。一旦你有了兩個 mint,就可以確定性地推導出所有內容,無需接觸網路。
以及共享配置:
僅從兩個 mint 推導資金池
資金池 ID 並非總是規範 PDA。
Initialize 除了上述 PDA 外,還接受任意簽署者金鑰對作為 pool_state。如果傳遞的帳戶與規範 PDA 不符,程式要求它是簽署者——即建立者傳遞一個他們簽署的新金鑰對。這是搶先防禦:任何競速搶佔規範 PDA 的第三方都可以被合法建立者使用隨機金鑰對繞過。下游 PDA(lpMint、vault0、vault1、observation)仍從 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——控制是否允許Swap、Deposit、Withdraw的位元遮罩。由管理員透過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}——累積的建立者費用,由CollectCreatorFee或CollectCreatorFeePermissionless掃除。兩條路徑都清零完整計數器;無許可路徑將收款人固定為pool_creator的規範 ATA。
AmmConfig
trade_fee_rate和creator_fee_rate是交易量的分數,兩者都以1/1_000_000單位計。2500表示交易量的 0.25%。protocol_fee_rate和fund_fee_rate是交易費用的分數(不是交易量),使用相同的1/1_000_000分母。建立者費用不是交易費用的分數——它是自己獨立的費率。完整算術在products/cpmm/fees。index是u16,所以種子雜湊使用 2 位元組大端序。位元組順序偏差一是常見的整合錯誤。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 建立資金池。
CreatePermissionPda 建立。只有 CPMM 管理員可以透過 ClosePermissionPda 撤銷它。終端使用者不直接與此帳戶互動——它是跨程式流的管道。見 security/admin-and-multisig 了解角色邊界,見 reference/program-addresses 了解規範地址。
金庫和 Token-2022
vault0 和 vault1 由 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。MetadataPointer和TokenMetadata。 標準鏈上 mint 元資料。對交換數學無影響。InterestBearingConfig。 Mint 的 UI 金額累積利息。金庫儲存原始金額;曲線僅在原始金額上運作。顯示 APR 的 UI 應呼叫 Token-2022 幫助程式來呈現 UI 金額。ScaledUiAmount。 UI 顯示縮放擴展。與InterestBearingConfig相同的處理——曲線使用原始金額。
PermanentDelegate、TransferHook、DefaultAccountState、NonTransferable、ConfidentialTransfer、Group/GroupMember、MintCloseAuthority 等——導致 Initialize 以 NotSupportMint 拒絕。例外是程式中的小型硬編碼 mint 白名單(少數特定公鑰),它繞過擴展檢查;用於逐案例登錄特定 mint。
經過驗證的擴展清單和 mint 白名單位於 CP-Swap 源碼中的 programs/cp-swap/src/utils/token.rs,可能隨未來程式升級而變更。
Observation
觀察帳戶是ObservationState 項目的環形緩衝區,每個項目儲存 block_timestamp 和累積價格。在每次交換時,如果自上次以來經過足夠時間,程式會附加新觀察。TWAP 透過讀取兩個觀察並除以 Δcumulative / Δtime 計算。
ObservationState PDA 在周圍欄位和判別器後約 4,100 位元組。
兩個消費者規則:
- 不要將單個觀察用作價格。 它是累積,不是現貨價格。使用其中兩個計算 TWAP。
- 選擇至少相隔一個區塊的觀察。 同一區塊內的交換可能不會產生新觀察;讀取連續的可能返回相同記錄。
products/clmm/accounts。
帳戶生命週期
CPMM 資金池及其 PDA 永不關閉。即使在零流動性時,
poolState 仍然存在。這是刻意的:稍後重新初始化相同資金池會保留其歷史觀察緩衝區,其 PDA 推導保持穩定。
在何處讀取什麼
- 指令帳戶清單(上述哪些對每個指令可寫/簽署者):
products/cpmm/instructions。 - 費用累積語義:
products/cpmm/fees。 - 交換數學 / 觀察更新規則:
products/cpmm/math。 - 規範種子 / 程式 ID:
reference/program-addresses。

