工作原理
获取可签名的步骤
在标准报价请求中加入
gasless=true,或在路由请求中设置 options.gasless: true,并针对所选步骤提交交易数据。两种方式都会返回一个携带 EIP-712 载荷、过期时间,以及成本估算中中继费用条目的步骤。签名
用户使用
eth_signTypedData_v4 对类型化数据进行签名。用户账户不会发出任何交易,也不需要原生代币。中继
将已签名的步骤提交到
POST /v1/advanced/relay。LI.FI 会验证签名,将载荷与原始报价进行校验,并从中继账户广播交易。响应中会携带一个任务 ID。跟踪
轮询
GET /v1/status?taskId=...,直到转账状态变为 DONE 或 FAILED。前置条件
第一步:获取可签名的步骤
两种标准报价流程均无需改动即可使用。无 gas 只是一个请求标志。 在标准报价请求中加入gasless=true,响应即为可签名的步骤:
/v1/advanced/routes 请求体中设置 options.gasless: true 来请求路由。这些路由已经计入了中继费用,但尚未携带可签名的载荷。将所选路由的步骤原样提交到 /v1/advanced/stepTransaction,响应会以与单次报价相同的结构返回。
无 gas 方式不适用于
/v1/quote/toAmount,也不能与 executionType=message 或 executionType=all 组合使用,这类请求会被拒绝。/v1/quote/contractCalls 不支持无 gas 执行,会忽略 gasless 字段,请求会按普通合约调用报价继续处理。反向报价会被拒绝,因为其收敛计算只能求解基于百分比的费用,无法求解以固定 gas 计价的中继费用。可签名的步骤
一个无 gas 步骤是一个标准的 LI.FI 步骤,外加两个额外属性,以及成本估算中的中继费用条目:typedData可直接用于eth_signTypedData_v4。在 EIP-7702 委托下,执行这批调用的账户就是用户自己的地址,这也是为什么domain.verifyingContract是该地址。委托实现通过domain.salt绑定。expiresAt是 Unix 秒数,与载荷中的deadline相等。有效期很短,以分钟而非小时计。过期后请重新请求报价,不会产生任何费用。transactionRequest在这里不会用到。执行是通过已签名的类型化数据和中继接口完成的。
第二步:签署载荷
使用标准的 EIP-712 类型化数据签名方式进行签名。通过 JSON-RPC 将载荷传递给钱包时,请原样使用,因为 types 对象中包含了钱包会校验的EIP712Domain 条目。
第三步:提交中继请求
将该步骤原样提交,并在类型化数据条目中附上签名:TypeScript
200:
中继错误
拒绝会采用 LI.FI 标准的错误响应格式:与其他所有接口相同的响应体结构、相同的数字错误码,以及相同的 HTTP 状态码。状态码和code 标明了应对方式,message 则说明具体是哪项检查未通过,供你记录日志或用于支持排查。
在下游提交之前报告的失败不会广播交易,也不会向用户收费。
424 情况有所不同:它可能代表一个不确定的下游结果,不能被当作”未提交任何内容”的证据。
第四步:跟踪执行
状态跟踪的方式与状态跟踪指南中描述的一致,但有两个无 gas 场景特有的地方。从中继被接受的那一刻起,即使还没有任何交易产生,执行就可以通过任务 ID 进行查询。一旦响应中出现了交易哈希,同一笔执行也可以通过该哈希查询。curl
其余部分遵循标准的状态语义。响应会将该笔转账归属到发起签名的用户地址,而不是中继账户,因此你的记账方式与用户自行提交交易时保持一致。
费用
中继费用覆盖了 LI.FI 代表用户执行交易所花费的 gas。它是一个以 gas 计价的固定金额,依据链的 gas 特征和报价时的实时 gas 价格计算得出,随后换算为输入代币。该数值在/v1/quote、/v1/advanced/routes 和 /v1/advanced/stepTransaction 中保持一致。
它会以固定名称 LIFI Gasless Relay Fee(included: true)出现在成本估算中,这意味着它会在路由前从 fromAmount 中扣除,报价中的输出金额已经反映了这一点。用户的总支出正好等于 fromAmount。
在链上,费用转账是已签名批次中的第一个调用。它受签名保护,中继器无法改动,并且与交换操作是原子性的,因此除非交换成功执行,否则无法收取该费用。被拒绝的中继请求、过期的签名和失败的执行都不会产生任何收费。
费用在已签名的报价中是固定的,但如果 gas 价格变动超出可接受的容差范围,中继时的检查仍会以
409 拒绝该请求。届时请重新请求报价。无法提供无 gas 服务的情况
在/v1/quote 上,拒绝会以标准的”未找到”错误返回。在 /v1/advanced/routes 上,它会出现在 unavailableRoutes.filteredOut 中,其中 reason 是一句人类可读的说明,遵循与其他所有路由过滤条件相同的约定。你可以将其展示给用户,或写入日志,但不要以编程方式对其进行匹配。
以下情况会导致无 gas 请求被拒绝:
- 该账户是未完成委托的 EOA,或委托给了 LI.FI 不提供中继服务的合约;
- 该账户是智能合约钱包;
- 请求中未携带
fromAddress; - 该路由在输入金额之外还收取固定的原生代币费用,无 gas 用户无法承担这笔费用,其他工具可能仍可服务该笔交易;
- 中继费用扣除后,剩余的输入金额不足以支撑执行,这也是该功能对交易规模设下限的原因。
操作注意事项
将每个已签名的报价视为独立的一次执行
将每个已签名的报价视为独立的一次执行
不同的报价使用各自独立的、带键值的 nonce,可以为同一账户并存。
409 nonce 冲突意味着该已签名报价对应的 nonce 与链上状态不再匹配,例如因为同一笔执行已经被消耗。请重新请求报价,而不要重新签名或修改旧的载荷。在签名时才请求报价
在签名时才请求报价
签名截止时间很短。请在用户准备好签名时才请求报价,并在签名完成后立即中继。费用过期和报价过期属于常见的拒绝情形,且都不会产生任何费用,重新获取并重试即可。
不要缓存报价
不要缓存报价
每个报价都嵌入了账户状态和一个很短的截止时间。请将其视为一次性的签名载荷,遵守
expiresAt,并只在用户准备好签名时才请求它。重试同一个载荷,但要处理状态变化
重试同一个载荷,但要处理状态变化
在超时或
424 之后,只应以退避方式重试完全相同的已签名请求,切勿立即另外创建一次替代执行。重试可能会恢复一个已存在的、尚未广播的记录;如果报价完整性记录在被接受前已被消耗,会返回 404;如果 nonce 或费用状态发生变化,会返回 409。收到 404 后请重新报价;收到 409 后,请先核实原始执行是否已经推进。成功收到确认后,请保存任务 ID 并跟踪状态,而不要重新提交该载荷。后续步骤
Gas Fronting
在桥接资产的同时提供目标链原生 gas,让用户到账后即可交易。
状态跟踪
转账完整的状态与子状态词汇表。
错误码
API 返回的每个数字错误码及其含义。
API 参考
身份验证、速率限制和完整的接口列表。

