Changelog
Was this helpful?
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.
check_interval config — deep invariant runs up to 3.6× faster with check_interval = 10 (#13133)call_override invariant testing (#13127)max_time_delay / max_block_delay configs (#12616)hardfork and network keys in foundry.toml (#14312, #14337), with auto-detection from a fork's chain ID (#14193)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 keychain for Tempo access keys (#14166, #14222)cast tip20 create and TIP20 virtual address salt mining (#14160, #14365)--tempo.fee-token on forge script and cast send (#14204, #14184)anvil --fork-url (#14279)Full list in the Tempo section below.
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 script (#12952), forge create (#14394), cast send (#13747), and cast erc20 (#14395) — sign and broadcast transactions directly from a browser wallet extension instead of provisioning a hot key on diskconsole.log in forge and chisel (#13321) and console.table support (#14338)forge inspect <x> linearization (#13704) makes it easier to inspect where inherited functions are resolved fromforge clone Sourcify support (#12900)cast batch-send / batch-mktx for native call batching (#13973)cast --curl flag to print equivalent curl commands (#13114)executeTransaction (#13437), Ed25519 crypto (#13450), getRecordedLogsJson (#13093), currentFilePath (#13735)forge-lint rules: 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.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.
ots_getBlockTransactions (#13243) by @aganisgashExecutor.backend in Arc for copy-on-write cloning (#13327) by @gakonstget (#13361) by @cuiweixieprove_storage instead of recomputing (#13363) by @thunggis_with_root (#13389) by @0xMars42create_access_list (#13887) by @edgarr1986NestedEvm::to_evm_env consuming to avoid useless clone (#13893) by @mablrdo_call_end/do_create_end (#13913) by @figtracerEvmEnv/TxEnv cloning in DBs & CheatcodesExecutor impls (#13960) by @mablridentify_addresses (#14198) by @decofeasm-keccak a default feature in all binaries (#14389) by @DaniPopesforge and anvil now default to Osaka (#13112).copyStorage and setArbitraryStorage are now marked Unsafe (#13882).foundry.toml now supports per-network hardfork selection and an explicit network key (#14312, #14337); forked runs can also auto-detect the active network from chain ID (#14193).forge build after 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.copyStorage or setArbitraryStorage, update tests and helpers to account for these cheatcodes now being marked Unsafe (#13882).hardfork, migrate to the new network / per-network hardfork settings (#14312, #14337). Forked runs can also infer the active network from chain ID (#14193).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.
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 = 10
Benchmark: 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.
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.
call_override (#13127)The call_override invariant testing feature now correctly detects ETH transfer reentrancy vulnerabilities, including:
Validated against a reproduction of the April 2022 Rari Capital hack.
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.
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.
assert(), vm.assert*, panics) are now reported as invariant failures during campaigns instead of being silently discarded with reverts (#14275)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:
network key in foundry.toml and per-network hardfork selection (#14337, #14312)[profile.default]
tempo = true # marks Tempo as the active non-Ethereum network
hardfork = "tempo:T3" # namespaced hardfork; bare names like "osaka" still work for Ethereum
Hardforks 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.
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.
BaseFeeParams for Optimism in Anvil (#12944)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:
latest is the new default channel (alias: stable).nightly resolves to the most recent nightly-{SHA} prerelease.foundryup -i v1.7.0 or foundryup -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}.
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
foundryup
The foundry-toolchain GitHub Action has been completely rewritten in TypeScript for improved maintainability and reliability. See the v1.7.0 release.
foundry-coreThe 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).
Hardening of the publishing pipeline: trusted OIDC for npm and proper semver floating tags for Docker.
Full PR breakdown for the Tempo upstreaming.
foundryupbump-tempo workflow (#14323) by @mablrbump-tempo (#14343) by @decofebump-tempo workflow (#14377) by @decofefoundryup): add Tempo support (#12775) by @zerosnacks--network tempo flag to forge init (#12819) by @onbjergfoundryup): bump foundryup version (#13832) by @zerosnacksSignatureVerifier to tempo example (#14351) by @0xrusowskynetwork: tempo from Tempo template (#14424) by @zerosnacksnonceKey cli flag naming (#14188) by @mablrNetworkConfigs (#13953) by @stevencartaviaFoundryHardfork::Tempo variant (#13972) by @stevencartaviaTempoFoundryEvm wrapper (#14022) by @figtracerFoundryContextExt Tempo impl (#14002) by @mablrFoundryTransaction with Tempo methods (#14005) by @figtracerFoundryBlock with Tempo methods (#14004) by @figtracerTryAnyToTxEnv Tempo impl (#14011) by @mablrPATH_USD_ADDRESS from tempo-contracts (#14071) by @figtracerFoundryStorageProvider to TempoStorageProvider (#14080) by @figtracerFoundryHardfork on Backend (#14105) by @stevencartaviaanvil_nodeInfo (#14093) by @stevencartaviaTipFeeManager in anvil_* namespace (#14414) by @mablrCallTraceDecoder (#14213) by @mablrTempoLabels inspector for TIP20 token names (#14072) by @figtraceralloy-chains + TempoDevnet handling (#14309) by @mablrChannelDb for channel persistence (#14355) by @stevencartaviaTempoInvalidTransaction (#14040) by @stevencartavianot-yet-valid transactions during mining (#14069) by @stevencartaviafeePayer to Tempo receipts (#14109) by @stevencartaviaInspectorTxConfig and PoolTxGasConfig builders (#14152) by @stevencartaviacast keychain (#14166) by @figtracercast keychain suite (#14222) by @figtracer--tempo.access-key and --tempo.root-account (#14201) by @figtracerforge create Tempo keychain support (#14185) by @figtracerrun_tempo_keychain into run_generic as AccessKey case (#14137) by @mablrsign_with_access_key with provisioning check (#14189) by @figtracerFoundryTransactionBuilder::sign_with_access_key method (#14120) by @mablrkeychain auth legacy mode w/ forks before T3 (#14311) by @mablrdeny_unknown_fields (#14322) by @figtracerISO 4217 validation for TIP-20 (#14158) by @figtracercast tip20 create (#14160) by @figtracercast 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 @mablrfee_token to deploy_tokens in CreateArgs::deploy (#14221) by @mablrfee_token handling in InspectorHandler & Cheatcodes (#14225) by @mablrFoundryEvmFactory (#14159) by @mablrforge test/coverage Tempo support (#14165) by @mablr--batch flag for Tempo native batching (#14167) by @mablrscript/test Tempo selection when used w/ Anvil (#14258) by @mablrdeploy_create2_deployer in tempo mode to avoid CreateCollision (#14336) by @mablrexecuteTransaction (#14318) by @0xrusowskyhardfork in foundry.toml (#14312) by @0xrusowskynetwork key in foundry.toml (#14337) by @mablr39b9262 (#14345) by @decofesrc/tempo.rs, inline helpers (#14162) by @figtracercreateToken salt parameter (#14164) by @mablrFull 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.
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 script): add --interactive flag for deploying with a single keypair (#12608) by @zerosnacksforge verify-bytecode automatically recompiles upon running (#12651) by @Jds-23forge clone (#12900) by @avoryllisoldeer.lock revision mismatch during build (#12366) by @silvekkkforge inspect <x> linearization (#13704) by @red-swanNetwork support for forge create (#13733) by @figtracerconsole.log (#13321) by @quangloc99console.table (#14338) by @ndavdforge script (#12952) by @mablrcreate subcommand (#14394) by @mablrsvm fails to download solc 0.8.33 on linux/arm64, bump svm-rs (#13007) by @zerosnacks--fail-fast (#12785) by @0xferroussetUp as test setup if it has no parameters (#13204) by @mattsse--access-list in forge create (#13557) by @FredPhilipyCounterWithFallback (#14465) by @mablrGit::is_repo_root always returns false (#13505) by @letmehateufind command (#13516) by @anim001kinit reuse NetworkVariant (#14182) by @mablrnetworks fields (#14183) by @mablrTempDir guard in clone test to prevent premature cleanup (#13471) by @mattsseforge-std version (#13482, #14422) by @github-actionsfeat(cheatcodes): add getRecordedLogsJson cheatcode (#13093) by @grandizzy
feat(cheatcodes): support both 4844/7594 formats in attachBlob (#13054) by @mablr
feat: add executeTransaction cheatcode (#13437) by @onbjerg
Replays 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 currentFilePath cheatcode (#13735) by @alextnetto
vm.mockFunction to work correctly with delegatecall (#13117) by @quangloc99console.log on fuzz test last run at verbosity >= 2 (#12478) by @avorylligetCode as view in VmContractHelper (#13089) by @grandizzyvm.expectRevert for direct precompile calls (#13460) by @gakonstvm.executeTransaction work in isolation mode (#13475) by @gakonstexecuteTransaction (#13645) by @figtracerexpectRevert with empty bytes (#13769) by @decofewriteJson/writeToml 3-arg overload (#13777) by @decofevm.rpc cheatcode ABI encoding for structs (#13842) by @e1Ru1ovm.rpc struct decoding (#14050) by @decofeConsoleFmt (#13829) by @dizer-tiImprovements to mutation strategies and coverage-guided fuzzing for native Rust code, plus minor correctness fixes.
< to <= in validate_uint_mutation (#14459) by @cuiweixieBetter 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.
fail_on_assert for assertion failures in invariant campaigns (#14275) by @0xKarl98Mnemonic-derived accounts, multi-authorization 7702 flows, browser-wallet receipt handling for cast send / cast erc20, plus cleanups around WalletOpts / EtherscanOpts.
WalletOpts and EtherscanOpts from subcommands that don't expect a signer or need Etherscan API (#12705) by @tskoyowallet sign-auth --self-broadcast (#12624) by @0xferrouscast send (#13747) by @figtracererc20 commands (#14395) by @figtracer0x prefix in sign-auth output (#14143) by @zeroprooffcurrent_dir in keystore overwrite tests (#13690) by @mablrNative 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.
--data flag in send (#12712) by @Jds-23--data flag to access-list command (#13515) by @VolodymyrBgerc20 command (#13002) by @mablrcast erc20 transfer to cast erc20 send (#12990) by @onbjergbatch-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 @mablrblock --raw network selection (#13754) by @mablrbatch-send handling by clearing to/value fields (#14250) by @mablrbatch-mktx clearing (#14252) by @stevencartaviamax_int boundary check for uint255 (#13568) by @zeroprooff0x-prefixed value inputs (#14406) by @figtracercast send (#14385) by @0xrusowsky--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.
--curl flag to output equivalent curl commands (#13114) by @gakonsttrace_transaction and trace_rawTransaction (#12788) by @figtracer--flatten flag to cast interface (#13201) by @mattssecast logs query chunking (#12692) by @stevencartaviadecode-tx generic over Network (#14199) by @mablrcast storage when Etherscan cache is unavailable (#13418) by @thunggischain() call in explorer_client (#13272) by @tefyosL-sol--json support for erc20 cmds (#12727) by @0xferrouserc20 decimals (#13438) by @DanielGuuptaSmaller robustness fixes for sender enumeration, threads handling, plasma verifier errors, and flaky-test cleanup.
Network refactors (11 PRs)CastTxBuilder (#13533) by @mablrsend+erc20 generic Network support (#13587) by @mablrCast generic Network support (#13624) by @mablrestimate generic network (#13622) by @mablrcall generic Network support (#13634) by @mablraccess-list generic Network support (#13635) by @mablrda-estimate generic Network (#14194) by @mablrcast call (#14157) by @figtracercast run (#14121) by @figtracerblock_env access -> trait methods (#14119) by @figtracerCast (#13776) by @mablrNew 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.
eth_fillTransaction support (#12595) by @mablrtrace_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 @DanielGuuptaanvil_enableTraces endpoint (#13499) by @DanielGuuptaeth_getStorageValues RPC method (#13971) by @stevencartaviaMetadata client_semver (#14229) by @ndavddebug_traceBlockByHash and debug_traceBlockByNumber (#14391) by @exp0ngeB256 instead of TxHash for block hash parameters (#12961) by @pivasdesantgenesis_hash when loading state with block 0 (#13197) by @mattssecontractAddress in receipt for reverted contract creation (#13195) by @mattsseSerializableBlock for state dump/load (#13227) by @echowanderechain_id fallback for blob params (#13241) by @echowanderewith_database_at (#13267) by @thunggischain_id fallback in fork setup (#13276) by @tefyosL-solReadyTransactions::remove_with_markers (#13436) by @letmehateuanvil_addBalance (#13457) by @DanielGuuptablob_gas_used_ratio calculation in fee history (#13491) by @letmehateuutc_from_secs for out-of-range timestamps (#13520) by @stevencartaviaupdate_url (#13531) by @gutonosaenveloped_tx (#13537) by @gutonosaanvil_reset (#13544) by @FredPhilipyrpc_before assertion in deep reorg blockhash test (#13586) by @FredPhilipy#[serde(default)] for backward compat in TransactionWithMetadata (#13684) by @gutonosaget_next_block_blob_excess_gas to match callers (#13740) by @gutonosatest_trace_filter() (#13764) by @figtracerversioned_hashes in beacon blobs endpoint (#13787) by @FredPhilipymined_parity_trace_block (#13977) by @FredPhilipyInMemoryBlockStates on rollback (#13978) by @FredPhilipyBlockTransactions::Uncle without panic (#14135) by @strmfos<= for pending pool replacement underprice check (#14254) by @cuiweixieevm_setTime (#14292) by @decofeeth_getLogs with unknown blockHash instead of empty (#14371) by @spalladinotest_increase_time_by_zero test (#14430) by @figtracerimpersonated_signature logic (#13187) by @mablrgetBlobSidecars Beacon API endpoint (#12568) by @mablranvil_getBlobSidecarsByBlockId endpoint (#13022) by @mablrpopulate_blob_hashes() (#13308) by @mablris_ok since it's more robust (#13377) by @cuiweixiealloy-eip5792 dev-dependency (#13640) by @strmfostransaction_by_sender_and_nonce (#13638) by @Aboudjemevm tests by removing useless Env wrapper (#13750) by @mablrtransaction_at_block_index in fork (#14271) by @stevencartaviabuild_block_info helper (#14251) by @stevencartaviaBlockEnv construction (#13729) by @figtracerrun! macro (#14168) by @stevencartaviaunpack_execution_result helper (#14181) by @stevencartaviainject_precompiles (#13956) by @figtracerbuild_mining_inspector (#13961) by @figtracerblock_env_from_header utility (#13838) by @figtracerexecute_pool_transactions (#13940) by @figtracerrehash helper for transaction hash replacement (#14151) by @stevencartaviafinish_transaction (#13932) by @figtracerFeeDetails match arm (#14130) by @stevencartaviaStability fixes for invalid pc/memory access and uninitialized variable handling. Realtime console.log is shared with forge (#13321) — see the Forge section.
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): add custom errors rule (#13126) by @milosdjuricaLinterConfig and add 3 new linting rules (#12581) by @milosdjuricaEarlyLintVisitor (#13454) by @hawkadrianblock-timestamp lint (#14431) by @stevencartaviaExit-code semantics for compilation warnings, unreachable macro cleanup, and missing late-visitor methods.
A new namespace_import_style config and generic pretty-printing across blocks, transactions, receipts, OP envelopes, and Tempo receipts.
namespace_import_style config (#13108) by @quangloc99TransactionReceiptWithRevertReason + pretty printing (#13503) by @mablrTempoTransactionReceipt (#13594) by @mablrOpTxEnvelope/Transaction pretty printing (#13734) by @mablrIndentation 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): fix incorrect indentation for chained struct calls (#13163) by @gakonstwhile/for/if blocks with multiple statements (#13566) by @MarkFizz77total_difficulty attribute name (#13578) by @eeemmmmmmvalid_before/valid_after in TempoTransaction pretty print (#13910) by @dizer-titotal_difficulty for totalDifficulty (#13919) by @edgarr1986pretty_receipt helper (#14191) by @figtracerAuto-recompile on forge verify-bytecode, custom verifier URLs for unknown Etherscan chains, and clearer Etherscan-key error messages.
verify-bytecode (#13176) by @grandizzystrip_prefix and strip_suffix (#12563) by @BashmuntaVerificationContext (#13481) by @ForostovecCoverage output is now produced even when tests fail, BRDA hit counts match LCOV expectations, and stack-too-deep warnings link to the troubleshooting guide.
A new -d / --depth trace flag (analogous to tree) and the debugger now shows actual gas usage alongside refunds.
Decoder cache hygiene, verbosity unification, safer Sourcify parsing, panic guards on invalid source spans, and improved expectRevert formatting.
non_fallback_contracts in decoder reset (#13671) by @gutonosaexpectRevert payload before revert formatting (#13981) by @ArshLabsBrowser-wallet flows extended to forge script / forge create, generic Network MultiWallet, new BrowserWalletOpts, and a --browser priority-fee patch.
forge script (#12952) by @mablrNetworkWallet<FoundryNetwork> impl for EthereumWallet (#13248) by @mablrBrowserWalletOpts (#13602) by @mablrMultiWallet generic Network (#13648) by @mablr--browser priority fee (#13700) by @sakulstracreate subcommand (#14394) by @mablrFoundryTransactionRequest::build_typed_tx (#13218) by @mablrNetworkWallet<FoundryNetwork> impl for WalletSigner (#13343) by @mablrturnkey_unsupported() instead of hardcoded error (#13535) by @zeroprooffNetwork (#13550) by @mablrBrowser from WalletSigner (#13613) by @mablrBrowserSigner from MultiWallet (#13839) by @mablrwallets crate to foundry-core (#14348) by @mablrfoundry-wallets dep (#14409) by @mablrfoundry-wallets release (#14429) by @zerosnacksfoundry-wallets browser/tempo features (#14421) by @mablrProviderBuilder generic over Network (#13250) by @mablrProviderBuilder::from_config method (#13268) by @mablrThe script pipeline (ScriptSequence, ScriptResult, ScriptConfig, BundledState, ScriptTransactionBuilder, …) is now fully Network-generic, enabling Tempo and Optimism scripting through the same code paths as Ethereum.
estimate_gas + FoundryTransactionBuilder::reset_gas_limit method (#13706) by @mablrTxStatus receipt type (#13770) by @mablrTransactionWithMetadata + generic pretty printing for TransactionMaybeSigned (#13795) by @mablrNetwork-generic ScriptSequence<N> (#13803) by @mablrNetwork-generic ScriptSequenceKind<N> (#13809) by @mablrBundledState impl (#13825) by @mablrScriptTransactionBuilder (#13830) by @mablrScriptResult, ProvidersManager and state structs Network-generic (#14104) by @mablrScriptConfig generic Network, FoundryEvmFactory (#14115) by @mablrforge script generic over FoundryEvmNetwork (#14125) by @mablrSender resolution improvements (--turnkey msg.sender, single-keystore auto-set) and preservation of exit reason on failed revert decoding.
fs::write_pretty_json_file in MultiChainSequence::save (#13510) by @prestoalvarezfs::write_pretty_json_file in ScriptSequence::save (#13562) by @MarkFizz77EitherSigner abstraction (#13649) by @mablrget_http_provider / try_get_http_provider usage (#13702) by @figtracerBroadcastReader::into_tx_receipts (#13771) by @mablropcode field to call_kind (#13907) by @anim001kEvmOpts resolution (#14217) by @mablrAnyNetwork misuse (#13686) by @mablrfoundry.toml gains a network key and per-network hardfork selection, plus ignored_error_codes_from and curl mode as a config key.
skip_serializing_if fields (#13318) by @gakonstFOUNDRY_PROFILE: ci in template workflows, profile does not exist (#13339) by @zerosnacksdeny_warnings from env vars (#13434) by @aso20455FuzzDictionaryConfig usize fields (#13723) by @gutonosaoptimizer_runs does not exceed u32::MAX (#14354) by @FredPhilipyMarkdown docs generation, log routing to stderr, --no-proxy for sandboxed macOS, common RPC opts extraction, and a handful of error-handling and EtherscanOpts polishing.
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 @gakonstRpcCommonOpts (#14224) by @figtracer--rpc-url (#14246) by @mablrchain_id in EtherscanOpts::dict() (#14335) by @decofeNetworkVariant with NetworkConfigs (#14426) by @mablrGit impl more robust (#14452)TryFrom<Result<RawCallResult>> on TraceResult (#14122) by @figtracerNetwork / EVM refactorMostly 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-evm core: ~130 PRs (Backend, Executor, DatabaseExt, InspectorStack, FoundryEvmFactory, FoundryContextExt, NestedEvm, etc. all generic; Env abstraction removed; EthFoundryEvmFactory and OpEvmNetwork introduced)Cheatcodes, CheatcodesExecutor, BroadcastableTransaction made Network/Evm/Spec/Block-generic)Backend, EthApi, Pool, Storage, Signer, BlockExecutor, fee history, beacon handlers, etc. all generic over Network)revm v34→v38 bump, alloy 2.0.x bumps)Full PR list: v1.5.1...v1.7.0 changelog.
Smaller distribution work covers Tempo support in foundryup, sha256sum sanitation, and npm OIDC release setup.
Major refresh of the foundry.toml reference (fuzz/invariant options, full config schema), README slimming, lint rule documentation, plus Anvil and command-help corrections.
--cache-path is for persisted states, not fork RPC cache (#13194) by @mattssefoundry.toml configuration reference (#13198) by @zerosnacksget_paths doc comment (#13388) by @gap-editorrpc.rs (#13480) by @gap-editor--compiler-version (#13539) by @gap-editorid attributes to issue templates (#13864) by @decofe