Skip to main content
本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
版本信息
  • SDK:@raydium-io/raydium-sdk-v2@0.2.64-alpha
  • 集群:Solana mainnet-beta
  • Stable AMM 程序 ID:5quBtoiQqxF9Jv6KYKctB59NT3gtJD2Y65kdnB1Uev3h(参见 reference/program-addresses)
  • 最后验证:2026-09-09,针对 SDK 0.2.64-alpha 源代码和 raydium-sdk-V2-demo amm/trade 示例
SDK 的 liquidity 模块原生支持 Stable AMM 池。Stable 池在 ApiV3PoolInfoStandardItem 上显示为 version: 5(或 pooltype: "StablePool");相同的 addLiquidity / removeLiquidity / swap 辅助函数对它们和 AMM v4(version: 4)常数乘积池都适用——SDK 会自动检测变体并发出正确的指令。链下稳定曲线数学位于 src/raydium/liquidity/stable.ts。

设置

initLayout() 对 Stable 池不是可选的。 liquidity.computeAmountOut 根据 poolInfo.version 分支:对于 version 4 使用常数乘积公式,对于其他版本读取 this.stableLayout.stableModelData 并插值查找表。该缓存在 initLayout() 运行前为空,所以在没有它的情况下对 v5 池报价会产生垃圾数据而不是错误。它是幂等的且成本低廉——在启动时调用一次即可。交易构建器(swap、addLiquidity、removeLiquidity)不需要它:它们根据 pooltype.includes("StablePool") 分派并发出 AmmV5* 指令,你传入的金额边界已经计算过了。
liquidity.computeAmountIn 不支持 Stable 池。 与 computeAmountOut 不同,它没有版本分支——它总是应用常数乘积逆,所以在 v5 池上它返回错误的 maxAmountIn。对于针对 Stable 池的精确输出交换,用 getDxByDyBaseIn 自己反演(参见下面的链下报价辅助函数)并将结果传给 swap,设置 fixedSide: "out"。

识别 Stable 池

ApiV3PoolInfoStandardItem 上的两个等效信号:
AMM v4(version: 4,常数乘积)和 Stable AMM(version: 5)都通过 SDK 上的相同 LiquidityModule API 流动。在内部,模块分派到:
  • InstructionType.AmmV4AddLiquidity / AmmV4RemoveLiquidity 用于 v4 池
  • InstructionType.AmmV5AddLiquidity / AmmV5RemoveLiquidity 用于 v5(Stable)池
池的 programId(与池密钥一起返回)告诉 SDK 要 CPI 到哪个程序;你不需要硬编码它。

按代币对查找池

如果代币对同时有 v4(常数乘积)池和 v5(稳定)池,响应包含两者——选择你的流程需要的那个,或将它们交给 AMM 路由 程序让它选择最佳路由。

通过 Stable 池交换

LiquidityModule.swap 流与 v4 池的形状相同——只需将 v5 池对象交给它。两个细节容易出错:computeAmountOut 需要池的实时储备接合到池信息上(API 项本身不包含它们),其 slippage 是一个普通数字,不是 Percent:
SDK 从池密钥读取池的 programId 并分派到 Stable AMM 程序。不需要特殊的 programId 参数。

添加和移除流动性

addLiquidity 和 removeLiquidity 在 v4 和 v5 池上的工作方式相同:
在内部,SDK 发出 InstructionType.AmmV5AddLiquidity,因为 pooltype.includes("StablePool") 为真。对应的 removeLiquidity 流是对称的——输入 lpAmount 和你将接受的每一侧的最小金额。

链下报价辅助函数(stable.ts)

对于服务器端报价或回测,SDK 公开了底层稳定曲线数学:
这些是纯函数——没有 RPC,没有签署。链上 ModelDataInfo 由 initLayout() 获取一次并缓存在 raydium.liquidity.stableLayout 内,可读为 .stableModelData。initStableModelLayout() 是幂等的:仅在 validDataCount === 0 时重新获取,所以再次调用 initLayout() 是免费的。传入当前储备(x、y),辅助函数通过二分搜索查找表并在两个相邻 DataElement 行之间线性插值来计算。参见 products/stable/math 了解底层算法。

通过 AMM 路由进行路由(多跳 / 最佳价格)

如果你不想自己选择场所,AMM 路由 程序将考虑每个 Raydium AMM(v4 / CPMM / CLMM / Stable)并通过最佳组合路由: 路由器是一个五调用管道而不是单个 swap(),它完整地写出来——带有使其在生产中可用的缓存建议——在 products/routing/code-demos。形状是:
没有 raydium.tradeV2.fetchRoutes,tradeV2.swap 不接受 inputMint / outputMint / slippage——它接受已计算的 swapInfo,来自 getAllRouteComputeAmountOut。对于单个已知池,使用该池类型自己的构建器(raydium.liquidity.swap 用于 AMM v4 和 Stable,raydium.cpmm.swap,raydium.clmm.swap),如本页前面所示。
这是生产交换器和聚合器的推荐路径——你永远不需要手动决定 Stable 池是否存在或它今天是否是更好的场所。

建议

  1. 对于最终用户交换,优先使用 tradeV2 路由流。它处理每个 Raydium 池类型,包括 Stable。
  2. 对于池特定操作(已知 Stable 池上的 LP 添加 / 移除),直接使用 LiquidityModule——它自动检测 v5 池。
  3. 对于链下报价 / 分析,在 initLayout() 后调用 getStablePrice / getDyByDxBaseIn / getDxByDyBaseIn。模型数据缓存后每个报价无 RPC 流量。
  4. 不要手工编码原始 SwapBaseIn 指令。 2026-06-22 升级 移除了死 OpenBook 账户,所以新交换布局需要9 个账户(旧的 18 账户布局仍然解析以向后兼容)。Deposit 现在是 12 个账户(旧 14 兼容),Withdraw 12 个(旧 21/22 兼容),WithdrawPnl 10 个,没有兼容路径。SDK 的预构建辅助函数为你选择正确的布局和顺序;自己滚动容易出错。参见 products/stable/instructions 了解完整账户表。

接下来去哪里

  • 数学——查找表插值如何工作。
  • 指令——完整指令参考。
  • AMM 路由——跨 AMM v4、CPMM、CLMM、Stable 的多池路由。
来源: