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

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

不変量

Constant-product マーケットメーカー(CPMM)は 2 つのリザーブ xy を保有し、以下を強制します:
x · y ≥ k       (すべてのトレード後)
ここで k はトレード前のリザーブの積です。フィーなしのマーケットの場合、x · y = k は正確です。フィーがある場合、k は厳密に増加します(フィーの LP シェアはリザーブに保持されます)。 この不変量は意図的に幾何学的です:一方のリザーブがいかに小さくなっても、他方は無限に成長してマッチすることを保証します。つまり、プールはどちらの側でもゼロになることはできません。

価格設定

スポット価格

任意の時点での x で表示される y の限界価格は、曲線の接線です:
p = y / x
(導出:x · y = k の暗黙微分により dy/dx = −y/x が得られます。符号を無視すると、|dy/dx| = y/x)。 これはプールが無限小のトレードで提示する価格です。有限のトレードの場合、実現価格は曲線に沿ったスリッページのため悪化します。

正確な入力スワップ(Δx をあげ、Δy を受け取る)

フィーがある場合、f をフィーレート(例:f = 0.0025 は 25 bps)とします。フィーを入力に適用してから、不変量を使用して出力を解きます:
Δx_after_fee = Δx · (1 − f)
Δy           = y · Δx_after_fee / (x + Δx_after_fee)
トレード後のリザーブ:
x' = x + Δx
y' = y − Δy
完全な Δx がリザーブに入ります。LP ポーション のフィーは x' に留まります。プロトコルポーションは別の会計ステップを通じて曲線から除外されます(以下のフィー会計バリエーションを参照)。

正確な出力スワップ(Δy を受け取り、最小限の Δx を払う)

Δx_after_fee = x · Δy / (y − Δy)
Δx           = Δx_after_fee / (1 − f)
Δx は、プールが過度に割引しないことを確認するために切り上げられます。

スリッページと価格への影響

価格への影響 は、トレードの結果としてプールのスポット価格がどのくらい動くかを測定します:
p_before = y / x
p_after  = y' / x' = (y − Δy) / (x + Δx)
impact   = (p_before − p_after) / p_before
小さな Δx / x の場合、1 次展開は次を与えます:
impact ≈ 2 · Δx / x      (フィーを無視)
直感:1% スワップは ~2% の価格への影響を引き起こします。この係数 2 は、CPMM プールが中程度のトレードについて、オーダーブックマーケットと比較して「シン」に見える理由です。現在の最良ビッドに対してのみ買うのではなく、独自の限界価格を上がっているからです。 スワッパーが支払う実効価格
effective = Δx / Δy
p_beforeeffective の間のスプレッドはスリッページです。オンチェーンの slippage UI は通常 (effective − p_before) / p_before として表現されます。SDK の computeAmountOut がこの理由で amountOutpriceImpact の両方を返します。

コード内の不変量チェック

スワップ後、プロトコルは再度確認します:
k' = x' · y'  ≥  k  =  x · y
違反はプログラムバグか算術オーバーフローです。Raydium のスワップ命令は、このチェックを事後条件として明示的に行います:
let k_before = coin_reserve_before as u128 * pc_reserve_before as u128;
let k_after  = coin_reserve_after  as u128 * pc_reserve_after  as u128;
require!(k_after >= k_before, ErrorCode::InvariantViolation);

フィー会計バリエーション

不変量チェックは LP フィーがリザーブに留まることを前提としています。異なる Raydium プロダクトはプロトコル / ファンド / クリエーター コンポーネントを異なる方法で処理します:

CPMM 規約

フィーは 1_000_000 デノミネーターの u64 ベーシスポイント のようなレートです。トレードフィーは trade_fee_rate(合計)に分割され、その後 protocol_fee_ratefund_fee_ratecreator_fee_rate を通じて細分化されます。各スワップで:
trade_fee     = ceil(Δx · trade_fee_rate / 1_000_000)
protocol_fee  = trade_fee · protocol_fee_rate / 1_000_000
fund_fee      = trade_fee · fund_fee_rate     / 1_000_000
creator_fee   = trade_fee · creator_fee_rate  / 1_000_000
lp_fee        = trade_fee − protocol_fee − fund_fee − creator_fee
3 つの非 LP シェアは別のカウンター(protocol_fees_*fund_fees_*creator_fees_*)に蓄積し、不変量に使用されるリザーブから除外されます。これはフィーを曲線を動かさずにスイープできる方法です。products/cpmm/feesを参照してください。

AMM v4 規約

フィーは 10_000 デノミネーター上の numerator / denominator 比率です。スプリットはプール作成時に固定され、AmmInfo.fees に格納されます:
swap_fee  = ceil(Δx · swap_fee_numerator / swap_fee_denominator)    // 例:0.25%
pnl_share = swap_fee · pnl_numerator / swap_fee_numerator            // 例:0.03 / 0.25 = 12%
lp_share  = swap_fee − pnl_share                                     // ボリュームの 0.22%
pnl_sharestate_data.need_take_pnl_* に蓄積し、リザーブから除外されます。lp_share はボールトに留まります。products/amm-v4/feesを参照してください。 両方の規約は同じ方法で不変量を保持します。違いは化粧的です(デノミネーター + サブカテゴリー数)。

丸めルール

  • フィー計算は切り上げます。 プールがフィーで過度に割引しないことを確認します。
  • 出力額は切り下げます。 不変量が厳密に成り立つことを確認します(フィーが追加される前でも k' > k)。
  • 正確な出力入力額は切り上げます。 ユーザーが過度に支払わないことを確認します。
すべての算術は、大きなリザーブでのオーバーフローを避けるために、x · Δx 積に u128 を使用します。最終結果は飽和チェック付きで u64 にキャストされます。

エッジケース

空のプール

最初の Deposit の前に、x = y = 0。スワップ命令は事前デポジットを拒否します。

ゼロ出力

Δx が十分に小さいため、切り下げられた Δy が 0 の場合、命令は ZeroTradingTokens で戻ります。これは支払いなしで価値を抽出することを防ぎます。また、バランスの悪いプール上のダストスワップが失敗することを意味します。

ダスト LP

最初の Deposit には特別な処理があります。初期 LP サプライを sqrt(x · y) として計算し、小さな「初期化バーン」量(通常は 100 LP ユニット)をバーンして、「最初のデポジター インフレーション攻撃」を防ぎます(攻撃者がボールトに寄付して LP トークン価値をインフレさせる場所)。その後のデポジットは比例数学を使用します。

アービトレージとの関係

CPMM プールの価格は以下を通じてのみ変化します:
  1. プール自体を通じたトレード(ユーザーが曲線を歩く)。
  2. 寄付(スワップなしにボールトにトークンを送信)。
トレードは曲線により決定的に価格を動かすため、プールの価格が広大なマーケット価格から逸脱するプールは、アービトレージ機会を作成します。アービトレージャーはプール価格をマーケット価格に向けて期待を取り戻します。これが CPMM プールが「オラクルなしで価格を提示する」と言われる理由です。プールはそれを外部で読むのではなく、マーケットはアービトレージを通じて価格を見つけます。 その反面:プール自体はアービトレージャーのカウンターパーティであるため、アービトレージ利益は LP 無常損失です(マイナス LP がキャプチャするフィー)。

計算例

例 1 — 小規模トレード、スリッページは無視できる

プール:x = 1_000_000, y = 2_000_000, k = 2·10^12。フィー f = 0.0025 トレード Δx = 1_000
Δx_after_fee = 1000 · 0.9975  = 997.5
Δy           = 2_000_000 · 997.5 / (1_000_000 + 997.5)
             = 1_995_000_000 / 1_000_997.5
             ≈ 1_993.01
実効価格:1000 / 1993.01 ≈ 0.5018。前のスポット:0.5。影響:~0.36%。

例 2 — 中規模トレード、目に見えるスリッページ

同じプール、Δx = 100_000x の 10%):
Δx_after_fee = 100_000 · 0.9975 = 99_750
Δy           = 2_000_000 · 99_750 / (1_000_000 + 99_750)
             = 199_500_000_000 / 1_099_750
             ≈ 181_405
実効:100_000 / 181_405 ≈ 0.5513。影響:~10.3% — 2 · 10% = 20% の経験則のおおよそ半分(その経験則はフィーなしの constant-product 曲線の最悪ケース上限です。トレードフィーと数式の反転がそれを下げます)。

ポインター

ソース:
  • Uniswap v2 ホワイトペーパー — x · y = k の標準的なステートメント。
  • Raydium CPMM プログラムソース。
  • Raydium AMM v4 プログラムソース。