Chuyển đến nội dung chính

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.

Trang này được dịch tự động bằng AI. Phiên bản tiếng Anh là bản chính thức.Xem bản tiếng Anh →

IDL là gì

Các chương trình Anchor trên Solana công bố một tệp IDL (Interface Definition Language) mô tả các instruction, layout account, enum error và các schema struct của chúng. IDL là nguồn sự thật cho việc tạo mã client — TypeScript SDK, Rust CPI crate và các client của bên thứ ba đều được tạo từ (hoặc viết tay dựa trên) nó. Raydium công bố IDL cho CPMM, CLMM và LaunchLab. AMM v4, Stable AMM và Farm (v3 / v5 / v6) có thời gian trước Anchor hoặc không được phân phối bằng Anchor — cấu trúc account của chúng được duy trì thủ công trong SDK.

Nơi tìm chúng

IDL nằm trong một kho riêng biệt:
https://github.com/raydium-io/raydium-idl
Các tệp chính xác:
Chương trìnhTệp IDL
CPMMraydium_cpmm/raydium_cp_swap.json
CLMMraydium_clmm/raydium_clmm.json
LaunchLabraydium_launchpad/raydium_launchpad.json
AMM v4không có IDL chính thức — xem raydium-sdk-V2/src/raydium/liquidity/layout.ts để xem layout viết tay
Stable AMMkhông có IDL chính thức — layout trong SDK
Farmkhông có IDL chính thức — layout trong SDK
Các tệp IDL được quản lý phiên bản trong lịch sử git của kho; ghim vào một commit cụ thể nếu bạn cần tính toàn vẹn từng byte. IDL cũng có thể được kéo trực tiếp từ các chương trình đã triển khai thông qua tính năng on-chain IDL của Anchor (nếu nhà phát hành chương trình chọn tham gia):
anchor idl fetch <PROGRAM_ID> --provider.cluster mainnet
CPMM, CLMM và LaunchLab đều có IDL on-chain. AMM v4, Stable AMM và Farm thì không (các chương trình trước Anchor).

Tái tạo client TypeScript

Codegen của Anchor tạo ra một client được gõ từ IDL:
# Sử dụng Anchor CLI
anchor build
anchor idl parse \
  --file target/idl/cpmm.json \
  --out target/types/cpmm.ts

# Hoặc với các helper TS của `@coral-xyz/anchor` tại runtime:
import { Program, AnchorProvider } from "@coral-xyz/anchor";
// Kéo IDL trực tiếp từ kho raydium-idl (hoặc vendor nó vào dự án của bạn).
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);

// Các method builder được gõ tự động tạo:
await program.methods
  .swapBaseInput(new BN(amountIn), new BN(minAmountOut))
  .accounts({ ... })
  .rpc();
Hầu hết các nhà tích hợp không làm điều này — họ sử dụng helper raydium.cpmm.swap(...) cấp cao hơn, cái mà bao bọc các method Anchor cộng với tất cả công việc kế toán (tạo ATA, điều chỉnh phí chuyển, ngân sách tính toán, định tuyến chương trình Token-2022). Chỉ tái tạo khi bạn cần một layer dưới SDK.

Tái tạo client Rust (CPI crate)

Raydium công bố các crate Anchor cho các chương trình có IDL:
# 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"] }
Tính năng cpi tiếp xúc các struct account cpi::accounts::<Ix> và các invoker cpi::<ix>() — những wrapper CPI sẵn sàng sử dụng. Xem sdk-api/rust-cpi để biết các mẫu sử dụng. Nếu bạn thích tạo binding mới:
# Từ IDL, sử dụng anchor-client
anchor idl parse \
  --file raydium_cpmm/raydium_cp_swap.json \
  --out src/generated/cpmm_bindings.rs

Tái tạo client Python

Không có SDK Python chính thức của Raydium. Các trình tạo của bên thứ ba bao gồm:
  • anchorpy — bản sao Python của @coral-xyz/anchor. Tạo ra các method builder được gõ từ IDL.
  • solders — các nguyên thủy Solana cấp thấp (giao dịch, keypair, pubkey) trong các binding Rust; được sử dụng bên dưới 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={...}))
Xem sdk-api/python-integration để có một hướng dẫn đầy đủ hơn.

Chính sách thay đổi IDL

Raydium tuân theo các quy tắc này để ổn định IDL:
  1. Các instruction discriminator không bao giờ thay đổi. Thêm instruction mới mở rộng enum ở cuối; các discriminator hiện có vẫn ổn định.
  2. Các layout struct account chỉ phát triển bổ sung. Các trường mới đi ở cuối, được đặt trước bằng một bước tăng kích thước trong schema on-chain. Các trường hiện có giữ lại offset của chúng.
  3. Các mã enum error chỉ được nối thêm. Một mã lỗi hiện có luôn có cùng ý nghĩa.
  4. Các thay đổi ngắt gửi trong các chương trình mới. Khi cần thiết kế lại, nhóm triển khai một ID chương trình mới (ví dụ: CPMM như một chương trình mới thay vì nâng cấp AMM v4). Các pool cũ tiếp tục chạy trên chương trình cũ; pool mới đi vào chương trình mới.
Chính sách này làm cho client được tái tạo tương thích ngược: một client được tạo dựa trên IDL cũ hai phiên bản sẽ vẫn giải mã trạng thái hiện tại một cách chính xác (nó coi các byte kéo dài thêm như phần đệm).

Phải làm gì khi IDL thay đổi

  1. Cập nhật SDK. npm update @raydium-io/raydium-sdk-v2.
  2. Tái tạo mã client của bạn nếu bạn sử dụng Anchor codegen trực tiếp.
  3. So sánh layout account. Các trường kéo dài thêm của layout mới là điều duy nhất mã của bạn chưa thấy; xác nhận liệu bạn có cần chúng.
  4. Không giả định rằng các instruction discriminator cũ là không hợp lệ. Theo quy tắc 1, chúng vẫn hoạt động.
  5. Chạy lại các bài kiểm tra tích hợp chống devnet trước khi triển khai đến mainnet.

Khắc phục sự cố IDL

Lỗi “Invalid discriminator”

Thường có nghĩa là một client được xây dựng dựa trên phiên bản N của IDL đang cố gắng gọi một instruction chỉ tồn tại trong phiên bản chương trình trước triển khai. Kéo lại IDL từ chương trình trực tiếp:
anchor idl fetch <PROGRAM_ID>

Lỗi giải mã Account

Nếu program.account.<Name>.fetch(pubkey) ném ra lỗi “Invalid account discriminator”, account đó được tạo bằng phiên bản chương trình trước và Anchor đang từ chối discriminator 8 byte của nó. Sửa chữa là sử dụng bộ phân tích layout thô từ SDK (PoolInfoLayout.decode(accountData)), cái mà không thực thi các discriminator Anchor.

Thiếu instruction trong client được tạo

Codegen TS của Anchor chỉ tạo các method cho các instruction có mục IDL có name được phân tích cú pháp như một định danh hợp lệ. Tất cả các instruction của Raydium đều thỏa mãn điều này, nhưng nếu bạn thấy sự không phù hợp, hãy kiểm tra xem tệp IDL có phải từ bản phát hành SDK hiện tại không.

Con trỏ

Nguồn: