diff --git a/crates/ethereum-rpc/src/ethereum.rs b/crates/ethereum-rpc/src/ethereum.rs index 207df4a9a..0799a9410 100644 --- a/crates/ethereum-rpc/src/ethereum.rs +++ b/crates/ethereum-rpc/src/ethereum.rs @@ -1,7 +1,7 @@ use std::sync::{Arc, Mutex}; use alloy_primitives::U256; -use alloy_rpc_types_trace::geth::GethTrace; +use alloy_rpc_types_trace::geth::TraceResult; #[cfg(feature = "local")] use citrea_evm::DevSigner; use citrea_evm::Evm; @@ -40,7 +40,7 @@ pub struct Ethereum { pub(crate) ledger_db: LedgerDB, pub(crate) sequencer_client: Option, pub(crate) web3_client_version: String, - pub(crate) trace_cache: Mutex, ByLength>>, + pub(crate) trace_cache: Mutex, ByLength>>, pub(crate) subscription_manager: Option, } diff --git a/crates/ethereum-rpc/src/lib.rs b/crates/ethereum-rpc/src/lib.rs index 51785339f..fdd175c94 100644 --- a/crates/ethereum-rpc/src/lib.rs +++ b/crates/ethereum-rpc/src/lib.rs @@ -8,7 +8,7 @@ use std::sync::Arc; use alloy_network::AnyNetwork; use alloy_primitives::{keccak256, Bytes, B256, U256}; use alloy_rpc_types::{FeeHistory, Index}; -use alloy_rpc_types_trace::geth::{GethDebugTracingOptions, GethTrace}; +use alloy_rpc_types_trace::geth::{GethDebugTracingOptions, GethTrace, TraceResult}; #[cfg(feature = "local")] pub use citrea_evm::DevSigner; use citrea_evm::{Evm, Filter}; @@ -394,7 +394,7 @@ fn register_rpc_methods( // Ok::<_, ErrorObjectOwned>(tx_hash) // })?; - rpc.register_blocking_method::, ErrorObjectOwned>, _>( + rpc.register_blocking_method::, ErrorObjectOwned>, _>( "debug_traceBlockByHash", move |parameters, ethereum, _| { let mut params = parameters.sequence(); @@ -416,7 +416,7 @@ fn register_rpc_methods( }, )?; - rpc.register_blocking_method::, ErrorObjectOwned>, _>( + rpc.register_blocking_method::, ErrorObjectOwned>, _>( "debug_traceBlockByNumber", move |parameters, ethereum, _| { let mut params = parameters.sequence(); @@ -479,7 +479,15 @@ fn register_rpc_methods( &mut working_set, opts, )?; - Ok(traces[0].clone()) + match &traces[0] { + TraceResult::Success { result, .. } => { + Ok(result.clone()) + } + // this should never happen since we propagate any tracing error + TraceResult::Error { error, tx_hash: _} => { + Err(EthApiError::EvmCustom(error.clone()).into()) + } + } }, )?; diff --git a/crates/ethereum-rpc/src/trace.rs b/crates/ethereum-rpc/src/trace.rs index 1e3100c9f..c27706dd6 100644 --- a/crates/ethereum-rpc/src/trace.rs +++ b/crates/ethereum-rpc/src/trace.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use alloy_rpc_types_trace::geth::{ CallConfig, CallFrame, FourByteFrame, GethDebugBuiltInTracerType, GethDebugTracerConfig, - GethDebugTracerType, GethDebugTracingOptions, GethTrace, NoopFrame, + GethDebugTracerType, GethDebugTracingOptions, GethTrace, NoopFrame, TraceResult, }; #[cfg(feature = "local")] use citrea_evm::Evm; @@ -140,7 +140,7 @@ pub fn debug_trace_by_block_number( evm: &Evm, working_set: &mut WorkingSet, opts: Option, -) -> Result, ErrorObjectOwned> { +) -> Result, ErrorObjectOwned> { // If opts is None or if opts.tracer is None, then do not check cache or insert cache, just perform the operation if opts.as_ref().map_or(true, |o| o.tracer.is_none()) { let traces = @@ -209,10 +209,10 @@ fn remove_logs_from_call_frame(call_frame: &mut Vec) { } fn get_traces_with_requested_tracer_and_config( - traces: Vec, + traces: Vec, tracer: GethDebugTracerType, tracer_config: GethDebugTracerConfig, -) -> Result, EthApiError> { +) -> Result, EthApiError> { // This can be only CallConfig or PreStateConfig if it is not CallConfig return Error for now let mut new_traces = vec![]; @@ -237,10 +237,10 @@ fn get_traces_with_requested_tracer_and_config( } _ => { traces.into_iter().for_each(|trace| { - if let GethTrace::CallTracer(call_frame) = trace { + if let TraceResult::Success { result: GethTrace::CallTracer(call_frame), tx_hash } = trace { let new_call_frame = apply_call_config(call_frame.clone(), call_config); - new_traces.push(GethTrace::CallTracer(new_call_frame)); + new_traces.push(TraceResult::new_success(GethTrace::CallTracer(new_call_frame), tx_hash)); } }); } @@ -249,16 +249,16 @@ fn get_traces_with_requested_tracer_and_config( } GethDebugBuiltInTracerType::FourByteTracer => { traces.into_iter().for_each(|trace| { - if let GethTrace::CallTracer(call_frame) = trace { + if let TraceResult::Success { result: GethTrace::CallTracer(call_frame), tx_hash } = trace { let four_byte_frame = convert_call_trace_into_4byte_frame(vec![call_frame]); - new_traces.push(GethTrace::FourByteTracer(four_byte_frame)); + new_traces.push(TraceResult::new_success(GethTrace::FourByteTracer(four_byte_frame), tx_hash)); } }); Ok(new_traces) } GethDebugBuiltInTracerType::NoopTracer => { - Ok(vec![GethTrace::NoopTracer(NoopFrame::default())]) + Ok(vec![TraceResult::new_success(GethTrace::NoopTracer(NoopFrame::default()), None)]) } _ => Err(EthApiError::Unsupported("This tracer is not supported")), } diff --git a/crates/evm/src/query.rs b/crates/evm/src/query.rs index a08253cd7..ac645bfea 100644 --- a/crates/evm/src/query.rs +++ b/crates/evm/src/query.rs @@ -14,7 +14,7 @@ use alloy_rpc_types::{ }; use alloy_rpc_types_eth::transaction::TransactionRequest; use alloy_rpc_types_eth::Block as AlloyRpcBlock; -use alloy_rpc_types_trace::geth::{GethDebugTracingOptions, GethTrace}; +use alloy_rpc_types_trace::geth::{GethDebugTracingOptions, TraceResult}; use alloy_serde::OtherFields; use citrea_primitives::basefee::calculate_next_block_base_fee; use citrea_primitives::forks::FORKS; @@ -1207,7 +1207,7 @@ impl Evm { opts: Option, stop_at: Option, working_set: &mut WorkingSet, - ) -> RpcResult> { + ) -> RpcResult> { let sealed_block = self .get_sealed_block_by_number(Some(BlockNumberOrTag::Number(block_number)), working_set)? .ok_or_else(|| EthApiError::HeaderNotFound(block_number.into()))?; @@ -1260,7 +1260,7 @@ impl Evm { &mut evm_db, l1_fee_rate, )?; - traces.push(trace); + traces.push(TraceResult::new_success(trace, Some(tx.hash()))); if limit == index { break;