> ## 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.

# アグリゲーター統合

> Raydium プールの検出、CPMM / CLMM / AMM v4 全体でのクォート取得、アトミックスワップの適切なプログラムセットへのルーティング方法。DEX アグリゲーターとウォレットスワップ UI 向け。

<Info>
  **このページは AI による自動翻訳です。すべての内容は英語版を正とします。**

  [英語版を表示 →](/integration-guides/aggregator)
</Info>

<Info>
  アグリゲーターの役割は、多くのプール全体でユーザーに最適な価格を提供し、単一の入力を複数のプールルートに分割して、アトミックに実行することです。このページでは、その仕事の Raydium 固有の部分、つまり検出、クォート取得、トランザクション組み立てについて説明します。
</Info>

## 検出

### プール在庫

各プロダクトの全ライブ Raydium プールのリストが必要です。3 つのオプションがあります：

1. **REST API**（最もシンプル）：`GET https://api-v3.raydium.io/pools/info/list?poolType=all&pageSize=1000&page=1` は 1000 個単位でプールを返します。すべてを取得するまでページネーションしてください。1～5 分間キャッシュしてください。
2. **オンチェーンスキャン**：CPMM、CLMM、AMM v4 プログラム ID に対して `getProgramAccounts` を実行し、ステートアカウントディスクリミネーターでフィルタリングします。約 10 秒の RPC 時間でほぼすべてのライブプールを取得できます。API がダウンしているか、レート制限されている場合に便利です。
3. **ハイブリッド**：API をプライマリソースとして使用し、日次のオンチェーンスキャンをサニティチェックとして実行します。チームは API の包括性を保証していますが、直接 CPI を通じて作成されたプール（フロントエンドなし）は時々遅れることがあります。

### ミントペアルックアップ

特定の `(mintA, mintB)` ペアについては、`GET /pools/info/mint?mint1=...&mint2=...&poolType=all&sort=liquidity` を使用してください。任意のフィー層とプロダクトタイプのすべてのプールを返します。よく使われるミントでは 1 ペアあたり最大 10 件程度の結果が一般的です。TVL でソートして、ルーティング用に上位数件を選択してください。

## クォート取得

クォート計算はプロダクトごとに異なります。SDK の純粋な数学関数を使用して、再実装を避けてください：

<Warning>
  3 つのプロダクトは 1 つのシグネチャを共有しません。`computeAmountOut` は `raydium.liquidity`（AMM v4）にのみ存在し、CLMM では `PoolUtils.computeAmountOut(Format)` として存在します。CPMM の同等物は `computeSwapAmount` と呼ばれ、異なるパラメーターを取ります。プロダクトをパラメータ化するのではなく、3 つの呼び出しを明示的に記述してください。
</Warning>

```ts theme={null}
// CPMM — computeSwapAmount、`pool` は getPoolInfoFromRpc からの CpmmComputeData である必要があります
const { computePoolInfo } = await raydium.cpmm.getPoolInfoFromRpc(cpmmPoolId);   // base58 文字列
const cpmmQuote = raydium.cpmm.computeSwapAmount({
  pool: computePoolInfo,
  amountIn,
  outputMint: mintOut,
  slippage: 0,        // 正確な期待値を計算；ルートレベルでスリッページを層状化
});
// -> { allTrade, amountIn, amountOut, minAmountOut, fee, executionPrice, priceImpact, swapResult }

// CLMM — ティックを横断；決定論的だがより高コスト。
// `poolInfo` は ComputeClmmPoolInfo（clmm.getPoolInfoFromRpc からの `computePoolInfo`）である必要があり、
// `tickarrayBitmapExtension` と `blockTimestamp` の両方が必須です。
const { amountOut: clmmOut, remainingAccounts } = PoolUtils.computeAmountOutFormat({
  poolInfo:  computeClmmPoolInfo,
  tickarrayBitmapExtension,
  tickArrayCache,
  amountIn,
  tokenOut:  mintOutToken,
  slippage:  0,
  epochInfo: await raydium.fetchEpochInfo(),
  blockTimestamp: Math.floor(Date.now() / 1000),
});
// -> { amountOut, minAmountOut, fee, priceImpact, remainingAccounts, ... }

// AMM v4 — amountIn は BN、slippage は数値、戻り値は単純な BN です
const ammV4Quote = raydium.liquidity.computeAmountOut({
  poolInfo: ammV4Pool,       // baseReserve / quoteReserve / version / status を接合する必要があります
  amountIn,
  mintIn,
  mintOut,
  slippage: 0,
});
// -> { amountOut, minAmountOut, currentPrice, executionPrice, priceImpact, fee }
```

アグリゲーター比較には各プールから `amountOut`（スリッページ前）を使用してください。

### キャッシュの鮮度

プール状態は急速に古くなります。推奨される鮮度ターゲット：

| プールタイプ | 再取得頻度 | 理由 |
| - | - | - |
| TVL が `<$100k` の CPMM | `<10s` | リザーブはすべてのトレードで移動します。 |
| TVL が `>$10M` の CPMM | 30～60s | リザーブが支配的；小さなトレードはノイズです。 |
| CLMM | `<30s` | ティック境界；単一の大きなトレードがリクイディティを再構成できます。 |
| AMM v4 | `<30s` | OpenBook 側の動きはボールトでキャプチャされません。 |

インタラクティブレイテンシーでクォートを取得するアグリゲーターの場合、各関連プール状態に対して WebSocket アカウント更新（`accountSubscribe`）をサブスクライブしてください。これにより、モデルがポーリングからプッシュに切り替わります。

### Token-2022 調整

ルート内のいずれかのミントに Token-2022 転送フィーがある場合、クォート計算は [`algorithms/token-2022-transfer-fees`](/ja/algorithms/token-2022-transfer-fees) に従って入力と出力を調整する必要があります。SDK は `poolInfo.mintA.extensions.transferFeeConfig` が入力されている場合、これを処理します。クォートを信頼する前に `.extensions` フィールドを確認してください。

## ルーティング

### シングルプールルート

ほとんどのルートはシングルプールです。`amountOut` が最も高いプールを選択してください。複数が接近している場合は、フィー層（低いほど良い）で同点を破り、次に TVL（多いほど安全）で破ってください。

### スプリットルーティング

単一プールが >5% の価格インパクトを持つ大きなトレードの場合、複数のプール全体に分割してください。シンプルな貪欲アルゴリズム：

```
remaining = amountIn
routes    = []
while remaining > 0:
    best_pool, best_size = argmax over pools of:
        marginal_out_per_in(pool, current_size_toward_pool + epsilon)
    size = min(remaining, best_pool.max_size_at_target_impact)
    routes.append((best_pool, size))
    remaining -= size
```

これにより、集計インパクトを最小化するルーティングベクトル `[(pool_A, 0.6), (pool_B, 0.3), (pool_C, 0.1)]` が生成されます。適切な凸最適化ソリューション（例：プール全体で限界価格を等しくする）は実際には貪欲な結果の約 1% 以内です。

### マルチホップルート

直接 `USDC-SOL` プールが良いクォートを提供しない場合（稀）、`USDC → RAY → SOL` は 2 つの別々のプール経由で一般的です。ホップごとのスリッページ境界を適用してください。各ホップは独自の `minAmountOut` を強制します。[`algorithms/slippage-and-price-impact`](/ja/algorithms/slippage-and-price-impact) を参照してください。

同じプール全体のマルチホップ（例：`SOL-USDC` 上の 2 つの CLMM ホップ）は常にシングルホップと比較して最適ではありません。そのようなルートを生成しないでください。

## トランザクション組み立て

### シングルホップ、シングルプール

単一プールの場合、そのプールタイプ独自のスワップビルダーを呼び出してください — `raydium.liquidity.swap`、`raydium.cpmm.swap` または `raydium.clmm.swap`。`raydium.tradeV2.swap` は*マルチホップルート*エグゼキューターであり、完全に異なる形状（`{ swapInfo, swapPoolKeys, routeProgram, ownerInfo, txVersion }`）を取ります。`raydium.trade` はありません。

```ts theme={null}
const { execute } = await raydium.liquidity.swap({
  poolKeys:        poolInfo,
  amountIn,
  amountOut:       quote.minAmountOut,
  fixedSide:       "in",
  inputMint:       mintIn,
  txVersion:       TxVersion.V0,
  computeBudgetConfig: {
    units:         250_000,
    microLamports: priorityFee,
  },
});
```

### スプリットとマルチホップ

ATA とインストラクションを手動で構成してください。パターン：

```
[1] ComputeBudget set_compute_unit_limit
[2] ComputeBudget set_compute_unit_price
[3] createATA（必要な場合、ユーザーが保有していないミントごとに 1 回）
[4..N] ルート内の各（プール、サイズ）に対する SwapInstruction
[N+1] CloseAccount（SOL をラップ/アンラップする場合）
```

すべてアトミック性のために 1 つのトランザクション内。V0 上の 3 プールスプリットでアドレスルックアップテーブルを使用する場合、これは通常 \~1100 バイトに収まります。4 つ以上のプールの場合、トランザクションサイズキャップにより、マルチ tx またはハブミントでの統合が強制されます。

### アトミック性

アグリゲーターはアトミック性を保証する必要があります：完全なルートが着地するか、何も着地しないかのいずれかです。Raydium のスワップインストラクションは `ExceededSlippage` で戻ります。そのため、1 つのホップが失敗するマルチプールルートはトランザクション全体を戻します。無料です。

唯一の例外：ルートが Raydium + サードパーティ DEX を通過する場合、その DEX もスリッページ戻りモデルを持つことを確認してください。一部のプログラムはスリッページ境界を無視します（稀）。

## 落とし穴

### 1. 古いクォート

ユーザーが「125.43 RAY を受け取ります」を見てからトランザクションが着地するまで、リザーブは変動する可能性があります。提出直前にプール状態を再取得してください。再クォート；新しいクォートが >1% 悪い場合、一時停止してユーザーに再確認してください。

### 2. プールブラックリスト

一部の Raydium プールは、転送フィーが 99% に設定されているか、転送不可能な拡張機能を持つスキャムトークンです。REST API はこれらにタグを付けます（`tags` フィールドを参照）。`scam` または `honeypot` とタグ付けされたプールをスキップしてください。Raydium のタグの上に独自のセーフティチェックを実行することは慎重です。

### 3. CLMM の観測状態要件

CLMM `SwapV2` は `observation_state` アカウントを取ります。SDK はこれをあなたのために入力します。手動で構築されたインストラクションはしばしば忘れます。これにより、プログラムは `AccountNotFound` で戻ります。常にこれを含めてください。

### 4. アドレスルックアップテーブル

Raydium は、最も使用されるアカウント（メインミント、プログラム ID、AmmConfigs）のパブリックルックアップテーブルを保持しています。アグリゲーターはこれらを使用する必要があります — トランザクションあたり \~100 バイトを節約し、より大きなルートが V0 に収まるようにします。LUT アドレスを取得：

```ts theme={null}
const raydiumLUTs = await raydium.getRaydiumLutAddresses();
```

### 5. 混雑への対応

高ボリュームウィンドウ中、トランザクションはメモリプール内で複数ブロック留まる可能性があります。TX 有効期限での積極的な再試行（戻りではなく — 戻りは決定論的）が推奨されます。SDK の `sendAndConfirm` オプションは基本的な再試行を行います。本番アグリゲーターはその上に独自のロジック（Jito バンドル、マルチ RPC ブロードキャスト）を層状化します。

## チェックリスト

本番環境に移行する前に、以下を確認してください：

* [ ] プール検出は CPMM + CLMM + AMM v4 を包括的にカバーしています。
* [ ] クォートは、いくつかのテストトレードで Raydium 独自の UI クォート内 1 ベーシスポイント以内に一致します。
* [ ] スプリットルーティングは、単一プール上の >5% インパクトのトレードに対してキックインします。
* [ ] プライオリティフィーは最近のプールプログラムフィーに対してサイズ設定されています（[`integration-guides/priority-fee-tuning`](/ja/integration-guides/priority-fee-tuning) を参照）。
* [ ] Token-2022 転送フィーが計算され、ユーザーに表示されます。
* [ ] スリッページが超過したときにトランザクションがクリーンに戻ります。
* [ ] 再試行ロジックは tx 有効期限（再試行）を戻り（再試行しない）から区別します。

## ポインター

* [`integration-guides/routing-and-mev`](/ja/integration-guides/routing-and-mev) — サンドイッチ耐性、バンドル。
* [`integration-guides/priority-fee-tuning`](/ja/integration-guides/priority-fee-tuning) — コンピュートバジェットインストラクションのサイズ設定。
* [`sdk-api/rest-api`](/ja/sdk-api/rest-api) — プールリストエンドポイント。

ソース：

* [Raydium SDK v2 `trade` モジュール](https://github.com/raydium-io/raydium-sdk-V2)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.