このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →
ルックアップテーブル曲線
Stable AMM は、式 x·y=k をスパースなルックアップテーブル(x、y、price のタプル)に置き換えます。スワップの価格設定時、プログラムは以下を実行します:- リザーブから現在のプール比率を計算します。
- 二分探索でテーブルを検索し、その比率をブラケットする 2 つのエントリを見つけます。
- 線形補間でそれらの間の中間価格を取得します。
- フィーを適用して見積もりを返します。
テーブルレイアウトと二分探索
ModelDataInfo は最大 50,000 個の DataElement エントリを保持し、管理者によってインデックス付けされます。最初の valid_data_count のみがアクティブです。各エントリ:
- 比率を計算します:
target_ratio = (x_real * multiplier) / y_real。 (element.x * multiplier) / element.yがtarget_ratioをブラケットするエントリを二分探索します。- ブラケット
[min_idx, max_idx]が見つかったら、補間します。
state.rs::ModelDataInfo::get_mininum_range_by_xy_real で約 150 行にわたります。重要な不変量:エントリはソート済み(x 昇順、y 降順、price 昇順)である必要があります。
線形補間
2 つのテーブルポイントが比率をブラケットしたら、補間は中間価格とリザーブペアを計算します:スケーリング:乗数
プールリザーブと価格は異なるスケールで保存されます。ModelDataInfo の multiplier フィールドがこれを考慮します。一般的なパターン:
- コインは 6 デシマル、PC は 18 デシマル。
- 乗数 = 10^6(またはそれに類するもの)。
- テーブルエントリは u64 の境界に収まるように縮小スケールで保存されます。
スワップ価格設定:SwapBaseIn と SwapBaseOut
SwapBaseIn(正確な入力)
入力額amount_in が与えられた場合:
(coin_vault, pc_vault)から現在の比率を取得します。- ブラケットするテーブルエントリを見つけて補間し、テーブル空間の比率を取得します。
- 入力をテーブル空間に変換します:
dx_table = amount_in * multiplier / ratio。 - 新しい X 座標でテーブルをクエリして新しい Y を見つけます。
dy_table = y_old - y_new。- 変換し直します:
dy_real = dy_table * ratio / multiplier。 - トレードフィーを適用します:
dy_output = dy_real - (dy_real * trade_fee_numerator / trade_fee_denominator)。 dy_outputを返します。
SwapBaseOut(正確な出力)
対称:目的のamount_out が与えられた場合、必要な amount_in を解きます。
両方のパスは、プールボルトから直接有効リザーブを読み取ります。プールは数年間 OpenBook オープンオーダーを保持していないため、最初に決済するものはありません。ボルト残高がすべてです。(2026-06-22 アップグレードは残りのマーケットコードを削除しました。)
フィー適用
AMM v4 と同一です。完全な導出についてはproducts/amm-v4/math を参照してください。
pnl_portion は need_take_pnl_* に移動し、管理者が WithdrawPnl で回収します。lp_portion はボルトに留まり、k を増加させ、LP トークンホルダーに利益をもたらします。
プール資産会計
この式は、歴史的にプールが OpenBook OpenOrders アカウントにオープンオーダーとして保有していた資金を追加していました。プールが注文の投稿を停止してから実際にはゼロになっており、2026-06-22 アップグレードはこれを式から完全に削除し、ボルトのみの計算を残しました:need_take_pnl 部分は物理的にボルトに存在しますが、価格設定から除外されます)。以前 OpenOrders 残高を読み取っていた見積もりコードとインデクサーはそのタームを削除する必要があります。
MonitorStep(削除)
MonitorStep は、保留中の OpenBook フィルを決済し、AmmInfo.target_orders を再計算し、ルックアップテーブルから導出された指値注文グリッドを再投稿するクランク命令でした。プールは数年前に OpenBook への注文投稿を停止したため、クランクには何もすることがなくなりました。2026-06-22 アップグレードで削除されました。インテグレーターは Stable プールをクランクする必要はありません。
概要:これが機能する理由
ルックアップテーブル + 補間設計は効率的で柔軟です:- 効率性: 二分探索は O(log 50,000) ≈ 16 イテレーション、各 ~ 300–500 CU。補間は数回の乗算・除算。総見積もりコストは ~5k–15k CU で、スワップごとに式を再計算するより大幅に安価です。
- 柔軟性: 管理者は任意の区分線形曲線をエンコードできます。ステーブルコインペアは 1:1 の周辺で高密度を取得します。担保付きペアはカスタム曲線を取得します。
- 自己完結型流動性: すべての資金はプールボルトに存在し、価格設定はそれらを直接読み取ります。クランク、外部オーダーブック、トランザクションあたりのアカウント数が少なくなります。
raydium-stable/program/src/state.rs のメソッド get_data_by_x、get_data_by_y、get_dy_by_dx_base_in などを参照してください。
次のステップ
- アカウント —
ModelDataInfoとDataElementフィールドリファレンス。 - 命令 — 呼び出し可能なセット(スワップ、デポジット、ウィズドロー、
WithdrawPnl)と削除された命令。 - フィー — フィー適用と
WithdrawPnl。 products/amm-v4/math— OpenBook フィー包含注文価格設定ロジック用。
raydium-stable/program/src/state.rs(補間と二分探索の実装)raydium-stable/program/src/math.rs(計算機ユーティリティ)

