@@ -19,6 +19,7 @@ use revm::{
19
19
interpreter:: EthInterpreter ,
20
20
} ,
21
21
} ;
22
+ use revm_inspectors:: transfer:: TransferInspector ;
22
23
use std:: sync:: Arc ;
23
24
24
25
/// The [`revm::Inspector`] used when transacting in the evm
@@ -28,6 +29,8 @@ pub struct AnvilInspector {
28
29
pub tracer : Option < TracingInspector > ,
29
30
/// Collects all `console.sol` logs
30
31
pub log_collector : Option < LogCollector > ,
32
+ /// Collects all internal ETH transfers as ERC20 transfer events.
33
+ pub transfer : Option < TransferInspector > ,
31
34
}
32
35
33
36
impl AnvilInspector {
@@ -79,6 +82,12 @@ impl AnvilInspector {
79
82
self
80
83
}
81
84
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
+
82
91
/// Configures the `Tracer` [`revm::Inspector`] with a trace printer
83
92
pub fn with_trace_printer ( mut self ) -> Self {
84
93
self . tracer = Some ( TracingInspector :: new ( TracingInspectorConfig :: all ( ) . with_state_diffs ( ) ) ) ;
@@ -139,7 +148,7 @@ where
139
148
fn call ( & mut self , ecx : & mut CTX , inputs : & mut CallInputs ) -> Option < CallOutcome > {
140
149
call_inspectors ! (
141
150
#[ ret]
142
- [ & mut self . tracer, & mut self . log_collector] ,
151
+ [ & mut self . tracer, & mut self . log_collector, & mut self . transfer ] ,
143
152
|inspector| inspector. call( ecx, inputs) . map( Some ) ,
144
153
) ;
145
154
None
@@ -152,11 +161,11 @@ where
152
161
}
153
162
154
163
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
+ ) ;
160
169
None
161
170
}
162
171
@@ -168,9 +177,9 @@ where
168
177
169
178
#[ inline]
170
179
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
+ } ) ;
174
183
}
175
184
}
176
185
0 commit comments