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

# Constant-product AMM

> x·y=k 不変量、リザーブベースの価格設定、スリッページの導出、および Raydium CPMM と AMM v4 で使用されるフィーハンドリングのバリエーション。これは、Raydium のすべての x·y=k プロダクトが参照する数学の基準ページです。

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

  [英語版を表示 →](/algorithms/constant-product)
</Info>

## 不変量

Constant-product マーケットメーカー（CPMM）は 2 つのリザーブ `x` と `y` を保有し、以下を強制します：

```
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_before` と `effective` の間のスプレッドは**スリッページ**です。オンチェーンの `slippage` UI は通常 `(effective − p_before) / p_before` として表現されます。SDK の `computeAmountOut` がこの理由で `amountOut` と `priceImpact` の両方を返します。

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

スワップ後、プロトコルは再度確認します：

```
k' = x' · y'  ≥  k  =  x · y
```

違反はプログラムバグか算術オーバーフローです。Raydium のスワップ命令は、このチェックを事後条件として明示的に行います：

```rust theme={null}
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_rate`、`fund_fee_rate`、`creator_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`](/ja/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_share` は `state_data.need_take_pnl_*` に蓄積し、リザーブから除外されます。`lp_share` はボールトに留まります。[`products/amm-v4/fees`](/ja/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_000`（`x` の 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 曲線の最悪ケース上限です。トレードフィーと数式の反転がそれを下げます）。

## ポインター

* [`products/cpmm/math`](/ja/products/cpmm/math) — CPMM の特定の丸め + フィーデノミネーター選択。
* [`products/amm-v4/math`](/ja/products/amm-v4/math) — AMM v4 の OpenBook 統合リザーブがこのモデルを拡張する方法。
* [`algorithms/slippage-and-price-impact`](/ja/algorithms/slippage-and-price-impact) — UI のスリッページ許容度サイズに関する専用ページ。

ソース：

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