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(lpMint、vault0、vault1、observation)仍然從 poolState.key() 衍生,所以它們對於使用的任何地址都保持唯一。當你索引資金池時,始終從鏈上狀態發現資金池 ID(例如,CPMM 程式下的 PoolState 帳戶),而不是通過推導規範 PDA — 後者會遺漏隨機金鑰對資金池。

帳戶佈局

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

PoolState

實際要讀取的內容:
  • lp_supply — 資金池的內部 LP 總額。它不等於 LP mint 的供應量:它恰好比 LP mint 的供應量高 100 個基本單位,因為 100 個鎖定單位在這裡計算但從未鑄造。所有 LP 份額數學(存入、提取)都除以 lp_supply,所以使用此欄位,不要替換 mint 的鏈上供應量。
  • protocol_fees_token{0,1}、fund_fees_token{0,1} — 累積的費用尚未掃除。這些不影響交換定價;它們位於金庫中,直到呼叫 CollectProtocolFee / CollectFundFee。protocol_fees_token{0,1} 在收集建立者費用時也會收到協議的建立者費用份額,所以它在交換外增長 — 見 products/cpmm/fees。
  • status — 控制是否允許 Swap、Deposit、Withdraw 的位元遮罩。由管理員通過 UpdatePoolStatus 更新。SDK 在構建交易前檢查此項;如果你直接 CPI,請自己檢查。
  • token0_program / token1_program — 為每個金庫 CPI 的代幣程式。一個可以是經典 SPL Token,另一個是 Token-2022;它們是獨立的。
  • open_time — Unix 時間戳。此時間之前的交換失敗。此時間之前允許存入,以便資金池可以被播種。
  • 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 掃除。兩條路徑都清零完整計數器,但由於 2026-09-19 建立者費用分享升級,只有部分餘額離開資金池:協議的份額新增到 protocol_fees_token_{0,1},其餘部分轉移給建立者。無許可路徑將收件人固定為 pool_creator 的規範 ATA。PoolState 本身未更改 — 沒有共享金額的單獨計數器。

AmmConfig

要注意三件事:
  1. 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。
  2. index 是 u16,所以種子雜湊使用 2 位元組大端序。位元組順序偏差一是常見的整合錯誤。
  3. AmmConfig 在資金池級別是不可變的。 資金池在建立時指向一個 AmmConfig,之後永不切換。費用變更會傳播,因為資金池在每次交換時讀取配置 — 但資金池無法在費用層級之間移動。
關於建立者費用的說明:費率本身(creator_fee_rate)位於 AmmConfig 上,在費用層級間共享。特定資金池是否實際收取它(enable_creator_fee)以及它在交換的哪一側(creator_fee_on)位於 PoolState 上。建立者費用獨立於交易費用 — 它是自己的費率,累積到自己的計數器(creator_fees_token_{0,1}),永遠不會減少交易費用的 LP / 協議 / 基金份額。掃除通過 CollectCreatorFee 或目標受限的 CollectCreatorFeePermissionless,兩條路徑都在途中將累積餘額的份額交給協議 — 在 creator_fee_share_rate,或在該 (creator, amm_config) 對存在 CreatorFeeShare PDA 時的費率。見 products/cpmm/fees 了解完整機制。

Permission

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

CreatorFeeShare

一個可選帳戶,覆蓋一個 (資金池建立者, AmmConfig) 對的協議建立者費用份額。由 2026-09-19 建立者費用分享升級新增。
它的行為方式:
  • 它是可選的,但帳戶在指令中永遠不是可選的。 CollectCreatorFee 和 CollectCreatorFeePermissionless 都使用上面的種子約束聲明 creator_fee_share,並在每次呼叫時接受它。程式然後檢查帳戶是否為空或外國擁有;如果是,它回退到 AmmConfig.creator_fee_share_rate。所以客戶端必須始終推導並傳遞地址,無論帳戶是否存在。
  • share_rate 在建立時上限為 FEE_RATE_DENOMINATOR_VALUE(1_000_000),分割運行時再次上限。 1_000_000 將整個建立者費用路由到協議;0 不路由任何費用。
  • 由管理員或專用權限通過 CreateCreatorFeeShare / CloseCreatorFeeShare 建立和關閉。 關閉它會將租金返還給簽署者,並將對回退到配置預設值;資金池建立者不是任何路徑上的簽署者。
  • 它以建立者為鑰,而不是資金池。 一個帳戶管理該建立者在該 AmmConfig 上的每個資金池。在兩個費用層級上有資金池的建立者需要兩個帳戶才能在兩者上被覆蓋。
它驅動的分割算術在 products/cpmm/fees。

金庫和 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 登錄:如果在種子 [b"support_mint", mint] 處存在 SupportMintAssociated PDA,無論其擴展集如何,mint 都被接納。該 PDA 由管理員(或專用支援 mint 權限)通過 CreateSupportMintAssociated / CloseSupportMintAssociated 建立和移除,所以上線特定 mint 不再需要程式升級。
2026-09 中更改。 CPMM 之前還攜帶硬編碼的四地址 MINT_WHITELIST,它短路擴展檢查。該陣列已移除;登錄 PDA 現在是唯一的繞過。任何依賴硬編碼清單的 mint 在建立新資金池前需要 SupportMintAssociated PDA — 現有資金池不受影響,因為檢查僅在資金池建立時運行。
經過審查的擴展清單位於 CP-Swap 源中的 programs/cp-swap/src/utils/token.rs 下,可能隨著未來程式升級而更改。見 reference/token-2022-support 了解跨程式矩陣。

觀察

觀察帳戶是 ObservationState 條目的環形緩衝區,每個條目儲存 block_timestamp 和累積價格。在每次交換時,如果自上次以來經過了足夠的時間,程式會附加一個新觀察。TWAP 通過讀取兩個觀察並除以 Δcumulative / Δtime 來計算。
環形緩衝區的大小為100 個觀察。每個觀察是 40 位元組(8 + 16 + 16),所以陣列本身是 4,000 位元組;ObservationState::LEN 恰好是 4,075 位元組(8 + 1 + 2 + 32 + 4,000 + 8 × 4)。 兩個消費者規則:
  • 不要使用單個觀察作為價格。 它是累積,不是現貨價格。使用其中兩個來計算 TWAP。
  • 選擇至少相隔一個區塊的觀察。 同一區塊內的交換可能不會產生新觀察;讀取背靠背可能返回相同記錄。
更多數學在 products/clmm/accounts。

帳戶生命週期

CPMM 資金池及其 PDA 永遠不會關閉。Permission、SupportMintAssociated 和 CreatorFeeShare 是例外 — 它們是獨立的管理員管理記錄,不是資金池狀態,每個都有明確的關閉指令。即使在零流動性時,poolState 仍然存在。這是刻意的:稍後重新播種相同資金池會保留其歷史觀察緩衝區,其 PDA 推導保持穩定。

在哪裡讀取什麼

來源: