| description | Get started quickly with the MetaMask Smart Accounts |
|---|---|
| sidebar_label | Smart account quickstart |
You can get started quickly with MetaMask Smart Accounts by creating your first smart account and sending a user operation.
Install the MetaMask Delegation Toolkit:
npm install @metamask/delegation-toolkitSet up a Viem Public Client using Viem's createPublicClient function. This client will let the smart account query the signer's account state and interact with blockchain network.
import { createPublicClient, http } from "viem";
import { sepolia as chain } from "viem/chains";
const publicClient = createPublicClient({
chain,
transport: http(),
});Set up a Viem Bundler Client using Viem's createBundlerClient function. This lets you use the bundler service to estimate gas for user operations and submit transactions to the network.
import { createBundlerClient } from "viem/account-abstraction";
const bundlerClient = createBundlerClient({
client: publicClient,
transport: http("https://your-bundler-rpc.com"),
});Create a MetaMask smart account to send the first user operation.
This example configures a Hybrid smart account, which is a flexible smart account implementation that supports both an externally owned account (EOA) owner and any number of passkey (WebAuthn) signers:
import { Implementation, toMetaMaskSmartAccount } from "@metamask/delegation-toolkit";
import { privateKeyToAccount } from "viem/accounts";
const account = privateKeyToAccount("0x...");
const smartAccount = await toMetaMaskSmartAccount({
client: publicClient,
implementation: Implementation.Hybrid,
deployParams: [account.address, [], [], []],
deploySalt: "0x",
signer: { account },
});Send a user operation using Viem's sendUserOperation method.
See Send a user operation to learn how to estimate fee per gas, and wait for the transaction receipt.
The smart account will remain counterfactual until the first user operation. If the smart account is not deployed, it will be automatically deployed upon the sending first user operation.
import { parseEther } from "viem";
// Appropriate fee per gas must be determined for the specific bundler being used.
const maxFeePerGas = 1n;
const maxPriorityFeePerGas = 1n;
const userOperationHash = await bundlerClient.sendUserOperation({
account: smartAccount,
calls: [
{
to: "0x1234567890123456789012345678901234567890",
value: parseEther("1"),
},
],
maxFeePerGas,
maxPriorityFeePerGas,
});- To grant specific permissions to other accounts from your smart account, create a delegation.
- This quickstart example uses a Hybrid smart account. You can also configure other smart account types.
- To upgrade an EOA to a smart account, see the EIP-7702 quickstart.
- To quickly bootstrap a MetaMask Smart Accounts project, use the CLI.