Skip to main content
LI.FI 在 EVM 链上支持三种代币授权策略。除了经典的 approve() 交易之外,集成方还可以使用 EIP-2612 PermitUniswap Permit2,通过链下签名来授权代币转账,从而减少所需的链上交易数量。
如果你使用 LI.FI SDKWidget,Permit2 会被自动处理。本指南面向直接基于 API 构建、希望了解或自行实现 permit 流程的集成方。

授权策略概览

为什么使用 Permit2?

在经典授权模型下,每一次与新 dApp 的交互都需要单独的 approve() 交易。Permit2 用一次性的、对规范 Permit2 合约的无限额度授权取而代之。此后所有的授权都通过无 gas 的 EIP-712 签名完成,并具有按转账粒度的控制(精确金额、截止时间、nonce)。

架构

所有基于 permit 的流程都会经过 Permit2Proxy 外围合约,它充当用户与 LI.FI Diamond 之间的中介: Permit2 Architecture

关键地址

通过 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 类型化数据。其中的 spenderPermit2Proxy(而非 Diamond)。
5

编码并将交易发送到 Permit2Proxy

将 Diamond calldata 包裹在一个以 Permit2Proxy(而非 Diamond)为目标的 callDiamondWithPermit2 调用中。
6

跟踪转账状态

像往常一样使用 /status 端点跟踪交易状态。

API 流程:EIP-2612 原生 Permit

EIP-2612 permit 仅适用于实现了 permit() 函数的代币(例如 USDC、AAVE、UNI)。完全不需要事先进行 approve() 交易。
并非所有代币都支持 EIP-2612。DAI 使用一种非标准的 permit 签名,LI.FI 目前不支持。如果代币未实现 EIP-2612,请退回到经典 approve() 或 Permit2。

检测 EIP-2612 支持

EIP-2612 没有链上注册表或 ERC-165 接口。唯一可靠的方法是探测代币合约是否具备所需的函数。如果 nonces()DOMAIN_SEPARATOR() 都成功返回,则该代币支持 EIP-2612。
使用 OpenZeppelin v4.9+ 或 v5.x 部署的代币还会暴露 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 消息

其中的 spenderPermit2Proxy 地址。
4

通过 Permit2Proxy 编码并发送

SDK 用法

@lifi/sdk 在路由执行期间自动处理 Permit2。无需手动构造签名。
若要禁用 Permit2 并强制使用经典 approve() 交易:

何时不使用 Permit2

SDK 在以下情况下会跳过 Permit2 并退回到经典 approve()
  • 源链未部署 Permit2(chain.permit2 未设置)
  • 源链没有 Permit2Proxy(chain.permit2Proxy 未设置)
  • 源代币是该链的原生代币(ETH、MATIC 等)
  • 消息签名被禁用(disableMessageSigning: true
  • 交易使用批量执行(EIP-5792)
  • 步骤的 estimate 带有 skipApproval: trueskipPermit: true(少见的可选字段,仅出现在某些因链而异的步骤上,例如 Hyperliquid)

参考

Permit2Proxy 合约函数

EIP-712 类型定义

PermitTransferFrom(Permit2 标准流程):
Permit(EIP-2612 原生 permit):

EIP-712 域

Permit2(用于 PermitTransferFrom):
EIP-2612(用于原生 Permit —— 域因代币而异):