跳转到主要内容
订单(意图)描述了用户想要什么:输入资产、期望的输出、结算参数和截止时间。在所有链上,推荐路径都是一样的:请求一个 V1 报价,然后签名并发送它返回的现成开启交易。链下提交(通过订单服务器)适用于 EVM 的无 gas 流程。在目标结算器支持的地方(EVM 上支持,Solana 上不支持),也可以使用交付时调用。

订单结构

LI.FI 意图使用 OIF 的 StandardOrder,它支持单链输入和多链输出。

字段参考

输出字段


选择资源锁

资源锁决定了在求解器填充订单期间用户资金如何被持有。 如果您要在其他桥接之外添加 LI.FI Intents,推荐使用 Simple Escrow。如果您正在构建资源锁优先的应用,请考虑使用 The Compact。资金存入的具体方式请参阅 Escrow 存款方式。
已部署的 InputSettlerCompact 合约尚未更新到当前版本的协议。更新后的部署上线后会公布其地址——在此之前请使用 Simple Escrow,或者如果您正在构建 Compact 集成,请联系 LI.FI。
在 Tron 和 Solana 上,只提供 Escrow——这两条链上都没有 Compact 或资源锁流程。

提交订单

每个 V1 报价都会返回 order.openIntentTx——一笔用于开启订单的源链交易。在链上开启这个动作本身就是广播:输入结算器会发出一个开启事件,订单服务器摄取该事件,求解器随即领取该订单。不存在单独的提交调用。 不同链上,交易的形态以及发送前所需的步骤各不相同。

在 EVM 上开启

openIntentTx 携带输入结算器地址(to)、十六进制 calldata(data)以及 gas 预估值(gasRequired)。发送前,请满足 order.checks.allowances 中的每一项——每一项都断言用户为 spender 持有并已授权至少 required 数量的 token(可以是直接的 ERC-20 授权,也可以是 Permit2):

在 Tron 上开启

在 Tron 上,openIntentTx.data 是完整的 ABI calldata(函数选择器 + 参数),而不是一笔可直接广播的交易。请先授权 TRC-20 输入,然后使用 TronWeb 将该 calldata 包裹进 TriggerSmartContract 信封中;feeLimit 是以 SUN 计的能量花费上限,而非估算值:
关于地址转换和 TVM 信封的详细说明,见 Tron vs EVM。

在 Solana 上开启

在 Solana 上,openIntentTx.data 是一个序列化的交易模板。签名之前,请替换其中的占位区块哈希,并使用 openIntentTx.computeUnitsRequired 中返回的计算单元限制重建其消息:
当前模板不包含地址查找表,因此可以直接反编译而无需提供查找表账户。如果这一点将来发生变化,请在重建之前解析每一个查找表并将其传给 TransactionMessage.decompile。在 dApp 中,请使用您钱包适配器的 signTransaction,而不是 Keypair。open 指令会托管输入代币并发出一个 OpenEvent;订单服务器会摄取该事件并将订单分发给求解器。这里没有预先的授权步骤:checks.allowances 始终为 [],因为 SPL 转账发生在 open 指令内部。
请将 USER_SECRET_KEY 之类的密钥保存在环境变量中——切勿硬编码,也不要在浏览器代码中暴露它们。

链下提交(无 gas 与 Compact)

仅当您的集成需要链下订单提交时——无 gas 托管或已签名的 Compact 领取,二者都仅限 EVM——才使用 POST /orders/submit。它不接受 Tron 或 Solana 订单。如果您使用了来自订单服务器的报价,请包含 quoteId 以获得优先处理。
响应包含完整的订单、关联的报价(如有)以及一个带有 orderIdentifier 和 onChainOrderId 的 meta 对象用于跟踪。
这是一个参考模板。CatalystCompactOrder 提交需要 sponsor 签名或 Compact 注册的交易哈希。在主网上线之前,请始终在 order-dev.li.fi 上进行验证。

链上 vs 链下订单

订单服务器是一个便利层,而非链上订单的必需项。所有链上意图都可以在不使用它的情况下提交。一些求解器会独立检测链上意图。

交付时调用

每个 MandateOutput 都支持一个 call 字段,用于在代币交付后在目标链上执行的 calldata。接收方先收到代币,然后输出 settler 在 recipient 合约上调用 outputFilled(bytes32 token, uint256 amount, bytes executionData)。 在使用交付时调用时:
  • 对于每一个输出,输出结算器会先交付代币,再运行该调用
  • 如果调用失败,则整个意图无法被填充
  • recipient 必须是实现了 outputFilled 的合约,而非 EOA
  • 对于多链输出,只有第一个输出应包含 calldata
对于任意合约调用,请使用批处理合约或 Single-Call Architecture (SCA) 包装器,因为调用被包装在 outputFilled 中。如果您需要 SCA 实现,请联系 LI.FI。
Solana 不支持交付时调用。带有 Solana 输出的订单必须将回调字段留空;否则输出结算器会拒绝填充。

意图验证

在提交之前,请根据以下规则验证您的订单。

安全性

  1. 检查 oracle 网络相对于该意图的价值是否足够安全
  2. 所有 oracle(输入和输出)都应属于同一个网络
  3. 多输出订单可能容易受到 DoS 攻击,即仅填充第一个输出。请将第一个输出设为最有价值的。
  4. 来自输出 settler 的调用不能用于认证,因为任何人都可以填充输出
  5. 将 user 设置为预期的退款接收方,而非意图发起方或中继地址。
确保退款接收方能够正确接收和处理资金。使用无法接受代币的地址(例如没有 receive 函数的合约,或错误的链地址)将永久损失资金。

正确性

  1. 使用已知的、可靠的代币、结算合约和 oracle
  2. 使用尽可能少的代币。低价值或不知名的代币会让填充的可能性降低。
  3. 在 fillDeadline 和 expires 之间留出足够的时间以适应消息传递延迟
  4. 确保 nonce 是唯一的。托管要求用户唯一性,而 The Compact 要求 allocator 唯一性。
  5. 对于 The Compact,确保所有输入共享同一个 allocator,且资源锁的过期时间在意图过期时间之后

后续步骤

跟踪订单状态

监控订单进度并处理终态

请求报价

在构造订单之前获取求解器定价

结算

托管和 Compact 注册详情

Oracle 系统

Oracle 网络和验证