> ## Documentation Index
> Fetch the complete documentation index at: https://docs.krokoswap.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Permit2

> 用于安全高效授权管理的统一代币授权系统

# 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()`。每个代币只需执行一次。

```solidity theme={null}
token.approve(PERMIT2, type(uint256).max);
```

### 步骤 2：通过 Permit2 授予权限

调用 `Permit2.approve()` 让 Universal Router 通过 Permit2 使用你的代币：

```solidity theme={null}
permit2.approve(
    tokenAddress,       // 哪个代币
    UNIVERSAL_ROUTER,   // 谁可以使用
    type(uint160).max,  // 额度限制
    expiration          // 权限过期时间（Unix 时间戳）
);
```

### 步骤 3：交易执行

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

## 查询授权额度

查询现有权限：

```solidity theme={null}
(uint160 amount, uint48 expiration, uint48 nonce) = permit2.allowance(
    owner,           // 用户地址
    tokenAddress,    // 代币
    spender          // 如 Universal Router
);
```

在以下情况下交易将失败：

* `amount` 小于交易输入金额
* `expiration` 已过期

## 安全优势

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