Skip to content

Releases: bluealloy/revm

tag v111 revm v40.0.2

Choose a tag to compare

@rakita rakita released this 26 May 13:13
eead9ee

v111

Date: 2026-05-22

v111 is a maintenance release that extends DBErrorMarker so callers can distinguish fatal database errors from recoverable BAL validation failures (#3704). The change adds is_fatal(&self) -> bool to the DBErrorMarker trait with a default of true, preserving existing fail-stop behavior for every current implementor. EvmDatabaseError overrides the default so the Database(_) variant is fatal and the Bal(_) variant is non-fatal — letting callers distinguish a real underlying database failure from a BAL validation issue that may be retried or surfaced differently.

Version bumps

  • revm-database-interface: 12.0.0 → 12.1.0 (✓ API compatible changes)
  • revm-context-interface: 19.0.1 → 19.0.2 (✓ dependency bump)
  • revm-context: 18.0.1 → 18.0.2 (✓ dependency bump)
  • revm-database: 15.0.0 → 15.0.1 (✓ dependency bump)
  • revm-interpreter: 37.0.1 → 37.0.2 (✓ dependency bump)
  • revm-precompile: 36.0.1 → 36.0.2 (✓ dependency bump)
  • revm-handler: 20.0.1 → 20.0.2 (✓ dependency bump)
  • revm-inspector: 21.0.1 → 21.0.2 (✓ dependency bump)
  • revm-statetest-types: 19.0.1 → 19.0.2 (✓ dependency bump)
  • revm: 40.0.1 → 40.0.2 (✓ dependency bump)
  • revme: 17.0.1 → 17.0.2 (✓ dependency bump)

Commits

  • feat(database): add is_fatal to DBErrorMarker by @rakita in #3704
  • chore: release by @github-actions[bot] in #3705
  • chore: v111 release prep by @rakita in #3706

Full Changelog: v110...v111

tag v110 revm v40.0.1

Choose a tag to compare

@rakita rakita released this 26 May 13:12
a8af4de

v110

Date: 2026-05-21

v110 is a maintenance release that removes the dead refill_amount tracking from the EIP-8037 reservoir model (#3699). The change drops GasTracker.refill_amount and the parallel field on PrecompileOutput. The field tracked cumulative reservoir refills — refill_reservoir calls from 0→x→0 storage restorations and failed CREATE refunds — but the revert/halt unwinding it was meant to support is already covered by the signed-sum invariant child.reservoir + child.state_gas_spent: refill_reservoir(r) does reservoir += r; state_gas_spent -= r, so their sum is conserved across refills and recovers the pre-call value. Every read site — last_frame_result save/restore, the handle_reservoir_remaining_gas success branch, and precompile_provider — only fed the field back into itself, and nothing downstream consulted it. Net diff is −56 / +3 across 6 files.

Two compatibility notes are worth calling out. GasTracker derives serde::Serialize/Deserialize under the serde feature, so removing refill_amount is a serialization-format break for any external consumer that persists GasTracker. PrecompileOutput has no serde derive, so it is only a Rust-ABI break there.

Version bumps

  • revm-context-interface: 19.0.0 → 19.0.1 (✓ API compatible changes)
  • revm-context: 18.0.0 → 18.0.1 (✓ dependency bump)
  • revm-interpreter: 37.0.0 → 37.0.1 (✓ API compatible changes)
  • revm-precompile: 36.0.0 → 36.0.1 (✓ API compatible changes)
  • revm-handler: 20.0.0 → 20.0.1 (✓ API compatible changes)
  • revm-inspector: 21.0.0 → 21.0.1 (✓ dependency bump)
  • revm-statetest-types: 19.0.0 → 19.0.1 (✓ dependency bump)
  • revm: 40.0.0 → 40.0.1 (✓ dependency bump)
  • revme: 17.0.0 → 17.0.1 (✓ dependency bump)

Commits

  • refactor(eip8037): remove dead refill_amount tracking by @rakita in #3699
  • chore(deps): bump EmbarkStudios/cargo-deny-action from 2.0.17 to 2.0.18 by @dependabot[bot] in #3691
  • chore(deps): bump crate-ci/typos from 1.46.0 to 1.46.1 by @dependabot[bot] in #3693
  • chore(deps): bump taiki-e/install-action from 2.77.1 to 2.77.7 by @dependabot[bot] in #3694
  • chore(deps): bump MarcoIeni/release-plz-action from 0.5.128 to 0.5.129 by @dependabot[bot] in #3692
  • chore: release by @github-actions[bot] in #3701
  • chore: v110 release prep by @rakita in #3702

Full Changelog: v109...v110

tag v109 revm v40.0.0

Choose a tag to compare

@rakita rakita released this 26 May 12:45
f7ccd08

v109 (2026-05-20)

REVM v109 Release Notes

Date: 2026-05-20

v109 is a semver-correction release with no new code changes on top of v108. It re-cuts the workspace so that revm-database-interface is bumped as a
major version, accurately reflecting the API breaks shipped in v108 (BAL error context, non-max account/transaction index types, commit_iter
semantics). All transitively dependent crates are bumped accordingly.

Why a separate release

The v108 cut left revm-database-interface at 11.1.0 (minor), but the changes that landed in that window — most notably the non-max index-type
optimizations (#3605, #3610) and the BAL error-context rework (#3619) — are API breaks for downstream databases. v109 re-publishes the affected crates with
the correct major bump so downstream consumers can pin against semver accurately.

Version bumps

  • revm-database-interface: 11.1.0 → 12.0.0 (⚠ API breaking changes)
  • revm-context-interface: 18.0.0 → 19.0.0 (⚠ dependency bump)
  • revm-database: 14.0.0 → 15.0.0 (⚠ dependency bump)
  • revm-context: 17.0.0 → 18.0.0 (⚠ dependency bump)
  • revm-interpreter: 36.0.0 → 37.0.0 (⚠ dependency bump)
  • revm-precompile: 35.0.0 → 36.0.0 (⚠ dependency bump)
  • revm-handler: 19.0.0 → 20.0.0 (⚠ dependency bump)
  • revm-inspector: 20.0.0 → 21.0.0 (⚠ dependency bump)
  • revm-statetest-types: 18.0.0 → 19.0.0 (⚠ dependency bump)
  • revm: 39.0.0 → 40.0.0 (⚠ dependency bump)
  • revm-ee-tests: 0.2.0 → 0.3.0 (⚠ dependency bump)
  • revme: 16.0.0 → 17.0.0 (⚠ dependency bump)

What's Changed

Full Changelog: v108...v109

tag v108 revm v39.0.0

Choose a tag to compare

@rakita rakita released this 19 May 18:53
e0ced3c

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 #3...
Read more

tag v107 revm v38.0.0

Choose a tag to compare

@rakita rakita released this 17 Apr 17:35

Maintenance release with handler API refinements.

Bug Fixes

  • Record storage writes to zero for selfdestructed accounts in BAL (#3573) — Prevents stale pre-selfdestruct values leaking to later transactions.
  • Re-add PrecompileOutput::gas_refunded (#3574) — Field was inadvertently removed in v106.

Refactoring & Breaking Changes

  • Propagate InitialAndFloorGas to validate_against_state_and_deduct_caller (#3577) — Handler gains a &mut InitialAndFloorGas parameter.
  • Pass reservoir into first_frame_input (#3578) — Replaces &InitialAndFloorGas with a precomputed reservoir: u64; CreateInputs::new and create_init_frame gain a trailing reservoir param.

Full Changelog: v106...v107

tag v106 revm v37.0.0

Choose a tag to compare

@rakita rakita released this 10 Apr 01:42
31bee69

Release v106

Features

  • EIP-8037 / TIP-1016 state gas support (#3406) — Introduces the state gas reservoir model for separating state and execution gas accounting.
  • Amsterdam devnet3 EIP updates (#3438) — Partial implementation of Amsterdam devnet3 EIP changes.
  • frame_start and frame_end on Inspector trait (#3518) — New inspector hooks for observing frame lifecycle events.
  • Crate-level re-exports for all revm- dependencies* (#3507) — Each revm sub-crate now re-exports its public dependencies for easier downstream use.
  • CallInput::as_bytes (#3515) — Convenience accessor for raw call input bytes.
  • Local context accessors on CallInput (#3537) — Access local context fields directly from CallInput.
  • revme: list all failed tests with --keep-going (#3491) — Summary of all failures printed at the end of test runs.

Bug Fixes

  • Reject transactions with nonce at u64::MAX (#3553) — Prevents nonce overflow.
  • Ensure both inspectors receive paired call/create events in tuple impl (#3473) — Fixes missing events when using inspector tuples.
  • swap/swapn/exchange report StackOverflow on underflow (#3483) — Correct error variant for stack underflow in swap operations.
  • Expose JournalLoadError from load_account_mut_skip_cold_load (#3477) — Error type was previously hidden.
  • Make Bytecode Ord consistent with PartialEq and Hash (#3479) — Fixes ordering inconsistency.
  • Make DummyHost return defaults instead of errors for storage ops (#3503) — Better behavior for testing.
  • revme: use transact state for debug "State after" output (#3498)
  • revme: guard unconditional println in blockchaintest for --json mode (#3500)

Refactoring & Breaking Changes

  • Use AnyError for PrecompileError::Fatal and EVMError::Custom (#3502) — Replaces stringly-typed errors with AnyError.
  • Remove option for known bytecode (#3532) — Simplifies bytecode handling.
  • Deprecate set_spec and clean up deprecation attrs (#3550)
  • Move EIP-8037 gas cap validation into validate_initial_tx_gas (#3552)
  • Remove unused gas-related functions (#3534)
  • Take large array args by reference in precompiles (#3524)

Performance

  • Remove redundant log clone in inspector precompile path (#3520)

What's Changed

  • ci: add cargo-semver-checks to catch breaking changes in PRs by @decofe in #3476
  • fix: ensure both inspectors receive paired call/create events in tuple impl by @bobtajson in #3473
  • chore: bump aws-lc-rs from 1.16.0 to 1.16.1 by @rakita in #3481
  • chore: simplify stack dup by @DaniPopes in #3478
  • fix: make Bytecode Ord consistent with PartialEq and Hash by @zeroprooff in #3479
  • fix: expose JournalLoadError from load_account_mut_skip_cold_load by @rakita in #3477
  • fix(handler): rename misleading underflow variable to success by @zeroprooff in #3486
  • chore: remove unused bytecode dependency from revm-statetest-types by @bobtajson in #3485
  • fix(interpreter): swap/swapn/exchange report StackOverflow on underflow by @bluebluesaku in #3483
  • chore(revme): use alloy-trie instead of triehash by @DaniPopes in #3488
  • feat(revme): list all failed tests at the end with --keep-going by @rakita in #3491
  • chore: bump c-kzg from 2.1.6 to 2.1.7 by @rakita in #3495
  • docs: clarify PrecompileError::Fatal vs Other and EVMError::Custom by @mattsse in #3496
  • feat: Amsterdam devnet3 EIP updates by @rakita in #3438
  • ci: exclude revme from semver-checks by @bluebluesaku in #3501
  • fix(revme): guard unconditional println in blockchaintest for --json mode by @bluebluesaku in #3500
  • fix(revme): use transact state for debug State after output by @rakita in #3498
  • fix: make DummyHost return defaults instead of errors for storage ops by @decofe in #3503
  • ci: remove semver-checks workflow by @rakita in #3508
  • feat: add crate-level re-exports for all revm-* dependencies by @rakita in #3507
  • refactor: use AnyError for PrecompileError::Fatal and EVMError::Custom by @ndavd in #3502
  • feat: add CallInput::as_bytes by @DaniPopes in #3515
  • Add [OpTrace] to awesome list by @tanghaosuan11 in #3514
  • fix(op-revm): use typed error for missing enveloped tx in all paths by @bluebluesaku in #3509
  • chore: remove no-op background transition merge builder toggle by @saylor-mik87786 in #3510
  • feat(inspector): add frame_start and frame_end to Inspector trait by @mablr in #3518
  • chore: add comment about frame stack initial capacity by @DaniPopes in #3527
  • bench: add secp256r1 (P256) precompile benchmark by @decofe in #3525
  • refactor(precompile): take large array args by reference by @decofe in #3524
  • perf(inspector): remove redundant log clone in precompile path by @saylor-mik87786 in #3520
  • refactor: remove redundant Option by @klkvr in #3532
  • feat: Add local context accessors to CallInput by @rakita in #3537
  • fix: Remove unused gas-related functions by @popzxc in #3534
  • ci: add PR audit workflow by @legion2002 in #3551
  • refactor: deprecate set_spec and clean up deprecation attrs by @rakita in #3550
  • feat: add EIP-8037 / TIP-1016 state gas support by @rakita in #3406
  • refactor: state gas cleanup and EIP-8037 validation consolidation by @rakita in #3552
  • chore: release by @github-actions[bot] in #3472
  • fix: reject transactions with nonce at u64::MAX by @rakita in #3553
  • chore: v106 release prep by @rakita in #3554

New Contributors

Full Changelog: v105...v106

tag v105 revm v36.0.0

Choose a tag to compare

@rakita rakita released this 04 Mar 11:28
3631979

v105 (2026-03-04)

Maintenance release to do major version bump for revm-database-interface and its dependencies.

Features

  • Add extend method to BlockHashCache (#3471)

Chores

  • Bump revm-interpreter to v34.0.0 and update changelogs (#3475)
  • Bump revm-database-interface to v10.0.0 and all dependents (#3474)
  • Remove unused dev-dependencies in ee-tests (#3469)
  • Handle system call errors in revme (#3465)

tag v104, revm v35.0.0

Choose a tag to compare

@rakita rakita released this 03 Mar 15:52
ae1c9dc

REVM v104 — Release Notes

Date: March 3, 2026
Tag: v104

Amsterdam hardfork support (EIP-7708, EIP-7843, EIP-8024), ResultGas struct refactor, flatten Bytecode, logs added to Revert/Halt variants, BAL (Block Access List) support, O(1) block hash cache, various performance improvements and bug fixes.

Migration Guide: MIGRATION_GUIDE.md
Changelog: CHANGELOG.md

Breaking Changes

  • Flatten BytecodeBytecode is now a struct wrapping Arc<BytecodeInner> instead of an enum. Use accessor methods (kind(), is_legacy(), eip7702_address()) instead of pattern matching. (#3375)
  • ResultGas struct in ExecutionResult — Separate gas_used/gas_refunded fields replaced by a ResultGas struct with methods used(), remaining(), inner_refunded(), final_refunded(), spent_sub_refunded(). (#3413)
  • Logs in Revert/Halt variantsExecutionResult::Revert and Halt now carry logs: Vec<Log> for logs emitted before failure. (#3424)
  • EIP-161 state clear moved into journal finalize — Removed has_state_clear field and related methods from CacheState/State. (#3444)
  • Remove Default for EthPrecompiles and EthInstructions — Use new(spec) constructors instead. (#3434)
  • Fixed-bytes hashmaps from alloy-coreHashMap<Address, _>AddressMap<_>, HashMap<B256, _>B256Map<_>. (#3358)

Amsterdam Hardfork (New EIPs)

  • EIP-7708: ETH transfers emit a log — When Amsterdam is active and value is non-zero, ETH transfers emit logs. Includes configuration options in Cfg. (#3334, #3395)
  • EIP-7843: SLOTNUM opcode — New opcode 0x4B. BlockEnv gains slot_num: u64 field, Host trait gains slot_num() method. (#3340)
  • EIP-8024: DUPN, SWAPN, EXCHANGE opcodes — New opcodes at 0xE60xE8 with a new InvalidImmediateEncoding instruction result variant. (#3223)

Features

  • BAL (Block Access List) support — New example and StateBuilder::with_bal_builder_if helper. (#3339, #3351)
  • aws-lc-rs backend for secp256r1 — Alternative precompile backend via feature flag. (#3451)
  • Configurable EIP-7702 auth refund — New GasParams entry. (#3366)
  • tx_access_list_cost helper — Added to GasParams. (#3349)
  • clear() for CacheState and TransitionState — Convenience method. (#3390)
  • BlockHashCache helpersiter() and lowest() methods. (#3352)
  • Storage getter on BundleState — (#3321)
  • revme: --json output flag for evmrunner. (#3428)
  • revme: --omit-progress flag for statetest. (#3419)
  • revme: validate block gas in blockchain tests. (#3416)

Performance

  • O(1) ring buffer block hash cache — Replaces BTreeMap<u64, B256>. (#3299)
  • Zero-copy scalar conversion in BLS12-381 MSM precompile. (#3359)
  • Cache trusted setup G2 for KZG precompile. (#3322)
  • Elide jumps in JUMP opcode execution. (#3347)
  • Reserve capacity in merge_transitions, extend_state, and add_transitions. (#3430, #3373)
  • Avoid unnecessary clone/prealloc in state operations. (#3387)
  • Remove unnecessary enveloped_tx clone in op-revm. (#3455)

Bug Fixes

  • Forward storage_by_account_id in WrapDatabaseRef. (#3441)
  • Allow EIP-161 state clear for empty Loaded and Changed accounts. (#3421)
  • Big-endian resize for modexp output padding. (#3432)
  • Respect is_fee_charge_disabled in calculate_caller_fee. (#3401)
  • Fix storage_by_account_id cache bypass in CacheDB. (#3385)
  • Fix populated account if BAL pre-state was none. (#3357)
  • Set transition_id to account correctly. (#3353)
  • Use provided code hash when setting account code. (#3324)
  • LOG/CREATE opcodes memory modification tracking. (#3328)

Dependencies

  • Updated vulnerable dependencies: keccak, time, bytes (#3467)
  • Bumped c-kzg 2.1.4 → 2.1.6 (#3448)
  • Default hardfork updated to Osaka (Ethereum) / Jovian (Optimism) (#3326)

Full diff: v103...v104 (181 files changed, 4494 insertions, 1791 deletions)

All commits

  • chore: remove outdated stack pop TODO by @joeybright53 in #3315
  • perf: Use O(1) ring buffer cache for block hashes instead of BTreeMap by @malik672 in #3299
  • refactor(bytecode): remove redundant clones in legacy analysis tests by @letmehateu in #3317
  • Rename misleading calc_linear_cost_u32 function by @saylor-mik87786 in #3318
  • fix(database): BlockHashCache incorrectly returns zero for block 0 by @bshastry in #3319
  • chore: update default hardfork to Osaka (Ethereum) and Jovian (Optimism) by @zerosnacks in #3326
  • feat: Implement EIP-8024 for Amsterdam by @frangio in #3223
  • fix(bytecode): improve analyze_legacy padding for SWAPN/DUPN/EXCHANGE by @rakita in #3332
  • fix: the LOG[0-4] CREATE CREATE2 opcode can modify memory by @mark0-cn in #3328
  • feat(database): add storage getter to BundleState by @mattsse in #3321
  • perf: cache trusted setup G2 by @lisenokdonbassenok in #3322
  • fix: use provided code hash when setting account code by @Bashmunta in #3324
  • fix(bytecode): improve analyze_legacy and stack tests by @rakita in #3335
  • feat: Implement EIP-7708 ETH transfers emit a log by @rakita in #3334
  • revm-handler: add ItemOrResult::map_item (alias map_frame) by @maximevtush in #3320
  • fix(bytecode): add padding for final opcode missing immediates by @frangio in #3338
  • feat: Implement EIP-7843 SLOTNUM opcode for Amsterdam by @rakita in #3340
  • feat: add BAL (Block Access List) example by @mattsse in #3339
  • perf: elide some jumps in jump by @DaniPopes in #3347
  • feat(gas): add tx_access_list_cost helper to GasParams by @saylor-mik87786 in #3349
  • feat(database): add StateBuilder::with_bal_builder_if by @mattsse in #3351
  • feat(database): add iter and lowest helpers to BlockHashCache by @mattsse in #3352
  • fix: set transition_id to account by @rakita in #3353
  • refactor(handler): extract duplicate ContextError handling by @andrewshab3 in #3312
  • perf: use fixed bytes hashmaps from alloy-core by @gakonst in #3358
  • fix(bal): fix populated account if pre-state was none by @jsign in #3357
  • perf(precompile): zero-copy scalar conversion in BLS12-381 MSM by @dizer-ti in #3359
  • Deprecate nonce_bump_journal_entry and caller_accounting_journal_entry functions by @rakita in #3367
  • docs: clarify gmp uses dynamic linking (no GPL implications) by @gakonst in #3383
  • feat(database): add clear() to CacheState and TransitionState by @mattsse in #3390
  • perf(state): avoid unnecessary clone, prealloc, and fix typo by @nkysg in #3387
  • fix(db): use self.storage() in storage_by_account_id to a...
Read more

tag v103, revm v34.0.0

Choose a tag to compare

@rakita rakita released this 15 Jan 16:21
50405a2

What's Changed

  • chore(test): rn unused folders to free space by @rakita in #3180
  • feat: sort accounts by address in blockchaintest output by @RyanBGG in #3182
  • chore(fmt): merge all imports by @rakita in #3184
  • chore(op-test): regenerate missing test fixture by @rakita in #3185
  • ci: bump actions/checkout to v6 by @rejected-l in #3189
  • chore: apply_auth_list helper fn by @rakita in #3187
  • refactor: optimize vector initialization with size hints by @jackwener in #3191
  • state: deduplicate local/global flags setup by @maradini77 in #3190
  • opt: optimize precompile extend() by @jackwener in #3192
  • Remove duplicate traces directory creation in block_traces example` by @maradini77 in #3193
  • refactor: optimize vector initialization using size hints by @Keemosty12 in #3200
  • feat: Restrict Database::Error. JournaledAccountTr by @rakita in #3199
  • opt: replace HashMap with fixed-size array for opcode counts in CountInspector by @jackwener in #3203
  • feat: DatabaseCommit::commit_iter by @0xForerunner in #3197
  • fix: set transaction_id on new account by @rakita in #3204
  • feat: DatabaseCommitExt + increment_balances by @0xForerunner in #3195
  • feat: DatabaseCommitExt::drain_balances by @0xForerunner in #3205
  • feat: early return if the l1 fee scalar is zero by @datnguyencse in #3213
  • fix(statetest): use spec-aware blob base fee update fraction by @bshastry in #3210
  • feat: JournaledAccount sload/sstore by @rakita in #3201
  • feat(create): Implement Cache for CreateInputs::created_address by @developeruche in #3218
  • feat: Gas params by @rakita in #3132
  • fix(create): Fix CreateInputs::created_address Cache invalidation by @developeruche in #3222
  • fix: remove unused duplicate ContextSetters trait in context crate by @anim001k in #3225
  • chore(clippy): remove unused imports by @rakita in #3227
  • Remove redundant tx fetch in Optimism handler gas accounting by @anim001k in #3220
  • perf(database): avoid triple cache lookup by @shekhirin in #3232
  • perf(database): use fixed hashmaps in cache db by @shekhirin in #3231
  • fix(database): verify handle belongs to current runtime before block_in_place by @forkfury in #3212
  • Fix incorrect debug log message in blockchain test runner by @anim001k in #3233
  • refactor(handler): validate_initial_tx_gas takes &mut Evm by @rakita in #3235
  • feat: BAL EIP-7928 by @rakita in #3070
  • fix: deduplicate post-state validation error handling by @anim001k in #3228
  • fix: remove redundant trace file creation in block_traces example by @leopardracer in #3245
  • fix: use expected_exception instead of error field for unexpected_success status by @leopardracer in #3244
  • refactor(handler): eliminate code duplication in transaction validation by @letmehateu in #3243
  • refactor: re-export statetest-types from revm crate behind test-types feature by @rakita in #3247
  • perf: avoid collect by @klkvr in #3242
  • feat: dynamically link gmp by @gakonst in #3250
  • fix(database): use conservative block_in_place strategy to prevent deadlock by @woojinnn in #3251
  • feat: rm gmp use-system-libs by @rakita in #3253
  • feat: Propagate map-foldhash Feature Through Dependency Chain by @woojinnn in #3252
  • refactor: remove redundant clone calls by @doocho in #3258
  • refactor(revme): extract JSON printing helper in blockchaintest by @letmehateu in #3257
  • docs: description of Handler::validate_against_state_and_deduct_caller should match responsibilities by @preston-evans98 in #3256
  • chore: sort storage keys and test files in blockchaintest output by @RyanBGG in #3186
  • refactor(revme): use unwrap_or_default for non-UTF8 path safety by @letmehateu in #3259
  • perf: avoid loading bytecode in extcodehash by @MoNyAvA in #3261
  • fix: the MLOAD opcode can modify memory by @Wodann in #3266
  • perf: add Display for HaltReason and OutOfGasError by @RyanBGG in #3265
  • chore: add Display trait for ExecutionResult and related types by @RyanBGG in #3267
  • chore: the KECCAK256 opcode can resize memory by @joeybright53 in #3269
  • chore: happy new year, 2026 licence by @rakita in #3272
  • perf: add optimization for push and pop by @malik672 in #3263
  • fix(bytecode): remove duplicate implementation in bytes_ref method by @Fallengirl in #3276
  • fix: incorrect bytecode value in blockchain test error output by @maximevtush in #3288
  • feat: move GasParams to Cfg by @rakita in #3229
  • feat: new gas params, tx initial gas and codedeposit by @rakita in #3260
  • fix(database): make DatabaseCommit dyn-compatible by @haythemsellami in #3264
  • fix(test): one gasid name is missing by @rakita in #3290
  • fix(database): return error instead of panic when block not found in AlloyDB by @doocho in #3284
  • feat(inspector): make TestInspector public for testing EVM variants by @RyanBGG in #3282
  • docs: fix typos and grammar in database crate by @doocho in #3279
  • Feat(cache-db): Added pritty_print for CacheDB by @developeruche in #3296
  • chore: fix outdated doc comment by @RyanBGG in #3293
  • refactor(revme): consolidate find_all_json_tests in dir_utils by @letmehateu in #3262
  • fix typos, grammar errors, and improve documentation consistency by @leopardracer in #3294
  • chore: apply improvements from ai-bot labeled PRs by @rakita in #3297
  • perf: remove redundant clones in gas params defaults by @zeroprooff in #3300
  • feat: add new_oog helpers to InterpreterResult, CallOutcome, CreateOutcome, and FrameResult by @rakita in #3309
  • refactor(precompile): extract common pairing_check_bytes logic in bls12_381 by @letmehateu in #3301
  • refactor(gas_params): add dedicated GasIds for sstore_refund by @rakita in #3310
  • chore: bump cargo.toml by @rakita in #3311
  • chore: release by @github-actions[bot] in #3175
  • bump: revm v34.0.0 by @rakita in #3313
  • chore(script): move statetest before revm publish by @rakita in #3314

New Contributors

Read more

tag v102 revm v33.1.0

Choose a tag to compare

@rakita rakita released this 14 Nov 14:20
0d424ba

Fix for pre berlin selfdestruct oog, introduced in v99 tag (revm v32.0.0)

What's Changed

  • fix: expose optional_priority_fee_check feature from context crate by @jonathanykh in #3159
  • feat(context): add mark_cold method to JournaledAccount by @karlb in #3160
  • feat: Add set nonce journal entry and fn by @rakita in #3163
  • fix(op-revm): return error when enveloped_tx is missing by @Keemosty12 in #3143
  • fix(database): return correct bytecode in BenchmarkDB::code_by_hash by @viktorking7 in #3170
  • fix: correctly handle selfdestruct cold load by @klkvr in #3174
  • chore: release by @github-actions[bot] in #3162
  • bump: tag v102 revm v33.1.0 by @rakita in #3177

Backported from previous release:

New Contributors

Full Changelog: v100...v102