跳轉到主要內容

Documentation Index

Fetch the complete documentation index at: https://docs.raydium.io/llms.txt

Use this file to discover all available pages before exploring further.

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

IDL 是什麼

Solana 上的 Anchor 程式會發布 IDL(介面定義語言)檔案,描述其指令、帳戶佈局、錯誤列舉和結構綱要。IDL 是用戶端程式碼產生的真實來源——TS SDK、Rust CPI crate 和第三方用戶端都從中產生(或針對其手動編寫)。 Raydium 為 CPMM、CLMM 和 LaunchLab 發布 IDL。AMM v4、Stable AMM 和 Farm(v3 / v5 / v6)是在 Anchor 之前開發的,或並未使用 Anchor 分發——它們的帳戶結構在 SDK 中手動維護。

在哪找到它們

IDL 存放在專用的儲存庫中:
https://github.com/raydium-io/raydium-idl
具體檔案如下:
程式IDL 檔案
CPMMraydium_cpmm/raydium_cp_swap.json
CLMMraydium_clmm/raydium_clmm.json
LaunchLabraydium_launchpad/raydium_launchpad.json
AMM v4無官方 IDL——見 raydium-sdk-V2/src/raydium/liquidity/layout.ts 中手動編寫的佈局
Stable AMM無官方 IDL——佈局在 SDK 中
Farm無官方 IDL——佈局在 SDK 中
IDL 檔案在儲存庫的 git 歷史中有版本控制;如需逐字節再現性,請釘選到特定提交。 也可以透過 Anchor 的 on-chain IDL 功能直接從已部署的程式提取 IDL(如果程式發布者選擇加入):
anchor idl fetch <PROGRAM_ID> --provider.cluster mainnet
CPMM、CLMM 和 LaunchLab 都有 on-chain IDL。AMM v4、Stable AMM 和 Farm 沒有(Anchor 之前的程式)。

重新產生 TypeScript 用戶端

Anchor 的程式碼產生器從 IDL 產生一個型別化用戶端:
# 使用 anchor CLI
anchor build
anchor idl parse \
  --file target/idl/cpmm.json \
  --out target/types/cpmm.ts

# 或在執行時使用 `@coral-xyz/anchor` TS 助手:
import { Program, AnchorProvider } from "@coral-xyz/anchor";
// 直接從 raydium-idl 儲存庫提取 IDL(或將其自行提供到你的專案中)。
import cpmmIdl from "./idls/raydium_cp_swap.json";

const provider = new AnchorProvider(connection, wallet, {});
const program  = new Program(cpmmIdl as any, CPMM_PROGRAM_ID, provider);

// 自動產生的型別化方法建構器:
await program.methods
  .swapBaseInput(new BN(amountIn), new BN(minAmountOut))
  .accounts({ ... })
  .rpc();
大多數整合者不會這樣做——他們使用更高層的 raydium.cpmm.swap(...) 助手,包裝 Anchor 方法以及所有簿記(ATA 建立、轉帳費用調整、計算預算、Token-2022 程式路由)。只有當你需要 SDK 下方的層級時才應重新產生。

重新產生 Rust 用戶端(CPI crate)

Raydium 為具有 IDL 的程式發布 Anchor crate:
# Cargo.toml
[dependencies]
raydium_cp_swap = { git = "https://github.com/raydium-io/raydium-cp-swap", branch = "master", features = ["cpi"] }
raydium_amm_v3 = { git = "https://github.com/raydium-io/raydium-clmm",    branch = "master", features = ["cpi"] }
cpi 功能公開 cpi::accounts::<Ix> 帳戶結構和 cpi::<ix>() 呼叫器——準備好使用的 CPI 包裝器。見 sdk-api/rust-cpi 以了解用途模式。 如果你更喜歡產生全新的繫結:
# 從 IDL,使用 anchor-client
anchor idl parse \
  --file raydium_cpmm/raydium_cp_swap.json \
  --out src/generated/cpmm_bindings.rs

重新產生 Python 用戶端

沒有官方的 Raydium Python SDK。第三方產生器包括:
  • anchorpy@coral-xyz/anchor 的 Python 移植。從 IDL 產生型別化方法建構器。
  • solders — 低層級 Solana 基本元素(交易、金鑰對、公開金鑰)以 Rust 繫結;在 anchorpy 下使用。
pip install anchorpy solders solana
from anchorpy import Program, Provider
from solana.rpc.async_api import AsyncClient
from pathlib import Path
import json

idl = json.loads(Path("cpmm.json").read_text())
provider = Provider(AsyncClient("https://api.mainnet-beta.solana.com"), wallet)
program  = Program(idl, CPMM_PROGRAM_ID, provider)

await program.rpc["swap_base_input"](amount_in, min_amount_out, ctx=Context(accounts={...}))
sdk-api/python-integration 以取得更完整的說明。

IDL 變動政策

Raydium 遵循以下 IDL 穩定性規則:
  1. 指令判別器永遠不會改變。 添加新指令會在列舉末端擴展;現有判別器保持穩定。
  2. 帳戶結構佈局僅以加法方式演進。 新欄位放在末端,前面加上 on-chain 綱要的大小凸起。現有欄位保持其位移。
  3. 錯誤列舉代碼僅可追加。 現有錯誤代碼始終表示同一件事。
  4. 破壞性變動在新程式中發送。 當需要重新設計時,團隊部署一個新程式 ID(例如 CPMM 作為全新程式而不是升級 AMM v4)。舊池繼續在舊程式上運行;新池走向新程式。
此政策使重新產生的用戶端向後相容:根據兩版本舊 IDL 產生的用戶端仍可正確解碼當前狀態(它將額外尾部位元組視為填充)。

IDL 變動時該做什麼

  1. 更新 SDK。 npm update @raydium-io/raydium-sdk-v2
  2. 重新產生你的用戶端程式碼,如果你直接使用 Anchor 程式碼產生。
  3. 比較帳戶佈局。 新佈局的尾部欄位是你的程式碼未見過的唯一東西;確認你是否需要它們。
  4. 不要假定舊指令判別器無效。 根據規則 1,它們仍然有效。
  5. 在上線到主網前,對 devnet 重新執行整合測試

IDL 故障排除

「無效判別器」錯誤

通常表示使用 IDL 版本 N 建構的用戶端正在嘗試呼叫僅在程式部署前版本中存在的指令。重新提取活動程式的 IDL:
anchor idl fetch <PROGRAM_ID>

帳戶解碼失敗

如果 program.account.<Name>.fetch(pubkey) 拋出「無效帳戶判別器」,則帳戶由前一個程式版本建立,Anchor 拒絕其 8 位元組判別器。修復方法是使用 SDK 中的原始佈局分析器(PoolInfoLayout.decode(accountData)),它不強制執行 Anchor 判別器。

產生的用戶端中遺漏指令

Anchor 的 TS 程式碼產生器僅為 IDL 項目產生方法,其 name 可解析為有效識別符。Raydium 的指令都滿足此條件,但如果你看到不匹配,檢查 IDL 檔案是否來自當前 SDK 版本。

指標

來源: