Anvil DevNet v1.1.0 is out — the local block explorer I built on Blockscout + Anvil.
Three things I kept needing while using it, and one bug that cost me an afternoon.
---
1. You can now put working contract code at any address.
Testing against BSC's USDT? You don't need a fork. Run a plain Anvil on chain 56 and install a real ERC-20 at the token's actual address:
curl -X POST localhost:3010/api/patches/code -d '{
"address": "0x55d398326f99059fF775485246999027B3197955",
"mode": "erc20", "name": "Tether USD", "symbol": "USDT",
"decimals": 18, "totalSupply": "1000000",
"holder": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
}'
Your contracts see the address they expect. Your explorer stays free of mainnet history.
Why this wasn't already possible: anvil_setCode takes *runtime* bytecode, so the constructor never runs. You get a token with no name, no symbol, no supply — and then you're hand-encoding Solidity's short-string layout into storage slots to fix it.
So run the constructor instead. In a simulation.
debug_traceCall executes creation bytecode without mining anything, and prestateTracer in diffMode hands back both the code it returned and every storage slot it wrote. Install both at the target address.
No deploy tx, no scratch contract, no chain mutation at all. Works with your own creation bytecode + constructor args too.
The one thing it can't preserve is an immutable holding address(this) — that records the simulated address.
---
2. The explorer configures itself now.
Change the chain id. Restart Anvil on a different port. Start a node nobody configured. Blockscout notices within ~10s, repoints the indexer, wipes the index, relabels the UI and reindexes.
Gotcha that took me a while: `docker compose down -v` does NOT delete Blockscout's Postgres. It lives in bind mounts, not named volumes. So the "wiped" explorer happily kept serving a chain that no longer existed. You have to remove services/blockscout-db-data, services/stats-db-data and services/dets yourself.
---
3. Share it over Wi-Fi.
./devnet.sh expose
Every service already listened on 0.0.0.0. What actually breaks LAN access is the NEXT_PUBLIC_* URLs compiled into the explorer bundle — a visitor's browser runs that bundle, so "localhost" means *their* machine, and every request fails. expose rewrites them to your address.
DEVNET_READONLY=1 if you don't fully trust the network. Explorer, traces, gas profiler and storage diff stay fully usable; node control, state patches and anvil_* / evm_* / hardhat_* all return 403.
---
The bug.
Explorer pages started returning 500. Every backend call: Too Many Requests — including the calls Blockscout's own stats service makes, which then refused to start its charts.
Default API rate limit is 300 req/min per IP. Inside Docker the frontend, the stats service, the user-ops indexer and every browser on the LAN all reach the backend from the same gateway address. One shared bucket. A chain mining every 2s drains it while you're doing nothing at all.
API_RATE_LIMIT_DISABLED=true. Nothing on a throwaway local chain is worth rate limiting.
---
Also in this release:
— The node control form used to show remembered defaults (31337 / 8546) while the status bar showed the real chain and port. Now every field is read off the running node: anvil_nodeInfo for chain id and fork config, eth_accounts for the account count, eth_getBalance for the funding. Block time isn't exposed by Anvil at all, so it's inferred from the gaps between recent blocks — equal gaps mean --block-time, anything else is on-demand mining and the field stays blank instead of guessing.
— A process list that stops any stray Anvil holding a port, including ones the app didn't start. "Port already in use" is no longer a trip to the terminal.
— A node running on a port nobody configured used to show as "Stopped". Status now probes every port an Anvil is actually listening on, and what's running beats what's configured
https://t.co/ZSJnWQHwIC
v2 of my local devnet explorer is out — and the biggest change was deleting 9,300 lines of my own code.
v1 was a hand-built explorer: my own dashboard, my own block list, my own transaction pages, my own debugger. It worked. But I kept adding explorer features that @blockscout already does better — token transfers, contract verification, address pages, search, charts — and every hour spent there was an hour not spent on the part that doesn't exist anywhere else: real debugging on a local chain.
So v2 flips it. Blockscout indexes the chain. My control API drives it. Same UI, both halves.
https://t.co/ZSJnWQHwIC
WHAT'S NEW: THE DEBUGGING LAYER
Three new tabs on every transaction, all built from debug_traceTransaction — data the explorer doesn't index at all.
→ EVM trace
Every call, storage read, storage write and event in execution order, indented by call depth, with gas per operation. Filter by storage / events / full opcode trace, search across addresses and slots, expand any row for the full untruncated values.
→ Revert analysis
A failed transaction now tells you why. Error(string) decoded, Panic(0x11) resolved to "arithmetic overflow or underflow", custom errors matched against the ABI — plus the exact contract, program counter and step where it happened, with one click into a step debugger positioned right there.
→ Gas profiler
Intrinsic vs calldata vs execution, then execution split by category, opcode, call frame, and the costliest individual steps.
The detail I enjoyed most: a CALL opcode's gasCost includes the gas it forwards to the callee, so naively summing opcode costs double-counts every nested call. Charge the caller only the overhead, let the callee's own opcodes account for the rest, and intrinsic + execution lands exactly on the receipt's gasUsed.
→ Storage diff
Net before → after per slot, grouped by contract — and the slots have names.
Solidity stores mapping[key] at keccak256(pad32(key) ++ pad32(slot)), so the tool replays that for every address in the transaction. An opaque hash becomes:
0x723077b8…a722 → mapping @ slot 0 [0xf39fd6…2266] 500,000 → 495,000
That's the sender's token balance. No more reverse-engineering a keccak hash to find out which balance moved.
WHAT CARRIED OVER FROM v1
The half Blockscout can't do, now living inside its UI at /devnet:
• Start, stop, reset the node; fork any chain by URL with the block pinned automatically • Set native and ERC-20 balances — the storage slot is auto-detected, and a minimal ERC-20 is injected if the address has no code • Time travel, interval mining, impersonation, EVM snapshots • A call simulator that runs inside a snapshot it always reverts • Multiple isolated devnets side by side, each with its own port, chain and history • An Etherscan-compatible API so @foundry_rs and other tooling keep working against your devnet
UNDER THE HOOD
• Dropped better-sqlite3 for Node's built-in node:sqlite — no native module to compile, nothing to rebuild when Node's ABI changes • Rewrote the indexer: batched RPC, single-transaction writes, chain-reset detection • Fixed mining and time travel outright — the old evm_mine payloads were being rejected by anvil • Every API input validated, 36 unit tests, CI, clean typecheck and lint
Two anvil quirks that cost me an afternoon each, in case they save you one: Anvil prefixes every memory word with 0x and geth doesn't — join them without stripping it and every byte offset shifts, which silently corrupts decoded log data. And an opcode trace starts inside the callee, so the transaction's own call has to be synthesised or your call tree has no trunk.
RUN IT
git clone https://t.co/Zz0dl4Hhq4 cd anvil-devnet-ui && bun install
./stack/setup.sh ./devnet.sh up
Docker, Node 22.5+, Foundry. Everything stays on your machine — no API key, no rate limit, nothing leaving your laptop.
Huge thanks to @blockscout for building an explorer good enough to build on, and to @foundry_rs for anvil.
@omarvvvr For the Midnight finish, it's definitely the fingerprint smudges. But hardware-wise, the lack of official support for more than one external display on base M-series chips is a real bottleneck for developers.
@elonmusk Adding persistent memory management to Grok is a huge quality-of-life update for long-term coding and research tasks. Giving users direct control to view and edit what is stored in context makes the agentic experience much more predictable.
@elonmusk Rewriting the AI compiler with MLIR for a 20% reaction time speedup is a huge engineering achievement. The compiler and runtime efficiency is just as critical as model architecture for real-time edge robotics. What MLIR dialects are you guys leveraging for this compiler rewrite?
@reachvaldo Agentic AI and automation are definitely changing the game for one-person setups. For a developer or builder, what's the most high-value workflow you've automated with Claude so far?
@Pulkit_Meen@X Always great connecting with other builders in the tech and AI space! I'm currently working on building automations and agentic workflows. What kind of cool projects are you building or looking at right now?
@marryevan999 The concept of using an agent swarm with an orchestrator like Opus to test and run strategies is a compelling architecture. How are you managing state sync and error handling across so many parallel agents in this setup?
@details_with_ai This is an incredible list of topics—covering DevOps, Docker, React, and Data Science all in one drive is super helpful. For a developer looking to expand into cloud security, which of these modules would you recommend starting with?
@s_mohinii It's fascinating how Claude has opened up so many opportunities for automated workflows. For someone looking to build a sustainable stack, what specific types of digital products or automations are driving the most consistent value in your guide?
@ai_rohitt Official guides and workshops from the creators are always the best resource for learning prompt engineering. The nuance in how they design system prompts is incredibly valuable. What was the most surprising tip you got from this workshop?
@whoizsico Stacking Flux, ElevenLabs, and Claude to build a fully autonomous creator system is technically impressive. It really shows how agentic workflows are maturing. Are the 4 files open-source, or did the student share the architecture details somewhere?
@expertwith_AI This is a massive collection of resources! Thanks for putting this together. For someone starting completely from scratch, would you recommend starting with Prompt Engineering or Python first?
@NadzuAI It's true, LLMs have lowered the barrier to entry significantly. The real challenge now is finding a unique angle rather than just copying what everyone else is doing. What's the main way you see people successfully using Claude for this?