跳轉到主要內容

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/clmm/accounts(帳戶說明)及 products/clmm/math(數學原理)配套閱讀,是參數與帳戶順序的權威來源;具體位元組佈局請參閱 IDL。

指令一覽

類別指令說明
管理員CreateAmmConfig建立新的手續費等級。
管理員UpdateAmmConfig修改現有等級的費率。
管理員UpdatePoolStatus暫停/恢復池的操作。
管理員CreateSupportMintAssociated將 Token-2022 mint 擴充設定加入允許清單,以供 CLMM 池使用。
管理員CreateOperationAccount初始化程式層級的操作帳戶(一次性)。
管理員UpdateOperationAccount修改操作帳戶的白名單。
管理員CreateDynamicFeeConfig以 u16 索引建立可重複使用的動態費用參數集。
管理員UpdateDynamicFeeConfig修改現有的 DynamicFeeConfig。已快照該設定的池不受影響。
CreatePool初始化綁定至 AmmConfig 的 CLMM 池。標準 FromInput 費用路徑,與 CreateCustomizablePool 並存。
CreateCustomizablePool建議新池使用。結構與 CreatePool 相同,額外支援 collect_fee_on 及選擇性的 enable_dynamic_fee 旗標。
倉位OpenPosition / OpenPositionV2 / OpenPositionWithToken22Nft鑄造倉位 NFT。OpenPositionV2 取代 V1(帳戶佈局更新,加入 bitmap-extension slot);OpenPositionWithToken22Nft 以 Token-2022 代替 SPL Token 發行倉位 NFT。新程式碼應使用 V2 或 Token-2022 變體。
倉位IncreaseLiquidity / IncreaseLiquidityV2向現有倉位增加流動性。
倉位DecreaseLiquidity / DecreaseLiquidityV2移除流動性;同時收取應付手續費。
倉位ClosePosition銷毀 NFT 並關閉 PersonalPositionState
倉位CloseProtocolPosition僅限管理員,用於清理舊版 ProtocolPositionState PDA。目前程式不再建立或讀取 ProtocolPositionState,此指令僅用於回收舊版程式所建立帳戶的租金。
交換Swap / SwapV2固定流動性交換。兩種變體均支援動態費用、單側費用路由及限價單撮合;差異在於 SwapV2 接受 Token-2022 mint(V1 要求兩個保險庫均為傳統 SPL Token)。
交換SwapRouterBaseIn多跳路由,由路由器使用。
限價單OpenLimitOrder在指定 tick 掛出賣單。未成交代幣存於該 tick,撮合引擎在價格穿越時成交。
限價單IncreaseLimitOrder增加現有掛單的數量。
限價單DecreaseLimitOrder減少或取消掛單;退回未成交餘額及已結算的輸出代幣。
限價單SettleLimitOrder將已成交的輸出代幣推送給訂單擁有者。可由擁有者或操作 keeper 呼叫。
限價單CloseLimitOrder關閉已完全成交的訂單帳戶。租金始終退回訂單的 owner。可由擁有者或 keeper 呼叫。
手續費CollectProtocolFee管理員收取協議手續費。
手續費CollectFundFee管理員收取基金手續費。
獎勵InitializeReward為池附加新的獎勵流。
獎勵SetRewardParams修改現有獎勵的發放速率/結束時間。
獎勵UpdateRewardInfos將獎勵增長結算至當前時間(由任何交換/倉位變更操作呼叫)。
獎勵TransferRewardOwner轉移可設定或補充獎勵流的權限。
獎勵CollectRemainingRewards獎勵流 end_time 後,將未分配的代幣回收至資助方。
工具InitTickArray初始化 tick-array 帳戶(通常與 OpenPosition 打包執行)。
大多數僅限管理員的指令(CreateAmmConfigUpdateAmmConfigUpdatePoolStatusCreateSupportMintAssociatedCreateOperationAccountUpdateOperationAccountCloseProtocolPosition)由程式硬編碼的 admin 公鑰控管。獎勵流管理指令(TransferRewardOwnerCollectRemainingRewards)則由獎勵資助方控管,而非程式管理員。 V2 後綴表示「支援保險庫/NFT 的 Token-2022,需要 bitmap-extension slot」。SDK 預設對新池使用 V2。

CreatePool

參數
sqrt_price_x64: u128           // 初始價格
open_time:      u64            // 此時間前拒絕交換
帳戶(簡略)
#名稱WS說明
1pool_creatorWS
2amm_config選定的手續費等級。
3pool_stateW在此 init
4token_mint_0已排序。
5token_mint_1
6token_vault_0W在此 init,由池權限 PDA 擁有。
7token_vault_1W
8observation_stateW在此 init
9tick_array_bitmap_extensionW在此 init(V2)。
10token_program
11token_program_2022
12system_program, rent
前置條件
  • token_mint_0 < token_mint_1(依位元組順序排列)。
  • amm_config.disable_create_pool == false
  • Mint 未被 Token-2022 擴充允許清單拒絕。
後置條件
  • pool_state.sqrt_price_x64 = sqrt_price_x64tick_current = floor(log_{1.0001}(price))
  • pool_state.liquidity = 0(尚無倉位)。
  • pool_state.fee_on = FromInput(舊版預設值)。
  • pool_state.dynamic_fee_info 歸零(動態費用停用)。

CreateCustomizablePool

建議新池使用。效果與 CreatePool 相同,額外支援每池費用收取模式及選擇性動態費用啟用。 參數
pub struct CreateCustomizableParams {
    pub sqrt_price_x64:    u128,
    pub collect_fee_on:    CollectFeeOn,   // FromInput | Token0Only | Token1Only
    pub enable_dynamic_fee: bool,
}
帳戶(簡略) — 與 CreatePool 相同,當 enable_dynamic_fee = true 時額外需要:
#名稱WS說明
Ndynamic_fee_config要快照的共用設定,必須已存在。
前置條件 — 與 CreatePool 相同。若 enable_dynamic_fee = false,則忽略 dynamic_fee_config 後置條件
  • pool_state.fee_on 設為所選的 CollectFeeOn 變體。
  • 若啟用動態費用:pool_state.dynamic_fee_info 從提供的 DynamicFeeConfig 初始化(複製五個校準參數;狀態欄位歸零)。
  • 否則:pool_state.dynamic_fee_info 歸零(= 此池永久停用動態費用)。
fee_on 及動態費用啟用位元僅在池建立時設定,無法事後升級——透過舊版 CreatePool 建立的池無法追加動態費用或單側費用。新部署應預設使用此指令。

OpenPositionV2 / OpenPositionWithToken22Nft

在現有池中建立新倉位。 參數
tick_lower_index: i32
tick_upper_index: i32
tick_array_lower_start_index: i32
tick_array_upper_start_index: i32
liquidity:  u128              // 期望的 L(或 0 以使用下方金額)
amount_0_max: u64
amount_1_max: u64
with_metadata: bool           // 寫入 NFT 元資料(Metaplex)
base_flag: Option<bool>       // true = 依 amount0 計算;false = 依 amount1 計算
帳戶(簡略)
#名稱WS
1payerWS
2position_nft_owner
3position_nft_mintWS(keypair)
4position_nft_accountW擁有者持有 NFT 的 ATA。
5metadata_accountWMetaplex(選用,若 with_metadata)。
6pool_stateW
7protocol_position
8tick_array_lowerW若未初始化則建立。
9tick_array_upperW同上。
10personal_positionW在此建立。
11token_account_0, token_account_1W使用者來源 ATA。
12token_vault_0, token_vault_1W
13rent, system_program, token_program
14associated_token_program
15metadata_program選用。
16token_program_2022V2。
17vault_0_mint, vault_1_mintV2。
18tick_array_bitmap_extensionWV2(若有觸及)。
數學 — 請參閱 products/clmm/math。依據 base_flag,程式將 liquidity(amount_0_max, amount_1_max) 解析為實際的 L 及實際消耗的代幣數量。 前置條件
  • tick_lower < tick_upper,兩者均為 pool.tick_spacing 的倍數,且在 [MIN_TICK, MAX_TICK] 範圍內。
  • 所需 tick array 已傳入並初始化(或在此交易中透過 InitTickArray CPI 建立)。
  • 使用者來源 ATA 中至少持有 amount_0_maxamount_1_max
後置條件
  • personal_position 已存在,liquidity 已設定,fee_growth_inside_last 已快照。
  • tick_lowertick_upper 的 tick-array 條目已更新(liquidity_gross += Lliquidity_net ± L、費用增長快照維護)。
  • 若倉位在範圍內(tick_lower ≤ tick_current < tick_upper),則 pool_state.liquidity += L
常見錯誤InvalidTickIndexNotApprovedZeroAmountSpecifiedTransactionTooLarge(tick array 過多時)。

IncreaseLiquidityV2

向已開啟的倉位增加流動性。 參數
liquidity: u128
amount_0_max: u64
amount_1_max: u64
base_flag: Option<bool>
帳戶 — 與 OpenPosition 類似,但不需要 NFT mint(倉位已存在;NFT 以擁有者持有 1 個代幣的 ATA 形式傳入)。 效果
  • amount_0_actual / amount_1_actual 從使用者轉入保險庫。
  • 遞增 personal_position.liquiditypool_state.liquidity(若在範圍內),並相應調整端點 tick 的 liquidity_gross / liquidity_net
  • 收取自上次觸碰以來應付的手續費和獎勵,並記入 tokens_fees_owed_{0,1} / reward_amount_owed。這些金額僅在 DecreaseLiquidityCollectReward 時支付,增加流動性時不會直接付出。

DecreaseLiquidityV2

從倉位移除流動性。 參數
liquidity: u128
amount_0_min: u64
amount_1_min: u64
帳戶 — 結構與 IncreaseLiquidity 相同。 效果
  • 依當前 sqrt_price_x64 計算移除 L 所對應的 (amount_0, amount_1)
  • 結算自上次觸碰以來累積的手續費/獎勵,方式與 IncreaseLiquidity 相同。
  • amount_0 + fees_owed_0amount_1 + fees_owed_1 從保險庫轉給使用者。
  • 遞減流動性計數器;若新的 personal_position.liquidity == 0,該倉位可執行 ClosePosition
滑點amount_0_minamount_1_min 是使用者在扣除輸出端 Token-2022 轉帳費用後可接受的最低金額。

ClosePosition

銷毀倉位 NFT 並關閉 PersonalPositionState 前置條件
  • personal_position.liquidity == 0
  • tokens_fees_owed_{0,1} == 0
  • 所有獎勵計數器 reward_amount_owed == 0
(即:請先收取所有應得款項並將流動性減至零。) 效果
  • 銷毀 NFT。
  • 關閉 NFT mint 帳戶及 personal_position 帳戶,並將租金退還給 payer

SwapV2

沿流動性曲線行走;依 is_base_input 決定精確輸入或精確輸出模式。 參數
amount: u64                  // is_base_input=true 時為輸入,否則為輸出
other_amount_threshold: u64  // 最低輸出或最高輸入
sqrt_price_limit_x64: u128   // 硬性邊界;0 表示無限制
is_base_input: bool
帳戶(簡略)
#名稱WS說明
1payerS
2amm_config
3pool_stateW
4input_token_accountW
5output_token_accountW
6input_vaultW
7output_vaultW
8observation_stateW
9token_program
10token_program_2022V2。
11memo_programV2(部分 Token-2022 路徑必須)。
12input_vault_mint, output_vault_mintV2。
13tick_array_bitmap_extension(選用)W若交換走入擴充區域。
14+tick_array(剩餘)W足以涵蓋預期行走範圍的陣列數量。
呼叫方傳入一組按優先順序排列、涵蓋預期交換範圍的 tick array 清單;程式按需取用。SDK 透過 PoolUtils.computeAmountOutFormat 或 API 報價端點計算此清單。 前置條件
  • pool_state.status 允許交換。
  • now >= open_time
  • sqrt_price_limit_x64 位於當前 sqrt_price_x64 在該方向的正確一側。
常見錯誤ExceededSlippageSqrtPriceLimitOverflowTickArrayNotFoundLiquidityInsufficient 呼叫方應了解的 SwapV2 內部行為(2025 年後版本):
  1. 動態費用附加 — 若 pool.dynamic_fee_info 非零,程式依自上次交換以來穿越的 tick 距離更新波動性累加器(套用 products/clmm/fees 中的過濾/衰減規則),並在 AmmConfig.trade_fee_rate 之上加入 dynamic_fee_component。總費率上限為 10%(MAX_FEE_RATE_NUMERATOR / 1_000_000)。
  2. 限價單撮合 — 當價格行走穿越持有開放限價單的 tick 時,程式先按 order_phase FIFO 順序成交該 tick 的限價單流動性,再繼續沿 LP 流動性曲線行走。已成交金額更新 tick.unfilled_ratio_x64tick.part_filled_orders_remaining,供後續結算使用;訂單本身保持未動,直至擁有者呼叫 SettleLimitOrder
  3. 單側費用路由 — 當 pool.fee_on = Token0OnlyToken1Only 時,交換步驟仍計算相同的輸入輸出交易;費用隨後路由至設定的一側。若設定的費用側為輸出端,費用從交換輸出中扣除(使用者收到 out − fee);若為輸入端,行為與 FromInput 相同。請參閱 PoolState 上的 is_fee_on_input(zero_for_one)is_fee_on_token0(zero_for_one)
Swap(V1)實作與 SwapV2 相同的動態費用、單側費用路由及限價單撮合;唯一缺少的功能是 Token-2022 支援——兩個保險庫均須為傳統 SPL Token。任何含有 Token-2022 mint 的池必須透過 SwapV2 交換。聚合器與 SDK 已對所有 CLMM 路段優先選用 V2,呼叫方無需依 mint 類型分支處理。

OpenLimitOrder

在指定 tick 掛出賣單。訂單位於每個 tick 的 FIFO 批次中,在價格穿越時成交。 參數
nonce_index:    u8       // 使用者選定的 nonce 帳戶索引(每個錢包 0..255)
zero_for_one:   bool     // true:賣出 token0 換 token1;false:賣出 token1 換 token0
tick_index:     i32      // 必須是 pool.tick_spacing 的倍數
amount:         u64      // 輸入代幣數量
帳戶(簡略)
#名稱WS說明
1payerWS訂單擁有者;支付租金。
2pool_stateW
3tick_arrayW包含 tick_index 的 tick array。
4limit_order_nonceWPDA。init_if_needed——在使用者首次於此 nonce_index 下單時建立。
5limit_orderWPDA。在此 init
6input_token_accountW使用者的輸入 ATA。
7input_vaultW池的輸入保險庫。
8input_vault_mintToken-2022 費用處理。
9input_token_programSPL 或 Token-2022。
10system_program, rent
前置條件
  • tick_index % pool.tick_spacing == 0,且在 [MIN_TICK, MAX_TICK] 範圍內。
  • tick_index 位於所選方向相對於 pool.tick_current 的正確一側(賣出 token0 → tick 必須在當前之上,反之亦然)。在已穿越的 tick 掛單會立即被撮合,因此會被拒絕。
  • pool_state.status 允許限價單操作(第 5 位元)。
後置條件
  • limit_order 已存在,快照開單時的 tick.order_phasetick.unfilled_ratio_x64
  • tick.orders_amount += amount(在當前批次中)。
  • limit_order_nonce.order_nonce += 1
  • 發出 OpenLimitOrderEvent
常見錯誤InvalidLimitOrderAmount(金額為零或低於池的最低限額)、InvalidTickIndex(超出 [MIN_TICK, MAX_TICK] 範圍,或位於 tick_current 所選方向的錯誤一側)、TickAndSpacingNotMatchtick_index % pool.tick_spacing != 0)、OrderPhaseSaturated

IncreaseLimitOrder

增加現有掛單的數量。僅限訂單的 owner 呼叫。 參數
amount: u64    // 額外輸入代幣數量
帳戶 — 與 OpenLimitOrder 類似,但不需要 nonce 帳戶;直接傳入 limit_order PDA。 前置條件
  • limit_order.owner == signer
  • 訂單仍在同一批次中(tick.order_phase == limit_order.order_phase)。若批次已開始成交,訂單為部分結算狀態——呼叫方應先呼叫 DecreaseLimitOrderSettleLimitOrder 以向前推進。
效果
  • 從擁有者 ATA 轉入 amountinput_vault
  • limit_order.total_amount += amounttick.orders_amount += amount

DecreaseLimitOrder

減少或完全取消掛單。退回未成交餘額至擁有者,以及過去部分成交已結算的輸出代幣。 參數
amount:     u64    // 要提取的輸入代幣數量(最多 = 未成交餘額)
amount_min: u64    // 輸入端提取的滑點下限
帳戶 — 同時需要輸入與輸出代幣兩側:
#名稱WS
1ownerS
2pool_stateW
3tick_arrayW
4limit_orderW
5input_token_accountW
6output_token_accountW
7input_vaultW
8output_vaultW
9input_vault_mint, output_vault_mint
10token_program, token_program_2022
效果
  • 依批次的 unfilled_ratio_x64 重新計算自開單以來的已成交金額。
  • 將已成交的輸出代幣傳送至 output_token_account
  • amount 的未成交輸入退回至 input_token_account
  • 相應更新 limit_order。若新的未成交餘額為零,程式關閉該帳戶並將租金退還給 owner

SettleLimitOrder

將已成交的輸出代幣推送給擁有者,而不改變訂單的未成交餘額。適用於 auto_withdraw keeper 對長期部分成交訂單進行分批支付的場景。 呼叫方 — 訂單的 owner,或程式的 limit_order_admin(一個執行自動 keeper 循環的鏈下操作熱錢包)。keeper 沒有其他權限——它只能將已成交的輸出代幣推送至訂單 owner 的 ATA,無法移動使用者其他資金。 帳戶
#名稱WS
1signerS擁有者 limit_order_admin
2pool_state
3tick_array
4limit_orderW
5output_token_accountW擁有者的輸出 ATA。
6output_vaultW池的輸出保險庫。
7output_vault_mint
8output_token_program
效果
  • 使用 (limit_order.unfilled_ratio_x64, tick.unfilled_ratio_x64) 計算累積應付輸出金額。
  • 將差額轉至 output_token_account
  • 更新 limit_order.settled_output
  • 關閉訂單;針對剩餘輸入的訂單仍保持開啟狀態。

CloseLimitOrder

關閉已完全成交的訂單帳戶。無論由誰簽署,租金始終退還給 limit_order.owner 呼叫方ownerlimit_order_admin 前置條件
  • 訂單未成交餘額為零(amount == total_amount 已成交並結算,或擁有者先前已將訂單減至零但忘記關閉)。
效果
  • 關閉 limit_order;租金傳送至 limit_order.owner

CreateDynamicFeeConfig(管理員)

以 u16 索引建立可重複使用的參數集。 參數
index:                       u16
filter_period:               u16   // 秒;例如 30
decay_period:                u16   // 秒;例如 600。必須 > filter_period
reduction_factor:            u16   // 1..10_000;例如 5_000 = 每個衰減窗口保留 50%
dynamic_fee_control:         u32   // 1..100_000;波動性至費用曲線的增益
max_volatility_accumulator:  u32   // 上限
帳戶
#名稱WS說明
1ownerWS硬編碼的管理員公鑰。
2dynamic_fee_configWPDA,在此 init
3system_program
常見錯誤 — 若 decay_period <= filter_period 或任何值為 0 的欄位超出範圍,則回傳 InvalidDynamicFeeConfigParams

UpdateDynamicFeeConfig(管理員)

修改現有的 DynamicFeeConfig。已在建立時快照該設定的池不會被追溯更新;只有後續建立並參照此設定的新池才會採用新值。 參數 — 與 CreateDynamicFeeConfig 相同的五個校準欄位(filter_perioddecay_periodreduction_factordynamic_fee_controlmax_volatility_accumulator);index 在建立時固定,此處不再傳入。

CollectProtocolFee / CollectFundFee

結構與 CPMM 的 CollectProtocolFee / CollectFundFee 完全相同。簽署者必須符合 AmmConfig.owner / AmmConfig.fund_owner。將池保險庫中累積的協議費/基金費轉至接收方,並將對應的 PoolState.protocol_fees_* / fund_fees_* 欄位歸零。

InitializeReward

為池附加新的獎勵流。每個池最多可同時啟用 3 個獎勵流。 參數
open_time:     u64
end_time:      u64
emissions_per_second_x64: u128   // Q64.64
帳戶
#名稱WS
1reward_funderWS
2funder_token_accountW
3amm_config
4pool_stateW
5operation_state控管獎勵建立的 CLMM 操作狀態 PDA。
6reward_token_mint
7reward_token_vaultW在此 init
8reward_token_program
9system_program, rent
前置條件
  • 池目前啟用的獎勵流少於 3 個。
  • 資助方在此指令執行時向保險庫存入 total_emission = emissions_per_second × (end_time − open_time) 數量的獎勵代幣。
  • 獎勵 mint 已依 operation_state 加入白名單。

SetRewardParams

延長、補充或修改現有獎勵流的發放速率。通常由池建立者或 Raydium 多簽呼叫。鏈上有相應限制:一般可以延長 end_time 或提高發放量,但不能追溯縮減。請查閱 operation_state 的擁有者清單。

UpdateRewardInfos

純帳務操作——透過 emissions_per_second × Δt / liquidityreward_growth_global_x64 結算至當前時間。每個涉及流動性的指令內部均會呼叫此操作。也作為獨立指令對外開放,以便 UI 或 crank 等外部角色主動觸發。

CollectReward

倉位擁有者領取應得的獎勵代幣。 帳戶
#名稱WS
1nft_ownerS
2nft_account擁有者持有倉位 NFT 的 ATA。
3personal_positionW
4pool_stateW
5protocol_position
6reward_token_vaultW
7recipient_token_accountW
8token_program
9token_program_2022
效果
  • 結算獎勵增長(方式與手續費相同)。
  • 將應付金額轉至接收方 ATA,並將 reward_amount_owed[i] 歸零。

狀態變更矩陣

指令pool.liquiditypool.fee_growth_globalpool.reward_growth_globalpersonal_position.liquidityTick array
CreatePool00
OpenPosition+ 若在範圍內新建新增 liquidity_gross/net
IncreaseLiquidity+ 若在範圍內結算應付結算應付+調整
DecreaseLiquidity− 若在範圍內結算應付結算應付調整
ClosePosition銷毀
SwapV2± 穿越時+穿越並翻轉 outside;撮合限價單批次
OpenLimitOrder目標 tick 的 orders_amount += amount
IncreaseLimitOrderorders_amount += amount
DecreaseLimitOrderorders_amount -=,可能關閉批次
SettleLimitOrder—(tick 唯讀)
CloseLimitOrder
CreateCustomizablePool00
UpdateRewardInfos+
CollectReward結算應付

下一步

資料來源: