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.
Stable AMM 在指令接口上与 AMM v4 共享大部分内容。独特的指令是 InitModelData 和 UpdateModelData,它们用于填充和更新查找表。所有其他操作(交换、存入、提取、机械臂)都遵循与 AMM v4 相同的模式。
指令清单
| 指令 | 分类 | 说明 |
|---|
Initialize | 生命周期 | 创建流动性池(需要预先分配的模型数据账户)。 |
PreInitialize | 生命周期 | 遗留的预分配辅助工具。 |
InitModelData | 模型设置 | 创建并初始化查找表。 |
UpdateModelData | 模型设置 | 每次调用最多填充 5 个表元素。 |
Deposit | 流动性 | 添加流动性,获得 LP。 |
Withdraw | 流动性 | 销毁 LP,获得两种资产。 |
SwapBaseIn | 交换 | 精确输入交换。 |
SwapBaseOut | 交换 | 精确输出交换。 |
MonitorStep | 机械臂 | 结算 OpenBook,更新订单。 |
SetParams | 管理 | 更改流动性池参数。 |
WithdrawPnl | 管理 | 提取累计的协议费用。 |
WithdrawSrm | 遗留 | 提取 SRM 回扣(遗留)。 |
SimulateInfo | 诊断 | 只读报价辅助工具。 |
Initialize
引导一个新的 Stable AMM 流动性池,绑定到现有的 OpenBook 市场和预创建的 ModelDataInfo 账户。
参数
账户(可写 W、签名者 S)
| # | 名称 | W | S | 说明 |
|---|
| 1 | token_program | | | SPL Token。 |
| 2 | system_program | | | |
| 3 | rent | | | |
| 4 | amm | W | | 流动性池的 AmmInfo 账户。 |
| 5 | amm_authority | | | 程序级 PDA。 |
| 6 | amm_open_orders | W | | OpenBook OpenOrders。 |
| 7 | lp_mint | W | | 可替代的 LP 代币铸币厂。 |
| 8 | coin_mint | | | |
| 9 | pc_mint | | | |
| 10 | pool_coin_token_account | W | | 流动性池的币种金库。 |
| 11 | pool_pc_token_account | W | | 流动性池的 pc 金库。 |
| 12 | amm_target_orders | W | | OpenBook 订单网格。 |
| 13 | model_data_account | | | 查找表账户。 |
| 14 | serum_program | | | OpenBook 程序。 |
| 15 | serum_market | | | OpenBook 市场。 |
| 16 | user_dest_lp_token | W | | 创建者的 LP ATA(接收初始 LP)。 |
| 17 | user_wallet | W | S | 创建者;支付租金、资金初始存款。 |
| (可选) | srm_token | W | | SRM 代币账户用于费用折扣(遗留)。 |
前置条件
model_data_account 必须已由之前的 InitModelData 创建并初始化。
lp_mint 必须为空(零供应量)。
- 金库必须存在且由
amm_authority 拥有。
后置条件
AmmInfo 使用所有引用进行初始化。
TargetOrders 被清零并准备好进行第一次 MonitorStep。
- 初始 LP 代币被铸造并发送到
user_dest_lp_token。
- OpenBook 订单尚未发布;第一次
MonitorStep 发布它们。
InitModelData
创建并初始化 ModelDataInfo 账户。必须在 Initialize 之前调用一次。
参数
multiplier: u64 // 缩放因子(例如 10^6)
账户(可写 W、签名者 S)
| # | 名称 | W | S | 说明 |
|---|
| 1 | model_data_account | W | | 50k 元素表账户。 |
| 2 | amm_admin | | S | 流动性池管理员(必须签名以证明权限)。 |
前置条件
model_data_account 必须足够大(~1.2 MB,用于 50k × 24 字节)。
model_data_account 必须由 Stable 程序拥有。
后置条件
status = Initialized。
multiplier 被设置。
valid_data_count = 0(尚无元素被填充;调用 UpdateModelData 添加它们)。
elements 数组被清零。
UpdateModelData
在单次调用中填充最多 5 个表元素。必须在 InitModelData 之后但在交换开始使用该表之前调用。
参数
array_data: [UpdateModelData; 5]
pub struct UpdateModelData {
pub index: u64,
pub data: DataElement,
}
账户(可写 W、签名者 S)
| # | 名称 | W | S | 说明 |
|---|
| 1 | amm_admin | | S | 签名者(必须是流动性池管理员)。 |
| 2 | model_data_account | W | | 表账户。 |
前置条件
amm_admin 必须与 AmmInfo.amm_admin 匹配。
array_data 中的每个索引必须有效(在 50,000 以内)。
- 条目必须排序(为了速度在链上不验证):x 升序、y 降序、价格升序。
后置条件
- 元素被写入到每个输入的
model_data_account.elements[index]。
valid_data_count 被更新为写入的最大索引 + 1。
治理说明: 链上不强制执行排序顺序或价格一致性。恶意或粗心的管理员可以破坏表并导致不正确的报价。实际上,Raydium 多签控制这个地址。
Deposit
添加流动性,获得 LP 代币。
参数
max_coin_amount: u64
max_pc_amount: u64
base_side: u64 // 0 = 基础在币种,1 = 基础在 pc
账户 — 如同 AMM v4,约 13 个账户。必须包括 model_data_account 作为只读。
数学 — 使用查找表计算比率的标准比例。SDK 计算所需 LP 数量的币种/pc 对,并针对最大上限进行检查。
Withdraw
销毁 LP,按比例获得两种资产。
参数
amount: u64 // 要销毁的 LP 代币
账户 — 如同 AMM v4,将 model_data_account 作为只读。
前置条件
user_lp_token_account 至少持有 amount。
后置条件
amount LP 代币被销毁。
- 用户根据当前比例(调整后的应计费用)获得币种和 pc 数量。
SwapBaseIn
使用查找表进行定价的精确输入交换。
参数
amount_in: u64
minimum_amount_out: u64
账户(共 ~17 个)
| # | 名称 | W | S | 说明 |
|---|
| 1 | token_program | | | |
| 2 | amm | W | | |
| 3 | amm_authority | | | |
| 4 | amm_open_orders | W | | |
| 5 | amm_target_orders | W | | |
| 6 | pool_coin_token_account | W | | |
| 7 | pool_pc_token_account | W | | |
| 8 | model_data_account | | | 只读查找表。 |
| 9 | serum_program | | | |
| 10 | serum_market | W | | |
| 11 | serum_bids | W | | |
| 12 | serum_asks | W | | |
| 13 | serum_event_queue | W | | |
| 14 | serum_coin_vault | W | | |
| 15 | serum_pc_vault | W | | |
| 16 | serum_vault_signer | | | |
| 17 | user_source_token | W | | 用户的输入代币账户。 |
| 18 | user_dest_token | W | | 用户的输出代币账户。 |
| 19 | user_owner | | S | 用户(交易签名者)。 |
前置条件
amm.status 允许交换。
user_source_token 持有 ≥ amount_in。
后置条件
- 用户损失
amount_in,获得 amount_out ≥ minimum_amount_out。
- 流动性池费用增加
need_take_pnl_* 计数器。
- OpenBook 订单可能在被成交时结算。
数学 — 如 products/stable/math 中描述的查找表插值。
SwapBaseOut
精确输出交换(SwapBaseIn 的反向)。相同账户,不同数学方向。
参数
max_amount_in: u64
amount_out: u64
MonitorStep
无权限机械臂:结算 OpenBook 成交,更新限价订单网格。
参数
plan_order_limit: u16
place_order_limit: u16
cancel_order_limit: u16
账户(共 ~18 个)— 与 AMM v4 MonitorStep 相同,加上 model_data_account 作为只读。
前置条件
- OpenBook 账户引用必须与流动性池绑定的市场匹配。
后置条件
- 待结算的 OpenBook 成交被结算到流动性池金库。
- 基于查找表曲线向 OpenBook 发布新的限价订单。
TargetOrders 被更新。
SetParams
仅管理员。更改流动性池参数(状态、状态、费用、所有者、模型数据密钥等)。
参数
param: u8 // 要更改哪个参数(状态、状态、费用等)
value: Option<u64> // 新值(如果参数是数值)
new_pubkey: Option<Pubkey> // 新地址(如果参数是账户密钥)
fees: Option<Fees> // 新费用(如果参数是费用)
账户 — 根据参数而异。始终需要 amm_admin 作为签名者。
常见参数:
param = 0(状态)— 更改操作位掩码。
param = 9(费用)— 更改交易费用、pnl 拆分等。
param = 11(ModelDataKey)— 重新绑定查找表(罕见,需要管理员操作)。
WithdrawPnl
仅管理员。从 need_take_pnl_* 提取累计的协议费用到指定的 PnL 账户。
参数 — 无(状态驱动)。
账户(共 ~14 个)
| # | 名称 | W | S | 说明 |
|---|
| 1 | token_program | | | |
| 2 | amm | W | | |
| 3 | amm_authority | | | |
| 4 | amm_open_orders | W | | |
| 5 | pool_coin_token_account | W | | |
| 6 | pool_pc_token_account | W | | |
| 7 | coin_pnl_dest | W | | 管理员的币种账户(接收费用)。 |
| 8 | pc_pnl_dest | W | | 管理员的 pc 账户(接收费用)。 |
| 9 | pnl_admin | | S | 签名者(必须与流动性池所有权匹配)。 |
| 10+ | OpenBook 账户(~4 个) | | | 首先结算待结算的成交。 |
前置条件
后置条件
need_take_pnl_coin 和 need_take_pnl_pc 被转账到管理员账户。
- 计数器被清零。
WithdrawSrm
遗留(不要在新流动性池上使用)。从早期 Serum 时代流动性池提取 SRM 费用折扣代币回扣。
参数
SimulateInfo
客户端和 SDK 的只读报价辅助工具。
参数
param: u8 // PoolInfo、SwapBaseInInfo、SwapBaseOutInfo、RunCrankInfo
swap_base_in_value: Option<SwapInstructionBaseIn>
swap_base_out_value: Option<SwapInstructionBaseOut>
使用方法 — 通过 simulateTransaction 调用以获取报价而不执行交换。
接下来去哪里
- 账户 — 用于账户字段布局和大小。
- 数学 — 用于查找表插值逻辑。
- 代码演示 — 查看如何从 SDK 调用这些。
来源:
raydium-stable/program/src/instruction.rs(枚举和 pack/unpack)
raydium-stable/program/src/processor.rs(执行逻辑)