本頁內容由 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 池。
參數
* pool_state 僅在隨機金鑰對路徑上簽署;規範 PDA 路徑在不簽署 pool_state 的情況下執行。
前置條件
- 代幣已排序(按位元組順序
token_0_mint < token_1_mint)。 - 兩個代幣都不使用 CPMM 允許清單外的擴展(
TransferFeeConfig、MetadataPointer、TokenMetadata、InterestBearingConfig、ScaledUiAmount)——見products/cpmm/accounts。程式內的小型每個代幣允許清單會繞過逐案上線的檢查。 creator在各自的 ATA 中至少有init_amount_0和init_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 = 0和pool_id = pool_state.key()。create_pool_feelamports 從創建者轉帳到接收者並同步為原生 SOL(它是 wSOL ATA)。- 池的狀態位元遮罩為
0(存款/提取/交換全部啟用)。 enable_creator_fee = false和creator_fee_on = BothToken。Initialize不支援啟用創建者費用——該路徑是InitializeWithPermission。- 如果呼叫者傳遞的值
<= block_timestamp,open_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 轉帳費用)。
ExceededSlippage、ZeroTradingTokens、如果存款被暫停則 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。
ExceededSlippage—amount_out < minimum_amount_out。ZeroTradingTokens— 交易四捨五入為零。NotApproved— 池透過UpdatePoolStatus暫停交換。InvalidInput— 代幣與池的任一金庫代幣不符。
SwapBaseOutput
精確輸出交換。
參數
SwapBaseInput 相同。
數學 — 反向曲線與上限,見 products/cpmm/math。
常見錯誤 — ExceededSlippage(gross_in > max_amount_in)、ZeroTradingTokens、InvalidInput、NotApproved。
CollectProtocolFee
從金庫掃除累積的協議費用到協議目的地。
參數 — 無。
帳戶
效果
protocol_owner,則 NotApproved。
CollectFundFee
與 CollectProtocolFee 形狀相同,但由 fund_owner 簽署並將 fund_fees_* 計數器歸零。
CollectCreatorFee
由 pool_state.pool_creator 簽署。它將完整的 creator_fees_token_0 和 creator_fees_token_1 餘額轉帳到創建者的代幣帳戶,然後將兩個計數器歸零。當兩個計數器都為零時,它返回 NoFeeCollect。
CollectCreatorFeePermissionless
任何人都可以觸發創建者費用收集。指令始終將完整的累積餘額發送到由 pool_state.pool_creator 擁有的規範關聯代幣帳戶;呼叫者無法選擇另一個創建者或目的地。如果任一 ATA 遺漏,支付者資助其建立。
原始 CollectCreatorFee 仍可呼叫,因此現有用戶端保持相容。
參數 — 無。
帳戶
效果
- 將所有
creator_fees_token_0和creator_fees_token_1從池金庫轉帳到創建者 ATA。 - 將兩個創建者費用計數器歸零並更新
pool_state.recent_epoch。 - 當兩個計數器都為零時返回
NoFeeCollect。
UpdatePoolStatus
暫停或恢復池上的個別操作。status 欄位是一個位元遮罩:
參數
管理員金鑰是 CPMM 程式上的升級授權——實際上是 Raydium 多簽。見
security/admin-and-multisig。
CreateAmmConfig
建立新的費用層級。
參數
前置條件
- 不存在具有相同
index的AmmConfig。 protocol_fee_rate + fund_fee_rate <= FEE_RATE_DENOMINATOR_VALUE。
UpdateAmmConfig
變更現有 AmmConfig 上的費率或擁有權。接受 param: u8(用於更新哪個欄位的判別器)和 value: u64。每個參數的值語義在來源中;常見的有:
param = 0→trade_fee_rateparam = 1→protocol_fee_rateparam = 2→fund_fee_rateparam = 3→new_protocol_owner(將Pubkey位元組作為重新解釋傳遞)param = 4→new_fund_ownerparam = 5→create_pool_feeparam = 6→disable_create_pool
AmmConfig 的每個池。無遷移;池只是讀取新值。
狀態變更矩陣
後續步驟
products/cpmm/code-demos— 上述內容的可執行 TypeScript 範例。reference/error-codes— 完整的 Anchor 錯誤表。products/cpmm/fees—Collect*Fee指令耗盡的費用累積模型。

