Stable AMM 是一个独立程序,拥有自己的程序 ID。它不是 AMM v4 程序的一种模式,也不是通过 AMM v4 进行交易 — 它是单独部署、升级和调用的。它仅在费用和账户布局约定上与 AMM v4 相似。
2026-06-22 升级 — 移除已弃用的 OpenBook(市场)代码。 Stable AMM 很久以前就停止向 OpenBook 发布订单;订单簿做市路径已经闲置多年。此升级删除了剩余的市场相关账户和代码 — 它不会改变实时交易行为。对集成者的两个影响:
- 更小的账户布局。
SwapBaseIn / SwapBaseOut(18 → 9)、Deposit(14 → 12)和 Withdraw(21/22 → 12)移除了已弃用的 Serum/市场账户。旧布局仍可解析以保持向后兼容性。WithdrawPnl(16 → 10)是硬性破坏性变更,没有兼容性路径(仅限管理员)。
- 大多数指令已移除。 仅
SwapBaseIn、SwapBaseOut、Deposit、Withdraw 和 WithdrawPnl 保持可调用。所有其他指令不再可调用。
更新日志:reference/changelog。
指令清单
可调用
| 指令 | 类别 | 说明 |
|---|
Deposit | 流动性 | 添加流动性,接收 LP。新的 12 账户布局;旧的 14 账户布局仍兼容。 |
Withdraw | 流动性 | 销毁 LP,接收两种代币。新的 12 账户布局;旧的 21/22 账户布局仍兼容。 |
SwapBaseIn | 交换 | 精确输入交换。新的 9 账户布局;旧的 18 账户布局仍兼容。 |
SwapBaseOut | 交换 | 精确输出交换。新的 9 账户布局;旧的 18 账户布局仍兼容。 |
WithdrawPnl | 管理员 | 提取累积的协议费用。新的 10 账户布局(硬性破坏 — 无旧布局兼容性)。 |
已移除(不再可调用)
这些在 2026-06-22 升级中被移除,不再可调用。参见已移除的指令。
| 指令 | 原类别 | 原用途 |
|---|
Initialize | 生命周期 | 创建池。 |
PreInitialize | 生命周期 | 旧版预分配辅助工具。 |
InitModelData | 模型设置 | 创建并初始化查找表。 |
UpdateModelData | 模型设置 | 每次调用填充最多 5 个表元素。 |
MonitorStep | Crank | 结算 OpenBook 成交,重新发布订单。 |
SetParams | 管理员 | 更改池参数。 |
WithdrawSrm | 旧版 | 提取 SRM 费用折扣返利。 |
SimulateInfo | 诊断 | 只读报价辅助工具。 |
Deposit
添加流动性,接收 LP 代币。
参数
max_coin_amount: u64
max_pc_amount: u64
base_side: u64 // 0 = base on coin, 1 = base on pc
账户 — 新布局,12 个账户(可写 W,签名者 S)
| # | 名称 | W | S | 说明 |
|---|
| 0 | token_program | | | SPL Token。 |
| 1 | amm | W | | 池的 AmmInfo。 |
| 2 | amm_authority | | | 程序级 PDA。 |
| 3 | amm_target_orders | W | | |
| 4 | amm_lp_mint | W | | LP 铸币。 |
| 5 | amm_coin_vault | W | | 池 coin 金库。 |
| 6 | amm_pc_vault | W | | 池 pc 金库。 |
| 7 | model_data_account | | | 只读查找表。 |
| 8 | user_source_coin | W | | 用户的 coin 输入。 |
| 9 | user_source_pc | W | | 用户的 pc 输入。 |
| 10 | user_dest_lp | W | | 用户的 LP ATA。 |
| 11 | user_source_owner | | S | 交易签名者。 |
兼容性:amm_open_orders(旧 #3)和 serum_market(旧 #9)已移除。当传递14个账户时,指令使用旧的 14 账户布局解析;Serum 账户被忽略。
数学 — 使用查找表计算比率的标准按比例分配。SDK 计算所需 LP 数量的 coin/pc 对,并检查最大上限。
Withdraw
销毁 LP,按比例接收两种代币。
参数
amount: u64 // 要销毁的 LP 代币
账户 — 新布局,12 个账户(可写 W,签名者 S)
| # | 名称 | W | S | 说明 |
|---|
| 0 | token_program | | | SPL Token。 |
| 1 | amm | W | | 池的 AmmInfo。 |
| 2 | amm_authority | | | 程序级 PDA。 |
| 3 | amm_target_orders | W | | |
| 4 | amm_lp_mint | W | | LP 铸币。 |
| 5 | amm_coin_vault | W | | 池 coin 金库。 |
| 6 | amm_pc_vault | W | | 池 pc 金库。 |
| 7 | model_data_account | | | 只读查找表。 |
| 8 | user_source_lp | W | | 用户的 LP 来源。 |
| 9 | user_dest_coin | W | | 用户的 coin 输出。 |
| 10 | user_dest_pc | W | | 用户的 pc 输出。 |
| 11 | user_lp_owner | | S | 交易签名者。 |
兼容性:九个 Serum 账户(amm_open_orders、serum_program、serum_market、serum_coin_vault、serum_pc_vault、serum_vault_signer、serum_event_q、serum_bids、serum_asks)已移除。旧的21 个或22 个账户布局仍被接受。但是,第 22 个可选 referrer_pc_wallet 账户的推荐费逻辑已被移除 — 它仍可传递但不再生效。
前置条件
user_source_lp 至少持有 amount。
后置条件
amount LP 代币被销毁。
- 用户根据当前按比例分配接收 coin 和 pc 数量,已调整费用。
SwapBaseIn
使用查找表进行定价的精确输入交换。
参数
amount_in: u64
minimum_amount_out: u64
账户 — 新布局,9 个账户(可写 W,签名者 S)
| # | 名称 | W | S | 说明 |
|---|
| 0 | spl_token program | | | SPL Token。 |
| 1 | amm | W | | 池的 AmmInfo。 |
| 2 | amm_authority | | | 程序级 PDA。 |
| 3 | amm_coin_vault | W | | 池 coin 金库。 |
| 4 | amm_pc_vault | W | | 池 pc 金库。 |
| 5 | model_data_account | | | 只读查找表。 |
| 6 | user_source_token | W | | 用户的输入代币账户。 |
| 7 | user_destination_token | W | | 用户的输出代币账户。 |
| 8 | user_source_owner | | S | 用户(交易签名者)。 |
兼容性:九个 OpenBook 账户(amm_open_orders、serum_program、serum_market、serum_bids、serum_asks、serum_event_queue、serum_coin_vault、serum_pc_vault、serum_vault_signer)已移除。如果传递的账户数不是 9,指令使用旧的18 账户布局解析;Serum 账户必须仍占据其位置,但其内容不再被验证或使用。
前置条件
amm.status 允许交换。
user_source_token 持有 ≥ amount_in。
后置条件
- 用户失去
amount_in,获得 amount_out ≥ minimum_amount_out。
- 池费用增加
need_take_pnl_* 计数器。
数学 — 如products/stable/math中所述的查找表插值。
SwapBaseOut
精确输出交换(SwapBaseIn 的反向)。相同的 9 账户布局,不同的数学方向。
参数
max_amount_in: u64
amount_out: u64
WithdrawPnl
仅限管理员。从 need_take_pnl_* 提取累积的协议费用到指定的 PnL 账户。
硬性破坏性变更 — 无兼容性路径。 此指令没有旧布局的解析。发送旧布局会因账户错位而失败,出现验证错误如 InvalidTokenCoin(旧 #3 是 open_orders)。调用 WithdrawPnl 的管理员工具必须更新到新的 10 账户布局。
参数 — 无(状态驱动)。
账户 — 新布局,固定 10 个账户,仅限管理员(可写 W,签名者 S)
| # | 名称 | W | S | 说明 |
|---|
| 0 | spl_token program | | | SPL Token。 |
| 1 | amm | W | | 池的 AmmInfo。 |
| 2 | amm_authority | | | 程序级 PDA。 |
| 3 | amm_coin_vault | W | | 池 coin 金库。 |
| 4 | amm_pc_vault | W | | 池 pc 金库。 |
| 5 | amm_target_orders | W | | |
| 6 | model_data | | | 查找表。 |
| 7 | user_coin | W | | 管理员的 coin 账户(接收费用)。 |
| 8 | user_pc | W | | 管理员的 pc 账户(接收费用)。 |
| 9 | amm_admin | | S | 池管理员(签名者)。 |
逻辑变更:当池的可用资金不足以提取累积的 PnL 时,池不再进入 CancelAllOrdersState / Disabled;指令直接返回 TakePnlError。可选的 referrer_pc_wallet 也已被移除。
前置条件
后置条件
need_take_pnl_coin 和 need_take_pnl_pc 被转移到管理员的账户。
- 计数器被清零。
已移除的指令
以下指令在 2026-06-22 升级中被移除,不再可调用。此处记录它们仅是为了让集成者在历史交易和 SDK 中识别它们。
Initialize — 原用于引导新的 Stable AMM 池。已移除。
PreInitialize — 旧版预分配辅助工具。已移除。
InitModelData — 原用于创建并初始化 ModelDataInfo 查找表。已移除。
UpdateModelData — 原用于每次调用填充最多 5 个查找表元素。已移除。
MonitorStep — 结算成交并重新发布订单网格的 OpenBook crank。在池停止向 OpenBook 发布后已长期闲置;现已移除。
SetParams — 管理员参数更改(状态、费用、所有者、模型数据密钥等)。已移除。
WithdrawSrm — 从早期 Serum 时代的池中提取 SRM 费用折扣返利。已移除。
SimulateInfo — 只读报价辅助工具。已移除;使用 SDK 的链下稳定曲线辅助工具进行报价(参见代码演示)。
后续步骤
- 账户 — 账户字段布局和大小。
- 数学 — 查找表插值逻辑。
- 代码演示 — 了解如何从 SDK 调用这些。
来源:
raydium-stable/program/src/instruction.rs(枚举和 pack/unpack)
raydium-stable/program/src/processor.rs(执行逻辑)