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

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 による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →
Stable AMM は AMM v4 のプール側アカウント構造(AmmInfo、vault、authority)を共有しており、さらに参照テーブルを格納する ModelDataInfo アカウントが必要です。このページでは両方をカバーしています。

インベントリ

Stable AMM プールは正確に 1 つの OpenBook マーケットにバインドされます。完全なインベントリは AMM v4 と大きく似ています。
カテゴリアカウント所有者役割
プールAmmInfoStable プログラムプール状態、vault、OpenBook、およびモデルデータアカウントへの参照。
プールamm_authorityStable プログラムvault の移動に署名するプログラム所有 PDA。すべての Stable AMM プール間で共有。
プールamm_open_ordersOpenBookプールの OpenBook OpenOrders アカウント。
プールamm_target_ordersStable プログラムリミットオーダー用のプール側グリッド。
プールpool_coin_token_accountSPL Tokenプールのコイン側 vault。
プールpool_pc_token_accountSPL Tokenプール側の pc-side vault。
プールlp_mintSPL TokenFungible LP ミント。
モデルmodel_data_accountStable プログラム参照テーブル:50,000 × DataElement。
マーケットserum_marketOpenBookOpenBook マーケット。
マーケットserum_bidsserum_asksOpenBookビッド/アスク キュー。
マーケットserum_event_queueOpenBookイベント キュー。
マーケットserum_coin_vaultserum_pc_vaultSPL TokenOpenBook マーケットレベル vault。
マーケットserum_vault_signerOpenBookマーケットレベル vault 署名者。

AmmInfo

ルート状態アカウント。レイアウトは AMM v4 とほぼ同じです。プールパラメータ、デシマル、フィー、vault/ミント参照に加えて、参照テーブルを指す model_data_key フィールドが 1 つあります。
// raydium-stable/program/src/state.rs (abridged)
pub struct AmmInfo {
    pub account_type: u64,              // = 0 (AmmAccount)
    pub status: u64,                    // bitmask: swap/deposit/withdraw/crank enabled
    pub nonce: u64,                     // bump for amm_authority
    pub order_num: u64,
    pub depth: u64,
    pub coin_decimals: u64,
    pub pc_decimals: u64,
    pub state: u64,                     // state machine (IdleState, etc.)
    pub reset_flag: u64,
    pub min_size: u64,
    pub vol_max_cut_ratio: u64,
    pub amount_wave: u64,
    pub coin_lot_size: u64,             // mirrors OpenBook
    pub pc_lot_size: u64,
    pub min_price_multiplier: u64,
    pub max_price_multiplier: u64,
    pub sys_decimal_value: u64,
    pub abort_trade_factor: u64,
    pub price_tick_multiplier: u64,
    pub price_tick: u64,
    
    pub fees: Fees,                     // see below
    pub out_put: OutPutData,            // PnL, swaps, punish amounts
    
    pub coin_vault: Pubkey,
    pub pc_vault: Pubkey,
    pub coin_mint: Pubkey,
    pub pc_mint: Pubkey,
    pub lp_mint: Pubkey,
    pub model_data_key: Pubkey,         // ← THE LOOKUP TABLE
    pub open_orders: Pubkey,            // OpenBook OpenOrders
    pub serum_market: Pubkey,
    pub serum_program: Pubkey,
    pub target_orders: Pubkey,
    pub amm_admin: Pubkey,              // admin key
    pub client_order_id: u64,
    pub lp_amount: u64,                 // LP supply
    pub lp_net: u64,                    // LP value metric
    pub padding: [u64; 61],
}

pub struct Fees {
    pub min_separate_numerator: u64,
    pub min_separate_denominator: u64,
    pub trade_fee_numerator: u64,       // 25
    pub trade_fee_denominator: u64,     // 10_000 → 0.25%
    pub pnl_numerator: u64,             // 12
    pub pnl_denominator: u64,           // 100 → 12% of fee = 0.03% of volume
    pub swap_fee_numerator: u64,        // 25
    pub swap_fee_denominator: u64,      // 10_000
}

pub struct OutPutData {
    pub need_take_pnl_coin: u64,        // accrued protocol fee (coin)
    pub need_take_pnl_pc: u64,          // accrued protocol fee (pc)
    pub total_pnl_pc: u64,
    pub total_pnl_coin: u64,
    pub pool_open_time: u64,
    pub punish_pc_amount: u64,
    pub punish_coin_amount: u64,
    pub orderbook_to_init_time: u64,
    pub swap_coin_in_amount: u128,
    pub swap_pc_out_amount: u128,
    pub swap_pc_in_amount: u128,
    pub swap_coin_out_amount: u128,
    pub swap_pc_fee: u64,
    pub swap_coin_fee: u64,
}
統合者にとって重要なフィールド:
  • model_data_key — 参照テーブルのアドレス。すべての命令に渡す必要があります。
  • fees — AMM v4 と同じ構造。デフォルトは 0.25% のトレード手数料で、0.22% LP / 0.03% プロトコル分割。
  • coin_vaultpc_vault — プール vault。
  • status — swap/deposit/withdraw/crank を制御するビットマスク。
  • out_put.need_take_pnl_*WithdrawPnl によってスイープされます。

ModelDataInfo

参照テーブル。価格/数量ポイントの大規模なスパース配列。
// raydium-stable/program/src/state.rs
pub const ELEMENT_SIZE: usize = 50000;

pub struct DataElement {
    pub x: u64,         // table X (e.g., coin amount)
    pub y: u64,         // table Y (e.g., pc amount)
    pub price: u64,     // price at (x, y)
}

pub struct ModelDataInfo {
    pub account_type: u64,              // = 2 (ModleDataAccount)
    pub status: u64,                    // Initialized or Uninitialized
    pub multiplier: u64,                // scale factor for x, y (e.g., 10^6)
    pub valid_data_count: u64,          // how many elements are populated
    pub elements: [DataElement; 50000], // the table itself
}
ライフサイクル:
  1. InitModelData がアカウントを作成し、status = Initializedmultiplier = <admin-provided>valid_data_count = 0 を設定します。
  2. UpdateModelData (トランザクションごとに最大 5 回呼び出される)は、次の方法でエレメントをポピュレートします。
    • 入力:(index: u64, DataElement) ペアの配列。
    • 各を elements[index] に書き込みます。
    • index >= valid_data_count の場合、valid_data_count をインクリメントします。
  3. Swap/deposit/withdraw は、elements[0..valid_data_count] 内でバイナリサーチと補間を行う参照関数を呼び出します。

DataElement

テーブルのアトミックなエントリ。バイナリサーチが機能するために、ソートされている必要があります(x 昇順、y 降順、price 昇順)。
pub struct DataElement {
    pub x: u64,         // X coordinate (e.g., token_a balance, scaled by multiplier)
    pub y: u64,         // Y coordinate (e.g., token_b balance, scaled by multiplier)
    pub price: u64,     // price (x/y in scaled form, scaled by multiplier)
}
テーブルをポピュレートするとき、管理者はこれらを事前スケールで指定します。プログラムはオンチェーンでソート順序を検証しません(速度のため)。不正なソートは不正な見積もりを引き起こします。

Authority と vault

AMM v4 と同じです。
  • amm_authority は、シード ["amm authority"] で派生した単一のプログラム全体 PDA です。すべてのプール vault を所有し、その移動に署名します。
  • Vault は所有者が amm_authority である SPL Token アカウントで、ATA ではありません。
Token-2022 はサポートされていません

Status ビットマスク

AMM v4 と同じです。swap/deposit/withdraw/crank を有効にするかどうかを制御します。

Fee と PnL 追跡

AMM v4 と同じです。out_put 構造体は以下を追跡します。
  • need_take_pnl_coinneed_take_pnl_pc — 発生したがまだスイープされていないプロトコル手数料。WithdrawPnl はこれらを移動させます。
  • swap_coin_in_amountswap_pc_in_amount など — 分析カウンター。

アカウント サイズ

ModelDataInfo は大きい (~1.2 MB、50,000 エレメント × エレメントあたり 24 バイト)。これが Stable プールの作成に明示的なレント とアカウント事前割り当てが必要な理由です。Raydium SDK とツールはこれを透過的に処理します。統合者は手動でアロケートする必要がほとんどありません。

アカウントをゼロから派生させる

AMM v4 と同様に、Stable AMM はシード付きキー(純粋な PDA ではない)を使用します。正規のプール ID は次を介して派生します。
ammId = createWithSeed(
  owner: ammAuthority,
  seed: marketPubkey.toBase58().slice(0, 32),
  programId: STABLE_PROGRAM_ID,
)
vault、LP ミント、ターゲットオーダーなども同様です。実際には、SDK または API を使用して事前計算されたアドレスをフェッチします。

何をどこで読むか

ソース: