diff --git a/crates/rpc/rpc-api/src/trace.rs b/crates/rpc/rpc-api/src/trace.rs index 745aacf8b..ab4f36758 100644 --- a/crates/rpc/rpc-api/src/trace.rs +++ b/crates/rpc/rpc-api/src/trace.rs @@ -1,8 +1,9 @@ use jsonrpsee::{core::RpcResult, proc_macros::rpc}; use reth_primitives::{BlockId, Bytes, H256}; use reth_rpc_types::{ + state::StateOverride, trace::{filter::TraceFilter, parity::*}, - CallRequest, Index, + BlockOverrides, CallRequest, Index, }; use std::collections::HashSet; @@ -17,6 +18,8 @@ pub trait TraceApi { call: CallRequest, trace_types: HashSet, block_id: Option, + state_overrides: Option, + block_overrides: Option>, ) -> RpcResult; /// Performs multiple call traces on top of the same block. i.e. transaction n will be executed diff --git a/crates/rpc/rpc/src/trace.rs b/crates/rpc/rpc/src/trace.rs index 77cf0e3bd..81d0e39e5 100644 --- a/crates/rpc/rpc/src/trace.rs +++ b/crates/rpc/rpc/src/trace.rs @@ -2,7 +2,7 @@ use crate::{ eth::{ cache::EthStateCache, error::{EthApiError, EthResult}, - revm_utils::{inspect, prepare_call_env}, + revm_utils::{inspect, prepare_call_env, EvmOverrides}, utils::recover_raw_transaction, EthTransactions, }, @@ -20,8 +20,9 @@ use reth_revm::{ }; use reth_rpc_api::TraceApiServer; use reth_rpc_types::{ + state::StateOverride, trace::{filter::TraceFilter, parity::*}, - BlockError, CallRequest, Index, TransactionInfo, + BlockError, BlockOverrides, CallRequest, Index, TransactionInfo, }; use reth_tasks::TaskSpawner; use revm::primitives::Env; @@ -100,9 +101,17 @@ where call: CallRequest, trace_types: HashSet, block_id: Option, + state_overrides: Option, + block_overrides: Option>, ) -> EthResult { self.on_blocking_task(|this| async move { - this.try_trace_call(call, trace_types, block_id).await + this.try_trace_call( + call, + trace_types, + block_id, + EvmOverrides::new(state_overrides, block_overrides), + ) + .await }) .await } @@ -112,16 +121,14 @@ where call: CallRequest, trace_types: HashSet, block_id: Option, + overrides: EvmOverrides, ) -> EthResult { let at = block_id.unwrap_or(BlockId::Number(BlockNumberOrTag::Latest)); let config = tracing_config(&trace_types); let mut inspector = TracingInspector::new(config); - let (res, _) = self - .inner - .eth_api - .inspect_call_at(call, at, Default::default(), &mut inspector) - .await?; + let (res, _) = + self.inner.eth_api.inspect_call_at(call, at, overrides, &mut inspector).await?; let trace_res = inspector.into_parity_builder().into_trace_results(res.result, &trace_types); @@ -388,9 +395,19 @@ where call: CallRequest, trace_types: HashSet, block_id: Option, + state_overrides: Option, + block_overrides: Option>, ) -> Result { let _permit = self.acquire_trace_permit().await; - Ok(TraceApi::trace_call(self, call, trace_types, block_id).await?) + Ok(TraceApi::trace_call( + self, + call, + trace_types, + block_id, + state_overrides, + block_overrides, + ) + .await?) } /// Handler for `trace_callMany`