Skip to main content

Installation

npm install @biconomy/abstractjs viem

Basic Setup

import { 
  createMeeClient, 
  toMultichainNexusAccount,
  getMEEVersion,
  MEEVersion 
} from "@biconomy/abstractjs";
import { http } from "viem";
import { privateKeyToAccount } from "viem/accounts";
import { base, optimism } from "viem/chains";

// 1. Create a signer (user's wallet)
const signer = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);

// 2. Create multichain account
const account = await toMultichainNexusAccount({
  signer,
  chainConfigurations: [
    { chain: optimism, transport: http(), version: getMEEVersion(MEEVersion.V2_1_0) },
    { chain: base, transport: http(), version: getMEEVersion(MEEVersion.V2_1_0) }
  ]
});

// 3. Create MEE client
const meeClient = await createMeeClient({ account });
Lazy Deployment: Accounts aren’t deployed until the first transaction on each chain. Only addresses are calculated upfront.

Configuration Options

Account Parameters

ParameterDescriptionRequired
signerUser wallet (EOA) that owns the accountYes
chainConfigurationsArray of chain configsYes
chainConfigurations[].chainViem chain objectYes
chainConfigurations[].transportRPC transportYes
chainConfigurations[].versionMEE versionYes
chainConfigurations[].accountAddressOverride for EIP-7702No

MEE Client Parameters

ParameterDescriptionRequired
accountThe multichain accountYes
apiKeyAPI key for sponsorshipNo

EIP-7702 Mode

For embedded wallets (Privy, Dynamic, Turnkey), use EIP-7702 by setting accountAddress to the EOA:
const account = await toMultichainNexusAccount({
  signer,
  chainConfigurations: [
    { 
      chain: base, 
      transport: http(), 
      version: getMEEVersion(MEEVersion.V2_1_0),
      accountAddress: signer.address  // Use EOA directly
    }
  ]
});
This enables smart account features on the EOA itself via delegation.

Get Account Addresses

// Get address on a specific chain
const baseAddress = account.addressOn(base.id);

// Get address with strict mode (throws if chain is not defined in chainConfigurations)
const strictAddress = account.addressOn(base.id, true);
Both calls return the same address. The true flag enables strict mode, which throws an error if the chain is not defined in your chainConfigurations. This helps catch configuration mistakes early.

Next Steps