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

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 による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →

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

ルーティングプログラムは価格設定ロジックを実装していません。これは純粋なオーケストレーター(調整役)です。ルートを受け付け、アカウントを子プログラムに渡し、トークンフローをチェーンします。 各ホップはそれぞれのプールプログラムの曲線で価格設定されます:
  • AMM v4 ホップ: 定積公式(x · y = k)と OpenBook ハイブリッド価格設定を使用します。products/amm-v4/math を参照してください。
  • CPMM ホップ: 定積公式と設定可能な手数料階層を使用します。products/cpmm/math を参照してください。
  • CLMM ホップ: 集中流動性ティック数学を使用します。algorithms/clmm-math を参照してください。
  • Stable ホップ: 類似資産の安定スワップ曲線を使用します。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 を参照してください。
  • ルーターは以下を強制します:
  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 からの出力には、そのホップの手数料がすでに差し引かれています。 個別プールの手数料ドキュメントを参照してください:

マルチホップ計算例

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 金額を生成する場合、ルーターはそれを次のホップに伝播し、次のホップは不十分なものとして拒否する可能性があります。個別プールのエラーコードを参照してください。

次に行くべき場所