github bluealloy/revm v108
tag v108 revm v39.0.0

3 hours ago

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-revm removed from the workspace (#3568). The Optimism variant
    has moved to its own home at
    ethereum-optimism/optimism.
    REVM no longer ships an op-revm crate.
  • Instructions now return Result (#3558). The instruction-function
    signature changed to return Result<_, _> so that fallible opcodes can
    surface errors without ad-hoc control flow. This is a breaking change
    for anyone authoring custom instruction tables / handlers.
  • Journal traits 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). CfgEnv synchronization with
    the journal now lives in one place, eliminating drift between handler
    paths.

New features

  • feat(state): Bal::try_from_alloy for converting an alloy BAL into
    the REVM Bal type (#3665), with a borrowed-input variant added in
    #3670.
  • feat(database): State::has_bal helper (#3604).
  • feat(state): optimized index types using non-max for transaction
    IDs (#3610) and account IDs (#3605).
  • feat(primitives): SpecId::NEXT added and the num_enum dependency
    dropped (#3593).
  • feat: InitialAndFloorGas is 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 around BalError have been expanded (#3666).
  • handler: senders with nonce at u64::MAX are now rejected before
    execution (#3531).

Performance

  • perf(precompile): vendor blake2b_simd for BLAKE2 compression
    (#3609); precompile init now uses a static OnceLock array (#3602);
    precompiles are no longer cloned on warmup (#3586).
  • perf(interpreter): instruction and gas tables are now separated
    (#3561); init_code_hash is cached in CreateInputs so inspectors can
    reuse it without re-hashing (#3664).
  • perf: empty-account loads no longer allocate (#3590); the
    memory_limit check is moved into the cold resize path so the hot
    path is shorter (#3599).
  • perf(database): commit_iter semantics preserved while improving its
    performance (#3681).

Bug fixes

  • fix(precompile): halt with PrecompileOOG when 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 the cfg on 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 the storage_by_account_id fast path in SLOAD
    (#3535).
  • fix(handler): skip reimburse_caller / reward_beneficiary when
    fee charging is disabled (#3559).
  • fix(inspector): use build_result_gas in inspect_run_system_call
    (#3637).
  • fix(bytecode): mark Bytecode::new_analyzed as unsafe to 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_control module (#3555).
  • refactor: thread the reservoir through OOG constructors (#3580); pass
    the reservoir into first_frame_input (#3578); remove the pointer
    field from GasParams (#3608).
  • refactor: change &mut self to &self on read-only methods (#3669);
    prefer get over get_mut where mutation isn't needed (#3643).
  • refactor(gas): simplify log2floor (#3629).
  • refactor: drop unused spec ids (#3649) and unused
    MemoryExtensionResult (#3646).

Tests, CI, docs

  • test(ee-tests): switch to insta for 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 in ee-tests now references eip8037.md instead of
    the stale tip1016.md (#3648).
  • chore: enable and fix clippy::missing_const_for_fn (#3592); audit
    #[allow] attributes (#3611); bump alloy 2.0 crates (#3565) and
    alloy-eip7928 (#3627); bump rustls-webpki for 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
    Journal trait hierarchy (#3663).
  • op-revm users: switch your dependency to the op-revm crate
    published from ethereum-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_analyzed as 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_refunded by @klkvr in #3574
  • fix(bal): record storage writes to zero for selfdestructed accounts by @rakita in #3573
  • feat propagate InitialAndFloorGas to stateful validation by @klkvr in #3577
  • refactor: pass reservoir into first_frame_input by @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-max by @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.md instead of stale tip1016.md in 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 Cow for warm precompile addresses by @klkvr in #3652
  • Revert "refactor: use Cow for 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 Journal traits 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 BalError documentation 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

Full Changelog: v106...v108

Don't miss a new revm release

NewReleases is sending notifications on new releases.