
Solidity 0.8.37 Release Announcement
Official release notes for Solidity v0.8.37 detailing three bug-bounty-reported compiler bugs: memory `delete` on a bytes-array element zeroing a full 32-byte word instead of one byte (corrupting adjacent memory, evmasm pipeline, up to v0.8.36); a stack-to-memory spill-slot collision under mutual recursion in the IR pipeline (`--via-ir`, v0.7.2–v0.8.36) that silently overwrites live variables; and named custom-error arguments in `require(...)` being ABI-encoded in call-site order rather than declaration order, so revert data misrepresents error values (v0.8.36 introduced but only affects revert data). Also covers two non-security miscompilations (uninitialized packed function pointers, checked/unchecked constant reuse), a new SSA-CFG stack shuffler, Amsterdam EVM's SLOTNUM opcode support, and removal/deprecation of LSP mode, Generic Solidity, and several EVM version pragmas.
What it is
Solidity v0.8.37, a bugfix release fixing three security-relevant compiler bugs (two rated low/medium, one very low, all reported via the Ethereum Foundation bug bounty) plus two non-security miscompilations. The security summary already names each bug's mechanism and version range; what follows is the triage an engineer needs to decide whether to rebuild and redeploy.
Preconditions / Affected — per bug
The two pipelines matter because they split the exposure cleanly:
deleteon a memorybytes/string-as-bytes element zeros 32 bytes — evmasm (legacy) pipeline only, up to and including 0.8.36. The IR pipeline is not affected, andb[i] = 0is correct on both. This is the one that corrupts live adjacent memory during normal execution, so it is the highest-priority rebuild if you compile without--via-irand usedeleteon memory byte arrays.- Spill-slot collision under mutual recursion — IR pipeline only (
--via-ir), versions 0.7.2–0.8.36. Silently overwrites a live variable. Distinct from, but related to, the "Unsound Spill In Mutual Recursion" bug fixed in 0.8.36 — patching to 0.8.36 did not close this one. - Misordered named params in
require(cond, MyError({...}))— IR pipeline, introduced 0.8.36. Rated very low: it only misencodes revert data of an already-reverting tx. No effect on contract state.revert MyError({...})and all other named-parameter uses are unaffected. Act on this only if off-chain consumers parse revert payloads.
What to do
Upgrade to 0.8.37. For prioritization, map your build: legacy pipeline + memory-bytes delete → the 32-byte overwrite is a real state-corruption risk. --via-ir + mutually recursive functions → the spill collision can silently corrupt live variables regardless of transaction input.
Caveats
The two non-security miscompilations are downgraded by the vendor for concrete reasons, not just labeling:
- Uninitialized packed function pointers (evmasm): only wrong when compared before ever being assigned; does not affect calls through the pointer, and such comparisons already emit a compiler warning (slated to be disallowed next breaking release). Reliably caught by unit tests.
- Constant reused across checked/unchecked contexts (IR): all operands are compile-time constants, so the wrong result is deterministic and outside attacker influence — it either reverts on first execution or yields a fixed wrapped value, both surfacing in any test with coverage. Requires reading the same overflowing constant from both a checked and an unchecked context in one contract.
Non-security operational notes if you rely on them: --lsp mode and pragma experimental solidity (Generic Solidity) are removed; pragma experimental ABIEncoderV2, and the constantinople/petersburg/istanbul/berlin EVM versions and the SMTChecker BMC engine now emit deprecation warnings. New block.slotnum / Yul slotnum() (EIP-7843) require --evm-version amsterdam.
Organisations named here
- Carl (Cantina Security)
- EIP-7843
- Ethereum Foundation bug bounty program
- Ng Sze Hon
- shaheenfazim
Technologies named here
- Solidity compiler
- SMTChecker
- SSA CFG code generator
- Yul optimizer
- Solidity
- Ethereum
Techniques named here
- Unsound Spill In Mutual Recursion Bug
Related in Blockchain

THORChain Exploit Report #2 — GG20 root-cause disclosure

Black Thursday revisited: MakerDAO keeper exploited for $500K
.jpg)