22
33use alloy:: {
44 primitives:: { Address , map:: HashMap } ,
5- rpc:: types:: trace:: geth:: GethTrace ,
5+ rpc:: types:: trace:: geth:: { AccountState , DiffMode , GethTrace } ,
66} ;
77use revive_dt_compiler:: { Compiler , CompilerInput , SolidityCompiler } ;
88use revive_dt_config:: Arguments ;
@@ -94,15 +94,22 @@ where
9494 & mut self ,
9595 input : & Input ,
9696 node : & T :: Blockchain ,
97- ) -> anyhow:: Result < GethTrace > {
97+ ) -> anyhow:: Result < ( GethTrace , DiffMode ) > {
9898 let receipt = node. execute_transaction ( input. legacy_transaction (
9999 self . config . network_id ,
100100 0 ,
101101 & self . deployed_contracts ,
102102 ) ?) ?;
103- dbg ! ( & receipt) ;
104- //node.trace_transaction(receipt)
105- todo ! ( )
103+
104+ log:: debug!( "Transaction receipt: {:?}" , receipt) ;
105+
106+ let trace = node. trace_transaction ( receipt. clone ( ) ) ?;
107+
108+ log:: debug!( "Trace result: {:?}" , trace) ;
109+
110+ let diff = node. state_diff ( receipt) ?;
111+
112+ Ok ( ( trace, diff) )
106113 }
107114}
108115
@@ -132,6 +139,32 @@ where
132139 }
133140 }
134141
142+ pub fn print_diff_mode ( label : & str , diff : & DiffMode ) {
143+ println ! ( "🔍 {} - PRE STATE:" , label) ;
144+ for ( addr, state) in & diff. pre {
145+ Self :: print_account_state ( " [pre]" , addr, state) ;
146+ }
147+
148+ println ! ( "🔍 {} - POST STATE:" , label) ;
149+ for ( addr, state) in & diff. post {
150+ Self :: print_account_state ( " [post]" , addr, state) ;
151+ }
152+ }
153+
154+ fn print_account_state ( prefix : & str , addr : & Address , state : & AccountState ) {
155+ println ! ( "{} 0x{:x}" , prefix, addr) ;
156+
157+ if let Some ( balance) = & state. balance {
158+ println ! ( "{} balance: {}" , prefix, balance) ;
159+ }
160+ if let Some ( nonce) = & state. nonce {
161+ println ! ( "{} nonce: {}" , prefix, nonce) ;
162+ }
163+ if let Some ( code) = & state. code {
164+ println ! ( "{} code: {}" , prefix, code) ;
165+ }
166+ }
167+
135168 pub fn execute ( & mut self , span : Span ) -> anyhow:: Result < ( ) > {
136169 for mode in self . metadata . solc_modes ( ) {
137170 let mut leader_state = State :: < L > :: new ( self . config , span) ;
@@ -142,8 +175,17 @@ where
142175
143176 for case in & self . metadata . cases {
144177 for input in & case. inputs {
145- let _ = leader_state. execute_input ( input, self . leader_node ) ?;
146- let _ = follower_state. execute_input ( input, self . follower_node ) ?;
178+ let ( _, leader_diff) = leader_state. execute_input ( input, self . leader_node ) ?;
179+ let ( _, follower_diff) =
180+ follower_state. execute_input ( input, self . follower_node ) ?;
181+
182+ if leader_diff == follower_diff {
183+ log:: info!( "State diffs match between leader and follower." ) ;
184+ } else {
185+ log:: warn!( "State diffs mismatch between leader and follower." ) ;
186+ Self :: print_diff_mode ( "Leader" , & leader_diff) ;
187+ Self :: print_diff_mode ( "Follower" , & follower_diff) ;
188+ }
147189 }
148190 }
149191 }
0 commit comments