> **Can't find what you're looking for?** Use `search_docs` on the docs MCP server at `https://www.getfoundry.sh/api/mcp` to find what you need.
>
> **Have feedback?** Use `submit_feedback` on the same MCP server.

# Changelog

## Unreleased (2026-08-28)

Changes merged since v1.8.0. Available in [nightly builds](https://github.com/foundry-rs/foundry/releases/tag/nightly) and part of the next stable release.

* **forge**: Added `gasStateUsed` to the `Vm.Gas` values returned by `lastCallGas` and `lastFrameGas`.
* **forge, chisel**: Added a shared `--hardfork` override for selecting the runtime EVM hardfork in Forge and Chisel commands.
* **forge**: Fixed `forge lsp` to reload host-resolved workspace settings after `foundry.toml` changes.
* **forge**: Fixed post-build lint import resolution when using `forge build --root` from outside the project directory.
* **forge**: Prepared the workspace for the Foundry 1.8.1 release.
* **forge, cast, anvil, chisel**: Removed warnings when loading project dotenv files and running project-configured local compiler executables.
* **forge**: Show the resolved optimizer, via-IR, and EVM settings for each Solidity compiler invocation in `forge build -vv` output.
* **forge, cast, anvil, chisel**: Sped up config resolution in projects with large `lib` trees by no longer auto-detecting remappings for a path layout that discards them.
* **forge**: Sped up listing selectors for a named contract by compiling only its source graph.
* **forge**: Sped up path-filtered test listing by compiling only matching test source graphs.
* **forge, cast, anvil, chisel**: Treated `anvil_nodeInfo` as optional until an endpoint returns valid node info, while keeping later Anvil identity checks strict across discovery and resets. This allows non-Anvil fork endpoints with vendor-specific rejection codes to proceed through standard RPC discovery.
* **cast**: `cast call --delegate` simulates the call as a `delegatecall` from the `--from` address, running the destination's code against the sender's storage.
* **cast**: Added `cast events --with-local-artifacts` for decoding transaction events from matching local project artifacts.
* **anvil**: Removed feature-gated function imports from Anvil's in-memory backend.
* **anvil**: Simplified network precompile discovery to use the resolved runtime hardfork directly.

## v1.8.0 (2026-08-27)

# Foundry v1.8.0

Foundry v1.8.0 ships an opt-in preview of native symbolic testing, mutation testing, and major fuzzing and invariant improvements, while making isolate mode and dynamic test linking the defaults. It also adds first-class Monad support, embeds the Solar language server in Forge, and delivers broad performance improvements across Anvil, Forge, Cast, and the debugger. This release also ships the Rust `foundryup`, expands `forge lint` with a large set of security and gas detectors, and makes JSON output and stdout/stderr behavior more predictable across Forge and Cast.

## Highlights

### Testing & Fuzzing

Testing is the main theme of v1.8.0. The release expands the ways Forge can find failures, make them reproducible, and turn them into smaller actionable counterexamples.

* **Native symbolic testing** is available as an opt-in preview through `forge test --symbolic`, using a local solver (Z3 by default) ([#14796](https://github.com/foundry-rs/foundry/pull/14796)). The preview supports KZG precompile witnesses, `ADDMOD` / `MULMOD`, Cancun `SELFDESTRUCT` semantics, selector pruning, deploy-code modeling, and byte-preserving solving ([#15157](https://github.com/foundry-rs/foundry/pull/15157), [#15172](https://github.com/foundry-rs/foundry/pull/15172), [#15179](https://github.com/foundry-rs/foundry/pull/15179), [#15180](https://github.com/foundry-rs/foundry/pull/15180), [#15374](https://github.com/foundry-rs/foundry/pull/15374)). Symbolic failures can be exported as JSON and replayable counterexample artifacts, minimized for single-call and stateful tests, seeded into fuzz corpora, and emitted as Solidity regression tests with `--emit-regression` ([#15139](https://github.com/foundry-rs/foundry/pull/15139), [#15217](https://github.com/foundry-rs/foundry/pull/15217), [#15325](https://github.com/foundry-rs/foundry/pull/15325), [#15288](https://github.com/foundry-rs/foundry/pull/15288), [#15335](https://github.com/foundry-rs/foundry/pull/15335), [#15354](https://github.com/foundry-rs/foundry/pull/15354), [#15563](https://github.com/foundry-rs/foundry/pull/15563)). A passing result is scoped to the modeled semantics and configured bounds; unsupported or timed-out paths are reported as incomplete.
* **Mutation testing** is now available through `forge test --mutate`, giving test suites a direct way to check whether assertions actually catch behavioral changes ([#13091](https://github.com/foundry-rs/foundry/pull/13091)). The cycle also added mutation compiler overrides and fixed dynamic linking, Windows source-path normalization, and misleading score reporting while the feature was hardened ([#15284](https://github.com/foundry-rs/foundry/pull/15284), [#15105](https://github.com/foundry-rs/foundry/pull/15105), [#15044](https://github.com/foundry-rs/foundry/pull/15044), [#15104](https://github.com/foundry-rs/foundry/pull/15104)).
* **Assembly robustness testing** is available through `forge test --brutalize`. It rewrites a temporary workspace to dirty unused high bits and scratch memory and to misalign the free-memory pointer, exposing assumptions that normal zeroed and aligned memory can hide ([#13342](https://github.com/foundry-rs/foundry/pull/13342)).
* **Fuzzer improvements** cover invariant corpus seeding from observed calls, constant folding for common Solidity expressions, comparison-log sampling, configurable ensemble defaults, safer enum input generation, AFL `showmap`-style replay, collision-free EVM edge coverage, bounded replay output, campaign sharding, per-test-contract grouping, lower campaign memory retention, and cheaper metric and log decoding ([#15220](https://github.com/foundry-rs/foundry/pull/15220), [#15189](https://github.com/foundry-rs/foundry/pull/15189), [#15234](https://github.com/foundry-rs/foundry/pull/15234), [#15235](https://github.com/foundry-rs/foundry/pull/15235), [#15375](https://github.com/foundry-rs/foundry/pull/15375), [#14675](https://github.com/foundry-rs/foundry/pull/14675), [#14853](https://github.com/foundry-rs/foundry/pull/14853), [#14801](https://github.com/foundry-rs/foundry/pull/14801), [#15279](https://github.com/foundry-rs/foundry/pull/15279), [#15414](https://github.com/foundry-rs/foundry/pull/15414), [#15412](https://github.com/foundry-rs/foundry/pull/15412), [#14989](https://github.com/foundry-rs/foundry/pull/14989), [#14844](https://github.com/foundry-rs/foundry/pull/14844), [#15047](https://github.com/foundry-rs/foundry/pull/15047), [#15070](https://github.com/foundry-rs/foundry/pull/15070), [#15057](https://github.com/foundry-rs/foundry/pull/15057), [#15372](https://github.com/foundry-rs/foundry/pull/15372), [#15282](https://github.com/foundry-rs/foundry/pull/15282)). New `forge fuzz` commands can run selected fuzz and invariant tests, and replay, inspect, or minimize persisted cases directly from the CLI ([#14522](https://github.com/foundry-rs/foundry/pull/14522), [#15227](https://github.com/foundry-rs/foundry/pull/15227), [#15517](https://github.com/foundry-rs/foundry/pull/15517)).
* **`--isolate` is now the default** for Forge tests, backed by compatibility fixes for cheatcodes, state diffs, `SELFDESTRUCT`, reverted creates, and the new `vm.isIsolateMode()` runtime check ([#15226](https://github.com/foundry-rs/foundry/pull/15226), [#14493](https://github.com/foundry-rs/foundry/pull/14493), [#15382](https://github.com/foundry-rs/foundry/pull/15382), [#15385](https://github.com/foundry-rs/foundry/pull/15385), [#14637](https://github.com/foundry-rs/foundry/pull/14637), [#15411](https://github.com/foundry-rs/foundry/pull/15411)).

### Security Lints

`forge lint` gained a broad set of security, correctness, and gas detectors, with project-wide analysis support and nearly complete Slither/Aderyn parity.

Notable additions include:

* `arbitrary-send-eth`, `arbitrary-send-erc20`, and `arbitrary-send-erc20-permit` ([#14943](https://github.com/foundry-rs/foundry/pull/14943), [#14677](https://github.com/foundry-rs/foundry/pull/14677), [#15037](https://github.com/foundry-rs/foundry/pull/15037)).
* `reentrancy-eth`, `reentrancy-no-eth`, and `reentrancy-events` ([#14970](https://github.com/foundry-rs/foundry/pull/14970), [#15000](https://github.com/foundry-rs/foundry/pull/15000), [#14882](https://github.com/foundry-rs/foundry/pull/14882)).
* `controlled-delegatecall`, `delegatecall-loop`, `calls-loop`, and `return-bomb` ([#15046](https://github.com/foundry-rs/foundry/pull/15046), [#14752](https://github.com/foundry-rs/foundry/pull/14752), [#14778](https://github.com/foundry-rs/foundry/pull/14778), [#14793](https://github.com/foundry-rs/foundry/pull/14793)).
* `missing-events-access-control`, `missing-events-arithmetic`, `missing-zero-check`, and `event-fields` ([#14954](https://github.com/foundry-rs/foundry/pull/14954), [#14907](https://github.com/foundry-rs/foundry/pull/14907), [#14460](https://github.com/foundry-rs/foundry/pull/14460), [#14751](https://github.com/foundry-rs/foundry/pull/14751)).
* `incorrect-modifier`, `incorrect-exp`, `incorrect-strict-equality`, `type-based-tautology`, and `tautological-compare` ([#15201](https://github.com/foundry-rs/foundry/pull/15201), [#15213](https://github.com/foundry-rs/foundry/pull/15213), [#14749](https://github.com/foundry-rs/foundry/pull/14749), [#14697](https://github.com/foundry-rs/foundry/pull/14697), [#15203](https://github.com/foundry-rs/foundry/pull/15203)).

Beyond analysis, v1.8 hardens secret and filesystem handling. Signing and key cheatcodes redact private material and unsafe nonces from traces ([#15921](https://github.com/foundry-rs/foundry/pull/15921), [#15922](https://github.com/foundry-rs/foundry/pull/15922), [#15923](https://github.com/foundry-rs/foundry/pull/15923)); Anvil redacts credentials and API keys from fork endpoints ([#16223](https://github.com/foundry-rs/foundry/pull/16223)); sensitive script caches and saved vanity-wallet files use owner-only permissions on Unix ([#16234](https://github.com/foundry-rs/foundry/pull/16234), [#16163](https://github.com/foundry-rs/foundry/pull/16163)); and keystore names can no longer escape their account directory ([#16237](https://github.com/foundry-rs/foundry/pull/16237)). Existing logs and previously written files are not retroactively sanitized or re-permissioned and should still be treated as sensitive. Foundry also emits non-blocking warnings on stderr before loading project `.env` files or running configured local Solc or Vyper executables ([#16113](https://github.com/foundry-rs/foundry/pull/16113), [#16343](https://github.com/foundry-rs/foundry/pull/16343)).

### Solar LSP

Forge now includes an embedded Solar language server through `forge lsp`, so Solidity projects can use Solar-powered editor features with Foundry project configuration and remappings without installing a separate language-server binary ([#16254](https://github.com/foundry-rs/foundry/pull/16254)). The Solar binary is also included in Foundry releases and installed through `foundryup`, supporting direct Solar workflows ([#15611](https://github.com/foundry-rs/foundry/pull/15611), [#15693](https://github.com/foundry-rs/foundry/pull/15693)).

### Monad

Foundry now has first-class Monad execution support across Forge, Anvil, Cast, Chisel, traces, and cheatcodes. Users can select it through `--network monad`, network-qualified hardfork configuration, and Monad-aware local or forked execution ([#15343](https://github.com/foundry-rs/foundry/pull/15343)). MonadTen support adds MIP-8 page-based storage accounting and makes MonadTen the default for local Monad execution while preserving hardfork-aware behavior for historical and live forks ([#16352](https://github.com/foundry-rs/foundry/pull/16352)).

### Tempo

Compared with v1.7.1, Foundry v1.8 adds Tempo hardfork compatibility through T10, wallet sessions, receive-policy tooling, richer trace and debugger decoding, and broader Forge, Cast, and Anvil integration.

* **Wallet sessions and access-key flows** now cover Cast transaction commands, batch sends, Forge scripts, policy commands, session create/revoke flows, non-EOA `KeyAuthorization` signing, and `cast keychain doctor` ([#15075](https://github.com/foundry-rs/foundry/pull/15075), [#15081](https://github.com/foundry-rs/foundry/pull/15081), [#15085](https://github.com/foundry-rs/foundry/pull/15085), [#15096](https://github.com/foundry-rs/foundry/pull/15096), [#14916](https://github.com/foundry-rs/foundry/pull/14916), [#14978](https://github.com/foundry-rs/foundry/pull/14978), [#14996](https://github.com/foundry-rs/foundry/pull/14996), [#14743](https://github.com/foundry-rs/foundry/pull/14743), [#14766](https://github.com/foundry-rs/foundry/pull/14766)).
* **Receive-policy and fee-token tooling** landed across Cast and the shared provider stack, including receive-policy commands, T6 guards, resolved fee-token display, and on-chain fee-token symbol resolution ([#15195](https://github.com/foundry-rs/foundry/pull/15195), [#15239](https://github.com/foundry-rs/foundry/pull/15239), [#15130](https://github.com/foundry-rs/foundry/pull/15130), [#15158](https://github.com/foundry-rs/foundry/pull/15158), [#15161](https://github.com/foundry-rs/foundry/pull/15161)).
* **T5/T6** includes T5 payment lane classification, implicit approval behavior and cheatcodes, channel reserve precompile support, T6 admin access-key authorization tooling, receive-policy receipt decoding, and local regression coverage ([#15051](https://github.com/foundry-rs/foundry/pull/15051), [#15022](https://github.com/foundry-rs/foundry/pull/15022), [#15036](https://github.com/foundry-rs/foundry/pull/15036), [#15193](https://github.com/foundry-rs/foundry/pull/15193), [#15280](https://github.com/foundry-rs/foundry/pull/15280), [#15129](https://github.com/foundry-rs/foundry/pull/15129), [#15222](https://github.com/foundry-rs/foundry/pull/15222), [#15346](https://github.com/foundry-rs/foundry/pull/15346)).
* **Anvil and execution fixes** cover Tempo fork coinbase selection, T5 hardfork selection, nonce lanes, valid-after checks, create expiry handling, and latest hardfork defaults in tests ([#14964](https://github.com/foundry-rs/foundry/pull/14964), [#14997](https://github.com/foundry-rs/foundry/pull/14997), [#14896](https://github.com/foundry-rs/foundry/pull/14896), [#14469](https://github.com/foundry-rs/foundry/pull/14469), [#14912](https://github.com/foundry-rs/foundry/pull/14912), [#14850](https://github.com/foundry-rs/foundry/pull/14850)).
* **Trace and debugger support** now decodes Tempo T5 surfaces and shows chain-aware precompile clues for Tempo-specific debugging ([#15032](https://github.com/foundry-rs/foundry/pull/15032), [#15383](https://github.com/foundry-rs/foundry/pull/15383)).

### Distribution

The separately released Rust `foundryup` is now the default implementation, with the legacy Bash launcher providing the transition path for existing installations ([#15498](https://github.com/foundry-rs/foundry/pull/15498), [#16359](https://github.com/foundry-rs/foundry/pull/16359)). Alongside the migration, release resolution was hardened to avoid GitHub API rate limits, skip unready nightly releases, preserve `--path` symlinks, create missing binary directories before activation, and mirror tag resolution consistently between install and use flows ([#15337](https://github.com/foundry-rs/foundry/pull/15337), [#15148](https://github.com/foundry-rs/foundry/pull/15148), [#15356](https://github.com/foundry-rs/foundry/pull/15356), [#15370](https://github.com/foundry-rs/foundry/pull/15370), [#14908](https://github.com/foundry-rs/foundry/pull/14908), [#14968](https://github.com/foundry-rs/foundry/pull/14968), [#14611](https://github.com/foundry-rs/foundry/pull/14611)).

### Debugger and TUI

The debugger gained a shared TUI foundation, non-interactive fallback handling, layout selection, opcode search, storage access views and source-level storage labels, scoped variables, stack-word previews, gas stats, goto-PC support, and better precompile hints ([#14710](https://github.com/foundry-rs/foundry/pull/14710), [#14720](https://github.com/foundry-rs/foundry/pull/14720), [#14725](https://github.com/foundry-rs/foundry/pull/14725), [#14780](https://github.com/foundry-rs/foundry/pull/14780), [#15171](https://github.com/foundry-rs/foundry/pull/15171), [#15211](https://github.com/foundry-rs/foundry/pull/15211), [#15218](https://github.com/foundry-rs/foundry/pull/15218), [#15141](https://github.com/foundry-rs/foundry/pull/15141), [#15140](https://github.com/foundry-rs/foundry/pull/15140), [#15100](https://github.com/foundry-rs/foundry/pull/15100), [#15049](https://github.com/foundry-rs/foundry/pull/15049), [#15379](https://github.com/foundry-rs/foundry/pull/15379), [#15383](https://github.com/foundry-rs/foundry/pull/15383), [#16246](https://github.com/foundry-rs/foundry/pull/16246)).

Forge can also emit EVM execution profiles for Speedscope via `--evm-profile` ([#15394](https://github.com/foundry-rs/foundry/pull/15394)).

### Performance

Performance improved across the toolchain, with the largest concentrated passes in Anvil and Forge.

* **Anvil** now mines blocks more efficiently, keeps long-chain mining stable, avoids unnecessary block and receipt conversions, and accelerates block and transaction receipt queries and fee-history reward calculations ([#15739](https://github.com/foundry-rs/foundry/pull/15739), [#15715](https://github.com/foundry-rs/foundry/pull/15715), [#16063](https://github.com/foundry-rs/foundry/pull/16063), [#16079](https://github.com/foundry-rs/foundry/pull/16079), [#16078](https://github.com/foundry-rs/foundry/pull/16078), [#16245](https://github.com/foundry-rs/foundry/pull/16245)).
* **Forge and EVM execution** speed up filtered tests and `test --list`, linting, documentation and binding generation, selectors and inspection, path-filtered coverage, bytecode verification, forked scripts, gas reports, and clone compilation, while reducing per-opcode inspector overhead ([#15703](https://github.com/foundry-rs/foundry/pull/15703), [#15595](https://github.com/foundry-rs/foundry/pull/15595), [#15697](https://github.com/foundry-rs/foundry/pull/15697), [#15621](https://github.com/foundry-rs/foundry/pull/15621), [#15627](https://github.com/foundry-rs/foundry/pull/15627), [#15624](https://github.com/foundry-rs/foundry/pull/15624), [#15622](https://github.com/foundry-rs/foundry/pull/15622), [#15936](https://github.com/foundry-rs/foundry/pull/15936), [#15791](https://github.com/foundry-rs/foundry/pull/15791), [#16007](https://github.com/foundry-rs/foundry/pull/16007), [#15948](https://github.com/foundry-rs/foundry/pull/15948), [#16158](https://github.com/foundry-rs/foundry/pull/16158), [#16129](https://github.com/foundry-rs/foundry/pull/16129), [#16367](https://github.com/foundry-rs/foundry/pull/16367)).
* **Cast and the debugger** speed up read-only commands, transaction construction, local interface generation, trace artifact matching, block lookup, repeated storage scans, and large opcode views ([#15754](https://github.com/foundry-rs/foundry/pull/15754), [#15912](https://github.com/foundry-rs/foundry/pull/15912), [#15620](https://github.com/foundry-rs/foundry/pull/15620), [#15970](https://github.com/foundry-rs/foundry/pull/15970), [#16174](https://github.com/foundry-rs/foundry/pull/16174), [#15771](https://github.com/foundry-rs/foundry/pull/15771), [#16289](https://github.com/foundry-rs/foundry/pull/16289), [#16293](https://github.com/foundry-rs/foundry/pull/16293)).

PR-local workloads illustrate the size of some concentrated wins: `eth_getBlockReceipts` on a synthetic 10,000-transaction block fell from 17.1 seconds to 47.7 milliseconds (about 358x faster) ([#16063](https://github.com/foundry-rs/foundry/pull/16063)); a batched 2,000-transaction receipt workload fell from 3.77 seconds to 300 milliseconds (12.55x faster) ([#16245](https://github.com/foundry-rs/foundry/pull/16245)); and a cached Solady gas-report run fell from 23.0 seconds to 18.6 seconds while peak memory dropped from 3.08 GB to 1.37 GB ([#16158](https://github.com/foundry-rs/foundry/pull/16158)). These are workload-specific measurements rather than whole-suite averages.

### More Predictable JSON and Output Channels

Foundry continued the stdout/stderr and JSON-output cleanup started in earlier releases. Many Cast `--json` paths now use versioned envelopes more consistently, `forge test --json-file <PATH>` can write machine-readable test results to a separate file, and many commands moved prose and status text off stdout ([#14716](https://github.com/foundry-rs/foundry/pull/14716), [#14727](https://github.com/foundry-rs/foundry/pull/14727), [#14986](https://github.com/foundry-rs/foundry/pull/14986), [#15021](https://github.com/foundry-rs/foundry/pull/15021), [#16004](https://github.com/foundry-rs/foundry/pull/16004)).

***

## Breaking / Behavior Changes

### Isolate Mode Is the Default

Forge tests now run in isolate mode by default ([#15226](https://github.com/foundry-rs/foundry/pull/15226)). Each top-level call runs in a separate transaction and EVM context, making results less dependent on accidental state shared across calls.

The default flip landed after a series of compatibility fixes and hot fixes that made isolate mode viable for real projects:

* `vm.fee`, `vm.txGasPrice`, and `vm.blobhashes` now work under isolate mode ([#14493](https://github.com/foundry-rs/foundry/pull/14493)).
* `CREATE` addresses and `CreatedLocal` state are preserved correctly across reverted isolated flows, including `SELFDESTRUCT` cases ([#14637](https://github.com/foundry-rs/foundry/pull/14637), [#15385](https://github.com/foundry-rs/foundry/pull/15385)).
* State-diff recording no longer warms slots or recorded cold accesses while recording, preserving cold-access semantics ([#15382](https://github.com/foundry-rs/foundry/pull/15382), [#15404](https://github.com/foundry-rs/foundry/pull/15404)).
* Invariant and fuzz replay paths gained follow-up fixes around persisted corpus entries and replay failure output ([#15349](https://github.com/foundry-rs/foundry/pull/15349), [#15414](https://github.com/foundry-rs/foundry/pull/15414)).
* `vm.isIsolateMode()` lets tests and helpers detect the effective isolation mode at runtime ([#15411](https://github.com/foundry-rs/foundry/pull/15411)).

Projects with tests that intentionally depend on non-isolated behavior can use `forge test --no-isolate` or set `isolate = false` in their Foundry profile. The default can change gas snapshots, exact traces and gas costs, and `CREATE`-derived addresses.

### Dynamic Test Linking Is the Default

Dynamic test linking is now enabled by default to avoid unnecessary recompilation and speed up common Forge workflows ([#14718](https://github.com/foundry-rs/foundry/pull/14718)). Projects that encounter incompatibilities can use `--no-dynamic-test-linking` or set `dynamic_test_linking = false`.

### Other Behavior Changes

* Compatible boolean invariant functions in the same contract now share one contract-level campaign and corpus, while failures are still reported per predicate; optimization invariants remain separate ([#12587](https://github.com/foundry-rs/foundry/pull/12587), [#14844](https://github.com/foundry-rs/foundry/pull/14844)). Use `--match-test` or separate contracts when independent campaigns are required.
* The deprecated `forge generate` command was removed ([#16242](https://github.com/foundry-rs/foundry/pull/16242)). It only produced a basic test scaffold; create or scaffold those test files through another workflow.
* No new versions of the existing `@foundry-rs/*` packages will be published to npm; previously published versions remain available ([#14811](https://github.com/foundry-rs/foundry/pull/14811)). Use `foundryup` or the GitHub release binaries for current releases.
* With no explicit severity filter, `forge lint` now includes all severities, including Info and, where applicable, Gas and CodeSize ([#15331](https://github.com/foundry-rs/foundry/pull/15331)). To restore the earlier filter, set `[lint] severity = ["high", "medium", "low"]`.
* Cast integer JSON serialization now follows the declared ABI type rather than whether each runtime value fits in 64 bits, making arrays consistent but changing some existing JSON values ([#14824](https://github.com/foundry-rs/foundry/pull/14824)).

***

## Upgrade Notes

* Review test suites and snapshots under the new isolate and dynamic-linking defaults. Use `--no-isolate` and `--no-dynamic-test-linking`, or their corresponding profile settings, only where the previous behavior is required.
* Remove automation that invokes `forge generate`; the command no longer exists.
* If you parse Forge or Cast output, recheck each command contract: many commands now keep structured data on stdout and diagnostics on stderr, and Cast integer JSON now follows declared ABI types.
* New and rewritten sensitive cache files receive stricter permissions, but existing logs and files are not retroactively sanitized or re-permissioned.
* If you install through `foundryup`, the separately released Rust implementation is now the default implementation for this release.

***

## Benchmarks

> **Live dashboard: [getfoundry.sh/benchmarks](https://www.getfoundry.sh/benchmarks)**

The [final v1.8.0 benchmark snapshot](https://www.getfoundry.sh/benchmarks) compares v1.7.1 with v1.8.0 in matched modes: dynamic test linking is disabled for both sides, and isolated tests are reported separately. Across the tracked repositories, aggregate wall time improved by 18.4% for tests, 19.1% for fuzzing, 18.0% for isolated tests, 43.2% for cached builds, and 12.8% for coverage. Uncached builds were effectively neutral at +0.3%. Aave improved in every displayed category, including 19.0% for tests, 19.4% for fuzzing, 18.1% for isolated tests, and 15.7% for coverage.

***

## Other Notable Changes

### Cast and Cheatcodes

* `cast events` can fetch and decode events from transaction receipts or filtered log queries, using explorer ABIs and signature lookup when available and falling back to raw logs ([#16238](https://github.com/foundry-rs/foundry/pull/16238)). Canonical fallback decoding now rejects ambiguous indexed layouts instead of returning misleading values ([#16370](https://github.com/foundry-rs/foundry/pull/16370)).
* Packaged Apple Silicon macOS releases can enroll and use Touch ID-backed encrypted keystores ([#15995](https://github.com/foundry-rs/foundry/pull/15995)).
* New and stabilized cheatcodes cover secp256k1 point arithmetic, `vm.expectDelegateCall`, typed FFI results through `vm.ffiUint`, `vm.ffiString`, and `vm.ffiBytes`, EVM-error matching in `vm.expectRevert`, and concrete and symbolic storage hooks ([#16160](https://github.com/foundry-rs/foundry/pull/16160), [#16192](https://github.com/foundry-rs/foundry/pull/16192), [#16287](https://github.com/foundry-rs/foundry/pull/16287), [#16294](https://github.com/foundry-rs/foundry/pull/16294), [#15954](https://github.com/foundry-rs/foundry/pull/15954), [#15976](https://github.com/foundry-rs/foundry/pull/15976), [#16286](https://github.com/foundry-rs/foundry/pull/16286)).

### Forge, Config, and Compilation

* All Foundry binaries accept a global `--profile <PROFILE>`, overriding `FOUNDRY_PROFILE` ([#15831](https://github.com/foundry-rs/foundry/pull/15831)).
* `forge script --confirmations <N>` waits for the requested confirmation depth before finishing or verifying ([#15947](https://github.com/foundry-rs/foundry/pull/15947)).
* `forge fmt --nearest` resolves the nearest `foundry.toml` for each file in multi-project repositories ([#16064](https://github.com/foundry-rs/foundry/pull/16064)).
* `forge build --locked` provides an optional strict CI gate for `foundry.lock` and Git-submodule consistency; ordinary builds remain unchanged ([#16048](https://github.com/foundry-rs/foundry/pull/16048)).
* `forge inspect` can print contract artifact JSON ([#15242](https://github.com/foundry-rs/foundry/pull/15242)).
* `vm.getCode` can specify the compilation profile ([#13191](https://github.com/foundry-rs/foundry/pull/13191)).
* `[profile.<name>.coverage]` config sections are supported ([#14599](https://github.com/foundry-rs/foundry/pull/14599)).
* Contract size limits are configurable ([#14761](https://github.com/foundry-rs/foundry/pull/14761)).
* Solidity `--experimental` is supported through config ([#15177](https://github.com/foundry-rs/foundry/pull/15177)).
* Extended Vyper settings are exposed ([#14739](https://github.com/foundry-rs/foundry/pull/14739)).
* `forge fmt` preserves indentation for uninitialized state variables with `override` attributes ([#15153](https://github.com/foundry-rs/foundry/pull/15153)).
* Forge scripts now invalidate fork-cache entries after state-mutating `vm.rpc` and `vm.rpcJson` calls, fixing stale-state broadcast replays ([#15507](https://github.com/foundry-rs/foundry/pull/15507)).

### Verification

* `forge verify-contract` can submit to Etherscan and Sourcify in one go ([#15124](https://github.com/foundry-rs/foundry/pull/15124)).
* Verification accepts SPDX identifiers and Etherscan license types ([#15162](https://github.com/foundry-rs/foundry/pull/15162), [#14975](https://github.com/foundry-rs/foundry/pull/14975)).
* Bytecode verification fixes cover canonical source paths, fork chain IDs, full-project compilation for path targets, and Sourcify fallback behavior ([#15417](https://github.com/foundry-rs/foundry/pull/15417), [#15378](https://github.com/foundry-rs/foundry/pull/15378), [#15475](https://github.com/foundry-rs/foundry/pull/15475), [#14765](https://github.com/foundry-rs/foundry/pull/14765)).

### Forge Doc and Chisel

* `forge doc` was migrated from Solang to Solar and Vocs ([#14447](https://github.com/foundry-rs/foundry/pull/14447), [#14568](https://github.com/foundry-rs/foundry/pull/14568)).
* Chisel was migrated to Solar and now dispatches by EVM network ([#14532](https://github.com/foundry-rs/foundry/pull/14532), [#14813](https://github.com/foundry-rs/foundry/pull/14813)).
* Chisel can reuse the previous result through `$_` and inspect value-producing inline assembly expressions ([#16244](https://github.com/foundry-rs/foundry/pull/16244), [#16310](https://github.com/foundry-rs/foundry/pull/16310)).

### Network and EVM Support

* EIP-4788 beacon roots and EIP-2935 history storage are supported ([#15371](https://github.com/foundry-rs/foundry/pull/15371), [#15406](https://github.com/foundry-rs/foundry/pull/15406)).
* Amsterdam hardfork mapping was added and Osaka remains the default ([#14683](https://github.com/foundry-rs/foundry/pull/14683)).
* Optimism dependencies are now feature-gated across the workspace, while official release and nightly assets retain OP Stack support alongside Monad ([#14572](https://github.com/foundry-rs/foundry/pull/14572), [#14577](https://github.com/foundry-rs/foundry/pull/14577), [#14581](https://github.com/foundry-rs/foundry/pull/14581), [#14593](https://github.com/foundry-rs/foundry/pull/14593), [#14596](https://github.com/foundry-rs/foundry/pull/14596), [#14600](https://github.com/foundry-rs/foundry/pull/14600), [#16186](https://github.com/foundry-rs/foundry/pull/16186)).

### Anvil

Anvil gained a large RPC-compatibility pass:

* New RPC support for `eth_baseFee`, `eth_getHeaderByNumber`, `eth_getHeaderByHash`, `eth_pendingTransactions`, `eth_resend`, `txpool_contentFrom`, receipt subscriptions, syncing subscriptions, create-access-list overrides, and access-list results for reverting calls ([#15419](https://github.com/foundry-rs/foundry/pull/15419), [#15420](https://github.com/foundry-rs/foundry/pull/15420), [#15422](https://github.com/foundry-rs/foundry/pull/15422), [#15423](https://github.com/foundry-rs/foundry/pull/15423), [#15136](https://github.com/foundry-rs/foundry/pull/15136), [#15421](https://github.com/foundry-rs/foundry/pull/15421), [#15428](https://github.com/foundry-rs/foundry/pull/15428), [#15427](https://github.com/foundry-rs/foundry/pull/15427), [#15425](https://github.com/foundry-rs/foundry/pull/15425), [#14569](https://github.com/foundry-rs/foundry/pull/14569)).
* Debug RPC additions for raw receipts, clearing the txpool, modified accounts by number, and freeing OS memory ([#15433](https://github.com/foundry-rs/foundry/pull/15433), [#15429](https://github.com/foundry-rs/foundry/pull/15429), [#15468](https://github.com/foundry-rs/foundry/pull/15468), [#15458](https://github.com/foundry-rs/foundry/pull/15458)).
* New call-bundle and tracing APIs include `eth_callMany`, `eth_callBundle`, `trace_call`, `trace_callMany`, `trace_rawTransaction`, `trace_replayTransaction`, `trace_get`, `debug_traceBlock`, and `debug_executionWitness` ([#15437](https://github.com/foundry-rs/foundry/pull/15437), [#15691](https://github.com/foundry-rs/foundry/pull/15691), [#15443](https://github.com/foundry-rs/foundry/pull/15443), [#15446](https://github.com/foundry-rs/foundry/pull/15446), [#15445](https://github.com/foundry-rs/foundry/pull/15445), [#15436](https://github.com/foundry-rs/foundry/pull/15436), [#15444](https://github.com/foundry-rs/foundry/pull/15444), [#15435](https://github.com/foundry-rs/foundry/pull/15435), [#16185](https://github.com/foundry-rs/foundry/pull/16185)).
* Safer state loading, block hash cache restoration, genesis number handling, transaction pooling, and numeric RPC parsing ([#14624](https://github.com/foundry-rs/foundry/pull/14624), [#15167](https://github.com/foundry-rs/foundry/pull/15167), [#14488](https://github.com/foundry-rs/foundry/pull/14488), [#14891](https://github.com/foundry-rs/foundry/pull/14891), [#14650](https://github.com/foundry-rs/foundry/pull/14650), [#14658](https://github.com/foundry-rs/foundry/pull/14658)).
* `anvil --network tempo` includes a built-in fee payer, configurable through `--tempo.fee-payer`, for local sponsored-transaction flows ([#16278](https://github.com/foundry-rs/foundry/pull/16278)).
* `--fund-accounts`, default JS tracer support, and better tracer config compatibility ([#14392](https://github.com/foundry-rs/foundry/pull/14392), [#14745](https://github.com/foundry-rs/foundry/pull/14745), [#15199](https://github.com/foundry-rs/foundry/pull/15199)).

***

## Full Changelog

[v1.7.1...v1.8.0](https://github.com/foundry-rs/foundry/compare/v1.7.1...v1.8.0)

<!-- contributors:start -->

<details>
<summary><b>Contributors (82)</b></summary>

* Improve CI action ([#14484](https://github.com/foundry-rs/foundry/pull/14484)) by @grandizzy
* fix(config): warn instead of erroring on unknown FOUNDRY\_PROFILE ([#14486](https://github.com/foundry-rs/foundry/pull/14486)) by @zerosnacks
* fix(anvil): pre-check Tempo valid\_after before execution ([#14469](https://github.com/foundry-rs/foundry/pull/14469)) by @Perico-perica46
* feat(lint): add missing-zero-check ([#14460](https://github.com/foundry-rs/foundry/pull/14460)) by @stevencartavia
* chore: bump Tempo deps + test `tempo_forkSchedule` ([#14485](https://github.com/foundry-rs/foundry/pull/14485)) by @0xrusowsky
* fix(anvil): miner forced-tx deadlock ([#14453](https://github.com/foundry-rs/foundry/pull/14453)) by @isagi-y22
* feat(doc): migrate from solang to solar ([#14447](https://github.com/foundry-rs/foundry/pull/14447)) by @mablr
* fix(cheatcodes): fix solc 0.8.35 error keyword warning ([#14509](https://github.com/foundry-rs/foundry/pull/14509)) by @figtracer
* chore: update codeowners ([#14529](https://github.com/foundry-rs/foundry/pull/14529)) by @onbjerg
* test(fmt): cover erc7201 layout formatting ([#14519](https://github.com/foundry-rs/foundry/pull/14519)) by @decofe
* perf(forge): avoid unnecessary gas\_snapshots clones ([#13969](https://github.com/foundry-rs/foundry/pull/13969)) by @ArshLabs
* fix(cli): fix jsonwebtoken panic ([#14562](https://github.com/foundry-rs/foundry/pull/14562)) by @pepyakin
* perf: short-circuit find\_by\_name\_or\_identifier instead of full collect ([#14514](https://github.com/foundry-rs/foundry/pull/14514)) by @cuiweixie
* fix(evm): query `state_snapshot.storage` in `ForkDbStateSnapshot::storage_ref` ([#14007](https://github.com/foundry-rs/foundry/pull/14007)) by @gutonosa
* fix(cheatcodes): transfer value for payable mock calls ([#14547](https://github.com/foundry-rs/foundry/pull/14547)) by @srdtrk
* fix(anvil): classify EVM halts as transaction rejections ([#14592](https://github.com/foundry-rs/foundry/pull/14592)) by @mmv08
* fix(forge): `--fuzz-seed` parameter is not effective in `forge coverage` ([#14610](https://github.com/foundry-rs/foundry/pull/14610)) by @wtdcode
* fix(ci): keep no-default builds free of op deps ([#14612](https://github.com/foundry-rs/foundry/pull/14612)) by @emmajam
* feat(lint): add tx-origin detector ([#14589](https://github.com/foundry-rs/foundry/pull/14589)) by @vikions
* fix(anvil): respect non-zero genesis block in Otterscan APIs  ([#14490](https://github.com/foundry-rs/foundry/pull/14490)) by @AissataF
* fix(anvil): abort node tasks on handle drop ([#14636](https://github.com/foundry-rs/foundry/pull/14636)) by @mattsse
* feat(anvil): add --fund-accounts CLI flag ([#14392](https://github.com/foundry-rs/foundry/pull/14392)) by @exp0nge
* fix(anvil): saturate `mint` when parsing OP deposit txs  ([#14652](https://github.com/foundry-rs/foundry/pull/14652)) by @DanielBoye
* docs(lint): fix duplicated "use" in lintrules guide ([#14701](https://github.com/foundry-rs/foundry/pull/14701)) by @abhicris
* fix(fmt): correct indentation of named args nested inside chained calls ([#13367](https://github.com/foundry-rs/foundry/pull/13367)) by @Himess
* fix(anvil): use configured epoch slots for block tags ([#14714](https://github.com/foundry-rs/foundry/pull/14714)) by @haythemsellami
* fix(traces): prefer contract ABI for decoding ([#14788](https://github.com/foundry-rs/foundry/pull/14788)) by @DaniPopes
* feat(lint): add delegatecall-loop lint ([#14752](https://github.com/foundry-rs/foundry/pull/14752)) by @0xKarl98
* fix(anvil): ignore nonzero Tempo nonce lanes ([#14502](https://github.com/foundry-rs/foundry/pull/14502)) by @solanaXpeter
* fix(anvil): keep chain-id inferred network in node config ([#14833](https://github.com/foundry-rs/foundry/pull/14833)) by @esorense
* anvil: stop masking gas estimation errors in send paths ([#14679](https://github.com/foundry-rs/foundry/pull/14679)) by @ralme1da
* fix(forge): resolve Tempo expiry for creates ([#14912](https://github.com/foundry-rs/foundry/pull/14912)) by @nivanovvv
* feat: add configurable collision-free EVM edge coverage ([#14853](https://github.com/foundry-rs/foundry/pull/14853)) by @0xalpharush
* fix(foundryup): create bin dir before activating version ([#14968](https://github.com/foundry-rs/foundry/pull/14968)) by @BROCCOLO1D
* fix(tui): always restore terminal state during panic unwinding ([#14965](https://github.com/foundry-rs/foundry/pull/14965)) by @bravesasha
* fix(traces): retry Cloudflare blocks instead of aborting identification ([#14981](https://github.com/foundry-rs/foundry/pull/14981)) by @0xMars42
* feat(forge): mutation testing ([#13091](https://github.com/foundry-rs/foundry/pull/13091)) by @gakonst
* feat(forge): add `[profile.<name>.coverage]` config section ([#14599](https://github.com/foundry-rs/foundry/pull/14599)) by @ccashwell
* fix(forge): preserve debug traces when setUp reverts ([#14390](https://github.com/foundry-rs/foundry/pull/14390)) by @IrshadKohl51
* Use TUI fallback for debugger in non-interactive mode ([#14780](https://github.com/foundry-rs/foundry/pull/14780)) by @cmende
* fix(anvil): handle zero prune history safely ([#14307](https://github.com/foundry-rs/foundry/pull/14307)) by @mk0walsk
* fix(anvil): consistent revert data format between eth\_call and eth\_estimateGas ([#13547](https://github.com/foundry-rs/foundry/pull/13547)) by @FredPhilipy
* ci: add `derek bench` trigger ([#15138](https://github.com/foundry-rs/foundry/pull/15138)) by @kuyziss
* fix(script): honour --code-size-limit CLI flag ([#15170](https://github.com/foundry-rs/foundry/pull/15170)) by @shapeshed
* fix(chisel): remove unused `latest` variable in next\_cached\_session ([#13923](https://github.com/foundry-rs/foundry/pull/13923)) by @strmfos
* fix(verify): print Sourcify job UI URL instead of status API URL on submission ([#15210](https://github.com/foundry-rs/foundry/pull/15210)) by @manuelwedler
* fix: correct typos and grammar in doc comments ([#13845](https://github.com/foundry-rs/foundry/pull/13845)) by @alexchenai
* anvil: add help description for --mixed-mining flag ([#13871](https://github.com/foundry-rs/foundry/pull/13871)) by @ParthSinghPS
* fix: add support for `--jwt-secret` in cast `--curl` ([#15160](https://github.com/foundry-rs/foundry/pull/15160)) by @LeTamanoir
* feat(lint): add non-reentrant-not-first detector ([#15248](https://github.com/foundry-rs/foundry/pull/15248)) by @Osraka
* feat(lint): add require-revert-in-loop detector ([#15236](https://github.com/foundry-rs/foundry/pull/15236)) by @Berektassuly
* feat(verify): accept SPDX identifiers for --license-type ([#15162](https://github.com/foundry-rs/foundry/pull/15162)) by @maksim-romanov
* fix(cast): consistent serialization of Uint/Ints depending on actual type ([#14824](https://github.com/foundry-rs/foundry/pull/14824)) by @0xferrous
* feat(script): auto-detect sender address from keystore without --sender flag ([#13869](https://github.com/foundry-rs/foundry/pull/13869)) by @intelliDean
* fix(cli): avoid panic on invalid remappings env and validate config path ([#13660](https://github.com/foundry-rs/foundry/pull/13660)) by @edgarr1986
* Implement EIP 4788 ([#15371](https://github.com/foundry-rs/foundry/pull/15371)) by @tskoyo
* fix(corpus): skip unreadable corpus files instead of failing the campaign ([#15276](https://github.com/foundry-rs/foundry/pull/15276)) by @mark0-cn
* feat(cli): allow soldeer to update the logging level ([#13485](https://github.com/foundry-rs/foundry/pull/13485)) by @beeb
* feat(config): support solc --via-ssa-cfg ([#15501](https://github.com/foundry-rs/foundry/pull/15501)) by @Amxx
* chore(forge/assets): update workflows ([#15560](https://github.com/foundry-rs/foundry/pull/15560)) by @StackOverflowExcept1on
* fix(primitives): use proper JSON serialization for deposit tx fields ([#13476](https://github.com/foundry-rs/foundry/pull/13476)) by @dizer-ti
* fix(forge): allow verify-bytecode to run without a block explorer ([#15142](https://github.com/foundry-rs/foundry/pull/15142)) by @PrazwalR
* fix(fmt): dropped statements for single-line **nested** if statements ([#13560](https://github.com/foundry-rs/foundry/pull/13560)) by @quangloc99
* feat(forge): add coverage attribution report ([#14511](https://github.com/foundry-rs/foundry/pull/14511)) by @smartcontracts
* feat(anvil): add anvil\_setNextBlockPrevRandao ([#15644](https://github.com/foundry-rs/foundry/pull/15644)) by @ritzdorf
* feat: print optional opcodes in forge test ([#14843](https://github.com/foundry-rs/foundry/pull/14843)) by @jaimebarrancos
* fix(doc): match inherited params with underscore-wrapped names ([#15238](https://github.com/foundry-rs/foundry/pull/15238)) by @flag4table
* fix(mutation): prune equivalent bounds ([#15942](https://github.com/foundry-rs/foundry/pull/15942)) by @gretzke
* fix(cast): reject malformed vanity wallet files ([#15978](https://github.com/foundry-rs/foundry/pull/15978)) by @grandpig
* chore(cast): upgrade evmole to 0.9.3 ([#15985](https://github.com/foundry-rs/foundry/pull/15985)) by @cdump
* fix(cast): accept 0x-prefixed vanity patterns ([#15994](https://github.com/foundry-rs/foundry/pull/15994)) by @racequite
* fix(anvil): return complete eth\_feeHistory when the cache lags the chain head ([#15128](https://github.com/foundry-rs/foundry/pull/15128)) by @satyakwok
* feature(forge): support transient storage inspection ([#16062](https://github.com/foundry-rs/foundry/pull/16062)) by @kuzminxyz
* fix(cast): detect uppercase numeric prefixes ([#16070](https://github.com/foundry-rs/foundry/pull/16070)) by @rappie
* feat(cast): add Touch ID enrollment ([#15995](https://github.com/foundry-rs/foundry/pull/15995)) by @dadadave80
* fix(cast): secure vanity wallet permissions ([#16163](https://github.com/foundry-rs/foundry/pull/16163)) by @questfever
* fix(coverage): report file-level (free) functions ([#16098](https://github.com/foundry-rs/foundry/pull/16098)) by @zexoverz
* fix(traces): decode P256VERIFY precompile calls ([#15972](https://github.com/foundry-rs/foundry/pull/15972)) by @HwanHeo
* fix(wallet): reject BIP32 paths that overflow the harden bit ([#16096](https://github.com/foundry-rs/foundry/pull/16096)) by @SashaMIT
* fix(cast): reject impossible to match vanity addresses ([#16230](https://github.com/foundry-rs/foundry/pull/16230)) by @siosw
* refactor(verify): drop the unreachable unknown optimizer runs branch ([#16066](https://github.com/foundry-rs/foundry/pull/16066)) by @mkzung
* fix(common): classify OpenChain 5xx responses as connectivity failures ([#16258](https://github.com/foundry-rs/foundry/pull/16258)) by @zloglevel

</details>
<!-- contributors:end -->

## v1.7.1 (2026-05-08)

# Foundry v1.7.1

A patch release on top of [v1.7.0](https://github.com/foundry-rs/foundry/releases/tag/v1.7.0) with cherry-picked correctness fixes for cheatcodes, EVM forking, CLI, `forge`, and `cast`, plus further release-pipeline hardening (updated release version string construction, signed archives & SBOMs).

***

## Cheatcodes

Reverter-address enforcement for CREATE frames, value transfers for payable mock calls, preserved reverts under `expectEmit`, and a fix for the spurious `solc 0.8.35` `error` keyword warning.

<details open>
<summary><b>Cheatcode fixes (4 PRs)</b></summary>

* fix(cheatcodes): fix solc 0.8.35 `error` keyword warning ([#14509](https://github.com/foundry-rs/foundry/pull/14509)) by @figtracer
* fix(cheatcodes): transfer value for payable mock calls ([#14547](https://github.com/foundry-rs/foundry/pull/14547)) by @srdtrk
* fix(cheatcodes): enforce `expectRevert` reverter address for CREATE frames ([#14615](https://github.com/foundry-rs/foundry/pull/14615)) by @mablr
* fix(cheatcodes): preserve reverts with `expectEmit` ([#14619](https://github.com/foundry-rs/foundry/pull/14619)) by @srdtrk

</details>

***

## EVM

Correctness fixes for fork state-snapshot lookups and CREATE address preservation in isolation mode.

<details open>
<summary><b>EVM fixes (2 PRs)</b></summary>

* fix(evm): query `state_snapshot.storage` in `ForkDbStateSnapshot::storage_ref` ([#14007](https://github.com/foundry-rs/foundry/pull/14007)) by @gutonosa
* fix(evm): preserve `CREATE` address on revert in isolation mode ([#14637](https://github.com/foundry-rs/foundry/pull/14637)) by @mablr

</details>

***

## Forge

Tempo's `forge init` template now uses `network = "tempo"` with populated default `rpc_endpoints`, `forge test` ignores `ETH_RPC_URL` for forking, `--fuzz-seed` is finally honored by `forge coverage`, and Tempo creates are encoded as AA calls.

<details open>
<summary><b>Forge changes (4 PRs)</b></summary>

* feat(forge): use `network = "tempo"` and add `rpc_endpoints` in tempo template ([#14528](https://github.com/foundry-rs/foundry/pull/14528)) by @zerosnacks
* fix(forge): ignore `ETH_RPC_URL` for test forking ([#14555](https://github.com/foundry-rs/foundry/pull/14555)) by @figtracer
* fix(forge): encode Tempo creates as AA calls ([#14585](https://github.com/foundry-rs/foundry/pull/14585)) by @figtracer
* fix(forge): `--fuzz-seed` parameter is not effective in `forge coverage` ([#14610](https://github.com/foundry-rs/foundry/pull/14610)) by @wtdcode

</details>

***

## Cast

Consistent `--json` output shapes for the `keychain` subcommands.

<details open>
<summary><b>Cast fixes (1 PR)</b></summary>

* fix(cast): consistent `--json` output for `keychain` subcommands ([#14590](https://github.com/foundry-rs/foundry/pull/14590)) by @mablr

</details>

***

## Config

The `network = "tempo"` key no longer triggers the unknown-key warning, and serialization of `NetworkConfigs` is canonicalized so `forge config` always emits the resolved network.

<details open>
<summary><b>Config fixes (1 PR)</b></summary>

* fix(config): suppress spurious unknown-key warning for `network` ([#14534](https://github.com/foundry-rs/foundry/pull/14534)) by @zerosnacks

</details>

***

## CLI

Fixes the `jsonwebtoken` `CryptoProvider` startup panic by selecting `aws_lc_rs` at compile time, and corrects release version metadata for immutable tags. Also bumps the version to `1.7.1` and tightens `vm.getFoundryVersion()` / `foundryVersionCmp` / `foundryVersionAtLeast` to tolerate the new SemVer build-metadata format.

<details open>
<summary><b>CLI fixes (2 PRs)</b></summary>

* fix(cli): fix `jsonwebtoken` panic ([#14562](https://github.com/foundry-rs/foundry/pull/14562)) by @pepyakin
* fix(cli): fix release version strings for immutable tags, bump to 1.7.1 ([#14496](https://github.com/foundry-rs/foundry/pull/14496)) by @decofe

</details>

***

## CI / Release pipeline

Release archives and Docker images are now signed with `cosign`, per-archive SHA256 + SPDX SBOMs (Syft) are emitted, and Sigstore-signed SLSA provenance attestations are published. The Tempo CI workflow on `release-1.7.1` was realigned with master.

<details open>
<summary><b>CI changes (3 PRs)</b></summary>

* ci: sign release archives, docker images, and publish SBOMs ([#14563](https://github.com/foundry-rs/foundry/pull/14563)) by @grandizzy
* fix(ci): increase permissions for the enhanced attestation writing ([#14584](https://github.com/foundry-rs/foundry/pull/14584)) by @zerosnacks
* fix(ci): use `PATH_USD` fallback fee token in Mail templates ([#14546](https://github.com/foundry-rs/foundry/pull/14546)) by @mablr

</details>

***

## Tests & Tooling

Compiler bumped to `0.8.35` for tests, `forge-std` test fixtures bumped to a newer rev, and clippy lints fixed under newer toolchains so CI is green on this branch.

<details open>
<summary><b>Tests & tooling changes (3 PRs)</b></summary>

* chore: bump compiler version to 0.8.35 for tests ([#14524](https://github.com/foundry-rs/foundry/pull/14524)) by @zerosnacks
* fix(ext): bump forge-std commit in external integration tests ([#14504](https://github.com/foundry-rs/foundry/pull/14504)) by @zerosnacks
* chore(tests): bump forge-std version ([#14510](https://github.com/foundry-rs/foundry/pull/14510))
* chore(clippy): fix `for_kv_map` and `useless_borrows_in_formatting` ([#14554](https://github.com/foundry-rs/foundry/pull/14554)) by @stevencartavia

</details>

***

## Notes on the cherry-pick

* **#14590** was cherry-picked partially: the `{ "remaining": ... }` JSON output object change is included; the new `crates/cast/tests/cli/keychain.rs` test file is **not**, because the `keychain_rl_json_is_object` test depends on Tempo deps newer than this branch.
* The Tempo CI workflow alignment is a backport of #14501, #14537, and #14556 from `master`. The `Check Tempo fork schedule compatibility` step is intentionally omitted — the underlying `tempo::tests::test_fork_schedule_parses_configured_rpcs` test was added in #14485 (Tempo deps bump) which is not part of v1.7.1.

***

## Full Changelog

[v1.7.0...v1.7.1](https://github.com/foundry-rs/foundry/compare/v1.7.0...v1.7.1)

## v1.7.0 (2026-04-28)

# Foundry v1.7.0

Foundry v1.7.0 brings major improvements to fuzzing and invariant testing, upstreams [Tempo](https://tempo.xyz/) 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-rc1` release 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](https://github.com/foundry-rs/foundry/pull/12713))
* **Invariant `check_interval` config** — deep invariant runs up to **3.6× faster** with `check_interval = 10` ([#13133](https://github.com/foundry-rs/foundry/pull/13133))
* **Invariant optimization mode** — search input sequences that maximize a target value, with realtime best-value tracking and persistence ([#13196](https://github.com/foundry-rs/foundry/pull/13196), [#14147](https://github.com/foundry-rs/foundry/pull/14147), [#14226](https://github.com/foundry-rs/foundry/pull/14226))
* **Improved reentrancy detection** in `call_override` invariant testing ([#13127](https://github.com/foundry-rs/foundry/pull/13127))
* **Time-based invariant fuzzing** via `max_time_delay` / `max_block_delay` configs ([#12616](https://github.com/foundry-rs/foundry/pull/12616))

### Network Updates

* **Osaka is the default EVM hardfork** ([#13112](https://github.com/foundry-rs/foundry/pull/13112)), with precompile decoding for Prague BLS12-381 and Osaka P256VERIFY ([#13094](https://github.com/foundry-rs/foundry/pull/13094))
* **Per-network `hardfork` and `network` keys** in `foundry.toml` ([#14312](https://github.com/foundry-rs/foundry/pull/14312), [#14337](https://github.com/foundry-rs/foundry/pull/14337)), with auto-detection from a fork's chain ID ([#14193](https://github.com/foundry-rs/foundry/pull/14193))

### Tempo

**[Tempo](https://tempo.xyz/)** support has been upstreamed from the standalone [`tempoxyz/tempo-foundry`](https://github.com/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](https://github.com/foundry-rs/foundry/pull/12819))
* `cast keychain` for Tempo access keys ([#14166](https://github.com/foundry-rs/foundry/pull/14166), [#14222](https://github.com/foundry-rs/foundry/pull/14222))
* `cast tip20 create` and TIP20 virtual address salt mining ([#14160](https://github.com/foundry-rs/foundry/pull/14160), [#14365](https://github.com/foundry-rs/foundry/pull/14365))
* `--tempo.fee-token` on `forge script` and `cast send` ([#14204](https://github.com/foundry-rs/foundry/pull/14204), [#14184](https://github.com/foundry-rs/foundry/pull/14184))
* Tempo network auto-detection on `anvil --fork-url` ([#14279](https://github.com/foundry-rs/foundry/pull/14279))

Full list in the Tempo section below.

### MPP (Machine Payments Protocol)

Foundry now supports **[MPP](https://mpp.dev/) (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](https://github.com/foundry-rs/foundry/pull/14192), [#14404](https://github.com/foundry-rs/foundry/pull/14404), [#14353](https://github.com/foundry-rs/foundry/pull/14353)).

### Forge & Cast

* **Browser wallet support** across `forge script` ([#12952](https://github.com/foundry-rs/foundry/pull/12952)), `forge create` ([#14394](https://github.com/foundry-rs/foundry/pull/14394)), `cast send` ([#13747](https://github.com/foundry-rs/foundry/pull/13747)), and `cast erc20` ([#14395](https://github.com/foundry-rs/foundry/pull/14395)) — sign and broadcast transactions directly from a browser wallet extension instead of provisioning a hot key on disk
* **Realtime `console.log`** in `forge` and `chisel` ([#13321](https://github.com/foundry-rs/foundry/pull/13321)) and **`console.table`** support ([#14338](https://github.com/foundry-rs/foundry/pull/14338))
* `forge inspect <x> linearization` ([#13704](https://github.com/foundry-rs/foundry/pull/13704)) makes it easier to inspect where inherited functions are resolved from
* `forge clone` Sourcify support ([#12900](https://github.com/foundry-rs/foundry/pull/12900))
* `cast batch-send` / `batch-mktx` for native call batching ([#13973](https://github.com/foundry-rs/foundry/pull/13973))
* `cast --curl` flag to print equivalent curl commands ([#13114](https://github.com/foundry-rs/foundry/pull/13114))

### Cheatcodes & Lint

* New cheatcodes: `executeTransaction` ([#13437](https://github.com/foundry-rs/foundry/pull/13437)), `Ed25519` crypto ([#13450](https://github.com/foundry-rs/foundry/pull/13450)), `getRecordedLogsJson` ([#13093](https://github.com/foundry-rs/foundry/pull/13093)), `currentFilePath` ([#13735](https://github.com/foundry-rs/foundry/pull/13735))
* New `forge-lint` rules: incorrect ERC20 interface ([#14428](https://github.com/foundry-rs/foundry/pull/14428)), incorrect ERC721 interface ([#14412](https://github.com/foundry-rs/foundry/pull/14412)), `block-timestamp` ([#14431](https://github.com/foundry-rs/foundry/pull/14431)), and custom errors ([#13126](https://github.com/foundry-rs/foundry/pull/13126)). These catch incorrect ERC20/ERC721 interface implementations, timestamp-dependent logic, and custom-error usage issues.

***

## Benchmarks

> **Live dashboard: [getfoundry.sh/benchmarks](https://www.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`](https://github.com/foundry-rs/foundry/blob/master/benches/LATEST.md).

<details>
<summary><b>Performance-related features (22 PRs)</b></summary>

* perf: add dist profile for smaller release binaries ([#13097](https://github.com/foundry-rs/foundry/pull/13097)) by @onbjerg
* perf: compute literals only once ([#12716](https://github.com/foundry-rs/foundry/pull/12716)) by @DaniPopes
* perf: remove redundant allocation in receipt bloom calculation ([#13035](https://github.com/foundry-rs/foundry/pull/13035)) by @marukai67
* perf(forge): skip external identifiers for local tests ([#13189](https://github.com/foundry-rs/foundry/pull/13189)) by @gakonst
* perf(anvil): avoid redundant block queries in `ots_getBlockTransactions` ([#13243](https://github.com/foundry-rs/foundry/pull/13243)) by @aganisgash
* perf(evm): wrap `Executor.backend` in `Arc` for copy-on-write cloning ([#13327](https://github.com/foundry-rs/foundry/pull/13327)) by @gakonst
* perf(cheatcodes): loop invariant code motion by hand ([#13357](https://github.com/foundry-rs/foundry/pull/13357)) by @cuiweixie
* perf(linking): replace double hash map lookup with single `get` ([#13361](https://github.com/foundry-rs/foundry/pull/13361)) by @cuiweixie
* perf(anvil): reuse storage root from `prove_storage` instead of recomputing ([#13363](https://github.com/foundry-rs/foundry/pull/13363)) by @thunggis
* perf(verify): reuse transaction from earlier RPC call instead of fetching twice ([#13391](https://github.com/foundry-rs/foundry/pull/13391)) by @thunggis
* perf: avoid checksum ([#13374](https://github.com/foundry-rs/foundry/pull/13374)) by @cuiweixie
* perf(invariant): avoid cloning state changeset in fuzz runs ([#13398](https://github.com/foundry-rs/foundry/pull/13398)) by @thunggis
* perf(traces): deduplicate addresses before external fetching ([#13320](https://github.com/foundry-rs/foundry/pull/13320)) by @marukai67
* perf(primitives): avoid cloning receipts ([#13396](https://github.com/foundry-rs/foundry/pull/13396)) by @thunggis
* perf(config): skip redundant remapping detection in `_with_root` ([#13389](https://github.com/foundry-rs/foundry/pull/13389)) by @0xMars42
* perf(anvil): avoid redundant cloning and hash recomputation in mem backend ([#13744](https://github.com/foundry-rs/foundry/pull/13744)) by @edgarr1986
* perf(anvil): remove redundant clone in `create_access_list` ([#13887](https://github.com/foundry-rs/foundry/pull/13887)) by @edgarr1986
* perf(evm): make `NestedEvm::to_evm_env` consuming to avoid useless clone ([#13893](https://github.com/foundry-rs/foundry/pull/13893)) by @mablr
* perf(evm): remove unnecessary clones in `do_call_end`/`do_create_end` ([#13913](https://github.com/foundry-rs/foundry/pull/13913)) by @figtracer
* perf(evm): remove `EvmEnv`/`TxEnv` cloning in DBs & `CheatcodesExecutor` impls ([#13960](https://github.com/foundry-rs/foundry/pull/13960)) by @mablr
* perf(traces): skip precompile addresses in `identify_addresses` ([#14198](https://github.com/foundry-rs/foundry/pull/14198)) by @decofe
* feat: make `asm-keccak` a default feature in all binaries ([#14389](https://github.com/foundry-rs/foundry/pull/14389)) by @DaniPopes

</details>

***

## Breaking / Behavior Changes

* `forge` and `anvil` now default to Osaka ([#13112](https://github.com/foundry-rs/foundry/pull/13112)).
* Fuzz tests now use a random seed by default when none is provided ([#13309](https://github.com/foundry-rs/foundry/pull/13309)).
* `copyStorage` and `setArbitraryStorage` are now marked `Unsafe` ([#13882](https://github.com/foundry-rs/foundry/pull/13882)).
* Compilation now fails on unresolved imports instead of continuing ([#12848](https://github.com/foundry-rs/foundry/pull/12848)).
* `foundry.toml` now supports per-network `hardfork` selection and an explicit `network` key ([#14312](https://github.com/foundry-rs/foundry/pull/14312), [#14337](https://github.com/foundry-rs/foundry/pull/14337)); forked runs can also auto-detect the active network from chain ID ([#14193](https://github.com/foundry-rs/foundry/pull/14193)).

***

## Upgrade Notes

* Run `forge build` after upgrading. Compilation now fails on unresolved imports instead of silently continuing ([#12848](https://github.com/foundry-rs/foundry/pull/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](https://github.com/foundry-rs/foundry/pull/13309)).
* If you rely on `copyStorage` or `setArbitraryStorage`, update tests and helpers to account for these cheatcodes now being marked `Unsafe` ([#13882](https://github.com/foundry-rs/foundry/pull/13882)).
* If you previously configured a single `hardfork`, migrate to the new `network` / per-network `hardfork` settings ([#14312](https://github.com/foundry-rs/foundry/pull/14312), [#14337](https://github.com/foundry-rs/foundry/pull/14337)). Forked runs can also infer the active network from chain ID ([#14193](https://github.com/foundry-rs/foundry/pull/14193)).

***

## Testing & Fuzzing

### Parallelized Stateless Fuzzing ([#12713](https://github.com/foundry-rs/foundry/pull/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](https://github.com/foundry-rs/foundry/pull/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 |

```toml
[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.

### Invariant Optimization Mode ([#13196](https://github.com/foundry-rs/foundry/pull/13196), [#14147](https://github.com/foundry-rs/foundry/pull/14147), [#14226](https://github.com/foundry-rs/foundry/pull/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.

```solidity
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](https://github.com/foundry-rs/foundry/pull/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](https://github.com/foundry-rs/foundry/pull/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.

<details>
<summary><b>Other testing improvements (5 PRs)</b></summary>

* Assertion failures (`assert()`, `vm.assert*`, panics) are now reported as invariant failures during campaigns instead of being silently discarded with reverts ([#14275](https://github.com/foundry-rs/foundry/pull/14275))
* Broken invariants are logged as soon as they are found ([#14433](https://github.com/foundry-rs/foundry/pull/14433))
* Counterexample validation now uses settings rather than bytecode ([#13219](https://github.com/foundry-rs/foundry/pull/13219))
* SanitizerCoverage support for coverage-guided fuzzing of native Rust code ([#14339](https://github.com/foundry-rs/foundry/pull/14339))
* Address mutation variant added to fuzz dictionary selection ([#13090](https://github.com/foundry-rs/foundry/pull/13090))

</details>

***

## 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 `network` key in `foundry.toml` and per-network `hardfork` selection ([#14337](https://github.com/foundry-rs/foundry/pull/14337), [#14312](https://github.com/foundry-rs/foundry/pull/14312))
* Auto-detection of the active network from a fork's chain ID ([#14193](https://github.com/foundry-rs/foundry/pull/14193))

```toml
[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:

```solidity
/// 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.

<details>
<summary><b>Other chain support (8 PRs)</b></summary>

* XDC Network + SKALE Base ([#12710](https://github.com/foundry-rs/foundry/pull/12710))
* Polkadot, Kusama, and Polkadot Testnet RPC gas estimation ([#12537](https://github.com/foundry-rs/foundry/pull/12537))
* Network-specific `BaseFeeParams` for Optimism in Anvil ([#12944](https://github.com/foundry-rs/foundry/pull/12944))
* Monad mainnet gas calculation + system address constant ([#12615](https://github.com/foundry-rs/foundry/pull/12615), [#12585](https://github.com/foundry-rs/foundry/pull/12585))
* MegaETH system tx sender + gas calc ([#14149](https://github.com/foundry-rs/foundry/pull/14149), [#13999](https://github.com/foundry-rs/foundry/pull/13999))
* Arbitrum fork block-number pinning ([#14021](https://github.com/foundry-rs/foundry/pull/14021))
* Etherlink testnet → shadownet rename ([#13763](https://github.com/foundry-rs/foundry/pull/13763))
* RPC URL bump: ithaca.xyz → reth.rs ([#13261](https://github.com/foundry-rs/foundry/pull/13261))

</details>

***

## Improved Integration

### Immutable Releases ([#14445](https://github.com/foundry-rs/foundry/pull/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:

* `latest` is the new default channel (alias: `stable`).
* `nightly` resolves to the most recent `nightly-{SHA}` prerelease.
* Pinning to a specific build (`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}`.

### Foundryup Rust Rewrite (Experimental)

This release is accompanied by a new Rust rewrite of [`foundryup`](https://github.com/foundry-rs/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`:

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

### Foundry-toolchain TypeScript Rewrite

The [`foundry-toolchain`](https://github.com/foundry-rs/foundry-toolchain) GitHub Action has been completely rewritten in TypeScript for improved maintainability and reliability. See the [v1.7.0 release](https://github.com/foundry-rs/foundry-toolchain/releases/tag/v1.7.0).

### `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`](https://github.com/foundry-rs/foundry-core) and consumed as published crates ([#14348](https://github.com/foundry-rs/foundry/pull/14348), [#14427](https://github.com/foundry-rs/foundry/pull/14427), [#14443](https://github.com/foundry-rs/foundry/pull/14443)).

### Other Integration Changes

Hardening of the publishing pipeline: trusted OIDC for npm and proper semver floating tags for Docker.

<details>
<summary><b>Other integration changes (2 PRs)</b></summary>

* OIDC trusted publishing for npm, removing the long-lived `NPM_TOKEN` ([#14249](https://github.com/foundry-rs/foundry/pull/14249))
* Docker semver major/minor floating tags on release ([#13182](https://github.com/foundry-rs/foundry/pull/13182))

</details>

***

## Tempo

Full PR breakdown for the Tempo upstreaming.

<details>
<summary><b>Fork deprecation, CI upstreaming & <code>foundryup</code></b></summary>

* feat(ci): upstream Tempo CI ([#14206](https://github.com/foundry-rs/foundry/pull/14206)) by @mablr
* feat(ci): upstream `bump-tempo` workflow ([#14323](https://github.com/foundry-rs/foundry/pull/14323)) by @mablr
* ci: consolidate tempo branch workflows ([#14341](https://github.com/foundry-rs/foundry/pull/14341)) by @decofe
* revert: remove tempo branch workflow, restore `bump-tempo` ([#14343](https://github.com/foundry-rs/foundry/pull/14343)) by @decofe
* fix(ci): handle stale branches in `bump-tempo` workflow ([#14377](https://github.com/foundry-rs/foundry/pull/14377)) by @decofe
* ci(tempo): run testnet on PRs ([#14479](https://github.com/foundry-rs/foundry/pull/14479)) by @zerosnacks
* chore(foundryup): remove tempo fork support ([#14324](https://github.com/foundry-rs/foundry/pull/14324)) by @figtracer
* foundryup: tempo now distributes all binaries ([#13337](https://github.com/foundry-rs/foundry/pull/13337)) by @gakonst
* fix(foundryup): tempo-foundry now ships all binaries ([#13834](https://github.com/foundry-rs/foundry/pull/13834)) by @zerosnacks

</details>

<details>
<summary><b>Onboarding & project setup</b></summary>

* feat(`foundryup`): add Tempo support ([#12775](https://github.com/foundry-rs/foundry/pull/12775)) by @zerosnacks
* feat(forge): add `--network tempo` flag to `forge init` ([#12819](https://github.com/foundry-rs/foundry/pull/12819)) by @onbjerg
* fix(foundryup): support versioned installs for tempo network ([#13607](https://github.com/foundry-rs/foundry/pull/13607)) by @decofe
* fix(`foundryup`): bump foundryup version ([#13832](https://github.com/foundry-rs/foundry/pull/13832)) by @zerosnacks
* feat(init): add `SignatureVerifier` to tempo example ([#14351](https://github.com/foundry-rs/foundry/pull/14351)) by @0xrusowsky
* fix: remove `network: tempo` from Tempo template ([#14424](https://github.com/foundry-rs/foundry/pull/14424)) by @zerosnacks
* chore(cli): update tempo `nonceKey` cli flag naming ([#14188](https://github.com/foundry-rs/foundry/pull/14188)) by @mablr

</details>

<details>
<summary><b>Execution path & EVM integration</b></summary>

* feat(evm): Add Tempo flag to `NetworkConfigs` ([#13953](https://github.com/foundry-rs/foundry/pull/13953)) by @stevencartavia
* feat(evm): add `FoundryHardfork::Tempo` variant ([#13972](https://github.com/foundry-rs/foundry/pull/13972)) by @stevencartavia
* feat(anvil): add Tempo config helpers ([#13968](https://github.com/foundry-rs/foundry/pull/13968)) by @stevencartavia
* feat(anvil): add tempo genesis initialization ([#14014](https://github.com/foundry-rs/foundry/pull/14014)) by @stevencartavia
* feat(anvil): wire tempo genesis initialization ([#14030](https://github.com/foundry-rs/foundry/pull/14030)) by @stevencartavia
* feat(anvil): add Tempo EVM execution path ([#14031](https://github.com/foundry-rs/foundry/pull/14031)) by @stevencartavia
* feat(evm): add tmp `TempoFoundryEvm` wrapper ([#14022](https://github.com/foundry-rs/foundry/pull/14022)) by @figtracer
* feat(evm): `FoundryContextExt` Tempo impl ([#14002](https://github.com/foundry-rs/foundry/pull/14002)) by @mablr
* feat(evm): expand `FoundryTransaction` with Tempo methods ([#14005](https://github.com/foundry-rs/foundry/pull/14005)) by @figtracer
* feat(evm): expand `FoundryBlock` with Tempo methods ([#14004](https://github.com/foundry-rs/foundry/pull/14004)) by @figtracer
* feat(evm): `TryAnyToTxEnv` Tempo impl ([#14011](https://github.com/foundry-rs/foundry/pull/14011)) by @mablr
* feat(evm): add Tempo precompile initialization ([#14082](https://github.com/foundry-rs/foundry/pull/14082)) by @figtracer
* feat: add missing Tempo precompile addresses ([#14111](https://github.com/foundry-rs/foundry/pull/14111)) by @stevencartavia
* chore(evm): import `PATH_USD_ADDRESS` from `tempo-contracts` ([#14071](https://github.com/foundry-rs/foundry/pull/14071)) by @figtracer
* chore(evm): rename `FoundryStorageProvider` to `TempoStorageProvider` ([#14080](https://github.com/foundry-rs/foundry/pull/14080)) by @figtracer
* feat(evm): auto-detect Tempo network on Anvil ([#14279](https://github.com/foundry-rs/foundry/pull/14279)) by @mablr
* feat(anvil): support Tempo hardfork parsing ([#14096](https://github.com/foundry-rs/foundry/pull/14096)) by @stevencartavia
* feat(anvil): store `FoundryHardfork` on `Backend` ([#14105](https://github.com/foundry-rs/foundry/pull/14105)) by @stevencartavia
* feat(anvil): add Tempo-specific block header fields ([#14107](https://github.com/foundry-rs/foundry/pull/14107)) by @stevencartavia
* feat(anvil): expose network field in `anvil_nodeInfo` ([#14093](https://github.com/foundry-rs/foundry/pull/14093)) by @stevencartavia
* feat(anvil): RPC methods for tempo's `TipFeeManager` in `anvil_*` namespace ([#14414](https://github.com/foundry-rs/foundry/pull/14414)) by @mablr
* feat(evm): add Tempo labels/fns/events to `CallTraceDecoder` ([#14213](https://github.com/foundry-rs/foundry/pull/14213)) by @mablr
* feat(evm): add `TempoLabels` inspector for TIP20 token names ([#14072](https://github.com/foundry-rs/foundry/pull/14072)) by @figtracer
* fix(anvil): pass configured hardfork to Tempo precompile init ([#14131](https://github.com/foundry-rs/foundry/pull/14131)) by @stevencartavia
* fix(anvil): guard deposit tx parsing in Tempo mode ([#14261](https://github.com/foundry-rs/foundry/pull/14261)) by @stevencartavia
* fix(evm): update `alloy-chains` + `TempoDevnet` handling ([#14309](https://github.com/foundry-rs/foundry/pull/14309)) by @mablr
* feat: use `ChannelDb` for channel persistence ([#14355](https://github.com/foundry-rs/foundry/pull/14355)) by @stevencartavia

</details>

<details>
<summary><b>Transactions, pool & gas</b></summary>

* feat(anvil): basic tempo tx signing support ([#12974](https://github.com/foundry-rs/foundry/pull/12974)) by @onbjerg
* feat(anvil): support Tempo transactions in RPC and validation ([#14041](https://github.com/foundry-rs/foundry/pull/14041)) by @stevencartavia
* feat(anvil): fix Tempo transaction replay and tracing ([#14039](https://github.com/foundry-rs/foundry/pull/14039)) by @stevencartavia
* feat(anvil): extract base eth errors from `TempoInvalidTransaction` ([#14040](https://github.com/foundry-rs/foundry/pull/14040)) by @stevencartavia
* feat(anvil): add Tempo transaction pool validation ([#14055](https://github.com/foundry-rs/foundry/pull/14055)) by @stevencartavia
* feat(anvil): add Tempo async pool validation (time bounds + fee token balance) ([#14057](https://github.com/foundry-rs/foundry/pull/14057)) by @stevencartavia
* feat(anvil): use hash-based pool ordering for Tempo transactions ([#14060](https://github.com/foundry-rs/foundry/pull/14060)) by @stevencartavia
* feat(anvil): Tempo base fee defaults ([#14067](https://github.com/foundry-rs/foundry/pull/14067)) by @stevencartavia
* feat(anvil): Tempo gas estimation guards ([#14068](https://github.com/foundry-rs/foundry/pull/14068)) by @stevencartavia
* feat(anvil): handle `not-yet-valid` transactions during mining ([#14069](https://github.com/foundry-rs/foundry/pull/14069)) by @stevencartavia
* feat(anvil): add `feePayer` to Tempo receipts ([#14109](https://github.com/foundry-rs/foundry/pull/14109)) by @stevencartavia
* feat(anvil): auto-fill gas fields for Tempo AA transactions ([#14142](https://github.com/foundry-rs/foundry/pull/14142)) by @stevencartavia
* refactor(anvil): extract `InspectorTxConfig` and `PoolTxGasConfig` builders ([#14152](https://github.com/foundry-rs/foundry/pull/14152)) by @stevencartavia
* fix(anvil): parse Tempo expiring nonce fields from hex strings ([#14259](https://github.com/foundry-rs/foundry/pull/14259)) by @figtracer

</details>

<details>
<summary><b>Wallets, keychain & access keys</b></summary>

* feat(cast): tempo nonce keys ([#12977](https://github.com/foundry-rs/foundry/pull/12977)) by @onbjerg
* feat(cast): add tempo tx construction support ([#12973](https://github.com/foundry-rs/foundry/pull/12973)) by @onbjerg
* feat: Tempo wallet access key support for cast ([#13909](https://github.com/foundry-rs/foundry/pull/13909)) by @onbjerg
* feat(forge-script): Tempo access key support for forge script ([#13917](https://github.com/foundry-rs/foundry/pull/13917)) by @stevencartavia
* feat(common): add Tempo wallet keystore types ([#13975](https://github.com/foundry-rs/foundry/pull/13975)) by @figtracer
* feat(cast): introduce `cast keychain` ([#14166](https://github.com/foundry-rs/foundry/pull/14166)) by @figtracer
* feat(cast): full `cast keychain` suite ([#14222](https://github.com/foundry-rs/foundry/pull/14222)) by @figtracer
* feat(wallets): add `--tempo.access-key` and `--tempo.root-account` ([#14201](https://github.com/foundry-rs/foundry/pull/14201)) by @figtracer
* feat(forge): `forge create` Tempo keychain support ([#14185](https://github.com/foundry-rs/foundry/pull/14185)) by @figtracer
* refactor(cast): fold `run_tempo_keychain` into `run_generic` as `AccessKey` case ([#14137](https://github.com/foundry-rs/foundry/pull/14137)) by @mablr
* refactor(common): unify `sign_with_access_key` with provisioning check ([#14189](https://github.com/foundry-rs/foundry/pull/14189)) by @figtracer
* feat(common): `FoundryTransactionBuilder::sign_with_access_key` method ([#14120](https://github.com/foundry-rs/foundry/pull/14120)) by @mablr
* fix(cast): `keychain auth` legacy mode w/ forks before T3 ([#14311](https://github.com/foundry-rs/foundry/pull/14311)) by @mablr
* test(cast): add keychain parsing unit tests, enforce `deny_unknown_fields` ([#14322](https://github.com/foundry-rs/foundry/pull/14322)) by @figtracer

</details>

<details>
<summary><b>TIP20 / fee token</b></summary>

* feat(cast): add `ISO 4217` validation for `TIP-20` ([#14158](https://github.com/foundry-rs/foundry/pull/14158)) by @figtracer
* feat(cast): add `cast tip20 create` ([#14160](https://github.com/foundry-rs/foundry/pull/14160)) by @figtracer
* feat(cast): `cast send` ISO 4217 validation for `TIP20Factory` ([#14184](https://github.com/foundry-rs/foundry/pull/14184)) by @figtracer
* feat(cast): mine TIP20 virtual address master salt ([#14365](https://github.com/foundry-rs/foundry/pull/14365)) by @0xrusowsky
* feat(script): add `--tempo.fee-token` to `forge script` ([#14204](https://github.com/foundry-rs/foundry/pull/14204)) by @figtracer
* feat(cli): `--tempo.fee-token` token id parsing ([#14219](https://github.com/foundry-rs/foundry/pull/14219)) by @mablr
* feat(forge): propagate `fee_token` to `deploy_tokens` in `CreateArgs::deploy` ([#14221](https://github.com/foundry-rs/foundry/pull/14221)) by @mablr
* fix(evm): proper `fee_token` handling in `InspectorHandler` & `Cheatcodes` ([#14225](https://github.com/foundry-rs/foundry/pull/14225)) by @mablr
* feat(evm): tempo genesis init and fork warmup into `FoundryEvmFactory` ([#14159](https://github.com/foundry-rs/foundry/pull/14159)) by @mablr

</details>

<details>
<summary><b>Forge / Cast / Script integration</b></summary>

* feat(forge): `forge test/coverage` Tempo support ([#14165](https://github.com/foundry-rs/foundry/pull/14165)) by @mablr
* feat(script): add `--batch` flag for Tempo native batching ([#14167](https://github.com/foundry-rs/foundry/pull/14167)) by @mablr
* feat(forge,cast): auto-detect network from fork chain ID ([#14193](https://github.com/foundry-rs/foundry/pull/14193)) by @mablr
* fix(script): Tempo direct signer + gas calc logic ([#14242](https://github.com/foundry-rs/foundry/pull/14242)) by @mablr
* fix(forge): `script`/`test` Tempo selection when used w/ Anvil ([#14258](https://github.com/foundry-rs/foundry/pull/14258)) by @mablr
* fix(script): skip `deploy_create2_deployer` in tempo mode to avoid `CreateCollision` ([#14336](https://github.com/foundry-rs/foundry/pull/14336)) by @mablr
* fix(evm): enforce tx gas limits in `executeTransaction` ([#14318](https://github.com/foundry-rs/foundry/pull/14318)) by @0xrusowsky
* feat(config): support network-specific `hardfork` in `foundry.toml` ([#14312](https://github.com/foundry-rs/foundry/pull/14312)) by @0xrusowsky
* feat(config): `network` key in `foundry.toml` ([#14337](https://github.com/foundry-rs/foundry/pull/14337)) by @mablr

</details>

<details>
<summary><b>Tests, deps & docs</b></summary>

* feat(anvil): add Tempo genesis and basic behavior tests ([#14112](https://github.com/foundry-rs/foundry/pull/14112)) by @stevencartavia
* feat(anvil): add Tempo AA transaction tests ([#14127](https://github.com/foundry-rs/foundry/pull/14127)) by @stevencartavia
* feat(anvil): add Tempo anvil API tests ([#14140](https://github.com/foundry-rs/foundry/pull/14140)) by @stevencartavia
* feat(anvil): add TIP20 token operation tests ([#14169](https://github.com/foundry-rs/foundry/pull/14169)) by @stevencartavia
* feat(anvil): add Tempo anvil control and block/chain tests ([#14171](https://github.com/foundry-rs/foundry/pull/14171)) by @stevencartavia
* feat(anvil): add Tempo AA transaction tests (additional coverage) ([#14173](https://github.com/foundry-rs/foundry/pull/14173)) by @stevencartavia
* feat(anvil): add Tempo gas estimation and tx type tests ([#14197](https://github.com/foundry-rs/foundry/pull/14197)) by @stevencartavia
* feat(anvil): add Tempo gas and fee tests ([#14124](https://github.com/foundry-rs/foundry/pull/14124)) by @stevencartavia
* feat(ci): add Tempo test contract support files ([#14205](https://github.com/foundry-rs/foundry/pull/14205)) by @figtracer
* chore(deps): bump tempo dependencies to `39b9262` ([#14345](https://github.com/foundry-rs/foundry/pull/14345)) by @decofe
* chore(tempo): bump rev + use extension traits ([#14378](https://github.com/foundry-rs/foundry/pull/14378)) by @decofe
* chore(evm): remove tempo deadcode ([#14146](https://github.com/foundry-rs/foundry/pull/14146)) by @mablr
* chore(cast): remove `src/tempo.rs`, inline helpers ([#14162](https://github.com/foundry-rs/foundry/pull/14162)) by @figtracer
* docs: correct Tempo TIP-1022 documentation URL ([#14387](https://github.com/foundry-rs/foundry/pull/14387)) by @DaniPopes
* fix(forge): update Mail templates for `createToken` salt parameter ([#14164](https://github.com/foundry-rs/foundry/pull/14164)) by @mablr

</details>

***

## 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.

<details>
<summary><b>MPP changes (6 PRs)</b></summary>

* feat: add MPP support for 402-gated RPC endpoints ([#14192](https://github.com/foundry-rs/foundry/pull/14192)) by @decofe
* fix(mpp): fetch fresh challenge on verification-failed key provisioning retry ([#14347](https://github.com/foundry-rs/foundry/pull/14347)) by @zerosnacks
* chore(mpp): add built-in rpc url mapping ([#14353](https://github.com/foundry-rs/foundry/pull/14353)) by @zerosnacks
* feat(common): add MPP WebSocket transport ([#14404](https://github.com/foundry-rs/foundry/pull/14404)) by @stevencartavia
* ci: split MPP e2e into its own workflow ([#14468](https://github.com/foundry-rs/foundry/pull/14468)) by @zerosnacks
* ci: prefer direct-key credentials for MPP e2e ([#14472](https://github.com/foundry-rs/foundry/pull/14472)) by @zerosnacks

</details>

***

## 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.

<details>
<summary><b>Forge features (15 PRs)</b></summary>

* feat: use Osaka as default EVM hardfork ([#13112](https://github.com/foundry-rs/foundry/pull/13112)) by @zerosnacks
* feat(forge selectors): cache selectors from abis ([#12742](https://github.com/foundry-rs/foundry/pull/12742)) by @JuaniRios
* feat(forge script): display contract name and function in tx output ([#13156](https://github.com/foundry-rs/foundry/pull/13156)) by @gakonst
* feat!(`forge script`): add `--interactive` flag for deploying with a single keypair ([#12608](https://github.com/foundry-rs/foundry/pull/12608)) by @zerosnacks
* feat: `forge verify-bytecode` automatically recompiles upon running ([#12651](https://github.com/foundry-rs/foundry/pull/12651)) by @Jds-23
* feat: add Sourcify support to `forge clone` ([#12900](https://github.com/foundry-rs/foundry/pull/12900)) by @avorylli
* feat: warn on `soldeer.lock` revision mismatch during build ([#12366](https://github.com/foundry-rs/foundry/pull/12366)) by @silvekkk
* feat(forge): generate random fuzz seed if none provided ([#13309](https://github.com/foundry-rs/foundry/pull/13309)) by @onbjerg
* feat: add `forge inspect <x> linearization` ([#13704](https://github.com/foundry-rs/foundry/pull/13704)) by @red-swan
* feat(forge): generic `Network` support for `forge create` ([#13733](https://github.com/foundry-rs/foundry/pull/13733)) by @figtracer
* feat(forge,chisel): realtime `console.log` ([#13321](https://github.com/foundry-rs/foundry/pull/13321)) by @quangloc99
* feat: support `console.table` ([#14338](https://github.com/foundry-rs/foundry/pull/14338)) by @ndavd
* feat(forge): add browser wallet support for `forge script` ([#12952](https://github.com/foundry-rs/foundry/pull/12952)) by @mablr
* feat(forge): browser wallet support for `create` subcommand ([#14394](https://github.com/foundry-rs/foundry/pull/14394)) by @mablr
* feat: support solc prereleases ([#12599](https://github.com/foundry-rs/foundry/pull/12599)) by @grandizzy

</details>

<details>
<summary><b>Forge fixes (22 PRs)</b></summary>

* fix: `svm` fails to download solc 0.8.33 on linux/arm64, bump `svm-rs` ([#13007](https://github.com/foundry-rs/foundry/pull/13007)) by @zerosnacks
* fix(forge): fail compilation on unresolved imports ([#12848](https://github.com/foundry-rs/foundry/pull/12848)) by @subwaycookiecrunch
* fix(forge): failing tests trigger early exit without `--fail-fast` ([#12785](https://github.com/foundry-rs/foundry/pull/12785)) by @0xferrous
* fix(forge): lookup path artifact if not in available artifacts ([#12927](https://github.com/foundry-rs/foundry/pull/12927)) by @grandizzy
* fix(forge): prevent gas underflow in delete operations on Cancun ([#13157](https://github.com/foundry-rs/foundry/pull/13157)) by @gakonst
* fix(forge): reseed cheatcodes rng in fuzz tests ([#12843](https://github.com/foundry-rs/foundry/pull/12843)) by @DaniPopes
* fix(forge): respect lint ignore config in solar compilation ([#12978](https://github.com/foundry-rs/foundry/pull/12978)) by @tefyosL-sol
* fix: only classify `setUp` as test setup if it has no parameters ([#13204](https://github.com/foundry-rs/foundry/pull/13204)) by @mattsse
* fix(forge): apply `--access-list` in `forge create` ([#13557](https://github.com/foundry-rs/foundry/pull/13557)) by @FredPhilipy
* fix(forge): don't reset snapshot diff result on missing file ([#13442](https://github.com/foundry-rs/foundry/pull/13442)) by @dizer-ti
* fix(forge): correct solar Solidity version support message ([#13592](https://github.com/foundry-rs/foundry/pull/13592)) by @0xferrous
* fix(forge): preserve invariant replay failure reason ([#14136](https://github.com/foundry-rs/foundry/pull/14136)) by @0xWeakSheep
* fix(forge): adjust gas assertion `CounterWithFallback` ([#14465](https://github.com/foundry-rs/foundry/pull/14465)) by @mablr
* fix(cli): `Git::is_repo_root` always returns false ([#13505](https://github.com/foundry-rs/foundry/pull/13505)) by @letmehateu
* fix: prevent panic on Etherscan client creation failure in test command ([#13395](https://github.com/foundry-rs/foundry/pull/13395)) by @CreeptoGengar
* forge: avoid repeated selector decoding in `find` command ([#13516](https://github.com/foundry-rs/foundry/pull/13516)) by @anim001k
* chore(forge): `init` reuse `NetworkVariant` ([#14182](https://github.com/foundry-rs/foundry/pull/14182)) by @mablr
* refactor(forge): remove redundant `networks` fields ([#14183](https://github.com/foundry-rs/foundry/pull/14183)) by @mablr
* test: mark clone CLI tests as flaky ([#13472](https://github.com/foundry-rs/foundry/pull/13472)) by @mattsse
* fix: bind `TempDir` guard in clone test to prevent premature cleanup ([#13471](https://github.com/foundry-rs/foundry/pull/13471)) by @mattsse
* fix(tests): update gas report snapshot after gas params sync fix ([#14439](https://github.com/foundry-rs/foundry/pull/14439)) by @zerosnacks
* chore(tests): bump `forge-std` version ([#13482](https://github.com/foundry-rs/foundry/pull/13482), [#14422](https://github.com/foundry-rs/foundry/pull/14422)) by @github-actions

</details>

***

## Cheatcodes, Fuzz & Invariant

### Cheatcode features

* feat(cheatcodes): add `getRecordedLogsJson` cheatcode ([#13093](https://github.com/foundry-rs/foundry/pull/13093)) by @grandizzy

* feat(cheatcodes): support both 4844/7594 formats in `attachBlob` ([#13054](https://github.com/foundry-rs/foundry/pull/13054)) by @mablr

* feat: add `executeTransaction` cheatcode ([#13437](https://github.com/foundry-rs/foundry/pull/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.

  ```solidity
  function executeTransaction(bytes calldata rawTx) external returns (bytes memory);
  ```

* feat(cheatcodes): add Ed25519 crypto cheatcodes ([#13450](https://github.com/foundry-rs/foundry/pull/13450)) by @howydev

  ```solidity
  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](https://github.com/foundry-rs/foundry/pull/13735)) by @alextnetto

<details>
<summary><b>Cheatcode fixes (17 PRs)</b></summary>

* fix(cheatcodes): `vm.mockFunction` to work correctly with `delegatecall` ([#13117](https://github.com/foundry-rs/foundry/pull/13117)) by @quangloc99
* fix(evm): pin fork block number to prevent state inconsistency ([#13085](https://github.com/foundry-rs/foundry/pull/13085)) by @grandizzy
* fix(evm): use timestamp-based blob base fee calculation ([#12959](https://github.com/foundry-rs/foundry/pull/12959)) by @cakevm
* fix: emit `console.log` on fuzz test last run at verbosity >= 2 ([#12478](https://github.com/foundry-rs/foundry/pull/12478)) by @avorylli
* fix(preprocessor): mark `getCode` as view in `VmContractHelper` ([#13089](https://github.com/foundry-rs/foundry/pull/13089)) by @grandizzy
* fix(cheatcodes): fix `vm.expectRevert` for direct precompile calls ([#13460](https://github.com/foundry-rs/foundry/pull/13460)) by @gakonst
* fix(cheatcodes): make `vm.executeTransaction` work in isolation mode ([#13475](https://github.com/foundry-rs/foundry/pull/13475)) by @gakonst
* fix(cheatcodes): preserve nested EVM changes on `executeTransaction` ([#13645](https://github.com/foundry-rs/foundry/pull/13645)) by @figtracer
* fix(cheatcodes): prevent panic in `expectRevert` with empty bytes ([#13769](https://github.com/foundry-rs/foundry/pull/13769)) by @decofe
* fix(cheatcodes): create file in `writeJson`/`writeToml` 3-arg overload ([#13777](https://github.com/foundry-rs/foundry/pull/13777)) by @decofe
* fix(cheatcodes): fix interval notation in memory error ([#14126](https://github.com/foundry-rs/foundry/pull/14126)) by @zeroprooff
* fix(cheatcodes): reject nested debug trace recording ([#14423](https://github.com/foundry-rs/foundry/pull/14423)) by @Perico-perica46
* fix(cheatcodes): read broadcasts with the active network ([#14388](https://github.com/foundry-rs/foundry/pull/14388)) by @solanaXpeter
* fix `vm.rpc` cheatcode ABI encoding for structs ([#13842](https://github.com/foundry-rs/foundry/pull/13842)) by @e1Ru1o
* refactor: use native Solidity types for `vm.rpc` struct decoding ([#14050](https://github.com/foundry-rs/foundry/pull/14050)) by @decofe
* evm: only classify skip reverts from cheatcode address ([#14264](https://github.com/foundry-rs/foundry/pull/14264)) by @ArshLabs
* fix(macros): use correct index for tuple struct fields in `ConsoleFmt` ([#13829](https://github.com/foundry-rs/foundry/pull/13829)) by @dizer-ti

</details>

### Fuzz

Improvements to mutation strategies and coverage-guided fuzzing for native Rust code, plus minor correctness fixes.

<details>
<summary><b>Fuzz changes (4 PRs)</b></summary>

* feat(fuzz): add address mutation variant to select from dictionary ([#13090](https://github.com/foundry-rs/foundry/pull/13090)) by @grandizzy
* feat: SanitizerCoverage support for coverage-guided fuzzing of native Rust code ([#14339](https://github.com/foundry-rs/foundry/pull/14339)) by @decofe
* fix(evm): `<` to `<=` in `validate_uint_mutation` ([#14459](https://github.com/foundry-rs/foundry/pull/14459)) by @cuiweixie
* fix(invariant): remove unused cloned calldata ([#12893](https://github.com/foundry-rs/foundry/pull/12893)) by @subwaycookiecrunch

</details>

### 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.

<details>
<summary><b>Invariant changes (6 PRs)</b></summary>

* feat(invariant): validate counterexamples using settings instead of bytecode ([#13219](https://github.com/foundry-rs/foundry/pull/13219)) by @gakonst
* feat(invariant): add `fail_on_assert` for assertion failures in invariant campaigns ([#14275](https://github.com/foundry-rs/foundry/pull/14275)) by @0xKarl98
* feat: log broken invariant as soon as it is found ([#14433](https://github.com/foundry-rs/foundry/pull/14433)) by @stevencartavia
* fix(invariant): preserve state across calls during replay ([#13084](https://github.com/foundry-rs/foundry/pull/13084)) by @grandizzy
* fix(invariant): preserve delay semantics during shrinking ([#14218](https://github.com/foundry-rs/foundry/pull/14218)) by @0xKarl98
* Addresses scfuzzbench/scfuzzbench#112 ([#14266](https://github.com/foundry-rs/foundry/pull/14266)) by @0xKarl98

</details>

***

## 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`.

<details>
<summary><b>Wallets, signing & account inputs (9 PRs)</b></summary>

* feat(cast): derive accounts from mnemonic ([#12700](https://github.com/foundry-rs/foundry/pull/12700)) by @leovct
* feat(cast): strip `WalletOpts` and `EtherscanOpts` from subcommands that don't expect a signer or need Etherscan API ([#12705](https://github.com/foundry-rs/foundry/pull/12705)) by @tskoyo
* feat(cast): `wallet sign-auth --self-broadcast` ([#12624](https://github.com/foundry-rs/foundry/pull/12624)) by @0xferrous
* feat(cast): accept multiple 7702 authorizations ([#12627](https://github.com/foundry-rs/foundry/pull/12627)) by @0xferrous
* refactor(cast): deduplicate browser wallet receipt handling in `cast send` ([#13747](https://github.com/foundry-rs/foundry/pull/13747)) by @figtracer
* fix(cast): add browser wallet support for `erc20` commands ([#14395](https://github.com/foundry-rs/foundry/pull/14395)) by @figtracer
* fix(cast): remove duplicate `0x` prefix in `sign-auth` output ([#14143](https://github.com/foundry-rs/foundry/pull/14143)) by @zeroprooff
* fix(cast): sponsor hash computation and gas estimation mismatch ([#14202](https://github.com/foundry-rs/foundry/pull/14202)) by @figtracer
* fix(cast): restore `current_dir` in keystore overwrite tests ([#13690](https://github.com/foundry-rs/foundry/pull/13690)) by @mablr

</details>

### 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.

<details>
<summary><b>Transactions, batching & gas (15 PRs)</b></summary>

* feat(cast): add support for raw transaction data with `--data` flag in `send` ([#12712](https://github.com/foundry-rs/foundry/pull/12712)) by @Jds-23
* feat(cast): add `--data` flag to `access-list` command ([#13515](https://github.com/foundry-rs/foundry/pull/13515)) by @VolodymyrBg
* feat(cast): add tx flags to `erc20` command ([#13002](https://github.com/foundry-rs/foundry/pull/13002)) by @mablr
* feat: alias `cast erc20 transfer` to `cast erc20 send` ([#12990](https://github.com/foundry-rs/foundry/pull/12990)) by @onbjerg
* feat(cast): add EIP-7594 support ([#13058](https://github.com/foundry-rs/foundry/pull/13058)) by @mablr
* feat(cast): add `batch-send` and `batch-mktx` commands for native call batching ([#13973](https://github.com/foundry-rs/foundry/pull/13973)) by @stevencartavia
* feat(cast): `--replay-system-txes` / `--sys` arg to `cast run` system txes ([#12853](https://github.com/foundry-rs/foundry/pull/12853)) by @grandizzy
* feat(cast): add `--network` flag to `cast tx` for network-specific raw encoding ([#13745](https://github.com/foundry-rs/foundry/pull/13745)) by @mablr
* feat(cast): `block --raw` network selection ([#13754](https://github.com/foundry-rs/foundry/pull/13754)) by @mablr
* fix(cast): `batch-send` handling by clearing `to`/`value` fields ([#14250](https://github.com/foundry-rs/foundry/pull/14250)) by @mablr
* chore(cast): remove redundant `batch-mktx` clearing ([#14252](https://github.com/foundry-rs/foundry/pull/14252)) by @stevencartavia
* fix(cast): resolve correct hardfork for historical tx execution ([#14207](https://github.com/foundry-rs/foundry/pull/14207)) by @decofe
* fix(cast): correct `max_int` boundary check for `uint255` ([#13568](https://github.com/foundry-rs/foundry/pull/13568)) by @zeroprooff
* fix: accept `0x`-prefixed value inputs ([#14406](https://github.com/foundry-rs/foundry/pull/14406)) by @figtracer
* refactor(cast): cleanup `cast send` ([#14385](https://github.com/foundry-rs/foundry/pull/14385)) by @0xrusowsky

</details>

### 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.

<details>
<summary><b>Tracing, inspection & interface tooling (11 PRs)</b></summary>

* feat(cast): add `--curl` flag to output equivalent curl commands ([#13114](https://github.com/foundry-rs/foundry/pull/13114)) by @gakonst
* feat(cast): add `trace_transaction` and `trace_rawTransaction` ([#12788](https://github.com/foundry-rs/foundry/pull/12788)) by @figtracer
* feat(cast): add `--flatten` flag to `cast interface` ([#13201](https://github.com/foundry-rs/foundry/pull/13201)) by @mattsse
* feat(cast): cache Etherscan sources under Foundry cache with temp fallback ([#12025](https://github.com/foundry-rs/foundry/pull/12025)) by @sashass1315
* feat: support `cast logs` query chunking ([#12692](https://github.com/foundry-rs/foundry/pull/12692)) by @stevencartavia
* feat(cast): `decode-tx` generic over `Network` ([#14199](https://github.com/foundry-rs/foundry/pull/14199)) by @mablr
* fix(cast): improve error message for invalid hex calldata ([#13180](https://github.com/foundry-rs/foundry/pull/13180)) by @gakonst
* fix(cast): clean up temp dir in `cast storage` when Etherscan cache is unavailable ([#13418](https://github.com/foundry-rs/foundry/pull/13418)) by @thunggis
* fix(cast): remove redundant `chain()` call in `explorer_client` ([#13272](https://github.com/foundry-rs/foundry/pull/13272)) by @tefyosL-sol
* fix(cast): `--json` support for `erc20` cmds ([#12727](https://github.com/foundry-rs/foundry/pull/12727)) by @0xferrous
* add missing JSON output support for `erc20 decimals` ([#13438](https://github.com/foundry-rs/foundry/pull/13438)) by @DanielGuupta

</details>

### Reliability & RPC plumbing

Smaller robustness fixes for sender enumeration, threads handling, plasma verifier errors, and flaky-test cleanup.

<details>
<summary><b>Reliability & RPC plumbing (4 PRs)</b></summary>

* fix(cast): handle errors in `list_local_senders()` ([#12419](https://github.com/foundry-rs/foundry/pull/12419)) by @Ragnar
* fix(cast): treat `threads=0` as logical cores ([#12799](https://github.com/foundry-rs/foundry/pull/12799)) by @ANtutov
* fix: add plasma verifier err msg ([#12790](https://github.com/foundry-rs/foundry/pull/12790)) by @grandizzy
* test(cast): mark flaky `revert_reason_from` and wildcard RPC-dependent tail ([#13796](https://github.com/foundry-rs/foundry/pull/13796)) by @decofe

</details>

<details>
<summary><b>Generic-<code>Network</code> refactors (11 PRs)</b></summary>

* feat(cast): generic `CastTxBuilder` ([#13533](https://github.com/foundry-rs/foundry/pull/13533)) by @mablr
* feat(cast): `send`+`erc20` generic `Network` support ([#13587](https://github.com/foundry-rs/foundry/pull/13587)) by @mablr
* feat(cast): `Cast` generic `Network` support ([#13624](https://github.com/foundry-rs/foundry/pull/13624)) by @mablr
* feat(cast): `estimate` generic network ([#13622](https://github.com/foundry-rs/foundry/pull/13622)) by @mablr
* feat(cast): `call` generic `Network` support ([#13634](https://github.com/foundry-rs/foundry/pull/13634)) by @mablr
* feat(cast): `access-list` generic `Network` support ([#13635](https://github.com/foundry-rs/foundry/pull/13635)) by @mablr
* feat(cast): `da-estimate` generic `Network` ([#14194](https://github.com/foundry-rs/foundry/pull/14194)) by @mablr
* refactor(cast): generic `cast call` ([#14157](https://github.com/foundry-rs/foundry/pull/14157)) by @figtracer
* refactor(cast): generic `cast run` ([#14121](https://github.com/foundry-rs/foundry/pull/14121)) by @figtracer
* refactor(cast): direct `block_env` access -> trait methods ([#14119](https://github.com/foundry-rs/foundry/pull/14119)) by @figtracer
* chore(cast): granular bounds on `Cast` ([#13776](https://github.com/foundry-rs/foundry/pull/13776)) by @mablr

</details>

***

## 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.

<details>
<summary><b>Anvil features (14 PRs)</b></summary>

* feat(anvil): add `eth_fillTransaction` support ([#12595](https://github.com/foundry-rs/foundry/pull/12595)) by @mablr
* feat(anvil): extend Content-Type support on Beacon API ([#12611](https://github.com/foundry-rs/foundry/pull/12611)) by @mablr
* feat(anvil): add `trace_replayBlockTransactions` endpoint for block txs tracing ([#13098](https://github.com/foundry-rs/foundry/pull/13098)) by @mablr
* feat(anvil): cache block timestamp in mined receipts ([#13311](https://github.com/foundry-rs/foundry/pull/13311)) by @thunggis
* add EIP-3860 initcode size check in txpool validation ([#13473](https://github.com/foundry-rs/foundry/pull/13473)) by @DanielGuupta
* Add `--enable-tx-gas-limit` CLI flag for EIP-7825 support ([#13307](https://github.com/foundry-rs/foundry/pull/13307)) by @DanielGuupta
* add `--max-transactions` CLI flag ([#13495](https://github.com/foundry-rs/foundry/pull/13495)) by @DanielGuupta
* remove unimplemented `anvil_enableTraces` endpoint ([#13499](https://github.com/foundry-rs/foundry/pull/13499)) by @DanielGuupta
* notify subscribers for txs promoted after block mining ([#13464](https://github.com/foundry-rs/foundry/pull/13464)) by @DanielGuupta
* feat(anvil): add EIP-2935 blockhash history storage support ([#13588](https://github.com/foundry-rs/foundry/pull/13588)) by @koko1123
* feat(anvil): add `eth_getStorageValues` RPC method ([#13971](https://github.com/foundry-rs/foundry/pull/13971)) by @stevencartavia
* feat(anvil): populate `Metadata` `client_semver` ([#14229](https://github.com/foundry-rs/foundry/pull/14229)) by @ndavd
* feat(anvil): support multiple fork URLs with round-robin load balancing ([#14280](https://github.com/foundry-rs/foundry/pull/14280)) by @decofe
* feat(anvil): add `debug_traceBlockByHash` and `debug_traceBlockByNumber` ([#14391](https://github.com/foundry-rs/foundry/pull/14391)) by @exp0nge

</details>

<details>
<summary><b>Anvil fixes (46 PRs)</b></summary>

* fix(anvil): insufficient allowance → insufficient balance ([#12855](https://github.com/foundry-rs/foundry/pull/12855)) by @anim001k
* fix(anvil): propagate gas estimation errors ([#12813](https://github.com/foundry-rs/foundry/pull/12813)) by @jxom
* fix(anvil): resolve incorrect historical states dump behavior ([#12732](https://github.com/foundry-rs/foundry/pull/12732)) by @w1tcher
* fix(anvil): use `B256` instead of `TxHash` for block hash parameters ([#12961](https://github.com/foundry-rs/foundry/pull/12961)) by @pivasdesant
* fix(anvil): use suggested priority fee by default ([#13092](https://github.com/foundry-rs/foundry/pull/13092)) by @tefyosL-sol
* fix(anvil): clear stale block hashes from db cache during reorg ([#13179](https://github.com/foundry-rs/foundry/pull/13179)) by @gakonst
* fix(anvil): update `genesis_hash` when loading state with block 0 ([#13197](https://github.com/foundry-rs/foundry/pull/13197)) by @mattsse
* fix(anvil): set `contractAddress` in receipt for reverted contract creation ([#13195](https://github.com/foundry-rs/foundry/pull/13195)) by @mattsse
* fix(anvil): preserve withdrawals in `SerializableBlock` for state dump/load ([#13227](https://github.com/foundry-rs/foundry/pull/13227)) by @echowandere
* fix(anvil): use consistent `chain_id` fallback for blob params ([#13241](https://github.com/foundry-rs/foundry/pull/13241)) by @echowandere
* fix(anvil): return error instead of empty vec for out-of-range log queries ([#13251](https://github.com/foundry-rs/foundry/pull/13251)) by @echowandere
* fix(anvil): return error when querying future block number in `with_database_at` ([#13267](https://github.com/foundry-rs/foundry/pull/13267)) by @thunggis
* fix(anvil): use consistent `chain_id` fallback in fork setup ([#13276](https://github.com/foundry-rs/foundry/pull/13276)) by @tefyosL-sol
* fix(anvil): handle disk cache write failures in state eviction ([#13332](https://github.com/foundry-rs/foundry/pull/13332)) by @thunggis
* return error instead of empty array when filter not found ([#13415](https://github.com/foundry-rs/foundry/pull/13415)) by @DanielGuupta
* fix(anvil): variable shadowing bug in `ReadyTransactions::remove_with_markers` ([#13436](https://github.com/foundry-rs/foundry/pull/13436)) by @letmehateu
* prevent balance overflow in `anvil_addBalance` ([#13457](https://github.com/foundry-rs/foundry/pull/13457)) by @DanielGuupta
* fix(anvil): correct `blob_gas_used_ratio` calculation in fee history ([#13491](https://github.com/foundry-rs/foundry/pull/13491)) by @letmehateu
* fix(anvil): prevent panic in `utc_from_secs` for out-of-range timestamps ([#13520](https://github.com/foundry-rs/foundry/pull/13520)) by @stevencartavia
* fix(anvil): preserve original error in `update_url` ([#13531](https://github.com/foundry-rs/foundry/pull/13531)) by @gutonosa
* fix(anvil): use EIP-2718 encoding for OP `enveloped_tx` ([#13537](https://github.com/foundry-rs/foundry/pull/13537)) by @gutonosa
* fix(anvil): clear tx pool on `anvil_reset` ([#13544](https://github.com/foundry-rs/foundry/pull/13544)) by @FredPhilipy
* fix: clarify Anvil storage caching builder naming ([#13546](https://github.com/foundry-rs/foundry/pull/13546)) by @anim001k
* fix(anvil): use individual tx gas instead of cumulative in fee history ([#13552](https://github.com/foundry-rs/foundry/pull/13552)) by @zeroprooff
* fix(test): add missing `rpc_before` assertion in deep reorg blockhash test ([#13586](https://github.com/foundry-rs/foundry/pull/13586)) by @FredPhilipy
* chore(test): harden anvil API assertions ([#13615](https://github.com/foundry-rs/foundry/pull/13615)) by @MarkFizz77
* fix(anvil): validate blob count against per-tx limit, not per-block ([#13626](https://github.com/foundry-rs/foundry/pull/13626)) by @gutonosa
* fix(script): add missing `#[serde(default)]` for backward compat in `TransactionWithMetadata` ([#13684](https://github.com/foundry-rs/foundry/pull/13684)) by @gutonosa
* fix(anvil): initialize fork blob params even with explicit base fee ([#13717](https://github.com/foundry-rs/foundry/pull/13717)) by @edgarr1986
* fix(anvil): swap param order in `get_next_block_blob_excess_gas` to match callers ([#13740](https://github.com/foundry-rs/foundry/pull/13740)) by @gutonosa
* fix(anvil): flaky `test_trace_filter()` ([#13764](https://github.com/foundry-rs/foundry/pull/13764)) by @figtracer
* fix(anvil): reject invalid `versioned_hashes` in beacon blobs endpoint ([#13787](https://github.com/foundry-rs/foundry/pull/13787)) by @FredPhilipy
* fix(anvil): downgrade transaction validation failure logs from warn to debug ([#13911](https://github.com/foundry-rs/foundry/pull/13911)) by @FredPhilipy
* fix(anvil): downgrade "Already imported" log from warn to debug ([#13970](https://github.com/foundry-rs/foundry/pull/13970)) by @FredPhilipy
* fix(anvil): skip missing transactions in `mined_parity_trace_block` ([#13977](https://github.com/foundry-rs/foundry/pull/13977)) by @FredPhilipy
* fix(anvil): clean up `InMemoryBlockStates` on rollback ([#13978](https://github.com/foundry-rs/foundry/pull/13978)) by @FredPhilipy
* fix(anvil): handle `BlockTransactions::Uncle` without panic ([#14135](https://github.com/foundry-rs/foundry/pull/14135)) by @strmfos
* fix(anvil): use `<=` for pending pool replacement underprice check ([#14254](https://github.com/foundry-rs/foundry/pull/14254)) by @cuiweixie
* fix(anvil): auto-detect seconds vs milliseconds in `evm_setTime` ([#14292](https://github.com/foundry-rs/foundry/pull/14292)) by @decofe
* fix(anvil): return error for `eth_getLogs` with unknown blockHash instead of empty ([#14371](https://github.com/foundry-rs/foundry/pull/14371)) by @spalladino
* fix(anvil): refetch full fork blocks with missing tx cache ([#14384](https://github.com/foundry-rs/foundry/pull/14384)) by @solanaXpeter
* fix(anvil-server): distinguish empty and notification batches ([#14405](https://github.com/foundry-rs/foundry/pull/14405)) by @solanaXpeter
* fix(anvil): separate queued txs in txpool RPC responses ([#14425](https://github.com/foundry-rs/foundry/pull/14425)) by @mk0walsk
* fix(anvil): fix flaky `test_increase_time_by_zero` test ([#14430](https://github.com/foundry-rs/foundry/pull/14430)) by @figtracer

</details>

<details>
<summary><b>Anvil cleanup / refactors (23 PRs)</b></summary>

* chore(anvil): clean-up `impersonated_signature` logic ([#13187](https://github.com/foundry-rs/foundry/pull/13187)) by @mablr
* chore(anvil): clean up remaining dead code after Odyssey sunset ([#13211](https://github.com/foundry-rs/foundry/pull/13211)) by @mablr
* chore(anvil): deprecate `getBlobSidecars` Beacon API endpoint ([#12568](https://github.com/foundry-rs/foundry/pull/12568)) by @mablr
* chore(anvil): remove `anvil_getBlobSidecarsByBlockId` endpoint ([#13022](https://github.com/foundry-rs/foundry/pull/13022)) by @mablr
* chore(anvil): remove unnecessary clone operations ([#13330](https://github.com/foundry-rs/foundry/pull/13330)) by @MarkFizz77
* chore(anvil,cast): remove unnecessary `populate_blob_hashes()` ([#13308](https://github.com/foundry-rs/foundry/pull/13308)) by @mablr
* refactor(anvil): using `is_ok` since it's more robust ([#13377](https://github.com/foundry-rs/foundry/pull/13377)) by @cuiweixie
* chore(anvil): clean-up impersonated tx building ([#13637](https://github.com/foundry-rs/foundry/pull/13637)) by @mablr
* chore(anvil): remove unused `alloy-eip5792` dev-dependency ([#13640](https://github.com/foundry-rs/foundry/pull/13640)) by @strmfos
* refactor(anvil): remove redundant tx lookup in `transaction_by_sender_and_nonce` ([#13638](https://github.com/foundry-rs/foundry/pull/13638)) by @Aboudjem
* chore(anvil): simplify `evm` tests by removing useless `Env` wrapper ([#13750](https://github.com/foundry-rs/foundry/pull/13750)) by @mablr
* refactor(anvil): extract `transaction_at_block_index` in fork ([#14271](https://github.com/foundry-rs/foundry/pull/14271)) by @stevencartavia
* refactor(anvil): extract `build_block_info` helper ([#14251](https://github.com/foundry-rs/foundry/pull/14251)) by @stevencartavia
* refactor(anvil): consolidate duplicate `BlockEnv` construction ([#13729](https://github.com/foundry-rs/foundry/pull/13729)) by @figtracer
* refactor(anvil): deduplicate executor pipeline via inline `run!` macro ([#14168](https://github.com/foundry-rs/foundry/pull/14168)) by @stevencartavia
* refactor(anvil): extract `unpack_execution_result` helper ([#14181](https://github.com/foundry-rs/foundry/pull/14181)) by @stevencartavia
* refactor(anvil): extract `inject_precompiles` ([#13956](https://github.com/foundry-rs/foundry/pull/13956)) by @figtracer
* refactor(anvil): extract `build_mining_inspector` ([#13961](https://github.com/foundry-rs/foundry/pull/13961)) by @figtracer
* refactor(anvil): extract `block_env_from_header` utility ([#13838](https://github.com/foundry-rs/foundry/pull/13838)) by @figtracer
* refactor(anvil): extract `execute_pool_transactions` ([#13940](https://github.com/foundry-rs/foundry/pull/13940)) by @figtracer
* refactor(anvil): extract `rehash` helper for transaction hash replacement ([#14151](https://github.com/foundry-rs/foundry/pull/14151)) by @stevencartavia
* refactor(anvil): encapsulate per-tx inspector lifecycle in `finish_transaction` ([#13932](https://github.com/foundry-rs/foundry/pull/13932)) by @figtracer
* refactor(anvil): remove duplicated `FeeDetails` match arm ([#14130](https://github.com/foundry-rs/foundry/pull/14130)) by @stevencartavia

</details>

***

## Chisel

Stability fixes for invalid pc/memory access and uninitialized variable handling. Realtime `console.log` is shared with `forge` ([#13321](https://github.com/foundry-rs/foundry/pull/13321)) — see the Forge section.

<details>
<summary><b>Chisel changes (2 PRs)</b></summary>

* fix(chisel): don't panic on bad pc/memory ([#12674](https://github.com/foundry-rs/foundry/pull/12674)) by @DaniPopes
* fix(chisel): uninitialized variables ([#12937](https://github.com/foundry-rs/foundry/pull/12937)) by @DaniPopes

</details>

***

## 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.

<details>
<summary><b>Forge Lint features (8 PRs)</b></summary>

* feat(`forge-lint`): add custom errors rule ([#13126](https://github.com/foundry-rs/foundry/pull/13126)) by @milosdjurica
* feat(lint): reduce default verbosity ([#12901](https://github.com/foundry-rs/foundry/pull/12901)) by @DaniPopes
* feat(lint): add common uppercase abbreviations to mixedCase exceptions ([#13305](https://github.com/foundry-rs/foundry/pull/13305)) by @Himess
* feat(lint): refactor `LinterConfig` and add 3 new linting rules ([#12581](https://github.com/foundry-rs/foundry/pull/12581)) by @milosdjurica
* feat(lint): add missing visit methods to `EarlyLintVisitor` ([#13454](https://github.com/foundry-rs/foundry/pull/13454)) by @hawkadrian
* feat(lint): add incorrect ERC721 interface lint ([#14412](https://github.com/foundry-rs/foundry/pull/14412)) by @figtracer
* feat(lint): add incorrect ERC20 interface lint ([#14428](https://github.com/foundry-rs/foundry/pull/14428)) by @figtracer
* feat(lint): add `block-timestamp` lint ([#14431](https://github.com/foundry-rs/foundry/pull/14431)) by @stevencartavia

</details>

### Fixes

Exit-code semantics for compilation warnings, unreachable macro cleanup, and missing late-visitor methods.

<details>
<summary><b>Forge Lint fixes (3 PRs)</b></summary>

* fix(`forge-lint`): ignore compilation warnings in exit code ([#13138](https://github.com/foundry-rs/foundry/pull/13138)) by @0xrusowsky
* fix(lint): remove unreachable macro arm in `declare_forge_lint` ([#13452](https://github.com/foundry-rs/foundry/pull/13452)) by @aso20455
* fix(lint): add missing visit methods to `LateLintVisitor` ([#14276](https://github.com/foundry-rs/foundry/pull/14276)) by @solanaXpeter

</details>

***

## Forge Fmt

### Features

A new `namespace_import_style` config and generic pretty-printing across blocks, transactions, receipts, OP envelopes, and Tempo receipts.

<details>
<summary><b>Forge Fmt features (5 PRs)</b></summary>

* feat(fmt): add `namespace_import_style` config ([#13108](https://github.com/foundry-rs/foundry/pull/13108)) by @quangloc99
* feat(fmt): pretty printing for generic block/transaction responses ([#13497](https://github.com/foundry-rs/foundry/pull/13497)) by @mablr
* feat(common): generic `TransactionReceiptWithRevertReason` + pretty printing ([#13503](https://github.com/foundry-rs/foundry/pull/13503)) by @mablr
* feat(common): add pretty-printing for `TempoTransactionReceipt` ([#13594](https://github.com/foundry-rs/foundry/pull/13594)) by @mablr
* feat(fmt): `OpTxEnvelope`/`Transaction` pretty printing ([#13734](https://github.com/foundry-rs/foundry/pull/13734)) by @mablr

</details>

### 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.

<details>
<summary><b>Forge Fmt fixes (9 PRs)</b></summary>

* fix(`forge fmt`): fix incorrect indentation for chained struct calls ([#13163](https://github.com/foundry-rs/foundry/pull/13163)) by @gakonst
* fix(fmt): keep struct field access on same line after named args call ([#13166](https://github.com/foundry-rs/foundry/pull/13166)) by @gakonst
* fix(fmt): correct indentation for closing brace in empty contracts with comments ([#13319](https://github.com/foundry-rs/foundry/pull/13319)) by @Himess
* fix(fmt): don't inline `while`/`for`/`if` blocks with multiple statements ([#13566](https://github.com/foundry-rs/foundry/pull/13566)) by @MarkFizz77
* fix(fmt): correct `total_difficulty` attribute name ([#13578](https://github.com/foundry-rs/foundry/pull/13578)) by @eeemmmmmm
* fix(fmt): swap `valid_before`/`valid_after` in `TempoTransaction` pretty print ([#13910](https://github.com/foundry-rs/foundry/pull/13910)) by @dizer-ti
* fix(fmt): prefer header `total_difficulty` for `totalDifficulty` ([#13919](https://github.com/foundry-rs/foundry/pull/13919)) by @edgarr1986
* refactor(fmt): add tempo pretty printing + cleanup/dedup ([#13631](https://github.com/foundry-rs/foundry/pull/13631)) by @mablr
* refactor(fmt): extract `pretty_receipt` helper ([#14191](https://github.com/foundry-rs/foundry/pull/14191)) by @figtracer

</details>

## Verification

### Features

Auto-recompile on `forge verify-bytecode`, custom verifier URLs for unknown Etherscan chains, and clearer Etherscan-key error messages.

<details>
<summary><b>Verify features (3 PRs)</b></summary>

* feat: `forge verify-bytecode` automatically recompiles upon running ([#12651](https://github.com/foundry-rs/foundry/pull/12651)) by @Jds-23
* Allow `verifier-url` for unknown Etherscan chains ([#13079](https://github.com/foundry-rs/foundry/pull/13079)) by @mayanksharma-eth
* feat(verify): clearer error when `ETHERSCAN_API_KEY` selects Etherscan ([#14383](https://github.com/foundry-rs/foundry/pull/14383)) by @o-az

</details>

<details>
<summary><b>Verify fixes (13 PRs)</b></summary>

* fix(verify): handle lack of trailing slash in verifier url ([#12806](https://github.com/foundry-rs/foundry/pull/12806)) by @onbjerg
* fix(verify): improve error message for CREATE2 deployment failures in `verify-bytecode` ([#13176](https://github.com/foundry-rs/foundry/pull/13176)) by @grandizzy
* fix(verify): improve error message for unsupported chain in Etherscan verifier ([#12685](https://github.com/foundry-rs/foundry/pull/12685)) by @DeVikingMark
* fix(verify): mismatch between `strip_prefix` and `strip_suffix` ([#12563](https://github.com/foundry-rs/foundry/pull/12563)) by @Bashmunta
* fix(verify): support chains with custom Sourcify-compatible APIs ([#13175](https://github.com/foundry-rs/foundry/pull/13175)) by @mattsse
* fix(verify): respect user-configured Etherscan URL over chain defaults ([#13275](https://github.com/foundry-rs/foundry/pull/13275)) by @tefyosL-sol
* fix(verify): correct Sourcify API URL construction for custom chains ([#13360](https://github.com/foundry-rs/foundry/pull/13360)) by @marukai67
* fix(verify): remove unused functions from `VerificationContext` ([#13481](https://github.com/foundry-rs/foundry/pull/13481)) by @Forostovec
* fix(script): actually skip Vyper contract verification ([#13484](https://github.com/foundry-rs/foundry/pull/13484)) by @eeemmmmmm
* fix / refactor(verify): dedupe standard JSON input logic + avoid unnecessary work for Vyper branch ([#13549](https://github.com/foundry-rs/foundry/pull/13549)) by @eeemmmmmm
* refactor(verify): dedupe Vyper standard JSON input logic ([#13743](https://github.com/foundry-rs/foundry/pull/13743)) by @eeemmmmmm
* fix(config): respect user-configured Etherscan URL over chain defaults ([#13239](https://github.com/foundry-rs/foundry/pull/13239)) by @zerosnacks
* fix(config): respect custom Etherscan URL in cast/forge commands ([#14319](https://github.com/foundry-rs/foundry/pull/14319)) by @FredPhilipy

</details>

***

## 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.

<details>
<summary><b>Coverage changes (3 PRs)</b></summary>

* fix(coverage): write coverage file even when tests fail ([#12717](https://github.com/foundry-rs/foundry/pull/12717)) by @0xferrous
* fix(coverage): correct BRDA hit values for LCOV consistency ([#13151](https://github.com/foundry-rs/foundry/pull/13151)) by @gakonst
* docs(coverage): link to stack-too-deep guide in warnings ([#13240](https://github.com/foundry-rs/foundry/pull/13240)) by @gakonst

</details>

***

## Traces & Debugger

### Features

A new `-d` / `--depth` trace flag (analogous to `tree`) and the debugger now shows actual gas usage alongside refunds.

<details>
<summary><b>Traces & Debugger features (2 PRs)</b></summary>

* feat(traces): add `-d` / `--depth` flag for verbose traces, like `tree` ([#12643](https://github.com/foundry-rs/foundry/pull/12643)) by @tskoyo
* feat(debugger): display actual gas usage alongside refund counter ([#13271](https://github.com/foundry-rs/foundry/pull/13271)) by @Philogy

</details>

### Fixes

Decoder cache hygiene, verbosity unification, safer Sourcify parsing, panic guards on invalid source spans, and improved `expectRevert` formatting.

<details>
<summary><b>Traces & Debugger fixes (7 PRs)</b></summary>

* fix(traces): check HTTP status before JSON parsing in Sourcify fetcher ([#13446](https://github.com/foundry-rs/foundry/pull/13446)) by @marukai67
* fix(traces): filter empty string labels ([#13601](https://github.com/foundry-rs/foundry/pull/13601)) by @onbjerg
* fix(traces): clear `non_fallback_contracts` in decoder reset ([#13671](https://github.com/foundry-rs/foundry/pull/13671)) by @gutonosa
* fix(traces): fix verbosity trace mode and unify verbosity handling ([#13859](https://github.com/foundry-rs/foundry/pull/13859)) by @decofe
* fix(traces): decode `expectRevert` payload before revert formatting ([#13981](https://github.com/foundry-rs/foundry/pull/13981)) by @ArshLabs
* fix(traces): don't persist unknown signatures to disk cache ([#14172](https://github.com/foundry-rs/foundry/pull/14172)) by @skyc1e
* fix(traces): avoid panic on invalid internal source spans ([#14273](https://github.com/foundry-rs/foundry/pull/14273)) by @mk0walsk

</details>

***

## Wallets

### Features

Browser-wallet flows extended to `forge script` / `forge create`, generic `Network` `MultiWallet`, new `BrowserWalletOpts`, and a `--browser` priority-fee patch.

<details>
<summary><b>Wallet features (6 PRs)</b></summary>

* feat(forge): add browser wallet support for `forge script` ([#12952](https://github.com/foundry-rs/foundry/pull/12952)) by @mablr
* feat(primitives): introduce `NetworkWallet<FoundryNetwork>` impl for `EthereumWallet` ([#13248](https://github.com/foundry-rs/foundry/pull/13248)) by @mablr
* feat(wallets): introduce `BrowserWalletOpts` ([#13602](https://github.com/foundry-rs/foundry/pull/13602)) by @mablr
* feat(wallets): `MultiWallet` generic `Network` ([#13648](https://github.com/foundry-rs/foundry/pull/13648)) by @mablr
* feat: patch `--browser` priority fee ([#13700](https://github.com/foundry-rs/foundry/pull/13700)) by @sakulstra
* feat(forge): browser wallet support for `create` subcommand ([#14394](https://github.com/foundry-rs/foundry/pull/14394)) by @mablr

</details>

<details>
<summary><b>Wallets fixes & refactors (15 PRs)</b></summary>

* fix(primitives): track both 4844/7594 sidecars presence in `FoundryTransactionRequest::build_typed_tx` ([#13218](https://github.com/foundry-rs/foundry/pull/13218)) by @mablr
* chore(wallets): remove `NetworkWallet<FoundryNetwork>` impl for `WalletSigner` ([#13343](https://github.com/foundry-rs/foundry/pull/13343)) by @mablr
* fix(wallets): use `turnkey_unsupported()` instead of hardcoded error ([#13535](https://github.com/foundry-rs/foundry/pull/13535)) by @zeroprooff
* refactor(wallets): browser wallet generic `Network` ([#13550](https://github.com/foundry-rs/foundry/pull/13550)) by @mablr
* refactor(wallets): extract `Browser` from `WalletSigner` ([#13613](https://github.com/foundry-rs/foundry/pull/13613)) by @mablr
* refactor(script): extract `BrowserSigner` from `MultiWallet` ([#13839](https://github.com/foundry-rs/foundry/pull/13839)) by @mablr
* fix(wallets): browser wallet CLI help heading formatting ([#13876](https://github.com/foundry-rs/foundry/pull/13876)) by @mablr
* fix(deps): bump to Foundry browser wallet version 0.2.0 ([#13890](https://github.com/foundry-rs/foundry/pull/13890)) by @zerosnacks
* chore(wallets): move `wallets` crate to `foundry-core` ([#14348](https://github.com/foundry-rs/foundry/pull/14348)) by @mablr
* chore: bump `foundry-wallets` dep ([#14409](https://github.com/foundry-rs/foundry/pull/14409)) by @mablr
* chore: pin to `foundry-wallets` release ([#14429](https://github.com/foundry-rs/foundry/pull/14429)) by @zerosnacks
* fix(wallets): add gas limit margin to handle WebAuthn/P256 signing ([#14416](https://github.com/foundry-rs/foundry/pull/14416)) by @mablr
* fix(common): enable `foundry-wallets` browser/tempo features ([#14421](https://github.com/foundry-rs/foundry/pull/14421)) by @mablr
* refactor(common): make `ProviderBuilder` generic over `Network` ([#13250](https://github.com/foundry-rs/foundry/pull/13250)) by @mablr
* feat(common): introduce generic `ProviderBuilder::from_config` method ([#13268](https://github.com/foundry-rs/foundry/pull/13268)) by @mablr

</details>

***

## 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.

<details>
<summary><b>Script & Broadcast features (10 PRs)</b></summary>

* feat(script): generic `estimate_gas` + `FoundryTransactionBuilder::reset_gas_limit` method ([#13706](https://github.com/foundry-rs/foundry/pull/13706)) by @mablr
* feat(script): generic `TxStatus` receipt type ([#13770](https://github.com/foundry-rs/foundry/pull/13770)) by @mablr
* feat(script): generic `TransactionWithMetadata` + generic pretty printing for `TransactionMaybeSigned` ([#13795](https://github.com/foundry-rs/foundry/pull/13795)) by @mablr
* feat(script): `Network`-generic `ScriptSequence<N>` ([#13803](https://github.com/foundry-rs/foundry/pull/13803)) by @mablr
* feat(script): `Network`-generic `ScriptSequenceKind<N>` ([#13809](https://github.com/foundry-rs/foundry/pull/13809)) by @mablr
* feat(script): generic `BundledState` impl ([#13825](https://github.com/foundry-rs/foundry/pull/13825)) by @mablr
* feat(script): generic `ScriptTransactionBuilder` ([#13830](https://github.com/foundry-rs/foundry/pull/13830)) by @mablr
* feat(script): `ScriptResult`, `ProvidersManager` and state structs `Network`-generic ([#14104](https://github.com/foundry-rs/foundry/pull/14104)) by @mablr
* feat(script): `ScriptConfig` generic `Network`, `FoundryEvmFactory` ([#14115](https://github.com/foundry-rs/foundry/pull/14115)) by @mablr
* feat(script): `forge script` generic over `FoundryEvmNetwork` ([#14125](https://github.com/foundry-rs/foundry/pull/14125)) by @mablr

</details>

### Fixes

Sender resolution improvements (`--turnkey` msg.sender, single-keystore auto-set) and preservation of exit reason on failed revert decoding.

<details>
<summary><b>Script & Broadcast fixes (3 PRs)</b></summary>

* fix(script): set `msg.sender` from `TURNKEY_ADDRESS` when using `--turnkey` ([#13149](https://github.com/foundry-rs/foundry/pull/13149)) by @gakonst
* fix(script): auto-set sender from single keystore ([#13525](https://github.com/foundry-rs/foundry/pull/13525)) by @MarkFizz77
* fix(script): preserve exit reason in failed revert decode ([#13985](https://github.com/foundry-rs/foundry/pull/13985)) by @ArshLabs

</details>

<details>
<summary><b>Script cleanup / refactors (10 PRs)</b></summary>

* refactor(script-sequence): extract duplicated filter logic ([#13500](https://github.com/foundry-rs/foundry/pull/13500)) by @aso20455
* chore(broadcast): cleanup avg gas price calculation ([#13509](https://github.com/foundry-rs/foundry/pull/13509)) by @mablr
* refactor: use `fs::write_pretty_json_file` in `MultiChainSequence::save` ([#13510](https://github.com/foundry-rs/foundry/pull/13510)) by @prestoalvarez
* chore: use `fs::write_pretty_json_file` in `ScriptSequence::save` ([#13562](https://github.com/foundry-rs/foundry/pull/13562)) by @MarkFizz77
* chore(script): remove `EitherSigner` abstraction ([#13649](https://github.com/foundry-rs/foundry/pull/13649)) by @mablr
* chore(script): use rpc trait methods instead of direct field accesses ([#13693](https://github.com/foundry-rs/foundry/pull/13693)) by @mablr
* chore(script): eliminate remaining `get_http_provider` / `try_get_http_provider` usage ([#13702](https://github.com/foundry-rs/foundry/pull/13702)) by @figtracer
* chore(script): idiomatic `BroadcastReader::into_tx_receipts` ([#13771](https://github.com/foundry-rs/foundry/pull/13771)) by @mablr
* refactor(script-sequence): rename misleading `opcode` field to `call_kind` ([#13907](https://github.com/foundry-rs/foundry/pull/13907)) by @anim001k
* refactor(script): streamline `EvmOpts` resolution ([#14217](https://github.com/foundry-rs/foundry/pull/14217)) by @mablr
* chore(script): eliminate `AnyNetwork` misuse ([#13686](https://github.com/foundry-rs/foundry/pull/13686)) by @mablr

</details>

***

## 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.

<details>
<summary><b>Config features (4 PRs)</b></summary>

* chore(config): `curl` mode as config key ([#13260](https://github.com/foundry-rs/foundry/pull/13260)) by @mablr
* feat: add `ignored_error_codes_from` config option ([#13841](https://github.com/foundry-rs/foundry/pull/13841)) by @ndavd
* feat(config): support network-specific `hardfork` in `foundry.toml` ([#14312](https://github.com/foundry-rs/foundry/pull/14312)) by @0xrusowsky
* feat(config): `network` key in `foundry.toml` ([#14337](https://github.com/foundry-rs/foundry/pull/14337)) by @mablr

</details>

<details>
<summary><b>Config fixes (14 PRs)</b></summary>

* fix(config): error on unknown profile with fallback for nested libs ([#13153](https://github.com/foundry-rs/foundry/pull/13153)) by @gakonst
* fix(config): preserve hyphenated profile names ([#13172](https://github.com/foundry-rs/foundry/pull/13172)) by @gakonst
* fix(config): print error when accessing invalid Etherscan config ([#9951](https://github.com/foundry-rs/foundry/pull/9951)) by @andelf
* fix(config): reject bare versions in compilation restrictions ([#12955](https://github.com/foundry-rs/foundry/pull/12955)) by @tefyosL-sol
* fix(config): warn on unknown keys in all config sections ([#13154](https://github.com/foundry-rs/foundry/pull/13154)) by @grandizzy
* fix(config): handle decimal string in U256 deserialization ([#13284](https://github.com/foundry-rs/foundry/pull/13284)) by @thunggis
* fix(config): handle vyper section with `skip_serializing_if` fields ([#13318](https://github.com/foundry-rs/foundry/pull/13318)) by @gakonst
* fix: broken config test, currently blocking CI ([#13340](https://github.com/foundry-rs/foundry/pull/13340)) by @zerosnacks
* fix: avoid setting `FOUNDRY_PROFILE: ci` in template workflows, profile does not exist ([#13339](https://github.com/foundry-rs/foundry/pull/13339)) by @zerosnacks
* chore(config): remove unused enum accessor methods ([#13414](https://github.com/foundry-rs/foundry/pull/13414)) by @MozirDmitriy
* fix(config): normalize `deny_warnings` from env vars ([#13434](https://github.com/foundry-rs/foundry/pull/13434)) by @aso20455
* add missing doc section keys to config validation ([#13447](https://github.com/foundry-rs/foundry/pull/13447)) by @DanielGuupta
* fix(config): add symmetric serialization for `FuzzDictionaryConfig` usize fields ([#13723](https://github.com/foundry-rs/foundry/pull/13723)) by @gutonosa
* fix(config): validate `optimizer_runs` does not exceed `u32::MAX` ([#14354](https://github.com/foundry-rs/foundry/pull/14354)) by @FredPhilipy
* fix(config): surface cleanup failures as warnings instead of hard errors ([#14379](https://github.com/foundry-rs/foundry/pull/14379)) by @decofe

</details>

***

## 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.

<details>
<summary><b>CLI changes (11 PRs)</b></summary>

* fix(cli): redirect tracing logs to stderr ([#13167](https://github.com/foundry-rs/foundry/pull/13167)) by @MarkFizz77
* feat(cli): cli markdown docs ([#13291](https://github.com/foundry-rs/foundry/pull/13291)) by @onbjerg
* fix: use shared `display_chain` helper in CLI error handler ([#13314](https://github.com/foundry-rs/foundry/pull/13314)) by @prestoalvarez
* fix: correct dead condition in command error formatting ([#13427](https://github.com/foundry-rs/foundry/pull/13427)) by @letmehateu
* fix(cli): add `--no-proxy` to disable `reqwest` proxying to prevent crash on macOS in sandboxed environments ([#13155](https://github.com/foundry-rs/foundry/pull/13155)) by @gakonst
* refactor(cli): introduce `RpcCommonOpts` ([#14224](https://github.com/foundry-rs/foundry/pull/14224)) by @figtracer
* fix(cli): restore short flag for `--rpc-url` ([#14246](https://github.com/foundry-rs/foundry/pull/14246)) by @mablr
* fix(cli): always insert numeric `chain_id` in `EtherscanOpts::dict()` ([#14335](https://github.com/foundry-rs/foundry/pull/14335)) by @decofe
* refactor(cli): unify `NetworkVariant` with `NetworkConfigs` ([#14426](https://github.com/foundry-rs/foundry/pull/14426)) by @mablr
* chore(cli): make `Git` impl more robust ([#14452](https://github.com/foundry-rs/foundry/pull/14452))
* chore(cli): remove unused `TryFrom<Result<RawCallResult>>` on `TraceResult` ([#14122](https://github.com/foundry-rs/foundry/pull/14122)) by @figtracer

</details>

***

## 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-evm` core: ~130 PRs (`Backend`, `Executor`, `DatabaseExt`, `InspectorStack`, `FoundryEvmFactory`, `FoundryContextExt`, `NestedEvm`, etc. all generic; `Env` abstraction removed; `EthFoundryEvmFactory` and `OpEvmNetwork` introduced)
* Cheatcodes generic refactor: ~30 PRs (`Cheatcodes`, `CheatcodesExecutor`, `BroadcastableTransaction` made `Network`/`Evm`/`Spec`/`Block`-generic)
* Anvil generic refactor: ~50 PRs (`Backend`, `EthApi`, `Pool`, `Storage`, `Signer`, `BlockExecutor`, fee history, beacon handlers, etc. all generic over `Network`)
* Additional supporting changes: ~50 PRs (trait-method usage instead of direct field access, dead-code removal, `revm` v34→v38 bump, alloy 2.0.x bumps)

Full PR list: [v1.5.1...v1.7.0 changelog](https://github.com/foundry-rs/foundry/compare/v1.5.1...v1.7.0).

***

## Distribution

Smaller distribution work covers Tempo support in `foundryup`, sha256sum sanitation, and npm OIDC release setup.

<details>
<summary><b>Distribution changes (4 PRs)</b></summary>

* feat(`foundryup`): add Tempo support ([#12775](https://github.com/foundry-rs/foundry/pull/12775))
* fix(foundryup): strip leading backslash from sha256sum ([#12827](https://github.com/foundry-rs/foundry/pull/12827)) by @DaniPopes
* fix(npm): add release environment for OIDC trusted publishing ([#14411](https://github.com/foundry-rs/foundry/pull/14411)) by @grandizzy
* fix(npm): remove deprecated `baseUrl` compiler option ([#14413](https://github.com/foundry-rs/foundry/pull/14413)) by @zerosnacks

</details>

***

## 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.

<details>
<summary><b>Docs changes (10 PRs)</b></summary>

* docs(config): complete fuzz and invariant sections with 20+ missing options ([#12789](https://github.com/foundry-rs/foundry/pull/12789)) by @aso20455
* docs(lint): add missing lint rules to README ([#12758](https://github.com/foundry-rs/foundry/pull/12758)) by @dizer-ti
* docs: clean up config docs ([#12296](https://github.com/foundry-rs/foundry/pull/12296)) by @onbjerg
* docs(anvil): clarify `--cache-path` is for persisted states, not fork RPC cache ([#13194](https://github.com/foundry-rs/foundry/pull/13194)) by @mattsse
* docs(config): complete `foundry.toml` configuration reference ([#13198](https://github.com/foundry-rs/foundry/pull/13198)) by @zerosnacks
* docs: slim README ([#13393](https://github.com/foundry-rs/foundry/pull/13393)) by @onbjerg
* fix: correct path format in `get_paths` doc comment ([#13388](https://github.com/foundry-rs/foundry/pull/13388)) by @gap-editor
* fix: swap incorrect doc comments for archive RPC URL functions in `rpc.rs` ([#13480](https://github.com/foundry-rs/foundry/pull/13480)) by @gap-editor
* fix: correct flag name in error message from `--compiler-version` ([#13539](https://github.com/foundry-rs/foundry/pull/13539)) by @gap-editor
* chore: add `id` attributes to issue templates ([#13864](https://github.com/foundry-rs/foundry/pull/13864)) by @decofe

</details>

***

## Full Changelog

[v1.5.1...v1.7.0](https://github.com/foundry-rs/foundry/compare/v1.5.1...v1.7.0)

## v1.5.1 (2025-12-19)

# Foundry v1.5.1

Foundry v1.5.1 is a bugfix release to support solc 0.8.31.

* fix: backport svm rs bump to 1.5.1 / stable (#12871) by @grandizzy

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.5.0...v1.5.1

## v1.5.0 (2025-11-24)

# Foundry v1.5.0

Foundry v1.5.0 release comes with an improved fuzzer that use [`Solar`](https://github.com/paradigmxyz/solar) to analyze contracts and extract interested values from AST, and incorporate updated logic to minimize counterexamples generated by invariant tests. This version adds support for browser extension wallets, provides a simpler way to interact with ERC20 tokens using cast and publishes all foundry binaries as npm packages. It also continues the effort to improve new forge formatter rolled out in previous version and makes it more customizable.

## Fuzzed tests improvements

### AST seeded dictionary

Foundry v1.5.0 leverages the Solar API to analyze contracts, collect all relevant AST literals from the sources, and use those values to generate inputs for the fuzzing campaign (https://github.com/foundry-rs/foundry/pull/12015).
For example, with this addition a counterexample for the simple test below can be generated within a couple of runs:

```Solidity
function testHash(bytes memory v) external {
    assert(keccak256(v) != keccak256("hello"));
}
```

Early testers have reported substantially improved fuzzing results and we are running additional benchmarks to quantify the effectiveness.

### Improved counterexample shrinking

In previous versions, counterexamples generated by invariant tests were replayed and minimized only once. In Foundry v1.5.0, the call sequence is replayed multiple times until all configured shrink runs are completed (https://github.com/foundry-rs/foundry/pull/12180). Additionally, the counterexamples saved on disk and replayed on subsequent campaigns, are now also minimized (https://github.com/foundry-rs/foundry/pull/12351). This allows Foundry to produce a more thoroughly minimized call sequence that can be used to generate unit tests and reproduce smart contract invariant violations.

## Browser wallet integration

Foundry v1.5.0 introduces support for browser extension wallets in the `cast send` and `cast wallet sign` commands, enabling developers to sign transactions directly in the browser (https://github.com/foundry-rs/foundry/pull/12302). Future releases will expand browser wallet support to other Foundry commands. We look forward to get external contributions to improve [the interface](https://github.com/foundry-rs/foundry-browser-wallet) and feature set of the browser wallet.

To try it out, pass the `--browser` flag to `cast send` to send a transaction using any of your browser wallets: `cast send <TO> --value <VALUE> --rpc-url <RPC_URL> --browser`

<p align="center">
  <img width="441" height="492" alt="Porto send" src="https://github.com/user-attachments/assets/850a2108-15e1-484c-987f-208b3c2ececf" />
</p>

Additionally you can sign messages and typed data with `cast wallet sign`: `cast wallet sign --browser "Hello World!"`

<p align="center">
  <img width="441" height="492" alt="Porto Sign" src="https://github.com/user-attachments/assets/2ff1fbbc-b565-4182-9993-6c640783c575" />
</p>

## ERC20 support in cast

This release introduces the `cast erc20` command to facilitate interaction with ERC-20 tokens (https://github.com/foundry-rs/foundry/pull/12258 https://github.com/foundry-rs/foundry/pull/12381). This makes it simple to query balances, perform transfers, and access other ERC-20 token details.

```bash
  balance       Query ERC20 token balance [aliases: b]
  transfer      Transfer ERC20 tokens [aliases: t]
  approve       Approve ERC20 token spending [aliases: a]
  allowance     Query ERC20 token allowance [aliases: al]
  name          Query ERC20 token name [aliases: n]
  symbol        Query ERC20 token symbol [aliases: s]
  decimals      Query ERC20 token decimals [aliases: d]
  total-supply  Query ERC20 token total supply [aliases: ts]
  mint          Mint ERC20 tokens (if the token supports minting) [aliases: m]
  burn          Burn ERC20 tokens [aliases: bu]
```

## New cheatcodes

Foundry v1.5.0 includes a set of new cheatcodes designed to improve the testing experience:

* `getEvmVersion/setEvmVersion` to retrieve and change the execution EVM version within tests and scripts (https://github.com/foundry-rs/foundry/pull/12014)
* `signWithNonce` to create deterministic ECDSA signatures using a specified ephemeral nonce (https://github.com/foundry-rs/foundry/pull/11267)
* `getStorageSlots` leverage the storage layout to accurately identify the base slot of a variable (https://github.com/foundry-rs/foundry/pull/11537)

## npm packages

Continuing the work introduced in v1.4.0 for `forge`, v1.5.0 publishes the remaining Foundry binaries as npm packages. This allows tools such as `bun`, `npx`, `pnpm` to easily install and run any Foundry executable directly from the npm registry (https://github.com/foundry-rs/foundry/pull/11945).

```bash
bun x @foundry-rs/anvil --version
npx --yes @foundry-rs/cast --version
pnpm dlx --silent @foundry-rs/chisel --version
```

## Performance Improvements

* perf(evm): reduce rpc calls when instantiating a fork environment (#12145) by @DaniPopes
* perf: remove some more unnecessary RPC calls (#12338) by @DaniPopes

## Anvil Features

* feat(anvil): wire eth\_protocolVersion, eth\_hashrate, eth\_coinbase RPCs (#11934) by @sashass1315
* perf(anvil): optimize internal data passing in log queries (#11896) by @silvekkk
* feat(anvil): add `/eth/v1/beacon/blobs` beacon endpoint (#12182) by @mablr
* feat(anvil): add `debug_dbGet` endpoint (#12375) by @mablr
* perf(anvil): avoid unnecessary transaction vector cloning in Block::new (#12393) by @CreeptoGengar
* feat(anvil): Implement alloy\_evm `FromRecoveredTx` trait for anvil `TypedTransaction` (#12424) by @mablr
* perf(anvil): avoid snapshot cloning when counting ready transactions (#12432) by @phrwlk
* fix(anvil): set evm block number to input value (#12490) by @Syzygy106
* feat(anvil): handle signature impersonation for EIP-7702 authorization list (#12553) by @mablr

## Anvil Fixes

* anvil: remove unused BlockNumberOrTag import in hardfork tests (#11952) by @anim001k
* fix: use blobparams for blob fee calc (#12056) by @mattsse
* fix(anvil): set envelope for non deposit tx in debug tracers (#12080) by @grandizzy
* fix(anvil): eth\_getAccountInfo check if predates fork inclusive (#12101) by @grandizzy
* fix(anvil): always disable nonce check for `eth_call`s (#12144) by @grandizzy
* fix(anvil): get account info from db when node block > fork block (#12175) by @grandizzy
* fix(anvil): remove transactions before block/hash in unwind\_to to prevent leaks (#12178) by @sashass1315
* fix(anvil): preserve OP receipt fields in convert\_to\_anvil\_receipt (#12396) by @Syzygy106
* fix(anvil): respect configured fork initial\_backoff in setup\_fork\_db\_config (#12401) by @phrwlk
* fix(anvil): serialize genesis time as string (#12512) by @StackOverflowExcept1on

## Cast Features

* feat(cast): add cast erc20 with subcommands balance, transfer, approve, allowance (#12258) by @marcvernet31
* feat(cast): more erc20 methods (#12381) by @0xrusowsky
* feat(cast): allow logs filtering on multiple addresses (#12380) by @0xferrous
* feat(cast): added custom polling interval args (#12387) by @dipanshuhappy
* feat(wallets): add Turnkey signer support (#12026) by @rplusq
* feat: browser wallet (#12302) by @zerosnacks
* feat(cast): block -f to accept multiple fields (#12427) by @dipanshuhappy
* feat: support all blob envelope in cast (#12557) by @mattsse
* feat: support for eth\_sendrawtransactionSync in cast send (#12546) by @stevencartavia

## Cast Fixes

* fix(cast): clean up SenderKind enum and remove redundant checks (#12003) by @strmfos
* fix(cast): cast call --json formatting (#12060) by @0xferrous
* fix(cast): use pretty JSON for txpool commands (#12099) by @mattsse
* fix(wallets): prevent duplicate Trezor wallets when using --hd-paths (#12214) by @GarmashAlex
* fix(cast): sign erc20 transactions locally before broadcast (#12372) by @0xrusowsky
* fix(cast): add turnkey to list (#12476) by @DaniPopes

## Forge Features

* feat(forge): implement forge snapshot --format table stdout rendering (#11930) by @radik878
* feat(fmt): enforce doc comment styling (#11955) by @0xrusowsky
* feat(forge): enhance gas snapshot diff with configurable sorting and improved output (#11974) by @silvekkk
* feat(lint): emit suggestions for `named_struct_fields` lint (#11982) by @mablr
* feat(forge): install soldeer dependencies (#11994) by @wellnana
* feat(cheatcodes): add setEvmVersion / getEvmVersion (#12014) by @grandizzy
* feat(forge): add --rerun-failed flag to watch mode for faster TDD feedback (#11993) by @silvekkk
* feat(forge): support always\_use\_create\_2\_factory in inline config (#12086) by @DaniPopes
* feat(cheats): RLP (#11232) by @qiweiii
* feat(forge): add bypass prevrandao (#12125) by @grandizzy
* feat: add Sourcify trace identifier (#11917) by @DaniPopes
* feat(traces): add contract context to Etherscan compilation errors (#12152) by @silvekkk
* feat(doc): render @title NatSpec tag in comment output (#12232) by @MozirDmitriy
* feat(fuzz): ast-seeded dictionary (#12015) by @0xrusowsky
* feat(forge): exit test run gracefully if show progress (#12290) by @grandizzy
* feat(fmt): add single\_line\_imports option to keep single imports on one line (#12303) by @silvekkk
* feat(invariant): shrink failure when replayed (#12351) by @grandizzy
* feat(`forge script`): implement retries for forge script broadcast (#12564) by @zerosnacks

## Forge Fixes

* fix(fmt): preserve comment position in disabled lines (#11922) by @0xrusowsky
* fix: look through all matching permissions in `is_path_allowed` (#10679) by @rubydusa
* fix(forge): replay fuzz failure only if same test selector (#11947) by @grandizzy
* fix(doc): reuse solar sema compiler (#11980) by @grandizzy
* fix(`forge`): apply correct permission scoping in workflow templates (#11986) by @zerosnacks
* fix(chisel): disable compiler optimizations (#11990) by @DaniPopes
* feat(cheats): preserve struct order when parsing JSON objects (#11612) by @0xrusowsky
* fix(forge): dynamic test linking should follow pranks (#12005) by @grandizzy
* fix(fmt): ensure leading blank lines are always removed (#12002) by @0xrusowsky
* fix(fmt): ensure commasep breaks with final trailing cmnt (#12031) by @0xrusowsky
* fix(forge): handle overloaded functions correctly in doc (#12040) by @wellnana
* fix(forge): dynamic test linking for try catch with custom return (#12050) by @grandizzy
* fix(fmt): refine logic over comments between uninformed commasep (#12055) by @0xrusowsky
* fix(forge): verify bytecode should replay txes (#12068) by @grandizzy
* fix(config): normalize test\_failures\_file path in canonic\_at() (#12071) by @silvekkk
* fix(forge): apply evm version set in setup and test constructor (#12069) by @grandizzy
* fix: tighten BroadcastReader directory validation (#12057) by @rnkrtt
* fix(fmt): don't normalize single-line non-doc block cmnts (#12078) by @0xrusowsky
* fix(doc): follow tab width fmt config (#12103) by @grandizzy
* fix(fmt): account for ternary operators when estimating size (#12104) by @0xrusowsky
* fix(cheatcodes): use `make_acc_non_empty` in `mockCalls_1Call`, `mockCall_1Call`, `mockCall_3Call` for consistency (#11443) by @aganisgash
* fix(fmt): properly handle multiline\_func\_header = "all" + bump alloy (#12110) by @0xrusowsky
* fix(fmt): ensure no underscores in yul number literals (#12112) by @0xrusowsky
* fix(fmt): handle trailing coments between base contracts (#12127) by @0xrusowsky
* fix(fmt): filter libs when recursing (#12119) by @0xrusowsky
* fix(fmt): break try stmts in a fn header-like fashion (#12131) by @0xrusowsky
* Fix GCP env var names (#12129) by @MamunC0der
* fix(fmt): use nbsp if LHS-most element fits (#12135) by @0xrusowsky
* fix(evm): forward selfdestruct to inner inspectors in InspectorStackRefMut (#12128) by @GarmashAlex
* fix(fmt): prioritize parenthesis breaks in emit and revert stmts (#12147) by @0xrusowsky
* fix(fmt): inline call options when they fit (#12172) by @0xrusowsky
* fix(fmt): do not add underscores on fractional part with exponent (#12195) by @0xrusowsky
* fix(coverage): do not account abstract contract items (#12202) by @grandizzy
* fix(invariant): revisit sequence indices and respect shrink limit (#12180) by @0xalpharush
* fix(forge): Avoid trace confusion on functions with shared signature (#12169) by @marcvernet31
* fix(forge): show backtrace line only on -vvvvv (#12211) by @grandizzy
* fix(coverage): exclude only virtual fns without impl (#12216) by @grandizzy
* fix(config): canonicalize ignored\_file\_paths in canonic\_at (#12115) by @silvekkk
* fix(linking): deep-merge link\_references from creation and deployed bytecode (#11759) by @VolodymyrBg
* fix(fmt): no trailing cmnts in opening brace of empty blocks (#12241) by @0xrusowsky
* fix(forge): update progress on rejected fuzz runs (#12243) by @grandizzy
* fix(forge): fix dynamic gas limit check (#12267) by @grandizzy
* fix(common): spurious detection off-by-one (#12262) by @MozirDmitriy
* fix(fmt): preserve indexed callee when it fits (#12270) by @0xrusowsky
* fix(script): prevent --verify without --broadcast from causing deployment not found error (#11734) by @DeVikingMark
* fix(fmt): simplify boolean expression in Solidity formatter (#12275) by @phrwlk
* fix: enable/disable global yansi color with flag (#12297) by @DaniPopes
* fix(fmt): keep if stmts inline in assembly blocks (#12306) by @0xrusowsky
* fix(fmt): prevent double-ind in complex ternary expr (#12317) by @0xrusowsky
* fix(fmt): only indent wrapped trailing block cmnts (#12319) by @0xrusowsky
* fix(fmt): don't break var assignments when callee fits (#12323) by @0xrusowsky
* fix(cheats): correct impersonate() return semantics to match documentation (#12309) by @phrwlk
* fix(fmt): properly calc fn header size (#12343) by @0xrusowsky
* fix(fmt): always break consistently in calls with opts and args (#12359) by @0xrusowsky
* fix: do not panic if cannot read counterexample (#12467) by @grandizzy
* fix(forge doc): use relative path instead of full path (#12373) by @marcvernet31
* fix: enable different gas calculation for monad testnet (#12520) by @QEDK
* fix(forge): properly decode raw Error(string) (#12536) by @grandizzy
* fix(forge): allow install repo with ssh (#12542) by @grandizzy
* fix: use AssumeReject instead of TooManyRejects for single vm.assume reject (#12561) by @DeVikingMark
* fix(forge): keep gas memory on gas metering reset (#12539) by @grandizzy
* fix(`verify`): handle `Address is not a smart-contract` with Blockscout verification (#12566) by @zerosnacks
* fix(forge): preprocess mocks declared in test file (#12516) by @grandizzy

## Other

* perf: reduce memory usage by boxing large error variants in wallet operations (#11928) by @Bilogweb3
* fix: handle empty receipt when transactions are discarded by RPCs (#10457) by @DeVikingMark
* chore(lint): use solar's built-in code suggestions (#11919) by @0xrusowsky
* refactor(wallets): reduce iterator cloning (#11931) by @Bilogweb3
* docs: explain solar workflow for lint rules (#11938) by @onbjerg
* chore(fmt): rename and alias params config varaint for clarity (#11944) by @0xrusowsky
* chore: custom networks dev docs (#11943) by @grandizzy
* refactor: add InstIter for iterating bytecode, pc, ic (#11956) by @DaniPopes
* refactor(config): simplify fs permission retrieval logic (#11946) by @mablr
* fix: correct version suffix for rc builds (#11961) by @0xferrous
* test: rm unused repros (#11963) by @DaniPopes
* chore(cast): remove unclear `pretty` arg for `print_storage` (#11976) by @mablr
* refactor(anvil): introduce get\_block\_with\_hash and convert\_block\_with\_hash (#11939) by @silvekkk
* refactor(chisel): remove gas limit binary search (#11989) by @DaniPopes
* fix(`ci`): `create-an-issue` in release workflow is pinned to incorrect hash (#12004) by @zerosnacks
* chore(`ci`): integrate CodeQL into regular `test.yml` workflow and mark as requirement for ci-success (#12007) by @zerosnacks
* ci: cache testdata project (#12009) by @DaniPopes
* ci: add test name to cache key (#12010) by @DaniPopes
* chore(test): add hints after test failed (#11995) by @silvekkk
* fix: improve error handling in available\_senders with logging and deduplication (#12011) by @CreeptoGengar
* ci: use gha runner for macos arm releases (#12021) by @DaniPopes
* fix: replace Some(URL) with URL during installation output (#12024) by @milosdjurica
* docs(networks): fix doc heading (#12028) by @onbjerg
* chore: make network flags exclude each other (#12027) by @onbjerg
* refactor: avoid cloning broadcast transactions in reader (#12030) by @reject-i
* deps: bump deps (#12033) by @onbjerg
* chore: rm `NodeConfig::with_optimism` (#12035) by @onbjerg
* chore: rm `NodeConfig::with_celo` (#12034) by @onbjerg
* refactor: make `NetworkConfig` fields private (#12037) by @onbjerg
* fix(build): use output graph/artifacts rather than sources (#12019) by @0xrusowsky
* chore: rm extra `--celo` arg (#12038) by @onbjerg
* chore(meta): remove unused SolidityGeneration dir (#12053) by @DaniPopes
* chore: add more profile.dev optimizations (#12054) by @DaniPopes
* chore(meta): remove unused testdata/default/script (#12061) by @DaniPopes
* chore: make `SourceData::contract_definitions` public (#12058) by @cakevm
* chore: add some more logs to forge, nits (#12074) by @DaniPopes
* chore: fix setEvmVersion flaky test, same order (#12084) by @grandizzy
* chore: bump v1.4.1 (#12083) by @grandizzy
* chore(cheat): load and touch new origin in broadcast call (#12096) by @grandizzy
* chore: bump version to 1.4.2 (#12113) by @grandizzy
* chore(script): avoid cloning script sequences when writing sensitive output (#12085) by @Bilogweb3
* test: log TestCommand exit status, output (#12137) by @DaniPopes
* chore(meta): fix method resolution in async tests (#12136) by @DaniPopes
* test: lower timeout for normal tests (#12138) by @DaniPopes
* chore: improve unverifiable contracts warn (#12139) by @grandizzy
* test: optimize backtrace deps (#12140) by @DaniPopes
* test: re-enable can\_read\_write\_cache (#12141) by @DaniPopes
* test: re-enable external tests with fork block (#12142) by @DaniPopes
* chore: re-use the same provider when creating a fork (#12143) by @DaniPopes
* test: refactor testdata/ tests to be run in `forge test` (#12049) by @DaniPopes
* deps: bump deps (#12149) by @rplusq
* ci: run main CI on merge queue (#12161) by @DaniPopes
* ci: remove CARGO\_PROFILE\_DEV\_DEBUG (#12160) by @DaniPopes
* ci: re-add runner.os to cache (#12157) by @DaniPopes
* ci: bump python to 3.14 (#12158) by @DaniPopes
* ci: enable bun on Windows (#12159) by @DaniPopes
* ci: re-add rust-cache (#12156) by @DaniPopes
* ci: don't upload docs unless deploying them (#12163) by @DaniPopes
* ci: disable Windows on PRs (#12162) by @DaniPopes
* chore: fix clippy (#12167) by @mattsse
* chore(flake): update flake (#12183) by @beeb
* chore(benches): drop unused tokio dependency (#12186) by @MamunC0der
* chore(`deps`): bump alloy-hardforks, alloy-core, proptest (#12191) by @zerosnacks
* chore: ignore falky celo test, update Cargo.lock (#12210) by @grandizzy
* chore(deps): update soldeer (#12184) by @beeb
* chore(deps): bump actions/setup-node from 5 to 6 (#12206) by @dependabot\[bot]
* chore: Remove redundant Bytes inner conversions in fork and mem backends (#12199) by @phrwlk
* fix: handle directory creation errors in sol-macro-gen (#12198) by @DeVikingMark
* fix: Simplify equal-case formatting in `fmt_change` by using `to_string()` (#12193) by @maximevtush
* fix: Remove redundant `.to_string()` after `format!` in test summary table (#12192) by @maximevtush
* refactor(config): remove etherscan\_api\_key fallback from get\_rpc\_url (#12179) by @zeevick10
* chore(`testdata`): fix solidity warnings: shadowing of builtin symbol and unhandled low-level calls (#12189) by @zerosnacks
* doc(cheats): `deployCode` reverts w/ unlinked artifact libs (#12212) by @0xrusowsky
* chore: bump v1.4.3 (#12213) by @grandizzy
* chore: readd table tests (#12219) by @grandizzy
* chore(evm/core): fix misleading exit/exists in fork errors (#12209) by @Sharilleed223
* ci: rename test.yml -> ci.yml, nextest.yml -> test.yml (#12223) by @DaniPopes
* test: use an index per shuffled list, redact logs (#12228) by @DaniPopes
* chore: increase 'deployed contract' log level (#12229) by @DaniPopes
* ci: rename test.yml (#12233) by @DaniPopes
* chore: fix erc20 balance test (#12239) by @grandizzy
* chore: update traces for p256 precompile test (#12242) by @grandizzy
* chore(evm): remove public visibility from `FoundryEvm`'s inner field (#12237) by @mablr
* chore(deps): bump revm 30+, alloy-evm, revm-inspectors (#12094) by @zerosnacks
* chore: remove dead code (#12245) by @onbjerg
* chore: mark some inner fields private (#12246) by @onbjerg
* chore: mark more stuff private (#12248) by @onbjerg
* chore(deps): bump alloy-chains (#12244) by @zerosnacks
* chore: clean up `EvmOpts` (#12247) by @onbjerg
* chore: update Selectors API URLs to Sourcify (#12250) by @akshatmittal
* chore: set seed for flaky tests, use etherscan api key (#12255) by @grandizzy
* fix(npm): handle unhandled promise rejection in binary download (#12261) by @maradini77
* chore: remove redundant Bytes inner conversion in otterscan backend (#12259) by @Sharilleed223
* chore: bump v1.4.4 (#12271) by @grandizzy
* chore(forge): delete useless todo's (#12276) by @DeVikingMark
* refactor: remove redundant .as\_str() calls on temporary strings (#12279) by @Fallengirl
* docs: fix Cheatcode trait methods count in documentation (#12277) by @avorylli
* chore: reduce number of shrink runs for slow test (#12291) by @grandizzy
* docs: correct logging documentation accuracy in debugging.md (#12287) by @avorylli
* chore: simplify Bytes handling in revert errors (#12280) by @Sharilleed223
* chore(fmt): prefer\_compact + indent bin expr w/ parenthesis (#12281) by @0xrusowsky
* fix: enable IPC tests on Windows (#12282) by @DeVikingMark
* chore: clean up benchmark script a bit (#12295) by @onbjerg
* chore(docs): default `all` for `prefer_compact` fmt config (#12294) by @grandizzy
* test(config): add test for test\_failures\_file path normalization (#12235) by @silvekkk
* test: invariant sequence colors (#11730) by @grandizzy
* docs(fmt): add `none` variant (#12298) by @0xrusowsky
* docs: update transaction types to use constants (#12301) by @CreeptoGengar
* chore: switch rpc url arbitrum (#12314) by @grandizzy
* chore: remove redundant Bytes conversion in mined\_transaction\_receipt (#12313) by @Sharilleed223
* chore: remove unused Add import in state\_snapshot.rs (#12305) by @wedjob0X
* chore: rpc url (#12318) by @grandizzy
* chore: fix rpc url for arb if no env var (#12320) by @grandizzy
* ci: don't run most CI on push (#12230) by @DaniPopes
* ci: add 'release' to release job names (#12326) by @DaniPopes
* ci: cache cross installation (#12325) by @DaniPopes
* ci: use sccache in release workflow (#12327) by @DaniPopes
* ci: missing newline (#12329) by @DaniPopes
* chore: update arb tests, use different rpc url (#12321) by @grandizzy
* Deduplicate 0x prefix stripping in cast::concat\_hex by using strip\_0x (#12328) by @maradini77
* test: make forgetest\_init! init an empty project (#12335) by @DaniPopes
* fix: node\_info label for erigon\_get\_header\_by\_number (#12346) by @phrwlk
* Handle newlines for bytes data in `cast keccak` (#12339) by @quangloc99
* chore: avoid cloning bytecode in prank delegate check (#12341) by @strmfos
* Title: Simplify StateSnapshots::insert\_at return contract (#12337) by @wedjob0X
* ci: fix release workflow (#12353) by @DaniPopes
* test(fmt): ensure fn header sizes are computed correctly (#12350) by @0xrusowsky
* feat: take calldata in `Precompile::signature` (#12354) by @onbjerg
* fix: add tool for release cross (#12356) by @grandizzy
* chore: bump alloy chains (#12370) by @grandizzy
* fix: deduplicate “0x” prefix stripping in args via shared helper (#12365) by @viktorking7
* chore: patch solar to main rev (#12379) by @grandizzy
* chore: back to arbitrum rpc (#12382) by @grandizzy
* chore(forge): filter out unsupported solidity versions \[solar] (#12065) by @marcvernet31
* feat: npm publish anvil, cast and chisel (#11945) by @grandizzy
* chore: remove redundant clones in block construction and bloom building (#12383) by @phrwlk
* chore(anvil): remove unnecessary clones and accept logs by slice (#12364) by @Forostovec
* refactor(anvil): simplify transaction conversion to RpcTransaction (#12391) by @mattsse
* chore: reuse some code (#12395) by @mattsse
* docs: fix cheatcode attribute example syntax (#12392) by @avorylli
* deps: bump deps (#12398) by @rplusq
* chore(anvil): remove dead BeaconResult alias and re-export (#12405) by @Forostovec
* refactor(anvil): simplify receipt conversion using map\_logs (#12413) by @mattsse
* chore: update hardfork mappings (#12410) by @mattsse
* refactor(anvil)!: simplify PrecompileFactory API to use DynPrecompile (#12411) by @mattsse
* chore(anvil): use cfg(feature = "cmd") instead of allow(dead\_code) for parse (#12425) by @Fallengirl
* Refactor: use strip\_0x in Cast::publish and drop unnecessary mut (#12376) by @viktorking7
* chore: use trait fn for setting both input fields (#12426) by @mattsse
* Remove unused foundry-config dependency from benches crate (#12388) by @wedjob0X
* refactor: use derive(Default) for Handler struct (#12431) by @Bilogweb3
* refactor(cast): remove redundant clone and duplicate import (#124- chore: v1.4.0 benches (#11920) by @yash-atreya
* docs: foundry-evm-fuzz extensions (#11924) by @grandizzy30) by @Bilogweb3
* fix(npm): kill child process when SIGTERM or SIGINT is received (#12412) by @guidanoli
* feat(npm): forward termination signals to child process (#12441) by @o-az
* chore(deps): bump DeterminateSystems/determinate-nix-action from 3.11.3 to 3.12.0 (#12436) by @dependabot\[bot]
* chore(npm): update README.md of npm packages (#12459) by @o-az
* chore: bump alloy 1.1.0 (#12457) by @stevencartavia
* chore: bump revm 31 (#12461) by @mattsse
* chore(anvil): replace `inject_custom_precompiles` with `PrecompilesMap::extend_precompiles` method (#12469) by @mablr
* fix: provide the sender when converting to request (#12473) by @mattsse
* Revert "fix(forge doc): use relative path instead of full path" (#12477) by @DaniPopes
* test: memory\_limit (#12299) by @DaniPopes
* test: disable reth-ethereum-full (#12484) by @DaniPopes
* chore(foundryup): update master refs to HEAD (#12479) by @DaniPopes
* test: debug log stdout in testdata test (#12482) by @DaniPopes
* fix: update TEST\_CONTRACT\_ADDRESS (#12475) by @DaniPopes
* chore(meta): remove MSRV from clippy.toml (#12489) by @DaniPopes
* chore: clean up build script (#12488) by @DaniPopes
* chore: aggregate PRs (#12493) by @DaniPopes
* feat(docker): rewrite to cache with depot (#12491) by @DaniPopes
* feat(anvil): eth\_getTransactionBySenderAndNonce RPC method (#12497) by @0xChaddB
* ci(doc): document feature sync (#12498) by @rplusq
* feat(anvil): add `/eth/v1/beacon/genesis` endpoint to Beacon API (#12503) by @mablr
* test: try fix flaky cast\_access\_list\_negative\_numbers test (#12509) by @mattsse
* Fix numbers printing (#12504) by @e1Ru1o
* fix(npm): small type fix to resolve ci (#12514) by @o-az
* refactor(doc): improve merge\_inheritdoc docs and simplify cloning (#12517) by @DeVikingMark
* fix(forge doc): use relative path instead of full path (#12519) by @grandizzy
* chore(anvil): use `Block` and `Header` from Alloy (#12533) by @mablr
* chore: bump to revm 33 (#12538) by @zerosnacks
* chore: bump solar, warn on invalid natspec (#12540) by @grandizzy
* chore(common): drop unused fs import and fix doc links (#12535) by @0xLogicalx
* fix: infer addresses in unknown fields in UIfmt (#12552) by @klkvr
* refactor(anvil): beacon api tests + use Alloy's `GenesisResponse` struct (#12513) by @mablr
* Remove redundant String clones in Sourcify metadata conversion (#12554) by @soniseth0
* chore: bump v1.5 (#12567) by @grandizzy

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.4.4...v1.5.0-rc1

## v1.4.4 (2025-10-30)

# Foundry v1.4.4

Foundry v1.4.4 is a bugfix release for forge.

## Forge Fixes

* feat(fmt): enforce doc comment styling (#11955) by @0xrusowsky
* fix(fmt): no trailing cmnts in opening brace of empty blocks (#12241) by @0xrusowsky
* fix(forge): fix dynamic gas limit check (#12267) by @grandizzy
* fix(fmt): preserve indexed callee when it fits (#12270) by @0xrusowsky
* fix(forge): update progress on rejected fuzz runs (#12243) by @grandizzy
* chore(fmt): prefer\_compact + indent bin expr w/ parenthesis (#12281) by @0xrusowsky
* feat(fmt): add single\_line\_imports option to keep single imports on one line (#12303) by @0xrusowsky
* fix(fmt): keep if stmts inline in assembly blocks (#12306) by @0xrusowsky
* fix(fmt): prevent double-ind in complex ternary expr (#12317) by @0xrusowsky
* fix(fmt): only indent wrapped trailing block cmnts (#12319) by @0xrusowsky
* fix(fmt): don't break var assignments when callee fits (#12323) by @0xrusowsky
* fix(fmt): properly calc fn header size (#12343) by @0xrusowsky
* test(fmt): ensure fn header sizes are computed correctly (#12350) by @0xrusowsky
* chore: patch solar to main rev (#12379) by @grandizzy
* fix(fmt): always break consistently in calls with opts and args (#12359) by @0xrusowsky

## Other:

* chore: update traces for p256 precompile test (#12242) by @grandizzy
* chore: bump v1.4.4 (#12271) by @grandizzy
* chore(docs): default all for prefer\_compact fmt config (#12294) by @grandizzy
* docs(fmt): add none variant (#12298) by @grandizzy
* chore: update arb tests, use different rpc url  (#12321) by @grandizzy

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.4.3...v1.4.4

## v1.4.3 (2025-10-22)

# Foundry v1.4.3

Foundry v1.4.3 is a bugfix release for forge and anvil.

## Anvil Fixes

* fix(anvil): get account info from db when node block > fork block (#12175) by @grandizzy

## Forge Fixes

* fix(fmt): inline call options when they fit (#12172) by @0xrusowsky
* fix(fmt): do not add underscores on fractional part with exponent (#12195) by @0xrusowsky
* fix(forge): show backtrace line only on -vvvvv (#12211) by @grandizzy
* fix(coverage): do not account abstract contract items (#12202) by @grandizzy
* fix(coverage): exclude only virtual fns without impl (#12216) by @grandizzy

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.4.2...v1.4.3

## v1.4.2 (2025-10-18)

# Foundry v1.4.2

Foundry v1.4.2 is a bugfix release for forge fmt and anvil.

## Anvil Fixes

* fix(anvil): eth\_getAccountInfo check if predates fork inclusive (#12101) by @grandizzy

## Forge Fixes

* fix(doc): follow tab width fmt config (#12103) by @grandizzy
* fix(fmt): account for ternary operators when estimating size (#12104) by @0xrusowsky
* fix(fmt): properly handle multiline\_func\_header = "all" + bump alloy (#12110) by @0xrusowsky
* fix(fmt): ensure no underscores in yul number literals (#12112) by @0xrusowsky
* fix(fmt): handle trailing coments between base contracts (#12127) by @0xrusowsky
* fix(fmt): filter libs when recursing (#12119) by @0xrusowsky
* fix(fmt): break try stmts in a fn header-like fashion (#12131) by @0xrusowsky
* fix(fmt): use nbsp if LHS-most element fits (#12135) by @0xrusowsky
* fix(fmt): prioritize parenthesis breaks in emit and revert stmts (#12147) by @0xrusowsky

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.4.1...v1.4.2

## v1.4.1 (2025-10-14)

# Foundry v1.4.1

Foundry v1.4.1 is a bugfix release for forge fmt and anvil.

## Anvil Fixes

* fix(anvil): set envelope for non deposit tx in debug tracers (#12080) by @grandizzy

## Forge Fixes

* fix(fmt): ensure commasep breaks with final trailing cmnt (#12031) by @0xrusowsky
* fix(fmt): refine logic over comments between uninformed commasep (#12055) by @0xrusowsky
* fix(fmt): don't normalize single-line non-doc block cmnts (#12078) by @0xrusowsky

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.4.0...v1.4.1

## v1.4.0 (2025-10-08)

# Foundry v1.4.0

This release brings up to 10.52% better performance for `forge coverage` and up to 11.41% for fuzzed tests, a new formatter built on [`Solar`](https://github.com/paradigmxyz/solar), enhanced handling of [multiple chain configurations and deployments](https://getfoundry.sh/guides/scripting-with-config/#multi-chain-deployments), and an improved testing and debugging experience with backtraces and custom network precompiles. Foundry v1.4 is Osaka-ready, comes with new Anvil endpoints, deprecates the Etherscan v1 API, and publishes `forge` as an npm package.

## Performance Improvements

Foundry v1.4 leverages Solar API to analyze contracts and identify coverage items (#11565), and updates coverage implementation to align with that of forge test (#11801). It also completely removes the proptest runner from fuzzed tests (#11061), resulting in up to a 10.52% performance improvement for `forge coverage` and up to an 11.41% performance improvement in fuzzed tests execution speed on the same benchmarked projects as previous versions.

#### Forge Coverage

| Repository            | v1.3.6 | v1.4.0 | X Times Faster | % Improvement |
| -------------------- | -------- | -------- | -------------- | ------------- |
| ithacaxyz-account    | 14.91 s  | 13.34 s  | x1.12      | 10.52%    |
| Uniswap-v4-core      | 1m 34.8s | 1m 30.3s | x1.05      | 4.74%     |
| sparkdotfi-spark-psm | 3m 49.3s | 3m 40.2s | x1.04      | 3.97%     |

#### Forge Fuzz tests

| Repository            | v1.3.6 | v1.4.0 | X Times Faster | % Improvement |
| -------------------- | ------------ | ------------ | -------------- | ------------- |
| ithacaxyz-account    | 3.18 s         | 3.02 s        | x1.05          | 5.03%         |
| solady               | 2.39 s         | 2.24 s        | x1.07          | 6.28%         |
| Uniswap-v4-core      | 6.84 s         | 6.20 s        | x1.10          | 9.36%         |
| sparkdotfi-spark-psm | 3.07 s         | 2.72 s        | x1.13          | 11.41%        |

## Enhanced configuration

### Configuration inheritance

Foundry v1.4 supports configuration inheritance through the `extends` field in foundry.toml, making it easier to maintain a shared base configuration across multiple projects or profiles (#11284). This enables cleaner setups and reduces duplication by inheriting from a base configuration file:

```toml
[profile.default]
extends = "./base-config.toml"
src = "src"
test = "test"
```

For more details please refer to [configuration inheritance docs](https://getfoundry.sh/guides/project-setup/project-layout/#configuration-inheritance).

### Multi-chain configuration

The newly added forge-std [`config helper`](https://github.com/foundry-rs/forge-std/pull/715), built on top of Foundry v1.4 cheatcodes, provides a streamlined way to manage configuration for multi-chain environments in tests and scripts. It automatically loads and parses TOML configuration files, creates forks for specified chains, and provides type-safe access to configuration variables.
Loading configuration and creating forks for each chain specified in the config can be done by calling `_loadConfigAndForks` function, which also supports updating configurations on the fly.

```Solidity
function _loadConfigAndForks(string memory filePath, bool writeToFile) internal
```

Scripting workflows, in particular, gain significant advantages from the features of the `Config` contract. Please refer to [config helper docs](https://getfoundry.sh/reference/forge-std/config/) and [scripting with config docs](https://getfoundry.sh/guides/scripting-with-config) for more details.\
For a complex, production-ready example, please see Ithaca's account [deploy script](https://github.com/ithacaxyz/account/blob/7dd8a5d91c162b89316e367f0fb159f47abfeab0/deploy/DeployMain.s.sol) and [configuration](https://github.com/ithacaxyz/account/blob/7dd8a5d91c162b89316e367f0fb159f47abfeab0/deploy/config.toml).

We're continuously working to improve multi-chain support, please share your feedback on the current approach and suggest new features or enhancements in #11449.

## Enhanced testing UX

Foundry v1.4 introduces backtraces (#11547) that include the exact line number in the Solidity source code corresponding to the compiled bytecode where the error or revert occurred.

```bash
[FAIL: ERC20: transfer amount exceeds allowance] testTransferFromWithoutApproval() (gas: 28771)
Traces:
  [28771] ForkBacktraceTest::testTransferFromWithoutApproval()
    ├─ [22928] ForkedERC20Wrapper::transferFromWithoutApproval(0x55FE002aefF02F77364de339a1292923A15844B8, 0x000000000000000000000000000000000000dEaD, 1000000 [1e6])
    │   ├─ [18884] FiatTokenProxy::fallback(0x55FE002aefF02F77364de339a1292923A15844B8, 0x000000000000000000000000000000000000dEaD, 1000000 [1e6])
    │   │   ├─ [11573] FiatTokenV2_2::transferFrom(0x55FE002aefF02F77364de339a1292923A15844B8, 0x000000000000000000000000000000000000dEaD, 1000000 [1e6]) [delegatecall]
    │   │   │   └─ ← [Revert] ERC20: transfer amount exceeds allowance
    │   │   └─ ← [Revert] ERC20: transfer amount exceeds allowance
    │   └─ ← [Revert] ERC20: transfer amount exceeds allowance
    └─ ← [Revert] ERC20: transfer amount exceeds allowance

Backtrace:
  at FiatTokenV2_2.transferFrom
  at FiatTokenProxy.fallback
  at ForkedERC20Wrapper.transferFromWithoutApproval (src/ForkedERC20Wrapper.sol:35:24)
  at ForkBacktraceTest.testTransferFromWithoutApproval (test/ForkBacktrace.t.sol:28:96)
```

## Forge Formatter

Foundry v1.4 ships with a new Solidity formatter (`forge fmt`) built on top of [`Solar`](https://github.com/paradigmxyz/solar) and replacing the previous Solang-based implementation and its limitations (#10907). This change enables faster support for new Solidity language features and allows us to address long-standing formatting bugs that were previously blocked by Solang dependency.

We've aimed for feature parity with the legacy formatter, but there may still be some edge cases that aren’t fully covered yet, so please be aware and report any issues you encounter.

## Coverage-Guided Fuzzing

In addition to extending coverage-guided fuzzing and time-based campaigns to stateless fuzz tests, this version introduces ABI mutations (such as bit-flip, interesting word, increment/decrement, and Gaussian noise mutators) to enhance test coverage and help uncover new execution paths by generating diverse and edge-case inputs (#11061).

## Custom Network Precompiles

Beginning with the transfer precompile contributed by the Celo team for `Anvil` (#11209), we have extended support to `forge` and `cast` components, making it simpler for external contributions. If you want to contribute support for a custom network, please check out documentation and Celo example within [`foundry-evm-networks`](https://github.com/foundry-rs/foundry/tree/1cf23aad43165fcbfc61903379282fc6e9ca2b94/crates/evm/networks) crate.

## Anvil Improvements

With this release, Anvil adds support for JS and prestate tracers, and print traces and logs when using `--print-traces` switch, enabling more powerful and customizable debugging capabilities. Additionally, several new RPC endpoints have been introduced:

* `eth_config`: exposes Anvil's current configuration, such as chain ID, fork settings, and feature flags (#11591).
* `anvil_impersonateSignature`: allows simulating transactions as if they were signed by a given address, useful for testing signature-based flows (#11195).
* `anvil_getBlobSidecarsByBlockId`: returns the blobs for a given transaction hash (#11828).

## Other

* `forge lint` improvements: mixed case exceptions lint, ERC20 transfer check
* improve state diffs cheatcodes by adding nonce and balance diffs and by using storage layout to decode values
* addition of native `vm.bound` cheatcode that enables log-uniform sampling
* updated Sourcify integration to support API v2

## Performance improvements

* feat(forge): Remove proptest runner from fuzzed tests (#11061) by @grandizzy
* perf: box inspectors in InspectorStack (#11100) by @DaniPopes
* perf: use fxhash for coverage hitmap (#11155) by @DaniPopes
* perf: parallelize remappings provider (#11536) by @DaniPopes
* perf: avoid project output clone (#11707) by @DaniPopes
* perf: lazy cheatcodes SignaturesIdentifier, save only if online (#11708) by @DaniPopes
* perf: link in parallel (#11710) by @DaniPopes
* perf(coverage): reserve some space for hits early (#11793) by @DaniPopes
* fix(coverage): sync implementation with forge test (#11801) by @DaniPopes

## Anvil Features

* feat(anvil): improve historic state access (#10420) by @naijauser
* feat(anvil): added js tracer (#11052) by @Soubhik-10
* feat(anvil): add option to disable pool balance checks in EVM configuration (#11242) by @mablr
* feat(anvil): added `anvil_impersonateSignature` (#11195) by @Soubhik-10
* feat: add missing eip7702 support (#11490) by @ongyimeng
* feat(anvil): support celo transfer precompile (#11491) by @mattsse
* feat(`anvil`): add `eth_config` rpc endpoint (#11591) by @zerosnacks
* feat(anvil): calculate max\_transactions based on block gas capacity (#11670) by @forkfury
* feat(anvil): add PreStateTracer support for debug\_traceTransaction (#11709) by @w1tcher
* feat: print traces and logs in calltracer (#11722) by @mattsse
* feat(anvil): add support for `anvil_getBlobSidecarsByBlockId` (#11828) by @mablr

## Anvil Fixes

* fix(anvil): specialize eth\_getAccountInfo in fork mode (#11634) by @mattsse
* fix: use existing functions for accountinfo (#11134) by @mattsse
* fix(`anvil`): unwrap panic in `eth/backend/mem/mod.rs` (#11141) by @zerosnacks
* fix(`anvil`): v1.2 state load compatibility (#11179) by @zerosnacks
* fix(anvil): print traces for `eth_simulateV1` (#11253) by @klkvr
* fix(anvil): deterministic block production (#11415) by @fubhy
* Fix: invalid tx input error in anvil component (#11488) by @ongyimeng
* fix(anvil): traces' colors (#11614) by @0xferrous
* fix(anvil): use RUST\_LOG only in explicit or blanket filter (#11630) by @0xferrous
* fix: ethgetaccinfo (#11715) by @mattsse
* fix: use next fee blob basefee for missing blob fee (#11782) by @mattsse
* anvil: return JoinHandle from `TaskManager::spawn_blocking` for proper task control (#11857) by @viktorking7

## Cast Features

* feat(cast): transaction to transaction request (#11151) by @Rimeeeeee
* feat(cast): new `pad` cmd for hex data (#11152) by @0xrusowsky
* feat(cast): add --file option for decode-calldata (#11201) by @minhd-vu
* feat(cast) more descriptive errors for `gcp` & `aws` signers (#11248) by @siosw
* feat(cast): wallet new - enable default keystore  (#9201) by @kien6034
* feat(cast): add abi-encode-event command (#11300) by @shiyasmohd
* feat(cast): support base + offset for storage slot calc (#11566) by @0xferrous
* feat(cast): add --data --from-file --no-hash options for `wallet verify` for feature parity with `wallet sign` (#11646) by @Detoo
* feat(cast): handle invalid JSON in recover-authority without panic (#11690) by @VolodymyrBg
* feat(cast): apply network precompiles for cast run and call (#11720) by @grandizzy
* feat: cast storage `--solc-version` CLI argument (#11321) by @zugdev
* Add cast command to convert beacon payload to execution payload `b2e-payload` (#11629) by @lean-apple
* feat: add trace transaction opts (#11781) by @kien603

## Cast Fixes

* fix(`cast`): unknown signatures are cached as an empty string (#11127) by @zerosnacks
* fix(cast): use all providers if local artifacts used (#11090) by @grandizzy
* fix(cast): improve handling of `mktx --raw-unsigned` with runtime validation (#11111) by @mablr
* fix(cast): allow negative numbers for function call arguments (#11221) by @0xferrous
* fix: small cast call fixes (#11241) by @klkvr
* fix(cast): add missing GCP signers listing in wallet list command (#11243) by @Forostovec
* fix: split on whitespace in mnemonic parsing (#11257) by @anim001k
* Fix/cast abi strict args (#11189) by @simon0820s
* fix(cast): calldata-decode --json nested tuple formatting (#11212) by @minhd-vu
* fix(cast): apply contract code size limit in cast run (#11400) by @grandizzy
* fix(cast): correct error message for --ends-with hex parsing (#11549) by @Forostovec
* fix(cast): allow comma-separated values for overrides (#11553) by @grandizzy
* Fix: Replace unsafe mnemonic fallback with secure random generation (#11644) by @viktorking7
* chore(cast): avoid panic when decoding constructor args and add bounds check (#11700) by @MozirDmitriy

## Forge Features

* feat: add linking error (#9610) by @9547
* feat(forge): add params natspec for enums (#10022) by @samooyo
* feat(forge-lint): \[claude] check for unwrapped modifiers  (#10967) by @0xClandestine
* feat(forge): "add" alias for install subcommand (#11124) by @mablr
* feat(script): additional contracts name in broadcast log (#11197) by @grandizzy
* feat(`cheatcodes`): decode and show mismatched params on expectEmit (#11098) by @yash-atreya
* feat(`invariants`): sample typed storage values (#11204) by @yash-atreya
* feat(cheats): setup config env vars (#11236) by @0xrusowsky
* feat(cheatcodes): Revert ffi on non-zero exit code (#11101) by @mutestt
* feat(forge-inspect): add option to wrap tables to terminal width (#11138) by @0xferrous
* feat(`cheatcodes`): add contract identifier to state diffs (#11214) by @yash-atreya
* feat(`cheatcodes`): add nonce diffs to AccountStateDiffs (#11215) by @yash-atreya
* feat(`cheatcodes`): include slot type and decode values in state diffs (#11276) by @yash-atreya
* feat(`cheatcodes`): getStorageAccesses (#11296) by @yash-atreya
* feat(forge): Remove proptest runner from fuzzed tests (#11061) by @grandizzy
* feat(lint): add UnsafeTypecast lint (#11046) by @TropicalDog17
* feat(cheatcodes): Add vm.signWithNonce(privateKey, digest, nonce) cheatcode (Crypto) (#11267) by @Ectario
* feat(forge-selectors-list): add --no-group option (#11270) by @0xferrous
* feat(config): toml inheritance support (#11284) by @0xrusowsky
* feat(cheats): support arrays + rename `read` + resolve env vars (#11302) by @0xrusowsky
* feat: added fake sig in executor (#11308) by @Soubhik-10
* feat(lint): mixedCase exceptions (#11330) by @0xrusowsky
* feat(lint): geiger (#11377) by @0xrusowsky
* feat(config): support numeric keys in `[fork.<chain>]` section (#11340) by @0xrusowsky
* feat(fuzz): add bound and gaussian noise mutators (#11342) by @grandizzy
* feat: refactor precompiles decoding, show output (#11382) by @DaniPopes
* feat: add nushell completions (#11311) by @0xferrous
* feat(cheatcodes): decode structs and mappings in state diff output (#11331) by @yash-atreya
* feat!(cheats): deprecate `readFork` cheatcodes (#11407) by @0xrusowsky
* feat(`forge`): add `--vyper` to `forge init` to start with a Vyper project (#11383) by @zerosnacks
* feat(forge): add --disable-labels for forge script and test (#11412) by @wellnana
* feat(forge): loosen tx gas limit restrictions ahead of Osaka + make enforceable w/ `--enable-tx-gas-limit` (#11427) by @zerosnacks
* feat(forge verify-contract): update Sourcify integration to support API v2 (#11438) by @manuelwedler
* feat(cheats): json/toml --> consolidate `write` and `writeUpsert` (#11447) by @0xrusowsky
* feat(forge): add md flag to support markdown table styling (#11478) by @mablr
* feat: switch solar\_project to use cache (#11481) by @DaniPopes
* feat(`forge`): backtraces (#11547) by @yash-atreya
* feat(lint): impl erc20 transfer check using HIR (#11552) by @0xrusowsky
* feat(forge): add --empty to forge init (#11554) by @aganisgash
* feat(common): identify bytes and string slots using storageLayout (#11476) by @yash-atreya
* feat: make `find_by_deployed_code_exact` smarter (#11560) by @klkvr
* feat(cheatcodes): vm.getStorageSlots (#11537) by @yash-atreya
* feat(coverage): analyze with solar (#11565) by @DaniPopes
* feat(forge): introduce network custom features, sunset Odyssey (#11675) by @grandizzy
* feat(forge): deprecate `generate` (#11723) by @DaniPopes
* feat(lint): fail on configured diagnostic level (#11445) by @0xrusowsky
* feat(forge-inspect): add ability to inspect libraries (#11732) by @0xferrous
* feat: add --use and --no-auto-detect flags to verify-contract (#11743) by @Galoretka
* feat(fmt): rewrite formatter using Solar and a structured algorithm (#10907) by @0xrusowsky
* feat(forge): no warning on external config sections (#11869) by @grandizzy
* feat(config): warn on unknown config keys in foundry.toml (#11816) by @TropicalDog17
* feat: struct initializer lint (#11892) by @onbjerg
* feat(fmt): solar bump + handle cmnts in non-informed params (#11901) by @0xrusowsky

## Forge Fixes

* fix(forge): init a git repo at root during init unless explicitely stated (#9695) by @0xvv
* fix: force 4844 txtype in blobhashes setter (#11355) by @mattsse
* fix: only save sig cache on last drop (#11153) by @DaniPopes
* fix(forge): consistent handling unresolved imports (#11164) by @grandizzy
* fix(lint): exclude disabled ids in multi-lint passes (#11122) by @0xrusowsky
* fix: use empty 7702 auths (#11182) by @mattsse
* fix(forge): bump compilers to fix remapping sol file (#11184) by @grandizzy
* fix(coverage): disambiguate duplicate function names (#11188) by @DaniPopes
* fix(forge): improve error messages for etherscan verification failures (#11194) by @shiyasmohd
* fix(lint): disable unwrap-modifier-logic for assembly (#11205) by @0xrusowsky
* fix(lint): explicit message when lint on build failures (#11224) by @grandizzy
* fix(fmt): don't panic on stdin read failure (#11226) by @DaniPopes
* fix(lint): account codesize registered lints (#11228) by @grandizzy
* fix: set gas\_price to None for EIP4844 and EIP7702 in essentials() (#11233) by @Fibonacci747
* fix(`forge script`): repeated `vm.createSelectFork` with same RPC causes segfault (#11250) by @zerosnacks
* fix(forge): makes forge script match correctly `run` function signature from source (#11244) by @mablr
* fix(lint): lint only files that we build (#11247) by @grandizzy
* fix: correct error message in Fork command (#11254) by @radik878
* fix(cheats): solc:0.6 compatible fork cheats (#11280) by @0xrusowsky
* fix(script): safely derive filename from calldata (#11291) by @fifalodm
* fix(forge): enable fail fast flag (#11328) by @grandizzy
* fix: disable tx gas limit cap (#11347) by @mattsse
* fix(lint): 'unwrapped-modifier-logic' incorrectly marked with `Severity::Gas` (#11358) by @srdtrk
* fix(forge): write ordered deps in foundry.lock (#11360) by @grandizzy
* fix(forge): handle error if etherscan identifier cannot resolve config (#11356) by @grandizzy
* fix(invariant): ensure strategy always generates valid sender (#11370) by @grandizzy
* fix(common): manually handle `DynSolValue` json serialization (#11396) by @0xrusowsky
* fix: canonicalize paths in `forge doc` (#11406) by @onbjerg
* fix(forge): provide better error messages for spurious cache failures in inspect (#11422) by @DaniPopes
* fix(`forge`): sync branch with remote on update (#11401) by @yash-atreya
* fix(`cheatcodes`): identify common proxies in state diffs (#11404) by @yash-atreya
* fix(forge): deterministic fn flatten (#11421) by @grandizzy
* fix(forge): populate the git submodule url from git config (#11437) by @wellnana
* fix(coverage): contracts by artifact from linked contracts (#11440) by @grandizzy
* feat(`invariants`): use `SlotIdentifier` for identifying complex types and sampling them (#11450) by @yash-atreya
* fix(forge): persist corpus per test suite (#11469) by @grandizzy
* fix(lint): avoid ANSI chars with JSON emitter (#11470) by @0xrusowsky
* fix: find\_git\_root allows any .git (#11525) by @DaniPopes
* fix(`forge lint`): add `URI` (e.g. `tokenURI` from ERC721 / ERC6909) as exception to `mixed-case-function` (#11533) by @zerosnacks
* fix: Shell deadlock 2 (#11535) by @DaniPopes
* fix(forge): skip scripts in get\_sources\_to\_compile (#11540) by @DaniPopes
* fix(forge): show logs and coverage for table tests (#11575) by @grandizzy
* fix(cheatcodes): lock files on reads / writes (#11590) by @grandizzy
* fix: persist auth items during simulation (#11601) by @onbjerg
* fix: inline config path (#11626) by @DaniPopes
* fix(common): incorrect error message in get\_error (#11631) by @Snezhkko
* fix(forge): color bug in `Display` impl for  `TestResult` (#11635) by @mablr
* fix(release): install cross from main, pin rev (#11649) by @grandizzy
* fix(forge): ensure broadcast account is touched (#11650) by @grandizzy
* fix(forge): update only the specific dep (#11588) by @grandizzy
* fix(forge): custom verifiers should not throw on unknown etherscan chains (#11442) by @grandizzy
* fix(forge): determine if broadcasted tx is fixed gas limit using opcodes (#11599) by @grandizzy
* fix(cheatcodes): expectEmit(count: 0) should not fail on a different log (#11663) by @yash-atreya
* fix: properly format markdown lists in @dev NatSpec tags (#11696) by @CreeptoGengar
* fix(forge): don't check Cargo.toml on module bindgen (#11704) by @DaniPopes
* fix(`verification`): BSC chain id is incorrect, verification fails with `missing or unsupported chainid parameter` (#11716) by @zerosnacks
* fix(forge): Add unused\_attributes to allow list for generated bindings (#11725) by @AndreasKoestler
* fix: bump to `alloy-chains` `0.2.11` for Katana urls update (#11728) by @zerosnacks
* fix(common): use proper ESC in spinner erase-line sequence (#11733) by @VolodymyrBg
* fix(forge): decrement runs when fuzz input rejected (#11791) by @grandizzy
* fix(fmt): underscore for hex literals (#11822) by @0xrusowsky
* fix(fmt): estimate size + account for all blocks (#11824) by @0xrusowsky
* fix(forge): use global json arg everywhere (#11860) by @mablr
* fix(fmt): don't break exprs that overflow but fit assignement (#11837) by @0xrusowsky
* fix(fmt): indent calls with single member that fits but breaks when args (#11854) by @0xrusowsky
* fix(lint): allow custom types in "constant fn getters" (#11866) by @0xrusowsky
* fix(forge): support broadcast from `vm.deployCode` (#11864) by @grandizzy
* fix(fs): flush BufWriter after GzEncoder::finish() in write\_json\_gzip\_file (#11827) by @sashass1315
* fix(fmt): account for CRLF when handling cursor (#11874) by @0xrusowsky
* fix(prevrandao not set): support gnosis network (#11877) by @chen4903
* fix: inline config locations (#11883) by @DaniPopes
* fix(verify): handle missing optimizer\_runs mismatch message (#11885) by @Bilogweb3
* fix(common): avoid panic on invalid calldata selector by propagating parse error (#11888) by @radik878
* fix(fmt): always return formatted when source read from stdin (#11876) by @grandizzy
* fix(forge): same way to flatten for all commands (#11873) by @grandizzy
* fix(fmt): `fn estimate_size()` account for opening brackets (#11887) by @0xrusowsky
* fix: normalize path separators in git submodule URL lookup (#11826) by @wellnana
* fix: only include item's source in docs (#11895) by @onbjerg
* fix(fmt): return formatted code when stdin and `--raw` (#11900) by @grandizzy
* fix(coverage): filter out vyper sources (#11899) by @grandizzy
* fix(evm): correct favored threshold comparison (#11902) by @MozirDmitriy
* fix(fmt): avoid blank line before identifiers (#11908) by @0xrusowsky
* fix(coverage): filter vy and vyi (#11909) by @0xrusowsky
* fix(fmt): rustfmt-like blank lines in stmt blocks (#11914) by @0xrusowsky
* fix(forge): do not warn on backward compatible `solc_version` config (#11916) by @grandizzy
* fix(forge): 1.4 backport replay fuzz failure only if same test selector (#11947) (#11949) by @grandizzy
* fix(chisel & doc): backport v1.4 rc3 fixes (#11991) by @grandizzy

## Other

* feat(npm): publish forge to `npm` for each arch (#11047) by @o-az
* Remove the --froms flag (#11099) by @CodeSandwich
* chore: more StackInspector cleanups (#11105) by @DaniPopes
* chore: update package.homepage (#11131) by @DaniPopes
* fix: tracy integration (#11135) by @DaniPopes
* chore: use Bytes::clone where possible (#11160) by @DaniPopes
* chore: clean up cheatcode assertions (#11161) by @DaniPopes
* chore: add some more instrumentation (#11157) by @DaniPopes
* chore(cheatcodes): avoid unnecessary lookup in store (#11163) by @DaniPopes
* chore: make all random cheatcodes view (#11166) by @DaniPopes
* chore(`benches`): latest bench (#11162) by @yash-atreya
* chore: don't build an inspector stack (#11154) by @DaniPopes
* chore(coverage): improve debug report (#11190) by @DaniPopes
* Complete doc comment for BlockListener struct (#11092) by @Galoretka
* chore: add missing error mapping (#11191) by @TiesD
* chore: rm crate from typos.toml (#11203) by @DaniPopes
* chore: disable useless logs from env\_filter (#11206) by @DaniPopes
* chore(chisel): remove unused Debug import from executor.rs (#11255) by @Snezhkko
* fix: correct typos in error message (#11271) by @Sharilleed223
* fix: make manpage download truly optional in foundryup installer (#11262) by @maradini77
* fix(docs): correct minor typo in README.md (#11181) by @shiyasmohd
* chore(docker): bump alpine version to 3.22 (#11273) by @lystopad
* chore: aggregate PRs: #10038, #11139, #11274, #11246 (#11279) by @DaniPopes
* chore: clearer error message when function signature does not contain parentheses (#9478) by @yipu3
* feat: accept ETH\_RPC\_URL env as fork-url alias (#8972) by @CodeSandwich
* chore: aggregate PRs (#11286) by @DaniPopes
* chore: more unnecessary logs (#11287) by @DaniPopes
* refactor(verify): remove redundant logging in Etherscan provider (#11048) by @crStiv
* chisel/runner: skip redundant call\_raw when commit=true (#11258) by @sashass1315
* chore: use slices in INTERESTING\* (#11305) by @DaniPopes
* chore: validate address and word mutations (#11306) by @grandizzy
* chore: fix foundry-macros warnings (#11303) by @DaniPopes
* chore: aggregate PRs (#11310) by @DaniPopes
* chore(deps): bump to revm 28 (#11217) by @zerosnacks
* chore(deps): bump all dependencies (#11349) by @DaniPopes
* chore: use get\_or\_calculate\_hash better (#11350) by @DaniPopes
* feat: Remove unneeded TODO in EtherscanIdentifier (#11385) by @aganisgash
* ci: enable testing for aarch64 linux (#11386) by @DaniPopes
* test(cheatcodes): strings with \{} are not roundtrippable (#11391) by @DaniPopes
* chore(cheatocodes): remove as\_debug (#11395) by @DaniPopes
* chore(docs): mention keystore in wallet error message, improve readability (#11405) by @zerosnacks
* build: add test-coverage script (#10894) by @ryzhak
* chore(deps): bump to revm 29 (#11416) by @zerosnacks
* ci: add --no-fail-fast (#11419) by @DaniPopes
* chore(anvil): get rid of trait upcasting workaround (#11424) by @mablr
* chore: Fix Mutability Tags for Cheatcodes that are Missing Them (#10351) by @Mouzayan
* chore: add lint test for constant params (#11425) by @grandizzy
* chore: extract fetch\_abi\_from\_etherscan and use \&Config (#11426) by @DaniPopes
* ci: drop force\_orphan (#11452) by @DaniPopes
* ci: use actions/\* directly for deploying rustdocs (#11454) by @DaniPopes
* chore(forge eip712): use solar from compiler output (#11458) by @DaniPopes
* docs: fix merkle rpc url (#11459) by @onbjerg
* Revert "docs: fix merkle rpc url" (#11462) by @zerosnacks
* chore: reduce some more traces (#11465) by @DaniPopes
* chore(test-utils): `TestProject::add_*` internal `unwrap()` (#11467) by @mablr
* chore: check timestamp value before fmt (#11475) by @mattsse
* chore(common): rmv duplicate `comments.rs` (#11480) by @0xrusowsky
* chore(deps): bump alloy-evm 0.20 + alloy-hardforks 0.3 (#11477) by @zerosnacks
* refactor: `get_sources_to_compile` (#11464) by @DaniPopes
* chore: align error messages with boundary conditions (#11468) by @Sharilleed223
* chore: deprecate Etherscan V1 (#11387) by @zerosnacks
* chore: improve test debugging (#11523) by @DaniPopes
* chore(config): rm dapptools method (#11527) by @DaniPopes
* chore: tweak `npm` publish & handle `nightly` releases (#11513) by @o-az
* refactor(chisel): refactor crate (#11500) by @DaniPopes
* test: redact test which may install solc (#11534) by @DaniPopes
* refactor(common): remove `ReportKind` struct (#11511) by @mablr
* chore(evm): re-use project output in SourceData (#11541) by @DaniPopes
* Update to soldeer 0.7.0  (#11543) by @mario-eth
* fix: workflow event conclusion (#11544) by @o-az
* Update documentation for transaction hash fetching (#11546) by @ritzdorf
* chore(config): figment provider clean up (#11539) by @DaniPopes
* chore: fix isolate workflow, exclude state diff (#11558) by @grandizzy
* chore(meta): add missing alloy patches (#11581) by @DaniPopes
* Fix panic on NaN/Inf values in TOML to JSON conversion (#11574) by @prestoalvarez
* refactor(deps): reuse aws and gcp package from alloy (#11573) by @TropicalDog17
* chore: aggregate PRs (#11597) by @DaniPopes
* chore: switch node (#11602) by @grandizzy
* chore(`ci`): enable CodeQL (#11604) by @zerosnacks
* Fix CRLF line ending handling in stdin utilities (#11606) by @sashaodessa
* chore(sol\_macro\_gen): remove unlinked bytecode workaround (#11613) by @mablr
* chore: proper ws (#11621) by @grandizzy
* chore(lint): re-use project output (#11563) by @DaniPopes
* chore: use Cursor::with\_position (#11627) by @DaniPopes
* refactor: extract inline config from lint (#11620) by @DaniPopes
* chore: replace anvil delegation capability types with alloy's (#11610) by @TropicalDog17
* chore(common): deprecate ProjectCompiler::verify and fix compile\_target docs (#11636) by @radik878
* chore: remove klkvr from CODEOWNERS (#11657) by @klkvr
* feat: harden `npm` publish & make installer leaner (#11600) by @o-az
* chore: bump version 1.3.6 (#11658) by @grandizzy
* fix(release): build docker images with cargo instead cross (#11659) by @grandizzy
* chore(common): add serde skip for compute\_units\_per\_second in EvmArgs (#11662) by @Forostovec
* chore: check compatibility of evm\_version and solc (#11418) by @wellnana
* chore: fix ci, remove unwrap on test (#11666) by @grandizzy
* chore(common): clean RuntimeTransport derive and remove dead LockError (#11669) by @Galoretka
* chore(anvil): Remove stale TODO in optimism deposit test (#11678) by @phrwlk
* fix: remove explicit darwin SDK from flake.nix as it's deprecated (#11684) by @shekhirin
* feat(debugger): remove dead tick polling; use blocking read and forward (#11674) by @GarmashAlex
* refactor: remove event loop from debugger (#11686) by @onbjerg
* chore(`ci`): harden ci + harden default workflow templates + pin actions on hash (#11676) by @zerosnacks
* fix: request ABI in solar\_project (#11697) by @DaniPopes
* chore(`ci`): fix release workflow (#11699) by @zerosnacks
* chore(lint): correctly show solar errors (#11713) by @DaniPopes
* chore: deprecate `generate-fig-spec` commands; use `completions fig` (#11727) by @mablr
* refactor(cli): move `EvmArgs` to foundry\_cli (#11741) by @mablr
* chore(deps): drop foundry-compilers feature full (#11739) by @DaniPopes
* chore: pass project root to spinner (#11740) by @SWASTIC-7
* chore: fix cargo deny, bump ammonia (#11749) by @grandizzy
* chore: move `clap.rs` from `foundry-common` to `foundry-cli` (#11747) by @Peponks9
* refactor(anvil): replace `DepositReceipt` withl `op-alloy`'s (#11640) by @ongyimeng
* Fix: Secure temporary file creation in chisel edit\_session (#11744) by @zeevick10
* chore: don't depend on config in common (#11756) by @DaniPopes
* Harden foundryup temp handling: secure mktemp and quote tar paths (#11771) by @viktorking7
* refactor: move `handle_traces` into `cast` (#11775) by @onbjerg
* test: improve linker test infra (#11778) by @DaniPopes
* test: extract get\_compiled to utils (#11779) by @DaniPopes
* chore: bump alloy crates to 1.36 (#11788) by @lean-apple
* refactor: rm forge-fmt from foundry-cli (#11790) by @onbjerg
* Update to soldeer 0.7.1 (#11811) by @mario-eth
* docs(cast): add description for `cast rpc --decode-internal` (#11825) by @wellnana
* chore: remove fig (#11830) by @onbjerg
* chore(anvil): fixed broken link (#11858) by @cypherpepe
* Update to soldeer 0.8.0 (#11863) by @mario-eth
* refactor: move breakpoints to foundry-evm-core (#11889) by @onbjerg
* fix: use sourcify for selector lookups (#11757) by @onbjerg
* Improve remote wallet --help commands (#11891) by @albertlai431
* docs: explicitly mark `forge geiger` deprecated (#11893) by @onbjerg
* chore(chisel): remove unused EtherscanABIResponse and serde import (#11911) by @radik878
* chore: restore openchain support (#11915) by @grandizzy

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.3.6...v1.4.0-rc1

## v1.3.6 (2025-09-16)

# Foundry v1.3.6

Foundry v1.3.6 is a bugfix release for forge.

## Forge Fixes

* fix(forge): ensure broadcast account is touched (#11661) by @grandizzy

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.3.5...v1.3.6

## v1.3.5 (2025-09-08)

# Foundry v1.3.5

Foundry v1.3.5 is a bugfix release for cast state overrides.

## Cast Fixes

* fix(cast): allow comma-separated values for overrides (#11577 ) by @grandizzy

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.3.4...v1.3.5

## v1.3.4 (2025-09-03)

# Foundry v1.3.4

Foundry v1.3.4 is a bugfix release.

## Forge Fixes

* fix: bump version v1.3.4 (#11529 ) by @grandizzy

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.3.3...v1.3.4

## v1.3.3 (2025-08-29)

# Foundry v1.3.3

Foundry v1.3.3 is a bugfix release for forge.

## Forge Fixes

* fix(forge): do not throw if etherescan api key set and unknown chain (#11444) by @grandizzy

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.3.2...v1.3.3

## v1.3.2 (2025-08-21)

# Foundry v1.3.2

Foundry v1.3.2 is a bugfix release for forge.

## Forge Fixes

* fix(lint): explicit message when lint on build failures (#11224) by @grandizzy
* fix(lint): lint only files that we build (#11247) by @grandizzy
* fix: force 4844 txtype in blobhashes setter (#11355) by @mattsse
* fix(forge): handle error if etherscan identifier cannot resolve config (#11356) by @grandizzy
* fix: disable tx gas limit cap (#11347) by @mattsse
* fix(forge): write ordered deps in foundry.lock (#11360) by @grandizzy
* fix(invariant): ensure strategy always generates valid sender (#11370) by @grandizzy
* fix(forge): do not panic on checkpoint revert (#11380) by @grandizzy

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.3.1...v1.3.2

## v1.3.1 (2025-08-12)

# Foundry v1.3.1

Foundry v1.3.1 is a bugfix release for anvil, cast and forge.

## Anvil Fixes

* fix(anvil): unwrap panic in eth/backend/mem/mod.rs (#11141) by @zerosnacks
* fix: use empty 7702 auths (#11182) by @mattsse

## Cast Fixes

* fix(cast): use all providers if local artifacts used (#11090) by @grandizzy
* fix(cast): improve handling of mktx --raw-unsigned with runtime validation (#11111) by @mablr

## Forge Fixes

* fix(forge): consistent handling unresolved imports (#11164) by @grandizzy
* fix(lint): exclude disabled ids in multi-lint passes (#11122) by @0xrusowsky
* fix(forge): bump compilers to fix remapping sol file (#11184) by @grandizzy
* fix(coverage): disambiguate duplicate function names (#11188) by @DaniPopes
* fix(forge): set state changes journal in active fork (#11196) by @grandizzy
* fix(forge): improve error messages for etherscan verification failures (#11194) by @shiyasmohd
* fix(fmt): don't panic on stdin read failure (#11226) by @DaniPopes
* fix(forge script): repeated vm.createSelectFork with same RPC causes segfault (#11250) by @zerosnacks

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.3.0...v1.3.1

## v1.3.0 (2025-07-31)

# Foundry v1.3.0

This release includes support for `forge lint`, time-based campaigns and coverage-guided fuzzing for invariant tests, table tests, fork test improvements for [Reth clients](https://github.com/paradigmxyz/reth), and new EIP-712 features. Foundry v1.3.0 is built on top of the latest [`revm v27`](https://github.com/bluealloy/revm) Foundry v1.3.0 is built on top of the latest revm v27 and comes with an improved `foundryup` installer.

\:warning: It is highly recommended to update to latest version of `foundryup`, which avoids unnecessary downloads and verifies hashes of downloaded binaries upon install. You can update your installation by running: `foundryup --update`.

## Performance Improvements

* This release includes an updated [`revm`](https://github.com/bluealloy/revm) (#11079) and an optimized inspector stack (#11077), which enhances Forge test performance by up to 21.50% [compared to previous versions](https://github.com/foundry-rs/foundry/blob/release-1.3.0/benches/LATEST.md)

#### Forge Test

| Repository           | v1.2.3  | v1.3.0  |
| -------------------- | ------- | ------- |
| ithacaxyz-account    | 3.69 s  | 3.12 s  |
| solady               | 2.95 s  | 2.32 s  |
| Uniswap-v4-core      | 8.03 s  | 6.76 s  |
| sparkdotfi-spark-psm | 57.02 s | 44.76 s |

#### Forge Fuzz Test

| Repository           | v1.2.3 | v1.3.0 |
| -------------------- | ------ | ------ |
| ithacaxyz-account    | 3.58 s | 3.39 s |
| solady               | 3.34 s | 2.54 s |
| Uniswap-v4-core      | 8.03 s | 7.46 s |
| sparkdotfi-spark-psm | 3.70 s | 3.06 s

* Forked tests using the [Reth client](https://github.com/paradigmxyz/reth) are now faster thanks to the `eth_getAccountInfo` API (#10496 #10838), reducing account data fetching from three requests to one. Foundry detects if `eth_getAccountInfo` is available and falls back to the legacy method otherwise.\
  Example: Running `forge test --mt statefulFuzz_curve_test` on [spark-alm-controller](https://github.com/sparkdotfi/spark-alm-controller/pull/107) showed over 5 seconds in test time savings.

| Provider                                      | Response Time |
|----------------------------------------------|---------------|
| reth-ethereum.ithaca.xyz (with `eth_getAccountInfo`)    | 45.21s        |
| reth-ethereum.ithaca.xyz (without `eth_getAccountInfo`) | 50.83s        |
| QuickNode (Paid)                             | 59.66s        |
| Alchemy (Free Tier)                          | 182.12s       |
| Infura (Free Tier)                           | 176.88s       |

## Forge Lint

As of v1.3.0, Forge ships with a built-in linter (#10405) that analyzes Solidity code for style, correctness, and best practices.

* Lint rules are configurable in the `[lint]` section of `foundry.toml` and via inline comment directives.
* Lints can be customized by severity or specific rule identifiers.
* By default, linting runs during `forge build`. To disable it, set `lint_on_build = false`.
* For more details please refer to foundry docs:\
  [Supported lints](https://getfoundry.sh/forge/reference/forge-lint/#supported-lints)\
  [Linter configuration docs](https://getfoundry.sh/config/reference/linter)\
  [How to contribute a lint rule](https://github.com/foundry-rs/foundry/blob/master/docs/dev/lintrules.md)

## Invariant Test Improvements

### Time-Based Campaigns

Previously, invariant tests were limited by a fixed number of runs (default: `256`, max: `4294967295`).\
Now you can run them for a specific time duration by setting the `timeout` value (in seconds) in the `[invariant]` section of `foundry.toml` (#10190).

The test progress bar shows the number of runs and the end time.

```bash
test/GuidedTest.t.sol:CounterTest
 → invariant_Puzzle5: [4360] Runs, ends at 11:03:28 2025-06-03 UTC
 → invariant_Puzzle3: [8784] Runs, ends at 14:50:08 2025-06-04 UTC
 → invariant_Puzzle6: [77762] Runs, ends at 05:56:48 2025-06-09 UTC
 → invariant_Puzzle2: [8739] Runs, ends at 12:50:08 2025-06-02 UTC
```

### Coverage-Guided Fuzzing

Enable this mode by setting a path to `corpus_dir` in your invariant config (#10190).\
The coverage-Guided fuzzing mode targets a `corpus_min_size` by mutating entries a number of times (default: 5), favoring those likely to uncover new paths.

**Supported mutations:**

* `splice`: Combines two sequences
* `interleave`: Weaves two sequences together
* `prefix`: Overwrites the beginning of a sequence
* `suffix`: Overwrites the end of a sequence
* `mutate args`: Randomizes some call arguments

Additional notes:

* Entries that generate new coverage are saved to disk (default: `.gz`; set `corpus_gzip = false` to save as JSON).
* On reruns, the saved corpus is loaded and reused.
* Metadata (as JSON) is persisted for evicted corpus entries. This includes a unique ID, mutation count, and coverage improvements.
* The fuzzing progress bar displays metrics for cumulative edges and features, corpus count and number of favored entries.

```bash
test/forge/invariant/StaticInvariantTest.sol:StaticInvariantTest
 → invariantHealthy: [60/2000] Runs
  - cumulative edges seen: 41
  - cumulative features seen: 6
  - corpus count: 15
  - favored items: 14
```

For more details please refer to [invariant docs](https://getfoundry.sh/forge/advanced-testing/invariant-testing#coverage-guided-fuzzing).

## Table Tests

Foundry v1.3.0 comes with support for table testing (#10775), which enables the definition of a dataset (the "table") and the execution of a test function for each entry in that dataset. This approach helps ensure that certain combinations of inputs and conditions are tested.\
For more details please refer to [table testing foundry docs](https://getfoundry.sh/forge/advanced-testing/table-testing).

## Improved EIP-712 support

Foundry v1.3.0 comes with additional utilities (commands and new cheatcodes) to make it easy and reliable to work with EIP-712 signatures (#10510).\
For more details please refer to [EIP-712 foundry guide](https://getfoundry.sh/guides/eip712/).

## Other

* new Anvil APIs including endpoints to deal and set allowance for ERC20 tokens, add balance and get blob by hash
* Vyper support for `forge verify-contract` command
* `fail_on_revert` config for stateless fuzz tests

## Anvil Features

* feat(anvil): add block context overrides for eth\_call and eth\_estimateGas (#10487) by @mablr
* feat: added rpc method to deal ERC20 tokens (#10495) by @Soubhik-10
* feat: implement add\_balance endpoint (#10636) by @pistomat
* feat: Add anvil set erc20 allowance endpoint (#10746) by @pistomat
* feat: added eth\_sendRawTransactionSync and eth\_sendTransactionSync support for anvil (#10860) by @Rimeeeeee
* feat(`anvil`): reset to in-mem (#10897) by @yash-atreya
* feat: added get\_blob\_by\_hash (#10987) by @Soubhik-10
* feat: add support for passthrough of debug\_codeByHash (#11053) by @cakevm
* feat(anvil): use signatures identifier for --print-traces (#11070) by @mattsse

## Anvil Fixes

* fix(anvil): guard against the blockchain advancing while checking latest block (#10714) by @alexghr
* bug(anvil): incorrectly adds +1 gas when estimating transactions with explicit empty data field (#10786) by @gitToki
* fix(`anvil`): inject the P256 precompile for `--odyssey` upon EVM construction and fix `NotActivated` error for `--optimism` (#10567) by @zerosnacks
* fix(`anvil`): latest evm version should be prague (#10653) by @yash-atreya
* fix: populate missing fields for eth simulate (#10682) by @mattsse
* fix: receipt conversion (#10853) by @mattsse
* fix: spawn state writer blocking (#10922) by @mattsse
* fix: dont check pool for gettransaction receipt (#10946) by @mattsse
* fix: use correct mix hash for header (#10951) by @mattsse
* fix: use existing functions for accountinfo (#11134) by @mattsse
* fix(anvil): unwrap panic in eth/backend/mem/mod.rs (#11141) by @zerosnacks

## Cast Features

* feat: add cast da-estimate (#10588) by @mattsse
* feat(cast mktx): add support for "--ethsign" option (#10641) by @mablr
* feat(cast): add `--cost` for  `estimate` to return the eth cost at current gas price (#9687) by @0xvv
* feat(cast): display public\_key on wallet creation with "new" and "new-mnemonic" sub-commands (#10600) by @mablr
* feat(cast): Verbose signing output (#10529) by @GregTheGreek
* feat(cast): `compute_address` add support CREATE2 addresses (#10783) by @mablr
* feat: added block.time and block.number override in cast (#10727) by @Soubhik-10
* feat(cast): add recover-authority for EIP7702 Authorization (#10839) by @jsvisa
* cast: Improve debugger when tracing on-chain transactions/calls (#10596) by @ngotchac
* feat(cast): print a warning on calling a contract without code (#10842) by @ryzhak
* feat(cast): add flag to disable HTTPS certificate validation for RPC (#10869) by @mablr
* feat(cast): add flag to disable alias (#10924) by @varun-doshi
* feat(cast): rpc --json should format as json (#10871) by @jsvisa
* feat(cast): add disable-labels for cast run (#10970) by @grandizzy
* feat(cast): add `--raw` option to block subcommand (#11027) by @mablr
* feat(cast): add checksum address with chain id (#11043) by @KumaCrypto

## Cast Fixes

* fix(`cast`): respect `full` arg in `cast block` (#10536) by @mattsse
* fix: check for auth when deriving legacy (#10619) by @mattsse
* fix(cast): read all lines for message to hash (#10671) by @grandizzy
* fix: always update auth txenv var (#10707) by @mattsse
* fix(cast): do not use default overrides if no override arg (#10710) by @grandizzy
* fix(cast call/estimate/send): omit function selector from arguments on create calls (#10948) by @nuntax
* fix(cast): disassembler PC & end of code push padding (#10520) by @Philogy
* fix(`cast`): include zero address as known system sender in cast run (#10608) by @yash-atreya
* fix: make sign and verify symmetrical (#10614) by @mattsse
* fix: check for op deposit tx when handling cast tx (#10742) by @mattsse
* fix: Respect `--override-*` flags on `cast call` with `--trace` flag (#10721) by @Yen
* fix(cast): Always use from field of getTransaction rpc response in cast run (#10795) by @ckoopmann
* fix(`cast`): bump alloy-chains to 0.2.5 for Ethereum V2 API compatility w/ `cast` (#10912) by @zerosnacks
* fix(cast): account state diffs overrides (#10982) by @grandizzy

## Chisel Fixes

* fix(chisel): memory data location for string and bytes params (#10729) by @grandizzy

## Forge Features

* feat(forge): revert diagnostic inspector (#10446) by @0xrusowsky
* feat(forge): forge lint (#10405) by @0xrusowsky
* feat(forge): eip712 cheatcodes + forge cmd (eip712 + bind-json) with solar (#10510) by @0xrusowsky
* feat(forge vb): creation code from tx trace (#10751) by @grandizzy
* feat(`dependencies`): support pinning of tags / revs when using `.gitmodules` with `foundry.lock` (#9522) by @yash-atreya
* feat(forge): cheatcodes to crosschain sign and attach delegation (#10518) by @grandizzy
* feat(forge inspect): Add standard-json as inspect output field (#10537) by @2xic
* feat(script): keep script / tx timestamp as milis instead seconds (#10711) by @grandizzy
* feat(`forge`): run lint on forge build (#10748) by @yash-atreya
* feat(forge): table tests (#10775) by @grandizzy
* feat: add useSeed cheatcode to set RNG seed (#10698) by @Another-DevX
* feat(forge): `--exclude-tests` option from coverage (#10807) by @grandizzy
* feat(forge): coverage guided fuzzing & time based campaigns for invariant mode (#10190) by @0xalpharush
* feat(fmt): dprint for toml, json, md, dockerfile, ts, & yml (#10824) by @o-az
* feat(forge lint): disable lints with inline comment (#10776) by @0xrusowsky
* feat(cheatcodes): extend usable range in `assertApproxEqRel` (#10758) by @beeb
* feat(forge-lint): \[claude] unchecked calls (#10810) by @0xrusowsky
* feat(forge lint): unused imports (#10662) by @0xrusowsky
* feat(forge build): cache project selectors by default (#10651) by @mablr
* feat: added disable-code-size-limit flag in forge script (#10661) by @Soubhik-10
* feat: add mesc chainid lookup (#10927) by @mattsse
* feat(forge): support vyper contract verification in `forge verify-contract` (#10864) by @Another-DevX
* feat(forge): apply fail\_on\_revert for fuzz tests too (#10941) by @grandizzy
* feat(forge): add support for repository-path in forge doc (#10879) by @nitininhouse
* feat: fuzzer metrics (#10988) by @0xalpharush
* feat(forge-lint): new `LateLintPass` + support code snippets (#10846) by @0xrusowsky
* feat(forge fmt): Adds tab support as indent char in fmt (#10979) by @mathewmeconry
* feat(cheats): add vm.getRawBlockHeader(blockNumber) (#11082) by @0xClandestine

## Forge Fixes

* fix: fix formating crash caused by non-breaking space in comment. (#10522) by @l1nxy
* fix(forge): mark prank applied on contract creation too (#10532) by @grandizzy
* fix(forge): do not revert if event with count 0 not emitted (#10534) by @grandizzy
* fix(forge): vm.cool mark cold instead storage cleaning (#10546) by @grandizzy
* fix: `vm.chainId` regression in isolation mode on `nightly` post `revm` bump (#10589) by @zerosnacks
* fix: eip7702 cheatcodes multiple auth (#10623) by @zjesko
* fix: adds zksync, abstract to diff gas calc (#10539) by @dutterbutter
* fix(fmt): 'at' is not a keyword (#10556) by @DaniPopes
* fix(`forge bind`): add `serde` as a dependency to generated `Cargo.toml` if `Serde` is being derived in bindings (#10563) by @zerosnacks
* forge(fix): update persistent storage from active db (#10576) by @grandizzy
* fix(forge lint): do not flag `fn test*` and `fn invariant*` (#10607) by @0xrusowsky
* feat(forge/script): decode execution traces when `--json` is enabled (#10109) by @0xpanoramix
* fix(bindings): ensure forge bind generates snake\_case file names (#10622) by @zarkk01
* fix(fmt): 'layout' is not a keyword (#10656) by @DaniPopes
* fix(forge lint): gas lints (#10667) by @0xrusowsky
* fix(forge): Ignore file access events to prevent rebuild loop (#10763) by @joeblogg801
* fix(`forge`): don't include lib in lint runs (#10771) by @yash-atreya
* show native token symbol on tx broadcast (#10770) by @ahsan-javaiid
* fix: eip712, bind-json solar cleanups (#10789) by @DaniPopes
* fix(forge): vm.getChain use config for rpc and alias (#10806) by @grandizzy
* fix(forge): filter selectors if test contract is target (#10798) by @grandizzy
* fix: forge doc panic (#10901) by @zerosnacks
* fix: update block env after tx forking (#10963) by @mattsse
* fix(forge-lint): \[unused imports] check path slice  (#10985) by @0xrusowsky
* fix(forge-lint): \[unused imports] check doc cmnts (inheritdoc) (#11003) by @0xrusowsky
* fix(`cheatcodes`): count `0` swallows non-matching reverts (#10867) by @yash-atreya
* fix(invariant): apply targetSelector and excludeSelector for test contract target (#11015) by @grandizzy
* fix(forge-lint): \[unused-imports] manually walk override paths (#11020) by @0xrusowsky
* fix(`cheatcodes`): load pranked caller acc in state (#11023) by @yash-atreya
* fix(forge-lint): \[inline-config] use relative span positions (#11022) by @0xrusowsky
* fix: ensure account is always loaded and marked as touched when pranked (#11025) by @zerosnacks
* fix(forge): show git submodule status error (#11033) by @grandizzy

## Performance improvements

* fix: spawn fork backendhandler on current tokio runtime (#10923) by @mattsse
* perf: find latest block for next-base-fee. replaces #10505 (#10511) by @naps62
* perf: improve InspectorStack (#11077) by @DaniPopes

## Other

* fix(`Makefile`): update `lint-foundry` target to explicitly use nightly (#10526) by @mablr
* Refactor: abstract global allocator in `foundry-cli` to be used across crates (#10523) by @mablr
* fix(`common`): find target by path if present (#10538) by @yash-atreya
* fix: patch solang-parser (#10509) by @DaniPopes
* bump(`revm`: step 1): bump `revm` to `21.0.0` release (#10183) by @zerosnacks
* bump(`revm`: step 2): bump `alloy` + `revm` + `alloy-evm` + other deps to latest (#10454) by @yash-atreya
* feat(foundry-cli::utils): add support for mimalloc and tracy-allocator (#10545) by @mablr
* fix(`revm bump`): re-add `P256` precompile injection for `forge` / `cast` (#10555) by @zerosnacks
* chore(cast): upgrade evmole to 0.8.0 (#10585) by @cdump
* chore(ens): replacing common::ens with the alloy\_ens crate. (#10584) by @l1nxy
* Force `prevrandao` on Rootstock testnet (#10603) by @ahsan-javaiid
* chore(lint): correct some spans (#10610) by @DaniPopes
* chore: use dedicated accountinfo type (#10617) by @mattsse
* chore(deps): bump revm to 24.0.0 (#10601) by @zerosnacks
* chore: standardize lint help + validate docs existance (#10639) by @0xrusowsky
* chore(wallets): improve error message for signer instantiation failure (#10646) by @mablr
* chore: replaced anvil hardforks with alloy hardforks (#10612) by @Rimeeeeee
* chore: Simplifing mined\_logs\_for\_block filter (#10572) by @Ayushdubey86
* chore: replaced anvil DepositTransaction with just op\_alloy::TxDeposit (#10480) by @Rimeeeeee
* chore: fixed dead link in `ui_runner.rs` (#10645) by @cypherpepe
* chore: Add unused deps lint (#10666) by @nguyenethan01
* chore: activate `prague` hardfork and Solidity version `0.8.30` as default (#10565) by @zerosnacks
* chore: add license to preprocessor deploy helper (#10684) by @grandizzy
* chore: add additional check for is\_impersonanted (#10701) by @mattsse
* feat: add some clippy lint (#10479) by @taikoonwang
* chore(`forge bind`): pin alloy to 1.0 + e2e test (#10724) by @yash-atreya
* Update README.md (#10725) by @jenpaff
* chore: update proptest to 1.7.0 (#10733) by @grandizzy
* chore: remove announcement link in `nightly` as it is unmaintained (#10745) by @zerosnacks
* fix: adds remaining ZKsync chains for estimate gas checks (#10719) by @dutterbutter
* refactor: unify ERC20 storage slot discovery logic (#10749) by @mattsse
* chore: gitignore CLAUDE instructions and settings (#10750) by @yash-atreya
* fix: pin action gh release to v2.2.2 (#10752) by @grandizzy
* chore(config): enable show\_metrics by default in \[invariant] section (#10737) by @0xChaddB
* chore: update nix flake (#10485) by @shaunkh
* bug(`nix`): fix build in CI (#10767) by @zerosnacks
* deps: bump foundry-fork-db 0.15.1 (#10778) by @onbjerg
* chore: add hash to eip-712 cmd (#10764) by @0xrusowsky
* ci: don't check all features (#10790) by @DaniPopes
* chore: pin nextest version in ci (#10800) by @grandizzy
* chore: clean up unused EOF code (#10715) by @zerosnacks
* chore: bump vyper 0.4.3 and remove previous `prague` handling (#10808) by @zerosnacks
* chore: use native alloy functions for otterscan helpers (#10816) by @mattsse
* chore: reuse alloy lenient blocknumber deserializer (#10817) by @mattsse
* chore: remove HexDisplay util (#10819) by @mattsse
* chore: remove unused util (#10818) by @mattsse
* test(cast): add tests for EIP-712 type names with colons (#10772) by @mattsse
* chore: use existing minimal\_tx\_type fn (#10826) by @mattsse
* refactor: flatten bind\_json.rs to one pass without state structs (#10791) by @DaniPopes
* chore(forge-lint): clickable links + housekeeping  (#10847) by @0xrusowsky
* Fix typos in test identifiers and improve timestamp assertions (#10851) by @leopardracer
* fix: replace broken JSON-RPC error code link with EIP-1474 reference (#10717) by @MozirDmitriy
* chore: simplify tx type conversion (#10862) by @mattsse
* cast: rm expect dependency\_on\_unit\_never\_type\_fallback (#10872) by @jsvisa
* chore(deps): bump alloy-trie 0.9 (#10881) by @DaniPopes
* chore(cast wallet): get public key using Alloy's helper (#10883) by @mablr
* Add more unit tests to `cast call` (#10888) by @ryzhak
* chore: add trace for contract\_abi error (#10898) by @mattsse
* Fix typos in Anvil module comments, docs, and test names (#10889) by @MozirDmitriy
* fix(links): update foundry book links (#10899) by @sambacha
* chore: typos (#10908) by @DaniPopes
* chore: bump to rust edition 2024 (#10802) by @zerosnacks
* chore: ignore edition 2024 bump in .git-blame-ignore-revs (#10919) by @DaniPopes
* test: check before listening (#10920) by @mattsse
* chore: bump to MSRV 1.88 (#10921) by @DaniPopes
* Fix misleading doc comment for chisel\_history\_file function (#10928) by @GarmashAlex
* fix(docs): correct --unlocked flag documentation for RPC transaction signing (#10929) by @CreeptoGengar
* chore: more etherescan v1 cleanup (#10956) by @grandizzy
* chore: link rustdocs in README (#10971) by @yash-atreya
* feat(`foundryup`): avoid unnecessary downloads and verify hashes of downloaded binaries upon install (#10902) by @zerosnacks
* feat: benchmark suite (#10804) by @yash-atreya
* docs: Clarify comments in ChiselRunner: fix incomplete and misleading docstrings (#10931) by @GarmashAlex
* chore(deps): bump to revm 27.0.3 (#10838) by @zerosnacks
* chore: relax tracer bounds (#11024) by @mattsse
* chore: remove manual usage of solar SessionGlobals (#10980) by @DaniPopes
* docs: Fix dead links across the codebase (#11012) by @vtjl10
* chore: return reorged blocks (#11026) by @mattsse
* fix(cheatcodes): remove redundant computation in validate\_private\_key… (#10993) by @reject-i
* docs(lintrules): reflect latest impl changes (#11031) by @0xrusowsky

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.2.3...v1.3.0

## v1.2.3 (2025-06-08)

# Foundry v1.2.3

Foundry v1.2.3 is a bugfix release for anvil and cast call command.

## Anvil Fixes

* fix(anvil): guard against the blockchain advancing while checking latest block (#10709) by @alexghr

## Cast Fixes

* fix(cast): do not use default overrides if no override arg (#10713) by @grandizzy

## Changelog:

https://github.com/foundry-rs/foundry/compare/v1.2.2...v1.2.3

# Foundry v1.2.2

Foundry v1.2.2 is a bugfix release for forge formatter and cast hash-message command.

## Forge Fixes

* fix(fmt): 'layout' is not a keyword (#10656) by @DaniPopes

## Cast Fixes

* fix(cast): read all lines for message to hash (#10671) by @grandizzy

## Changelog:

https://github.com/foundry-rs/foundry/compare/v1.2.1...v1.2.2

# Foundry v1.2.1

Foundry v1.2.1 is a bugfix release for forge formatter, forked tests and vm.cool cheatcode.

## Forge Fixes

* fix: patch solang-parser (#10509 #10556) by @DaniPopes
* fix: update persistent storage from active db (#10576) by @grandizzy
* fix: vm.cool mark cold instead storage cleaning (#10582) by @grandizzy

## Changelog:

https://github.com/foundry-rs/foundry/compare/v1.2.0...v1.2.1

# Foundry v1.2.0

This release comes with support for Etherscan's V2 API, forge script execution protection, performance improvement of Anvil block mining and several fixes for EIP-7702 cheatcodes.

## Etherscan v2 API support

\:warning: At the end of May [Etherscan](https://etherscan.io/) will deprecate its V1 API. With the new [V2 API](https://docs.etherscan.io/etherscan-v2) Etherscan enables users to use a single API key for all chains to greatly simplify the management of API keys for multichain Foundry codebases. Any API key created on [etherscan.io](http://etherscan.io/) (mainnet) can be used for all chains. API keys created on deployments of Etherscan on other chains (e.g. BaseScan, Arbiscan, etc..) will likely stop working. Please see the [Etherscan v2 documenation](https://docs.etherscan.io/etherscan-v2) for additional details. Whilst Foundry still supports V1 API keys until deprecation it is highly recommended to migrate now as follows in your `foundry.toml`:

```toml
[etherscan]
sepolia = { key = "$YOUR_V2_COMPATIBLE_API_KEY" }
```

Etherscan v1 API and keys are still supported by specifying the global `etherscan_api_version = "v1"` config, or per chain `api-version` as follows in your `foundry.toml`:

```toml
[etherscan]
base-sepolia = { key = "$YOUR_V1_API_KEY", api-version = "v1" }
```

## Performance

### Consistent Anvil blocks mining

Mining a block in Anvil is a blocking operation because it can take a relatively long time (and can be significantly longer in forking mode due to rpc requests). Until this version, the mining block tasks were not spawned as blocking tasks, and that could cause state inconsistencies like seen in Cow protocol integration tests failures. Foundry v1.2.0 changes the way blocks are mined in Anvil and ensures consistency by spawning request handlers as blocking tasks.

## Forge script execution protection

In order to protect against coding errors that could lead to undesired transactions and transfer of funds to script address itself, this version comes with execution protection feature which reverts execution if `address(this)` is used. The protection is enabled by default and can be turned off by setting as follows in `foundry.toml`:

```toml
script_execution_protection = false
```

## Anvil Features

* feat: added TransactionStream to subscribe to pending transactions (#10482) by @Soubhik-10
* feat: added eth\_getAccountInfo to anvil (#10496) by @Rimeeeeee
* feat: add 7702 support to eth-sendtransaction (#10504) by @mattsse

## Anvil Fixes

* perf: spawn mining on blocking (#10471) by @mattsse
* fix(anvil): use saturating\_to when check for req funds (#10503) by @grandizzy
* fix(anvil): trace\_filter same to and from block range is valid (#10400) by @0xdapper
* fix: Replay raw txs without tweaks in anvil\_reorg (#10442) by @spalladino
* fix(anvil): recomputing next-base-fee after reloading state (#10488) by @naps62

## Cast Features

* Support the `gcp` option in `cast wallet list` (#8232) by @moricho
* feat(cast): Include recover\_authority when logging SignedAuthorization (#10349) by @naijauser
* feat(cast): Add state overrides flags to cast call  (#10255) by @tushar994
* feat(cast): Add file option for calldata input (#10397) by @Ayushdubey86

## Cast Fixes## Anvil Features

* feat: add 7702 support to eth-sendtransaction (#10504) by @mattsse

## Anvil Fixes

* perf: spawn mining on blocking (#10471) by @mattsse
* fix(anvil): use saturating\_to when check for req funds (#10503) by @grandizzy
* fix(anvil): recomputing next-base-fee after reloading state (#10488) by @naps62
* fix(anvil): guard against the blockchain advancing while checking latest block (backport to v1.2.3) (#10716) by @grandizzy

## Cast Features

* feat(cast): Include recover\_authority when logging SignedAuthorization (#10349) by @naijauser
* feat(cast): Add state overrides flags to cast call  (#10255) by @tushar994
* feat(cast): Add file option for calldata input (#10397) by @Ayushdubey86

## Cast Fixes

* Apply access list to tracing executor for 'cast call --trace' (#10161) by @svenski123
* fix: add check for conflicting create (#10467) by @mattsse

## Forge Features

* feat(forge): add new cheatcode `attachBlob` to send EIP-4844 transaction (#10336) by @0xcomfycat
* feat(script): revert if address(this) used (#10295) by @gap-editor
* feat(forge): script warn if no transactions to broadcast (#10384) by @Ayushdubey86
* feat: Etherscan V2 support (#10440) by @grandizzy

## Forge Fixes

* fix(forge): avoid panic on internal decoding of linked tests (#10333) by @grandizzy
* fix(forge): run git submodule sync when installing (#10347) by @grandizzy
* fix(forge): do not use bytecode metadata in fuzz dict (#10402) by @grandizzy
* fix(forge): Set empty code if the 7702 delegation address is 0x (#10481) by @grandizzy
* fix(forge): fix nonce for tx with 7702 auth (#10464) by @grandizzy
* fix(forge): support preproc with try contract creation (#10498) by @grandizzy
* Backport fmt fixes to 1.2.0 (#10558) by @grandizzy

## Other

* Support the `gcp` option in `cast wallet list` (#8232) by @moricho
* feat: add serde derive to forge bind (#10332) by @0xcomfycat
* chore(deps): weekly `cargo update` (#10339) by @github-actions\[bot]
* chore(`release`): add `gcp-kms` flag to default release workflow (#10346) by @zerosnacks
* chore(deps): weekly `cargo update` (#10381) by @github-actions\[bot]
* chore(deps): replace inflector with heck (#10386) by @DaniPopes
* chore(deps): switch to proc-macro-error2 (#10387) by @DaniPopes
* chore(deps): remove serde\_regex (#10389) by @DaniPopes
* chore(deps): use unicode-rs as the idna backend (#10390) by @DaniPopes
* test(anvil): fix flaky test (#10391) by @DaniPopes
* test: move serial\_tests to nextest test groups (#10392) by @DaniPopes
* chore: metadata hash extraction cleanup (#10396) by @DaniPopes
* chore(deps): replace humantime with jiff (#10395) by @DaniPopes
* Update to soldeer 0.5.4 (#10399) by @mario-eth
* chore: update `std::process::exit(0)` calls in `ProjectCompiler::compile` (#10328) by @Pronoss
* fix(anvil): trace\_filter same to and from block range is valid (#10400) by @0xdapper
* chore: minor changes (#10415) by @DaniPopes
* feat(forge): add `vm.stopRecord` (#10370) by @tushar994
* feat(forge): add script execution protection config (#10408) by @grandizzy
* feat: add Alpine Linux support to foundryup (#10257) by @daramir
* fix(forge): show lcov hits for do while statements (#10423) by @grandizzy
* fix(forge): remove `strategy` section from workflow template to simplify (#10434) by @winor30
* core: sprinkle some traces (#10456) by @mattsse
* feat: solc 0.8.30 (#10459) by @DaniPopes
* chore: add OpRetro to funding.json (#10462) by @yash-atreya
* test(`cast`): add and enable negative octal formatting test (#10468) by @torrpriius
* chore: replaced trie with alloy-trie (#10478) by @Rimeeeeee
* chore: rm work type (#10474) by @mattsse
* chore: rm unused account type (#10472) by @mattsse
* replaced default with calculate (#10236) by @Rimeeeeee
* feat: add devcontainer (#10429) by @just-mitch
* feat: added TransactionStream to subscribe to pending transactions (#10482) by @Soubhik-10
* refactor(common): improve URL path handling in runtime transport (#10493) by @CreeptoGengar
* added eth\_getAccountInfo to anvil (#10496) by @Rimeeeeee
* fix: Replay raw txs without tweaks in anvil\_reorg (#10442) by @spalladino
* chore: remove `Eof::decode` usage (#10499) by @klkvr
* fix: sort blocks by number (#10505) by @mattsse
* bug(forge test): panic crash on foundry v1.1+ (backport to v1.2.1) (#10579) by @grandizzy
* fix(forge): vm.cool mark cold instead storage cleaning (backport to v1.2.1) (#10582) by @grandizzy
* fix(fmt): 'layout' is not a keyword (backport to 1.2.2) (#10669) by @grandizzy
* fix(cast): read all lines for message to hash (#10671) (backport to 1.2.2) (#10672) by @grandizzy
* fix(cast): do not use default overrides if no override arg (v1.2.3 backport) (#10713) by @grandizzy

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.1.0...v1.2.3

* Apply access list to tracing executor for 'cast call --trace' (#10161) by @svenski123
* fix: add check for conflicting create (#10467) by @mattsse

## Forge Features

* feat(forge): add new cheatcode `attachBlob` to send EIP-4844 transaction (#10336) by @0xcomfycat
* feat(script): revert if address(this) used (#10295) by @gap-editor
* feat: add serde derive to forge bind (#10332) by @0xcomfycat
* feat(forge): add `vm.stopRecord` (#10370) by @tushar994
* feat(forge): script warn if no transactions to broadcast (#10384) by @Ayushdubey86
* feat(forge): add script execution protection config (#10408) by @grandizzy
* feat: Etherscan V2 support (#10440) by @grandizzy
* feat: solc 0.8.30 (#10459) by @DaniPopes

## Forge Fixes

* fix(forge): avoid panic on internal decoding of linked tests (#10333) by @grandizzy
* fix(forge): run git submodule sync when installing (#10347) by @grandizzy
* fix(forge): do not use bytecode metadata in fuzz dict (#10402) by @grandizzy
* fix(forge): show lcov hits for do while statements (#10423) by @grandizzy
* fix(forge): Set empty code if the 7702 delegation address is 0x (#10481) by @grandizzy
* fix(forge): fix nonce for tx with 7702 auth (#10464) by @grandizzy
* fix(forge): support preproc with try contract creation (#10498) by @grandizzy

## Other

* chore(deps): weekly `cargo update` (#10339) by @github-actions\[bot]
* chore(`release`): add `gcp-kms` flag to default release workflow (#10346) by @zerosnacks
* chore(deps): weekly `cargo update` (#10381) by @github-actions\[bot]
* chore(deps): replace inflector with heck (#10386) by @DaniPopes
* chore(deps): switch to proc-macro-error2 (#10387) by @DaniPopes
* chore(deps): remove serde\_regex (#10389) by @DaniPopes
* chore(deps): use unicode-rs as the idna backend (#10390) by @DaniPopes
* test(anvil): fix flaky test (#10391) by @DaniPopes
* test: move serial\_tests to nextest test groups (#10392) by @DaniPopes
* chore: metadata hash extraction cleanup (#10396) by @DaniPopes
* chore(deps): replace humantime with jiff (#10395) by @DaniPopes
* Update to soldeer 0.5.4 (#10399) by @mario-eth
* chore: update `std::process::exit(0)` calls in `ProjectCompiler::compile` (#10328) by @Pronoss
* chore: minor changes (#10415) by @DaniPopes
* feat: add Alpine Linux support to foundryup (#10257) by @daramir
* fix(forge): remove `strategy` section from workflow template to simplify (#10434) by @winor30
* core: sprinkle some traces (#10456) by @mattsse
* chore: add OpRetro to funding.json (#10462) by @yash-atreya
* test(`cast`): add and enable negative octal formatting test (#10468) by @torrpriius
* chore: replaced trie with alloy-trie (#10478) by @Rimeeeeee
* chore: rm work type (#10474) by @mattsse
* chore: rm unused account type (#10472) by @mattsse
* replaced default with calculate (#10236) by @Rimeeeeee
* feat: add devcontainer (#10429) by @just-mitch
* refactor(common): improve URL path handling in runtime transport (#10493) by @CreeptoGengar
* chore: remove `Eof::decode` usage (#10499) by @klkvr
* fix: sort blocks by number (#10505) by @mattsse

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.1.0...v1.2.0

## v1.2.2 (2025-05-30)

# Foundry v1.2.2

Foundry v1.2.2 is a bugfix release for forge formatter and cast hash-message command.

## Forge Fixes

* fix(fmt): 'layout' is not a keyword (#10656) by @DaniPopes

## Cast Fixes

* fix(cast): read all lines for message to hash (#10671) by @grandizzy

## Changelog:

https://github.com/foundry-rs/foundry/compare/v1.2.1...v1.2.2

# Foundry v1.2.1

Foundry v1.2.1 is a bugfix release for forge formatter, forked tests and vm.cool cheatcode.

## Forge Fixes

* fix: patch solang-parser (#10509 #10556) by @DaniPopes
* fix: update persistent storage from active db (#10576) by @grandizzy
* fix: vm.cool mark cold instead storage cleaning (#10582) by @grandizzy

## Changelog:

https://github.com/foundry-rs/foundry/compare/v1.2.0...v1.2.1

# Foundry v1.2.0

This release comes with support for Etherscan's V2 API, forge script execution protection, performance improvement of Anvil block mining and several fixes for EIP-7702 cheatcodes.

## Etherscan v2 API support

\:warning: At the end of May [Etherscan](https://etherscan.io/) will deprecate its V1 API. With the new [V2 API](https://docs.etherscan.io/etherscan-v2) Etherscan enables users to use a single API key for all chains to greatly simplify the management of API keys for multichain Foundry codebases. Any API key created on [etherscan.io](http://etherscan.io/) (mainnet) can be used for all chains. API keys created on deployments of Etherscan on other chains (e.g. BaseScan, Arbiscan, etc..) will likely stop working. Please see the [Etherscan v2 documenation](https://docs.etherscan.io/etherscan-v2) for additional details. Whilst Foundry still supports V1 API keys until deprecation it is highly recommended to migrate now as follows in your `foundry.toml`:

```toml
[etherscan]
sepolia = { key = "$YOUR_V2_COMPATIBLE_API_KEY" }
```

Etherscan v1 API and keys are still supported by specifying the global `etherscan_api_version = "v1"` config, or per chain `api-version` as follows in your `foundry.toml`:

```toml
[etherscan]
base-sepolia = { key = "$YOUR_V1_API_KEY", api-version = "v1" }
```

## Performance

### Consistent Anvil blocks mining

Mining a block in Anvil is a blocking operation because it can take a relatively long time (and can be significantly longer in forking mode due to rpc requests). Until this version, the mining block tasks were not spawned as blocking tasks, and that could cause state inconsistencies like seen in Cow protocol integration tests failures. Foundry v1.2.0 changes the way blocks are mined in Anvil and ensures consistency by spawning request handlers as blocking tasks.

## Forge script execution protection

In order to protect against coding errors that could lead to undesired transactions and transfer of funds to script address itself, this version comes with execution protection feature which reverts execution if `address(this)` is used. The protection is enabled by default and can be turned off by setting as follows in `foundry.toml`:

```toml
script_execution_protection = false
```

## Anvil Features

* feat: added TransactionStream to subscribe to pending transactions (#10482) by @Soubhik-10
* feat: added eth\_getAccountInfo to anvil (#10496) by @Rimeeeeee
* feat: add 7702 support to eth-sendtransaction (#10504) by @mattsse

## Anvil Fixes

* perf: spawn mining on blocking (#10471) by @mattsse
* fix(anvil): use saturating\_to when check for req funds (#10503) by @grandizzy
* fix(anvil): trace\_filter same to and from block range is valid (#10400) by @0xdapper
* fix: Replay raw txs without tweaks in anvil\_reorg (#10442) by @spalladino
* fix(anvil): recomputing next-base-fee after reloading state (#10488) by @naps62

## Cast Features

* Support the `gcp` option in `cast wallet list` (#8232) by @moricho
* feat(cast): Include recover\_authority when logging SignedAuthorization (#10349) by @naijauser
* feat(cast): Add state overrides flags to cast call  (#10255) by @tushar994
* feat(cast): Add file option for calldata input (#10397) by @Ayushdubey86

## Cast Fixes

* Apply access list to tracing executor for 'cast call --trace' (#10161) by @svenski123
* fix: add check for conflicting create (#10467) by @mattsse

## Forge Features

* feat(forge): add new cheatcode `attachBlob` to send EIP-4844 transaction (#10336) by @0xcomfycat
* feat(script): revert if address(this) used (#10295) by @gap-editor
* feat: add serde derive to forge bind (#10332) by @0xcomfycat
* feat(forge): add `vm.stopRecord` (#10370) by @tushar994
* feat(forge): script warn if no transactions to broadcast (#10384) by @Ayushdubey86
* feat(forge): add script execution protection config (#10408) by @grandizzy
* feat: Etherscan V2 support (#10440) by @grandizzy
* feat: solc 0.8.30 (#10459) by @DaniPopes

## Forge Fixes

* fix(forge): avoid panic on internal decoding of linked tests (#10333) by @grandizzy
* fix(forge): run git submodule sync when installing (#10347) by @grandizzy
* fix(forge): do not use bytecode metadata in fuzz dict (#10402) by @grandizzy
* fix(forge): show lcov hits for do while statements (#10423) by @grandizzy
* fix(forge): Set empty code if the 7702 delegation address is 0x (#10481) by @grandizzy
* fix(forge): fix nonce for tx with 7702 auth (#10464) by @grandizzy
* fix(forge): support preproc with try contract creation (#10498) by @grandizzy

## Other

* chore(deps): weekly `cargo update` (#10339) by @github-actions\[bot]
* chore(`release`): add `gcp-kms` flag to default release workflow (#10346) by @zerosnacks
* chore(deps): weekly `cargo update` (#10381) by @github-actions\[bot]
* chore(deps): replace inflector with heck (#10386) by @DaniPopes
* chore(deps): switch to proc-macro-error2 (#10387) by @DaniPopes
* chore(deps): remove serde\_regex (#10389) by @DaniPopes
* chore(deps): use unicode-rs as the idna backend (#10390) by @DaniPopes
* test(anvil): fix flaky test (#10391) by @DaniPopes
* test: move serial\_tests to nextest test groups (#10392) by @DaniPopes
* chore: metadata hash extraction cleanup (#10396) by @DaniPopes
* chore(deps): replace humantime with jiff (#10395) by @DaniPopes
* Update to soldeer 0.5.4 (#10399) by @mario-eth
* chore: update `std::process::exit(0)` calls in `ProjectCompiler::compile` (#10328) by @Pronoss
* chore: minor changes (#10415) by @DaniPopes
* feat: add Alpine Linux support to foundryup (#10257) by @daramir
* fix(forge): remove `strategy` section from workflow template to simplify (#10434) by @winor30
* core: sprinkle some traces (#10456) by @mattsse
* chore: add OpRetro to funding.json (#10462) by @yash-atreya
* test(`cast`): add and enable negative octal formatting test (#10468) by @torrpriius
* chore: replaced trie with alloy-trie (#10478) by @Rimeeeeee
* chore: rm work type (#10474) by @mattsse
* chore: rm unused account type (#10472) by @mattsse
* replaced default with calculate (#10236) by @Rimeeeeee
* feat: add devcontainer (#10429) by @just-mitch
* refactor(common): improve URL path handling in runtime transport (#10493) by @CreeptoGengar
* chore: remove `Eof::decode` usage (#10499) by @klkvr
* fix: sort blocks by number (#10505) by @mattsse

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.1.0...v1.2.0-rc

## v1.2.1 (2025-05-26)

# Foundry v1.2.1

Foundry v1.2.1 is a bugfix release for forge formatter, forked tests and vm.cool cheatcode.

## Forge Fixes

* fix: patch solang-parser (#10509 #10556) by @DaniPopes
* fix: update persistent storage from active db (#10576) by @grandizzy
* fix: vm.cool mark cold instead storage cleaning (#10582) by @grandizzy

## Changelog:

https://github.com/foundry-rs/foundry/compare/v1.2.0...v1.2.1-rc

# Foundry v1.2.0

This release comes with support for Etherscan's V2 API, forge script execution protection, performance improvement of Anvil block mining and several fixes for EIP-7702 cheatcodes.

## Etherscan v2 API support

\:warning: At the end of May [Etherscan](https://etherscan.io/) will deprecate its V1 API. With the new [V2 API](https://docs.etherscan.io/etherscan-v2) Etherscan enables users to use a single API key for all chains to greatly simplify the management of API keys for multichain Foundry codebases. Any API key created on [etherscan.io](http://etherscan.io/) (mainnet) can be used for all chains. API keys created on deployments of Etherscan on other chains (e.g. BaseScan, Arbiscan, etc..) will likely stop working. Please see the [Etherscan v2 documenation](https://docs.etherscan.io/etherscan-v2) for additional details. Whilst Foundry still supports V1 API keys until deprecation it is highly recommended to migrate now as follows in your `foundry.toml`:

```toml
[etherscan]
sepolia = { key = "$YOUR_V2_COMPATIBLE_API_KEY" }
```

Etherscan v1 API and keys are still supported by specifying the global `etherscan_api_version = "v1"` config, or per chain `api-version` as follows in your `foundry.toml`:

```toml
[etherscan]
base-sepolia = { key = "$YOUR_V1_API_KEY", api-version = "v1" }
```

## Performance

### Consistent Anvil blocks mining

Mining a block in Anvil is a blocking operation because it can take a relatively long time (and can be significantly longer in forking mode due to rpc requests). Until this version, the mining block tasks were not spawned as blocking tasks, and that could cause state inconsistencies like seen in Cow protocol integration tests failures. Foundry v1.2.0 changes the way blocks are mined in Anvil and ensures consistency by spawning request handlers as blocking tasks.

## Forge script execution protection

In order to protect against coding errors that could lead to undesired transactions and transfer of funds to script address itself, this version comes with execution protection feature which reverts execution if `address(this)` is used. The protection is enabled by default and can be turned off by setting as follows in `foundry.toml`:

```toml
script_execution_protection = false
```

## Anvil Features

* feat: added TransactionStream to subscribe to pending transactions (#10482) by @Soubhik-10
* feat: added eth\_getAccountInfo to anvil (#10496) by @Rimeeeeee
* feat: add 7702 support to eth-sendtransaction (#10504) by @mattsse

## Anvil Fixes

* perf: spawn mining on blocking (#10471) by @mattsse
* fix(anvil): use saturating\_to when check for req funds (#10503) by @grandizzy
* fix(anvil): trace\_filter same to and from block range is valid (#10400) by @0xdapper
* fix: Replay raw txs without tweaks in anvil\_reorg (#10442) by @spalladino
* fix(anvil): recomputing next-base-fee after reloading state (#10488) by @naps62

## Cast Features

* Support the `gcp` option in `cast wallet list` (#8232) by @moricho
* feat(cast): Include recover\_authority when logging SignedAuthorization (#10349) by @naijauser
* feat(cast): Add state overrides flags to cast call  (#10255) by @tushar994
* feat(cast): Add file option for calldata input (#10397) by @Ayushdubey86

## Cast Fixes

* Apply access list to tracing executor for 'cast call --trace' (#10161) by @svenski123
* fix: add check for conflicting create (#10467) by @mattsse

## Forge Features

* feat(forge): add new cheatcode `attachBlob` to send EIP-4844 transaction (#10336) by @0xcomfycat
* feat(script): revert if address(this) used (#10295) by @gap-editor
* feat: add serde derive to forge bind (#10332) by @0xcomfycat
* feat(forge): add `vm.stopRecord` (#10370) by @tushar994
* feat(forge): script warn if no transactions to broadcast (#10384) by @Ayushdubey86
* feat(forge): add script execution protection config (#10408) by @grandizzy
* feat: Etherscan V2 support (#10440) by @grandizzy
* feat: solc 0.8.30 (#10459) by @DaniPopes

## Forge Fixes

* fix(forge): avoid panic on internal decoding of linked tests (#10333) by @grandizzy
* fix(forge): run git submodule sync when installing (#10347) by @grandizzy
* fix(forge): do not use bytecode metadata in fuzz dict (#10402) by @grandizzy
* fix(forge): show lcov hits for do while statements (#10423) by @grandizzy
* fix(forge): Set empty code if the 7702 delegation address is 0x (#10481) by @grandizzy
* fix(forge): fix nonce for tx with 7702 auth (#10464) by @grandizzy
* fix(forge): support preproc with try contract creation (#10498) by @grandizzy

## Other

* chore(deps): weekly `cargo update` (#10339) by @github-actions\[bot]
* chore(`release`): add `gcp-kms` flag to default release workflow (#10346) by @zerosnacks
* chore(deps): weekly `cargo update` (#10381) by @github-actions\[bot]
* chore(deps): replace inflector with heck (#10386) by @DaniPopes
* chore(deps): switch to proc-macro-error2 (#10387) by @DaniPopes
* chore(deps): remove serde\_regex (#10389) by @DaniPopes
* chore(deps): use unicode-rs as the idna backend (#10390) by @DaniPopes
* test(anvil): fix flaky test (#10391) by @DaniPopes
* test: move serial\_tests to nextest test groups (#10392) by @DaniPopes
* chore: metadata hash extraction cleanup (#10396) by @DaniPopes
* chore(deps): replace humantime with jiff (#10395) by @DaniPopes
* Update to soldeer 0.5.4 (#10399) by @mario-eth
* chore: update `std::process::exit(0)` calls in `ProjectCompiler::compile` (#10328) by @Pronoss
* chore: minor changes (#10415) by @DaniPopes
* feat: add Alpine Linux support to foundryup (#10257) by @daramir
* fix(forge): remove `strategy` section from workflow template to simplify (#10434) by @winor30
* core: sprinkle some traces (#10456) by @mattsse
* chore: add OpRetro to funding.json (#10462) by @yash-atreya
* test(`cast`): add and enable negative octal formatting test (#10468) by @torrpriius
* chore: replaced trie with alloy-trie (#10478) by @Rimeeeeee
* chore: rm work type (#10474) by @mattsse
* chore: rm unused account type (#10472) by @mattsse
* replaced default with calculate (#10236) by @Rimeeeeee
* feat: add devcontainer (#10429) by @just-mitch
* refactor(common): improve URL path handling in runtime transport (#10493) by @CreeptoGengar
* chore: remove `Eof::decode` usage (#10499) by @klkvr
* fix: sort blocks by number (#10505) by @mattsse

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.1.0...v1.2.0-rc

## v1.2.0 (2025-05-19)

# Foundry v1.2.0

This release comes with support for Etherscan's V2 API, forge script execution protection, performance improvement of Anvil block mining and several fixes for EIP-7702 cheatcodes.

## Etherscan v2 API support

\:warning: At the end of May [Etherscan](https://etherscan.io/) will deprecate its V1 API. With the new [V2 API](https://docs.etherscan.io/etherscan-v2) Etherscan enables users to use a single API key for all chains to greatly simplify the management of API keys for multichain Foundry codebases. Any API key created on [etherscan.io](http://etherscan.io/) (mainnet) can be used for all chains. API keys created on deployments of Etherscan on other chains (e.g. BaseScan, Arbiscan, etc..) will likely stop working. Please see the [Etherscan v2 documenation](https://docs.etherscan.io/etherscan-v2) for additional details. Whilst Foundry still supports V1 API keys until deprecation it is highly recommended to migrate now as follows in your `foundry.toml`:

```toml
[etherscan]
sepolia = { key = "$YOUR_V2_COMPATIBLE_API_KEY" }
```

Etherscan v1 API and keys are still supported by specifying the global `etherscan_api_version = "v1"` config, or per chain `api-version` as follows in your `foundry.toml`:

```toml
[etherscan]
base-sepolia = { key = "$YOUR_V1_API_KEY", api-version = "v1" }
```

## Performance

### Consistent Anvil blocks mining

Mining a block in Anvil is a blocking operation because it can take a relatively long time (and can be significantly longer in forking mode due to rpc requests). Until this version, the mining block tasks were not spawned as blocking tasks, and that could cause state inconsistencies like seen in Cow protocol integration tests failures. Foundry v1.2.0 changes the way blocks are mined in Anvil and ensures consistency by spawning request handlers as blocking tasks.

## Forge script execution protection

In order to protect against coding errors that could lead to undesired transactions and transfer of funds to script address itself, this version comes with execution protection feature which reverts execution if `address(this)` is used. The protection is enabled by default and can be turned off by setting as follows in `foundry.toml`:

```toml
script_execution_protection = false
```

## Anvil Features

* feat: added TransactionStream to subscribe to pending transactions (#10482) by @Soubhik-10
* feat: added eth\_getAccountInfo to anvil (#10496) by @Rimeeeeee
* feat: add 7702 support to eth-sendtransaction (#10504) by @mattsse

## Anvil Fixes

* perf: spawn mining on blocking (#10471) by @mattsse
* fix(anvil): use saturating\_to when check for req funds (#10503) by @grandizzy
* fix(anvil): trace\_filter same to and from block range is valid (#10400) by @0xdapper
* fix: Replay raw txs without tweaks in anvil\_reorg (#10442) by @spalladino
* fix(anvil): recomputing next-base-fee after reloading state (#10488) by @naps62

## Cast Features

* Support the `gcp` option in `cast wallet list` (#8232) by @moricho
* feat(cast): Include recover\_authority when logging SignedAuthorization (#10349) by @naijauser
* feat(cast): Add state overrides flags to cast call  (#10255) by @tushar994
* feat(cast): Add file option for calldata input (#10397) by @Ayushdubey86

## Cast Fixes

* Apply access list to tracing executor for 'cast call --trace' (#10161) by @svenski123
* fix: add check for conflicting create (#10467) by @mattsse

## Forge Features

* feat(forge): add new cheatcode `attachBlob` to send EIP-4844 transaction (#10336) by @0xcomfycat
* feat(script): revert if address(this) used (#10295) by @gap-editor
* feat: add serde derive to forge bind (#10332) by @0xcomfycat
* feat(forge): add `vm.stopRecord` (#10370) by @tushar994
* feat(forge): script warn if no transactions to broadcast (#10384) by @Ayushdubey86
* feat(forge): add script execution protection config (#10408) by @grandizzy
* feat: Etherscan V2 support (#10440) by @grandizzy
* feat: solc 0.8.30 (#10459) by @DaniPopes

## Forge Fixes

* fix(forge): avoid panic on internal decoding of linked tests (#10333) by @grandizzy
* fix(forge): run git submodule sync when installing (#10347) by @grandizzy
* fix(forge): do not use bytecode metadata in fuzz dict (#10402) by @grandizzy
* fix(forge): show lcov hits for do while statements (#10423) by @grandizzy
* fix(forge): Set empty code if the 7702 delegation address is 0x (#10481) by @grandizzy
* fix(forge): fix nonce for tx with 7702 auth (#10464) by @grandizzy
* fix(forge): support preproc with try contract creation (#10498) by @grandizzy

## Other

* chore(deps): weekly `cargo update` (#10339) by @github-actions\[bot]
* chore(`release`): add `gcp-kms` flag to default release workflow (#10346) by @zerosnacks
* chore(deps): weekly `cargo update` (#10381) by @github-actions\[bot]
* chore(deps): replace inflector with heck (#10386) by @DaniPopes
* chore(deps): switch to proc-macro-error2 (#10387) by @DaniPopes
* chore(deps): remove serde\_regex (#10389) by @DaniPopes
* chore(deps): use unicode-rs as the idna backend (#10390) by @DaniPopes
* test(anvil): fix flaky test (#10391) by @DaniPopes
* test: move serial\_tests to nextest test groups (#10392) by @DaniPopes
* chore: metadata hash extraction cleanup (#10396) by @DaniPopes
* chore(deps): replace humantime with jiff (#10395) by @DaniPopes
* Update to soldeer 0.5.4 (#10399) by @mario-eth
* chore: update `std::process::exit(0)` calls in `ProjectCompiler::compile` (#10328) by @Pronoss
* chore: minor changes (#10415) by @DaniPopes
* feat: add Alpine Linux support to foundryup (#10257) by @daramir
* fix(forge): remove `strategy` section from workflow template to simplify (#10434) by @winor30
* core: sprinkle some traces (#10456) by @mattsse
* chore: add OpRetro to funding.json (#10462) by @yash-atreya
* test(`cast`): add and enable negative octal formatting test (#10468) by @torrpriius
* chore: replaced trie with alloy-trie (#10478) by @Rimeeeeee
* chore: rm work type (#10474) by @mattsse
* chore: rm unused account type (#10472) by @mattsse
* replaced default with calculate (#10236) by @Rimeeeeee
* feat: add devcontainer (#10429) by @just-mitch
* refactor(common): improve URL path handling in runtime transport (#10493) by @CreeptoGengar
* chore: remove `Eof::decode` usage (#10499) by @klkvr
* fix: sort blocks by number (#10505) by @mattsse

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.1.0...v1.2.0-rc

## v1.1.0 (2025-04-28)

# Foundry v1.1.0

This release includes performance improvements for building and testing contracts (benchmarks performed showing improvements of up to 131x), a new Anvil endpoint, improved testing UX and new cheatcodes.

## Ubuntu 20.04 discontinued support

\:warning: Ubuntu 20.04 support is discontinued starting with this version, see [End of Standard Support](https://ubuntu.com/blog/ubuntu-20-04-lts-end-of-life-standard-support-is-coming-to-an-end-heres-how-to-prepare#:~\:text=For%20Ubuntu%2020.04%20LTS%2C%20this,will%20be%20supported%20until%202029).

## Performance

This release improves developer experience by reducing time of code compilation when iterating on contracts and better performance for running tests with detailed traces.

### Faster code compilation with dynamic test linking

v1.1 release comes with [dynamic test linking](https://github.com/foundry-rs/foundry/pull/10010) feature, built on top of [Solar](https://github.com/paradigmxyz/solar), which eliminate redundant test compilation (when changing the contract logic, Foundry skips recompiling large test suites, resulting in massive time savings).

**How it works**:

* On the initial build, Foundry preprocesses test contracts by extracting constructor parameters of the contracts under test and replacing direct instantiations with `deployCode` cheatcodes
* Subsequent compilations reuse pre-built artifacts for deployed contracts instead of recompiling both the source and all associated test contracts.
  Dynamic test linking capability is built on top of [Solar](https://github.com/paradigmxyz/solar), the blazingly fast and modular Solidity compiler.
* The feature can be enabled by setting `dynamic_test_linking = true` in your `foundry.toml` (and will be turned on by default in upcoming versions)

**Benchmarks**:

| Project | Change | Files compiled (with / without, after initial compile) | Time to compile (with / without, after initial compile) |
| --- | --- | --- | --- |
| [uniswap v4-core](https://github.com/Uniswap/v4-core/tree/80311e34080fee64b6fc6c916e9a51a437d0e482) | add `Lock.lock();` at [PoolManager.sol#L107](https://github.com/Uniswap/v4-core/blob/80311e34080fee64b6fc6c916e9a51a437d0e482/src/PoolManager.sol#L107) | 1 / 19 | 2.25s / 165.13s |
| [spark-psm](https://github.com/sparkdotfi/spark-psm/tree/9d0bcc045e81407408368c9a4bb6e3f13db77e32) | change `amountOut < minAmountOut` at [PSM3.sol#L125](https://github.com/sparkdotfi/spark-psm/blob/9d0bcc045e81407408368c9a4bb6e3f13db77e32/src/PSM3.sol#L125) | 3 / 28 | 2.14s / 16.15s |
| [morpho-blue-bundlers](https://github.com/morpho-org/morpho-blue-bundlers/tree/1fa17256abb86c4de48fd5e251ebd46aae70ca1a) | change `if (assets < 0)` at [MorphoBundler.sol#L106](https://github.com/morpho-org/morpho-blue-bundlers/blob/1fa17256abb86c4de48fd5e251ebd46aae70ca1a/src/MorphoBundler.sol#L106) | 11 / 36 | 16.39s / 251.05s |
| [morpho-blue](https://github.com/morpho-org/morpho-blue/commit/9e2b0755b47bbe5b09bf1be8f00e060d4eab6f1c) | add `require(assets != 0, ErrorsLib.ZERO_ASSETS)` at [Morpho.sol#L424](https://github.com/morpho-org/morpho-blue/blob/9e2b0755b47bbe5b09bf1be8f00e060d4eab6f1c/src/Morpho.sol#L424) | 1 / 23 | 1.01s / 133.73s |
| [sablier lockup](https://github.com/sablier-labs/lockup/tree/b2f33926fcac72a1a855c6b8ccaa75166895f13c) | change `if (cliffTime < 0)` at [SablierLockup.sol#L480](https://github.com/sablier-labs/lockup/blob/b2f33926fcac72a1a855c6b8ccaa75166895f13c/src/SablierLockup.sol#L480) | 1 / 104 | 781ms / 71.29s |
| [solady](https://github.com/Vectorized/solady/commit/724c39bdfebb593157c2dfa6797c07a25dfb564c) | add additional `_setOwner(newOwner)` at [Ownable.sol#L182](https://github.com/Vectorized/solady/blob/724c39bdfebb593157c2dfa6797c07a25dfb564c/src/auth/Ownable.sol#L182) | 9 / 14 | 6.17s / 6.34s |
| [euler evc](https://github.com/euler-xyz/ethereum-vault-connector/commit/64f6d2171a57e02a0f95bcbdecf1d92e9d253d40) | change `SET_MAX_ELEMENTS` to `11` at [Set.sol#L7](https://github.com/euler-xyz/ethereum-vault-connector/blob/64f6d2171a57e02a0f95bcbdecf1d92e9d253d40/src/Set.sol#L7) | 28 / 30 | 9.17s / 9.40s |

### Faster trace decoding

This release contains [optimised trace decoding](https://github.com/foundry-rs/foundry/pull/10282) resulting in significant improvements when running tests with high verbosity `forge test -vvv` and when decoding cast transactions with signatures fetched from external sources like Etherscan.

**Improvements**:

* Foundry v1.1 deduplicates unknown selectors and batches multiple selectors by fetch, thereby reducing the amount of network requests
* if a selector is unknown it is immediately cached and won’t try to look it up again
* while traversing the trace, Foundry now decodes multiple kinds of traces in one pass

**Benchmarks**:

| Project | Foundry v1.0.0 | Foundry v1.1.0 | Speedup |
| --- | --- | --- | --- |
| Counter | 0m0.513s | 0m0.187s | 2.7x |
| solady | 0m30.206s | 0m6.552s | 4.6x |
| prb-math | 0m0.318s | 0m0.290s | 1.1x |
| snekmate | 0m18.052s | 0m17.113s | 1.05x |

## UX Improvements

### `show_solidity` output

When setting `show_solidity = true` under `[invariant]` section of foundry.toml file, the call sequence of failed invariant runs is rendered as Solidty code that can be easily converted into repeatable unit test.

```bash
[FAIL: invariant increment failure]
	[Sequence] (original: 4, shrunk: 4)
		vm.prank(0x00000000000000000000000000000000000018dE);
		Counter(0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f).setNumber(1931387396117645594923);
		vm.prank(0x0000000000000000000000000000000000000C37);
		Counter(0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f).increment();
		vm.prank(0x0000000000000000000000000000000000000106);
		Counter(0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f).increment();
		vm.prank(0x0000000000000000000000000000000000001684);
		Counter(0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f).setNumber(996881781832960761274744263729582347);
 invariant_increment() (runs: 0, calls: 0, reverts: 0)
```

## Anvil `eth_simulateV1` endpoint

Foundry v1.1 adds initial Anvil support for this API, particularly useful for developers simulating Ethereum transaction execution in a controlled environment, for advanced debugging and transaction pre-validation workflows.

```bash
curl --request POST \
  --url http://localhost:8545 \
  --header 'Content-Type: application/json' \
  --data '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "eth_simulateV1",
  "params": [
    {
      "blockStateCalls": [
        {
          "blockOverrides": {
            "baseFeePerGas": "0x9"
          },
          "stateOverrides": {
            "0xc000000000000000000000000000000000000000": {
              "balance": "0x4a817c800"
            }
          },
          "calls": [
            {
              "from": "0xc000000000000000000000000000000000000000",
              "to": "0xc000000000000000000000000000000000000001",
              "maxFeePerGas": "0xf",
              "value": "0x1"
            },
            {
              "from": "0xc000000000000000000000000000000000000000",
              "to": "0xc000000000000000000000000000000000000002",
              "maxFeePerGas": "0xf",
              "value": "0x1"
            }
          ]
        }
      ],
      "validation": true,
      "traceTransfers": true
    },
    "latest"
  ]
}'
{"jsonrpc":"2.0","id":1,"result":[{"hash":"0x47d372a355dd320ea9075814d4d828cec1199832648c5f507da982742d1dc316","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","sha3Uncles":"0x0000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","stateRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionsRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","receiptsRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","difficulty":"0x0","number":"0x0","gasLimit":"0x1c9c380","gasUsed":"0xa410","timestamp":"0x1","extraData":"0x","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","baseFeePerGas":"0x9","uncles":[],"transactions":["0x9ee8f4e62cec7280520e840ec7c8d8e0f5ae483aa6b8827cc249964b0b938430","0x3dc270dd34b7ee1804182f96b4d6be537b740201f251864c3005496d28cf7e90"],"calls":[{"returnData":"0x","logs":[{"address":"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000c000000000000000000000000000000000000000","0x000000000000000000000000c000000000000000000000000000000000000001"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","blockHash":null,"blockNumber":"0x0","blockTimestamp":"0x1","transactionHash":null,"transactionIndex":"0x0","logIndex":"0x0","removed":false}],"gasUsed":"0x5208","status":"0x1"},{"returnData":"0x","logs":[{"address":"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000c000000000000000000000000000000000000000","0x000000000000000000000000c000000000000000000000000000000000000002"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","blockHash":null,"blockNumber":"0x0","blockTimestamp":"0x1","transactionHash":null,"transactionIndex":"0x1","logIndex":"0x1","removed":false}],"gasUsed":"0x5208","status":"0x1"}]}]}  
```

## New Cheatcodes

### Deployment correctness

#### `interceptInitcode`

* access contract's initcode inside script and tests by intercepting the next contract deployment call

```Solidity
    function testInterceptRegularCreate() public {
        // Set up interception
        vm.interceptInitcode();
    
        // Create a contract - this should revert with the initcode
        bytes memory initcode;
        try new SimpleContract(42) {
            assert(false);
        } catch (bytes memory interceptedInitcode) {
            initcode = interceptedInitcode;
        }
    }
```

#### `expectCreate`

* ensure proper deployment of the specified bytecode and deployer address, by using the CREATE / CREATE2 opcode

```Solidity
    /// Expects the deployment of the specified bytecode by the specified address using the CREATE opcode
    function expectCreate(bytes calldata bytecode, address deployer) external;

    /// Expects the deployment of the specified bytecode by the specified address using the CREATE2 opcode
    function expectCreate2(bytes calldata bytecode, address deployer) external;
```

### Gas measurement

#### `accessList` and `noAccessList`

* enable accurate testing of contracts that utilize EIP-2930 access lists by providing two new cheatcodes to set and remove access items:

```Solidity
    /// An EIP-2930 access list item.
    struct AccessListItem {
        // The address to be added in access list.
        address target;
        // The storage keys to be added in access list.
        bytes32[] storageKeys;
    }
        
    /// Utility cheatcode to set an EIP-2930 access list for all subsequent transactions.
    function accessList(AccessListItem[] calldata access) external;
    
    /// Utility cheatcode to remove any EIP-2930 access list set by `accessList` cheatcode.
    function noAccessList() external;
```

#### `coolSlot` and `warmSlot`

* simulate or reset prior storage slots reads:

```Solidity
    /// Utility cheatcode to mark specific storage slot as cold, simulating no prior read.
    function coolSlot(address target, bytes32 slot) external;
    
    /// Utility cheatcode to mark specific storage slot as warm, simulating a prior read.
    function warmSlot(address target, bytes32 slot) external;
```

## Anvil Features

* feat(`anvil`): emit warning server side on failing request (#9890) by @zerosnacks
* feat(anvil): add holocene and isthmus optimism hardforks (#9949) by @tremarkley
* feat(anvil): add genesis number to configuration and update related structures (#10083) by @mmv08
* feat(`anvil`): add support for trace logging in Anvil (#9895) by @zerosnacks
* feat(`anvil`): bypass sidecar requirement when impersonating (#10224) by @yash-atreya
* feat(anvil): add eth\_simulateV1 rpc call (#10227) by @mattsse
* feat: support negative forkblock numbers (#10263) by @mattsse
* feat/fix(anvil): add genesis number CLI option, fix genesis block construction (#10258) by @mmv08

## Anvil Fixes

* fix(anvil): reset cache path during anvil\_reset without fork url (#9729) by @nbaztec
* fix(anvil): return nonce and signature for deposit tx type (#9883) by @jakim929
* fix: map 7623 to gas too high (#9915) by @mattsse
* fix: handle invalid mnemonic gracefully in anvil (#10207) by @gregorsternat
* fix(`anvil`): --chain-id takes precendence over genesis (#10223) by @yash-atreya
* fix(`anvil`): fix chain-id precedence (#10239) by @yash-atreya
* fix(anvil): Fix tracing-subscriber initialization conflict in EIP4844 test (#10249) by @VolodymyrBg

## Cast Features

* feat(`cast age`): clarify block timestamp is UTC to allow for `date` compatibility (#9913) by @zerosnacks
* feat: add option to store keystore file with custom account name (#9946) by @startup-dreamer
* feat(cast): storage add --proxy to manually specify a proxy contract when Etherscan fails to find it (#10033) by @Cizeon
* add cast wallet change password command (#10089) by @qiweiii
* feat(cast): add `cast txpool` (#10104) by @0xOsiris
* feat(`cast`): make unsigned raw txs (#10105) by @yash-atreya
* added cast wallet public key (#10196) by @Rimeeeeee
* Add recovered address to cast decode transaction #10247 (#10252) by @Ayushdubey86

## Cast Fixes

* fix(cast): try decoding custom errors when execution reverted in cast send (#9794) by @grandizzy
* fix(receipt): use `from` address (#9998) by @MaxMustermann2
* fix(cast): allow user to disable block gas limit check in cast run (#9996) by @minh-bq
* fix(cast): send should not panic on revert decoding (#10155) by @grandizzy

## Chisel Features

* feat(chisel): improve uninformative error messages (#10201) by @GarmashAlex

## Forge Features

* feat(invariant): on failures show original and current sequence len (#9816) by @grandizzy
* feat(invariant): generate failed call sequence as solidity (#9827) by @grandizzy
* feat(doc): add mathjax support to forge doc mdbook config (#9829) by @JayWhite2357
* feat(forge): add option to suppress successful tests traces (#9865) by @grandizzy
* feat: add way to disable emitting of gas snapshots to disk (#9710) by @turbocrime
* feat(`forge fmt`): add watch mode (#9838) by @PanGan21
* feat: add `vm.foundryVersionCmp` and `vm.foundryVersionAtLeast` cheatcodes (#9845) by @startup-dreamer
* feat: add `--alloy-rev` and fix `forge bind` re-run on built project (#9861) by @zerosnacks
* feat(`forge`): don't commit installations by default (#9884) by @yash-atreya
* feat(`common`): `PathOrContractInfo` arg type  (#9770) by @yash-atreya
* feat(cheatcodes): add `expectCreate` and `expectCreate2` (#9875) by @anukul
* feat(forge): match chain id with token symbol (#10043) by @somtumkoku
* feat(forge): allow path in forge selectors upload (#10073) by @grandizzy
* feat(forge): solc 0.8.29 (#10078) by @mattsse
* feat(forge): add accessList and cold/warm cheatcodes (#10112) by @grandizzy
* feat(forge build): add `--use-literal-content` CLI flag (#10143) by @Hugoo
* feat(forge): add vm.deployCode cheats with msg.value and salt (#10178) by @grandizzy
* feat(forge): vm.sort and vm.shuffle cheatcodes (#10187) by @Haxry
* feat: support `signDelegation ` and `signAndAttachDelegation` with nonce (#10182) by @fenghaojiang
* feat(forge): add vm.setArbitraryStorage with overwrites (#10219) by @grandizzy
* feat(bind): define crate description and license  (#10203) by @Soubhik-10
* add interceptInitcode cheatcode (#10242) by @tushar994
* feat(forge): optimize compilation through preprocessing and caching (#10010) by @grandizzy
* feat(forge): allow invariant contract address as targetContract (#10274) by @grandizzy
* Force `prevrandao` on Rootstock network (#10279) by @ahsan-javaiid

## Forge Fixes

* fix(forge): allow `forge init --template` to work with `--no-commit` (#9815) by @antazoey
* fix: mark metis as different gas calc (#9834) by @mattsse
* fix(forge): decode fallbacks with calldata (#9859) by @grandizzy
* fix(inspect): add flag to strip ir comments (#9825) by @grandizzy
* fix(forge): flatten fails on top-level event declarations (#9892) by @grandizzy
* fix(config): enable optimizer if optimizer runs > 0 in additional profiles (#9901) by @grandizzy
* fix(config): add support for inline `isolate` configuration (#9904) by @zerosnacks
* fix(`forge`): catch faulty test constructors (#9909) by @yash-atreya
* fix(--isolate): avoid remappings lookups (#9938) by @klkvr
* fix(`--isolate`): correctly handle staticcalls (#9940) by @klkvr
* fix(`forge`): `forge build --sizes` collapses non uniques (#9962) by @zerosnacks
* fix(coverage): try/catch as branches, account for empty blocks (#9978) by @grandizzy
* fix(script): apply configured evm-version for verify args (#9979) by @grandizzy
* fix(invariant): ignore persisted failure if different test contract (#9981) by @grandizzy
* fix: `forge script --verifier sourcify` is ignored when `ETHERSCAN_API_KEY` env var is defined (#10002) by @zerosnacks
* fix(forge): avoid etch panic on invalid bytecode (#10006) by @grandizzy
* fix(verfy): add blockscout exception for resp status 0 when contract not indexed (#10008) by @grandizzy
* fix(forge): use float total cmp instead partial (#10005) by @grandizzy
* fix(forge): do not panic if revert at same depth as start state recording (#10016) by @grandizzy
* fix(forge): warn if file for artifact no longer exists (#10025) by @grandizzy
* fix(forge): stack pranks, restore pranks at earlier call depths (#10018) by @grandizzy
* fix(forge): base url for verification providers other than etherscan (#10045) by @grandizzy
* fix(forge): use etherscan verifier if key provided (#10058) by @grandizzy
* fix(forge): redact pk in signDelegation\* traces (#10061) by @grandizzy
* fix(`forge test --debug`): do not panic when user specifies both `--match-path` and `<PATH>` , bail instead (#10094) by @zerosnacks
* fix(forge): clone src with node\_modules (#10119) by @grandizzy
* bug(forge)!: strip "revert: " from  vm.expectRevert reason (#10144) by @Hugoo
* fix(forge): bail if forge create contract with empty bytecode (#10159) by @grandizzy
* fix(bind): Use the unused skip\_extra\_derives bind argument (#10099) by @pistomat
* fix(forge): respect --optimize flag when verify with forge create (#10163) by @grandizzy
* fix(forge): apply startPrank with delegate only for top calls (#10069) by @grandizzy
* bug(forge)!: strip "revert: " from  vm.expectRevert reason (#10144) by @Hugoo
* fix(forge init): handle github.com/ prefixed templates (#10151) by @Hugoo
* fix(forge): normalize signature s value (#10180) by @mattsse
* fix(forge): do not panic if create fork err (#10231) by @grandizzy
* fix(forge): coverage for contracts with ctor with args (#10270) by @grandizzy
* fix(forge): trace identify by creation code with stripped args (#10271) by @grandizzy
* fix(bind): add workaround for unlinked artifacts (#10291) by @mattsse
* fix(forge): do not set balance as apparent value in delegate prank (#10304) by @grandizzy
* fix(forge): ensure selected fork contains init state for persisted accounts (#10301) by @grandizzy

## Other

* fix(foundryup): install for user names with empty space (#9835) by @grandizzy
* feat: bump `alpine=3.21` in Dockerfile (#9907) by @gnapoli23
* feat(`cast`): add new `cast wallet remove` command (#9873) by @startup-dreamer
* chore(`cast`): add `4byte-calldata` alias (#9927) by @zerosnacks
* fix 4-bytecalldata (#9952) by @Haxry
* Override prevrandao on bsc (#9957) by @wtdcode
* chore: fix 404 status URL (#9964) by @looklose
* use HashMap::keys avoid unnecessary tuple unpacking (#9975) by @nkysg
* change \&Option<String> to Option\<\&str> (#9973) by @nkysg
* test(doc): added test case for doc comments & natspec (#9923) by @srdtrk
* fix(cast): clarify docs for the cast call --data flag (#10014) by @CodeSandwich
* chore(cast): upgrade evmole to 0.7.2 (#10048) by @cdump
* fix deny.toml, ignore RUSTSEC-2025-0014 (#10052) by @getong
* update derive\_more to 2.0 (#9987) by @getong
* update watchexec to 6.0, watchexec-events to 5.0 (#9988) by @getong
* chore(cli): fix clap deprecated warnings (#10075) by @taikoonwang
* feat: add `x86_64-musl` and `aarch64-musl` release targets (#9984) by @gnapoli23
* docs: edited a dead link in `precompiles.rs` (#10049) by @loopy811
* Update to soldeer 0.5.3 (#10110) by @mario-eth
* chore: refactor `forge` for library use (#10117) by @zerosnacks
* chore: refactor `cast` for library use (#10123) by @zerosnacks
* chore: refactor `anvil` for library use (#10139) by @zerosnacks
* chore: refactor `chisel` for library use (#10142) by @zerosnacks
* feat: add explicit\_iter\_loop clippy lint (#10146) by @taikoonwang
* Replace `#[allow()]` with `#[expect()]` (#10131) by @0xMushow
* chore(all): add 0x prefix to b256! and address! calls (#10213) by @healthyyyoung
* chore: remove odyssey p256 precompile on `0x14` (#10220) by @joshieDo
* chore(all): replace 0x prefix from\_str(...).unwrap() with macros (#10222) by @healthyyyoung
* feat(abi): Implement UIfmt for DSTest console logs (#10185) by @VolodymyrBg
* refactor: signatures identifier, trace decoding (#10282) by @DaniPopes
* fix(docker): build docker aarch64 without jemalloc (#10286) by @grandizzy

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v1.0.0...v1.1.0

## v1.0.0 (2025-02-10)

## \:exclamation: Breaking changes

### See [v1.0 migration guide](https://book.getfoundry.sh/guides/v1.0-migration)

* [solc optimizer disabled by default](https://book.getfoundry.sh/reference/config/solidity-compiler#optimizer-1) (#2486)
* removed `testFail*` support (#4437)
* [`expectRevert` cheatcode disabled for internal calls by default](https://book.getfoundry.sh/cheatcodes/expect-revert#error) (#3437)
* removed support for legacy `console.sol` signatures (#8910)
* ignore conflicting remappings (#9146)
* `forge coverage` does not persist artifacts anymore (https://github.com/foundry-rs/foundry/issues/8840#issuecomment-2390792012)
* `FORGE_SNAPSHOT_CHECK` requires boolean value (#9734)
* `cast etherscan-source` renamed to `cast source` with additional `explorer_url` and `explorer_api_url` args for alternative block explorers (#4776)
* `--pretty` flag removed from `forge inspect` (#5165)
* `forge bind --ethers` bindings have been removed, defaults to `--alloy` (#9412)
* `forge debug` subcommand removed in favor of `forge test --debug` and `forge script --debug` (#9523)
* removed regex arguments `--debug` and `--decode-internal` of `forge test` (#8931)
* `foundryup` installs stable if no version specified (#9585)

## Anvil Features

* feat(anvil): implement `anvil_rollback` (#9783) by @jorgemmsilva

## Anvil Fixes

* fix(anvil): ipc append a newline (#9608) by @9547
* fix: correctly set `gas_limit` reported by Anvil (#9774) by @zerosnacks
* fix: use sequence for rollback (#9795) by @mattsse
* fix(trace\_filter): allow params to be object or array with len 1 (#9793) by @dwerner

## Cast Features

* feat(cast): pretty print other receipt fields (#9589) by @jsvisa
* Feat: Add `cast chain` support for `ink` & `ink-sepolia` (#9652) by @CruzMolina
* feat(`cast source`): support alternative explorers (#9762) by @yash-atreya
* feat(cast): update polygon testnet chain and add polygon zkevm chains (#9803) by @leovct

## Cast Fixes

* fix(ens): don't resolve addr if doesn't contain . (#9635) by @9547

## Chisel Features

* feat(chisel): determine proper path to Vm.sol based on proj remappings (#9703) by @grandizzy

## Forge Features

* feat(`verify`): default to sourcify if etherscan key not provided (#9630) by @yash-atreya
* fix: do not remove `snapshots` directory before running the test suite (#9645) by @zerosnacks
* fix(`config`): enable `optimizer` when `optimizer_runs` set in config (#9673) by @yash-atreya
* feat(`forge`): `--watch` coverage (#9702) by @yash-atreya
* feat: filter by profile in `vm.getCode` (#9714) by @klkvr
* fix(forge): allow install private deps with https and gh token (#9726) by @grandizzy
* feat: allow remapping of solidity files (#9604) by @jsvisa
* fix(`forge`): disable artifacts for coverage (#9692) by @yash-atreya
* feat(cheatcodes): add ability to ignore (multiple) specific and partial reverts in fuzz and invariant tests (#9179) by @emo-eth
* feat(script): show the broadcasted transactions when verbose>=4 (#9655) by @jsvisa
* feat(`forge`): inspect - default to pretty output (#9705) by @yash-atreya
* feat: override the eyre display handler globally (#9766) by @DaniPopes
* feat(`forge`): remove `testFail*` (#9574) by @yash-atreya

## Forge Fixes

* fix(cheatcode): use storage access address instead account access (#9646) by @grandizzy
* fix(cheatcodes): record state diff only if balance changed (#9658) by @grandizzy
* fix: error handling with retries when waiting for receipt (#9650) by @grandizzy
* fix(`script`): use fork\_block\_number for init sender nonce (#9669) by @yash-atreya
* fix: propagate color config to TraceWriter (#9679) by @DaniPopes
* fix(config): normalize optimizer settings (#9689) by @grandizzy
* fix(verify): strip profile from contract name (#9699) by @grandizzy
* Fix rewrite of User-Agent header (#9707) by @vbrvk
* fix(invariant): handle simple contract names in metrics table (#9724) by @grandizzy
* fix(invariant): lookup fuzz interface abi by name or identifier (#9744) by @grandizzy
* fix(`forge bind`): prefix keyword mod names with `r#` (#9761) by @yash-atreya
* fix(coverage): keep EVM version when normalizing for ir-minimum (#9768) by @DaniPopes
* fix(cheatcode): support new 7702 spec (#9779) by @grandizzy
* fix: avoid returning None for library addresses during fuzzing (#9771) by @nbaztec

## Performance improvements

* perf(coverage): use u32 for IDs, improve analysis (#9763) by @DaniPopes

## Other

* chore(`foundryup`): default to stable if no specific version is passed in (#9585) by @zerosnacks
* chore(fmt): tx fields indent with the same whitespaces (#9603) by @jsvisa
* feat: update revm 19 alloy 09 (#9605) by @mattsse
* add comment to `-r` option about default value (#9571) by @zhiqiangxu
* chore: dedup errors in eyre handler (#9612) by @DaniPopes
* fix(`evm`):  P256Verify address (#9618) by @yash-atreya
* chore(git): enhance rust diffing (#9596) by @sambacha
* chore(`config`): use solar for inline config parsing (#9615) by @yash-atreya
* chore(`bind-json`): replace solang with solar (#9616) by @yash-atreya
* chore(forge): remove `forge debug` subcommand (#9606) by @9547
* feat(test): add repro issue8566 testcase (#9617) by @9547
* chore: standardize use of `opts` / `args` (#9629) by @zerosnacks
* feat: remove ethers (#9412) by @grandizzy
* chore(`forge`): rm regex for --debug and --decode-internal (#9572) by @yash-atreya
* chore(deps): bump `alloy-chains` (#9653) by @CruzMolina
* fix(config): disable optimizer by default (#9657) by @grandizzy
* fix: incorrect repo link in readme for foundry-compilers (#9660) by @DrakeEvans
* feat: add arm64 docker image (#9614) by @jsvisa
* chore(clippy): use next\_back instead of last for DoubleEndedIterator (#9666) by @jsvisa
* feat(foundryup): add foundryup self-update (#9609) by @9547
* feat(foundryup): check for running processes (#9680) by @grandizzy
* chore: add version number to `foundryup` (#9681) by @zerosnacks
* refactor: properly handle config load errors (#9713) by @DaniPopes
* chore: display warning to user if running `nightly` version (#9683) by @zerosnacks
* fix: release process (#9728) by @zerosnacks
* fix: respect `disable_block_gas_limit` config key (#9732) by @klkvr
* chore: bump compilers (#9735) by @klkvr
* fix: use custom build profile in --version (#9733) by @Rjected
* fix(remappings): ignore conflicting remappings (#9521) by @grandizzy
* feat(foundryup): manage custom built versions (#9746) by @grandizzy
* chore: stop supporting legacy console.sol signatures (#8910) by @DaniPopes
* fix(cheatcode): expect revert only for calls with greater depth than test (#9537) by @grandizzy
* chore: update README for `1.0` (#9540) by @zerosnacks
* fix(docker): revert to use ubuntu:22.04 as base image (#9777) by @grandizzy
* feat: add `gas_snapshot_check` flag to config, fix `FORGE_SNAPSHOT_CHECK` behavior (#9791) by @zerosnacks

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/v0.3.0...v1.0.0

## v0.3.0 (2024-12-19)

# 0.3.0 release announcement

`foundryup` now defaults to updating to the latest stable release instead of latest nightly build.
In order to make sure you are able to receive the latest updates and switch between versions you are required to upgrade your `foundryup` installation by running:

```bash
curl -L https://foundry.paradigm.xyz | bash
```

You are still able to receive the latest nightly builds by running `foundryup --install nightly` but please be aware that significant breaking changes are expected on nightly builds.

The `foundry-toolchain` GitHub Action will use the latest stable release unless you specify the `version` to be different.

## What's Next

The Foundry 0.3 release marks an exciting new chapter for Foundry. By moving to stable releases, we aim to provide a reliable development environment for the EVM ecosystem. Our next priority is the 1.0 release in early 2025, polishing Foundry for the long term.

Big shoutout to the Foundry community - your bug reports, feature requests and contributions have shaped what Foundry is today.

# 0.3.0 release notes

## Anvil Features

* feat(`anvil`): `wallet_` namespace + inject P256BatchDelegation + executor (#9110) by @yash-atreya
* feat(`anvil`): support mining with same block.timestamp (#9160) by @yash-atreya
* feat(anvil): add `anvil_getIntervalMining` API (#9290) by @feynman-x
* feat(`anvil`): `--cache-path` (#9343) by @yash-atreya

## Anvil Fixes

* fix: dont set state root (#9134) by @mattsse
* fix(`anvil`): use header.number not best\_number (#9151) by @yash-atreya
* fix(`anvil`): arb fork mining (#9153) by @yash-atreya
* fix(anvil): Apply state overrides in debug\_traceCall (#9172) by @iliastsa
* fix: add back `silent` option in Anvil's `NodeConfig` (#9181) by @zerosnacks
* fix(`anvil`): tag newly created legacy transactions on shadow fork as `Some(0)` (`0x0`) rather than `None` (#9195) by @zerosnacks
* fix(anvil): correctly set hardfork-specific block fields (#9202) by @klkvr
* fix: include withdrawals root in response (#9208) by @mattsse
* fix(`anvil`): set `storage.best_number` correctly (#9215) by @yash-atreya
* fix(anvil): on anvil\_mine jump to next timestamp before mine new block (#9241) by @grandizzy
* anvil: Correctly set HF fields for Genesis block (#9248) by @ngotchac
* fix(anvil): set auto-unlock an alias of auto-impersonate (#9256) by @jsvisa
* fix(`anvil`): impl `maybe_as_full_db` for `ForkedDatabase` (#9465) by @yash-atreya
* fix(`anvil`): set `best_number` to `state.block.number` if greater (#9543) by @yash-atreya

## Cast Features

* feat(cast): add avalanche and fuji genesis hashes (#210) by @joshieDo
* feat(cast): add `json` flag in `cast wallet new-mnemonic` (#9139) by @leovct
* feat(`cast`): add flag equivalents of parseUnits, formatUnits  (#9165) by @kien6034
* feat(cast): add `--rpc-timeout` option (#9044) by @PanGan21
* feat(cast): add --int flag to from-rlp (#9210) by @TropicalDog17
* feat(cast) add creation-code method \[#8973] (#9029) by @pawurb
* feat(cast): add string-decode to decode string (#9237) by @jsvisa
* feat(`cast run`): add `--etherscan-api-key`  to resolve contract names (#9295) by @grandizzy
* feat(cast): add artifact method (#9249) by @pawurb
* feat(forge, cast): add `cast --with_local_artifacts`/`forge selectors cache` to trace with local artifacts (#7359) by @byteshijinn
* feat(cast): add decode-event sig data (#9413) by @grandizzy
* feat(cast): decode external lib sigs from cached selectors (#9399) by @grandizzy
* feat(`cast`): `decode-error` with sig, local cache and openchain api (#9428) by @grandizzy
* feat(`cast`): `decode-event` with local and openchain API (#9431) by @grandizzy
* feat: rpc\_headers in cast and config (#9429) by @yash-atreya
* feat(cast): allow some more stdin inputs (#9442) by @DaniPopes
* feat(cast): add support for beacon proxies in cast impl (#9567) by @0xvv

## Cast Fixes

* fix(cli): replace underscore for hyphen on wallet cli args (#212) by @joshieDo
* fix: support EOF opcodes in `cast da` (#9070) by @klkvr
* fix: respect `--auth` in `cast call` and `cast estimate` (#9120) by @klkvr
* fix(cast): do not strip 0x / hex decode message before EIP-191 hashing (#9130) by @grandizzy
* fix(`cast block`): ensure to print all fields (#9209) by @klkvr
* fix: rename flag as\_int -> as-int (#9235) by @klkvr
* fix(trace): properly report `fallback()` fn (#9287) by @grandizzy
* fix(cast storage): respect `--json` for layout (#9332) by @MaxMustermann2
* fix: bail incomplete bytecode sequence disassemble (#9390) by @publicqi
* fix(`cast`): reset `env.tx.caller` for impersonated txs (#9544) by @yash-atreya
* fix: account for impersonated tx in configure\_tx\_env (#9553) by @yash-atreya

## Chisel Fixes

* fix(chisel): on edit fail command only if execution failed (#9155) by @grandizzy
* fix(chisel): uint/int full word print (#9381) by @grandizzy

## Forge Features

* feat(forge): verify contracts created inside a call (#2840) by @joshieDo
* feat(`cheatcodes`): vm.getScriptWallets() (#9052) by @yash-atreya
* feat(forge): allow passing value to `--optimize` (#9071) by @klkvr
* feat(`forge doc`): include custom natspec (#9075) by @leovct
* feat: make `--gas-report` JSON output compatible (#9063) by @zerosnacks
* feat(`cheatcodes`): vm.rememberKeys (#9087) by @yash-atreya
* feat(forge): add `compiler` subcommand (#7909) by @jpgonzalezra
* feat(forge): add max supported EVM version in compiler -vv (#9129) by @grandizzy
* feat(`forge build`): add initcode size check (#9116) by @mgiagante
* feat(`forge build`): `--watch` flag now watches `foundry.toml` config… (#9148) by @leovct
* fix(cheatcodes): improve fork cheatcodes messages (#9141) by @grandizzy
* feat(fmt): add `all_params` config - same as `all` but split single param too (#9176) by @grandizzy
* feat(invariant): add basic metrics report (#9158) by @grandizzy
* feat(`forge install`): add `@tag=` `@branch=` `@rev=` specific refs (#9214) by @grandizzy
* feat: make `--gas-report` w/ `--json` output one JSON blob and add `contract_path` to output (#9216) by @zerosnacks
* feat(`cheatcodes`): access broadcast artifacts (#9107) by @yash-atreya
* feat(`--gas-report`): add option to include tests (#9232) by @grandizzy
* feat(`cheatcodes`): mockCall with bytes4 data (#9267) by @yash-atreya
* feat(forge): allow `--verifier custom` option (#9311) by @grandizzy
* feat(`cheatcodes`): add `delegatecall` to `prank`ing (#8863) by @EdwardJES
* feat(forge build): err if no source file in specified paths (#9329) by @grandizzy
* feat(`forge build`): add `--sizes` and `--names` JSON compatibility (#9321) by @zerosnacks
* feat(`forge build -vvvvv`): If verbosity level is 5 or higher show files to compile (#9325) by @mgiagante
* feat: compilation restrictions (#8668) by @klkvr
* Support EIP-7702 Delegations in Forge (#9236) by @evchip
* feat(forge, cast): add `cast --with_local_artifacts`/`forge selectors cache` to trace with local artifacts (#7359) by @byteshijinn
* feat(forge): show additional details of contract to verify (#9403) by @grandizzy
* fix: forge script should adhere to `--json` flag (#9404) by @zerosnacks
* feat: add `--broadcast` flag to forge create, default to dry run mode (#9420) by @zerosnacks
* feat(`traces`): show state changes in `cast run` and `forge test` on `-vvvvv` (#9013) by @cassc
* feat: rewrite inline config using figment (#9414) by @DaniPopes
* feat: add timeouts to fuzz testing (#9394) by @smartcontracts
* feat(script): support custom create2 deployer (#9278) by @jsvisa
* feat: allow any config to be defined inline (#9430) by @DaniPopes
* fix/feat(coverage): add --lcov-version (#9462) by @DaniPopes
* feat: dedup error messages (#9481) by @DaniPopes
* feat: add JSON compatibility for `forge test --summary +/ --detailed` + apply consistent table styling (#9485) by @zerosnacks
* feat(`cheatcodes`): count assertion for `expectRevert` (#9484) by @yash-atreya
* feat(cheatcodes): add `vm.getStateDiff` to get state diffs as string (#9435) by @grandizzy
* feat(cheatcodes): skip test suite in setup (#9532) by @grandizzy
* feat(`cheatcodes`): count assertion for `expectEmit` (#9405) by @yash-atreya

## Forge Fixes

* fix(forge): only cleanup dirs if they exists (#194) by @mattsse
* fix(`tests`): force install solidity 0.8.19 through svm (#5221) by @Evalir
* fix(coverage): proper instruction for 1st branch anchor (#8512) by @grandizzy
* fix: running script with `--broadcast` for a transaction sequence can error out due to nonce desync from rpc latency (#9096) by @pogobounce
* fix(fmt): do not panic when no named arg (#9114) by @grandizzy
* fix(traces): identify artifacts using both deployed and creation code (#9050) by @grandizzy
* fix(cheatcodes): convert fixed bytes to bytes in vm.rpc tuple result (#9117) by @grandizzy
* fix: script simulation with default sender (#9042) by @klkvr
* fix(fmt): multiline single param only if func definition is multiline for `all_params` (#9187) by @ChiTimesChi
* fix(script): correctly detect additional contracts (#9207) by @klkvr
* fix(forge create): set skip\_is\_verified\_check: true (#9222) by @grandizzy
* fix: allow\_hyphen\_values for constructor args (#9225) by @mattsse
* fix(`--gas-report`): add back signatures, even if empty, avoid nesting multiple selectors (#9229) by @zerosnacks
* fix: remove steps after steps tracing cheatcodes are done (#9234) by @klkvr
* fix(`deps`): update `alloy-chains` to fix Celo explorer API URL (#9242) by @github-actions\[bot]
* fix: better error handling when waiting for receipt (#9253) by @klkvr
* fix(`forge doc`): display custom natspec tag (#9257) by @leovct
* fix(forge): fix stack overflow when the lib path is absolute. (#9190) by @l1nxy
* fix(remappings): ignore remappings of root proj dirs when merging (#9258) by @grandizzy
* fix(`forge test`): record only test fns in test failures (#9286) by @grandizzy
* fix(coverage): do not report empty constructors, enable reports for `receive` (#9288) by @grandizzy
* fix(fork): set block blob\_excess\_gas\_and\_price only if `excess_blob_gas header` is Some (#9298) by @grandizzy
* fix(forge): always report deployment size in gas reports (#9308) by @grandizzy
* fix(`forge eip712`): handle recursive types (#9319) by @klkvr
* fix: identification of contracts in scripts (#9346) by @klkvr
* fix(`coverage`): allow `ir-minimum` for versions \< 0.8.5 (#9341) by @grandizzy
* fix: `vm.broadcastRawTransaction` (#9378) by @klkvr
* fix(forge test): install missing dependencies before creating `Project` (#9379) by @klkvr
* fix(forge create): install missing deps if any (#9401) by @grandizzy
* fix: remove duplicate `gas_limit` / `block_gas_limit` field, declare as alias (#9406) by @zerosnacks
* fix(cheatcodes): use calldata in attachDelegation (#9407) by @grandizzy
* fix(coverage): clean ups, use normalized source code for locations (#9438) by @DaniPopes
* fix(coverage): special functions have no name (#9441) by @DaniPopes
* fix(coverage): also ignore empty fallbacks and receives (#9459) by @DaniPopes
* fix(coverage): assert should not be branch (#9467) by @grandizzy
* fix(`forge`): run `dep.has_branch` in correct dir  (#9453) by @yash-atreya
* fix(remappings): project autoremappings should respect config (#9466) by @grandizzy
* fix: force `prevrandao` on Moonbeam networks (#9489) by @mattsse
* fix(verify): cached artifacts by version (#9520) by @grandizzy
* fix(cheatcodes): clear orderings together with trace steps on debug trace stop (#9529) by @grandizzy
* fix(fuzz): exclude exernal libraries addresses from fuzz inputs (#9527) by @grandizzy
* fix: read rpc config when using fork cheatcodes (#9547) by @anukul

## Performance improvements

* perf: cap default poll interval (#9250) by @mattsse
* perf(coverage): improve HitMap merging and internal repr (#9456) by @DaniPopes
* perf(coverage): cache computed bytecode hash in CoverageCollector (#9457) by @DaniPopes
* perf(coverage): cache current HitMap, reserve when merging (#9469) by @DaniPopes

## Other

* chore(cast): upgrade evmole to 0.6.1, use new style API (#9493) by @cdump
* chore: bump compilers 0.12.7 (#9498) by @mattsse
* chore: improve Retry usage and warning (#9503) by @DaniPopes
* chore(deps): remove async\_recursion (#9500) by @DaniPopes
* chore: bump alloy (#9496) by @mattsse
* fix: mark flag incompatibility  (#9530) by @zerosnacks
* Update incorrect documentation in the READ.me (#9538) by @jtfirek
* chore: Add GH attestation for foundry binaries (#9546) by @grandizzy
* feat(foundryup): allow multiple installed versions (#9551) by @grandizzy
* chore: bump workspace version to `0.3.0` (#9580) by @zerosnacks
* Update CI workflow template to unpin from `nightly` explicitly, relying on `foundry-toolchain` default (#9573) by @zerosnacks
* chore: testFail\* deprecation warning (#9581) by @yash-atreya

## Full Changelog:

https://github.com/foundry-rs/foundry/compare/f1d339a0f1694fb775494ea64ff3621868f9923a...v0.3.0
