approve() 交易之外,集成方还可以使用 EIP-2612 Permit 或 Uniswap Permit2,通过链下签名来授权代币转账,从而减少所需的链上交易数量。
授权策略概览
为什么使用 Permit2?
在经典授权模型下,每一次与新 dApp 的交互都需要单独的approve() 交易。Permit2 用一次性的、对规范 Permit2 合约的无限额度授权取而代之。此后所有的授权都通过无 gas 的 EIP-712 签名完成,并具有按转账粒度的控制(精确金额、截止时间、nonce)。
架构
所有基于 permit 的流程都会经过 Permit2Proxy 外围合约,它充当用户与 LI.FI Diamond 之间的中介:
关键地址
通过 API 发现地址
API 流程:Permit2(标准自执行)
这是最常见的 permit 流程。它适用于在已部署 Permit2 的链上的任何 ERC-20 代币。1
获取报价
像往常一样请求报价。响应中包含
estimate.approvalAddress(用于经典 approve 的 Diamond 地址)以及你所需的链元数据。2
检查并设置 Permit2 授权额度(一次性)
用户需要对 Permit2 合约(而非 Diamond)授权一次。仅当用户尚未为该代币授权过 Permit2 时才需要进行此操作。从 chains API 解析 Permit2 和 Permit2Proxy 地址 —— 不要将它们硬编码,因为若干网络使用非规范部署。
3
读取下一个可用的 nonce
Permit2 使用无序 nonce。
Permit2Proxy 合约提供了一个 nextNonce() 辅助函数,用于查找签名者的下一个未使用的 nonce。4
构造并签署 PermitTransferFrom 消息
为
PermitTransferFrom 构造 EIP-712 类型化数据。其中的 spender 是 Permit2Proxy(而非 Diamond)。5
编码并将交易发送到 Permit2Proxy
将 Diamond calldata 包裹在一个以 Permit2Proxy(而非 Diamond)为目标的
callDiamondWithPermit2 调用中。6
跟踪转账状态
像往常一样使用
/status 端点跟踪交易状态。API 流程:EIP-2612 原生 Permit
EIP-2612 permit 仅适用于实现了permit() 函数的代币(例如 USDC、AAVE、UNI)。完全不需要事先进行 approve() 交易。
检测 EIP-2612 支持
EIP-2612 没有链上注册表或 ERC-165 接口。唯一可靠的方法是探测代币合约是否具备所需的函数。如果nonces() 和 DOMAIN_SEPARATOR() 都成功返回,则该代币支持 EIP-2612。
eip712Domain()(EIP-5267),它在一次调用中返回所有域字段。对于较旧的代币,请分别读取 name()、version() 和 DOMAIN_SEPARATOR(),并重新计算 separator 以进行验证。
1
获取报价并检索 diamond calldata
与标准流程相同:请求报价,然后将
transactionRequest.data 用作你的 diamond calldata。2
读取代币的 permit nonce
EIP-2612 代币按 owner 跟踪 nonce。从代币合约读取当前 nonce。
3
签署 EIP-2612 Permit 消息
其中的
spender 是 Permit2Proxy 地址。4
通过 Permit2Proxy 编码并发送
SDK 用法
@lifi/sdk 在路由执行期间自动处理 Permit2。无需手动构造签名。
approve() 交易:
何时不使用 Permit2
SDK 在以下情况下会跳过 Permit2 并退回到经典approve():
- 源链未部署 Permit2(
chain.permit2未设置) - 源链没有 Permit2Proxy(
chain.permit2Proxy未设置) - 源代币是该链的原生代币(ETH、MATIC 等)
- 消息签名被禁用(
disableMessageSigning: true) - 交易使用批量执行(EIP-5792)
- 步骤的 estimate 带有
skipApproval: true或skipPermit: true(少见的可选字段,仅出现在某些因链而异的步骤上,例如 Hyperliquid)
参考
Permit2Proxy 合约函数
EIP-712 类型定义
PermitTransferFrom(Permit2 标准流程):EIP-712 域
Permit2(用于PermitTransferFrom):
Permit —— 域因代币而异):

