Skip to main content
lifi.swap 是 Composer 支持的众多 op 之一。它在这里拥有专属页面,是因为值得深入讲解 —— 有关每一个 op 的完整、实时列表,请参见 Op 目录
lifi.swap 是 flow 中主要的跨代币原语。它在 amountIn 端口消费一个资源,并在 amountOut 端口产出一个 resourceOut 代币的新资源,使用 LI.FI 的聚合器在各个 DEX 和桥之间挑选最优路由。由于聚合器已经返回了最小产出保证(providesMinimum),你通常需要额外的滑点 guard —— 只需在 config 中传入 slippage,最小值就会被烘焙进报价中。 对于任何以标准 ERC-20 结束的链上或跨链交换,使用 lifi.swap。对于存入金库或借贷市场,请优先使用 lifi.zap,它会在交换之后额外链式执行一个路由边存入操作。

理解 unspentIn

当你编译 flow 时,lifi.swap 会向 LI.FI 聚合器请求一份具体的报价,并固定报价中的输入金额。链上交换会恰好花费这个被固定的金额 —— 不多也不少。 如果实际流入 amountIn 的运行时金额大于被固定的金额,差额会作为输入代币的一等线性资源,出现在第二个输出端口 unspentIn 上。这通常发生在 amountIn 的值只有在运行时才完全确定的情况 —— 例如当它来自某个上游 op、而该 op 的输出与用于推导报价的预览不同时,或者当输入是由模拟解析出来时。如果实际的 amountIn 小于被固定的金额,交易就会回滚。 unspentIn 的语义:
  • amountIn 相同的代币。 剩余部分保留输入资源;它不会被交换或销毁。
  • 精确划分。 unspentIn = amountIn 减去被报价交换所消费的金额。该 op 会忽略执行地址上任何预先存在的 dust —— 它只核算被交进来的那部分输入。
  • 完全可组合。 把它当作任何其他线性资源输出来处理:将它绑定到下游节点(合并、再次交换、扫走给某个接收方),它不会表现为一个终端。
  • 为零时省略。 如果运行时金额与报价精确匹配,unspentIn 会从 producedResources 中被抑制,而不是作为一个嘈杂的零终端出现。
  • 输入和输出必须不同。resourceOut 配置为与 amountIn 相同的资源是一个校验错误 —— 请改用空操作节点或跳过该交换。
amountOut 被报告为交换所产生的增量(调用后余额减去调用前余额),而不是调用后的总余额。即便执行地址已经持有部分输出代币,这也与「本次交换产出了什么」相符。

示例

在 Ethereum 主网上交换 WETH → USDC:
完整可运行的配方:Swap and zap