Foundry v1.7.0
Foundry v1.7.0 brings major improvements to fuzzing and invariant testing, upstreams Tempo support into the main Foundry toolchain, adds support for HTTP 402-gated RPC endpoints through MPP, improves browser-wallet and batching workflows across Forge and Cast, and moves Foundry releases to an immutable versioning model.
v1.7.0 folds in the previously cut
v1.6.0-rc1release candidate, which never shipped as stable, together with the changes merged since.
Highlights
Testing & Fuzzing
- Parallelized stateless fuzzing across worker threads with shared corpus (#12713)
- Invariant
check_intervalconfig — deep invariant runs up to 3.6× faster withcheck_interval = 10(#13133) - Invariant optimization mode — search input sequences that maximize a target value, with realtime best-value tracking and persistence (#13196, #14147, #14226)
- Improved reentrancy detection in
call_overrideinvariant testing (#13127) - Time-based invariant fuzzing via
max_time_delay/max_block_delayconfigs (#12616)
Network Updates
- Osaka is the default EVM hardfork (#13112), with precompile decoding for Prague BLS12-381 and Osaka P256VERIFY (#13094)
- Per-network
hardforkandnetworkkeys infoundry.toml(#14312, #14337), with auto-detection from a fork's chain ID (#14193)
Tempo
Tempo support has been upstreamed from the standalone tempoxyz/tempo-foundry fork into foundry-rs/foundry. The fork is deprecated; a normal foundryup install now ships Tempo support in forge, cast, anvil, and chisel.
This is 110 merged PRs spanning execution, RPC, transaction signing and validation, the AA/access-key flow, TIP20 fee tokens, cast keychain, forge create/script/test/coverage integration, Anvil genesis + pool + tracing, and CI. Notable entry points include:
forge init --network tempo(#12819)cast keychainfor Tempo access keys (#14166, #14222)cast tip20 createand TIP20 virtual address salt mining (#14160, #14365)--tempo.fee-tokenonforge scriptandcast send(#14204, #14184)- Tempo network auto-detection on
anvil --fork-url(#14279)
Full list in the Tempo section below.
MPP (Machine Payments Protocol)
Foundry now supports MPP (Machine Payments Protocol) for HTTP 402-gated RPC endpoints. When an RPC provider returns 402, Foundry signs and pays the challenge with the configured wallet, then retries the request — no API keys or upfront provisioning. A built-in URL mapping covers known providers, and a WebSocket transport handles long-lived subscriptions over paid connections (#14192, #14404, #14353).
Forge & Cast
- Browser wallet support across
forge script(#12952),forge create(#14394),cast send(#13747), andcast erc20(#14395) — sign and broadcast transactions directly from a browser wallet extension instead of provisioning a hot key on disk - Realtime
console.loginforgeandchisel(#13321) andconsole.tablesupport (#14338) forge inspect <x> linearization(#13704) makes it easier to inspect where inherited functions are resolved fromforge cloneSourcify support (#12900)cast batch-send/batch-mktxfor native call batching (#13973)cast --curlflag to print equivalent curl commands (#13114)
Cheatcodes & Lint
- New cheatcodes:
executeTransaction(#13437),Ed25519crypto (#13450),getRecordedLogsJson(#13093),currentFilePath(#13735) - New
forge-lintrules: incorrect ERC20 interface (#14428), incorrect ERC721 interface (#14412),block-timestamp(#14431), and custom errors (#13126). These catch incorrect ERC20/ERC721 interface implementations, timestamp-dependent logic, and custom-error usage issues.
Benchmarks
Live dashboard: getfoundry.sh/benchmarks
Headline wins per command, comparing v1.5.1 against the v1.7.0 release-cycle build:
| Command | Repository | v1.5.1 | v1.7.0 | Delta |
|---|---|---|---|---|
forge test
| aave/aave-v4
| 4m 14.2s | 3m 29.1s | ~45s faster |
forge fuzz
| ithacaxyz/account
| 2.81s | 1.59s | ~1.8× faster |
forge test --isolated
| aave/aave-v4
| 4m 14.0s | 3m 53.4s | ~20s faster |
forge coverage
| aave/aave-v4
| 11m 20.8s | 10m 58.7s | ~22s faster |
Raw data: benches/LATEST.md.
Performance-related features (22 PRs)
ots_getBlockTransactions (#13243) by @aganisgash
Executor.backend in Arc for copy-on-write cloning (#13327) by @gakonst
get (#13361) by @cuiweixie
prove_storage instead of recomputing (#13363) by @thunggis
_with_root (#13389) by @0xMars42
create_access_list (#13887) by @edgarr1986
NestedEvm::to_evm_env consuming to avoid useless clone (#13893) by @mablr
do_call_end/do_create_end (#13913) by @figtracer
EvmEnv/TxEnv cloning in DBs & CheatcodesExecutor impls (#13960) by @mablr
identify_addresses (#14198) by @decofe
asm-keccak a default feature in all binaries (#14389) by @DaniPopes
Breaking / Behavior Changes
forgeandanvilnow default to Osaka (#13112).- Fuzz tests now use a random seed by default when none is provided (#13309).
copyStorageandsetArbitraryStorageare now markedUnsafe(#13882).- Compilation now fails on unresolved imports instead of continuing (#12848).
foundry.tomlnow supports per-networkhardforkselection and an explicitnetworkkey (#14312, #14337); forked runs can also auto-detect the active network from chain ID (#14193).
Upgrade Notes
- Run
forge buildafter upgrading. Compilation now fails on unresolved imports instead of silently continuing (#12848) — projects with stale remappings or dead imports that previously compiled may now error. Fix by correcting the remapping or removing the dead import. - If you rely on reproducible fuzz runs, pin a fuzz seed explicitly. v1.7.0 now generates a random seed when none is provided (#13309).
- If you rely on
copyStorageorsetArbitraryStorage, update tests and helpers to account for these cheatcodes now being markedUnsafe(#13882). - If you previously configured a single
hardfork, migrate to the newnetwork/ per-networkhardforksettings (#14312, #14337). Forked runs can also infer the active network from chain ID (#14193).
Testing & Fuzzing
Parallelized Stateless Fuzzing (#12713)
Stateless 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. Stateful (invariant) tests are not parallelized in this release.
Invariant check_interval Config (#13133)
A 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 |
[invariant]
depth = 1000
check_interval = 10Benchmark: With check_interval = 10, deep invariant runs (1×1000 depth) are 3.6× faster (15.09s → 4.17s).
Caveat: with
check_interval > 1, an invariant that is violated and then restored between checks can be missed.
Invariant Optimization Mode (#13196, #14147, #14226)
Define an invariant_* function that returns int256 and the fuzzer searches for the call sequence that maximizes it. Useful for finding worst-case rounding errors, drained balances, max slippage, etc.
function invariant_optimize_maxRoundingError() external view returns (int256) {
return int256(pool.totalShares()) - int256(pool.expectedShares());
}The best value and shrunk reproducer are tracked in realtime and persisted across runs.
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
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.
Other Testing Improvements
Smaller polish across the fuzzing and invariant pipeline: clearer reporting of assertion failures, faster feedback on broken invariants, more reliable counterexample replay, and broader fuzz coverage including native Rust code.
Other testing improvements (5 PRs)
assert(), vm.assert*, panics) are now reported as invariant failures during campaigns instead of being silently discarded with reverts (#14275)
Network Updates
Multi-Network Execution
The entire foundry-evm and anvil stack has been genericized over Network, Spec, Block, and EvmFactory, allowing one Foundry binary to drive Ethereum, Optimism, and Tempo through the same execution path. See the Internals section below for the full list of refactor PRs.
Notable consequences:
- A new
networkkey infoundry.tomland per-networkhardforkselection (#14337, #14312) - Auto-detection of the active network from a fork's chain ID (#14193)
[profile.default]
tempo = true # marks Tempo as the active non-Ethereum network
hardfork = "tempo:T3" # namespaced hardfork; bare names like "osaka" still work for EthereumHardforks can also be set per-test via inline config:
/// forge-config: default.hardfork = "tempo:T3"
function test_something() public { ... }forge init --network tempo writes the tempo = true key for you. Forked runs (forge test --fork-url ...) infer the network from chain ID, so the network key is only required when there is no fork to infer from.
Other Chain Support
Per-chain quirks landed across XDC, SKALE, Polkadot, Optimism, Monad, MegaETH, Arbitrum, and Etherlink — covering RPC gas estimation, base-fee parameters, system-tx senders, and fork block pinning.
Other chain support (8 PRs)
BaseFeeParams for Optimism in Anvil (#12944)
Improved Integration
Immutable Releases (#14445)
Foundry releases are now fully immutable. The mutable nightly, stable, and rc Git tags are gone — only semver tags (v*.*.*) and per-commit nightly-{SHA} releases exist.
For foundryup users:
latestis the new default channel (alias:stable).nightlyresolves to the most recentnightly-{SHA}prerelease.- Pinning to a specific build (
foundryup -i v1.7.0orfoundryup -i nightly-abc1234) continues to work and is now permanently reproducible.
Docker tags follow the same model: version releases get :v1.7.0, :v1.7, :v1; nightlies are tagged as nightly-{SHA}.
Foundryup Rust Rewrite (Experimental)
This release is accompanied by a new Rust rewrite of foundryup for better maintainability, testing, and compatibility. The rewrite is still experimental; the existing installer remains the recommended path for now. To try the new foundryup:
curl -L https://raw.githubusercontent.com/foundry-rs/foundryup/HEAD/foundryup-init.sh | bash
foundryupFoundry-toolchain TypeScript Rewrite
The foundry-toolchain GitHub Action has been completely rewritten in TypeScript for improved maintainability and reliability. See the v1.7.0 release.
foundry-core
The previously standalone foundry-fork-db, foundry-compilers, foundry-block-explorers (+ foundry-blob-explorers), and foundry-wallets crates are now maintained under foundry-rs/foundry-core and consumed as published crates (#14348, #14427, #14443).
Other Integration Changes
Hardening of the publishing pipeline: trusted OIDC for npm and proper semver floating tags for Docker.
Tempo
Full PR breakdown for the Tempo upstreaming.
Fork deprecation, CI upstreaming &
foundryup
bump-tempo workflow (#14323) by @mablr
bump-tempo (#14343) by @decofe
bump-tempo workflow (#14377) by @decofe
Onboarding & project setup
foundryup): add Tempo support (#12775) by @zerosnacks
--network tempo flag to forge init (#12819) by @onbjerg
foundryup): bump foundryup version (#13832) by @zerosnacks
SignatureVerifier to tempo example (#14351) by @0xrusowsky
network: tempo from Tempo template (#14424) by @zerosnacks
nonceKey cli flag naming (#14188) by @mablr
Execution path & EVM integration
NetworkConfigs (#13953) by @stevencartavia
FoundryHardfork::Tempo variant (#13972) by @stevencartavia
TempoFoundryEvm wrapper (#14022) by @figtracer
FoundryContextExt Tempo impl (#14002) by @mablr
FoundryTransaction with Tempo methods (#14005) by @figtracer
FoundryBlock with Tempo methods (#14004) by @figtracer
TryAnyToTxEnv Tempo impl (#14011) by @mablr
PATH_USD_ADDRESS from tempo-contracts (#14071) by @figtracer
FoundryStorageProvider to TempoStorageProvider (#14080) by @figtracer
FoundryHardfork on Backend (#14105) by @stevencartavia
anvil_nodeInfo (#14093) by @stevencartavia
TipFeeManager in anvil_* namespace (#14414) by @mablr
CallTraceDecoder (#14213) by @mablr
TempoLabels inspector for TIP20 token names (#14072) by @figtracer
alloy-chains + TempoDevnet handling (#14309) by @mablr
ChannelDb for channel persistence (#14355) by @stevencartavia
Transactions, pool & gas
TempoInvalidTransaction (#14040) by @stevencartavia
not-yet-valid transactions during mining (#14069) by @stevencartavia
feePayer to Tempo receipts (#14109) by @stevencartavia
InspectorTxConfig and PoolTxGasConfig builders (#14152) by @stevencartavia
Wallets, keychain & access keys
cast keychain (#14166) by @figtracer
cast keychain suite (#14222) by @figtracer
--tempo.access-key and --tempo.root-account (#14201) by @figtracer
forge create Tempo keychain support (#14185) by @figtracer
run_tempo_keychain into run_generic as AccessKey case (#14137) by @mablr
sign_with_access_key with provisioning check (#14189) by @figtracer
FoundryTransactionBuilder::sign_with_access_key method (#14120) by @mablr
keychain auth legacy mode w/ forks before T3 (#14311) by @mablr
deny_unknown_fields (#14322) by @figtracer
TIP20 / fee token
ISO 4217 validation for TIP-20 (#14158) by @figtracer
cast tip20 create (#14160) by @figtracer
cast send ISO 4217 validation for TIP20Factory (#14184) by @figtracer
--tempo.fee-token to forge script (#14204) by @figtracer
--tempo.fee-token token id parsing (#14219) by @mablr
fee_token to deploy_tokens in CreateArgs::deploy (#14221) by @mablr
fee_token handling in InspectorHandler & Cheatcodes (#14225) by @mablr
FoundryEvmFactory (#14159) by @mablr
Forge / Cast / Script integration
forge test/coverage Tempo support (#14165) by @mablr
--batch flag for Tempo native batching (#14167) by @mablr
script/test Tempo selection when used w/ Anvil (#14258) by @mablr
deploy_create2_deployer in tempo mode to avoid CreateCollision (#14336) by @mablr
executeTransaction (#14318) by @0xrusowsky
hardfork in foundry.toml (#14312) by @0xrusowsky
network key in foundry.toml (#14337) by @mablr
Tests, deps & docs
39b9262 (#14345) by @decofe
src/tempo.rs, inline helpers (#14162) by @figtracer
createToken salt parameter (#14164) by @mablr
MPP (Machine Payments Protocol)
Full PR breakdown for end-to-end MPP support — 402 challenge handling, retry logic, a built-in RPC URL mapping, a WebSocket transport for paid subscriptions, and dedicated CI coverage.
MPP changes (6 PRs)
Forge
Features
Headline Forge changes: Osaka becomes the default hardfork, browser-wallet signing extends to forge script / forge create, realtime console.log / console.table, random fuzz seeds by default, Sourcify support in forge clone, forge inspect linearization, and broader network/solc compatibility.
Forge features (15 PRs)
forge script): add --interactive flag for deploying with a single keypair (#12608) by @zerosnacks
forge verify-bytecode automatically recompiles upon running (#12651) by @Jds-23
forge clone (#12900) by @avorylli
soldeer.lock revision mismatch during build (#12366) by @silvekkk
forge inspect <x> linearization (#13704) by @red-swan
Network support for forge create (#13733) by @figtracer
console.log (#13321) by @quangloc99
console.table (#14338) by @ndavd
forge script (#12952) by @mablr
create subcommand (#14394) by @mablr
Forge fixes (22 PRs)
svm fails to download solc 0.8.33 on linux/arm64, bump svm-rs (#13007) by @zerosnacks
--fail-fast (#12785) by @0xferrous
setUp as test setup if it has no parameters (#13204) by @mattsse
--access-list in forge create (#13557) by @FredPhilipy
CounterWithFallback (#14465) by @mablr
Git::is_repo_root always returns false (#13505) by @letmehateu
find command (#13516) by @anim001k
init reuse NetworkVariant (#14182) by @mablr
networks fields (#14183) by @mablr
TempDir guard in clone test to prevent premature cleanup (#13471) by @mattsse
forge-std version (#13482, #14422) by @github-actions
Cheatcodes, Fuzz & Invariant
Cheatcode features
-
feat(cheatcodes): add
getRecordedLogsJsoncheatcode (#13093) by @grandizzy -
feat(cheatcodes): support both 4844/7594 formats in
attachBlob(#13054) by @mablr -
feat: add
executeTransactioncheatcode (#13437) by @onbjergReplays a fully-signed RLP-encoded transaction in an isolated EVM context, recovering the signer from the signature. State changes merge back into the parent context.
function executeTransaction(bytes calldata rawTx) external returns (bytes memory);
-
feat(cheatcodes): add Ed25519 crypto cheatcodes (#13450) by @howydev
bytes32 privateKey = vm.createEd25519Key(salt); bytes32 publicKey = vm.publicKeyEd25519(privateKey); bytes memory sig = vm.signEd25519("namespace", message, privateKey); bool ok = vm.verifyEd25519(sig, "namespace", message, publicKey);
-
feat(cheatcodes): add
currentFilePathcheatcode (#13735) by @alextnetto
Cheatcode fixes (17 PRs)
- fix(cheatcodes):
vm.mockFunctionto work correctly withdelegatecall(#13117) by @quangloc99 - 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.logon fuzz test last run at verbosity >= 2 (#12478) by @avorylli - fix(preprocessor): mark
getCodeas view inVmContractHelper(#13089) by @grandizzy - fix(cheatcodes): fix
vm.expectRevertfor direct precompile calls (#13460) by @gakonst - fix(cheatcodes): make
vm.executeTransactionwork in isolation mode (#13475) by @gakonst - fix(cheatcodes): preserve nested EVM changes on
executeTransaction(#13645) by @figtracer - fix(cheatcodes): prevent panic in
expectRevertwith empty bytes (#13769) by @decofe - fix(cheatcodes): create file in
writeJson/writeToml3-arg overload (#13777) by @decofe - fix(cheatcodes): fix interval notation in memory error (#14126) by @zeroprooff
- fix(cheatcodes): reject nested debug trace recording (#14423) by @Perico-perica46
- fix(cheatcodes): read broadcasts with the active network (#14388) by @solanaXpeter
- fix
vm.rpccheatcode ABI encoding for structs (#13842) by @e1Ru1o - refactor: use native Solidity types for
vm.rpcstruct decoding (#14050) by @decofe - evm: only classify skip reverts from cheatcode address (#14264) by @ArshLabs
- fix(macros): use correct index for tuple struct fields in
ConsoleFmt(#13829) by @dizer-ti
Fuzz
Improvements to mutation strategies and coverage-guided fuzzing for native Rust code, plus minor correctness fixes.
Fuzz changes (4 PRs)
< to <= in validate_uint_mutation (#14459) by @cuiweixie
Invariant
Better counterexample validation, surfacing of assertion failures, and faster reporting of broken invariants. Optimization-mode PRs (#13196, #14147, #14226) and other testing improvements are listed under Testing & Fuzzing.
Invariant changes (6 PRs)
fail_on_assert for assertion failures in invariant campaigns (#14275) by @0xKarl98
Cast
Wallets, signing & account inputs
Mnemonic-derived accounts, multi-authorization 7702 flows, browser-wallet receipt handling for cast send / cast erc20, plus cleanups around WalletOpts / EtherscanOpts.
Wallets, signing & account inputs (9 PRs)
WalletOpts and EtherscanOpts from subcommands that don't expect a signer or need Etherscan API (#12705) by @tskoyo
wallet sign-auth --self-broadcast (#12624) by @0xferrous
cast send (#13747) by @figtracer
erc20 commands (#14395) by @figtracer
0x prefix in sign-auth output (#14143) by @zeroprooff
current_dir in keystore overwrite tests (#13690) by @mablr
Transactions, batching & gas
Native call batching (batch-send / batch-mktx), EIP-7594 support, raw-tx flags, system-tx replay, network-aware encoding, and a wave of correctness fixes around boundary checks and historical execution.
Transactions, batching & gas (15 PRs)
--data flag in send (#12712) by @Jds-23
--data flag to access-list command (#13515) by @VolodymyrBg
erc20 command (#13002) by @mablr
cast erc20 transfer to cast erc20 send (#12990) by @onbjerg
batch-send and batch-mktx commands for native call batching (#13973) by @stevencartavia
--replay-system-txes / --sys arg to cast run system txes (#12853) by @grandizzy
--network flag to cast tx for network-specific raw encoding (#13745) by @mablr
block --raw network selection (#13754) by @mablr
batch-send handling by clearing to/value fields (#14250) by @mablr
batch-mktx clearing (#14252) by @stevencartavia
max_int boundary check for uint255 (#13568) by @zeroprooff
0x-prefixed value inputs (#14406) by @figtracer
cast send (#14385) by @0xrusowsky
Tracing, inspection & interface tooling
--curl for reproducing requests, trace_transaction / trace_rawTransaction, --flatten for cast interface, persistent Etherscan source cache, query chunking for cast logs, plus --json parity across erc20 commands.
Tracing, inspection & interface tooling (11 PRs)
--curl flag to output equivalent curl commands (#13114) by @gakonst
trace_transaction and trace_rawTransaction (#12788) by @figtracer
--flatten flag to cast interface (#13201) by @mattsse
cast logs query chunking (#12692) by @stevencartavia
decode-tx generic over Network (#14199) by @mablr
cast storage when Etherscan cache is unavailable (#13418) by @thunggis
chain() call in explorer_client (#13272) by @tefyosL-sol
--json support for erc20 cmds (#12727) by @0xferrous
erc20 decimals (#13438) by @DanielGuupta
Reliability & RPC plumbing
Smaller robustness fixes for sender enumeration, threads handling, plasma verifier errors, and flaky-test cleanup.
Reliability & RPC plumbing (4 PRs)
Generic-
Network refactors (11 PRs)
CastTxBuilder (#13533) by @mablr
send+erc20 generic Network support (#13587) by @mablr
Cast generic Network support (#13624) by @mablr
estimate generic network (#13622) by @mablr
call generic Network support (#13634) by @mablr
access-list generic Network support (#13635) by @mablr
da-estimate generic Network (#14194) by @mablr
cast call (#14157) by @figtracer
cast run (#14121) by @figtracer
block_env access -> trait methods (#14119) by @figtracer
Cast (#13776) by @mablr
Anvil
Features
New RPC endpoints (trace_replayBlockTransactions, eth_fillTransaction, eth_getStorageValues, debug_traceBlockBy{Hash,Number}), EIP-2935 / EIP-3860 / EIP-7825 support, multi-fork-URL round-robin load balancing, and new CLI flags for tx gas limits and pool sizing.
Anvil features (14 PRs)
eth_fillTransaction support (#12595) by @mablr
trace_replayBlockTransactions endpoint for block txs tracing (#13098) by @mablr
--enable-tx-gas-limit CLI flag for EIP-7825 support (#13307) by @DanielGuupta
--max-transactions CLI flag (#13495) by @DanielGuupta
anvil_enableTraces endpoint (#13499) by @DanielGuupta
eth_getStorageValues RPC method (#13971) by @stevencartavia
Metadata client_semver (#14229) by @ndavd
debug_traceBlockByHash and debug_traceBlockByNumber (#14391) by @exp0nge
Anvil fixes (46 PRs)
B256 instead of TxHash for block hash parameters (#12961) by @pivasdesant
genesis_hash when loading state with block 0 (#13197) by @mattsse
contractAddress in receipt for reverted contract creation (#13195) by @mattsse
SerializableBlock for state dump/load (#13227) by @echowandere
chain_id fallback for blob params (#13241) by @echowandere
with_database_at (#13267) by @thunggis
chain_id fallback in fork setup (#13276) by @tefyosL-sol
ReadyTransactions::remove_with_markers (#13436) by @letmehateu
anvil_addBalance (#13457) by @DanielGuupta
blob_gas_used_ratio calculation in fee history (#13491) by @letmehateu
utc_from_secs for out-of-range timestamps (#13520) by @stevencartavia
update_url (#13531) by @gutonosa
enveloped_tx (#13537) by @gutonosa
anvil_reset (#13544) by @FredPhilipy
rpc_before assertion in deep reorg blockhash test (#13586) by @FredPhilipy
#[serde(default)] for backward compat in TransactionWithMetadata (#13684) by @gutonosa
get_next_block_blob_excess_gas to match callers (#13740) by @gutonosa
test_trace_filter() (#13764) by @figtracer
versioned_hashes in beacon blobs endpoint (#13787) by @FredPhilipy
mined_parity_trace_block (#13977) by @FredPhilipy
InMemoryBlockStates on rollback (#13978) by @FredPhilipy
BlockTransactions::Uncle without panic (#14135) by @strmfos
<= for pending pool replacement underprice check (#14254) by @cuiweixie
evm_setTime (#14292) by @decofe
eth_getLogs with unknown blockHash instead of empty (#14371) by @spalladino
test_increase_time_by_zero test (#14430) by @figtracer
Anvil cleanup / refactors (23 PRs)
impersonated_signature logic (#13187) by @mablr
getBlobSidecars Beacon API endpoint (#12568) by @mablr
anvil_getBlobSidecarsByBlockId endpoint (#13022) by @mablr
populate_blob_hashes() (#13308) by @mablr
is_ok since it's more robust (#13377) by @cuiweixie
alloy-eip5792 dev-dependency (#13640) by @strmfos
transaction_by_sender_and_nonce (#13638) by @Aboudjem
evm tests by removing useless Env wrapper (#13750) by @mablr
transaction_at_block_index in fork (#14271) by @stevencartavia
build_block_info helper (#14251) by @stevencartavia
BlockEnv construction (#13729) by @figtracer
run! macro (#14168) by @stevencartavia
unpack_execution_result helper (#14181) by @stevencartavia
inject_precompiles (#13956) by @figtracer
build_mining_inspector (#13961) by @figtracer
block_env_from_header utility (#13838) by @figtracer
execute_pool_transactions (#13940) by @figtracer
rehash helper for transaction hash replacement (#14151) by @stevencartavia
finish_transaction (#13932) by @figtracer
FeeDetails match arm (#14130) by @stevencartavia
Chisel
Stability fixes for invalid pc/memory access and uninitialized variable handling. Realtime console.log is shared with forge (#13321) — see the Forge section.
Chisel changes (2 PRs)
Forge Lint
Features
These catch incorrect ERC20/ERC721 interface implementations, timestamp-dependent logic, and custom-error usage issues. Also includes lower default verbosity, mixedCase exception tweaks, and broader visitor coverage.
Forge Lint features (8 PRs)
forge-lint): add custom errors rule (#13126) by @milosdjurica
LinterConfig and add 3 new linting rules (#12581) by @milosdjurica
EarlyLintVisitor (#13454) by @hawkadrian
block-timestamp lint (#14431) by @stevencartavia
Fixes
Exit-code semantics for compilation warnings, unreachable macro cleanup, and missing late-visitor methods.
Forge Lint fixes (3 PRs)
forge-lint): ignore compilation warnings in exit code (#13138) by @0xrusowsky
declare_forge_lint (#13452) by @aso20455
LateLintVisitor (#14276) by @solanaXpeter
Forge Fmt
Features
A new namespace_import_style config and generic pretty-printing across blocks, transactions, receipts, OP envelopes, and Tempo receipts.
Forge Fmt features (5 PRs)
namespace_import_style config (#13108) by @quangloc99
TransactionReceiptWithRevertReason + pretty printing (#13503) by @mablr
TempoTransactionReceipt (#13594) by @mablr
OpTxEnvelope/Transaction pretty printing (#13734) by @mablr
Fixes
Indentation correctness for chained struct calls, empty contracts, named-args calls, and multi-statement control blocks; plus total_difficulty and Tempo pretty-print fixes.
Forge Fmt fixes (9 PRs)
forge fmt): fix incorrect indentation for chained struct calls (#13163) by @gakonst
while/for/if blocks with multiple statements (#13566) by @MarkFizz77
total_difficulty attribute name (#13578) by @eeemmmmmm
valid_before/valid_after in TempoTransaction pretty print (#13910) by @dizer-ti
total_difficulty for totalDifficulty (#13919) by @edgarr1986
pretty_receipt helper (#14191) by @figtracer
Verification
Features
Auto-recompile on forge verify-bytecode, custom verifier URLs for unknown Etherscan chains, and clearer Etherscan-key error messages.
Verify features (3 PRs)
Verify fixes (13 PRs)
verify-bytecode (#13176) by @grandizzy
strip_prefix and strip_suffix (#12563) by @Bashmunta
VerificationContext (#13481) by @Forostovec
Coverage
Coverage output is now produced even when tests fail, BRDA hit counts match LCOV expectations, and stack-too-deep warnings link to the troubleshooting guide.
Traces & Debugger
Features
A new -d / --depth trace flag (analogous to tree) and the debugger now shows actual gas usage alongside refunds.
Fixes
Decoder cache hygiene, verbosity unification, safer Sourcify parsing, panic guards on invalid source spans, and improved expectRevert formatting.
Traces & Debugger fixes (7 PRs)
non_fallback_contracts in decoder reset (#13671) by @gutonosa
expectRevert payload before revert formatting (#13981) by @ArshLabs
Wallets
Features
Browser-wallet flows extended to forge script / forge create, generic Network MultiWallet, new BrowserWalletOpts, and a --browser priority-fee patch.
Wallet features (6 PRs)
forge script (#12952) by @mablr
NetworkWallet<FoundryNetwork> impl for EthereumWallet (#13248) by @mablr
BrowserWalletOpts (#13602) by @mablr
MultiWallet generic Network (#13648) by @mablr
--browser priority fee (#13700) by @sakulstra
create subcommand (#14394) by @mablr
Wallets fixes & refactors (15 PRs)
FoundryTransactionRequest::build_typed_tx (#13218) by @mablr
NetworkWallet<FoundryNetwork> impl for WalletSigner (#13343) by @mablr
turnkey_unsupported() instead of hardcoded error (#13535) by @zeroprooff
Network (#13550) by @mablr
Browser from WalletSigner (#13613) by @mablr
BrowserSigner from MultiWallet (#13839) by @mablr
wallets crate to foundry-core (#14348) by @mablr
foundry-wallets dep (#14409) by @mablr
foundry-wallets release (#14429) by @zerosnacks
foundry-wallets browser/tempo features (#14421) by @mablr
ProviderBuilder generic over Network (#13250) by @mablr
ProviderBuilder::from_config method (#13268) by @mablr
Script & Broadcast
Features
The script pipeline (ScriptSequence, ScriptResult, ScriptConfig, BundledState, ScriptTransactionBuilder, …) is now fully Network-generic, enabling Tempo and Optimism scripting through the same code paths as Ethereum.
Script & Broadcast features (10 PRs)
estimate_gas + FoundryTransactionBuilder::reset_gas_limit method (#13706) by @mablr
TxStatus receipt type (#13770) by @mablr
TransactionWithMetadata + generic pretty printing for TransactionMaybeSigned (#13795) by @mablr
Network-generic ScriptSequence<N> (#13803) by @mablr
Network-generic ScriptSequenceKind<N> (#13809) by @mablr
BundledState impl (#13825) by @mablr
ScriptTransactionBuilder (#13830) by @mablr
ScriptResult, ProvidersManager and state structs Network-generic (#14104) by @mablr
ScriptConfig generic Network, FoundryEvmFactory (#14115) by @mablr
forge script generic over FoundryEvmNetwork (#14125) by @mablr
Fixes
Sender resolution improvements (--turnkey msg.sender, single-keystore auto-set) and preservation of exit reason on failed revert decoding.
Script & Broadcast fixes (3 PRs)
Script cleanup / refactors (10 PRs)
fs::write_pretty_json_file in MultiChainSequence::save (#13510) by @prestoalvarez
fs::write_pretty_json_file in ScriptSequence::save (#13562) by @MarkFizz77
EitherSigner abstraction (#13649) by @mablr
get_http_provider / try_get_http_provider usage (#13702) by @figtracer
BroadcastReader::into_tx_receipts (#13771) by @mablr
opcode field to call_kind (#13907) by @anim001k
EvmOpts resolution (#14217) by @mablr
AnyNetwork misuse (#13686) by @mablr
Config
Features
foundry.toml gains a network key and per-network hardfork selection, plus ignored_error_codes_from and curl mode as a config key.
Config features (4 PRs)
Config fixes (14 PRs)
skip_serializing_if fields (#13318) by @gakonst
FOUNDRY_PROFILE: ci in template workflows, profile does not exist (#13339) by @zerosnacks
deny_warnings from env vars (#13434) by @aso20455
FuzzDictionaryConfig usize fields (#13723) by @gutonosa
optimizer_runs does not exceed u32::MAX (#14354) by @FredPhilipy
CLI
Markdown docs generation, log routing to stderr, --no-proxy for sandboxed macOS, common RPC opts extraction, and a handful of error-handling and EtherscanOpts polishing.
CLI changes (11 PRs)
display_chain helper in CLI error handler (#13314) by @prestoalvarez
--no-proxy to disable reqwest proxying to prevent crash on macOS in sandboxed environments (#13155) by @gakonst
RpcCommonOpts (#14224) by @figtracer
--rpc-url (#14246) by @mablr
chain_id in EtherscanOpts::dict() (#14335) by @decofe
NetworkVariant with NetworkConfigs (#14426) by @mablr
Git impl more robust (#14452)
TryFrom<Result<RawCallResult>> on TraceResult (#14122) by @figtracer
Internals: generic Network / EVM refactor
Mostly relevant to contributors and downstream integrators. The largest internal refactor since the revm/alloy migration: the entire foundry-evm, cheatcodes, script, cast, and anvil stacks were genericized over Network, Spec, Block, and EvmFactory, enabling a single Foundry binary to drive Ethereum, Optimism, and Tempo through the same code paths.
This work spans ~260 PRs, primarily by @mablr, @figtracer, and @stevencartavia, broken down roughly as:
foundry-evmcore: ~130 PRs (Backend,Executor,DatabaseExt,InspectorStack,FoundryEvmFactory,FoundryContextExt,NestedEvm, etc. all generic;Envabstraction removed;EthFoundryEvmFactoryandOpEvmNetworkintroduced)- Cheatcodes generic refactor: ~30 PRs (
Cheatcodes,CheatcodesExecutor,BroadcastableTransactionmadeNetwork/Evm/Spec/Block-generic) - Anvil generic refactor: ~50 PRs (
Backend,EthApi,Pool,Storage,Signer,BlockExecutor, fee history, beacon handlers, etc. all generic overNetwork) - Additional supporting changes: ~50 PRs (trait-method usage instead of direct field access, dead-code removal,
revmv34→v38 bump, alloy 2.0.x bumps)
Full PR list: v1.5.1...v1.7.0 changelog.
Distribution
Smaller distribution work covers Tempo support in foundryup, sha256sum sanitation, and npm OIDC release setup.
Distribution changes (4 PRs)
foundryup): add Tempo support (#12775)
baseUrl compiler option (#14413) by @zerosnacks
Docs
Major refresh of the foundry.toml reference (fuzz/invariant options, full config schema), README slimming, lint rule documentation, plus Anvil and command-help corrections.
Docs changes (10 PRs)
--cache-path is for persisted states, not fork RPC cache (#13194) by @mattsse
foundry.toml configuration reference (#13198) by @zerosnacks
get_paths doc comment (#13388) by @gap-editor
rpc.rs (#13480) by @gap-editor
--compiler-version (#13539) by @gap-editor
id attributes to issue templates (#13864) by @decofe