> For the complete documentation index, see [llms.txt](https://help.tokenpocket.pro/developer-cn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.tokenpocket.pro/developer-cn/agentic-wallet/eip-7715-account-with-permissions/qing-qiu-zhi-xing-quan-xian.md).

# 请求执行权限

`wallet_requestExecutionPermissions` 是 EIP-7715 的核心方法。DApp/Agent 通过它向 TokenPocket 用户请求授权，用户在钱包 UI 中确认后，返回可用于后续 redeem 的权限响应。

### 前置条件 <a href="#e5-89-8d-e7-bd-ae-e6-9d-a1-e4-bb-b6" id="e5-89-8d-e7-bd-ae-e6-9d-a1-e4-bb-b6"></a>

1. 已连接钱包（`eth_requestAccounts`）。
2. 建议已调用 `wallet_getSupportedExecutionPermissions` 确认能力。
3. 已准备 **Session Account** 地址，填入请求的 `to` 字段。

### RPC 方法 <a href="#rpc-e6-96-b9-e6-b3-95" id="rpc-e6-96-b9-e6-b3-95"></a>

```
wallet_requestExecutionPermissions
```

#### 请求参数 <a href="#e8-af-b7-e6-b1-82-e5-8f-82-e6-95-b0" id="e8-af-b7-e6-b1-82-e5-8f-82-e6-95-b0"></a>

```typescript
type PermissionRequest = {
  chainId: `0x${string}` // hex 编码的 chainId
  from?: `0x${string}` // 用户账户，可选；多账户时建议显式指定
  to: `0x${string}` // DApp/Agent Session Account / Delegate 地址
  permission: {
    type: string
    isAdjustmentAllowed: boolean
    data: Record<string, unknown>
  }
  rules?: {
    type: string
    data: Record<string, unknown>
  }[]
}

// params 为 PermissionRequest 数组，支持批量（须同链）
params: PermissionRequest[]
```

### 完整示例：发起单笔授权 <a href="#e5-ae-8c-e6-95-b4-e7-a4-ba-e4-be-8b-e5-8f-91-e8-b5-b7-e5-8d-95-e7-ac-94-e6-8e-88-e6-9d-83" id="e5-ae-8c-e6-95-b4-e7-a4-ba-e4-be-8b-e5-8f-91-e8-b5-b7-e5-8d-95-e7-ac-94-e6-8e-88-e6-9d-83"></a>

```typescript
import { parseUnits, toHex } from "viem";

const provider = window.ethereum;

// 1. 连接钱包
const [userAddress] = await provider.request({ method: "eth_requestAccounts" });

// 2. Session Account（接收授权的 Relayer 地址）
const sessionAddress = "0xYourSessionAccount...";

// 3. 拼装请求
const chainId = "0x38"; // BNB Chain = 56
const expiry = Math.floor(Date.now() / 1000) + 7 * 86400;

const grantedPermissions = await provider.request({
  method: "wallet_requestExecutionPermissions",
  params: [
    {
      chainId,
      from: userAddress,
      to: sessionAddress,
      permission: {
        type: "erc20-token-periodic",
        isAdjustmentAllowed: true,
        data: {
          tokenAddress: "0x55d398326f99059fF775485246999027B3197955",
          periodAmount: toHex(parseUnits("10", 18)),
          periodDuration: 86400,
          justification: "允许 DApp/Agent 每日最多转出 10 USDT",
        },
      },
      rules: [
        {
          type: "expiry",
          data: { timestamp: expiry },
        },
      ],
    },
  ],
});

console.log(grantedPermissions[0].context);
console.log(grantedPermissions[0].delegationManager);
```

### 响应结构 <a href="#e5-93-8d-e5-ba-94-e7-bb-93-e6-9e-84" id="e5-93-8d-e5-ba-94-e7-bb-93-e6-9e-84"></a>

```typescript
type PermissionResponse = PermissionRequest & {
  context: `0x${string}`;
  delegationManager: `0x${string}`;
  dependencies: {
    factory: `0x${string}`;
    factoryData: `0x${string}`;
  }[];
};
```

| 字段                  | 说明                                      |
| ------------------- | --------------------------------------- |
| `context`           | redeem 时传入 `_permissionContexts`        |
| `delegationManager` | 调用 `redeemDelegations` 的目标合约            |
| `dependencies`      | redeem 前可能需要处理的账户部署依赖；为空表示当前无需额外处理预部署步骤 |

> 响应可能包含用户调整后的权限参数（当 `isAdjustmentAllowed: true` 时），勿假设与请求完全一致。

### 批量请求 <a href="#e6-89-b9-e9-87-8f-e8-af-b7-e6-b1-82" id="e6-89-b9-e9-87-8f-e8-af-b7-e6-b1-82"></a>

`params` 支持数组，可一次请求多条权限，**但必须属于同一 `chainId`**：

```typescript
const granted = await provider.request({
  method: "wallet_requestExecutionPermissions",
  params: [
    {
      chainId: "0x38",
      to: sessionAddress,
      permission: {
        /* erc20-token-periodic */
      },
      rules: [{ type: "expiry", data: { timestamp: expiry } }],
    },
    {
      chainId: "0x38",
      to: sessionAddress,
      permission: {
        /* native-token-stream */
      },
      rules: [{ type: "expiry", data: { timestamp: expiry } }],
    },
  ],
});
```

跨链批量会失败。

### 字段说明 <a href="#e5-a-d-97-e6-ae-b5-e8-af-b4-e6-98-8e" id="e5-a-d-97-e6-ae-b5-e8-af-b4-e6-98-8e"></a>

#### `from` <a href="#from" id="from"></a>

* 授权来源账户（用户 EOA / 智能账户）。
* 连接单账户时可省略，由钱包使用当前活跃账户。

#### `to` <a href="#to" id="to"></a>

* **DApp/Agent Session Account / Delegate 地址**，即权限接收者。
* 后续使用该权限 redeem 时，应由该地址作为执行/签名主体。

#### `isAdjustmentAllowed` <a href="#isadjustmentallowed" id="isadjustmentallowed"></a>

* `true`：允许钱包在用户确认前调整该权限的授权范围，例如额度、周期、流速、有效期等钱包支持编辑的字段。DApp/Agent 必须以钱包最终返回的 permission 为准。
* `false`：用户不可调整该权限参数，适合 DApp/Agent 要求固定授权条件的场景。

#### `justification` <a href="#justification" id="justification"></a>

* 展示给用户的授权说明文案，应清晰描述用途。

#### 数量字段 <a href="#e6-95-b0-e9-87-8f-e5-a-d-97-e6-ae-b5" id="e6-95-b0-e9-87-8f-e5-a-d-97-e6-ae-b5"></a>

`periodAmount`、`initialAmount`、`maxAmount`、`amountPerSecond` 等金额字段使用 **hex 编码的最小单位**（RPC quantity）：

```typescript
import { parseUnits, toHex } from "viem";

toHex(parseUnits("10", 18)); // ERC-20，18 位精度
toHex(parseUnits("10", 6)); // USDC，6 位精度
```

`periodDuration`、`startTime`、`rules[].data.timestamp` 使用普通 **number**。

### 权限类型速查 <a href="#e6-9d-83-e9-99-90-e7-b1-bb-e5-9e-8b-e9-80-9f-e6-9f-a5" id="e6-9d-83-e9-99-90-e7-b1-bb-e5-9e-8b-e9-80-9f-e6-9f-a5"></a>

| 类型                      | 文档         |
| ----------------------- | ---------- |
| `erc20-token-periodic`  | ERC-20 周期性 |
| `erc20-token-stream`    | ERC-20 流式  |
| `native-token-periodic` | 原生币周期性     |
| `native-token-stream`   | 原生币流式      |

### 错误处理 <a href="#e9-94-99-e8-af-af-e5-a4-84-e7-90-86" id="e9-94-99-e8-af-af-e5-a4-84-e7-90-86"></a>

常见失败原因：

* 权限类型或链不受支持
* 参数格式错误（如 `amountPerSecond` 为 0）
* 用户拒绝授权
* `stream` 类型 `maxAmount < initialAmount`
* 批量请求包含多个 `chainId`

```typescript
try {
  const granted = await provider.request({
    method: "wallet_requestExecutionPermissions",
    params: [request],
  });
} catch (error) {
  // EIP-1193 错误
}
```

### 授权后的步骤 <a href="#e6-8e-88-e6-9d-83-e5-90-8e-e7-9a-84-e6-a-d-a5-e9-aa-a4" id="e6-8e-88-e6-9d-83-e5-90-8e-e7-9a-84-e6-a-d-a5-e9-aa-a4"></a>

1. 保存 `context`、`delegationManager` 及完整 `permission` 数据。
2. 由 Session Account 调用 `redeemDelegations`
