diff --git a/crates/evm/src/block/mod.rs b/crates/evm/src/block/mod.rs index a6f4394c..10c81f74 100644 --- a/crates/evm/src/block/mod.rs +++ b/crates/evm/src/block/mod.rs @@ -5,9 +5,8 @@ use alloc::{boxed::Box, vec::Vec}; use alloy_eips::eip7685::Requests; use revm::{ context::result::{ExecutionResult, ResultAndState}, - database::State, inspector::NoOpInspector, - Inspector, + DatabaseCommit, Inspector, }; mod error; @@ -328,22 +327,22 @@ pub trait BlockExecutor { pub trait BlockExecutorFor<'a, F: BlockExecutorFactory + ?Sized, DB, I = NoOpInspector> where Self: BlockExecutor< - Evm = ::Evm<&'a mut State, I>, + Evm = ::Evm, Transaction = F::Transaction, Receipt = F::Receipt, >, - DB: Database + 'a, - I: Inspector<::Context<&'a mut State>> + 'a, + DB: Database + DatabaseCommit + StateDB + 'a, + I: Inspector<::Context> + 'a, { } impl<'a, F, DB, I, T> BlockExecutorFor<'a, F, DB, I> for T where F: BlockExecutorFactory, - DB: Database + 'a, - I: Inspector<::Context<&'a mut State>> + 'a, + DB: Database + DatabaseCommit + StateDB + 'a, + I: Inspector<::Context> + 'a, T: BlockExecutor< - Evm = ::Evm<&'a mut State, I>, + Evm = ::Evm, Transaction = F::Transaction, Receipt = F::Receipt, >, @@ -467,10 +466,10 @@ pub trait BlockExecutorFactory: 'static { /// ``` fn create_executor<'a, DB, I>( &'a self, - evm: ::Evm<&'a mut State, I>, + evm: ::Evm, ctx: Self::ExecutionCtx<'a>, ) -> impl BlockExecutorFor<'a, Self, DB, I> where - DB: Database + 'a, - I: Inspector<::Context<&'a mut State>> + 'a; + DB: Database + DatabaseCommit + StateDB + 'a, + I: Inspector<::Context> + 'a; } diff --git a/crates/evm/src/block/state.rs b/crates/evm/src/block/state.rs index 1f3ab1f0..640533e6 100644 --- a/crates/evm/src/block/state.rs +++ b/crates/evm/src/block/state.rs @@ -1,5 +1,6 @@ //! State database abstraction. +use alloc::vec::Vec; use alloy_primitives::Address; use revm::database::State; @@ -22,6 +23,12 @@ pub trait StateDB: revm::Database { &mut self, balances: impl IntoIterator, ) -> Result<(), Self::Error>; + + /// Drains balances from the given accounts and returns the removed balances. + fn drain_balances( + &mut self, + addresses: impl IntoIterator, + ) -> Result, Self::Error>; } /// auto_impl unable to reconcile return associated type from supertrait @@ -36,6 +43,13 @@ impl StateDB for &mut T { ) -> Result<(), Self::Error> { StateDB::increment_balances(*self, balances) } + + fn drain_balances( + &mut self, + addresses: impl IntoIterator, + ) -> Result, Self::Error> { + StateDB::drain_balances(*self, addresses) + } } impl StateDB for State { @@ -49,4 +63,11 @@ impl StateDB for State { ) -> Result<(), Self::Error> { Self::increment_balances(self, balances) } + + fn drain_balances( + &mut self, + addresses: impl IntoIterator, + ) -> Result, Self::Error> { + Self::drain_balances(self, addresses) + } } diff --git a/crates/evm/src/eth/block.rs b/crates/evm/src/eth/block.rs index c77c9e1c..a3db87b6 100644 --- a/crates/evm/src/eth/block.rs +++ b/crates/evm/src/eth/block.rs @@ -11,7 +11,7 @@ use crate::{ state_changes::{balance_increment_state, post_block_balance_increments}, BlockExecutionError, BlockExecutionResult, BlockExecutor, BlockExecutorFactory, BlockExecutorFor, BlockValidationError, ExecutableTx, OnStateHook, - StateChangePostBlockSource, StateChangeSource, SystemCaller, + StateChangePostBlockSource, StateChangeSource, StateDB, SystemCaller, }, Database, Evm, EvmFactory, FromRecoveredTx, FromTxWithEncoded, }; @@ -20,10 +20,7 @@ use alloy_consensus::{Header, Transaction, TxReceipt}; use alloy_eips::{eip4895::Withdrawals, eip7685::Requests, Encodable2718}; use alloy_hardforks::EthereumHardfork; use alloy_primitives::{Log, B256}; -use revm::{ - context::Block, context_interface::result::ResultAndState, database::State, DatabaseCommit, - Inspector, -}; +use revm::{context::Block, context_interface::result::ResultAndState, DatabaseCommit, Inspector}; /// Context for Ethereum block execution. #[derive(Debug, Clone)] @@ -83,11 +80,10 @@ where } } -impl<'db, DB, E, Spec, R> BlockExecutor for EthBlockExecutor<'_, E, Spec, R> +impl BlockExecutor for EthBlockExecutor<'_, E, Spec, R> where - DB: Database + 'db, E: Evm< - DB = &'db mut State, + DB: Database + DatabaseCommit + StateDB, Tx: FromRecoveredTx + FromTxWithEncoded, >, Spec: EthExecutorSpec, @@ -314,12 +310,12 @@ where fn create_executor<'a, DB, I>( &'a self, - evm: EvmF::Evm<&'a mut State, I>, + evm: EvmF::Evm, ctx: Self::ExecutionCtx<'a>, ) -> impl BlockExecutorFor<'a, Self, DB, I> where - DB: Database + 'a, - I: Inspector>> + 'a, + DB: Database + DatabaseCommit + StateDB + 'a, + I: Inspector> + 'a, { EthBlockExecutor::new(evm, ctx, &self.spec, &self.receipt_builder) } diff --git a/crates/op-evm/src/block/mod.rs b/crates/op-evm/src/block/mod.rs index 9960cac6..1e7b8eb2 100644 --- a/crates/op-evm/src/block/mod.rs +++ b/crates/op-evm/src/block/mod.rs @@ -26,7 +26,6 @@ pub use receipt_builder::OpAlloyReceiptBuilder; use receipt_builder::OpReceiptBuilder; use revm::{ context::{result::ResultAndState, Block}, - database::State, Database as _, DatabaseCommit, Inspector, }; @@ -416,12 +415,12 @@ where fn create_executor<'a, DB, I>( &'a self, - evm: EvmF::Evm<&'a mut State, I>, + evm: EvmF::Evm, ctx: Self::ExecutionCtx<'a>, ) -> impl BlockExecutorFor<'a, Self, DB, I> where - DB: Database + 'a, - I: Inspector>> + 'a, + DB: Database + DatabaseCommit + StateDB + 'a, + I: Inspector> + 'a, { OpBlockExecutor::new(evm, ctx, &self.spec, &self.receipt_builder) } @@ -446,7 +445,7 @@ mod tests { }; use revm::{ context::BlockEnv, - database::{CacheDB, EmptyDB, InMemoryDB}, + database::{CacheDB, EmptyDB, InMemoryDB, State}, inspector::NoOpInspector, primitives::HashMap, state::AccountInfo,