From 20aedb7ff3845d543057c676d84f45fb9bd603c8 Mon Sep 17 00:00:00 2001 From: zerosnacks Date: Fri, 14 Feb 2025 14:58:16 +0100 Subject: [PATCH 1/7] add basic tracing, at the moment insufficient because we dont access local artifacts in Anvil yet --- crates/anvil/src/cmd.rs | 5 +++++ crates/anvil/src/config.rs | 11 +++++++++++ crates/anvil/src/eth/backend/executor.rs | 2 ++ crates/anvil/src/eth/backend/mem/inspector.rs | 18 +++++++++++++++++- crates/anvil/src/eth/backend/mem/mod.rs | 9 +++++++++ 5 files changed, 44 insertions(+), 1 deletion(-) diff --git a/crates/anvil/src/cmd.rs b/crates/anvil/src/cmd.rs index 0bf102e186b8..efe6d932bf54 100644 --- a/crates/anvil/src/cmd.rs +++ b/crates/anvil/src/cmd.rs @@ -259,6 +259,7 @@ impl NodeArgs { .with_genesis(self.init) .with_steps_tracing(self.evm.steps_tracing) .with_print_logs(!self.evm.disable_console_log) + .with_print_traces(self.evm.enable_trace_printing) .with_auto_impersonate(self.evm.auto_impersonate) .with_ipc(self.ipc) .with_code_size_limit(self.evm.code_size_limit) @@ -559,6 +560,10 @@ pub struct AnvilEvmArgs { #[arg(long, visible_alias = "no-console-log")] pub disable_console_log: bool, + /// Enable printing of traces to stdout. + #[arg(long, visible_alias = "trace-printing")] + pub enable_trace_printing: bool, + /// Enables automatic impersonation on startup. This allows any transaction sender to be /// simulated as different accounts, which is useful for testing contract behavior. #[arg(long, visible_alias = "auto-unlock")] diff --git a/crates/anvil/src/config.rs b/crates/anvil/src/config.rs index 9b0eaa56e088..ed3a47bf10b6 100644 --- a/crates/anvil/src/config.rs +++ b/crates/anvil/src/config.rs @@ -156,6 +156,8 @@ pub struct NodeConfig { pub enable_steps_tracing: bool, /// Enable printing of `console.log` invocations. pub print_logs: bool, + /// Enable printing of traces. + pub print_traces: bool, /// Enable auto impersonation of accounts on startup pub enable_auto_impersonate: bool, /// Configure the code size limit @@ -435,6 +437,7 @@ impl Default for NodeConfig { enable_tracing: true, enable_steps_tracing: false, print_logs: true, + print_traces: false, enable_auto_impersonate: false, no_storage_caching: false, server_config: Default::default(), @@ -863,6 +866,13 @@ impl NodeConfig { self } + /// Sets whether to print traces to stdout. + #[must_use] + pub fn with_print_traces(mut self, print_traces: bool) -> Self { + self.enable_tracing = print_traces; + self + } + /// Sets whether to enable autoImpersonate #[must_use] pub fn with_auto_impersonate(mut self, enable_auto_impersonate: bool) -> Self { @@ -1048,6 +1058,7 @@ impl NodeConfig { Arc::new(RwLock::new(fork)), self.enable_steps_tracing, self.print_logs, + self.print_traces, self.odyssey, self.prune_history, self.max_persisted_states, diff --git a/crates/anvil/src/eth/backend/executor.rs b/crates/anvil/src/eth/backend/executor.rs index c07bfab785e2..1257240baefa 100644 --- a/crates/anvil/src/eth/backend/executor.rs +++ b/crates/anvil/src/eth/backend/executor.rs @@ -345,6 +345,8 @@ impl Iterator for &mut TransactionExec } } }; + + inspector.print_traces(); inspector.print_logs(); let (exit_reason, gas_used, out, logs) = match exec_result { diff --git a/crates/anvil/src/eth/backend/mem/inspector.rs b/crates/anvil/src/eth/backend/mem/inspector.rs index e590d57e35bb..700bd5f26c52 100644 --- a/crates/anvil/src/eth/backend/mem/inspector.rs +++ b/crates/anvil/src/eth/backend/mem/inspector.rs @@ -2,6 +2,7 @@ use crate::revm::Database; use alloy_primitives::{Address, Log}; +use foundry_common::sh_println; use foundry_evm::{ call_inspectors, decode::decode_console_logs, @@ -13,7 +14,7 @@ use foundry_evm::{ primitives::U256, EvmContext, }, - traces::TracingInspectorConfig, + traces::{render_trace_arena_inner, SparsedTraceArena, TracingInspectorConfig}, }; /// The [`revm::Inspector`] used when transacting in the evm @@ -34,6 +35,21 @@ impl Inspector { } } + /// Called after the inspecting the evm + /// This will log all traces + pub fn print_traces(&self) { + let traces = &self + .tracer + .clone() + .map(|tracer| tracer.into_traces()) + .map(|arena| SparsedTraceArena { arena, ignored: Default::default() }); + + if let Some(traces) = &traces { + let _ = sh_println!("Traces:"); + let _ = sh_println!("{}", render_trace_arena_inner(traces, true, true)); + } + } + /// Configures the `Tracer` [`revm::Inspector`] pub fn with_tracing(mut self) -> Self { self.tracer = Some(TracingInspector::new(TracingInspectorConfig::all().set_steps(false))); diff --git a/crates/anvil/src/eth/backend/mem/mod.rs b/crates/anvil/src/eth/backend/mem/mod.rs index f6cb5e993ef1..ae46d43f88b8 100644 --- a/crates/anvil/src/eth/backend/mem/mod.rs +++ b/crates/anvil/src/eth/backend/mem/mod.rs @@ -193,6 +193,7 @@ pub struct Backend { active_state_snapshots: Arc>>, enable_steps_tracing: bool, print_logs: bool, + print_traces: bool, odyssey: bool, /// How to keep history state prune_state_history_config: PruneStateHistoryConfig, @@ -221,6 +222,7 @@ impl Backend { fork: Arc>>, enable_steps_tracing: bool, print_logs: bool, + print_traces: bool, odyssey: bool, prune_state_history_config: PruneStateHistoryConfig, max_persisted_states: Option, @@ -324,6 +326,7 @@ impl Backend { active_state_snapshots: Arc::new(Mutex::new(Default::default())), enable_steps_tracing, print_logs, + print_traces, odyssey, prune_state_history_config, transaction_block_keeper, @@ -1054,6 +1057,7 @@ impl Backend { drop(evm); inspector.print_logs(); + inspector.print_traces(); Ok((exit_reason, out, gas_used, state, logs.unwrap_or_default())) } @@ -1432,6 +1436,10 @@ impl Backend { inspector = inspector.with_log_collector(); } + if self.print_traces { + inspector = inspector.with_steps_tracing(); + } + inspector } @@ -1458,6 +1466,7 @@ impl Backend { }; drop(evm); inspector.print_logs(); + inspector.print_traces(); Ok((exit_reason, out, gas_used as u128, state)) } From 23a350bb0ce489529db5cf944d8cb741a1444ee3 Mon Sep 17 00:00:00 2001 From: zerosnacks Date: Fri, 14 Feb 2025 15:15:57 +0100 Subject: [PATCH 2/7] only enable printing conditionally --- crates/anvil/src/cmd.rs | 6 +++--- crates/anvil/src/config.rs | 2 +- crates/anvil/src/eth/backend/executor.rs | 5 ++++- crates/anvil/src/eth/backend/mem/inspector.rs | 5 +++-- crates/anvil/src/eth/backend/mem/mod.rs | 13 +++++++++++-- 5 files changed, 22 insertions(+), 9 deletions(-) diff --git a/crates/anvil/src/cmd.rs b/crates/anvil/src/cmd.rs index efe6d932bf54..a56697a61da6 100644 --- a/crates/anvil/src/cmd.rs +++ b/crates/anvil/src/cmd.rs @@ -259,7 +259,7 @@ impl NodeArgs { .with_genesis(self.init) .with_steps_tracing(self.evm.steps_tracing) .with_print_logs(!self.evm.disable_console_log) - .with_print_traces(self.evm.enable_trace_printing) + .with_print_traces(self.evm.print_traces) .with_auto_impersonate(self.evm.auto_impersonate) .with_ipc(self.ipc) .with_code_size_limit(self.evm.code_size_limit) @@ -561,8 +561,8 @@ pub struct AnvilEvmArgs { pub disable_console_log: bool, /// Enable printing of traces to stdout. - #[arg(long, visible_alias = "trace-printing")] - pub enable_trace_printing: bool, + #[arg(long, visible_alias = "enable-trace-printing")] + pub print_traces: bool, /// Enables automatic impersonation on startup. This allows any transaction sender to be /// simulated as different accounts, which is useful for testing contract behavior. diff --git a/crates/anvil/src/config.rs b/crates/anvil/src/config.rs index ed3a47bf10b6..e32f7258bd67 100644 --- a/crates/anvil/src/config.rs +++ b/crates/anvil/src/config.rs @@ -869,7 +869,7 @@ impl NodeConfig { /// Sets whether to print traces to stdout. #[must_use] pub fn with_print_traces(mut self, print_traces: bool) -> Self { - self.enable_tracing = print_traces; + self.print_traces = print_traces; self } diff --git a/crates/anvil/src/eth/backend/executor.rs b/crates/anvil/src/eth/backend/executor.rs index 1257240baefa..5fe5d544295d 100644 --- a/crates/anvil/src/eth/backend/executor.rs +++ b/crates/anvil/src/eth/backend/executor.rs @@ -108,6 +108,7 @@ pub struct TransactionExecutor<'a, Db: ?Sized, V: TransactionValidator> { pub enable_steps_tracing: bool, pub odyssey: bool, pub print_logs: bool, + pub print_traces: bool, /// Precompiles to inject to the EVM. pub precompile_factory: Option>, } @@ -346,7 +347,9 @@ impl Iterator for &mut TransactionExec } }; - inspector.print_traces(); + if self.print_traces { + inspector.print_traces(); + } inspector.print_logs(); let (exit_reason, gas_used, out, logs) = match exec_result { diff --git a/crates/anvil/src/eth/backend/mem/inspector.rs b/crates/anvil/src/eth/backend/mem/inspector.rs index 700bd5f26c52..77ebec355db1 100644 --- a/crates/anvil/src/eth/backend/mem/inspector.rs +++ b/crates/anvil/src/eth/backend/mem/inspector.rs @@ -20,8 +20,9 @@ use foundry_evm::{ /// The [`revm::Inspector`] used when transacting in the evm #[derive(Clone, Debug, Default)] pub struct Inspector { + /// Collects all traces pub tracer: Option, - /// collects all `console.sol` logs + /// Collects all `console.sol` logs pub log_collector: Option, } @@ -46,7 +47,7 @@ impl Inspector { if let Some(traces) = &traces { let _ = sh_println!("Traces:"); - let _ = sh_println!("{}", render_trace_arena_inner(traces, true, true)); + let _ = sh_println!("{}", render_trace_arena_inner(traces, false, true)); } } diff --git a/crates/anvil/src/eth/backend/mem/mod.rs b/crates/anvil/src/eth/backend/mem/mod.rs index ae46d43f88b8..3099c9c1081f 100644 --- a/crates/anvil/src/eth/backend/mem/mod.rs +++ b/crates/anvil/src/eth/backend/mem/mod.rs @@ -1057,7 +1057,10 @@ impl Backend { drop(evm); inspector.print_logs(); - inspector.print_traces(); + + if self.print_traces { + inspector.print_traces(); + } Ok((exit_reason, out, gas_used, state, logs.unwrap_or_default())) } @@ -1099,6 +1102,7 @@ impl Backend { blob_gas_used: 0, enable_steps_tracing: self.enable_steps_tracing, print_logs: self.print_logs, + print_traces: self.print_traces, precompile_factory: self.precompile_factory.clone(), odyssey: self.odyssey, }; @@ -1182,6 +1186,7 @@ impl Backend { blob_gas_used: 0, enable_steps_tracing: self.enable_steps_tracing, print_logs: self.print_logs, + print_traces: self.print_traces, odyssey: self.odyssey, precompile_factory: self.precompile_factory.clone(), }; @@ -1466,7 +1471,11 @@ impl Backend { }; drop(evm); inspector.print_logs(); - inspector.print_traces(); + + if self.print_traces { + inspector.print_traces(); + } + Ok((exit_reason, out, gas_used as u128, state)) } From 13918f7757674702892e31c5da896c493cf6d704 Mon Sep 17 00:00:00 2001 From: zerosnacks Date: Fri, 14 Feb 2025 15:30:20 +0100 Subject: [PATCH 3/7] fix --- crates/anvil/src/eth/backend/executor.rs | 2 +- crates/anvil/src/eth/backend/mem/inspector.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/anvil/src/eth/backend/executor.rs b/crates/anvil/src/eth/backend/executor.rs index 5fe5d544295d..0949759fc039 100644 --- a/crates/anvil/src/eth/backend/executor.rs +++ b/crates/anvil/src/eth/backend/executor.rs @@ -307,7 +307,7 @@ impl Iterator for &mut TransactionExec // records all call and step traces let mut inspector = Inspector::default().with_tracing(); - if self.enable_steps_tracing { + if self.enable_steps_tracing || self.print_traces { inspector = inspector.with_steps_tracing(); } if self.print_logs { diff --git a/crates/anvil/src/eth/backend/mem/inspector.rs b/crates/anvil/src/eth/backend/mem/inspector.rs index 77ebec355db1..3311d9af0903 100644 --- a/crates/anvil/src/eth/backend/mem/inspector.rs +++ b/crates/anvil/src/eth/backend/mem/inspector.rs @@ -46,7 +46,7 @@ impl Inspector { .map(|arena| SparsedTraceArena { arena, ignored: Default::default() }); if let Some(traces) = &traces { - let _ = sh_println!("Traces:"); + let _ = sh_println!("\nTraces:"); let _ = sh_println!("{}", render_trace_arena_inner(traces, false, true)); } } From e14784de86a56c41b6e830348fd838ec12b6e5dc Mon Sep 17 00:00:00 2001 From: zerosnacks Date: Fri, 14 Feb 2025 16:48:46 +0100 Subject: [PATCH 4/7] fix --- crates/anvil/src/eth/api.rs | 10 ++++++++-- crates/anvil/src/eth/backend/executor.rs | 5 ++++- crates/anvil/src/eth/backend/mem/inspector.rs | 8 +++++++- crates/anvil/src/eth/backend/mem/mod.rs | 3 +-- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/crates/anvil/src/eth/api.rs b/crates/anvil/src/eth/api.rs index 147237a744ef..e81d3d271b8f 100644 --- a/crates/anvil/src/eth/api.rs +++ b/crates/anvil/src/eth/api.rs @@ -75,7 +75,7 @@ use anvil_core::{ types::{ReorgOptions, TransactionData, Work}, }; use anvil_rpc::{error::RpcError, response::ResponseResult}; -use foundry_common::provider::ProviderBuilder; +use foundry_common::{provider::ProviderBuilder, sh_warn}; use foundry_evm::{ backend::DatabaseError, decode::RevertDecoder, @@ -161,7 +161,7 @@ impl EthApi { /// Executes the [EthRequest] and returns an RPC [ResponseResult]. pub async fn execute(&self, request: EthRequest) -> ResponseResult { trace!(target: "rpc::api", "executing eth request"); - match request { + let response = match request.clone() { EthRequest::Web3ClientVersion(()) => self.client_version().to_rpc_result(), EthRequest::Web3Sha3(content) => self.sha3(content).to_rpc_result(), EthRequest::EthGetAccount(addr, block) => { @@ -465,7 +465,13 @@ impl EthApi { EthRequest::AnvilSetExecutor(executor_pk) => { self.anvil_set_executor(executor_pk).to_rpc_result() } + }; + + if let ResponseResult::Error(err) = &response { + let _ = sh_warn!("RPC request failed: {request:?}, error: {err:?}"); } + + response } fn sign_request( diff --git a/crates/anvil/src/eth/backend/executor.rs b/crates/anvil/src/eth/backend/executor.rs index 0949759fc039..0b2e11802062 100644 --- a/crates/anvil/src/eth/backend/executor.rs +++ b/crates/anvil/src/eth/backend/executor.rs @@ -307,12 +307,15 @@ impl Iterator for &mut TransactionExec // records all call and step traces let mut inspector = Inspector::default().with_tracing(); - if self.enable_steps_tracing || self.print_traces { + if self.enable_steps_tracing { inspector = inspector.with_steps_tracing(); } if self.print_logs { inspector = inspector.with_log_collector(); } + if self.print_traces { + inspector = inspector.with_trace_printer(); + } let exec_result = { let mut evm = new_evm_with_inspector(&mut *self.db, env, &mut inspector, self.odyssey); diff --git a/crates/anvil/src/eth/backend/mem/inspector.rs b/crates/anvil/src/eth/backend/mem/inspector.rs index 3311d9af0903..71c386a328df 100644 --- a/crates/anvil/src/eth/backend/mem/inspector.rs +++ b/crates/anvil/src/eth/backend/mem/inspector.rs @@ -68,11 +68,17 @@ impl Inspector { self } - /// Configures the `Tracer` [`revm::Inspector`] + /// Configures the `Tracer` [`revm::Inspector`] with a log collector pub fn with_log_collector(mut self) -> Self { self.log_collector = Some(Default::default()); self } + + /// Configures the `Tracer` [`revm::Inspector`] with a trace printer + pub fn with_trace_printer(mut self) -> Self { + self.tracer = Some(TracingInspector::new(TracingInspectorConfig::all().with_state_diffs())); + self + } } impl revm::Inspector for Inspector { diff --git a/crates/anvil/src/eth/backend/mem/mod.rs b/crates/anvil/src/eth/backend/mem/mod.rs index 3099c9c1081f..4a2498245eff 100644 --- a/crates/anvil/src/eth/backend/mem/mod.rs +++ b/crates/anvil/src/eth/backend/mem/mod.rs @@ -1440,9 +1440,8 @@ impl Backend { if self.print_logs { inspector = inspector.with_log_collector(); } - if self.print_traces { - inspector = inspector.with_steps_tracing(); + inspector = inspector.with_trace_printer(); } inspector From 44a370aa977128a61ccc12d55cb4d8758713d8ab Mon Sep 17 00:00:00 2001 From: zerosnacks Date: Fri, 14 Feb 2025 17:08:53 +0100 Subject: [PATCH 5/7] prefer using node_info! macro to stay consistent with how logging is performed in Anvil --- crates/anvil/src/eth/api.rs | 4 ++-- crates/anvil/src/eth/backend/mem/inspector.rs | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/crates/anvil/src/eth/api.rs b/crates/anvil/src/eth/api.rs index e81d3d271b8f..1366637104e5 100644 --- a/crates/anvil/src/eth/api.rs +++ b/crates/anvil/src/eth/api.rs @@ -75,7 +75,7 @@ use anvil_core::{ types::{ReorgOptions, TransactionData, Work}, }; use anvil_rpc::{error::RpcError, response::ResponseResult}; -use foundry_common::{provider::ProviderBuilder, sh_warn}; +use foundry_common::provider::ProviderBuilder; use foundry_evm::{ backend::DatabaseError, decode::RevertDecoder, @@ -468,7 +468,7 @@ impl EthApi { }; if let ResponseResult::Error(err) = &response { - let _ = sh_warn!("RPC request failed: {request:?}, error: {err:?}"); + node_info!("RPC request failed: {request:?}, error: {err:?}"); } response diff --git a/crates/anvil/src/eth/backend/mem/inspector.rs b/crates/anvil/src/eth/backend/mem/inspector.rs index 71c386a328df..c100b7b55805 100644 --- a/crates/anvil/src/eth/backend/mem/inspector.rs +++ b/crates/anvil/src/eth/backend/mem/inspector.rs @@ -1,8 +1,7 @@ //! Anvil specific [`revm::Inspector`] implementation -use crate::revm::Database; +use crate::{eth::macros::node_info, revm::Database}; use alloy_primitives::{Address, Log}; -use foundry_common::sh_println; use foundry_evm::{ call_inspectors, decode::decode_console_logs, @@ -46,8 +45,8 @@ impl Inspector { .map(|arena| SparsedTraceArena { arena, ignored: Default::default() }); if let Some(traces) = &traces { - let _ = sh_println!("\nTraces:"); - let _ = sh_println!("{}", render_trace_arena_inner(traces, false, true)); + node_info!("Traces:"); + node_info!("{}", render_trace_arena_inner(traces, false, true)); } } From 00efad8b64ba1530660b2ad769e8833bb2ba0d89 Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Thu, 20 Feb 2025 08:24:36 +0100 Subject: [PATCH 6/7] touchups --- crates/anvil/src/cmd.rs | 2 +- crates/anvil/src/eth/backend/mem/inspector.rs | 25 ++++++++++++------- crates/anvil/src/eth/backend/mem/mod.rs | 4 +-- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/crates/anvil/src/cmd.rs b/crates/anvil/src/cmd.rs index a56697a61da6..05f07a974a88 100644 --- a/crates/anvil/src/cmd.rs +++ b/crates/anvil/src/cmd.rs @@ -560,7 +560,7 @@ pub struct AnvilEvmArgs { #[arg(long, visible_alias = "no-console-log")] pub disable_console_log: bool, - /// Enable printing of traces to stdout. + /// Enable printing of traces for executed transactions and `eth_call` to stdout. #[arg(long, visible_alias = "enable-trace-printing")] pub print_traces: bool, diff --git a/crates/anvil/src/eth/backend/mem/inspector.rs b/crates/anvil/src/eth/backend/mem/inspector.rs index c100b7b55805..c973555b5318 100644 --- a/crates/anvil/src/eth/backend/mem/inspector.rs +++ b/crates/anvil/src/eth/backend/mem/inspector.rs @@ -35,18 +35,18 @@ impl Inspector { } } + /// Consumes the type and prints the traces. + pub fn into_print_traces(mut self) { + if let Some(a) = self.tracer.take() { + print_traces(a) + } + } + /// Called after the inspecting the evm /// This will log all traces pub fn print_traces(&self) { - let traces = &self - .tracer - .clone() - .map(|tracer| tracer.into_traces()) - .map(|arena| SparsedTraceArena { arena, ignored: Default::default() }); - - if let Some(traces) = &traces { - node_info!("Traces:"); - node_info!("{}", render_trace_arena_inner(traces, false, true)); + if let Some(a) = self.tracer.clone() { + print_traces(a) } } @@ -80,6 +80,13 @@ impl Inspector { } } +/// Prints the traces for the inspector +fn print_traces(tracer: TracingInspector) { + let traces = SparsedTraceArena { arena: tracer.into_traces(), ignored: Default::default() }; + node_info!("Traces:"); + node_info!("{}", render_trace_arena_inner(&traces, false, true)); +} + impl revm::Inspector for Inspector { fn initialize_interp(&mut self, interp: &mut Interpreter, ecx: &mut EvmContext) { call_inspectors!([&mut self.tracer], |inspector| { diff --git a/crates/anvil/src/eth/backend/mem/mod.rs b/crates/anvil/src/eth/backend/mem/mod.rs index 4a2498245eff..6e187b0d8b37 100644 --- a/crates/anvil/src/eth/backend/mem/mod.rs +++ b/crates/anvil/src/eth/backend/mem/mod.rs @@ -1433,7 +1433,7 @@ impl Backend { env } - /// Builds [`Inspector`] with the configured options + /// Builds [`Inspector`] with the configured options. fn build_inspector(&self) -> Inspector { let mut inspector = Inspector::default(); @@ -1472,7 +1472,7 @@ impl Backend { inspector.print_logs(); if self.print_traces { - inspector.print_traces(); + inspector.into_print_traces(); } Ok((exit_reason, out, gas_used as u128, state)) From e1a8603609248b65e9ff023f9f322b5b8de49f89 Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Sat, 22 Feb 2025 11:20:47 +0100 Subject: [PATCH 7/7] add decoding support --- crates/anvil/src/eth/backend/mem/inspector.rs | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/crates/anvil/src/eth/backend/mem/inspector.rs b/crates/anvil/src/eth/backend/mem/inspector.rs index c973555b5318..9a68b7061246 100644 --- a/crates/anvil/src/eth/backend/mem/inspector.rs +++ b/crates/anvil/src/eth/backend/mem/inspector.rs @@ -13,7 +13,9 @@ use foundry_evm::{ primitives::U256, EvmContext, }, - traces::{render_trace_arena_inner, SparsedTraceArena, TracingInspectorConfig}, + traces::{ + render_trace_arena_inner, CallTraceDecoder, SparsedTraceArena, TracingInspectorConfig, + }, }; /// The [`revm::Inspector`] used when transacting in the evm @@ -81,8 +83,23 @@ impl Inspector { } /// Prints the traces for the inspector +/// +/// Caution: This blocks on call trace decoding +/// +/// # Panics +/// +/// If called outside tokio runtime fn print_traces(tracer: TracingInspector) { - let traces = SparsedTraceArena { arena: tracer.into_traces(), ignored: Default::default() }; + let arena = tokio::task::block_in_place(move || { + tokio::runtime::Handle::current().block_on(async move { + let mut arena = tracer.into_traces(); + let decoder = CallTraceDecoder::new(); + decoder.populate_traces(arena.nodes_mut()).await; + arena + }) + }); + + let traces = SparsedTraceArena { arena, ignored: Default::default() }; node_info!("Traces:"); node_info!("{}", render_trace_arena_inner(&traces, false, true)); }