> For the complete documentation index, see [llms.txt](https://help.tokenpocket.pro/developer-en/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-en/agentic-wallet/eip-7715-account-with-permissions/available-permissions/native-token-permissions.md).

# Native Token Permissions

TokenPocket supports two execution permission types for native tokens (ETH, BNB, POL, etc.): **periodic** and **streaming**. Similar to ERC-20 permissions, but `permission.data` does not require `tokenAddress`.

### Common Fields <a href="#common-fields" id="common-fields"></a>

| Field           | Description                                 |
| --------------- | ------------------------------------------- |
| `justification` | Authorization description shown to the user |
| `chainId`       | Hex string, e.g. `"0x38"` for BNB Chain     |

All amounts use hex-encoded smallest units (typically 18-decimal wei).

***

### Native Token Periodic Permission `native-token-periodic` <a href="#native-token-periodic-permission-native-token-periodic" id="native-token-periodic-permission-native-token-periodic"></a>

Maximum native token amount allowed per period; the allowance resets each new period.

#### Use Cases <a href="#use-cases" id="use-cases"></a>

* Daily Gas subsidy cap
* Periodic native token recurring investment
* Limit the amount of BNB/ETH a Relayer can withdraw per day

#### `permission.data` Fields <a href="#permissiondata-fields" id="permissiondata-fields"></a>

| Field            | Type     | Description                     |
| ---------------- | -------- | ------------------------------- |
| `periodAmount`   | hex      | Maximum amount per period (wei) |
| `periodDuration` | `number` | Period length in seconds        |
| `justification`  | `string` | Authorization description       |

#### Example: 0.01 BNB per Day <a href="#example-001-bnb-per-day" id="example-001-bnb-per-day"></a>

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

const expiry = Math.floor(Date.now() / 1000) + 7 * 86400;

await provider.request({
  method: "wallet_requestExecutionPermissions",
  params: [
    {
      chainId: "0x38",
      to: sessionAddress,
      permission: {
        type: "native-token-periodic",
        isAdjustmentAllowed: true,
        data: {
          periodAmount: toHex(parseUnits("0.01", 18)),
          periodDuration: 86400,
          justification: "Allow DApp/Agent to transfer up to 0.01 BNB per day",
        },
      },
      rules: [{ type: "expiry", data: { timestamp: expiry } }],
    },
  ],
});
```

#### Redeem Execution Content <a href="#redeem-execution-content" id="redeem-execution-content"></a>

Native token transfers carry `value` directly in the `execution` struct:

```typescript
const execution = {
  target: payeeAddress,
  value: amountInWei,
  callData: "0x",
};
```

***

### Native Token Streaming Permission `native-token-stream` <a href="#native-token-streaming-permission-native-token-stream" id="native-token-streaming-permission-native-token-stream"></a>

Native token allowance is released linearly per second. Rules are the same as ERC-20 stream, but no token contract is involved.

#### Use Cases <a href="#use-cases-1" id="use-cases-1"></a>

* Streaming Gas sponsorship
* Automatic withdrawal of staking rewards released over time
* Smoothly rate-limited native token auto-payments

#### `permission.data` Fields <a href="#permissiondata-fields-1" id="permissiondata-fields-1"></a>

| Field             | Type     | Description                     |
| ----------------- | -------- | ------------------------------- |
| `initialAmount`   | hex      | Starting available amount (wei) |
| `maxAmount`       | hex      | Cumulative cap (wei)            |
| `amountPerSecond` | hex      | Amount added per second (wei)   |
| `startTime`       | `number` | Start time (Unix seconds)       |
| `justification`   | `string` | Authorization description       |

#### Example: Streaming ETH Authorization <a href="#example-streaming-eth-authorization" id="example-streaming-eth-authorization"></a>

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

const now = Math.floor(Date.now() / 1000);

await provider.request({
  method: "wallet_requestExecutionPermissions",
  params: [
    {
      chainId: "0x1",
      to: sessionAddress,
      permission: {
        type: "native-token-stream",
        isAdjustmentAllowed: false,
        data: {
          initialAmount: toHex(parseUnits("0.001", 18)),
          maxAmount: toHex(parseUnits("0.1", 18)),
          amountPerSecond: toHex(parseUnits("0.00001", 18)),
          startTime: now,
          justification: "Streaming ETH authorization for automated Gas subsidies",
        },
      },
      rules: [{ type: "expiry", data: { timestamp: now + 30 * 86400 } }],
    },
  ],
});
```

#### Allowance Calculation <a href="#allowance-calculation" id="allowance-calculation"></a>

Same as ERC-20 stream:

```
available = min(initialAmount + amountPerSecond × (now - startTime), maxAmount) - used
```
