メインコンテンツへスキップ
このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →

不変式

プールは coin_reserve × pc_reserve = k を維持します。ここで(2026-07 OpenBook 削除後):
注目すべき点は 2 つです:
  1. リザーブは現在 ボールトのみ です。過去のオープンオーダー項(プールが OpenBook リミットオーダーとしてエスクローしていたトークン)は削除されました。削除前からずっと実質的にはゼロでした。オンチェーンのボールト残高から直接 k を計算できます。
  2. PnL 累積(need_take_pnl_*)が差し引かれるため、管理者がフィーを回収する際に曲線が保存されます。CPMM の protocol_fees_* 除外と同じ原理です。
プログラムはこれを calc_total_without_take_pnl_no_orderbook で計算します(古いオーダーブック対応バージョンは削除されました)。 すべての Swap* 操作は、LP のフィー分をリザーブに戻した後、k' ≥ k を強制します。

フィー規約

AMM v4 は CPMM / CLMM の 1/1_000_000 規約ではなく、比率フィー(分子/分母ペア)を使用します。オンチェーンの Fees 構造体(プログラムソースの Fees::initialize を参照)のデフォルトは:
解釈(公開メインネットデフォルト):
  • 総スワップフィー: swap_fee = amount_in × 25 / 10_000 = 0.25%(総入力の)。
  • プロトコル分: pnl_numerator / pnl_denominator = 12 / 100 = 12% スワップフィーの、つまり 0.25% × 12% = 0.03%(ボリュームの)。この分は PnL カウンターに累積され、WithdrawPnl で回収されます。
  • LP 分: スワップフィーの残り 88%、つまり 0.25% × 88% = 0.22%(ボリュームの)。プール内に留まり、k を増加させます。
  • ファンド分なし。 AMM v4 には CPMM/CLMM のファンドフィー分割がありません。
pnl_numerator / pnl_denominator は取引ボリュームではなく フィーの 分数であることに注意してください。これらのフィールド名の一般的な誤読です。 trade_fee_numerator / trade_fee_denominator(同じく 25 / 10_000)は、OpenBook 統合が AMM のリミットオーダーグリッドのフィー込み価格を計算する際に歴史的に使用されていました。OpenBook コードが削除されたため、このフィールドは遺物です。アクティブなスワップフィーは swap_fee_* です。 これらのデフォルトからの逸脱は稀ですが、いくつかのレガシープールに存在します。見積もりを提示する前に、常に AmmInfo.fees からフィーを読み取ってください。

直接スワップ数学(AMM パス)

最も単純なケース:ユーザーが OpenBook と相互作用せずにプールのボールトに対してスワップします。プールの内部リザーブ(オンブック配置を含む)が分母です。 SwapBaseIn(正確な入力):
ここで使用されるリザーブはボールト残高(累積 PnL を差し引いたもの)です。歴史的には、この式は AMM が OpenBook オーダーにロックしていたトークンも追加していました。その項は削除されました — 有効なリザーブは現在、生のボールト残高から保留中の PnL を差し引いたものに等しくなります。OpenBook 側をリフレッシュするために使用されていた MonitorStep / 暗黙的決済パスは削除されました。 SwapBaseOut(正確な出力):

オーダーブック相互作用(歴史的)

削除されました。 このセクションで説明されているグリッド構築は、AMM v4 が元々曲線を OpenBook マーケットにミラーリングした方法を反映しています。OpenBook 統合(MonitorStep クランクと build_orders グリッドロジックを含む)は プログラムから削除されました(2026-07 アップグレード)。以下の数学は、オンチェーンの target_orders / amm_open_orders アカウントがかつてサイズ設定されていた内容の歴史的文脈として保存されています。
ユーザースワップとは別に、AMM v4 は歴史的に OpenBook マーケットに グリッド のリミットオーダーを配置していました。グリッドは AmmInfo パラメータから計算されました:
  • depth — 片側あたりの価格レベル数。
  • amount_wave — レベルあたりのサイズの基本単位。
  • min_sizecoin_lot_sizepc_lot_size — OpenBook マーケット制約。
  • state_data.swap_acc_coin_feeswap_acc_pc_fee — 最後の TakePnl 以降の累積フィーカウンター。
プログラムは現在の曲線価格から一定比率ステップで歩を進めることで、レベルごとの価格を導出します:
正確な価格とサイズは build_orders で計算された target_orders によって決定され、各 MonitorStepamm_open_orders と比較されます。相違があれば、キャンセルと新規ポストが発生します。OpenBook で新たに約定したオーダーは、OpenBook 側をリフレッシュする次の操作でプールボールトに決済されます。 インテグレーターがグリッドを計算する必要はめったにありません(Raydium キーパーがそれを維持します)が、以下を知ることは有用です:
  • 重要な オンブック リクイディティを持つプールは、そのリクイディティが k に貢献し、アイドル状態ではありません。
  • 古い OpenBook マーケット(イベントキューが満杯、クランクがブロック)はグリッド更新を防ぎます。その後、AMM は次のクランクまで、見えるオーダーブックから逸脱した価格を引用できます。

決済ステップ(PnL)

0.03% プロトコル分は state_data.need_take_pnl_coinstate_data.need_take_pnl_pc に累積されます。TakePnl はこれらの金額をボールトから管理者指定の宛先に移動し、カウンターをゼロにします。 重要な性質:不変式のリザーブは常に 累積 PnL を差し引いて 計算されるため、TakePnl は曲線を移動させません。これは CPMM 規約と一致します。

実例

プール状態:
  • coin_reserve = 1_000_000_000_000(1,000,000 コイン側;6 デシマル)
  • pc_reserve = 2_000_000_000_000(2,000,000 pc 側;6 デシマル)
  • フィー:デフォルト swap = 25/10_000pnl = 3/10_000
ユーザー:SwapBaseIn 正確入力 1_000_000_000 コイン(1,000 コイン)。
LP 分(2_200_000)はどこにも分割されません — それは単に k' を上昇させる残差です。

精度ルール

  • リザーブ乗算は u128 を使用;最終除算はゼロ方向に丸めます。
  • swap_fee は切り上げ(プールが過少請求しないように)。
  • SwapBaseOutamount_in は切り上げ(ユーザーが過少支払いしないように)。
  • 極端なリザーブ比率を持つプールは非常に小さい入力で ZeroTradingTokens に当たる可能性があります。CPMM と同じ規約です。

CPMM との制限事項

  • AMM v4 のリザーブはボールトのみなので、ボールト残高(need_take_pnl_* を差し引いたもの)から直接見積もることが できます — AMM がロックしていた open_orders.free / open_orders.locked 金額を追加する以前の要件はもはや適用されません。SDK / API 見積もりが最も簡単なオプションのままです。
  • AMM v4 は構造化されたオンチェーン TWAP を公開していません。AMM v4 バックアップ価格を必要とする外部コンシューマーは、トレードログから自分で計算する必要があります。
  • Token-2022 はサポートされていません。

次のステップ

ソース: