Skip to main content
本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →

設定

本頁的每個示例都對應 raydium-sdk-V2-demo/src/clmm 中的一個檔案;GitHub 連結位於各章節旁。初始化遵循示例倉庫的 config.ts.template來源)— 對於任何非平凡的整合,建議設定 disableFeatureCheck: true

建立 CLMM 流動性池

來源:src/clmm/createPool.ts
SDK 會:
  • 在推導前按位元組順序排序 mint1/mint2
  • 計算 sqrt_price_x64 = floor(sqrt(initialPrice × 10^(dB−dA)) × 2^64)
  • 建立 observationtick_array_bitmap_extension 帳戶。
  • 支付由 ammConfig 定義的流動性池建立費用。

在選定範圍內開設部位

來源:src/clmm/createPosition.ts
SDK 會自動計算該範圍涉及的 tick 陣列,並在任何未初始化時捆綁 InitTickArray 指令。

增加現有部位的流動性

來源:src/clmm/increaseLiquidity.ts

減少流動性(同時收取費用)

來源:src/clmm/decreaseLiquidity.tssrc/clmm/closePosition.ts
若要僅收取費用,呼叫 decreaseLiquidity 並設定 liquidity = new BN(0)。該指令的副作用是結算 tokens_fees_owed_{0,1} 並轉出它們。 若要在流動性和費用歸零後完全關閉部位,在最後的 decreaseLiquidity 呼叫中傳遞 closePosition: true。SDK 會附加 ClosePosition 並銷毀 NFT。
受限發行人部位需要相容的關閉建構器。 這些部位有凍結的 NFT 代幣帳戶。ClosePosition 必須將部位的流動性池 ID 附加為第一個剩餘帳戶,以便 CLMM 在銷毀前解凍帳戶。程式來源分支不包含 SDK 變更。在啟用受限發行人部位建立前,請確認你的 SDK 版本明確支援凍結關閉路徑。
對於直接 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;所有者無需在線即可成交。

開設限價訂單

SDK 從 (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 量化。
  • 在完全成交的訂單上呼叫 decreaseLimitOrderInvalidOrderPhase。改用 settleLimitOrder 然後 closeLimitOrder
  • 在傳遞 enableDynamicFee: true 時忘記 dynamicFeeConfigIdCreateCustomizablePool 回復是 InvalidDynamicFeeConfigParams。要麼關閉動態費用,要麼從 /main/clmm-dynamic-config 選擇一個設定。

後續步驟

來源: