REVM v108 Release Notes
Date: 2026-05-19
v108 brings REVM in line with Amsterdam bal-devnet-7, finalizing the
EIP-8037 state-gas/reservoir model that landed experimentally in v106 and
v107.
Headline changes
- EIP-8037 — Amsterdam bal-devnet-7 (#3667). Final wiring for the
state-gas reservoir model, BAL bookkeeping, and the matching gas
accounting paths across handler / interpreter / context. op-revmremoved from the workspace (#3568). The Optimism variant
has moved to its own home at
ethereum-optimism/optimism.
REVM no longer ships anop-revmcrate.- Instructions now return
Result(#3558). The instruction-function
signature changed to returnResult<_, _>so that fallible opcodes can
surface errors without ad-hoc control flow. This is a breaking change
for anyone authoring custom instruction tables / handlers. Journaltraits restructured (#3663). The journal trait hierarchy
has been split and reorganized; expect import / impl-site churn for
downstream databases and custom contexts.- Centralized cfg→journal sync (#3686).
CfgEnvsynchronization with
the journal now lives in one place, eliminating drift between handler
paths.
New features
feat(state):Bal::try_from_alloyfor converting an alloy BAL into
the REVMBaltype (#3665), with a borrowed-input variant added in
#3670.feat(database):State::has_balhelper (#3604).feat(state): optimized index types usingnon-maxfor transaction
IDs (#3610) and account IDs (#3605).feat(primitives):SpecId::NEXTadded and thenum_enumdependency
dropped (#3593).feat:InitialAndFloorGasis now propagated through
validate_against_state_and_deduct_caller(#3577), so the floor-gas
accounting from EIP-7623 is visible to validation.feat: BAL errors now show the offending address or slot (#3619), and
the docs aroundBalErrorhave been expanded (#3666).handler: senders with nonce atu64::MAXare now rejected before
execution (#3531).
Performance
perf(precompile): vendorblake2b_simdfor BLAKE2 compression
(#3609); precompile init now uses a staticOnceLockarray (#3602);
precompiles are no longer cloned on warmup (#3586).perf(interpreter): instruction and gas tables are now separated
(#3561);init_code_hashis cached inCreateInputsso inspectors can
reuse it without re-hashing (#3664).perf: empty-account loads no longer allocate (#3590); the
memory_limitcheck is moved into the cold resize path so the hot
path is shorter (#3599).perf(database):commit_itersemantics preserved while improving its
performance (#3681).
Bug fixes
fix(precompile): halt withPrecompileOOGwhen a precompile
over-spends its gas budget (#3639); re-add
PrecompileOutput::gas_refunded(#3574); use SIGMA period 10 in the
blake2 portable path (#3616); tighten thecfgon the blake2 AVX2
module so it only compiles where it's actually usable (#3613).fix(bal): record storage writes to zero for self-destructed accounts
(#3573); canonicalize BAL alloy ordering (#3618).fix(context): use thestorage_by_account_idfast path inSLOAD
(#3535).fix(handler): skipreimburse_caller/reward_beneficiarywhen
fee charging is disabled (#3559).fix(inspector): usebuild_result_gasininspect_run_system_call
(#3637).fix(bytecode): markBytecode::new_analyzedasunsafeto reflect
its invariants (#3557).fix: opcode struct panics / safety hardening (#3566).fix: gracefully handle commits of non-cached accounts (#3657).
Refactors
refactor(interpreter): unify call handlers (#3626); dedup account
loading across host instructions (#3562); remove the unused
loop_controlmodule (#3555).refactor: thread the reservoir through OOG constructors (#3580); pass
the reservoir intofirst_frame_input(#3578); remove the pointer
field fromGasParams(#3608).refactor: change&mut selfto&selfon read-only methods (#3669);
prefergetoverget_mutwhere mutation isn't needed (#3643).refactor(gas): simplifylog2floor(#3629).refactor: drop unused spec ids (#3649) and unused
MemoryExtensionResult(#3646).
Tests, CI, docs
test(ee-tests): switch toinstafor snapshot assertions (#3654)
and sort snapshot map keys so results are stable across hashers
(#3655).test: custom-opcode integration test added (#3576).ci: run the develop EEST fixtures by default (#3645); pin GitHub
Actions to SHA and apply least-privilege permissions (#3567); update
test workflows (#3620).docs: README inee-testsnow referenceseip8037.mdinstead of
the staletip1016.md(#3648).chore: enable and fixclippy::missing_const_for_fn(#3592); audit
#[allow]attributes (#3611); bumpalloy2.0 crates (#3565) and
alloy-eip7928(#3627); bumprustls-webpkifor an advisory (#3600).
Crate version bumps
| Crate | From | To | Compat |
|---|---|---|---|
revm-primitives
| 23.0.0 | 24.0.0 | ⚠ breaking |
revm-bytecode
| 10.0.0 | 11.0.0 | ⚠ breaking |
revm-state
| 11.0.1 | 12.0.0 | ⚠ breaking |
revm-database-interface
| 11.0.1 | 11.1.0 | ✓ compatible |
revm-context-interface
| 17.0.1 | 18.0.0 | ⚠ breaking |
revm-context
| 16.0.1 | 17.0.0 | ⚠ breaking |
revm-database
| 13.0.1 | 14.0.0 | ✓ compatible |
revm-interpreter
| 35.0.1 | 36.0.0 | ⚠ breaking |
revm-precompile
| 34.0.0 | 35.0.0 | ⚠ breaking |
revm-handler
| 18.1.0 | 19.0.0 | ⚠ breaking |
revm-inspector
| 19.0.0 | 20.0.0 | ⚠ breaking |
revm-statetest-types
| 17.0.1 | 18.0.0 | ✓ compatible |
revm
| 38.0.0 | 39.0.0 | ✓ compatible |
revme
| 15.0.0 | 16.0.0 | ✓ compatible |
op-revm is no longer released from this repository — see
ethereum-optimism/optimism
for the maintained version.
Migration notes
- Instruction authors: update custom instructions to the new
Result-returning signature introduced in #3558. - Custom journals / databases: rework impls against the restructured
Journaltrait hierarchy (#3663). - op-revm users: switch your dependency to the
op-revmcrate
published fromethereum-optimism/optimism(#3568). - BAL consumers:
Bal::try_from_alloy(#3665, #3670) is the
recommended conversion path; BAL error messages now carry address /
slot context.
See MIGRATION_GUIDE.md for the worked-example migration of the
breaking APIs.
Commits
- chore(interpreter): remove unused loop_control module by @decofe in #3555
- chore(deps): bump alloy 2.0 crates by @mattsse in #3565
- fix(handler): skip gas reimbursement and beneficiary reward when fee charge is disabled by @davidberiro in #3559
- fix(bytecode): mark
Bytecode::new_analyzedas unsafe by @decofe in #3557 - chore: rm op-revm (migrated to ethereum-optimism/optimism) by @rakita in #3568
- ci: pin GitHub Actions to SHA, add least-privilege permissions by @decofe in #3567
- chore(deps): bump CodSpeedHQ/action from 4.13.0 to 4.13.1 by @dependabot[bot] in #3569
- chore(deps): bump taiki-e/install-action from 2.75.0 to 2.75.1 by @dependabot[bot] in #3570
- fix: opcode struct panics/safety by @DaniPopes in #3566
- refactor(interpreter): dedup account loading across host instructions by @DaniPopes in #3562
- fix: re-add
PrecompileOutput::gas_refundedby @klkvr in #3574 - fix(bal): record storage writes to zero for selfdestructed accounts by @rakita in #3573
- feat propagate
InitialAndFloorGasto stateful validation by @klkvr in #3577 - refactor: pass reservoir into
first_frame_inputby @klkvr in #3578 - test: add custom opcode integration test by @decofe in #3576
- refactor: thread reservoir through OOG constructors by @rakita in #3580
- perf(interpreter): separate instruction and gas tables by @DaniPopes in #3561
- test: fix missed merge conflict by @DaniPopes in #3587
- perf: avoid cloning precompiles on warmup by @DaniPopes in #3586
- chore: missed clippy by @DaniPopes in #3591
- perf: no alloc for empty accounts by @DaniPopes in #3590
- chore(deps): bump crate-ci/typos from 1.45.0 to 1.45.1 by @dependabot[bot] in #3596
- chore(deps): bump actions/upload-artifact from 7.0.0 to 7.0.1 by @dependabot[bot] in #3595
- chore(deps): bump taiki-e/install-action from 2.75.13 to 2.75.14 by @dependabot[bot] in #3594
- chore: enable and fix clippy::missing_const_for_fn by @DaniPopes in #3592
- chore: bump rustls-webpki for advisory by @DaniPopes in #3600
- refactor!: return Result from instruction functions by @DaniPopes in #3558
- feat(database): add State::has_bal helper by @mattsse in #3604
- refactor: remove pointer field from GasParams by @DaniPopes in #3608
- refactor(primitives): add SpecId::NEXT, drop num_enum dependency by @DaniPopes in #3593
- refactor(precompile): use static OnceLock array for Precompiles init by @DaniPopes in #3602
- perf: move memory_limit check into cold resize path by @DaniPopes in #3599
- perf(precompile): vendor blake2b_simd for BLAKE2 compression by @DaniPopes in #3609
- fix(precompile): use SIGMA period 10 in blake2 portable path by @rakita in #3616
- chore: backport v107 release notes from branch by @rakita in #3617
- fix(state): canonicalize BAL alloy ordering by @mattsse in #3618
- chore: audit #[allow] attributes by @yottaes in #3611
- feat(account): Optimized index type for account ID using
non-maxby @developeruche in #3605 - fix(precompile): tighten cfg on blake2 avx2 module by @yottaes in #3613
- feat(state): Optimized index type for transaction ID using non-max by @yottaes in #3610
- fix(context): use storage_by_account_id fast path in sload by @bluebluesaku in #3535
- ci: update test workflows by @DaniPopes in #3620
- feat: show address or slot in BAL error by @pepyakin in #3619
- handler: reject nonce-max senders before execution by @joohhnnn in #3531
- chore: update alloy-eip7928 to newer version by @pepyakin in #3627
- refactor(gas): simplify log2floor by @DaniPopes in #3629
- refactor: remove unused spec ids by @DaniPopes in #3649
- docs(ee-tests): reference
eip8037.mdinstead of staletip1016.mdin README by @fgimenez in #3648 - chore: rm unused MemoryExtensionResult by @DaniPopes in #3646
- refactor(interpreter): unify call handlers by @DaniPopes in #3626
- chore(deps): bump taiki-e/install-action from 2.75.14 to 2.75.19 by @dependabot[bot] in #3630
- chore(deps): bump rui314/setup-mold from 725a8794d15fc7563f59595bd9556495c0564878 to 9c9c13bf4c3f1adef0cc596abc155580bcb04444 by @dependabot[bot] in #3631
- chore(deps): bump CodSpeedHQ/action from 4.13.1 to 4.14.0 by @dependabot[bot] in #3632
- refactor: use get instead of get_mut by @cuiweixie in #3643
- fix(precompile): halt with PrecompileOOG when precompile over-spends gas by @cuiweixie in #3639
- refactor: use
Cowfor warm precompile addresses by @klkvr in #3652 - Revert "refactor: use
Cowfor warm precompile addresses" by @klkvr in #3653 - ci: run develop EEST fixtures by default by @DaniPopes in #3645
- test(ee-tests): switch to insta for snapshot assertions by @rakita in #3654
- fix(ee-tests): sort snapshot map keys for hasher independence by @rakita in #3655
- chore(deps): bump taiki-e/install-action from 2.75.19 to 2.75.26 by @dependabot[bot] in #3660
- chore(deps): bump CodSpeedHQ/action from 4.14.0 to 4.15.0 by @dependabot[bot] in #3659
- chore(deps): bump crate-ci/typos from 1.45.1 to 1.45.2 by @dependabot[bot] in #3658
- fix: gracefully handle commits with non-cached accounts by @klkvr in #3657
- refactor: restructure
Journaltraits by @klkvr in #3663 - feat(state): add Bal::try_from_alloy by @mattsse in #3665
- feat: add borrowed alloy BAL conversion by @mattsse in #3670
- perf(interpreter): cache init_code_hash in CreateInputs for inspector reuse by @cotter-circle in #3664
- chore(deps): bump mozilla-actions/sccache-action from 0.0.9 to 0.0.10 by @dependabot[bot] in #3661
- fix(inspector): use build_result_gas in inspect_run_system_call by @cuiweixie in #3637
- chore(deps): bump taiki-e/install-action from 2.75.26 to 2.77.1 by @dependabot[bot] in #3674
- chore(deps): bump taiki-e/cache-cargo-install-action from 3.0.6 to 3.0.7 by @dependabot[bot] in #3677
- chore(deps): bump CodSpeedHQ/action from 4.15.0 to 4.15.1 by @dependabot[bot] in #3675
- chore(deps): bump crate-ci/typos from 1.45.2 to 1.46.0 by @dependabot[bot] in #3676
- refactor: change &mut self to &self for read-only methods by @box4wangjing in #3669
- docs: expand
BalErrordocumentation by @rakita in #3666 - perf(database): preserve commit_iter semantics by @NithinPJ998 in #3681
- refactor(context): centralize cfg-to-journal sync by @gfischer7 in #3686
- feat(eip8037): Amsterdam bal-devnet-7 by @rakita in #3667
- chore: release by @github-actions[bot] in #3679
- chore: v108 release prep by @rakita in #3689
New Contributors
- @davidberiro made their first contribution in #3559
- @yottaes made their first contribution in #3611
- @pepyakin made their first contribution in #3619
- @joohhnnn made their first contribution in #3531
- @cotter-circle made their first contribution in #3664
- @box4wangjing made their first contribution in #3669
- @NithinPJ998 made their first contribution in #3681
- @gfischer7 made their first contribution in #3686
Full Changelog: v106...v108