跳轉到主要內容

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、金庫、授權方),並額外需要一個 ModelDataInfo 帳戶來儲存查詢表。本頁涵蓋兩者。

清冊

Stable AMM 池與恰好一個 OpenBook 市場綁定。完整清冊與 AMM v4 結構相似:
類別帳戶擁有者角色
AmmInfoStable 程式池狀態、金庫、OpenBook 與模型資料帳戶的參考。
amm_authorityStable 程式程式擁有的 PDA,簽署金庫移動。在所有 Stable AMM 池中共用。
amm_open_ordersOpenBook池的 OpenBook OpenOrders 帳戶。
amm_target_ordersStable 程式池端限價單網格。
pool_coin_token_accountSPL Token池的 coin 端金庫。
pool_pc_token_accountSPL Token池的 pc 端金庫。
lp_mintSPL Token可替代 LP 代幣。
模型model_data_accountStable 程式查詢表:50,000 × DataElement。
市場serum_marketOpenBookOpenBook 市場。
市場serum_bidsserum_asksOpenBook買價/賣價佇列。
市場serum_event_queueOpenBook事件佇列。
市場serum_coin_vaultserum_pc_vaultSPL TokenOpenBook 市場級金庫。
市場serum_vault_signerOpenBook市場級金庫簽署者。

AmmInfo

根狀態帳戶。佈局幾乎與 AMM v4 相同——池參數、小數位、手續費、金庫/代幣參考——並增加一個 model_data_key 欄位指向查詢表。
// 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 ——池的金庫。
  • 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)
}
填入表時,管理員需指定這些已經過縮放的值。程式不在鏈上驗證排序順序(為了速度),所以排序不當會導致報價不正確。

授權方與金庫

與 AMM v4 相同:
  • amm_authority 是以 ["amm authority"] 種子衍生的單一程式範圍 PDA。它擁有所有池金庫並簽署其移動。
  • 金庫是 SPL Token 帳戶,其擁有者是 amm_authority,而非 ATA。
不支援 Token-2022。

狀態位掩碼

與 AMM v4 相同。控制 swap/deposit/withdraw/crank 是否啟用。

手續費與 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)。規範池標識透過以下方式衍生:
ammId = createWithSeed(
  owner: ammAuthority,
  seed: marketPubkey.toBase58().slice(0, 32),
  programId: STABLE_PROGRAM_ID,
)
金庫、LP 代幣、目標單等也類似。實務上,使用 SDK 或 API 取得預先計算的位址。

各部分閱讀指南

來源: