跳轉到主要內容

Documentation Index

Fetch the complete documentation index at: https://docs.raydium.io/llms.txt

Use this file to discover all available pages before exploring further.

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

指令總結

判別器名稱簽署者作用
Initialize池創建者從兩個 mint 和一個 AmmConfig 建立新的 CPMM 池。無需許可;任何人都可以呼叫。在新池上硬編碼 enable_creator_fee = falsepool_state 帳戶可以是規範 PDA 或新的隨機金鑰對(參見 Initialize 帳戶)。
InitializeWithPermission支付者 + Permission PDA 的持有者Initialize 的受限變體。呼叫者(支付者)必須擁有從其自身公鑰衍生的 Permission PDA。由需要閘門式池創建的平台使用(例如 LaunchLab 畢業)。讓呼叫者固定 creator_fee_onBothToken / OnlyToken0 / OnlyToken1),並在新池上強制 enable_creator_fee = truepool_state 上的 creator 欄位設定為單獨傳入的 creator 帳戶,而非支付者。與 Initialize 相同的規範 PDA 或隨機金鑰對靈活性適用於 pool_state
DepositLP在兩個代幣中增加流動性;接收 LP 代幣。
WithdrawLP銷毀 LP 代幣;按比例接收兩個基礎代幣。
SwapBaseInput交換者精確輸入交換(amount_in 輸入,≥ minimum_amount_out 輸出)。
SwapBaseOutput交換者精確輸出交換(≤ maximum_amount_in 輸入,amount_out 輸出)。
CollectProtocolFeeprotocol_owner(來自 AmmConfig從保險庫中清掃累計協議費用。
CollectFundFeefund_owner(來自 AmmConfig從保險庫中清掃累計基金費用。
CollectCreatorFeepool_creator清掃累計創建者費用(如果啟用了創建者費用)。
UpdatePoolStatusadmin透過位元遮罩暫停/恢復池上的特定操作。
UpdateAmmConfigadmin更改費率或 AmmConfig 上的協議/基金所有者。
CreateAmmConfigadmin建立新費用層級(新的 AmmConfig 帳戶)。
CreatePermissionPdaadmin鑄造允許特定權限呼叫 InitializeWithPermissionPermission PDA。
ClosePermissionPdaadmin撤銷先前發行的 Permission PDA。
狀態位元遮罩:每個池的 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 池。 引數
init_amount_0: u64
init_amount_1: u64
open_time:     u64   // Unix 時間戳;在此之前交換被拒絕
帳戶 (W = 可寫,S = 簽署者)
#名稱WS備註
1creatorWS支付租金;記錄為 pool_state.pool_creator
2amm_config選擇的費用層級。
3authorityCPMM 全域權限 PDA。
4pool_stateWS*在此初始化。可以是規範 PDA ["pool", amm_config, token_0_mint, token_1_mint] 新的隨機金鑰對——當不是規範 PDA 時,程式要求 pool_state 簽署(require_eq!(pool_account_info.is_signer, true))。隨機金鑰對路徑讓創建者躲避規範 PDA 上的搶先交易嘗試。下游 PDA(lp_mintvaultsobservation_state)無論如何都從 pool_state.key() 衍生。
5token_0_mint已排序:token_0_mint < token_1_mint
6token_1_mint
7lp_mintW在此初始化。權限設定為 authority
8creator_token_0Winit_amount_0 的來源 ATA。
9creator_token_1Winit_amount_1 的來源 ATA。
10creator_lp_tokenWLP 的目的地(如果遺失則建立)。
11token_0_vaultW在此初始化。由 authority 擁有。
12token_1_vaultW
13create_pool_feeW創建者支付的 create_pool_fee 的目標 ATA。
14observation_stateW在此初始化。
15token_programSPL Token(用於 LP mint)。
16token_0_programSPL Token 或 Token-2022。
17token_1_programSPL Token 或 Token-2022。
18associated_token_program
19system_program
20rent
* 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

按與池成比例增加兩個代幣中的流動性。 引數
lp_token_amount:   u64   // 要鑄造給 LP 的 LP 代幣數量
maximum_token_0:   u64
maximum_token_1:   u64
帳戶
#名稱WS
1ownerS
2authority
3pool_stateW
4owner_lp_tokenW
5token_0_accountW
6token_1_accountW
7token_0_vaultW
8token_1_vaultW
9token_program
10token_program_2022
11vault_0_mint
12vault_1_mint
13lp_mintW
數學
needed_token_0 = ceil(lp_token_amount * vault_0 / lp_supply)
needed_token_1 = ceil(lp_token_amount * vault_1 / lp_supply)
require(needed_token_0 <= maximum_token_0, "ExceededSlippage")
require(needed_token_1 <= maximum_token_1, "ExceededSlippage")
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 代幣並按比例接收兩個基礎代幣。 引數
lp_token_amount:   u64
minimum_token_0:   u64
minimum_token_1:   u64
帳戶
#名稱WS
1ownerS
2authority
3pool_stateW
4owner_lp_tokenW
5token_0_accountW
6token_1_accountW
7token_0_vaultW
8token_1_vaultW
9token_program
10token_program_2022
11vault_0_mint
12vault_1_mint
13lp_mintW
(與 Deposit 相同;lp_mint 可寫因為 LP 代幣被銷毀。) 數學
out_token_0 = floor(lp_token_amount * vault_0 / lp_supply)
out_token_1 = floor(lp_token_amount * vault_1 / lp_supply)
require(out_token_0 >= minimum_token_0, "ExceededSlippage")
require(out_token_1 >= minimum_token_1, "ExceededSlippage")
後置條件
  • lp_supply -= lp_token_amount
  • 保險庫傳送 out_token_0 / out_token_1(總額;使用者接收淨額扣除任何 Token-2022 轉移費用)。

SwapBaseInput

精確輸入交換。 引數
amount_in:            u64
minimum_amount_out:   u64
帳戶
#名稱WS
1payerS
2authority
3amm_config
4pool_stateW
5input_token_accountW
6output_token_accountW
7input_vaultW
8output_vaultW
9input_token_program
10output_token_program
11input_token_mint
12output_token_mint
13observation_stateW
順序輸入 → 輸出由使用者方向決定,而非池的規範 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

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

CollectProtocolFee

從保險庫清掃累計協議費用至協議目的地。 引數 — 無。 帳戶
#名稱WS
1ownerS必須匹配 amm_config.protocol_owner
2authority
3pool_stateW
4amm_config
5token_0_vaultW
6token_1_vaultW
7vault_0_mint
8vault_1_mint
9recipient_token_0_accountW
10recipient_token_1_accountW
11token_program
12token_program_2022
效果
transfer pool_state.protocol_fees_token0 from vault_0 to recipient_0
transfer pool_state.protocol_fees_token1 from vault_1 to recipient_1
pool_state.protocol_fees_token0 = 0
pool_state.protocol_fees_token1 = 0
曲線有效餘額無變化(累計費用已被排除)。 常見錯誤NotApproved(如果簽署者不是 protocol_owner)。

CollectFundFee

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

CollectCreatorFee

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

UpdatePoolStatus

暫停或恢復池上的個別操作。status 欄位是位元遮罩:
旗標設定時的效果
0DEPOSIT_DISABLEDDeposit 拒絕,並顯示 NotApproved
1WITHDRAW_DISABLEDWithdraw 拒絕。
2SWAP_DISABLEDSwapBaseInput / SwapBaseOutput 拒絕。
引數
status: u8      // 新位元遮罩
帳戶
#名稱WS
1authorityS必須匹配 CPMM 程式上的管理員金鑰。
2pool_stateW
管理員金鑰是 CPMM 程式上的升級權限——實際上是 Raydium 多簽錢包。參見 security/admin-and-multisig

CreateAmmConfig

建立新費用層級。 引數
index:             u16
trade_fee_rate:    u64
protocol_fee_rate: u64
fund_fee_rate:     u64
create_pool_fee:   u64
帳戶
#名稱WS
1ownerWS管理員。
2amm_configW在此初始化。
3system_program
前置條件
  • 沒有現存 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 的每個池。無遷移;池僅讀取新值。

狀態變化矩陣

指令lp_supply保險庫餘額累計費用欄位observation
Initialize+ init LP+ init_amount_{0,1}0init
InitializeWithPermission+ init LP+ init_amount_{0,1}0init
Deposit++ 兩者
Withdraw− 兩者
SwapBaseInput+ in, − out+ trade_fee 分割為協議/基金;如果啟用則 + creator_fee+ (如果間隔已過)
SwapBaseOutput+ in, − out+ trade_fee 分割為協議/基金;如果啟用則 + creator_fee+ (如果間隔已過)
CollectProtocolFee− (由協議儲存庫)protocol_* → 0
CollectFundFee− (由基金儲存庫)fund_* → 0
CollectCreatorFee− (由創建者儲存庫)creator_* → 0
UpdatePoolStatus

後續步驟

來源: