diff --git a/src/tracing/debug.rs b/src/tracing/debug.rs index d4b66202..67e4d289 100644 --- a/src/tracing/debug.rs +++ b/src/tracing/debug.rs @@ -222,6 +222,7 @@ impl DebugInspector { Self::FourByte(inspector) => FourByteFrame::from(&*inspector).into(), Self::CallTracer(inspector, config) => { inspector.set_transaction_gas_limit(tx_env.gas_limit()); + inspector.set_transaction_caller(tx_env.caller()); inspector.geth_builder().geth_call_traces(*config, res.result.gas_used()).into() } Self::PreStateTracer(inspector, config) => { @@ -239,6 +240,7 @@ impl DebugInspector { .into(), Self::FlatCallTracer(inspector) => { inspector.set_transaction_gas_limit(tx_env.gas_limit()); + inspector.set_transaction_caller(tx_env.caller()); inspector .clone() .into_parity_builder() @@ -247,6 +249,7 @@ impl DebugInspector { } Self::Erc7562Tracer(inspector, config) => { inspector.set_transaction_gas_limit(tx_env.gas_limit()); + inspector.set_transaction_caller(tx_env.caller()); inspector .geth_builder() .geth_erc7562_traces(config.clone(), res.result.gas_used(), db) @@ -254,6 +257,7 @@ impl DebugInspector { } Self::Default(inspector, config) => { inspector.set_transaction_gas_limit(tx_env.gas_limit()); + inspector.set_transaction_caller(tx_env.caller()); inspector .geth_builder() .geth_traces( diff --git a/src/tracing/mod.rs b/src/tracing/mod.rs index da6d57ac..39bf3cac 100644 --- a/src/tracing/mod.rs +++ b/src/tracing/mod.rs @@ -230,6 +230,17 @@ impl TracingInspector { self } + /// Manually set the caller address of the root trace. + /// + /// This is useful for custom transaction types (e.g. account abstraction batches) where the + /// EVM's call entry point may not reflect the actual transaction sender. + #[inline] + pub fn set_transaction_caller(&mut self, caller: Address) { + if let Some(node) = self.traces.arena.first_mut() { + node.trace.caller = caller; + } + } + /// Consumes the Inspector and returns a [ParityTraceBuilder]. #[inline] pub fn into_parity_builder(self) -> ParityTraceBuilder {