Skip to content
Binary file added delegation-toolkit/assets/erc7715-request.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
64 changes: 64 additions & 0 deletions delegation-toolkit/concepts/erc7715.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
---
description: Learn about MetaMask ERC-7715 permissions.
keywords: [ERC-7715, 7715, permissions, wallet, smart account]
---

# ERC-7715 permissions

The Delegation Toolkit supports [ERC-7715](https://eips.ethereum.org/EIPS/eip-7715), which lets you request fine-grained permissions from a MetaMask user to execute transactions on their behalf.
For example, a user can grant your dapp permission to spend 10 USDC per day to buy ETH over the course of a month.
Once the permission is granted, your dapp can use the allocated 10 USDC each day to purchase ETH directly from the MetaMask user's account.

ERC-7715 eliminates the need for users to approve every transaction, which is useful for highly interactive dapps.
It also enables dapps to execute transactions for users without an active wallet connection.

:::note
This feature requires [MetaMask Flask 12.14.2](/snaps/get-started/install-flask) or later.
:::

## ERC-7715 technical overview

[ERC-7715](https://eips.ethereum.org/EIPS/eip-7715) defines a JSON-RPC method `wallet_grantPermissions`.
Dapps can use this method to request a wallet to grant the dapp permission to execute transactions on a user's behalf.
`wallet_grantPermissions` requires a `signer` parameter, which identifies the entity requesting or managing the permission.
Common signer implementations include wallet signers, single key and multisig signers, and account signers.

The Delegation Toolkit supports multiple types of signers, but [an account signer is used in this documentation's examples](../guides/erc7715/execute-on-metamask-users-behalf.md) as a common implementation.
With an account signer, a session account is created and used for the single purpose of requesting and redeeming ERC-7715 permissions, and does not contain tokens.
The session account can be granted with permissions and redeem them as specified in [ERC-7710](https://eips.ethereum.org/EIPS/eip-7710).
The session account can be a smart account or an externally owned account (EOA).

The MetaMask user that the session account requests permissions from must be upgraded to a [MetaMask smart account](smart-accounts.md).

## ERC-7715 vs. delegations

ERC-7715 expands on regular [delegations](delegation/index.md) by enabling permission sharing *via the MetaMask browser extension*.

With regular delegations, the dapp constructs a delegation and requests the user to sign it.
These delegations are not human-readable, so it is the dapp's responsibility to provide context for the user.
Regular delegations cannot be signed through the MetaMask extension, because if a dapp requests a delegation without constraints, the whole wallet can be exposed to the dapp.

In contrast, ERC-7715 enables dapps (and AI agents) to request permissions from a user directly via the MetaMask extension.
ERC-7715 requires a permission configuration which displays a human-readable confirmation for the MetaMask user.
The user can modify the permission parameters if the request is configured to allow adjustments.

For example, the following ERC-7715 permission request displays a rich UI including the start time, amount, and period duration for an [ERC-20 token periodic transfer](../guides/erc7715/use-permissions/erc20-token.md#erc-20-periodic-permission):

<p align="center">
<img src={require("../assets/erc7715-request.png").default} alt="ERC-7715 request" width="450px" class="appScreen" />
</p>

## ERC-7715 permissions lifecycle

The ERC-7715 permissions lifecycle is as follows:

1. **Set up a session account** - Set up a session account to execute transactions on behalf of the MetaMask user.
It can be a [smart account](smart-accounts.md) or an externally owned account (EOA).

2. **Request permissions** - Request permissions from the user.
The Delegation Toolkit supports [ERC-20 token permissions](../guides/erc7715/use-permissions/erc20-token.md) and
[native token permissions](../guides/erc7715/use-permissions/native-token.md).

4. **Redeem permissions** - Once the permission is granted, the session account can redeem the permission, executing on the user's behalf.

See [how to perform executions on a MetaMask user's behalf](../guides/erc7715/execute-on-metamask-user-behalf.md) to get started with the ERC-7715 lifecycle.
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import TabItem from "@theme/TabItem";

# Perform executions on a MetaMask user's behalf

The Delegation Toolkit supports [ERC-7715](https://eips.ethereum.org/EIPS/eip-7715), which lets you request fine-grained permissions from a MetaMask user to execute transactions on their
[ERC-7715 permissions](../../concepts/erc7715.md) are fine-grained permissions that your dapp can request from a MetaMask user to execute transactions on their
behalf. For example, a user can grant your dapp permission to spend 10 USDC per day to buy ETH over the course
of a month. Once the permission is granted, your dapp can use the allocated 10 USDC each day to
purchase ETH directly from the MetaMask user's account.
Expand Down Expand Up @@ -41,7 +41,7 @@ const walletClient = createWalletClient({
### 2. Set up a Public Client

Set up a [Viem Public Client](https://viem.sh/docs/clients/public) using Viem's `createPublicClient` function.
This client will help you query the account state and interact with blockchain network.
This client will help you query the account state and interact with the blockchain network.

```typescript
import { createPublicClient, http } from "viem";
Expand All @@ -60,7 +60,7 @@ to request ERC-7715 permissions. This account is responsible for executing trans
on behalf of the user.

<Tabs>
<TabItem value="Smart Account">
<TabItem value="Smart account">

```typescript
import { privateKeyToAccount } from "viem/accounts";
Expand Down Expand Up @@ -97,8 +97,9 @@ const sessionAccount = privateKeyToAccount("0x...");

### 4. Request ERC-7715 permissions

Request ERC-7715 permissions from the user. In this example, you'll request an ERC-20 periodic
permission using the Wallet Client's [`requestExecutionPermissions`](../../reference/erc7715/wallet-client.md#requestexecutionpermissions) action.
Request ERC-7715 permissions from the user. In this example, you'll request an
[ERC-20 periodic permission](use-permissions/erc20-token.md#erc-20-periodic-permission) using the Wallet Client's
[`requestExecutionPermissions`](../../reference/erc7715/wallet-client.md#requestexecutionpermissions) action.

```typescript
import { sepolia as chain } from "viem/chains";
Expand Down Expand Up @@ -261,4 +262,9 @@ export const calldata = encodeFunctionData({
```

</TabItem>
</Tabs>
</Tabs>

## Next steps

See how to configure different [ERC-20 token permissions](use-permissions/erc20-token.md) and
[native token permissions](use-permissions/native-token.md).
4 changes: 3 additions & 1 deletion delegation-toolkit/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ keywords: [MetaMask, delegation toolkit, smart accounts]

import CardList from "@site/src/components/CardList"

# Embed MetaMask Smart Accounts using the Delegation Toolkit
# Create MetaMask Smart Accounts using the Delegation Toolkit

The MetaMask Delegation Toolkit is a [Viem](https://viem.sh/)-based collection of tools for embedding [MetaMask Smart Accounts](concepts/smart-accounts.md) into dapps.
Smart accounts support programmable account behavior and advanced features like delegated permissions, multi-signature approvals, and gas abstraction.
Expand All @@ -16,6 +16,8 @@ Smart accounts support programmable account behavior and advanced features like
Delegation is powered by the toolkit's Delegation Framework, which defines how
permissions are created, shared, and enforced.

MetaMask Smart Accounts also support [ERC-7715 permissions](concepts/erc7715.md), which are fine-grained permissions dapps can request from users directly via the MetaMask browser extension.

## Why use the toolkit?

The toolkit enables developers to create frictionless new experiences based on programmable account behavior and granular permission
Expand Down
1 change: 1 addition & 0 deletions gator-sidebar.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ const sidebar = {
'concepts/delegation/caveat-enforcers',
],
},
'concepts/erc7715',
],
},
{
Expand Down
Loading