Skip to content

v1.6.0-rc1

Latest

Choose a tag to compare

@github-actions github-actions released this 22 Jan 15:25
· 770 commits to master since this release
b272ce3

Foundry v1.6.0

Foundry v1.6.0 brings Osaka as the default EVM hardfork, major performance improvements with parallelized stateless fuzzing and configurable invariant check intervals (up to 3.6x faster deep runs), enhanced security testing with improved reentrancy detection and time-based invariant fuzzing, and additional Tempo blockchain integration across forge, cast, and anvil.

We recently crossed 10,000 GitHub 🌟 — thank you to everyone who has contributed, reported issues, and helped improve Foundry!


Performance

Parallelized Stateless Fuzzing (#12713)

Fuzz tests now run across multiple worker threads, significantly improving execution speed on multi-core machines. Each worker maintains its own corpus and periodically syncs with a master corpus, enabling efficient parallel exploration while sharing discovered coverage. Workers automatically distribute runs evenly and aggregate results after completion.

Invariant check_interval Config (#13133)

New check_interval config option controls how often invariants are asserted during deep runs:

Value Behavior
0 Only assert on the last call of each run (fastest)
1 (default) Assert after every call (current behavior, most precise)
N Assert every N calls AND always on the last call

Benchmark: With check_interval = 10, deep invariant runs (1×1000 depth) are 3.6x faster (15.09s → 4.17s). Invariant checks consume ~86% of execution time in high-depth runs—reducing check frequency dramatically improves performance while still catching violations.

Other Performance Improvements


Security Testing

Improved Reentrancy Detection with call_override (#13127)

The call_override invariant testing feature now correctly detects ETH transfer reentrancy vulnerabilities, including:

  • EtherStore pattern: Classic DAO-style reentrancy where a handler sends ETH out and the attacker reenters
  • Rari Capital pattern: Protocol-level reentrancy where external protocols send ETH to handlers

Key fixes include proper ETH transfer via journal before callback injection, clearing REVM's cached bytecode for EOA targets, and overriding calls when either caller OR target is a handler contract. Validated against a reproduction of the April 2022 Rari Capital hack.

Time-based Invariant Fuzzing (#12616)

New max_time_delay and max_block_delay invariant configs enable fuzzing of block timestamp and block number on consecutive transactions. This helps discover time-dependent vulnerabilities that only manifest under specific block timing conditions. Counterexamples now display the vm.warp() and vm.roll() calls needed to reproduce failures.


Improved Integration

Foundry-toolchain TypeScript Rewrite

The foundry-toolchain GitHub Action has been completely rewritten in TypeScript for improved maintainability and reliability. See v1.7.0 release.

Foundryup Rust Rewrite (Experimental)

Foundry v1.6.0 is accompanied by a new Rust rewrite of foundryup for better maintainability, testing, and compatibility. At the moment the new foundryup installer is still experimental, but in next releases we plan to sunset the old one and provide a much better experience for managing foundry installs.

To try out the new foundryup run:

curl -L https://raw.githubusercontent.com/foundry-rs/foundryup/HEAD/foundryup-init.sh | bash
foundryup

Network Updates

Tempo Blockchain Integration

Additional Tempo network support is now available across the Foundry toolchain:

  • feat(forge): add --network tempo flag to forge init (#12819) by @onbjerg - Initialize projects pre-configured for Tempo
  • feat(cast): tempo nonce keys (#12977) by @onbjerg - Support for Tempo's nonce key system
  • feat(cast): add tempo tx construction support (#12973) by @onbjerg - Build and sign Tempo transactions
  • feat(anvil): basic tempo tx signing support (#12974) by @onbjerg - Local development with Tempo transactions
  • feat(foundryup): add Tempo support (#12775) by @zerosnacks - Install Tempo-enabled Foundry builds

Chain Support

  • feat: add XDC Network + SKALE Base support by bumping alloy-chains (#12710) by @zerosnacks
  • feat: use different gas calc for monad mainnet (#12615) by @QEDK
  • fix: use network-specific BaseFeeParams for Optimism in Anvil (#12944) by @haythemsellami

Forge

Features

Fixes

  • fix(forge): fail compilation on unresolved imports (#12848) by @subwaycookiecrunch
  • fix(forge): failing tests trigger early exit without --fail-fast (#12785) by @0xferrous
  • fix(forge): lookup path artifact if not in available artifacts (#12927) by @grandizzy
  • fix(forge): prevent gas underflow in delete operations on Cancun (#13157) by @gakonst
  • fix(forge): reseed cheatcodes rng in fuzz tests (#12843) by @DaniPopes
  • fix(forge): respect lint ignore config in solar compilation (#12978) by @tefyosL-sol
  • fix(forge fmt): fix incorrect indentation for chained struct calls (#13163) by @gakonst
  • fix(fmt): keep struct field access on same line after named args call (#13166) by @gakonst
  • fix(forge-lint): ignore compilation warnings in exit code (#13138) by @0xrusowsky
  • fix(coverage): write coverage file even when tests fail (#12717) by @0xferrous
  • fix(verify): handle lack of trailing slash in verifier url (#12806) by @onbjerg
  • fix(verify): improve error message for CREATE2 deployment failures in verify-bytecode (#13176) by @grandizzy
  • fix(verify): improve error message for unsupported chain in Etherscan verifier (#12685) by @DeVikingMark
  • fix(verify): mismatch between strip_prefix and strip_suffix (#12563) by @Bashmunta
  • fix(verify): support chains with custom Sourcify-compatible APIs (#13175) by @mattsse
  • fix(script): set msg.sender from TURNKEY_ADDRESS when using --turnkey (#13149) by @gakonst
  • fix(config): error on unknown profile with fallback for nested libs (#13153) by @gakonst
  • fix(config): preserve hyphenated profile names (#13172) by @gakonst
  • fix(config): prints error when accessing invalid etherscan config (#9951) by @andelf
  • fix(config): reject bare versions in compilation restrictions (#12955) by @tefyosL-sol
  • fix(config): warn on unknown keys in all config sections (#13154) by @grandizzy

Cheatcodes

Features

  • feat(cheatcodes): add getRecordedLogsJson cheatcode (#13093) by @grandizzy
  • feat(cheatcodes): support both 4844/7594 formats in attachBlob (#13054) by @mablr
  • feat(fuzz): add address mutation variant to select from dictionary (#13090) by @grandizzy

Fixes

  • fix(cheatcodes): vm.mockFunction to work correctly with delegatecall (#13117) by @quangloc99
  • fix(invariant): preserve state across calls during replay (#13084) by @grandizzy
  • fix(evm): pin fork block number to prevent state inconsistency (#13085) by @grandizzy
  • fix(evm): use timestamp-based blob base fee calculation (#12959) by @cakevm
  • fix: emit console.log on fuzz test last run at verbosity >= 2 (#12478) by @avorylli
  • fix(preprocessor): mark getCode as view in VmContractHelper (#13089) by @grandizzy

Cast

Features

  • feat(cast): add --curl flag to output equivalent curl commands (#13114) by @gakonst
  • feat(cast): add eip7594 support (#13058) by @mablr
  • feat(cast): add support for raw transaction data with --data flag in send (#12712) by @Jds-23
  • feat(cast): add trace_transaction and trace_rawTransaction (#12788) by @figtracer
  • feat(cast): add tx flags to erc20 command (#13002) by @mablr
  • feat(cast): cache Etherscan sources under Foundry cache with temp fallback (#12025) by @sashass1315
  • feat(cast): derive accounts from mnemonic (#12700) by @leovct
  • feat(cast): strip WalletOpts and EtherscanOpts from cast subcommands that dont expect a signer or need etherscan api (#12705) by @tskoyo
  • feat(cast): wallet sign-auth --self-broadcast (#12624) by @0xferrous
  • feat(cast): accept multiple 7702 authorizations (#12627) by @0xferrous
  • feat(cast): --replay-system-txes / --sys arg to cast run system txes (#12853) by @grandizzy
  • feat: alias cast erc20 transfer to cast erc20 send (#12990) by @onbjerg
  • feat: support cast logs query chunking (#12692) by @stevencartavia

Fixes


Anvil

Features

  • feat(anvil): add eth_fillTransaction support (#12595) by @mablr
  • feat(anvil): extend Content-Type support on Beacon API (#12611) by @mablr

Fixes

  • fix(anvil): insufficient allowance → insufficient balance (#12855) by @anim001k
  • fix(anvil): propagate gas estimation errors (#12813) by @jxom
  • fix(anvil): resolve incorrect historical states dump behavior (#12732) by @w1tcher
  • fix(anvil): use B256 instead of TxHash for block hash parameters (#12961) by @PivasDesant
  • fix(anvil): use suggested priority fee by default (#13092) by @tefyosL-sol

Chisel

Fixes


Other

  • feat: add precompile decoding for Prague BLS12-381 and Osaka P256VERIFY (#13094) by @DaniPopes
  • feat: support solc prereleases (#12599) by @grandizzy
  • feat(docker): add semver major/minor floating tags on release (#13182) by @zerosnacks
  • fix(cli): add --no-proxy to disable reqwest proxying to prevent crash on macOS in sandboxed environments (#13155) by @gakonst
  • fix(foundryup): strip leading backslash from sha256sum (#12827) by @DaniPopes
  • fix: svm fails to download solc 0.8.33 on linux/arm64, bump svm-rs (#13007) by @zerosnacks
  • added MONAD_SYSTEM_ADDRESS (#12585) by @Jayakumar
  • docs(config): complete fuzz and invariant sections with 20+ missing options (#12789) by @aso20455
  • docs(lint): add missing lint rules to README (#12758) by @dizer-ti
  • docs: clean up config docs (#12296) by @onbjerg
  • chore(deps): update to soldeer 0.10.0 (#12835) by @beeb
  • chore(deps): update figment to figment2 v0.11 (#13099) by @DaniPopes
  • chore(deps): bump to revm 34 (#13130) by @zerosnacks
  • chore(deps): bump mdbook to 0.5 (#13064) by @zerosnacks
  • chore: bump evm-disassembler version to support CLZ and EOF opcodes (#13050) by @ChristN
  • chore(anvil): deprecate getBlobSidecars Beacon API endpoint (#12568) by @mablr
  • chore(anvil): remove anvil_getBlobSidecarsByBlockId endpoint (#13022) by @mablr

Full Changelog

v1.5.1...v1.6.0