@@ -26,9 +26,7 @@ use anvil_core::eth::{
26
26
} ;
27
27
use foundry_evm:: { backend:: DatabaseError , traces:: CallTraceNode } ;
28
28
use foundry_evm_core:: { either_evm:: EitherEvm , evm:: FoundryPrecompiles } ;
29
- use op_revm:: {
30
- transaction:: deposit:: DEPOSIT_TRANSACTION_TYPE , L1BlockInfo , OpContext , OpTransactionError ,
31
- } ;
29
+ use op_revm:: { L1BlockInfo , OpContext } ;
32
30
use revm:: {
33
31
context:: { Block as RevmBlock , BlockEnv , CfgEnv , Evm as RevmEvm , JournalTr } ,
34
32
context_interface:: result:: { EVMError , ExecutionResult , Output } ,
@@ -114,6 +112,7 @@ pub struct TransactionExecutor<'a, Db: ?Sized, V: TransactionValidator> {
114
112
pub blob_gas_used : u64 ,
115
113
pub enable_steps_tracing : bool ,
116
114
pub odyssey : bool ,
115
+ pub optimism : bool ,
117
116
pub print_logs : bool ,
118
117
pub print_traces : bool ,
119
118
/// Precompiles to inject to the EVM.
@@ -248,13 +247,15 @@ impl<DB: Db + ?Sized, V: TransactionValidator> TransactionExecutor<'_, DB, V> {
248
247
}
249
248
250
249
fn env_for ( & self , tx : & PendingTransaction ) -> Env {
251
- let op_tx = tx. to_revm_tx_env ( ) ;
250
+ let mut tx_env = tx. to_revm_tx_env ( ) ;
252
251
253
- let mut env = Env :: from ( self . cfg_env . clone ( ) , self . block_env . clone ( ) , op_tx. clone ( ) ) ;
254
- if env. tx . base . tx_type == DEPOSIT_TRANSACTION_TYPE {
255
- env = env. with_deposit ( op_tx. deposit ) ;
252
+ if self . optimism {
253
+ tx_env. enveloped_tx = Some ( alloy_rlp:: encode ( & tx. transaction . transaction ) . into ( ) ) ;
256
254
}
257
255
256
+ let mut env = Env :: new ( self . cfg_env . clone ( ) , self . block_env . clone ( ) , op_tx) ;
257
+ env. is_optimism = self . optimism ;
258
+
258
259
env
259
260
}
260
261
}
@@ -308,7 +309,7 @@ impl<DB: Db + ?Sized, V: TransactionValidator> Iterator for &mut TransactionExec
308
309
& env,
309
310
) {
310
311
warn ! ( target: "backend" , "Skipping invalid tx execution [{:?}] {}" , transaction. hash( ) , err) ;
311
- return Some ( TransactionExecutionOutcome :: Invalid ( transaction, err) )
312
+ return Some ( TransactionExecutionOutcome :: Invalid ( transaction, err) ) ;
312
313
}
313
314
314
315
let nonce = account. nonce ;
@@ -324,32 +325,35 @@ impl<DB: Db + ?Sized, V: TransactionValidator> Iterator for &mut TransactionExec
324
325
inspector = inspector. with_trace_printer ( ) ;
325
326
}
326
327
327
- let mut evm = evm_with_inspector (
328
- & mut * self . db ,
329
- & env,
330
- & mut inspector,
331
- transaction. tx_type ( ) == DEPOSIT_TRANSACTION_TYPE ,
332
- ) ;
333
- trace ! ( target: "backend" , "[{:?}] executing" , transaction. hash( ) ) ;
334
- let exec_result = match evm. transact_commit ( env. tx ) {
335
- Ok ( exec_result) => exec_result,
336
- Err ( err) => {
337
- warn ! ( target: "backend" , "[{:?}] failed to execute: {:?}" , transaction. hash( ) , err) ;
338
- match err {
339
- EVMError :: Database ( err) => {
340
- return Some ( TransactionExecutionOutcome :: DatabaseError ( transaction, err) )
341
- }
342
- EVMError :: Transaction ( err) => {
343
- let err = match err {
344
- OpTransactionError :: Base ( err) => err. into ( ) ,
345
- OpTransactionError :: HaltedDepositPostRegolith |
346
- OpTransactionError :: DepositSystemTxPostRegolith => {
347
- InvalidTransactionError :: DepositTxErrorPostRegolith
348
- }
349
- } ;
350
- return Some ( TransactionExecutionOutcome :: Invalid ( transaction, err) )
328
+ let exec_result = {
329
+ let mut evm = new_evm_with_inspector ( & mut * self . db , & env, & mut inspector) ;
330
+ // if let Some(factory) = &self.precompile_factory {
331
+ // inject_precompiles(&mut evm, factory.precompiles());
332
+ // }
333
+
334
+ trace ! ( target: "backend" , "[{:?}] executing" , transaction. hash( ) ) ;
335
+ // transact and commit the transaction
336
+ match evm. transact_commit ( env. tx ) {
337
+ Ok ( exec_result) => exec_result,
338
+ Err ( err) => {
339
+ warn ! ( target: "backend" , "[{:?}] failed to execute: {:?}" , transaction. hash( ) , err) ;
340
+ match err {
341
+ EVMError :: Database ( err) => {
342
+ return Some ( TransactionExecutionOutcome :: DatabaseError (
343
+ transaction,
344
+ err,
345
+ ) )
346
+ }
347
+ EVMError :: Transaction ( err) => {
348
+ return Some ( TransactionExecutionOutcome :: Invalid (
349
+ transaction,
350
+ err. into ( ) ,
351
+ ) )
352
+ }
353
+ // This will correspond to prevrandao not set, and it should never happen.
354
+ // If it does, it's a bug.
355
+ e => panic ! ( "failed to execute transaction: {e}" ) ,
351
356
}
352
- e => panic ! ( "failed to execute transaction: {e}" ) ,
353
357
}
354
358
}
355
359
} ;
@@ -413,17 +417,16 @@ fn build_logs_bloom(logs: Vec<Log>, bloom: &mut Bloom) {
413
417
}
414
418
415
419
/// Creates a database with given database and inspector, optionally enabling odyssey features.
416
- pub fn evm_with_inspector < DB , I > (
420
+ pub fn new_evm_with_inspector < DB , I > (
417
421
db : DB ,
418
422
env : & Env ,
419
423
inspector : I ,
420
- is_optimism : bool ,
421
424
) -> EitherEvm < DB , I , FoundryPrecompiles >
422
425
where
423
426
DB : Database < Error = DatabaseError > ,
424
427
I : Inspector < EthEvmContext < DB > > + Inspector < OpContext < DB > > ,
425
428
{
426
- if is_optimism {
429
+ if env . is_optimism {
427
430
let op_context = OpContext {
428
431
journaled_state : {
429
432
let mut journal = Journal :: new ( db) ;
@@ -476,17 +479,16 @@ where
476
479
}
477
480
478
481
/// Creates a new EVM with the given inspector and wraps the database in a `WrapDatabaseRef`.
479
- pub fn evm_with_inspector_ref < ' db , DB , I > (
482
+ pub fn new_evm_with_inspector_ref < ' db , DB , I > (
480
483
db : & ' db DB ,
481
484
env : & Env ,
482
485
inspector : & ' db mut I ,
483
- is_optimism : bool ,
484
486
) -> EitherEvm < WrapDatabaseRef < & ' db DB > , & ' db mut I , FoundryPrecompiles >
485
487
where
486
488
DB : DatabaseRef < Error = DatabaseError > + ' db + ?Sized ,
487
489
I : Inspector < EthEvmContext < WrapDatabaseRef < & ' db DB > > >
488
490
+ Inspector < OpContext < WrapDatabaseRef < & ' db DB > > > ,
489
491
WrapDatabaseRef < & ' db DB > : Database < Error = DatabaseError > ,
490
492
{
491
- evm_with_inspector ( WrapDatabaseRef ( db) , env, inspector, is_optimism )
493
+ new_evm_with_inspector ( WrapDatabaseRef ( db) , env, inspector)
492
494
}
0 commit comments