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 contracts, apps, and node or 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. In just devnet up mode, 7545 is one of three conductor-managed sequencers. After a leader change, transactions sent to 7545 can stay pending; send through the RPC node at 8545, which forwards to the current leader.

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. Before Denim, the devnet produces a block every 2 seconds. 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 supports these transactions, so the shadow validator 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.