メインコンテンツへスキップ

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(Interface Definition Language)ファイルを公開しており、そこには命令、アカウントレイアウト、エラー列挙型、構造体スキーマが記述されています。IDL はクライアントコード生成の信頼できる情報源です。TS SDK、Rust CPI クレート、サードパーティ製クライアントはすべて、それから生成されるか、または手動で記述されます。 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 履歴でバージョン管理されています。バイト単位の再現性が必要な場合は、特定のコミットにピンしてください。 IDL は Anchor の オンチェーン IDL 機能を通じてデプロイされたプログラムから直接取得することもできます(プログラムパブリッシャーがオプトインした場合):
anchor idl fetch <PROGRAM_ID> --provider.cluster mainnet
CPMM、CLMM、LaunchLab はすべてオンチェーン 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 クレート)の再生成

Raydium は IDL を持つプログラムの Anchor クレートを公開しています:
# 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 — Rust バインディングの低レベル Solana プリミティブ(トランザクション、キーペア、パブキー)。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. アカウント構造体レイアウトは加算型でのみ進化します。 新しいフィールドは末尾に追加され、オンチェーンスキーマのサイズバンプが前に付けられます。既存のフィールドはオフセットを保持します。
  3. エラー列挙型コードは追加のみです。 既存のエラーコードは常に同じことを意味します。
  4. 破壊的変更は新しいプログラムで配布されます。 再設計が必要な場合、チームは新しいプログラム ID をデプロイします(例えば、AMM v4 をアップグレードするのではなく、CPMM を新しいプログラムとしてデプロイします)。古いプールは古いプログラムで実行され続けます。新しいプールは新しいプログラムにいきます。
このポリシーにより、再生成されたクライアントは下位互換性があります。2つのバージョン前の IDL に対して生成されたクライアントは、現在の状態を正しくデコードできます(追加の末尾バイトをパディングとして見ます)。

IDL が変更されたときの対応

  1. SDK を更新します。 npm update @raydium-io/raydium-sdk-v2
  2. Anchor コードジェンを直接使用する場合は クライアントコードを再生成します
  3. アカウントレイアウトを比較します。 新しいレイアウトの末尾フィールドのみが、コードが見ていないものです。それらが必要かどうかを確認してください。
  4. 古い命令ディスクリミネータが無効だと仮定しないでください。 ルール 1 により、それらはまだ機能します。
  5. devnet に対して統合テストを再実行します mainnet にロールアウトする前に。

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 リリースからのものであるかどうかを確認してください。

ポインタ

ソース: