本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →
設定
raydium-sdk-V2-demo/src/clmm 中的一個檔案;GitHub 連結位於各章節旁。初始化遵循示例倉庫的 config.ts.template(來源)— 對於任何非平凡的整合,建議設定 disableFeatureCheck: true:
建立 CLMM 流動性池
來源:src/clmm/createPool.ts
- 在推導前按位元組順序排序
mint1/mint2。 - 計算
sqrt_price_x64 = floor(sqrt(initialPrice × 10^(dB−dA)) × 2^64)。 - 建立
observation和tick_array_bitmap_extension帳戶。 - 支付由
ammConfig定義的流動性池建立費用。
在選定範圍內開設部位
來源:src/clmm/createPosition.ts
InitTickArray 指令。
增加現有部位的流動性
來源:src/clmm/increaseLiquidity.ts
減少流動性(同時收取費用)
來源:src/clmm/decreaseLiquidity.ts 和 src/clmm/closePosition.ts
decreaseLiquidity 並設定 liquidity = new BN(0)。該指令的副作用是結算 tokens_fees_owed_{0,1} 並轉出它們。
若要在流動性和費用歸零後完全關閉部位,在最後的 decreaseLiquidity 呼叫中傳遞 closePosition: true。SDK 會附加 ClosePosition 並銷毀 NFT。
對於直接 Anchor 用戶端,保持宣告的帳戶不變並附加流動性池:
poolId。CLMM 只在 positionNftAccount 凍結時讀取它,這使一個用戶端路徑與舊部位和新部位相容。
收取獎勵
來源:src/clmm/harvestAllRewards.ts
harvestAllRewards 遍歷傳入的每個流動性池上的每個部位,批次處理 CollectReward(和任何 UpdateRewardInfos)指令,並在需要時將它們分割到多個交易中。
交換
來源:src/clmm/swap.ts
computeAmountOutFormat 使用與鏈上程式相同的邏輯離線遍歷 tick 地圖,並返回:
- 預期輸出金額,
- 滑點後的最小輸出金額,
- 實際交換將涉及的 tick 陣列帳戶列表(
remainingAccounts)。
remainingAccounts:如果傳遞太少,交換會在遍歷中途以 TickArrayNotFound 回復;如果傳遞過時的,會浪費計算。
建立可自訂的 CLMM 流動性池
createCustomizablePool 是新的進入點,在流動性池建立時公開動態費用和單邊費用切換。它採用與 createPool 相同的形式,加上三個新增項:
createPool 繼續用於預設費用、無限價訂單、無動態費用的路徑。當你需要三個新開關中的任何一個時,使用 createCustomizablePool。詳見 products/clmm/instructions 的鏈上帳戶列表。
限價訂單
限價訂單在單個 tick 處停泊使用者輸入,當交換穿過該 tick 時按 FIFO 方式成交。輸出在結算時推送到所有者的 ATA;所有者無需在線即可成交。開設限價訂單
(pool, owner, tick, nonce) 推導 LimitOrderState PDA,遞增每個 (pool, owner) 的 LimitOrderNonce,並將訂單插入該 tick 的 FIFO 隊列。
增加/減少開放訂單
decreaseLimitOrder 只能從訂單的未成交部分移除;成交部分被鎖定直到結算。如果訂單已完全成交,兩個指令都會以 InvalidOrderPhase 回復。
結算已成交訂單
settleLimitOrder 根據隊列追蹤器讀取訂單的 unfilled_ratio_x64,計算成交輸出,並將其轉移到所有者的 ATA。所有者可以自己呼叫此方法;limit_order_admin(離線操作管理員)也可以代表所有者呼叫它 — 輸出仍然進入所有者。
若要關閉完全結算的訂單以恢復租金,使用 closeLimitOrder(單個)或 closeAllLimitOrder(批次)。若要同時結算許多訂單,settleAllLimitOrder 將盡可能多的 SettleLimitOrder 呼叫打包到 v0 交易中。
列出錢包的停泊訂單(離線)
totalAmount / filledAmount / pendingSettle 區分各階段)。對於已關閉訂單歷史,使用 /limit-order/history/order/list-by-user?wallet=…(按錢包,按 nextPageId 分頁);對於特定訂單的完整事件日誌,使用 /limit-order/history/event/list-by-pda?pda=…。
Rust CPI 骨架
SwapV2 的剩餘帳戶順序:
常見陷阱
- 非對齊 tick 端點 →
InvalidTickIndex。始終透過TickUtils.getPriceAndTick對齊。 SwapV2中提供的 tick 陣列不足 →TickArrayNotFound。使用computeAmountOutFormat取得完整列表。- 沒有 bitmap 擴展的全範圍部位 → 擴展 PDA 必須可寫;SDK 會自動處理。
- 將
sqrt_price_x64誤認為price→ 這裡的因子 2 混淆特別痛苦。有疑問時,讓 SDK 從人類可讀的價格計算。 - 過於急切地收取獎勵 → 每次收取需要一個交易。透過
harvestAllRewards跨多個部位批次處理。 - 自己關閉 NFT 帳戶 →
ClosePosition銷毀 NFT 並關閉其 ATA。它也關閉 Token-2022 NFT 鑄幣;經典 SPL Token 鑄幣保持供應量為零,因為該程式無法關閉鑄幣。不要單獨關閉支援的帳戶,否則指令將回復。 - 在非對齊 tick 開設限價訂單 →
InvalidTickIndex。始終透過TickUtils.getPriceAndTick量化。 - 在完全成交的訂單上呼叫
decreaseLimitOrder→InvalidOrderPhase。改用settleLimitOrder然後closeLimitOrder。 - 在傳遞
enableDynamicFee: true時忘記dynamicFeeConfigId→CreateCustomizablePool回復是InvalidDynamicFeeConfigParams。要麼關閉動態費用,要麼從/main/clmm-dynamic-config選擇一個設定。
後續步驟
sdk-api/typescript-sdk— 完整 SDK 表面。sdk-api/rest-api— 報價和流動性池元資料端點。user-flows/create-clmm-pool— 非程式碼逐步說明。integration-guides/aggregator— 將 CLMM 路由作為路徑的一部分。

