@@ -5,7 +5,6 @@ use std::marker::PhantomData;
55
66use alloy:: json_abi:: JsonAbi ;
77use alloy:: network:: { Ethereum , TransactionBuilder } ;
8- use alloy:: primitives:: Bytes ;
98use alloy:: rpc:: types:: TransactionReceipt ;
109use alloy:: rpc:: types:: trace:: geth:: {
1110 DefaultFrame , GethDebugTracingOptions , GethDefaultTracingOptions , GethTrace , PreStateConfig ,
@@ -437,6 +436,9 @@ where
437436 // Additionally, what happens if the compiler filter doesn't match? Do we consider that the
438437 // transaction should succeed? Do we just ignore the expectation?
439438
439+ let deployed_contracts = self . deployed_contracts . entry ( case_idx) . or_default ( ) ;
440+ let chain_state_provider = node;
441+
440442 // Handling the receipt state assertion.
441443 let expected = !expectation. exception ;
442444 let actual = execution_receipt. status ( ) ;
@@ -454,13 +456,16 @@ where
454456
455457 // Handling the calldata assertion
456458 if let Some ( ref expected_calldata) = expectation. return_data {
457- let expected = expected_calldata
458- . calldata ( self . deployed_contracts . entry ( case_idx) . or_default ( ) , node)
459- . map ( Bytes :: from) ?;
460- let actual = tracing_result. return_value . clone ( ) ;
461- if !expected. starts_with ( & actual) {
462- tracing:: error!( ?execution_receipt, %expected, %actual, "Calldata assertion failed" ) ;
463- anyhow:: bail!( "Calldata assertion failed - Expected {expected} but got {actual}" , ) ;
459+ let expected = expected_calldata;
460+ let actual = & tracing_result. return_value ;
461+ if !expected. is_equivalent ( actual, deployed_contracts, chain_state_provider) ? {
462+ tracing:: error!(
463+ ?execution_receipt,
464+ ?expected,
465+ %actual,
466+ "Calldata assertion failed"
467+ ) ;
468+ anyhow:: bail!( "Calldata assertion failed - Expected {expected:?} but got {actual}" , ) ;
464469 }
465470 }
466471
@@ -503,27 +508,34 @@ where
503508 }
504509
505510 // Handling the topics assertion.
506- let expected = expected_event. topics . as_slice ( ) ;
507- let actual = actual_event. topics ( ) ;
508- if actual != expected {
509- tracing:: error!(
510- ?execution_receipt,
511- ?expected,
512- ?actual,
513- "Event topics assertion failed" ,
514- ) ;
515- anyhow:: bail!(
516- "Event topics assertion failed - Expected {expected:?} but got {actual:?}" ,
517- ) ;
511+ for ( expected, actual) in expected_event
512+ . topics
513+ . as_slice ( )
514+ . iter ( )
515+ . zip ( actual_event. topics ( ) )
516+ {
517+ let expected = Calldata :: Compound ( vec ! [ expected. clone( ) ] ) ;
518+ if !expected. is_equivalent (
519+ & actual. 0 ,
520+ deployed_contracts,
521+ chain_state_provider,
522+ ) ? {
523+ tracing:: error!(
524+ ?execution_receipt,
525+ ?expected,
526+ ?actual,
527+ "Event topics assertion failed" ,
528+ ) ;
529+ anyhow:: bail!(
530+ "Event topics assertion failed - Expected {expected:?} but got {actual:?}" ,
531+ ) ;
532+ }
518533 }
519534
520535 // Handling the values assertion.
521- let expected = & expected_event
522- . values
523- . calldata ( self . deployed_contracts . entry ( case_idx) . or_default ( ) , node)
524- . map ( Bytes :: from) ?;
536+ let expected = & expected_event. values ;
525537 let actual = & actual_event. data ( ) . data ;
526- if !expected. starts_with ( actual) {
538+ if !expected. is_equivalent ( & actual. 0 , deployed_contracts , chain_state_provider ) ? {
527539 tracing:: error!(
528540 ?execution_receipt,
529541 ?expected,
0 commit comments