跳转到主要内容

求解意图

LI.FI Intents 将订单发现、填充、证明和结算相互分离。在投入库存之前,请验证每一笔订单以及每个组件地址。总体流程如下:
  1. 用户在链上开启一笔托管订单,或签署一笔 EVM Compact 订单以提交给 LI.FI 订单服务器。
  2. 订单服务器对订单进行验证并广播。Compact 订单还需要分配者的共同签名。
  3. 求解器将订单的输出提交到输出结算合约,从而启动预言机系统。
    输出结算 以 output.settler 表示。
  4. 证明通过验证层被送达输入链。
    预言机系统 在订单结构中以 inputOracle 和 output.oracle 表示。
  5. 求解器将订单提交到输入结算合约,验证交付并解锁相关的输入代币。

订单类型

对于 EVM Compact 订单,你会遇到三种形式的订单,从最简略到最详尽排列:
  1. BatchClaim:一个已签名的意图,允许领取输入资产。
  2. StandardOrder:一个链上定义,包含足以传达意图的信息。
  3. 订单服务器响应:一个经过补全的订单——即 StandardOrder 加上求解器所需的链下字段,例如 InputSolver 和 signatures。
除非你要验证 Compact 签名,否则你不会与 BatchClaim 交互。链上交互使用的是 StandardOrder,而订单服务器会为其补全一次填充所需的链下字段。
Solana 同样使用 StandardOrder,但其 Borsh 结构只携带一个输入,并使用 Solana 原生类型。结构和执行上的差异请参阅 Solana vs EVM。

收集订单

LI.FI Intents 提供两种接收订单的方式:
  1. 推荐:通过 WebSocket 连接到订单服务器。
  2. 备选:通过存款接口监控链上存款。
大多数求解器应使用订单服务器。但如果你想要最低的延迟,或者希望订单发现保持去中心化且无需许可,也可以直接在链上读取部分订单——不过并非每笔订单都能以这种方式被发现。EVM 上的 StandardOrder 表示如下:
其中 uint256[2][] inputs === [uint256 tokenId, uint256 amount][],MandateOutput 为:
有关收集订单的更多信息,查看订单收集指南 →

填充意图

要填充一笔意图,你必须执行每一个 MandateOutput。每一个都完全独立地描述了一次交付。
  • output.settler 连同其 context 定义了这次交付——请在该结算器的接口上调用它。目前只实现了一个 OutputSettler:OutputSettlerSimple.sol,它有两个用于填充的接口:
在 Solana 上没有批量填充:每个输出都通过各自的 fill(SOL 则为 native_fill)指令来填充——参见 Solana 程序参考。对于多输出意图,请确保所有输出都能被填充,最好是原子性地完成。 输出结算的架构和接口记录在结算中。

验证填充

填充意图后,必须将填充证明发送到输入链。inputOracle 和 output.oracle 必须标识同一条预言机路线上受支持的两端,但它们并不总是同一个地址。在 Solana 上,其中一个字段可能保存的是程序 id,而另一个保存的是状态 PDA。证明的验证方式高度依赖于具体的预言机;更多信息请参阅预言机系统架构。

结算订单

最后,意图必须在其到期之前完成结算。结算方式是在指定的 InputSettler 上调用 finalise[withSignature]。调用者必须是填充时设定的指定求解器。
有关结算订单的更多信息,查看订单结算指南 →