Guide

Getting started

Stand up a Viem client on an EIP-8130-enabled chain, register the chain id, and resolve canonical deployment addresses. Then you are ready to create an account and send a transaction.

Install

EIP-8130 helpers live under the dedicated viem/eip8130 entrypoint on the viem fork (payer helpers under viem/eip8168). Standalone actions take a Viem Client as their first argument (e.g. sendTransaction(client, …)). You can also fold them onto a client with the eip8130Actions() decorator, which exposes them under client.eip8130.*.

Installbash
bun add "viem@github:chunter-cb/viem#feat/eip-8130-production"
Importsts
import { newSmartAccount, sendTransaction } from 'viem/eip8130'
import { createPayerClient } from 'viem/eip8168'

Client setup

Configure a client for your 8130-enabled chain and call register8130Chains so routing helpers know the chain speaks native AA. Use the public RPC https://rpc.vibes.base.org for reads and eth_sendRawTransaction.

Vibenet clientts
import { createClient, http, defineChain } from 'viem'
import { eip8130ChainConfig, register8130Chains } from 'viem/eip8130'
export const vibenet = defineChain({
// Spread eip8130ChainConfig so core client.sendTransaction submits a native
// AA tx (type 0x79) and client.getTransactionReceipt returns .eip8130 fields.
...eip8130ChainConfig,
id: 84_538_453,
name: 'Vibenet Devnet',
nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },
rpcUrls: { default: { http: ['https://rpc.vibes.base.org'] } },
})
export const client = createClient({ chain: vibenet, transport: http() })
// Mark the chain as EIP-8130 enabled (empty by default).
register8130Chains(vibenet.id)

Prefer explicit actions? Extend the client with eip8130Actions() to expose client.eip8130.sendTransaction, prepareTransactionRequest, estimateGas, validateSignature, and more.

Actions decoratorts
import { eip8130Actions } from 'viem/eip8130'
// Optional decorator: exposes the standalone actions under client.eip8130.*
export const aa = client.extend(eip8130Actions())
// aa.eip8130.sendTransaction / prepareTransactionRequest / estimateGas / …

Deployment addresses

Resolve per-chain implementation and policy addresses with getEip8130Deployment(chainId). Every contract is deployed via a deterministic CREATE2 factory, so the addresses are identical on every supported chain. The Keystore is enshrined and not part of the deployment: import keystoreAddress (0x813012Bd8D971928475235BBac6F0488c4A100AC) directly.

Per-chain deploymentts
import { getEip8130Deployment, keystoreAddress } from 'viem/eip8130'
const deployment = getEip8130Deployment(client.chain.id)
if (!deployment?.policies) {
throw new Error(`No EIP-8130 policies for chain ${client.chain.id}`)
}
// The Keystore is enshrined: identical on every chain, so it is imported
// directly rather than read from a per-chain deployment.
keystoreAddress // 0x813012Bd8D971928475235BBac6F0488c4A100AC
deployment.accounts.upgradeable // CoinbaseSmartWalletV2 impl (PENDING: undefined)
deployment.accounts.default // DefaultAccount / EIP-7702 delegate target
deployment.accounts.defaultHighRate // CanonicalHighRatePayerAccount (immutable)
deployment.accounts.erc4337 // portable ERC-4337 impl (optional)
deployment.authenticators.p256 // P256Authenticator
deployment.policies.manager // PolicyManager
deployment.policies.sessionPolicy // SessionPolicy

Account implementations

  • UpgradeableAccount: default smart account (CoinbaseSmartWalletV2) behind an ERC-1967 proxy. Pending deployment: accounts.upgradeable is currently undefined, so pass an explicit implementation (or use proxy: 'erc1167') until it lands.
  • CanonicalHighRatePayerAccount: immutable, ERC-1167 proxy. prefer for throughput-oriented accounts.
  • DefaultAccount: bare building block; EIP-7702 delegation target for EOAs.
  • BackwardsCompatible4337Account portable path for non-native chains via bundlers.

Fund and explore

On Vibenet, use the faucet from the Vibenet page or vibes.base.org.