Skip to content

Releases: bluealloy/revm

tag v105 revm v36.0.0

04 Mar 11:28
3631979

Choose a tag to compare

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

03 Mar 15:52
ae1c9dc

Choose a tag to compare

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

15 Jan 16:21
50405a2

Choose a tag to compare

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

14 Nov 14:20
0d424ba

Choose a tag to compare

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

tag v101, revm v33.0.1

14 Nov 13:46

Choose a tag to compare

patch release for: fix: call Inspector::log_full by @klkvr in #3164

Full Changelog: v100...v101

tag v100, revm v33.0.0

12 Nov 01:06
5723170

Choose a tag to compare

100 releases, we came far.

Republishing last release to fix semver issue reported here: #3158

What's Changed

Full Changelog: v99...v100

tag v99 revm v32.0.0

10 Nov 23:23
8a784a7

Choose a tag to compare

What's Changed

  • fix(revme): use primitive hashmap in statetest by @rakita in #3137
  • feat: selfdestruct oog on cold load by @rakita in #3140
  • chore(interpreter): deprecate public otry! macro by @sashass1315 in #3146
  • chore: add eq/serde for InitialAndFloorGas by @rakita in #3147
  • fix: use access list to decide if slot is cold by @rakita in #3149
  • feat: add gas refund to PrecompileOutput by @rakita in #3152
  • fix(op): Ensure L1Block account is always loaded (#3150) by @rakita in #3154
  • chore: merge v98 versions bumps by @rakita in #3155
  • feat: process precompile logs to inspector by @rakita in #3148
  • feat(precompiles): add performant PrecompileError::OtherCowStr variant by @rakita in #3144
  • feat: generic Context::new by @klkvr in #3156
  • chore: release by @github-actions[bot] in #3136
  • bump: v99 revm v32.0.0 by @rakita in #3157

Full Changelog: v96...v99

tag v98 op-revm 12.0.2

10 Nov 14:32

Choose a tag to compare

What's Changed

  • fix(op): Ensure L1Block account is always loaded by @rakita in #3150

Full Changelog: v97...v98

tag v97 revm v31.0.1

07 Nov 11:10

Choose a tag to compare

What's Changed

  • fix(revme): use primitive hashmap in statetest by @rakita in #3137
  • fix: use access list to decide if slot is cold (#3149) by @rakita

Full Changelog: v96...v97

tag v96 revm v31.0.0

03 Nov 12:23
4e8be41

Choose a tag to compare

What's Changed

  • chore: journal transfer fn cleanup by @rakita in #3085
  • chore(inspector): remove redundant EthInterpreter import in either.rs by @Galoretka in #3093
  • fix(op-revm): add missing enveloped_tx validation in validate_env by @sky-coderay in #3094
  • chore(docs): recorrect eip4788 by @RyanBGG in #3111
  • perf: optimize storage validation loop in blockchaintest by @vtjl10 in #3107
  • chore: consolidate revme imports by @rakita in #3088
  • chore(precompile): remove unused mainnet_address() function by @0xMushow in #3091
  • chore: remove redundant alloy-eip7702 from handler dev-dependencies by @RyanBGG in #3105
  • chore(op): use helper function in validate against state by @rakita in #3069
  • feat: dont load access list immediatly by @rakita in #3116
  • feat: impl Sealable for Bytecode by @makcandrov in #3118
  • fix(jovian): fixes the DA footprint update storage slot. fix l1 fork associated with Jovian. by @theochap in #3120
  • feat: JournaledAccount, a nice way to update and track changes by @rakita in #3086
  • fix: hook up Cfg::memory_limit by @DaniPopes in #3129
  • fix(context): avoid double reference in Context::all() by @gap-editor in #3131
  • chore: release by @github-actions[bot] in #3113
  • feat(precompiles/jovian): add jovian precompiles to revm (#3128) by @rakita in #3134
  • bump: tag v96 revm v31.0.0 by @rakita in #3135

New Contributors

Full Changelog: v93...v96