跳转到主要内容

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 池绑定到恰好一个 OpenBook 市场。完整的账户清单与 AMM v4 相似:
类别账户所有者用途
AmmInfoStable 程序池状态、vault、OpenBook 和模型数据账户的引用。
amm_authorityStable 程序程序拥有的 PDA,对 vault 转账进行签名。在所有 Stable AMM 池间共享。
amm_open_ordersOpenBook池的 OpenBook OpenOrders 账户。
amm_target_ordersStable 程序池侧限价订单网格。
pool_coin_token_accountSPL Token池的 coin 侧 vault。
pool_pc_token_accountSPL Token池的 pc 侧 vault。
lp_mintSPL Token可替换 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/mint 引用——多了一个字段:指向查找表的 model_data_key 字段。
// raydium-stable/program/src/state.rs (简化版)
pub struct AmmInfo {
    pub account_type: u64,              // = 0 (AmmAccount)
    pub status: u64,                    // 位掩码:swap/deposit/withdraw/crank 启用状态
    pub nonce: u64,                     // amm_authority 的 bump
    pub order_num: u64,
    pub depth: u64,
    pub coin_decimals: u64,
    pub pc_decimals: u64,
    pub state: u64,                     // 状态机 (IdleState 等)
    pub reset_flag: u64,
    pub min_size: u64,
    pub vol_max_cut_ratio: u64,
    pub amount_wave: u64,
    pub coin_lot_size: u64,             // 镜像 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,                     // 见下方
    pub out_put: OutPutData,            // 损益、交换、惩罚金额
    
    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,         // ← 查找表
    pub open_orders: Pubkey,            // OpenBook OpenOrders
    pub serum_market: Pubkey,
    pub serum_program: Pubkey,
    pub target_orders: Pubkey,
    pub amm_admin: Pubkey,              // 管理员密钥
    pub client_order_id: u64,
    pub lp_amount: u64,                 // LP 供应量
    pub lp_net: u64,                    // LP 价值指标
    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% = 交易量的 0.03%
    pub swap_fee_numerator: u64,        // 25
    pub swap_fee_denominator: u64,      // 10_000
}

pub struct OutPutData {
    pub need_take_pnl_coin: u64,        // 累计协议费 (coin)
    pub need_take_pnl_pc: u64,          // 累计协议费 (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,         // 表格 X (例如,coin 数量)
    pub y: u64,         // 表格 Y (例如,pc 数量)
    pub price: u64,     // (x, y) 处的价格
}

pub struct ModelDataInfo {
    pub account_type: u64,              // = 2 (ModleDataAccount)
    pub status: u64,                    // Initialized 或 Uninitialized
    pub multiplier: u64,                // x、y 的缩放因子 (例如 10^6)
    pub valid_data_count: u64,          // 有多少个元素被填充
    pub elements: [DataElement; 50000], // 表格本身
}
生命周期:
  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 降序、价格升序),以便二分查找正确工作。
pub struct DataElement {
    pub x: u64,         // X 坐标 (例如,token_a 余额,按 multiplier 缩放)
    pub y: u64,         // Y 坐标 (例如,token_b 余额,按 multiplier 缩放)
    pub price: u64,     // 价格 (缩放后的 x/y,按 multiplier 缩放)
}
填充表格时,管理员指定这些预缩放值。程序不在链上验证排序顺序(出于性能考虑),所以排序错误会导致报价不正确。

Authority 和 vault

与 AMM v4 相同:
  • amm_authority 是一个程序级 PDA,使用种子 ["amm authority"] 派生。它拥有所有池 vault 并对其转账进行签名。
  • Vault 是 SPL Token 账户,其所有者是 amm_authority,而非 ATA。
不支持 Token-2022。

Status 位掩码

与 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 池需要显式的 rent 和账户预分配。Raydium SDK 和工具以透明的方式处理这一点;集成者很少需要手动分配。

从头派生账户

与 AMM v4 一样,Stable AMM 使用有种子的密钥(不是纯 PDA)。规范的池标识通过以下方式派生:
ammId = createWithSeed(
  owner: ammAuthority,
  seed: marketPubkey.toBase58().slice(0, 32),
  programId: STABLE_PROGRAM_ID,
)
对于 vault、LP 代币、目标订单等也是如此。实际上,使用 SDK 或 API 获取预先计算的地址。

阅读资源

参考资源: