diff --git a/src/handler.rs b/src/handler.rs index 8611d93..d02c836 100644 --- a/src/handler.rs +++ b/src/handler.rs @@ -12,7 +12,9 @@ use revm::{ handler::{ post_execution, EthFrame, EvmTr, EvmTrError, FrameResult, FrameTr, Handler, MainnetHandler, }, - interpreter::{interpreter::EthInterpreter, interpreter_action::FrameInit, Gas}, + interpreter::{ + interpreter::EthInterpreter, interpreter_action::FrameInit, Gas, InitialAndFloorGas, + }, primitives::U256, }; use revm_inspector::{Inspector, InspectorEvmTr, InspectorHandler}; @@ -199,6 +201,20 @@ where Ok(()) } + #[inline] + fn eip7623_check_gas_floor( + &self, + evm: &mut Self::Evm, + exec_result: &mut <::Frame as FrameTr>::FrameResult, + init_and_floor_gas: InitialAndFloorGas, + ) { + // skip floor gas check for l1 messages. + if evm.ctx().tx().is_l1_msg() { + return; + } + self.mainnet.eip7623_check_gas_floor(evm, exec_result, init_and_floor_gas) + } + #[inline] fn refund( &self, diff --git a/src/test_utils.rs b/src/test_utils.rs index 45cae46..0a31fcc 100644 --- a/src/test_utils.rs +++ b/src/test_utils.rs @@ -12,7 +12,7 @@ use std::vec::Vec; pub const TX_L1_FEE_PRECISION: U256 = U256::from_limbs([1_000_000_000u64, 0, 0, 0]); pub const CALLER: Address = address!("0x000000000000000000000000000000000000dead"); -pub const TO: Address = address!("0x0000000000000000000000000000000000000001"); +pub const TO: Address = address!("0x00000000000000000000000000000000000dead1"); pub const BENEFICIARY: Address = address!("0x0000000000000000000000000000000000000002"); pub const MIN_TRANSACTION_COST: U256 = U256::from_limbs([21_000u64, 0, 0, 0]); pub const L1_DATA_COST: U256 = U256::from_limbs([40_000u64, 0, 0, 0]); diff --git a/src/tests/l1_message.rs b/src/tests/l1_message.rs index 35017b5..afa22f6 100644 --- a/src/tests/l1_message.rs +++ b/src/tests/l1_message.rs @@ -14,12 +14,16 @@ use revm::{ result::{EVMError, ExecutionResult, HaltReason, InvalidTransaction, ResultAndState}, ContextTr, JournalTr, }, + context_interface::result::ExecutionResult::Halt, handler::{EthFrame, EvmTr, FrameResult, Handler}, - interpreter::{CallOutcome, Gas, InstructionResult, InterpreterResult}, + interpreter::{ + gas::calculate_initial_tx_gas_for_tx, CallOutcome, Gas, InstructionResult, + InterpreterResult, + }, state::Bytecode, ExecuteEvm, }; -use revm_primitives::U256; +use revm_primitives::{bytes, hardfork::SpecId, U256}; #[test] fn test_l1_message_validate_lacking_funds() -> Result<(), Box> { @@ -210,3 +214,28 @@ fn test_l1_message_eip_3607() -> Result<(), Box> { Ok(()) } + +#[test] +fn test_l1_message_should_not_have_floor_gas_as_gas_used() -> Result<(), Box> +{ + let ctx = + context().modify_cfg_chained(|cfg| cfg.enable_eip7623 = true).modify_tx_chained(|tx| { + tx.base.data = + bytes!("0x000000000123456789abcdef00000000123456789abcdef00000000123456789abcdef"); + tx.base.tx_type = L1_MESSAGE_TYPE; + tx.base.caller = CALLER; + tx.base.gas_limit = 200000; + tx.base.value = U256::ONE; + }); + let tx = ctx.tx.clone(); + let mut evm = ctx.build_scroll(); + let res = evm.transact(tx.clone())?; + + // floor gas is TOTAL_COST_FLOOR_PER_TOKEN * tokens_in_calldata + 21_000 = 22070; + let expected_init_gas = + calculate_initial_tx_gas_for_tx(tx, SpecId::SHANGHAI, true, true).initial_gas; + + assert_eq!(res.result, Halt { reason: HaltReason::OutOfFunds, gas_used: expected_init_gas }); + + Ok(()) +}