このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →
CPI が適切なツールの場合
カスタムプログラムは、トレードがあなたのプログラムのみが実行できるオンチェーン状態変更と共にアトミックに発生する必要がある場合に意味があります。一般的なケース:- エスクロー・リミットオーダープログラム — ユーザーはミントをエスクロー内にデポジットし、あなたのプログラムは価格条件を監視し、トリガー時にあなたのプログラムは Raydium を通じてアトミックにスワップし、ユーザーのアカウントをクレジットします。
- アグリゲータープロキシ — Raydium と 1 つ以上の他の DEX を通じてスワップをルーティングする単一の命令で、すべてのホップがあなたのプログラムが所有する単一のスリップページチェック下にあります。
- 自動複利運用ヴォルト — LP またはファームステーキングをあなたのヴォルトにデポジット、ヴォルトは定期的にリワードを収穫し、リクイディティを再提供し、シェアトークンを発行します。
- ストラテジーヴォルト — CLMM を通じてスワップして再バランスするレバレッジ LP ポジション、ポジションをクローズし 1 つのトランザクションでコラテラルをスワップする清算人。
- カスタムベスティング付きトークン起動プラットフォーム — あなたのプログラムはベスティングトークンを保有し、スケジュールに基づいて Raydium プールにリリースします。
コンポジションパターン
パターン 1:シンプロキシ
あなたのプログラムは、何らかのポリシーを検証する単一の命令(例:ホワイトリストに登録されたミントペア、検証済みユーザーの手数料割引)を公開してから、Raydium に転送します。パターン 2:エスクロー
あなたのプログラムはユーザーの入力ミントを保有する PDA を所有しています。トリガー時、PDA は Raydium へのスワップをするために CPI に署名します。CpiContext::new_with_signer を経由して署名します。PDA サイナーシードを参照。
パターン 3:複合マルチホップ
あなたのプログラムは 1 つの命令で複数の CPI を発行し、すべてのホップ全体で単一のスリップページ境界を強制します。Raydium スワップ命令にはそれぞれ独自のminimum_amount_out がありますが、それらを 0(または非常に緩いフロア)に設定し、最後のホップの後に自分自身で厳密な最終最小値を強制します。
パターン 4:ヴォルト・ストラテジー
あなたのプログラムは LP トークンまたはファームステーキングを PDA に保有しています。キーパー(またはユーザー)がcompound() を呼び出し、次のことを行います:
- ファームからリワードを収穫します。
- リワードをプールトークンにスワップします(CPMM または CLMM への CPI)。
- 収益を LP に戻します(別の CPI)。
- 新しい LP をステーキングします(別の CPI)。
アカウントリスト構成
呼び出し元プログラムのAccounts 構造体は Raydium プログラムのアカウント順序をミラーリングしますが、ほとんどの Raydium 側アカウントは UncheckedAccount です。なぜなら Raydium はそれ自体を検証するためです。あなたが所有するアカウントにのみ制約を追加します:
UncheckedAccount — は怠慢ではありません。受信者はそれ自体を検証します。呼び出し元で二重検証するだけで CU を燃やし、Raydium が新しい構造体レイアウトフィールドを出荷するときに同期が外れるリスクがあります。
CPI 呼び出し自体
PDA サイナーシード
CPI は、authority として渡される PDA が呼び出し元が主張する導出と一致した場合にのみ成功します。2 つは以下に同意する必要があります:
- シードバイト列(ここでは
[b"escrow", user.key().as_ref()])。 - バンプ。
- 呼び出し元プログラム ID(あなたのプログラム、Raydium ではない)。
authority 署名と入力 ATA がその authority によって所有されることのみが重要です。検証は anchor_spl::token::transfer で発生します:ATA の authority フィールドがサイナーと等しい必要があります。
一般的なバグ:user を authority として渡す(そしてエスクロー PDA によって所有されている escrow_input_ata から転送)。SPL Token プログラムは owner mismatch で拒否します。常に authority フィールドが ATA 所有者と一致するようにしてください。
残りのアカウント
複数の Raydium 命令は固定されたもの後に付加されるアカウントの可変長リストを取ります — 残りのアカウント。- CLMM
SwapV2:スワップが走査する可能性のあるティック配列の 1~8 個のTickArrayStateアカウント、スワップ方向で。 - Farm v6
Deposit/Harvest/Withdraw:(reward_vault, user_reward_ata)ペア、有効なリワードスロットごとに 1 ペア。 - Token-2022 トランスファーフック ミント:トランスファーフックプログラムおよびフックが必要とするアカウント。
複合呼び出しのコンピュート予算
CPI は呼び出しフレーム自体に約 1,500 CU を消費します。被呼び出し側の独自の CU 使用がその上に積み重なります。Raydium CPI ごとの大まかな予算:| 呼び出し | CU (SPL Token) | CU (Token-2022) |
|---|---|---|
| CPMM swap_base_input | ~150,000 | ~200,000 |
| CLMM swap_v2 (単一ティック配列) | ~180,000 | ~230,000 |
| CLMM swap_v2 (2 ティックを越える) | ~220,000 | ~270,000 |
| Farm v6 deposit | ~120,000 | ~150,000 |
| Farm v6 harvest (リワードスロットごと) | +30,000 | +40,000 |
| AMM v4 swap_base_in | ~140,000 | n/a |
harvest → swap A → swap B → deposit LP → stake LP を行う自動複利運用機は簡単に 700k CU に達します。
常に明示的な ComputeBudgetProgram::set_compute_unit_limit を設定します:
エラープロパゲーション
Raydium のプログラムは安定したエラーコード付きの Anchor エラーを返します。あなたの呼び出し元プログラムはそれらをErr(ProgramError::Custom(code)) として見ます。デフォルトでバブルアップします:
sdk-api/anchor-idl);新しいコードは最後に追加され、既存のコードは意味を変更しません。
完全な実装例:リミットオーダーエスクロー
フロー:open_order— ユーザーはinput_mintのamount_inをエスクロー PDA にデポジット、ターゲットmin_amount_outと有効期限を記録します。execute_order— 誰でも(キーパー)現在のプールアカウントで呼び出します。プログラムは現在の見積りがmin_amount_out以上であることを確認し、Raydium スワップへの CPI を実行し、出力をエスクロー内に保持します。claim— ユーザーはエスクロー内の出力ミントを引き出します。
テスト
Raydium プログラムをローカルバリデータにプルして統計テストを行う(Anchor.toml から):
anchor test はスタートアップ時にメインネットからそれらをフェッチします。sdk-api/rust-cpiを参照。
コンポジション固有の落とし穴
リエントランシー
Solana に真のリエントランシーはありません — CPI は同じ呼び出しで発信元プログラムにコールバックできません。しかし、あなたは論理的なリエントランシーを自分自身に組み込むことはできます:CPI があなたの状態を読み、その後あなたのコードが CPI がそれを変更しなかったと仮定してそれを再び読みます。Raydium の場合、CPI はあなたの状態に触れないため、これは例えばフラッシュローンコンテキストのような懸念事項は少ないです。しかし Raydium をレンディングプロトコルと組み合わせる場合は、注意してください。アカウント可変性ドリフト
あなたのプログラムがアカウントをmut として渡すが、Raydium が読み取り専用として期待する場合(またはその逆)、ランタイムは InvalidAccountData で呼び出しを拒否します。常に IDL の Raydium 命令の期待される可変性を確認してください;anchor_cp_swap::cpi::accounts::Swap はそのフィールド型でこれを強制します。
Token-2022 プログラムフィールド
入力ミントと出力ミントは異なるトークンプログラム下にあるかもしれません — 1 つ SPL Token、1 つ Token-2022。CPI がこのため別のinput_token_program と output_token_program フィールドを持っています。常に各ミントの owner フィールドを確認し、正しいプログラムを各スロットにルーティングしてください。
バージョン付きトランザクション
2 つ以上の Raydium CPI に加えて ATA 作成を行う複合 tx は、レガシー(v0 なし LUT)トランザクションにはめったに適合しません。V0 をアドレスルックアップテーブルで使用してください;raydium.getRaydiumLutAddresses() で Raydium の公開 LUT をプルしてください。
ポインタ
sdk-api/rust-cpi— 低レベル CPI メカニクス。integration-guides/priority-fee-tuning— コンピュート予算サイジング。products/cpmm/code-demos、products/clmm/code-demos、products/farm-staking/code-demos— 製品ごとの CPI スニペット。

