Skip to main content
このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →

Cargo の依存関係

cpi フィーチャーフラグを使用することで、プログラム全体ではなく CPI サーフェス(アカウント構造体とインボーカー)のみをコンパイルして、バイナリサイズを抑えることができます。 アカウント構造体を端から端まで結線した実動作 CPI 例は、raydium-io/raydium-cpi-example(AMM v4、CPMM、CLMM をカバー)を参照してください。

アカウントリストの構築

すべての Raydium CPI は、呼び出し元プログラム内の Accounts 構造体が必要です。フィールドはプログラムの命令アカウント順序に 1 対 1 で対応し、フィールドレベルのバリデーターを備えています。
Raydium 側のアカウントのほとんどが UncheckedAccount なのは、被呼び出し側(Raydium)がバリデーションを行うためです。呼び出し元プログラムは、あなたが所有するアカウント(ユーザー ATA、自分の PDA)だけを厳密にバリデーションします。/// CHECK: ドックコメントは、チェック不足についての Anchor の警告を抑制します。

CPI 呼び出しの構築

Anchor は命令ごとに 1 つのヘルパーを生成します。
cpi::swap_base_input は IDL から生成されます。引数リストは Anchor 命令の引数リストを反映しています。

署名者シード(PDA 署名付き CPI)

プログラムが PDA に代わって CPI に署名する場合(ボルト、エスクロー等で一般的)は、CpiContext::new_with_signer を使用します。
署名者シードは PDA の派生と一致する必要があります。authority(または類似の署名者ロール)として渡されるすべてのアカウントについて、Solana ランタイムは PDA がこれらのシードを通じて署名することを確認します。

残りのアカウント

一部の Raydium 命令は、固定されたアカウントの後に追加される可変長リストである残りのアカウントを取ります。標準的な例は以下の通りです。
  • CLMM SwapV2: スワップが横断する可能性があるティック配列に対応する 1 ~ 8 個の TickArrayState アカウントを追加します。
  • Farm v6 Deposit: 各ライブ報酬ストリームの (reward_vault, user_reward_ata) ペアを追加します。
Anchor の CPI ヘルパーは残りのアカウントをタイプチェックしません。.with_remaining_accounts(...) で渡します。
順序が重要です。受け取り元プログラムは、渡した順序で残りのアカウントを反復処理します。CLMM の場合、ティック配列は方向順に並べられる必要があります(スワップ方向内の最初の配列が最初)。farm v6 の場合、報酬スロットはスロットインデックス順に並びます。

エラー伝播

Raydium のプログラムは独自のエラー列挙型を返します。Anchor がそれをラップし、呼び出し元プログラムは Err(ProgramError::Custom(code)) として見ます。特定のエラーを処理するには:
エラーコード番号は IDL ポリシー(sdk-api/anchor-idl)に従って安定しています。数値と比較して特定のコードをテストできます。

構成された CPI のコンピュートバジェット

各 CPI フレームはオーバーヘッド(呼び出し自体で約 1,500 CU)を持ち、被呼び出し側の CU 消費がその上に積み重なります。プログラム内から CPMM スワップを呼び出すトランザクションは以下を消費します。
スタックされたルーティング(プログラム → アグリゲーター → CPMM + CLMM + ファーム収穫)の場合、バジェットは ≥500k CU です。常にトランザクションで明示的な ComputeBudgetProgram::set_compute_unit_limit(...) 命令を設定してください。デフォルトの 200k CU リミットは静かに枯渇します。

AMM v4 — 手動 Instruction 構築

AMM v4 には Anchor クレートがありません。Instruction を手動で構築します。
完全なアカウントリストは products/amm-v4/code-demos を参照してください。

Farm v6 — 報酬ペアの残りのアカウント

Farm v6 の Deposit / Withdraw / Harvest は、残りのアカウント内で (reward_vault_i, user_reward_ata_i) ペアパターンを使用します。正確なシーケンスは以下の通りです。
ライブ(実行中または終了したが未請求)の報酬スロットごとに 1 ペア。未使用スロットを省略します。プログラムは farm_state.reward_infos[i].reward_state から分派します。

CPI フローのテスト

ローカル開発では、テストバリデーターで Raydium プログラムが利用可能である必要があります。オプションは以下の通りです。
  1. プログラムクローンを使用した anchor testAnchor.toml 内:
    これはメインネットから展開されたバイトコードをローカルバリデーターに取得します。
  2. Devnet — Raydium はすべてのプログラムをメインネットと同じプログラム ID で devnet に展開します。anchor test --provider.cluster devnet を実行してライブコードを操作します。
  3. ローカル展開 — Raydium リポジトリをクローンしてローカルバリデーターに anchor deploy します。テストサイクルのオーバーヘッドを追加しますが、デバッグのため被呼び出し側を変更できます。

ポインター

参照元: