> For the complete documentation index, see [llms.txt](/llms.txt).

# Use native token permissions

[Advanced Permissions (ERC-7715)](/smart-accounts-kit/concepts/advanced-permissions/) supports native token permission types that allow you to request fine-grained permissions for native token transfers with periodic, or streaming conditions, depending on your use case.

## Prerequisites[​](#prerequisites "Direct link to Prerequisites")

- [Install and set up the Smart Accounts Kit.](/smart-accounts-kit/get-started/install/)
- [Configure the Smart Accounts Kit.](/smart-accounts-kit/guides/configure-toolkit/)
- [Create a session account.](/smart-accounts-kit/guides/advanced-permissions/execute-on-metamask-users-behalf/#3-set-up-a-session-account)

## Native token periodic permission[​](#native-token-periodic-permission "Direct link to Native token periodic permission")

This permission type ensures a per-period limit for native token transfers. At the start of each new period, the allowance resets.

For example, a user signs an ERC-7715 permission that lets a dapp spend up to 0.001 ETH on their behalf each day. The dapp can transfer a total of 0.001 ETH per day; the limit resets at the beginning of the next day.

See the [native token periodic permission API reference](/smart-accounts-kit/reference/advanced-permissions/permissions/#native-token-periodic-permission) for more information.

- example.ts
- client.ts

```
import { sepolia as chain } from 'viem/chains'
import { parseEther } from 'viem'
import { walletClient } from './client.ts'

// Since current time is in seconds, convert milliseconds to seconds.
const currentTime = Math.floor(Date.now() / 1000)
// 1 week from now.
const expiry = currentTime + 604800

const grantedPermissions = await walletClient.requestExecutionPermissions([
  {
    chainId: chain.id,
    expiry,
    // The requested permissions will be granted to the
    // session account.
    to: sessionAccount.address,
    permission: {
      type: 'native-token-periodic',
      data: {
        // 0.001 ETH in wei format.
        periodAmount: parseEther('0.001'),
        // 1 hour in seconds.
        periodDuration: 86400,
        startTime: currentTime,
        justification: 'Permission to use 0.001 ETH every day',
      },
      isAdjustmentAllowed: true,
    },
  },
])

```

```
import { createWalletClient, custom } from 'viem'
import { erc7715ProviderActions } from '@metamask/smart-accounts-kit/actions'

export const walletClient = createWalletClient({
  transport: custom(window.ethereum),
}).extend(erc7715ProviderActions())

```

## Native token stream permission[​](#native-token-stream-permission "Direct link to Native token stream permission")

This permission type ensures a linear streaming transfer limit for native tokens. Token transfers are blocked until the defined start timestamp. At the start, a specified initial amount is released, after which tokens accrue linearly at the configured rate, up to the maximum allowed amount.

For example, a user signs an ERC-7715 permission that allows a dapp to spend 0.0001 ETH per second, starting with an initial amount of 0.1 ETH, up to a maximum of 1 ETH.

See the [native token stream permission API reference](/smart-accounts-kit/reference/advanced-permissions/permissions/#native-token-stream-permission) for more information.

- example.ts
- client.ts

```
import { sepolia as chain } from 'viem/chains'
import { parseEther } from 'viem'
import { walletClient } from './client.ts'

// Since current time is in seconds, convert milliseconds to seconds.
const currentTime = Math.floor(Date.now() / 1000)
// 1 week from now.
const expiry = currentTime + 604800

const grantedPermissions = await walletClient.requestExecutionPermissions([
  {
    chainId: chain.id,
    expiry,
    // The requested permissions will be granted to the
    // session account.
    to: sessionAccount.address,
    permission: {
      type: 'native-token-stream',
      data: {
        // 0.0001 ETH in wei format.
        amountPerSecond: parseEther('0.0001'),
        // 0.1 ETH in wei format.
        initialAmount: parseEther('0.1'),
        // 1 ETH in wei format.
        maxAmount: parseEther('1'),
        startTime: currentTime,
        justification: 'Permission to use 0.0001 ETH per second',
      },
      isAdjustmentAllowed: true,
    },
  },
])

```

```
import { createWalletClient, custom } from 'viem'
import { erc7715ProviderActions } from '@metamask/smart-accounts-kit/actions'

export const walletClient = createWalletClient({
  transport: custom(window.ethereum),
}).extend(erc7715ProviderActions())

```
