Skip to main content

MetaMask Smart Accounts quickstart

You can get started quickly with MetaMask Smart Accounts by creating your first smart accountMetaMask smart account A single MetaMask Smart Account used to execute transactions through smart-contract account logic. and sending a user operationUser operation An ERC-4337 signed instruction package that tells a smart account what execution(s) to perform..

Prerequisites

  • Install Node.js v18 or later.
  • Install Yarn, npm, or another package manager.

Steps

1. Install the Smart Accounts Kit

Install the Smart Accounts Kit:

npm install @metamask/smart-accounts-kit

2. Set up a Public Client

Set up a Public ClientPublic Client A read-focused blockchain client used to fetch onchain state, simulate calls, and monitor transactions. using Viem's createPublicClient function. This client will let the smart account query the signer's account state and interact with the blockchain network.

import { createPublicClient, http } from "viem";
import { sepolia as chain } from "viem/chains";

const publicClient = createPublicClient({
chain,
transport: http(),
});

3. Set up a Bundler Client

Set up a Bundler ClientBundler Client A client for submitting ERC-4337 user operations to bundler infrastructure for inclusion onchain. using Viem's createBundlerClient function. This lets you use the bundler service to estimate gas for user operationsUser operation An ERC-4337 signed instruction package that tells a smart account what execution(s) to perform. and submit transactions to the network.

import { createBundlerClient } from "viem/account-abstraction";

const bundlerClient = createBundlerClient({
client: publicClient,
transport: http("https://your-bundler-rpc.com"),
});

4. Create a MetaMask smart account

Create a MetaMask smart accountMetaMask smart account A single MetaMask Smart Account used to execute transactions through smart-contract account logic. to send the first user operationUser operation An ERC-4337 signed instruction package that tells a smart account what execution(s) to perform..

This example configures a Hybrid smart accountHybrid smart account A smart account implementation that supports both an EOA owner and passkey signers., which is a flexible smart account implementation that supports both an EOAEOA A private-key-controlled account with no built-in programmable execution logic. owner and any number of passkey (WebAuthn) signers:

import { Implementation, toMetaMaskSmartAccount } from "@metamask/smart-accounts-kit";
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 },
});

See Create a MetaMask smart account to learn how to configure different smart account types.

5. Send a user operation

Send a user operationUser operation An ERC-4337 signed instruction package that tells a smart account what execution(s) to perform. using Viem's sendUserOperation method.

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,
});

See Send a user operation to learn how to estimate fee per gas, and wait for the transaction receipt.

Next steps