Support¶
This page lists what works where, and how thoroughly each part has been tested:
- Anvil: tested locally at the Prague and Amsterdam forks, against contracts fetched from mainnet, through both relay implementations.
- Live: tested on Sepolia with real transactions.
- Untested.
Features that aren't done yet are on the roadmap.
Chains¶
| Chain | Served at bruno.mailam.app | Builders | Tested |
|---|---|---|---|
| Ethereum | Yes, at /ethereum |
Titan, BuilderNet, Quasar and BTCS (droppingTxHashes); Flashbots and beaverbuild (standalone bundles) |
The treasury runs live; make ethereum-verify hasn't been run |
| Sepolia (Amsterdam, ePBS) | Yes, at /sepolia |
nflaig's ePBS builder (standalone bundles) | Live: both payment methods, against both relays |
| Unichain Sepolia, Base Sepolia | No | None | The deployer, Calibur and x402's Permit2 proxy are deployed, but Bruno can't send on OP-stack chains yet |
Bruno can serve any chain on a fork it knows (Prague or Amsterdam) that has the deployer and a builder that takes bundles. See networks and builders.
Payment methods¶
| Payment method | Tokens | Who can pay | Tested |
|---|---|---|---|
| The call pays (a submission, over REST or JSON-RPC) | ETH and WETH; on Ethereum also USDC, USDT and DAI (priced by Uniswap v3); on Sepolia also USDC | Any call that pays the payee the amount while it runs, wherever the money comes from: the account's own funds through its EIP-7702 delegate (with or without an authorization in the submission), what the call releases or earns, or another account's signed payment | Anvil: ETH, WETH, USDC and USDT from accounts delegated to Calibur, including ETH the call releases by unwrapping WETH, and calls to contracts that pay. Live: ETH from an account delegated to Calibur |
A signed transfer (a submission's payment.transfer, over REST or JSON-RPC) |
USDC | A plain key, or a contract (ERC-1271), such as a smart wallet, deployed or not (ERC-6492) | Anvil: a key, and a Coinbase Smart Wallet deployed and not |
x402 v2, exact scheme, EIP-3009 |
USDC | A plain key (checked with ecrecover) | Anvil and live |
| A smart wallet (checked with ERC-1271), such as a Coinbase Smart Wallet | Anvil | ||
| A smart wallet that isn't deployed yet (ERC-6492), deployed by the same transaction | Anvil, including with x402's own Python client | ||
| An account delegated to Calibur (checked with ERC-1271 against its root key) | Anvil |
Not supported yet: x402 payments through Permit2, for tokens without EIP-3009.
Smart wallets¶
Any smart wallet can pay, deployed or not, as long as it checks signatures with ERC-1271 and, while undeployed, wraps them as ERC-6492 says. Bruno calls any factory: it keeps no list of allowed ones.
What a wallet's signature check costs is part of the price. For the wallets below, Bruno knows
it exactly, measured on each fork. For any other wallet, it charges the most it knows, unless
the client gives verifyGas; if that turns out short, the signed payment is priced again.
| Wallet | Owner | Factory | Created by | Tested |
|---|---|---|---|---|
| Coinbase Smart Wallet v1 | A key | 0x0BA5ED0c6AA8c49038F819E587E2633c4A9F428a |
viem's toCoinbaseSmartAccount (version: "1") |
Anvil: x402, submissions, AgentKit, deployed and not |
| Coinbase Smart Wallet v1.1 | A key | 0xBA5ED110eFDBa3D005bfC882d75358ACBbB85842 |
CDP smart accounts, AgentKit's CdpSmartWalletProvider, the Base Account SDK, viem (version: "1.1") |
Anvil: AgentKit, deployed and not |
| ZeroDev Kernel v3.2 | A key (ZeroDev's ECDSA validator) | 0xd703aaE79538628d27099B8c4f621bE4CCd142d5, ZeroDev's meta-factory, calling 0x7a1dBAB750f12a90EB1B60D2Ae3aD17D4D81EfFe |
AgentKit's ZeroDevWalletProvider, @zerodev/sdk's createKernelAccount (KERNEL_V3_2) |
Anvil: x402, AgentKit (through @zerodev/sdk, with AgentKit's options), deployed and not |
Wallets with passkey (WebAuthn) owners aren't measured yet.
To have another wallet added, request it on GitHub.
Standards¶
- EIP-7702: type-4 transactions, and delegations included in a submission.
- EIP-3009 and EIP-712: x402 payments.
- ERC-1271: contracts as payers.
- ERC-6492: smart wallets that aren't deployed yet, deployed by the transaction that takes their payment, and wallets prepared by their signature.
- ERC-4337's
factoryandfactoryData: the names a deployment is given in. - ERC-4337 and ERC-7769: user operations for EntryPoint v0.8 and v0.7, sent through the chain's endpoint as a bundler's; EIP-7702 accounts'; another's paymaster. Tested with Circle's paymaster and Pimlico's singleton paymaster (its sponsoring mode), both v0.8.
- x402 v2: the
exactscheme, thebazaarextension and/.well-known/x402. - Flashbots'
eth_sendBundle:droppingTxHashes, standalone bundles andX-Flashbots-Signature. - EIP-1474: error codes over JSON-RPC.
- OpenAPI and OpenRPC: documents describing both interfaces.
- Uniswap v2 and v3: pools used for prices.
Implementations¶
| Relay | How it runs | Tested |
|---|---|---|
| Python (Litestar) | make serve, or the Docker image ghcr.io/mai-lam-labs/bruno |
Anvil; its bundle path live on Sepolia |
| Cloudflare Worker | Deployed at bruno.mailam.app | Anvil (under workerd); live on Sepolia, deployed and verified with real payments |
Both implement the same interface, and every server test runs against each of them.
Clients¶
| Client | How it pays | Runtimes | Tested |
|---|---|---|---|
@mailam/bruno (npm, JSR) |
Submissions, including EIP-7702 authorizations, or paid by a signed transfer; x402 with any signer of typed data (such as viem's accounts, smart accounts included, deployed or not) | Deno, Node and Bun; installs with npm, pnpm or Bun | Anvil, installed the way npm users get it. Browsers and Cloudflare Workers are untested |
@mailam/bruno-agentkit (npm, JSR) |
x402, in USDC, from an AgentKit agent's wallet: a key, or a smart wallet, deployed or not | Deno, Node and Bun | Anvil: an agent using AgentKit's viem wallet provider, with a key, Coinbase Smart Wallets v1 and v1.1, and ZeroDev's Kernel v3.2 |
viem's bundler client (createBundlerClient, viem 2.57) and ZeroDev's (createKernelAccountClient, @zerodev/sdk 5.5) |
ERC-4337 user operations (EntryPoint v0.7 and v0.8), paying the relay by their fees in ETH, or in a token by their own calls, their fees zero, at a price quoted before they're signed | Node | Anvil, each library's current version: both send through both relays from an undeployed Kernel v3.2, holding ETH (paying by its fees, at the relay's gas price) or only USDC (paying in it), and wait for the receipt; and from an EOA holding ETH, delegating in its first op, as viem's toSimple7702SmartAccount (EntryPoint v0.8), and on v0.7 ZeroDev's EIP-7702 Kernel v3.3, MetaMask's Stateless7702 (@metamask/smart-accounts-kit 2.0) and Alchemy's Modular Account v2 in 7702 mode (@alchemy/smart-accounts 5.3); Circle's paymaster quickstart, from an EOA holding only USDC |
x402's Python SDK (x402[httpx,evm]) |
x402 | Python | Anvil: it pays through both relays, from a key and from an undeployed smart wallet, and its models parse every response |
Project status¶
Bruno is a proof of concept, written in October 2026.
- Locally, every path runs on anvil at Prague and at Amsterdam, against contracts fetched from mainnet, through a mock builder that applies rbuilder's rule for committing bundles.
- Live on Sepolia, through an ePBS builder using standalone bundles, a paying submission landed, and an underpaying one was dropped and cost nothing. The Cloudflare Worker, running on its own alarms, landed a submission there in its second slot. It also settled an x402 payment in about 40 seconds for a client holding only USDC: the request stayed open until the transaction landed, and the runner left nothing in state.