What you get:
- SolDB debugger.
--debugnow runs on SolDB and debugs large tests without exhausting memory. On a 1.46M-step Aave v4 test, peak memory footprint drops from 27.6 GiB to 0.92 GiB and the session opens 5.8× sooner (6.58 s → 1.13 s). - Fork reuse. Creating a fork that already exists reuses it instead of reloading its cache. With a 20 MB fork cache and a local RPC, 40 suites that call
createSelectForkinsetUprun 26× faster (5.15 s → 0.20 s). - Faster invariant shrinking. The shrinker drops blocks of calls first and stops once no call can be removed. It finds the same minimal counterexample up to 35× faster (38 s → 1.1 s).
- Immediate mining in Anvil. Anvil mines each transaction as it arrives. viem gets its receipt in 2 ms instead of waiting 4 s for its next poll.
- Lower memory. Anvil and Cast stream RPC results without building a JSON tree, and coverage counts hits densely.
cast rpc --jsontraces use 80% less memory, Anvil traces 52% less and coverage 34% less. - New tools.
forge propertiesandforge exploit, transient-storage cheatcodes, and Tempo consensus in Anvil. - About 190 fixes across script recovery, cheatcodes, gas accounting, Anvil and symbolic execution.
Action required
- Debugger:
--debugopens SolDB. The built-in debugger and--debug-layoutare removed, and--dumpnow writes a SolDB bundle directory instead of a JSON file (#17429). - Gas snapshots: regenerate them for tests that deploy contracts with
new. Dynamic test linking turnsnewintovm.deployCode, which now charges its creation gas (#17732, #18034). vm.getRecordedLogs: it no longer returns logs from calls or creations that revert or halt, including reverts expected withexpectRevert(#17866).- CREATE2 factory: with
always_use_create_2_factory = true, saltedvm.deployCodedeploys through the factory. The address changes, and the constructor sees the factory asmsg.sender(#17471). - Anvil: it mines immediately, so concurrent transactions may land in separate blocks. Pass
--transaction-coalescing-window 5to restore the 1.8 behavior. Priced calls below the base fee return-32003(#17578, #17419). --resume: it fails when a sequence has a recorded revert and operations left to send, including broadcasts from older versions. Pass--broadcast --start-freshto archive the run and broadcast again (#18031, #17736, #17851, #17964).- Tempo: Tempo mainnet activates T13 on 2026-11-03 at 15:00 UTC. Local Tempo nodes that follow the wall clock switch from T12 to T13 at that time (#18021).
Other behavior changes
- Script sender: when
--senderand a single--private-keyare both given, the script runs as--sender. Before,msg.sendercame from the key while broadcasts came from--sender(#17528). - Delegatecall broadcasts: a
DELEGATECALLorCALLCODEat the broadcast depth is now an error instead of being recorded as a plainCALL(#17794). - Coverage: executed bytecode is credited only to exactly matching artifacts, so coverage of code installed with
vm.etchmay drop (#17520). - Remappings: absolute remapping aliases no longer apply inside the project root. For affected projects, bytecode metadata no longer depends on the checkout path and can differ from 1.8 builds (#17507).
- Gas reporting: flamegraph and
evm-profilegas no longer add refunds, and under Amsterdam top-level creates are charged EIP-8037 account-creation state gas (#17728, #17545). - Anvil: block timestamps strictly increase, so bursts of blocks can run ahead of wall-clock time. Slow pubsub clients are disconnected instead of buffered. Reversed
eth_newFilterranges, integertrace_getindices and unknown trace blocks return errors (#17373, #17909, #17681, #17308, #17777). vm.writeToml: integers abovei64::MAXare written as strings instead of lossy floats (#18016).- Rust API: callers must use
DebuggerBuilder::runinstead of the removed debugger API (#17429).
Features
Forge
- SolDB debugger:
--debuginforge test,forge script,cast runandcast callopens an interactive view in a terminal and asoldb>prompt otherwise. It reads sources from build info, so files rewritten by dynamic test linking show correct lines, and it restores the terminal if it panics (#17429, #18035, #17960) by @figtracer, @mablr. forge propertiesandforge exploit:forge propertiesruns a swarm of agents you bring yourself, each in an isolated copy of the project, and reports the bugs they prove with failing tests.forge exploitasks a model on the Tempo Gateway to find a bug and prove it with a test. Both run generated tests in a restricted sandbox (#17259) by @figtracer.- Coverage and mutation testing:
forge coverage --report gapswrites every uncovered item as JSON, and mutation testing can replace function bodies with constants (#17183, #17599) by @decofe, @siosw. - Linked libraries: setting
allow_linked_libraries = falsefails builds that need linked libraries (#13585) by @mgiagante. - Cheatcodes and state diffs: added
vm.storeTransientandvm.loadTransient, and state diffs decode ERC-7201 namespaces (#17484, #17869) by @awss1i, @sakulstra. - Fuzzing: the fuzzer reuses whole structs from results, events and views, keeps only applicable comparison hints, and builds its dictionary deterministically (#18017, #17459, #17808, #17931) by @0xalpharush, @figtracer, @stevencartavia.
- Fork prefetch: the opt-in
fork_prefetchsetting warms new fork blocks in the background with the keys earlier runs read (#17673) by @figtracer. - Warnings:
forge scriptwarns when a dry run uses the default sender and while it waits on a pending receipt, and it can unlock a keystore without an address to find the sender. Forge warns when an explicit network does not match a fork (#17839, #17977, #17818, #18037) by @stevencartavia, @aelmanaa, @figtracer.
Anvil
- Tempo consensus: Anvil signs locally mined blocks. Consensus can be configured from the CLI, queried and subscribed to, identities can be rotated, and fork certificates and consensus rounds are forwarded (#17729, #17773, #17799, #17820, #17822, #17867, #17942, #18009, #18033) by @0xKarl98, @mablr.
- New RPCs and chains: added
anvil_setMiningPaused,anvil_setNextBlockParentBeaconBlockRoot, 200 ms Base blocks, and CIP-64 transactions with native fees (#17571, #17305, #17128, #17481) by @spalladino, @mattsse, @meyer9, @mablr. - Coalescing window:
--transaction-coalescing-windowbatches transactions that arrive together into one block (#17448) by @mablr.
Cast and editors
cast: it decodes indexed event parameters, and 4byte commands check the local signatures cache (#17634, #17919) by @mattsse, @aelmanaa.- Editors: the VS Code extension is on the Marketplace and Open VSX, and the Zed extension downloads Forge when none is installed (#17463, #17858) by @DaniPopes.
Performance
- Fork reuse:
createFork,createSelectForkandrollForkreuse an existing fork instead of reloading its cache (#17418, #17739) by @figtracer. - Invariant shrinking: the shrinker drops blocks of calls first and stops once no call can be removed, instead of spending the whole
shrink_run_limit. Optimization mode keeps removals that raise the score (#17742) by @figtracer. - Immediate mining: Anvil mines each transaction as it arrives again, so clients get receipts without waiting for a poll (#17578) by @figtracer.
- Memory: the debugger records steps without a second copy of the trace. Anvil and Cast serialize RPC results without building a JSON tree first, and coverage counts hits densely (#17429, #17650, #17672, #17671) by @figtracer, @DaniPopes.
- Symbolic execution: cached context classifications explore the same paths about 3× faster on Halmos
Storage4(#17701) by @mablr. - Build times: smaller binaries and faster builds from aligned dependency features, trimmed dependency defaults and less monomorphization (#17783, #17806, #17788, #17802, #17787, #17786, #17798) by @DaniPopes.
Bug fixes
Scripts
- Script recovery:
--resumeno longer sends operations planned after a recorded on-chain revert, and rebroadcasts are refused over an unfinished run or without its snapshot. Resume keeps the saved endpoint, sponsor and fee token. Multichain errors name their chains, every chain is verified, and simulation uses fixed gas limits, the chain's hardfork gas limits and attached blobs (#18031, #17851, #17964, #17736, #17293, #17753, #17758, #17776, #17880, #17881, #17879, #17885, #17886, #17521, #17861, #17792) by @mablr, @stevencartavia, @0xKarl98.
Cheatcodes and testing
vm.deployCode: it behaves like a native CREATE. It charges its creation to the caller, forwards the same gas, and enforces the initcode size limit and Amsterdam account-creation state gas (#17732, #18034, #17471) by @stevencartavia, @mablr.- Cheatcodes: fixed raw transaction failures, reverted snapshot journals, delegated EOA nonces, cooled accounts,
vm.blobBaseFee, access lists before Berlin, delegations before Prague,mockFunctionunder isolation and exactuint64values invm.writeToml(#17389, #17425, #17686, #17678, #17677, #17624, #17640, #17458, #18016, #17794) by @stevencartavia, @mablr, @Snan0M. - Dynamic test linking: compiler failures retry natively and unchanged inputs skip the retry. Via-IR stack errors are avoided, sources are reused on expansion, and deleting a file that no preprocessing decision depends on no longer recompiles scripts (#17610, #17622, #17638, #17841, #17933, #18026) by @mablr, @stevencartavia, @0xKarl98, @ninglinLiu.
- Symbolic execution: it matches Forge for
expectRevert,vm.assumereplays, isolated calls, precompiles andsetUpaccounts (#17945, #17907, #17963, #17947, #17976, #17860, #17865, #17821, #17898) by @stevencartavia, @decofe.
Anvil
- Timestamps: default-path block timestamps strictly increase, and the block after
evm_setTime(T)is mined atT(#17373, #18032) by @Lubov66, @mablr. - Fees: the fee mempool is ordered by effective tip, and priced calls below the base fee are rejected (#17882, #17419) by @stevencartavia, @figtracer.
- Pubsub: it respects backpressure, no longer drops clients over large responses, and skips blocks removed by revert, rollback or reorg in logs subscriptions (#17909, #17935, #17936) by @0xKarl98, @stevencartavia.
- Fork and history: fee state is restored on rollback and reorg, rollback can reach the fork root, head reads and block tags resolve against one snapshot, fork RPC connections are isolated, and fork credentials are redacted from logs and
anvil_nodeInfo(#17795, #17835, #17347, #17703, #17598, #17704, #17537, #17421, #17908) by @stevencartavia, @0xKarl98, @figtracer. - RPC errors: reversed block ranges in
eth_newFilterand integertrace_getindices are rejected, and unknown trace blocks return not found (#17681, #17308, #17777) by @Ravan002, @mattsse, @banteg.
Cast and verification
cast:decode-erroranddecode-event --jsonoutput stays valid JSON, cached 4byte signatures with another selector are ignored,cast call --tracerespects fees, andcast runwarns when it skips system transactions (#17925, #17939, #17527, #17906, #17946) by @ninglinLiu, @stevencartavia.- Solar: Solar's experimental codegen warning is accepted, and
forge verify-contractkeeps Solar build metadata in the compiler version (#17903, #17890) by @figtracer, @DaniPopes.
Dependencies
- Solar 0.3.0, with codegen fixes for decoded bytes padding (#17943, #18054)
- Solidity 0.8.38 (#17743) by @figtracer
- Tempo v1.17.0 for T13 activation (#18021) by @grandizzy
New contributors
@fmterrors, @gophersg, @Lubov66, @meyer9, @mohamadhammoud, @mortezashojaei, @ninglinLiu, @Ravan002 and @Snan0M.