Skip to content

Commit 978ebc1

Browse files
klkvrjoshieDo
andauthored
fix(anvil): print traces for eth_simulateV1 (#11253)
* fix(anvil): print traces for simulateV1 Co-Authored-By: joshieDo <[email protected]> * fix --------- Co-authored-by: joshieDo <[email protected]>
1 parent dbd9c19 commit 978ebc1

File tree

2 files changed

+26
-12
lines changed

2 files changed

+26
-12
lines changed

crates/anvil/src/eth/backend/mem/inspector.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use revm::{
1919
interpreter::EthInterpreter,
2020
},
2121
};
22+
use revm_inspectors::transfer::TransferInspector;
2223
use std::sync::Arc;
2324

2425
/// The [`revm::Inspector`] used when transacting in the evm
@@ -28,6 +29,8 @@ pub struct AnvilInspector {
2829
pub tracer: Option<TracingInspector>,
2930
/// Collects all `console.sol` logs
3031
pub log_collector: Option<LogCollector>,
32+
/// Collects all internal ETH transfers as ERC20 transfer events.
33+
pub transfer: Option<TransferInspector>,
3134
}
3235

3336
impl AnvilInspector {
@@ -79,6 +82,12 @@ impl AnvilInspector {
7982
self
8083
}
8184

85+
/// Configures the `Tracer` [`revm::Inspector`] with a transfer event collector
86+
pub fn with_transfers(mut self) -> Self {
87+
self.transfer = Some(TransferInspector::new(false).with_logs(true));
88+
self
89+
}
90+
8291
/// Configures the `Tracer` [`revm::Inspector`] with a trace printer
8392
pub fn with_trace_printer(mut self) -> Self {
8493
self.tracer = Some(TracingInspector::new(TracingInspectorConfig::all().with_state_diffs()));
@@ -139,7 +148,7 @@ where
139148
fn call(&mut self, ecx: &mut CTX, inputs: &mut CallInputs) -> Option<CallOutcome> {
140149
call_inspectors!(
141150
#[ret]
142-
[&mut self.tracer, &mut self.log_collector],
151+
[&mut self.tracer, &mut self.log_collector, &mut self.transfer],
143152
|inspector| inspector.call(ecx, inputs).map(Some),
144153
);
145154
None
@@ -152,11 +161,11 @@ where
152161
}
153162

154163
fn create(&mut self, ecx: &mut CTX, inputs: &mut CreateInputs) -> Option<CreateOutcome> {
155-
if let Some(tracer) = &mut self.tracer
156-
&& let Some(out) = tracer.create(ecx, inputs)
157-
{
158-
return Some(out);
159-
}
164+
call_inspectors!(
165+
#[ret]
166+
[&mut self.tracer, &mut self.transfer],
167+
|inspector| inspector.create(ecx, inputs).map(Some),
168+
);
160169
None
161170
}
162171

@@ -168,9 +177,9 @@ where
168177

169178
#[inline]
170179
fn selfdestruct(&mut self, contract: Address, target: Address, value: U256) {
171-
if let Some(tracer) = &mut self.tracer {
172-
<TracingInspector as Inspector<CTX>>::selfdestruct(tracer, contract, target, value);
173-
}
180+
call_inspectors!([&mut self.tracer, &mut self.transfer], |inspector| {
181+
Inspector::<CTX, EthInterpreter>::selfdestruct(inspector, contract, target, value)
182+
});
174183
}
175184
}
176185

crates/anvil/src/eth/backend/mem/mod.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,6 @@ use revm::{
118118
primitives::{KECCAK_EMPTY, hardfork::SpecId},
119119
state::AccountInfo,
120120
};
121-
use revm_inspectors::transfer::TransferInspector;
122121
use std::{
123122
collections::BTreeMap,
124123
fmt::Debug,
@@ -1693,11 +1692,13 @@ impl Backend {
16931692
env.evm_env.block_env.basefee = 0;
16941693
}
16951694

1695+
let mut inspector = self.build_inspector();
1696+
16961697
// transact
16971698
let ResultAndState { result, state } = if trace_transfers {
16981699
// prepare inspector to capture transfer inside the evm so they are
16991700
// recorded and included in logs
1700-
let mut inspector = TransferInspector::new(false).with_logs(true);
1701+
inspector = inspector.with_transfers();
17011702
let mut evm= self.new_evm_with_inspector_ref(
17021703
&cache_db as &dyn DatabaseRef,
17031704
&env,
@@ -1707,7 +1708,6 @@ impl Backend {
17071708
trace!(target: "backend", env=?env.evm_env, spec=?env.evm_env.spec_id(),"simulate evm env");
17081709
evm.transact(env.tx)?
17091710
} else {
1710-
let mut inspector = self.build_inspector();
17111711
let mut evm = self.new_evm_with_inspector_ref(
17121712
&cache_db as &dyn DatabaseRef,
17131713
&env,
@@ -1718,6 +1718,11 @@ impl Backend {
17181718
};
17191719
trace!(target: "backend", ?result, ?request, "simulate call");
17201720

1721+
inspector.print_logs();
1722+
if self.print_traces {
1723+
inspector.into_print_traces(self.call_trace_decoder.clone());
1724+
}
1725+
17211726
// commit the transaction
17221727
cache_db.commit(state);
17231728
gas_used += result.gas_used();

0 commit comments

Comments
 (0)