11//! The test driver handles the compilation and execution of the test cases.
22
3+ use alloy:: primitives:: Bytes ;
4+ use alloy:: rpc:: types:: TransactionInput ;
35use alloy:: {
4- network:: TransactionBuilder ,
5- primitives:: { Address , bytes:: Bytes , map:: HashMap } ,
6+ primitives:: { Address , TxKind , map:: HashMap } ,
67 rpc:: types:: {
7- TransactionRequest ,
8+ TransactionReceipt , TransactionRequest ,
89 trace:: geth:: { AccountState , DiffMode , GethTrace } ,
910 } ,
1011} ;
@@ -116,7 +117,7 @@ where
116117 & mut self ,
117118 input : & Input ,
118119 node : & T :: Blockchain ,
119- ) -> anyhow:: Result < ( GethTrace , DiffMode ) > {
120+ ) -> anyhow:: Result < ( TransactionReceipt , GethTrace , DiffMode ) > {
120121 log:: trace!( "Calling execute_input for input: {:?}" , input) ;
121122
122123 let nonce = node. fetch_add_nonce ( input. caller ) ?;
@@ -144,19 +145,31 @@ where
144145 let receipt = match node. execute_transaction ( tx) {
145146 Ok ( receipt) => receipt,
146147 Err ( err) => {
147- log:: error!( "Failed to execute transaction: {:?}" , err) ;
148+ log:: error!(
149+ "Failed to execute transaction when executing the contract: {}, {:?}" ,
150+ & input. instance,
151+ err
152+ ) ;
148153 return Err ( err) ;
149154 }
150155 } ;
151156
152- log:: trace!( "Transaction receipt: {:?}" , receipt) ;
157+ log:: trace!(
158+ "Transaction receipt for executed contract: {} - {:?}" ,
159+ & input. instance,
160+ receipt,
161+ ) ;
153162
154163 let trace = node. trace_transaction ( receipt. clone ( ) ) ?;
155- log:: trace!( "Trace result: {:?}" , trace) ;
164+ log:: trace!(
165+ "Trace result for contract: {} - {:?}" ,
166+ & input. instance,
167+ trace
168+ ) ;
156169
157- let diff = node. state_diff ( receipt) ?;
170+ let diff = node. state_diff ( receipt. clone ( ) ) ?;
158171
159- Ok ( ( trace, diff) )
172+ Ok ( ( receipt , trace, diff) )
160173 }
161174
162175 pub fn deploy_contracts ( & mut self , input : & Input , node : & T :: Blockchain ) -> anyhow:: Result < ( ) > {
@@ -207,14 +220,16 @@ where
207220 std:: any:: type_name:: <T >( )
208221 ) ;
209222
210- let tx = TransactionRequest :: default ( )
211- . with_from ( input. caller )
212- . with_to ( Address :: ZERO )
213- . with_input ( Bytes :: from ( code. clone ( ) ) )
214- . with_gas_price ( 5_000_000 )
215- . with_gas_limit ( 5_000_000 )
216- . with_chain_id ( self . config . network_id )
217- . with_nonce ( nonce) ;
223+ let tx = TransactionRequest {
224+ from : Some ( input. caller ) ,
225+ to : Some ( TxKind :: Create ) ,
226+ gas_price : Some ( 5_000_000 ) ,
227+ gas : Some ( 5_000_000 ) ,
228+ chain_id : Some ( self . config . network_id ) ,
229+ nonce : Some ( nonce) ,
230+ input : TransactionInput :: new ( Bytes :: from ( code. into_bytes ( ) ) ) ,
231+ ..Default :: default ( )
232+ } ;
218233
219234 let receipt = match node. execute_transaction ( tx) {
220235 Ok ( receipt) => receipt,
@@ -228,6 +243,12 @@ where
228243 }
229244 } ;
230245
246+ log:: trace!(
247+ "Deployed transaction receipt for contract: {} - {:?}" ,
248+ & contract_name,
249+ receipt
250+ ) ;
251+
231252 let Some ( address) = receipt. contract_address else {
232253 log:: error!(
233254 "contract {} deployment did not return an address" ,
@@ -316,8 +337,9 @@ where
316337 follower_state. deploy_contracts ( input, self . follower_node ) ?;
317338
318339 log:: debug!( "Starting executing contract {}" , & input. instance) ;
319- let ( _, leader_diff) = leader_state. execute_input ( input, self . leader_node ) ?;
320- let ( _, follower_diff) =
340+ let ( leader_receipt, _, leader_diff) =
341+ leader_state. execute_input ( input, self . leader_node ) ?;
342+ let ( follower_receipt, _, follower_diff) =
321343 follower_state. execute_input ( input, self . follower_node ) ?;
322344
323345 if leader_diff == follower_diff {
@@ -327,6 +349,20 @@ where
327349 Self :: trace_diff_mode ( "Leader" , & leader_diff) ;
328350 Self :: trace_diff_mode ( "Follower" , & follower_diff) ;
329351 }
352+
353+ if leader_receipt. logs ( ) != follower_receipt. logs ( ) {
354+ log:: debug!( "Log/event mismatch between leader and follower." ) ;
355+ log:: trace!( "Leader logs: {:?}" , leader_receipt. logs( ) ) ;
356+ log:: trace!( "Follower logs: {:?}" , follower_receipt. logs( ) ) ;
357+ }
358+
359+ if leader_receipt. status ( ) != follower_receipt. status ( ) {
360+ log:: debug!(
361+ "Mismatch in status: leader = {}, follower = {}" ,
362+ leader_receipt. status( ) ,
363+ follower_receipt. status( )
364+ ) ;
365+ }
330366 }
331367 }
332368 }
0 commit comments