Foundry v1.8.4 builds on v1.8.3 with durable script recovery, native Base execution, external compiler adapters, integrated editor clients, expanded block-access-list and Tempo tooling, and substantial correctness and performance improvements across tracing, compilation, fuzzing, symbolic execution, formatting, linting, and Chisel.
Forge, scripting, and testing
Script recovery compatibility: Forge now stores authoritative resume state in a private, versioned .recovery.json file under cache/. Preserve both broadcast/ and cache/ until a deployment is complete. Forge 1.8.4 can import a consistent legacy artifact pair, but older Forge versions must not resume a deployment after 1.8.4 has written generation-tagged recovery state.
- Added crash-safe recovery snapshots, persisted exact signed payloads before submission, and fail-closed handling for ambiguous browser-wallet or unlocked-RPC outcomes. Recovery covers ordinary, multichain, sponsored, and Tempo batch submissions; ambiguous delegated attempts can be resolved explicitly with
--resume-attemptand either--resume-tx-hashor--resume-retry(#16993, #16995, #16996, #17023, #17181, #17251) by @stevencartavia. - Added executable external compiler adapters for EVM projects whose manifests and dependency resolution do not fit Foundry's Solidity source-file model (#16980) by @figtracer.
- Added VS Code and Zed editor clients and a
forge lsplauncher backed by Forge's embedded Solar language server (#16730) by @0xKarl98. - Improved dynamic test-linking and compiler-cache correctness for imported constants, cached libraries, filtered builds, import cycles, and native-bytecode fallback. Fallback now tracks transitive import closures instead of invalidating every test and script after any edit (#16908, #17003, #17014, #17211, #17238, #17254) by @mablr, @stevencartavia, @figtracer.
- Added
vm.eth_getProof, fixed saltedvm.deployCodebroadcasts through CREATE2, and made local EIP-2935 history-storage clearing revertible across calls and snapshots (#17053, #17192, #17194) by @zexoverz, @stevencartavia. - Improved persisted invariant failure replay, nested handler identity, shrinking, symbolic frontier reporting, and time/block-aware corpus replay (#16850, #16953, #16981, #17099, #17140, #17235) by @figtracer, @kriss39, @stevencartavia.
- Expanded symbolic execution for aliasing addresses, symbolic mock targets, reverting-call cheatcode state, empty precompile accounts, fork-gated opcodes, exceptional halts, and failed
ecrecoverreturndata; empty proof domains and unsafe predicate assumptions no longer report vacuous success (#16964, #16965, #16966, #17119, #17132, #17201, #17212, #17217, #17218) by @Bruce039, @0xShadowX, @figtracer.
Networks, Anvil, and tracing
- Added native Base execution across Forge, Cast, Chisel, scripts, and Anvil, including Base hardforks, deposits, EIP-8130 transactions, precompiles, mining, estimation, tracing, transaction-pool ordering, and forks (#16809, #16224) by @mablr, @lukasrosario.
- Added EIP-7928 block access list production in Anvil and used available BAL data to prewarm fork and transaction-hash replay state (#16917, #16956, #17022) by @figtracer, @0xKarl98.
- Fixed Optimism and Base deposit replay, OP fee-context handling, and incompatible cross-family fork execution (#17130, #17197) by @mablr.
- Improved Tempo nonce-lane ordering, sponsored EIP-7702 authority handling, generic RPC replay fidelity, expiry limits, and protocol support (#17139, #17193, #17195, #17241, #17244) by @stevencartavia, @decofe, @mattsse.
- Corrected Parity trace defaults and new-account state diffs, restored VM trace alignment and reverted-CREATE handling, and reduced memory by replaying historical struct logs from parent state instead of retaining mined opcode steps. Block replay now runs once and reports unavailable historical state explicitly (#17078, #17106, #17226, #17240, #17249, #17250) by @mattsse, @banteg, @mablr, @HubertRitzdorf-ChainSecurity, @stevencartavia.
- Fixed snapshot restoration for the transaction pool and pending prevrandao, and pruned historical state discarded by
evm_revert(#17044, #17184, #17187) by @stevencartavia. - Aligned
cast runwith Nitro poster-gas and ArbSys accounting and reported the replayed L2 block correctly (#17069, #17093, #17094) by @stevencartavia, @mattsse.
Cast and developer tools
- Added Tempo zone deposit, withdrawal, settlement waiting, and Earn callback encoders, plus TIP-20 role inspection and grant/revoke commands (#16903, #17246) by @mattsse.
- Added
cast bal/cast block-access-listand used BAL prestate to acceleratecast runwhile respecting explicit EVM overrides (#16933, #16931, #17213) by @mattsse, @mablr. - Added decoded fields to
cast logsfor event declarations, decoded calldata with ERC-8021 suffixes, and improvedcast rundiagnostics and support for unknown chains and ZKsync traces (#16322, #17171, #17090, #17091, #17092, #17095) by @e1Ru1o, @mattsse. - Decoded canonical dynamic constructor arguments and rejected ambiguous nested encodings instead of silently selecting one match (#16922, #17233) by @kriss39, @figtracer.
- Preserved explicit empty Tempo keychain scopes as deny-all policies, rejected scopes on pre-T3 chains, and listed Turnkey signers through
cast wallet list --turnkey(#17255, #17169) by @figtracer, @aelmanaa. - Improved formatter stability for normalized widths and assignments, prevented directory formatting from following symlinks outside the project, and expanded lint analysis for flash-loan repayment loops, sender aliases, unused function values, compound assignments, and duplicate arithmetic writes (#17137, #17205, #17206, #17196, #16628, #16943, #16944, #16974, #17177) by @CalvinTjoaquinn, @mablr, @0xKarl98, @gomesalexandre, @0xShadowX, @Osraka, @wavey0x.
- Removed RPC and explorer credentials from Chisel session caches, isolated
chisel viewfrom unrelated project setup, and displayed external function references in the REPL (#17143, #17191, #17131) by @0xKarl98, @stevencartavia.
Compatibility notes
- The minimum supported Rust version for source builds is now 1.98 (#17188) by @stevencartavia.
- Alloy 2.5.0 changes
trace_filterto intersect both address dimensions when both are supplied and rejects malformed0x00-tagged legacy envelopes (#17077) by @mattsse. - Anvil now preserves empty Parity trace-type lists, defaults
trace_callManytolatest, and treats an omittedtrace_filterrange as latest-only (#17078) by @mattsse. - Historical default struct logs now require replayable parent state; nodes without it return an explicit unavailable-state error (#17240, #17249) by @HubertRitzdorf-ChainSecurity, @stevencartavia.
- Chisel no longer persists endpoint credentials in session files, so older fork sessions may require credentials again when loaded (#17143, #17191) by @0xKarl98.
Full Changelog:
v1.8.3...v1.8.4
Contributors (31)
cast run diverges from the receipt (#17092) by @mattsse
cast run failures at their fixes (#17095) by @mattsse
getBlobhashes description (#17170) by @ursiyan
cast wallet list --turnkey (#17169) by @aelmanaa