Skip to main content
本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →
版本資訊。 所有 TypeScript 示例針對 @raydium-io/raydium-sdk-v2@0.2.42-alpha 在 Solana mainnet-beta 上運行,已於 2026 年 4 月驗證。Rust CPI 框架針對 master 分支上的 raydium-cp-swap,使用 Anchor 0.30.x。程式 ID 從 reference/program-addresses 的常數中取得。

前置需求

本頁的每個示例都對應 raydium-sdk-V2-demo/src/cpmm 中的一個檔案;GitHub 連結位於每個章節旁邊。初始化遵循示例倉庫的 config.ts.template來源):
Raydium 實例是 SDK 的外觀 — 下面的每個示例都使用它。它會延遲從 api-v3.raydium.io 取得代幣列表和費用配置;在離線環境中,你可以用自己的資料進行初始化。

建立 CPMM 流動性池

來源:src/cpmm/createCpmmPool.ts
SDK 會自動處理以下幾項:
  • 在推導 PDA 之前將代幣排序為 token0/token1 順序。
  • poolFeeAccount 支付一次性的 create_pool_fee
  • 如果缺少,建立呼叫者的關聯代幣帳戶。
  • 根據每一側選擇正確的代幣程式(SPL Token 或 Token-2022)。
確認後,你可以使用以下方式取得即時流動性池狀態:

交換(基礎輸入)

來源:src/cpmm/swap.ts
注意:SDK 總是getPoolInfoFromRpc 內從 RPC 重新取得流動性池狀態。不要使用 api-v3.raydium.io 的儲備值來報價你即將簽署的交易 — 一個區塊陳舊的報價可能在著陸時滑入 ExceededSlippage

交換(基礎輸出)

來源:src/cpmm/swapBaseOut.ts

存入流動性

來源:src/cpmm/deposit.ts
SDK 使用流動性池的目前儲備將 lpAmount 轉換為 needed_token_0needed_token_1,為指令的 maximum_* 參數將每個值增加 1 + slippage,並在必要時建立 ATA。

提取流動性

來源:src/cpmm/withdraw.ts

收取協議/基金/建立者費用

來源:src/cpmm/collectCreatorFee.tssrc/cpmm/collectAllCreatorFee.ts 協議和基金收集仍受權限限制。建立者費用有兩條路徑:現有的建立者簽署的 CollectCreatorFee,以及附加的 CollectCreatorFeePermissionless,任何支付者都可以調用,但只能轉帳到建立者的規範 ATA。固定的 SDK 公開現有的原始建構器:
@raydium-io/raydium-sdk-v2@0.2.42-alpha 尚未公開 CollectCreatorFeePermissionless 的建構器。在 SDK 版本新增它之前,請從升級的 CPMM IDL 建立或直接調用程式。不要重複使用 makeCollectCreatorFeeInstruction:新指令有不同的判別器,並用單獨的 payer 和非簽署的 creator 帳戶替換建立者簽署者 / amm_config 位置。
在鏈下,你可以直接從 PoolState 讀取應計費用:

Rust CPI 框架

如果你想從自己的 Anchor 程式調用 CPMM — 例如,一個代表其存款人進行交換的金庫 — CPI 上下文看起來像這樣。帳戶順序遵循 products/cpmm/instructions
如果你的 CPI 以 PDA 身份簽署(例如,你代表存款人管理金庫),請將 CpiContext::new 替換為 CpiContext::new_with_signer 並傳遞你的種子。

常見陷阱

開啟支援工單前的簡短檢查清單:
  • 排序的代幣。 如果你推導的 poolState PDA 與鏈上流動性池不匹配,你可能忘記了排序代幣。
  • 陳舊的 API 報價。 永遠不要將 api-v3.raydium.io 的儲備值傳遞到 CurveCalculator.swap。從 RPC 取得。
  • 錯誤的代幣程式。 Token-2022 代幣的金庫由 Token-2022 程式擁有,而不是 SPL Token。始終使用流動性池的 token_0_program / token_1_program 欄位。
  • 轉帳費用代幣的滑點未充分計算。 如果流動性池的任一側是 Token-2022 轉帳費用代幣,你的 minimum_amount_out 必須以使用者實際收到的金額計算,而不是金庫發送的金額。
  • 交換時出現 NotApproved 檢查 PoolState.status — 管理員可能已暫停該流動性池上的交換。請參閱 products/cpmm/instructions 以了解狀態位元遮罩。

後續步驟

來源: