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.*.
bun add "viem@github:chunter-cb/viem#feat/eip-8130-production"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.
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.
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.
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 targetdeployment.accounts.defaultHighRate // CanonicalHighRatePayerAccount (immutable)deployment.accounts.erc4337 // portable ERC-4337 impl (optional)deployment.authenticators.p256 // P256Authenticatordeployment.policies.manager // PolicyManagerdeployment.policies.sessionPolicy // SessionPolicyAccount implementations
- UpgradeableAccount: default smart account (CoinbaseSmartWalletV2) behind an ERC-1967 proxy. Pending deployment:
accounts.upgradeableis currentlyundefined, so pass an explicit implementation (or useproxy: '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.