本頁內容由 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 打包執行)。 |
CreateAmmConfig、UpdateAmmConfig、UpdatePoolStatus、CreateSupportMintAssociated、CreateOperationAccount、UpdateOperationAccount、CloseProtocolPosition)由程式硬編碼的 admin 公鑰控管。獎勵流管理指令(TransferRewardOwner、CollectRemainingRewards)則由獎勵資助方控管,而非程式管理員。
V2 後綴表示「支援保險庫/NFT 的 Token-2022,需要 bitmap-extension slot」。SDK 預設對新池使用 V2。
CreatePool
參數
| # | 名稱 | W | S | 說明 |
|---|---|---|---|---|
| 1 | pool_creator | W | S | |
| 2 | amm_config | 選定的手續費等級。 | ||
| 3 | pool_state | W | 在此 init。 | |
| 4 | token_mint_0 | 已排序。 | ||
| 5 | token_mint_1 | |||
| 6 | token_vault_0 | W | 在此 init,由池權限 PDA 擁有。 | |
| 7 | token_vault_1 | W | ||
| 8 | observation_state | W | 在此 init。 | |
| 9 | tick_array_bitmap_extension | W | 在此 init(V2)。 | |
| 10 | token_program | |||
| 11 | token_program_2022 | |||
| 12 | system_program, rent |
token_mint_0 < token_mint_1(依位元組順序排列)。amm_config.disable_create_pool == false。- Mint 未被 Token-2022 擴充允許清單拒絕。
pool_state.sqrt_price_x64 = sqrt_price_x64,tick_current = floor(log_{1.0001}(price))。pool_state.liquidity = 0(尚無倉位)。pool_state.fee_on = FromInput(舊版預設值)。pool_state.dynamic_fee_info歸零(動態費用停用)。
CreateCustomizablePool
建議新池使用。效果與 CreatePool 相同,額外支援每池費用收取模式及選擇性動態費用啟用。
參數
CreatePool 相同,當 enable_dynamic_fee = true 時額外需要:
| # | 名稱 | W | S | 說明 |
|---|---|---|---|---|
| N | dynamic_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
在現有池中建立新倉位。
參數
| # | 名稱 | W | S | |
|---|---|---|---|---|
| 1 | payer | W | S | |
| 2 | position_nft_owner | |||
| 3 | position_nft_mint | W | S(keypair) | |
| 4 | position_nft_account | W | 擁有者持有 NFT 的 ATA。 | |
| 5 | metadata_account | W | Metaplex(選用,若 with_metadata)。 | |
| 6 | pool_state | W | ||
| 7 | protocol_position | |||
| 8 | tick_array_lower | W | 若未初始化則建立。 | |
| 9 | tick_array_upper | W | 同上。 | |
| 10 | personal_position | W | 在此建立。 | |
| 11 | token_account_0, token_account_1 | W | 使用者來源 ATA。 | |
| 12 | token_vault_0, token_vault_1 | W | ||
| 13 | rent, system_program, token_program | |||
| 14 | associated_token_program | |||
| 15 | metadata_program | 選用。 | ||
| 16 | token_program_2022 | V2。 | ||
| 17 | vault_0_mint, vault_1_mint | V2。 | ||
| 18 | tick_array_bitmap_extension | W | V2(若有觸及)。 |
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 已傳入並初始化(或在此交易中透過
InitTickArrayCPI 建立)。 - 使用者來源 ATA 中至少持有
amount_0_max及amount_1_max。
personal_position已存在,liquidity已設定,fee_growth_inside_last已快照。tick_lower和tick_upper的 tick-array 條目已更新(liquidity_gross += L、liquidity_net ± L、費用增長快照維護)。- 若倉位在範圍內(
tick_lower ≤ tick_current < tick_upper),則pool_state.liquidity += L。
InvalidTickIndex、NotApproved、ZeroAmountSpecified、TransactionTooLarge(tick array 過多時)。
IncreaseLiquidityV2
向已開啟的倉位增加流動性。
參數
OpenPosition 類似,但不需要 NFT mint(倉位已存在;NFT 以擁有者持有 1 個代幣的 ATA 形式傳入)。
效果
- 將
amount_0_actual/amount_1_actual從使用者轉入保險庫。 - 遞增
personal_position.liquidity及pool_state.liquidity(若在範圍內),並相應調整端點 tick 的liquidity_gross/liquidity_net。 - 收取自上次觸碰以來應付的手續費和獎勵,並記入
tokens_fees_owed_{0,1}/reward_amount_owed。這些金額僅在DecreaseLiquidity或CollectReward時支付,增加流動性時不會直接付出。
DecreaseLiquidityV2
從倉位移除流動性。
參數
IncreaseLiquidity 相同。
效果
- 依當前
sqrt_price_x64計算移除L所對應的(amount_0, amount_1)。 - 結算自上次觸碰以來累積的手續費/獎勵,方式與
IncreaseLiquidity相同。 - 將
amount_0 + fees_owed_0及amount_1 + fees_owed_1從保險庫轉給使用者。 - 遞減流動性計數器;若新的
personal_position.liquidity == 0,該倉位可執行ClosePosition。
amount_0_min 和 amount_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 決定精確輸入或精確輸出模式。
參數
| # | 名稱 | W | S | 說明 |
|---|---|---|---|---|
| 1 | payer | S | ||
| 2 | amm_config | |||
| 3 | pool_state | W | ||
| 4 | input_token_account | W | ||
| 5 | output_token_account | W | ||
| 6 | input_vault | W | ||
| 7 | output_vault | W | ||
| 8 | observation_state | W | ||
| 9 | token_program | |||
| 10 | token_program_2022 | V2。 | ||
| 11 | memo_program | V2(部分 Token-2022 路徑必須)。 | ||
| 12 | input_vault_mint, output_vault_mint | V2。 | ||
| 13 | tick_array_bitmap_extension(選用) | W | 若交換走入擴充區域。 | |
| 14+ | tick_array(剩餘) | W | 足以涵蓋預期行走範圍的陣列數量。 |
PoolUtils.computeAmountOutFormat 或 API 報價端點計算此清單。
前置條件
pool_state.status允許交換。now >= open_time。sqrt_price_limit_x64位於當前sqrt_price_x64在該方向的正確一側。
ExceededSlippage、SqrtPriceLimitOverflow、TickArrayNotFound、LiquidityInsufficient。
呼叫方應了解的 SwapV2 內部行為(2025 年後版本):
- 動態費用附加 — 若
pool.dynamic_fee_info非零,程式依自上次交換以來穿越的 tick 距離更新波動性累加器(套用products/clmm/fees中的過濾/衰減規則),並在AmmConfig.trade_fee_rate之上加入dynamic_fee_component。總費率上限為 10%(MAX_FEE_RATE_NUMERATOR / 1_000_000)。 - 限價單撮合 — 當價格行走穿越持有開放限價單的 tick 時,程式先按
order_phaseFIFO 順序成交該 tick 的限價單流動性,再繼續沿 LP 流動性曲線行走。已成交金額更新tick.unfilled_ratio_x64及tick.part_filled_orders_remaining,供後續結算使用;訂單本身保持未動,直至擁有者呼叫SettleLimitOrder。 - 單側費用路由 — 當
pool.fee_on = Token0Only或Token1Only時,交換步驟仍計算相同的輸入輸出交易;費用隨後路由至設定的一側。若設定的費用側為輸出端,費用從交換輸出中扣除(使用者收到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 批次中,在價格穿越時成交。
參數
| # | 名稱 | W | S | 說明 |
|---|---|---|---|---|
| 1 | payer | W | S | 訂單擁有者;支付租金。 |
| 2 | pool_state | W | ||
| 3 | tick_array | W | 包含 tick_index 的 tick array。 | |
| 4 | limit_order_nonce | W | PDA。init_if_needed——在使用者首次於此 nonce_index 下單時建立。 | |
| 5 | limit_order | W | PDA。在此 init。 | |
| 6 | input_token_account | W | 使用者的輸入 ATA。 | |
| 7 | input_vault | W | 池的輸入保險庫。 | |
| 8 | input_vault_mint | Token-2022 費用處理。 | ||
| 9 | input_token_program | SPL 或 Token-2022。 | ||
| 10 | system_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_phase及tick.unfilled_ratio_x64。tick.orders_amount += amount(在當前批次中)。limit_order_nonce.order_nonce += 1。- 發出
OpenLimitOrderEvent。
InvalidLimitOrderAmount(金額為零或低於池的最低限額)、InvalidTickIndex(超出 [MIN_TICK, MAX_TICK] 範圍,或位於 tick_current 所選方向的錯誤一側)、TickAndSpacingNotMatch(tick_index % pool.tick_spacing != 0)、OrderPhaseSaturated。
IncreaseLimitOrder
增加現有掛單的數量。僅限訂單的 owner 呼叫。
參數
OpenLimitOrder 類似,但不需要 nonce 帳戶;直接傳入 limit_order PDA。
前置條件
limit_order.owner == signer。- 訂單仍在同一批次中(
tick.order_phase == limit_order.order_phase)。若批次已開始成交,訂單為部分結算狀態——呼叫方應先呼叫DecreaseLimitOrder或SettleLimitOrder以向前推進。
- 從擁有者 ATA 轉入
amount至input_vault。 limit_order.total_amount += amount;tick.orders_amount += amount。
DecreaseLimitOrder
減少或完全取消掛單。退回未成交餘額至擁有者,以及過去部分成交已結算的輸出代幣。
參數
| # | 名稱 | W | S |
|---|---|---|---|
| 1 | owner | S | |
| 2 | pool_state | W | |
| 3 | tick_array | W | |
| 4 | limit_order | W | |
| 5 | input_token_account | W | |
| 6 | output_token_account | W | |
| 7 | input_vault | W | |
| 8 | output_vault | W | |
| 9 | input_vault_mint, output_vault_mint | ||
| 10 | token_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,無法移動使用者其他資金。
帳戶
| # | 名稱 | W | S | |
|---|---|---|---|---|
| 1 | signer | S | 擁有者 或 limit_order_admin | |
| 2 | pool_state | |||
| 3 | tick_array | |||
| 4 | limit_order | W | ||
| 5 | output_token_account | W | 擁有者的輸出 ATA。 | |
| 6 | output_vault | W | 池的輸出保險庫。 | |
| 7 | output_vault_mint | |||
| 8 | output_token_program |
- 使用
(limit_order.unfilled_ratio_x64, tick.unfilled_ratio_x64)計算累積應付輸出金額。 - 將差額轉至
output_token_account。 - 更新
limit_order.settled_output。 - 不關閉訂單;針對剩餘輸入的訂單仍保持開啟狀態。
CloseLimitOrder
關閉已完全成交的訂單帳戶。無論由誰簽署,租金始終退還給 limit_order.owner。
呼叫方 — owner 或 limit_order_admin。
前置條件
- 訂單未成交餘額為零(
amount == total_amount已成交並結算,或擁有者先前已將訂單減至零但忘記關閉)。
- 關閉
limit_order;租金傳送至limit_order.owner。
CreateDynamicFeeConfig(管理員)
以 u16 索引建立可重複使用的參數集。
參數
| # | 名稱 | W | S | 說明 |
|---|---|---|---|---|
| 1 | owner | W | S | 硬編碼的管理員公鑰。 |
| 2 | dynamic_fee_config | W | PDA,在此 init。 | |
| 3 | system_program |
decay_period <= filter_period 或任何值為 0 的欄位超出範圍,則回傳 InvalidDynamicFeeConfigParams。
UpdateDynamicFeeConfig(管理員)
修改現有的 DynamicFeeConfig。已在建立時快照該設定的池不會被追溯更新;只有後續建立並參照此設定的新池才會採用新值。
參數 — 與 CreateDynamicFeeConfig 相同的五個校準欄位(filter_period、decay_period、reduction_factor、dynamic_fee_control、max_volatility_accumulator);index 在建立時固定,此處不再傳入。
CollectProtocolFee / CollectFundFee
結構與 CPMM 的 CollectProtocolFee / CollectFundFee 完全相同。簽署者必須符合 AmmConfig.owner / AmmConfig.fund_owner。將池保險庫中累積的協議費/基金費轉至接收方,並將對應的 PoolState.protocol_fees_* / fund_fees_* 欄位歸零。
InitializeReward
為池附加新的獎勵流。每個池最多可同時啟用 3 個獎勵流。
參數
| # | 名稱 | W | S | |
|---|---|---|---|---|
| 1 | reward_funder | W | S | |
| 2 | funder_token_account | W | ||
| 3 | amm_config | |||
| 4 | pool_state | W | ||
| 5 | operation_state | 控管獎勵建立的 CLMM 操作狀態 PDA。 | ||
| 6 | reward_token_mint | |||
| 7 | reward_token_vault | W | 在此 init。 | |
| 8 | reward_token_program | |||
| 9 | system_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 / liquidity 將 reward_growth_global_x64 結算至當前時間。每個涉及流動性的指令內部均會呼叫此操作。也作為獨立指令對外開放,以便 UI 或 crank 等外部角色主動觸發。
CollectReward
倉位擁有者領取應得的獎勵代幣。
帳戶
| # | 名稱 | W | S | |
|---|---|---|---|---|
| 1 | nft_owner | S | ||
| 2 | nft_account | 擁有者持有倉位 NFT 的 ATA。 | ||
| 3 | personal_position | W | ||
| 4 | pool_state | W | ||
| 5 | protocol_position | |||
| 6 | reward_token_vault | W | ||
| 7 | recipient_token_account | W | ||
| 8 | token_program | |||
| 9 | token_program_2022 |
- 結算獎勵增長(方式與手續費相同)。
- 將應付金額轉至接收方 ATA,並將
reward_amount_owed[i]歸零。
狀態變更矩陣
| 指令 | pool.liquidity | pool.fee_growth_global | pool.reward_growth_global | personal_position.liquidity | Tick array |
|---|---|---|---|---|---|
CreatePool | 0 | 0 | — | — | — |
OpenPosition | + 若在範圍內 | — | — | 新建 | 新增 liquidity_gross/net |
IncreaseLiquidity | + 若在範圍內 | 結算應付 | 結算應付 | + | 調整 |
DecreaseLiquidity | − 若在範圍內 | 結算應付 | 結算應付 | − | 調整 |
ClosePosition | — | — | — | 銷毀 | — |
SwapV2 | ± 穿越時 | + | — | — | 穿越並翻轉 outside;撮合限價單批次 |
OpenLimitOrder | — | — | — | — | 目標 tick 的 orders_amount += amount |
IncreaseLimitOrder | — | — | — | — | orders_amount += amount |
DecreaseLimitOrder | — | — | — | — | orders_amount -=,可能關閉批次 |
SettleLimitOrder | — | — | — | — | —(tick 唯讀) |
CloseLimitOrder | — | — | — | — | — |
CreateCustomizablePool | 0 | 0 | — | — | — |
UpdateRewardInfos | — | — | + | — | — |
CollectReward | — | — | 結算應付 | — | — |
下一步
products/clmm/code-demos— 可執行的 TypeScript 範例。products/clmm/fees— 手續費與獎勵累積詳情。reference/error-codes— 完整的 CLMM Anchor 錯誤代碼表。
raydium-io/raydium-clmm—programs/amm/src/instructions- Raydium SDK v2 —
@raydium-io/raydium-sdk-v2

