跳转到主要内容
本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
Stable AMM 是独立的程序;其池端账户结构类似于 AMM v4(AmmInfo、金库、权限),并额外包含一个存储查找表的 ModelDataInfo 账户。本页涵盖两者。

清单

纯 AMM。 Stable AMM 在自己的金库中持有所有流动性,不依赖 OpenBook。它在早期生命周期中曾有 OpenBook 做市路径,但该路径已多年处于休眠状态,2026-06-22 升级移除了遗留代码。因此下面的 serum_* 市场账户和 amm_open_orders遗留的:它们可能仍会出现在旧布局交易中以保持向后兼容性,但程序不验证或读取它们,新布局指令完全省略它们。
活跃清单现在完全是池端的:
类别账户所有者角色
AmmInfoStable 程序池状态,对金库和模型数据账户的引用。
amm_authorityStable 程序程序拥有的 PDA,签署金库操作。在所有 Stable AMM 池中共享。
amm_target_ordersStable 程序池端网格账户(保留在布局中;不再驱动 OpenBook 订单)。
pool_coin_token_accountSPL Token池的币端金库。
pool_pc_token_accountSPL Token池的 pc 端金库。
lp_mintSPL Token可互换的 LP 铸币。
模型model_data_accountStable 程序查找表:50,000 × DataElement。
遗留amm_open_ordersOpenBook池的旧 OpenBook OpenOrders 账户。未使用。
遗留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,            // legacy: OpenBook OpenOrders (unused post-decoupling)
    pub serum_market: Pubkey,           // legacy: unused post-decoupling
    pub serum_program: Pubkey,          // legacy: unused post-decoupling
    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
}
生命周期: 构建这些表的设置指令——InitModelData(创建账户)和 UpdateModelData(填充元素,设置 valid_data_count)——在 2026-06-22 升级中被移除。现有池上的表现在是固定的。在运行时,剩余的可调用指令仍然使用它们:
  • 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 跟踪

out_put 结构跟踪:
  • need_take_pnl_coinneed_take_pnl_pc — 已累积但尚未清扫的协议费。WithdrawPnl 将这些移出。
  • swap_coin_in_amountswap_pc_in_amount 等 — 分析计数器。
池资产计算(解耦后)。 因为不再有资金作为 OpenBook 未平仓订单托管,池的总资产现在完全从金库计算:
旧:总资产 = 金库余额 + 未平仓订单资金(native_coin_total / native_pc_total)− 待处理 PnL(need_take_pnl)
新:总资产 = 金库余额 − 待处理 PnL(need_take_pnl)
从 OpenOrders 余额重建池价值的索引器和报价代码必须删除该项。

账户大小

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 来获取预计算的地址。

在哪里阅读什么

来源: