Skip to main content
本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →

指令總覽

狀態位元遮罩:每個池的 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 的情況下執行。 前置條件
  • 代幣已排序(按位元組順序 token_0_mint < token_1_mint)。
  • 兩個代幣都不使用 CPMM 允許清單外的擴展(TransferFeeConfigMetadataPointerTokenMetadataInterestBearingConfigScaledUiAmount)——見 products/cpmm/accounts。程式內的小型每個代幣允許清單會繞過逐案上線的檢查。
  • 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 lamports LP 代幣)的 LP 啟動者永久鎖定在池中——pool_state.lp_supply 記錄 liquidity − 100,而 100 LP 單位保持在流通外,防止池被完全耗盡並除以零。
  • observation_state 已初始化;observation_index = 0pool_id = pool_state.key()
  • create_pool_fee lamports 從創建者轉帳到接收者並同步為原生 SOL(它是 wSOL ATA)。
  • 池的狀態位元遮罩為 0(存款/提取/交換全部啟用)。
  • enable_creator_fee = falsecreator_fee_on = BothTokenInitialize 支援啟用創建者費用——該路徑是 InitializeWithPermission
  • 如果呼叫者傳遞的值 <= block_timestampopen_time 會被提升到 block_timestamp + 1。交換在 open_time 之前被拒絕;存款和提取立即生效。
常見錯誤(完整清單見 reference/error-codes
  • InvalidInput — 代幣未排序或相同代幣。
  • 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 轉帳費用)。
常見錯誤ExceededSlippageZeroTradingTokens、如果存款被暫停則 InvalidStatus

Withdraw

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

SwapBaseInput

精確輸入交換。 參數
帳戶 順序輸入 → 輸出由使用者的方向決定,而非池的規範 token_0 / token_1。程式透過匹配代幣來確定哪個金庫是哪個。 數學 — 見 products/cpmm/math 前置條件
  • open_time <= now
  • pool_status 允許交換。
  • 此授權的兩個代幣都未暫停或凍結。
  • amount_in > 0
常見錯誤
  • ExceededSlippageamount_out < minimum_amount_out
  • ZeroTradingTokens — 交易四捨五入為零。
  • NotApproved — 池透過 UpdatePoolStatus 暫停交換。
  • InvalidInput — 代幣與池的任一金庫代幣不符。

SwapBaseOutput

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

CollectProtocolFee

從金庫掃除累積的協議費用到協議目的地。 參數 — 無。 帳戶 效果
曲線有效餘額沒有變化(累積費用已被排除)。 常見錯誤 — 如果簽署者不是 protocol_owner,則 NotApproved

CollectFundFee

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

CollectCreatorFee

pool_state.pool_creator 簽署。它將完整的 creator_fees_token_0creator_fees_token_1 餘額轉帳到創建者的代幣帳戶,然後將兩個計數器歸零。當兩個計數器都為零時,它返回 NoFeeCollect

CollectCreatorFeePermissionless

任何人都可以觸發創建者費用收集。指令始終將完整的累積餘額發送到由 pool_state.pool_creator 擁有的規範關聯代幣帳戶;呼叫者無法選擇另一個創建者或目的地。如果任一 ATA 遺漏,支付者資助其建立。 原始 CollectCreatorFee 仍可呼叫,因此現有用戶端保持相容。 參數 — 無。 帳戶 效果
  • 將所有 creator_fees_token_0creator_fees_token_1 從池金庫轉帳到創建者 ATA。
  • 將兩個創建者費用計數器歸零並更新 pool_state.recent_epoch
  • 當兩個計數器都為零時返回 NoFeeCollect

UpdatePoolStatus

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

CreateAmmConfig

建立新的費用層級。 參數
帳戶 前置條件
  • 不存在具有相同 indexAmmConfig
  • 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 的每個池。無遷移;池只是讀取新值。

狀態變更矩陣

後續步驟

來源: