From b54be5246e5fdc38bf2eacfb5cc0f7ee11f2ea8f Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Mon, 28 Jul 2025 14:36:41 +0200 Subject: [PATCH 1/3] Adds handler test for verifying unchanged nonce on balance too low revert --- crates/op-revm/src/handler.rs | 33 +++++++++++++++++++++++++++++ crates/op-revm/tests/integration.rs | 3 ++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/crates/op-revm/src/handler.rs b/crates/op-revm/src/handler.rs index 4d4a6d00ec..f00414ec50 100644 --- a/crates/op-revm/src/handler.rs +++ b/crates/op-revm/src/handler.rs @@ -1109,4 +1109,37 @@ mod tests { let account = evm.ctx().journal_mut().load_account(SENDER).unwrap(); assert_eq!(account.info.balance, expected_refund); } + + #[test] + fn test_tx_low_balance_nonce_unchanged() { + let ctx = Context::op().with_tx( + OpTransaction::builder() + .base(TxEnv::builder().value(U256::from(1000))) + .build_fill(), + ); + + let mut evm = ctx.build_op(); + + let handler = + OpHandler::<_, EVMError<_, OpTransactionError>, EthFrame>::new(); + + let result = handler.validate_against_state_and_deduct_caller(&mut evm); + + assert!(matches!( + result.err().unwrap(), + EVMError::Transaction(OpTransactionError::Base( + InvalidTransaction::LackOfFundForMaxFee { .. } + )) + )); + assert_eq!( + evm.0 + .ctx + .journal_mut() + .load_account(Address::ZERO) + .unwrap() + .info + .nonce, + 0 + ); + } } diff --git a/crates/op-revm/tests/integration.rs b/crates/op-revm/tests/integration.rs index c20993daff..b2568bfa30 100644 --- a/crates/op-revm/tests/integration.rs +++ b/crates/op-revm/tests/integration.rs @@ -3,6 +3,7 @@ mod common; use alloy_primitives::bytes; use common::compare_or_save_testdata; +use op_revm::OpTransactionError; use op_revm::{ precompiles::bn254_pair::GRANITE_MAX_INPUT_SIZE, DefaultOp, L1BlockInfo, OpBuilder, OpHaltReason, OpSpecId, OpTransaction, @@ -14,7 +15,7 @@ use revm::{ result::{ExecutionResult, OutOfGasError}, BlockEnv, CfgEnv, TxEnv, }, - context_interface::result::HaltReason, + context_interface::result::{EVMError, HaltReason, InvalidTransaction}, database::{BenchmarkDB, EmptyDB, BENCH_CALLER, BENCH_CALLER_BALANCE, BENCH_TARGET}, interpreter::{ gas::{calculate_initial_tx_gas, InitialAndFloorGas}, From 13f2736e9b83f8cc314b3821f788bcaf8b452fd9 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Tue, 29 Jul 2025 16:24:48 +0200 Subject: [PATCH 2/3] Fix system call test --- crates/op-revm/tests/integration.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/op-revm/tests/integration.rs b/crates/op-revm/tests/integration.rs index b2568bfa30..457ae955f2 100644 --- a/crates/op-revm/tests/integration.rs +++ b/crates/op-revm/tests/integration.rs @@ -1082,11 +1082,11 @@ fn test_system_call() { let mut evm = ctx.build_op(); - evm.transact_system_call(BENCH_TARGET, bytes!("0x0001")) + let _ = evm + .transact_system_call(BENCH_TARGET, bytes!("0x0001")) .unwrap(); + let state = evm.finalize(); - // Run evm. - let output = evm.replay().unwrap(); - - compare_or_save_testdata("test_system_call.json", &output); + assert!(state.get(&Address::ZERO).is_none()); + assert!(state.get(&BENCH_TARGET).unwrap().is_touched()); } From 2b2aeffa105bd3b3e949f26a317dea4bdbeeac57 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Tue, 29 Jul 2025 17:05:29 +0200 Subject: [PATCH 3/3] fixup! Fix merge conflicts --- crates/ee-tests/src/op_revm_tests.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/crates/ee-tests/src/op_revm_tests.rs b/crates/ee-tests/src/op_revm_tests.rs index beee16ee63..a48dd2aedb 100644 --- a/crates/ee-tests/src/op_revm_tests.rs +++ b/crates/ee-tests/src/op_revm_tests.rs @@ -11,7 +11,7 @@ use revm::{ result::{ExecutionResult, OutOfGasError}, BlockEnv, CfgEnv, TxEnv, }, - context_interface::result::{EVMError, HaltReason, InvalidTransaction}, + context_interface::result::HaltReason, database::{BenchmarkDB, EmptyDB, BENCH_CALLER, BENCH_CALLER_BALANCE, BENCH_TARGET}, handler::system_call::SYSTEM_ADDRESS, interpreter::{ @@ -1134,11 +1134,9 @@ fn test_system_call() { let mut evm = ctx.build_op(); - let _ = evm - .transact_system_call(BENCH_TARGET, bytes!("0x0001")) - .unwrap(); + let _ = evm.system_call_one(SYSTEM_ADDRESS, BENCH_TARGET, bytes!("0x0001")); let state = evm.finalize(); - assert!(state.get(&Address::ZERO).is_none()); + assert!(state.get(&SYSTEM_ADDRESS).is_none()); assert!(state.get(&BENCH_TARGET).unwrap().is_touched()); }