Skip to main content
本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →

两个不同的概念

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

正式定义

价格影响

对于 CPMM:小额交易时 impact ≈ 2 · Δin / reserve_in。对于 CLMM:取决于交易跨越多少个 tick;通常在当前 tick 范围内保持平坦,在每个 tick 边界处跳跃。

实现滑点

滑点总是非负的(或为零),假设报价是诚实的。负值意味着你获得的多于报价——如果池状态在报价和执行之间朝你有利的方向移动,这是可能的。

计算 minAmountOut 和 maxAmountIn

每个 Raydium 交换都需要一个滑点保护边界:
  • SwapBaseInput(amount_in, min_amount_out) — 精确输入,下限输出。
  • SwapBaseOutput(max_amount_in, amount_out) — 精确输出,上限输入。
SDK 按产品计算这些——三个产品不共享一个签名:
在所有三个中,minAmountOut 是 amountOut × (1 − slippage),这是链上边界;priceImpact 仅从池状态确定;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 默认值):

不同 AMM 类型的差异

CPMM

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

AMM v4

与 CPMM 相同的曲线数学。自 OpenBook 移除后,“有效储备”就是两个金库余额:
  • 从原始金库余额报价。没有链上组件要添加——Initialize2 在每个新池上写入 AmmInfo.open_orders = Pubkey::default(),没有指令读取 OpenOrders 账户。
  • 从金库余额中减去累积的协议 PnL(state_data.need_take_pnl_coin / need_take_pnl_pc)以获得不变量实际使用的储备。
  • 没有预运行的 crank:MonitorStep 现在会因 unimplemented! 而崩溃,不能被发送。

CLMM

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

LaunchLab 曲线

类似于 CPMM,但有非对称曲线(二次或虚拟储备)。随着曲线在毕业时变陡,后期买家的影响增长更快。预买家 UI 应该在预期买入会在一笔交易中推动曲线超过 quote_reserve_target 的约 5% 时发出警告。

MEV 考虑

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

多跳路由的滑点

当交换通过多个池路由时(例如 USDC → SOL → RAY),滑点容差应该按跳应用,而不仅仅是端到端:
SDK 的路由器在你调用 raydium.tradeV2.swap 时自动应用按跳边界。(外观是 tradeV2 — raydium.trade 不存在。)对于自定义路由器,复制该模式。

向用户报告

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

指针

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