Repository navigation
·
48 commits
to master
since this release
Immutable
release. Only release title and notes can be modified.
Foundry v1.8.5 is a focused patch release led by an Anvil mining fix for ready transactions left in the pool after a full block. Previously, burst submissions such as forge script --broadcast could stall indefinitely while Forge waited for receipts. It also includes targeted correctness improvements across Forge, Anvil, Cast, symbolic execution, Base, and Tempo.
Highlights
- Kept Anvil mining while ready transactions remain after a full block, for both automine and
evm_mine. Mining continues only when the previous block made progress, avoiding empty-block loops for transactions that can never fit (#17266) by @stevencartavia. - Restored Base's seeded genesis state across
anvil_reset(#17320) by @mattsse. - Simplified the symbolic executor by removing redundant solver and execution layers while retaining end-to-end and nightly coverage (#17279, #17339) by @figtracer, @mattsse.
- Improved invariant corpus replay by enforcing sender, target, and selector policies, restoring state after rejected replay entries, and validating persisted optimization results before reuse (#17274, #17286, #17292) by @stevencartavia, @figtracer.
- Moved gas-snapshot checking until all test suites complete and kept
forge test --listfrom contaminating the build cache (#17318, #17262) by @mattsse, @stevencartavia. - Aligned Parity trace responses and lookups with their expected wire semantics: replay responses now include
transactionHash,trace_getfollows trace addresses, mined traces omit nested precompile calls, and unknown blocks or transactions are reported consistently. Block trace methods now rejectpending, and raw transaction tracing enforces the code-sender rule (#17301, #17302, #17303, #17304, #17306, #17309) by @mattsse. - Corrected call fee and gas preparation: fee-free calls run with zero base and blob base fees, cap-only calls pay the base fee, omitted gas is bounded by the sender's allowance, and conflicting fee or input fields are rejected (#17310, #17311, #17312, #17307) by @mattsse.
cast interfacenow detects verified proxies and generates the implementation interface instead of the proxy shell (#17153) by @sakulstra.- Fixed
cast decode-tx --jsonto emit a JSON object instead of a JSON-encoded string (#17317) by @mattsse. - Improved Tempo replay and local-node behavior, including standard-envelope execution, gas-schedule preservation, local fee-token resolution, and omitted nonce handling (#17260, #17278, #17327, #17326) by @figtracer, @mattsse.
Compatibility notes
- The public Rust APIs
foundry_evm_symbolic::BUILTIN_SYMBOLIC_SOLVERSandEvmOpts::fork_networkwere removed as part of the symbolic and shared-EVM simplifications (#17279, #17339). cast interfacenow emits the implementation ABI for verified proxies, andcast decode-tx --jsonnow returns structured JSON rather than a JSON string (#17153, #17317).- Malformed values passed to
envOrnow revert instead of using the fallback (#16924). - Parity trace clients may need to account for the response and lookup changes described above, especially
transactionHashin replay responses, trace-address indexing intrace_get, omitted nested precompile calls, and stricter unknown orpendingblock handling (#17301, #17302, #17303, #17306, #17309).
Full Changelog:
Contributors (17)
- fix(cast): guard virtual-master registration (#17257) by @figtracer
- fix(cast): validate Tempo batch sender (#17258) by @figtracer
- fix(anvil): retry ready txs left by full blocks (#17266) by @stevencartavia
- chore(ci): re-pin dtolnay/rust-toolchain v1 (#17269) by @stevencartavia
- chore: fix nightly clippy (#17273) by @stevencartavia
- chore(deps): bump solar dependencies to c0259d9 (#17267) by @github-actions[bot]
- fix(doc): neutralize ESM lines in the homepage (#17272) by @stevencartavia
- fix(anvil): reserve blob fee in gas estimation (#17270) by @stevencartavia
- fix(cast): preserve fees in curl calls (#17261) by @figtracer
- fix(forge): keep test listing out of build cache (#17262) by @stevencartavia
- test(anvil): cover full-block retries and mining modes e2e (#17268) by @mattsse
- fix(anvil): use Tempo for standard tx replay (#17260) by @figtracer
- fix(config): preserve root across inline config (#17263) by @stevencartavia
- fix(fuzz): enforce sender policy on corpus replay (#17274) by @stevencartavia
- fix(cast): fetch impl on cast interface (#17153) by @sakulstra
- fix(debugger): identify etched frames by executed code (#17275) by @stevencartavia
- refactor(symbolic): simplify symbolic executor crate (#17279) by @figtracer
- fix(ci): install libudev before Tempo build (#17284) by @decofe
- refactor(test): make CLI test macros proc macros (#17285) by @DaniPopes
- fix(anvil): respect interval history limits (#17283) by @mablr
- fix(evm): preserve Tempo gas on version changes (#17278) by @figtracer
- refactor(verify): use native constructor encoding (#17288) by @figtracer
- fix(fuzz): restore rejected corpus replay state (#17286) by @figtracer
- refactor(common): reuse provider construction (#17287) by @figtracer
- refactor(traces): re-export all used trace types (#17289) by @mablr
- fix(invariant): validate persisted optimization best (#17292) by @figtracer
- test(cheatcodes): pin effects in reverted frames (#17290) by @mablr
- docs(cast): fix batch call examples (#17190) by @myetcd
- perf(evm): discover non-Anvil fork endpoints once (#17280) by @mattsse
- fix(cheatcodes): preserve formatting in writeToml (#17242) by @awss1i
- test(cheatcodes): isolate JSON/TOML write fixtures (#17300) by @mattsse
- fix(lint): restore numeric-cast peeling for underlying_var in arbitrary-send-erc20 (#16632) by @gomesalexandre
- chore(deps): bump solar dependencies to 83214bb (#17295) by @github-actions[bot]
- fix(cheatcodes): surface parse errors from envOr (#16924) by @Bruce039
- fix(forge): emit empty json and junit output without matches (#16950) by @0xShadowX
- fix(cast): preserve nested batch call arguments (#16820) by @wangjingshuiku
- fix(lint): recognize events before access-control writes (#16651) by @gomesalexandre
- fix(evm): map BPO3-5 hardforks to Osaka spec (#17314) by @mattsse
- test: run vaddr e2e and ignored flaky tests (#17322) by @mattsse
- test: delete tests that never run or assert nothing (#17321) by @mattsse
- test(anvil): assert exact Tempo rejection errors (#17324) by @mattsse
- ci: run dormant symbolic suites and default-feature tests nightly (#17325) by @mattsse
- fix(script): compute total paid in u128 (#17319) by @mattsse
- fix(anvil): include transactionHash in trace_replayTransaction (#17301) by @mattsse
- fix(anvil): select trace_get frames by trace address (#17302) by @mattsse
- fix(anvil): reject code senders in trace_rawTransaction (#17304) by @mattsse
- fix(anvil): charge cap-only calls at the base fee (#17311) by @mattsse
- test(symbolic): snapshot symbolic test output (#17345) by @mattsse
- test: run ignored cache and fork tests hermetically (#17323) by @mattsse
- refactor(lint): reuse write_target helper (#17332) by @mattsse
- refactor(evm): share Tempo precompile label table (#17337) by @mattsse
- fix(vscode): update vulnerable brace expansion (#17355) by @figtracer
- docs: clarify that JSON cheatcode
keymust be a JSON path starting with.(#17159) by @bingtang9 - fix(config): trim whitespace in environment library lists (#17277) by @vetclippy
- fix(anvil): reseed Base genesis state on reset (#17320) by @mattsse
- test(forge): snapshot EVM halt reasons (#17291) by @mablr
- refactor: dispatch execution networks exhaustively (#17342) by @mattsse
- fix(forge): check gas snapshots once after all suites (#17318) by @mattsse
- fix(cast): stop double-encoding decode-tx output (#17317) by @mattsse
- fix(cast): accept unit suffixes in TxParams gas prices (#17316) by @mattsse
- fix(evm): reject unknown hardfork namespaces (#17315) by @mattsse
- fix(anvil): reject pending in block trace methods (#17309) by @mattsse
- fix(anvil): run fee-free calls at zero base and blob base fees (#17310) by @mattsse
- fix(anvil): reject conflicting call fee and input fields (#17307) by @mattsse
- fix(anvil): fill omitted Tempo call nonce from state (#17326) by @mattsse
- refactor: remove dead code from shared and evm crates (#17339) by @mattsse
- refactor(cheatcodes): extract expectCall matching (#17294) by @stevencartavia
- fix(anvil): report unknown trace blocks and transactions (#17306) by @mattsse
- refactor(cheatcodes): extract expectEmit matching (#17296) by @stevencartavia
- fix(anvil): cap omitted call gas by the sender's allowance (#17312) by @mattsse
- fix(anvil): omit nested precompile calls from mined traces (#17303) by @mattsse
- test(forge): assert results of filtered test runs (#17330) by @mattsse
- fix(tempo): resolve fee tokens on local Tempo nodes (#17327) by @mattsse
- refactor(cheatcodes): add read-only CheatsCtxt accessors (#17350) by @0xKarl98
- chore(deps): bump the ci-weekly group with 4 updates (#17371) by @dependabot[bot]
- chore: bump version to 1.8.5 (#17372) by @mablr
- fix(cast): decouple storage tests from forge (#17369) by @mablr
- refactor(evm): gate journal refresh behind Monad (#17370) by @mablr
- fix(cast): handle HTTP-wrapped RPC errors (#17361) by @figtracer
- refactor(verify): reuse fork network resolution (#17362) by @figtracer
- fix(evm): keep fork block normalization stable (#17365) by @figtracer
- ci: stop adding L-ignore to dependency bump PRs (#17374) by @figtracer
- fix(cheatcodes): stabilize unmet call reporting (#17375) by @mablr
- refactor: normalize byte and integer literals (#17366) by @decofe
- fix(lint): respect access-control return paths (#17379) by @mablr
- fix(forge): support --fork-state-by-number in test and script (#17352) by @figtracer