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

# ルーティングの数学

> ルーターは価格計算を行いません。各ホップはプールプログラムの曲線に委譲します。マルチホップスリッページは複合します。CLMMホップは limit_prices を使用します。

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

  [英語版を表示 →](/products/routing/math)
</Info>

## ルーターは計算を行いません

ルーティングプログラムは**価格設定ロジックを実装していません**。これは純粋なオーケストレーター（調整役）です。ルートを受け付け、アカウントを子プログラムに渡し、トークンフローをチェーンします。

各ホップはそれぞれのプールプログラムの曲線で価格設定されます：

* **AMM v4 ホップ：** 定積公式（`x · y = k`）と OpenBook ハイブリッド価格設定を使用します。[`products/amm-v4/math`](/ja/products/amm-v4/math) を参照してください。
* **CPMM ホップ：** 定積公式と設定可能な手数料階層を使用します。[`products/cpmm/math`](/ja/products/cpmm/math) を参照してください。
* **CLMM ホップ：** 集中流動性ティック数学を使用します。[`algorithms/clmm-math`](/ja/algorithms/clmm-math) を参照してください。
* **Stable ホップ：** 類似資産の安定スワップ曲線を使用します。[`products/stable/math`](/ja/products/stable/math) を参照してください。

ルーターの関与は以下のみです：

1. CPI を経由して各プールのスワップ指令を呼び出す。
2. 出力金額を収集する。
3. それを次のホップの入力金額として渡す。
4. 最終出力を呼び出し元のスリッページ制限に照合する。

## スリッページの複合

マルチホップルートでは、各ホップのスリッページが複合します。ホップ 1 での小さなスリッページが、ホップ 2 へのボリュームが既に減少しているため、ホップ 2 ではより大きなスリッページになります。

**例：**

```
ルート: USDC → SOL → STEP

プール 1（USDC / SOL）:
  入力: 1000 USDC
  スリッページ: 1%（スポット価格では 0.5 SOL ですが、0.495 SOL を取得します）
  出力: 0.495 SOL

プール 2（SOL / STEP）:
  入力: 0.495 SOL（既に減少）
  スリッページ: 1%（スポット価格では 495 STEP ですが、490 STEP を取得します）
  出力: 490 STEP

USDC → STEP の総実効スリッページ: 1.99%（1% + 1% = 2% ではなく）
```

`minimum_amount_out` を提供する場合、ルーターは最終出力をこのグローバル制限に照合します。各ホップはまたそのスワップを独自の手数料構造に照合しますが、ルーターはルート中に再引用しません。ルートを事前計算し、十分なスリッページ許容範囲を含める必要があります。

## CLMMホップと limit\_prices

CLMM プールへの各ホップについて、ルーターはプールの現在の `sqrt_price_x64` が指定された境界内にあることを確認します。これらの境界は `limit_prices` と呼ばれる `VecDeque<u128>` として渡されます：

* ルート内の CLMM ホップあたり 1 つの `sqrt_price_x64`。
* `sqrt_price_x64` は CLMM によって使用されるティックベースの価格表現です。定義については [`algorithms/clmm-math`](/ja/algorithms/clmm-math) を参照してください。
* ルーターは以下を強制します：

```
  sqrt_price_lower <= pool.sqrt_price_x64 <= sqrt_price_upper
```

各 CLMM ホップについて、価格が範囲外の場合はスワップを拒否します。

### 指令バリアントと limit\_prices

* **`SwapBaseInWithUserAccount`, `SwapBaseOutWithUserAccount`（レガシー、タグ 0 と 1）:** `limit_prices` VecDeque は**必須**です。ホップが CLMM プールの場合、空のデックはエラーで拒否されます。CLMM ホップごとに 1 つの価格を順序通りに提供する必要があります。

* **`SwapBaseIn`, `SwapBaseOut`（現在、タグ 8 と 9）:** `limit_prices` VecDeque は**オプション**です。空のデックは無視され、価格チェックは実行されません。新しいコードはこれらを使用する必要があります。

### limit\_prices の構築

M 個の CLMM ホップを持つルートの場合、デックは正確に M 個のエントリを含める必要があります。ホップごとに順序付けます：

```
limit_prices = [
  sqrt_price_for_first_clmm_hop,
  sqrt_price_for_second_clmm_hop,
  ...
]
```

### limit\_prices をいつチェックするか

`sqrt_price_x64` はプールの現在の価格のスナップショットです。スワップが実行されると継続的に変更されます。以下を行う必要があります：

1. オンチェーンからプールの現在の状態を取得する。
2. 許容可能な境界を計算します（例：現在の価格の ±0.5%）。
3. それらの境界を `limit_prices` にエンコードします。
4. ルーター指令に境界を含める。

トランザクションが到達する前にプールの価格が境界を超えてドリフトした場合、ルーターはそれを拒否します。

## 手数料処理

各プールはその構成に従って独自の手数料を請求します：

* **AMM v4：** 0.25%（固定）LP、プロトコル、ファンドに分割。
* **CPMM：** `AmmConfig` ごとに設定可能（デフォルト 0.25%、層による分割は異なる）。
* **CLMM：** プールごとに設定可能、入力金額から差し引かれます。
* **Stable：** AMM v4 と同じ、0.25% 分割。

ルーターは**独自の手数料を取りません**。すべての手数料処理は各子プールに委譲されます。ホップ N からの出力には、そのホップの手数料がすでに差し引かれています。

個別プールの手数料ドキュメントを参照してください：

* [`products/amm-v4/fees`](/ja/products/amm-v4/fees)
* [`products/cpmm/fees`](/ja/products/cpmm/fees)
* [`products/clmm/fees`](/ja/products/clmm/fees)（利用可能な場合）
* [`products/stable/fees`](/ja/products/stable/fees)（利用可能な場合）

## マルチホップ計算例

2 つの定積プール（それぞれ 0.25% の手数料）にルート USDC → SOL → STEP をルーティングするとします：

```
入力: 1000 USDC
プール 1（USDC/SOL）:
  差し引かれた手数料: ceil(1000 * 0.25%) = 2.5 USDC
  曲線への正味入力: 997.5 USDC
  曲線出力（スリッページ前）: 0.5 SOL
  スリッページマージン: 1% と仮定すると、約 0.495 SOL を取得します

プール 2（SOL/STEP）:
  入力: 0.495 SOL
  差し引かれた手数料: ceil(0.495 * 0.25%) ≈ 0.001 SOL
  曲線への正味入力: 0.494 SOL
  曲線出力: 約 494 STEP
  スリッページマージン: 1%、約 489 STEP を取得します

最終出力: 約 489 STEP
```

ルーターは以下を検証します：

```
489 >= minimum_amount_out  // 呼び出し元によって指定
```

false の場合、ルート全体がアトミックに失敗します。

## 精度に関する考慮事項

すべての Solana プログラムと同様に、ルーターは整数演算を使用します：

* すべての金額は `u64`（ラムポートまたはトークンの最小単位）です。
* 曲線計算はオーバーフロー回避のために必要な場所で `u128` 仲介を使用します。
* 丸め規則は子プログラムに依存します。ルーターは再丸めしません。

ホップが極端な価格比率（例：1B:1 プールで 1 ラムポートをスワップ）のため 0 金額を生成する場合、ルーターはそれを次のホップに伝播し、次のホップは不十分なものとして拒否する可能性があります。個別プールのエラーコードを参照してください。

## 次に行くべき場所

* [`products/amm-v4/math`](/ja/products/amm-v4/math) — 定積数学。
* [`products/cpmm/math`](/ja/products/cpmm/math) — Token-2022 を使用した CPMM 定積。
* [`algorithms/clmm-math`](/ja/algorithms/clmm-math) — 集中流動性価格設定。
* [`products/stable/math`](/ja/products/stable/math) — 安定スワップ曲線。
* [`products/routing/code-demos`](/ja/products/routing/code-demos) — ルーティング前の引用例。
