跳转到主要内容

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 共享大部分内容。独特的指令是 InitModelDataUpdateModelData,它们用于填充和更新查找表。所有其他操作(交换、存入、提取、机械臂)都遵循与 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 账户。 参数
nonce: u8
open_time: u64
账户(可写 W、签名者 S
#名称WS说明
1token_programSPL Token。
2system_program
3rent
4ammW流动性池的 AmmInfo 账户。
5amm_authority程序级 PDA。
6amm_open_ordersWOpenBook OpenOrders
7lp_mintW可替代的 LP 代币铸币厂。
8coin_mint
9pc_mint
10pool_coin_token_accountW流动性池的币种金库。
11pool_pc_token_accountW流动性池的 pc 金库。
12amm_target_ordersWOpenBook 订单网格。
13model_data_account查找表账户。
14serum_programOpenBook 程序。
15serum_marketOpenBook 市场。
16user_dest_lp_tokenW创建者的 LP ATA(接收初始 LP)。
17user_walletWS创建者;支付租金、资金初始存款。
(可选)srm_tokenWSRM 代币账户用于费用折扣(遗留)。
前置条件
  • 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
#名称WS说明
1model_data_accountW50k 元素表账户。
2amm_adminS流动性池管理员(必须签名以证明权限)。
前置条件
  • 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
#名称WS说明
1amm_adminS签名者(必须是流动性池管理员)。
2model_data_accountW表账户。
前置条件
  • 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 个)
#名称WS说明
1token_program
2ammW
3amm_authority
4amm_open_ordersW
5amm_target_ordersW
6pool_coin_token_accountW
7pool_pc_token_accountW
8model_data_account只读查找表。
9serum_program
10serum_marketW
11serum_bidsW
12serum_asksW
13serum_event_queueW
14serum_coin_vaultW
15serum_pc_vaultW
16serum_vault_signer
17user_source_tokenW用户的输入代币账户。
18user_dest_tokenW用户的输出代币账户。
19user_ownerS用户(交易签名者)。
前置条件
  • 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 个)
#名称WS说明
1token_program
2ammW
3amm_authority
4amm_open_ordersW
5pool_coin_token_accountW
6pool_pc_token_accountW
7coin_pnl_destW管理员的币种账户(接收费用)。
8pc_pnl_destW管理员的 pc 账户(接收费用)。
9pnl_adminS签名者(必须与流动性池所有权匹配)。
10+OpenBook 账户(~4 个)首先结算待结算的成交。
前置条件
  • pnl_admin 必须被授权。
后置条件
  • need_take_pnl_coinneed_take_pnl_pc 被转账到管理员账户。
  • 计数器被清零。

WithdrawSrm

遗留不要在新流动性池上使用)。从早期 Serum 时代流动性池提取 SRM 费用折扣代币回扣。 参数
amount: u64

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(执行逻辑)