Skip to main content
The local devnet runs a complete Base stack on your machine with Docker: an L1 (Reth + Lighthouse), a Base sequencer, two RPC nodes, and a batcher. It also runs a shadow batcher and shadow validator used to test the Rust batcher. Use it to test node, protocol, and hardfork behavior without a public network.
To build against new Base features without running infrastructure, use the hosted Vibenet instead.
The devnet is disposable. just devnet up, just devnet up-single, and just devnet down delete all chain data in .devnet/. It publishes ports on all interfaces, so run it on an isolated development machine.

Prerequisites

  • Docker with Compose v2 and Buildx. The first build compiles the Rust services, so allocate generous memory to Docker.
  • just 1.51.0 or newer
  • Foundry (cast) to send transactions
  • jq, used by just devnet status and just devnet checks
  • A clone of base/base

Start the Devnet

From the root of the base/base repo:
Terminal
This stops any running devnet, clears its data, builds the images, and starts a single-sequencer stack. The first run compiles the Rust services and takes several minutes. Check that blocks are advancing:
Terminal

Send a Test Transaction

The devnet prefunds the standard Foundry/Anvil test accounts, listed in etc/docker/devnet-env. Send ETH through the sequencer:
Terminal
A receipt with status 1 confirms the sequencer included the transaction. To run the built-in L1 and L2 checks instead, use just devnet checks.
The test account keys are public. Never use them on Mainnet or Sepolia.

Endpoints

Ports are set in etc/docker/devnet-env.

Hardfork Activation

The devnet schedules Azul at L2 block 20, Beryl at 21, Cobalt at 22, and Denim at 25, so a fresh devnet crosses each activation within its first few blocks. At Denim, the sequencer switches to 200ms blocks.
The devnet’s canonical batcher (op-batcher) cannot decode EIP-8130 transactions (type 0x79). After the first block that contains one, it stops advancing and the canonical safe head stalls. The shadow base-batcher keeps deriving past those blocks. See the devnet README for details.
To move an activation, set L2_BASE_DENIM_BLOCK (or the matching L2_BASE_<HARDFORK>_BLOCK variable) before up or up-single. Set it to an empty value to leave that hardfork unscheduled.

Common Commands

Run just devnet with no arguments for the full list.

Learn More

The base/base repo is the source of truth for the devnet:
  • Devnet README: stack topology, batcher setup, the Anvil + Nitro proving variant, and upgrade-signal testing
  • etc/docker/Justfile: every devnet command
  • Testing guide: system tests against the devnet (just devnet tests)
  • Standalone proving guide: run the prover stack, which the devnet does not include. ZK proving against a local devnet requires disabling Beryl and Cobalt.