跳转到主要内容

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 自动翻译,所有内容以英文版本为准。查看英文版 →

两个不同的概念

价格影响滑点经常在用户界面中被混淆,但它们指的是不同的东西。
  • 价格影响是针对特定池状态的交易的确定性属性。给定 (Δin, reserves),价格影响在交易提交前完全可计算。
  • 滑点是你在报价时预期的价格和执行时实际获得的价格之间的实际差异。它是延迟、并发交易和区块纳入顺序的函数——而不是池数学的函数。
对一个其他方面处于闲置状态的池的 1% 报价,如果它在下一个区块中成交,滑点为 0%;那 1% 是价格影响。如果另一笔交易先命中池,那同样的报价会差 0.2%——额外的 0.2% 就是滑点。

正式定义

价格影响

p_before = pool.spot_price()
p_after  = pool.spot_price_if_trade(Δin) applied
impact   = (p_before − p_after) / p_before       // 可以是有符号的
对于 CPMM:小额交易时 impact ≈ 2 · Δin / reserve_in。对于 CLMM:取决于交易跨越多少个 tick;通常在当前 tick 范围内保持平稳,在每个 tick 跨越处跳跃。

实现滑点

quoted_out = 报价时计算的输出金额
actual_out = 链上观察到的输出金额
slippage   = (quoted_out − actual_out) / quoted_out
滑点总是非负的(或为零),假设报价是诚实的。负值意味着你获得的报价的多——如果池状态在报价和执行之间朝对你有利的方向移动,这是可能的。

计算 minAmountOutmaxAmountIn

每个 Raydium 交换都需要一个滑点保护界限:
  • SwapBaseInput(amount_in, min_amount_out) — 精确输入,下限输出。
  • SwapBaseOutput(max_amount_in, amount_out) — 精确输出,上限输入。
SDK 的计算如下:
const computed = raydium.<pool_type>.computeAmountOut({
  poolInfo,
  amountIn,
  mintIn,
  mintOut,
  slippage: 0.005,     // 0.5% 容差
});

// computed.amountOut         — "预期"报价
// computed.minAmountOut      — amountOut × (1 − slippage),作为链上界限使用
// computed.priceImpact       — 确定性的,仅依赖池状态
// computed.fee               — 总费用(所有成分之和)
滑点容差是围绕价格影响的缓冲区,而不是价格影响本身。0.5% 的容差意味着”接受比报价最多差 0.5%“——与价格影响是 0.01%(小额交易)还是 2%(大额交易)无关。对于有 2% 价格影响、0.5% 容差的交易,minAmountOut 是交易前现货的 2.5% 以下——本质上是影响和容差的总和。

推荐滑点容差

没有单一的正确数字;正确的界限取决于:
  1. 交易对稳定性。 稳定币对稳定币的池可以安全地使用 0.1%。波动的模因币对通常需要 3–5% 才能可靠地成交。
  2. 交易规模。 较大的交易具有较大的价格影响,因此容差需要与之相应调整以避免回滚。SDK 的自动滑点默认值大约为 max(0.5%, 2 × price_impact) 就是因为这个原因。
  3. 区块纳入延迟。 在内存池中停留多个区块的交易会面临更多并发交易的暴露。Jito 捆绑和优先费用可以减少这种情况。
经验法则(Raydium UI 默认值):
交易对类型默认容差
稳定币对稳定币(USDC-USDT、USDC-USDS)0.1%
稳定币对主流(USDC-SOL、USDC-BTC)0.5%
主流对主流(SOL-BTC、SOL-ETH)1%
波动性(模因币、流动性差的长尾)3–5%

不同 AMM 类型的差异

CPMM

价格影响平滑连续(闭式解 2 · Δin / reserve_in)。滑点容差随交易规模线性扩展。

AMM v4

与 CPMM 相同的曲线数学,但”有效准备金”包括池的 OpenBook 发布的限价单。实际上这意味着:
  • 从原始金库余额报价低估了准备金,因此高估了影响。
  • SDK 获取 AmmInfo 并求和 vault + on_book.free + on_book.locked 以获得正确的数字。
  • 陈旧的 OpenBook 状态(crank 被阻止)会导致报价影响与链上现实出现偏差。聚合器例行在大型 AMM-v4 交易前进行预处理(无许可 MonitorStep)。

CLMM

价格影响是分段的。在当前 tick 范围内,影响大约与 Δin / L 成线性关系。跨越 tick 边界可以离散地改变 L,导致边际价格突然跳跃。跨越几个稀疏 tick 的交易的影响可能远高于 2 · Δin / reserve 经验法则。 SDK 的 CLMM 报价确定性地迭代交换步骤,返回精确的预期 amountOut,所以 minAmountOut = amountOut · (1 − slippage) 是正确的。但priceImpact 返回值应该理解为”交易前现货和交易后现货之间的点差”,在 CLMM 上,这对于仅关心 amount_out 的用户来说,可能远高于交换的实际滑点。

LaunchLab 曲线

与 CPMM 相似,但曲线不对称(二次或虚拟准备金)。随着曲线在毕业前变陡峭,后期买家的影响增长更快。预买家 UI 应在买入预期在一个交易中推动曲线超过约 5% 的 quote_reserve_target 时发出警告。

MEV 考虑

在 Solana 上,针对交换的 MEV 提取主要采取三明治攻击的形式:机器人在你之后放置一个反向运行交易,加上在你之前进行的前置运行,两者都在同一时段。你的交易以比没有三明治时更糟糕的价格成交;反向运行捕获了差异。 防缓解:
  1. minAmountOut 激进的滑点界限会导致被三明治后的受害者交易回滚,保护资金(但浪费 gas)。在 Solana 上这是标准做法——拒绝很便宜。
  2. Jito 捆绑。 通过 Jito 提交捆绑小费可以将中间人从重新排序你的交易中排除。捆绑作为原子块成交。
  3. 优先费用。 高优先费用增加了你的交易在当前领导者区块中成交的机会,在三明治机器人反应之前。不如捆绑稳健,更标准。
  4. 私有 RPC。 通过私有 RPC 提交(或通过验证器的直接端点)减少了内存池三明治机器人可以观察到你的交易的时间窗口。
Raydium SDK 不进行捆绑;集成商通常在上层使用 Jito。参见 integration-guides/routing-and-mev 了解模式。

多跳路由的滑点

当交换通过多个池路由时(例如 USDC → SOL → RAY),滑点容差应该按每跳应用,而不仅仅是端到端:
// 不好:0.5% 仅在末尾应用,因此任何中间跳跃滑动都会导致第二跳失败。
const finalMin = finalAmount * (1 - 0.005);

// 更好:每跳执行自己的界限。
const hop1Min  = hop1Amount * (1 - 0.005);
const hop2Min  = hop2Amount * (1 - 0.005);
// 端到端这更紧(复合),但原子性——如果任一跳降级,tx 会尽早回滚。
SDK 的路由器在你调用 raydium.trade.swap 时自动应用按跳界限。对于自定义路由器,复制这个模式。

向用户报告

良好交换 UI 的经验法则:
  • 分别显示预期价格影响和滑点容差两者
  • 当价格影响超过约 2% 时高亮——“高影响”警告。
  • 当价格影响超过容差时高亮——交易几乎肯定会回滚。
  • 对于波动对,提供”高滑点模式”来放松界限并显示更强的警告。

指针

来源:
  • Raydium SDK v2 滑点/影响实现。
  • Flashbots / Jito on Solana MEV。