Skip to main content
本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →
版本資訊。 所有 TypeScript 範例以 @raydium-io/raydium-sdk-v2@0.2.42-alpha 針對 Solana mainnet-beta 為目標,已於 2026-04 年驗證。Rust CPI 框架以 raydium-cp-swapmaster 分支、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 之前將 mint 排序為 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,每個都按 1 + slippage 膨脹以用於指令的 maximum_* 引數,並在必要時建立 ATA。

提取流動性

原始碼:src/cpmm/withdraw.ts

收集協議/基金/創建者費用

原始碼:src/cpmm/collectCreatorFee.tssrc/cpmm/collectAllCreatorFee.ts 這些指令受管理員或創建者限制,通常由 Raydium 多簽或池創建者持有的簽署者呼叫。SDK 將其公開為原始建構工具:
離線你可以直接從 PoolState 讀取應計費用:

Rust CPI 框架

如果你想從自己的 Anchor 程式呼叫 CPMM — 例如,代表存款人執行交換的保險庫 — CPI 上下文看起來像這樣。帳戶順序遵循 products/cpmm/instructions
如果你的 CPI 以 PDA 身份簽署(例如,你代表存款人管理保險庫),將 CpiContext::new 換成 CpiContext::new_with_signer 並傳入你的種子。

常見陷阱

在開啟支援票務前的簡短檢查清單:
  • 排序的 mint。 如果你推導的 poolState PDA 與鏈上池不匹配,你可能忘記排序 mint。
  • 過時的 API 報價。 絕不要將來自 api-v3.raydium.io 的準備金值傳入 CurveCalculator.swap。從 RPC 取得。
  • 錯誤的代幣程式。 Token-2022 mint 的保險庫由 Token-2022 程式擁有,而不是 SPL Token。始終使用池的 token_0_program / token_1_program 欄位。
  • 轉帳費用 mint 的滑點計算不足。 如果池的任一側是 Token-2022 轉帳費用 mint,你的 minimum_amount_out 必須以使用者實際接收的內容為單位,而不是保險庫發送的內容。
  • 交換上的 NotApproved 檢查 PoolState.status — 管理員可能已暫停該池上的交換。查看 products/cpmm/instructions 以取得狀態位元遮罩。

後續步驟

來源: