Releases: bluealloy/revm
tag v105 revm v36.0.0
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
tag v104, revm v35.0.0
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 Bytecode —
Bytecodeis now a struct wrappingArc<BytecodeInner>instead of an enum. Use accessor methods (kind(),is_legacy(),eip7702_address()) instead of pattern matching. (#3375) ResultGasstruct inExecutionResult— Separategas_used/gas_refundedfields replaced by aResultGasstruct with methodsused(),remaining(),inner_refunded(),final_refunded(),spent_sub_refunded(). (#3413)- Logs in Revert/Halt variants —
ExecutionResult::RevertandHaltnow carrylogs: Vec<Log>for logs emitted before failure. (#3424) - EIP-161 state clear moved into journal finalize — Removed
has_state_clearfield and related methods fromCacheState/State. (#3444) - Remove Default for EthPrecompiles and EthInstructions — Use
new(spec)constructors instead. (#3434) - Fixed-bytes hashmaps from alloy-core —
HashMap<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.BlockEnvgainsslot_num: u64field,Hosttrait gainsslot_num()method. (#3340) - EIP-8024: DUPN, SWAPN, EXCHANGE opcodes — New opcodes at
0xE6–0xE8with a newInvalidImmediateEncodinginstruction result variant. (#3223)
Features
- BAL (Block Access List) support — New example and
StateBuilder::with_bal_builder_ifhelper. (#3339, #3351) - aws-lc-rs backend for secp256r1 — Alternative precompile backend via feature flag. (#3451)
- Configurable EIP-7702 auth refund — New
GasParamsentry. (#3366) tx_access_list_costhelper — Added toGasParams. (#3349)clear()for CacheState and TransitionState — Convenience method. (#3390)BlockHashCachehelpers —iter()andlowest()methods. (#3352)- Storage getter on
BundleState— (#3321) - revme:
--jsonoutput flag for evmrunner. (#3428) - revme:
--omit-progressflag 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, andadd_transitions. (#3430, #3373) - Avoid unnecessary clone/prealloc in state operations. (#3387)
- Remove unnecessary
enveloped_txclone in op-revm. (#3455)
Bug Fixes
- Forward
storage_by_account_idinWrapDatabaseRef. (#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_disabledincalculate_caller_fee. (#3401) - Fix
storage_by_account_idcache bypass in CacheDB. (#3385) - Fix populated account if BAL pre-state was none. (#3357)
- Set
transition_idto 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_entryandcaller_accounting_journal_entryfunctions 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...
tag v103, revm v34.0.0
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_placestrategy to prevent deadlock by @woojinnn in #3251 - feat: rm gmp use-system-libs by @rakita in #3253
- feat: Propagate
map-foldhashFeature 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_callershould 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_ooghelpers 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
- @0xForerunner made their first contribution in #3197
- @datnguyencse made their first contribution in #3213
- @bshastry made their first contribution in #3210
- @forkfury made their first contribution in #3212
- @letmehateu made their first contribution in #3243
- @woojinnn made their first contribution in #3251
- @doocho made their first contribution in #3258
- @preston-evans98 made their first contribution in #3256
- @MoNyAvA made their first contribution in #3261
- @joeybright53 made their first contribution in #3269
- @malik672 made their first contribution in #3263
- @Fallengirl made their first contribution in #3276
- @haythemsellami made their first contribution in #3264
- @zeroprooff made th...
tag v102 revm v33.1.0
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
- @jonathanykh made their first contribution in #3159
- @karlb made their first contribution in #3160
- @Keemosty12 made their first contribution in #3143
Full Changelog: v100...v102
tag v101, revm v33.0.1
patch release for: fix: call Inspector::log_full by @klkvr in #3164
Full Changelog: v100...v101
tag v100, revm v33.0.0
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
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
tag v97 revm v31.0.1
tag v96 revm v31.0.0
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
SealableforBytecodeby @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
- @sky-coderay made their first contribution in #3094
- @vtjl10 made their first contribution in #3107
Full Changelog: v93...v96