Delegation API reference
The following API methods are related to creating and managing delegations.
createCaveatBuilder
Builds an array of caveats.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
environment | SmartAccountsEnvironment | Yes | Environment to resolve the smart contracts for the current chain. |
config | CaveatBuilderConfig | No | Configuration for CaveatBuilder. |
Example
- example.ts
- config.ts
import { createCaveatBuilder } from "@metamask/smart-accounts-kit";
import { delegatorSmartAccount } from "./config.ts";
const caveats = createCaveatBuilder(delegatorSmartAccount.environment)
import {
Implementation,
toMetaMaskSmartAccount,
} from "@metamask/smart-accounts-kit";
import { createWalletClient, createPublicClient, http } from "viem";
import { privateKeyToAccount } from "viem/accounts";
import { sepolia as chain } from "viem/chains";
const publicClient = createPublicClient({
chain,
transport: http(),
});
const delegatorAccount = privateKeyToAccount("0x...");
export const delegatorSmartAccount = await toMetaMaskSmartAccount({
client: publicClient,
implementation: Implementation.Hybrid,
deployParams: [delegatorAccount.address, [], [], []],
deploySalt: "0x",
signer: { account: delegatorAccount },
});
Allow empty caveats
To create an empty caveat collection, set the CaveatBuilderConfig.allowEmptyCaveats to true.
import { createCaveatBuilder } from "@metamask/smart-accounts-kit";
// The config.ts is the same as in the previous example.
import { delegatorSmartAccount } from "./config.ts";
const caveats = createCaveatBuilder(delegatorSmartAccount.environment, {
allowEmptyCaveats: true,
});
createDelegation
Creates a delegation with a specific delegate.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
from | Hex | Yes | The address that is granting the delegation. |
to | Hex | Yes | The address to which the delegation is being granted. |
scope | ScopeConfig | Yes | The scope of the delegation that defines the initial authority. |
environment | SmartAccountsEnvironment | Yes | The environment used by the toolkit to define contract addresses for interacting with the Delegation Framework contracts. |
caveats | Caveats | No | Caveats that further refine the authority granted by the scope. |
parentDelegation | Delegation | Hex | No | The parent delegation or its corresponding hex to create a delegation chain. |
salt | Hex | No | The salt for generating the delegation hash. This helps prevent hash collisions when creating identical delegations. |
Example
import { createDelegation, getSmartAccountsEnvironment } from "@metamask/smart-accounts-kit";
import { sepolia } from "viem/chains";
import { parseEther } from "viem";
const delegation = createDelegation({
// Address that is granting the delegation
from: "0x7E48cA6b7fe6F3d57fdd0448B03b839958416fC1",
// Address to which the delegation is being granted
to: "0x2B2dBd1D5fbeB77C4613B66e9F35dBfE12cB0488",
// Alternatively you can use environment property of MetaMask smart account.
environment: getSmartAccountsEnvironment(sepolia.id),
scope: {
type: "nativeTokenTransferAmount",
// 0.001 ETH in wei format.
maxAmount: parseEther("0.001"),
},
});
createOpenDelegation
Creates an open delegation that can be redeemed by any delegate.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
from | Hex | Yes | The address that is granting the delegation. |
scope | ScopeConfig | Yes | The scope of the delegation that defines the initial authority. |
environment | SmartAccountsEnvironment | Yes | The environment used by the toolkit to define contract addresses for interacting with the Delegation Framework contracts. |
caveats | Caveats | No | Caveats that further refine the authority granted by the scope. |
parentDelegation | Delegation | Hex | No | The parent delegation or its corresponding hex to create a delegation chain. |
salt | Hex | No | The salt for generating the delegation hash. This helps prevent hash collisions when creating identical delegations. |
Example
import { createOpenDelegation, getSmartAccountsEnvironment } from "@metamask/smart-accounts-kit";
import { sepolia } from "viem/chains";
import { parseEther } from "viem";
const delegation = createOpenDelegation({
// Address that is granting the delegation
from: "0x7E48cA6b7fe6F3d57fdd0448B03b839958416fC1",
// Alternatively you can use environment property of MetaMask smart account.
environment: getSmartAccountsEnvironment(sepolia.id),
scope: {
type: "nativeTokenTransferAmount",
// 0.001 ETH in wei format.
maxAmount: parseEther("0.001"),
},
});
createExecution
Creates an ExecutionStruct instance.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
target | Address | No | Address of the contract or recipient that the call is directed to. |
value | bigint | No | Value of native tokens to send along with the call in wei. |
callData | Hex | No | Encoded function data or payload to be executed on the target address. |
Example
import { createExecution } from "@metamask/smart-accounts-kit";
import { parseEther } from "viem";
// Creates an ExecutionStruct to transfer 0.01 ETH to
// 0xe3C818389583fDD5cAC32f548140fE26BcEaE907 address.
const execution = createExecution({
target: "0xe3C818389583fDD5cAC32f548140fE26BcEaE907",
// 0.01 ETH in wei
value: parseEther("0.01"),
callData: "0x",
});
decodeDelegations
Decodes an ABI-encoded hex string to an array of delegations.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
encoded | Hex | Yes | The ABI encoded hex string to decode. |
Example
import { decodeDelegations } from "@metamask/smart-accounts-kit/utils";
const delegations = decodeDelegations("0x7f0db33d..c06aeeac");
deploySmartAccountsEnvironment
Deploys the Delegation Framework contracts to an EVM chain.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
walletClient | WalletClient | Yes | Viem Wallet Client to deploy the contracts. |
publicClient | PublicClient | Yes | Viem Public Client to interact with the given chain. |
chain | Chain | Yes | Viem Chain where you wish to deploy the Delegation Framework contracts. |
deployedContracts | { [contract: string]: Hex } | No | Allows overriding specific contract addresses when calling the function. For example, if certain contracts have already been deployed on the target chain, their addresses can be provided directly to the function. |
Example
- example.ts
- config.ts
import { deploySmartAccountsEnvironment } from "@metamask/smart-accounts-kit/utils";
import { walletClient, publicClient } from "./config.ts";
import { sepolia as chain } from "viem/chains";
const environment = await deploySmartAccountsEnvironment(
walletClient,
publicClient,
chain
);
import { privateKeyToAccount } from "viem/accounts";
import { sepolia as chain } from "viem/chains";
import { http, createWalletClient, createPublicClient } from "viem";
// Your deployer wallet private key.
const privateKey = "0x123..";
const account = privateKeyToAccount(privateKey);
export const walletClient = createWalletClient({
account,
chain,
transport: http()
});
export const publicClient = createPublicClient({
transport: http(),
chain,
});
Inject deployed contracts
Once the contracts are deployed, you can use them to override the delegator
environment using overrideDeployedEnvironment.
import { walletClient, publicClient } from "./config.ts";
import { sepolia as chain } from "viem/chains";
import { SmartAccountsEnvironment } from "@metamask/smart-accounts-kit";
import {
overrideDeployedEnvironment,
deploySmartAccountsEnvironment,
} from "@metamask/smart-accounts-kit/utils";
const environment: SmartAccountsEnvironment = await deploySmartAccountsEnvironment(
walletClient,
publicClient,
chain
);
overrideDeployedEnvironment(
chain.id,
"1.3.0",
environment,
);
disableDelegation
Encodes the calldata for disabling a delegation.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
delegation | Delegation | Yes | The delegation to be disabled. |
Example
- example.ts
- delegation.ts
import { DelegationManager } from "@metamask/smart-accounts-kit/contracts";
import { delegation } from "./delegation.ts";
const disableDelegationData = DelegationManager.encode.disableDelegation({
delegation,
});
import { createDelegation } from "@metamask/smart-accounts-kit";
import { sepolia } from "viem/chains";
import { parseEther } from "viem";
export const delegation = createDelegation({
from: "0x7E48cA6b7fe6F3d57fdd0448B03b839958416fC1",
to: "0x2B2dBd1D5fbeB77C4613B66e9F35dBfE12cB0488",
environment: getSmartAccountsEnvironment(sepolia.id),
scope: {
type: "nativeTokenTransferAmount",
// 0.001 ETH in wei format.
maxAmount: parseEther("0.001"),
},
});
encodeDelegations
Encodes an array of delegations to an ABI-encoded hex string.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
delegations | Delegation[] | Yes | The delegation array to be encoded. |
Example
- example.ts
- delegation.ts
import { encodeDelegations } from "@metamask/smart-accounts-kit/utils";
import { delegation } from "./delegation.ts";
const encodedDelegations = encodeDelegations([delegation]);
import { createDelegation } from "@metamask/smart-accounts-kit";
import { sepolia } from "viem/chains";
import { parseEther } from "viem";
export const delegation = createDelegation({
from: "0x7E48cA6b7fe6F3d57fdd0448B03b839958416fC1",
to: "0x2B2dBd1D5fbeB77C4613B66e9F35dBfE12cB0488",
environment: getSmartAccountsEnvironment(sepolia.id),
scope: {
type: "nativeTokenTransferAmount",
// 0.001 ETH in wei format.
maxAmount: parseEther("0.001"),
},
});
getDelegationHashOffchain
Returns the delegation hash.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
input | Delegation | Yes | The delegation object to hash. |
Example
- example.ts
- config.ts
import { getDelegationHashOffchain } from "@metamask/smart-accounts-kit/utils";
import { delegation } from "./config.ts";
const delegationHash = getDelegationHashOffchain(delegation);
import {
getSmartAccountsEnvironment,
createDelegation,
} from "@metamask/smart-accounts-kit";
import { parseEther } from "viem";
import { sepolia } from "viem/chains";
const environment = getSmartAccountsEnvironment(sepolia.id);
// The address to which the delegation is granted. It can be an EOA address, or
// smart account address.
const delegate = "0x2FcB88EC2359fA635566E66415D31dD381CF5585";
export const delegation = createDelegation({
to: delegate,
// Address that is granting the delegation.
from: "0x7E48cA6b7fe6F3d57fdd0448B03b839958416fC1",
environment,
scope: {
type: "nativeTokenTransferAmount",
// 0.001 ETH in wei format.
maxAmount: parseEther("0.001"),
},
});
getSmartAccountsEnvironment
Resolves the SmartAccountsEnvironment for a chain.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
chainId | number | Yes | The chain ID of the network for which the SmartAccountsEnvironment should be resolved. |
version | SupportedVersion | No | Specifies the version of the Delegation Framework contracts to use. If omitted, the latest supported version will be used by default. |
Example
import { getSmartAccountsEnvironment } from "@metamask/smart-accounts-kit";
import { sepolia } from "viem/chains";
const environment = getSmartAccountsEnvironment(sepolia.id)