Skip to main content
本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →
本頁是權威的指令參考。如需實際組成這些指令的程式碼,請參閱 products/cpmm/code-demos。錯誤代碼的含義請見 reference/error-codes

指令總結

狀態位元遮罩:每個池的 status 是一個 u8,其中位 0 = 禁用存款、位 1 = 禁用提取、位 2 = 禁用交換(PoolStatusBitIndex { Deposit, Withdraw, Swap } 在程式中)。清晰位元表示允許操作;設定位元表示已暫停。UpdatePoolStatus 接收原始 u8 並覆寫現有值。 以下各節逐一詳細說明。帳戶順序遵循 CPMM IDL;SDK 和 raydium-cp-swap/programs/cp-swap/src/instructions 中的 Rust 客戶端匹配此順序。

Initialize

建立新的 CPMM 池。 引數
帳戶 (W = 可寫,S = 簽署者) * pool_state 僅在隨機金鑰對路徑上簽署;規範 PDA 路徑在沒有 pool_state 簽署的情況下執行。 前置條件
  • Mint 已排序(按位元組順序 token_0_mint < token_1_mint)。
  • 沒有任何 mint 使用 CPMM 允許清單外的擴展(TransferFeeConfigMetadataPointerTokenMetadataInterestBearingConfigScaledUiAmount)——參見 products/cpmm/accounts。程式內的小型每 mint 允許清單可為逐案上線繞過檢查。
  • creator 在各自的 ATA 中至少有 init_amount_0init_amount_1
  • amm_config.disable_create_pool == false
後置條件
  • pool_state 存在,lp_supply = sqrt(init_amount_0 * init_amount_1) − LOCKED_LP
  • LOCKED_LP(100 lamport LP 代幣)的 LP 啟動者被永久鎖定在池中——pool_state.lp_supply 記錄 liquidity − 100,而 100 LP 單位仍在流通外,防止池被完全耗盡並除以零。
  • observation_state 已初始化;observation_index = 0pool_id = pool_state.key()
  • create_pool_fee lamport 從創建者轉移至接收者並同步為原生 SOL(它是 wSOL ATA)。
  • 池的狀態位元遮罩為 0(存款/提取/交換全部啟用)。
  • enable_creator_fee = falsecreator_fee_on = BothTokenInitialize 支持啟用創建者費用——該路徑是 InitializeWithPermission
  • 如果呼叫者傳入的值 <= block_timestampopen_time 將提升至 block_timestamp + 1。在 open_time 之前交換被拒絕;存款和提取立即進行。
常見錯誤(完整清單在 reference/error-codes
  • InvalidInput — mint 未排序,或相同的 mint。
  • NotSupportMint — 被阻止的 Token-2022 擴展。
  • ExceededSlippage — 罕見;如果 init_amount_0/1 因小數位數不匹配而導致零 LP。

Deposit

按與池成比例增加兩個代幣中的流動性。 引數
帳戶 數學
k 的成比例性沒有變化——保險庫和 lp_supply 都按相同因子縮放。 後置條件
  • lp_supply += lp_token_amount
  • vault_0 += needed_token_0(淨額扣除輸入上任何 Token-2022 轉移費用)。
  • vault_1 += needed_token_1(淨額扣除輸入上任何 Token-2022 轉移費用)。
常見錯誤ExceededSlippageZeroTradingTokensInvalidStatus(如果存款已暫停)。

Withdraw

銷毀 LP 代幣並按比例接收兩個基礎代幣。 引數
帳戶 (與 Deposit 相同;lp_mint 可寫因為 LP 代幣被銷毀。) 數學
後置條件
  • lp_supply -= lp_token_amount
  • 保險庫傳送 out_token_0 / out_token_1(總額;使用者接收淨額扣除任何 Token-2022 轉移費用)。

SwapBaseInput

精確輸入交換。 引數
帳戶 順序輸入 → 輸出由使用者方向決定,而非池的規範 token_0 / token_1。程式透過匹配 mint 確定哪個保險庫是哪個。 數學 — 參見 products/cpmm/math 前置條件
  • open_time <= now
  • pool_status 允許交換。
  • 對此權限既無 mint 暫停也無凍結。
  • amount_in > 0
常見錯誤
  • ExceededSlippageamount_out < minimum_amount_out
  • ZeroTradingTokens — 交易四捨五入為零。
  • NotApproved — 池透過 UpdatePoolStatus 暫停交換。
  • InvalidInput — mint 不匹配池的任何保險庫 mint。

SwapBaseOutput

精確輸出交換。 引數
帳戶 — 與 SwapBaseInput 相同。 數學 — 反向曲線加上上限,參見 products/cpmm/math 常見錯誤ExceededSlippagegross_in > max_amount_in)、ZeroTradingTokensInvalidInputNotApproved

CollectProtocolFee

從保險庫清掃累計協議費用至協議目的地。 引數 — 無。 帳戶 效果
曲線有效餘額無變化(累計費用已被排除)。 常見錯誤NotApproved(如果簽署者不是 protocol_owner)。

CollectFundFee

CollectProtocolFee 相同形狀,但由 fund_owner 簽署並將 fund_fees_* 計數器歸零。

CollectCreatorFee

同樣的形狀,由 pool_state.pool_creator 簽署。僅在池以非零創建者費率初始化時才發出轉移。

UpdatePoolStatus

暫停或恢復池上的個別操作。status 欄位是位元遮罩: 引數
帳戶 管理員金鑰是 CPMM 程式上的升級權限——實際上是 Raydium 多簽錢包。參見 security/admin-and-multisig

CreateAmmConfig

建立新費用層級。 引數
帳戶 前置條件
  • 沒有現存 AmmConfig 具有相同的 index
  • protocol_fee_rate + fund_fee_rate <= FEE_RATE_DENOMINATOR_VALUE

UpdateAmmConfig

更改現存 AmmConfig 上的費率或所有權。取一個 param: u8(用於更新哪個欄位的判別器)和一個 value: u64。每個參數的值語義在原始碼中;通常:
  • param = 0trade_fee_rate
  • param = 1protocol_fee_rate
  • param = 2fund_fee_rate
  • param = 3new_protocol_owner(將 Pubkey 位元組作為重新解釋傳遞)
  • param = 4new_fund_owner
  • param = 5create_pool_fee
  • param = 6disable_create_pool
更改由管理員簽署並在下一次交換時影響綁定到此 AmmConfig 的每個池。無遷移;池僅讀取新值。

狀態變化矩陣

後續步驟

來源: