跳转到主要内容

Permit2

Permit2 是一个代币授权合约,充当共享的授权管理器。用户无需为每个 DEX 合约单独授权,只需将代币一次性授权给 Permit2,然后为特定花费者(如 Universal Router)授予细粒度的权限。

为什么需要 Permit2?

传统的 ERC-20 授权存在几个问题:
问题Permit2 解决方案
对每个 dApp 的无限授权只需对 Permit2 单次授权,然后设定范围化的子权限
授权无过期时间子权限具有可配置的过期时间
每个新 dApp 需要新的授权交易Permit2 已授权,只需一个子权限
撤销需要按 dApp 逐个操作撤销 Permit2 授权即可一次切断所有 dApp

工作原理

步骤 1(每个代币一次性操作):
  Token ──approve──▶ Permit2

步骤 2(每个代币每个花费者一次性操作):
  Permit2 ──approve──▶ Universal Router
  (带额度限制 + 过期时间)

步骤 3(每次交易):
  Universal Router 使用 Permit2 转移代币

步骤 1:将代币授权给 Permit2

标准的 ERC-20 approve()。每个代币只需执行一次。
token.approve(PERMIT2, type(uint256).max);

步骤 2:通过 Permit2 授予权限

调用 Permit2.approve() 让 Universal Router 通过 Permit2 使用你的代币:
permit2.approve(
    tokenAddress,       // 哪个代币
    UNIVERSAL_ROUTER,   // 谁可以使用
    type(uint160).max,  // 额度限制
    expiration          // 权限过期时间(Unix 时间戳)
);

步骤 3:交易执行

当 Universal Router 执行交易时,它通过 Permit2 从用户处拉取代币 — 无需用户进一步交互。

查询授权额度

查询现有权限:
(uint160 amount, uint48 expiration, uint48 nonce) = permit2.allowance(
    owner,           // 用户地址
    tokenAddress,    // 代币
    spender          // 如 Universal Router
);
在以下情况下交易将失败:
  • amount 小于交易输入金额
  • expiration 已过期

安全优势

  • 范围化权限:每个花费者拥有自己的授权额度和过期时间
  • 单点撤销:撤销对 Permit2 的 ERC-20 授权即可禁用所有下游花费者
  • Nonce 追踪:防止重放攻击
  • 过期机制:权限在设定时间后自动失效