1. 选择池
一个代币对在每个费率档位上可以各有一个池。选择流动性最深的那个:
2. 确定方向
方向是在排序后的代币对上定义的:卖出 token0 即 zeroForOne = true。
3. 模拟并报价
simulateSwap 只发起一次节点调用,返回逐个 tick 的流动性曲线。offlineSwap 在本地重放它,因此只要数量没有超出最后一行模拟数据,就可以对相近的数量重新报价而无需再次请求。
兑换前后的价格:
4. 执行
在 ClmmSwapRequest 中,token0 / token1 表示输入 / 输出,而不是排序后的顺序。
滑点会变成 sqrtPriceLimitX96:如果全部成交会让价格变动超过容忍度,兑换就会失败。见 CLMM:滑点作用于价格。
clmm.swap() 要求全部成交。如果在整个 amount 兑换完成之前就达到了价格限制,交易会以合约错误 501 回滚,不会有任何代币转移。请提高 slippage 或减少数量后重试。(swapTo() 不同:它在达到目标价格时停止,按设计可以部分成交。)
多跳报价
要在同一费率档位的两个池中报价 A → B → C,把模拟串联起来。第一跳的输出就是第二跳的精确输入数量:
要在一次调用中模拟整条路径,请传入 data: powfi.clmm.buildSwapPath(C, configIndex),并把第二个池的地址放入 interestedContracts。clmm.swap() 只执行单池兑换。如需执行多跳兑换,请用相同的 data 调用 ClmmScripts 中的 SwapWithoutAccount 脚本。
兑换到目标价格
目标价格必须在正确的一侧:卖出 token0 会降低价格,卖出 token1 会提高价格。