@@ -483,25 +483,30 @@ pub struct TracingResult {
483483 /// A set of (address, storage slot) pairs representing state that contain a called address.
484484 /// If any of these storage slots change, the execution path might change.
485485 pub retriggers : HashSet < ( Address , StoreKey ) > ,
486- /// A set of all addresses that were called during the trace.
487- pub called_addresses : HashSet < Address > ,
486+ /// A map of all addresses that were called during the trace with a list of storage slots that
487+ /// were accessed.
488+ pub accessed_slots : HashMap < Address , HashSet < StoreKey > > ,
488489}
489490
490491impl TracingResult {
491492 pub fn new (
492493 retriggers : HashSet < ( Address , StoreKey ) > ,
493- called_addresses : HashSet < Address > ,
494+ accessed_slots : HashMap < Address , HashSet < StoreKey > > ,
494495 ) -> Self {
495- Self { retriggers, called_addresses }
496+ Self { retriggers, accessed_slots }
496497 }
497498
498499 /// Merges this tracing result with another one.
499500 ///
500501 /// The method combines two [`TracingResult`] instances.
501502 pub fn merge ( & mut self , other : TracingResult ) {
502503 self . retriggers . extend ( other. retriggers ) ;
503- self . called_addresses
504- . extend ( other. called_addresses ) ;
504+ for ( address, slots) in other. accessed_slots {
505+ self . accessed_slots
506+ . entry ( address)
507+ . or_default ( )
508+ . extend ( slots) ;
509+ }
505510 }
506511}
507512
@@ -806,12 +811,18 @@ pub mod fixtures {
806811
807812 let mut result1 = TracingResult :: new (
808813 HashSet :: from ( [ ( address1. clone ( ) , store_key1. clone ( ) ) ] ) ,
809- HashSet :: from ( [ address2. clone ( ) , address3. clone ( ) ] ) ,
814+ HashMap :: from ( [
815+ ( address2. clone ( ) , HashSet :: from ( [ store_key1. clone ( ) ] ) ) ,
816+ ( address3. clone ( ) , HashSet :: from ( [ store_key2. clone ( ) ] ) ) ,
817+ ] ) ,
810818 ) ;
811819
812820 let result2 = TracingResult :: new (
813821 HashSet :: from ( [ ( address3. clone ( ) , store_key2. clone ( ) ) ] ) ,
814- HashSet :: from ( [ address1. clone ( ) ] ) ,
822+ HashMap :: from ( [
823+ ( address1. clone ( ) , HashSet :: from ( [ store_key1. clone ( ) ] ) ) ,
824+ ( address2. clone ( ) , HashSet :: from ( [ store_key2. clone ( ) ] ) ) ,
825+ ] ) ,
815826 ) ;
816827
817828 result1. merge ( result2) ;
@@ -820,21 +831,29 @@ pub mod fixtures {
820831 assert_eq ! ( result1. retriggers. len( ) , 2 ) ;
821832 assert ! ( result1
822833 . retriggers
823- . contains( & ( address1. clone( ) , store_key1) ) ) ;
834+ . contains( & ( address1. clone( ) , store_key1. clone ( ) ) ) ) ;
824835 assert ! ( result1
825836 . retriggers
826837 . contains( & ( address3. clone( ) , store_key2. clone( ) ) ) ) ;
827838
828- // Verify called_addresses were merged
829- assert_eq ! ( result1. called_addresses . len( ) , 3 ) ;
839+ // Verify accessed slots were merged
840+ assert_eq ! ( result1. accessed_slots . len( ) , 3 ) ;
830841 assert ! ( result1
831- . called_addresses
832- . contains ( & address1) ) ;
842+ . accessed_slots
843+ . contains_key ( & address1) ) ;
833844 assert ! ( result1
834- . called_addresses
835- . contains ( & address2) ) ;
845+ . accessed_slots
846+ . contains_key ( & address2) ) ;
836847 assert ! ( result1
837- . called_addresses
838- . contains( & address3) ) ;
848+ . accessed_slots
849+ . contains_key( & address3) ) ;
850+
851+ assert_eq ! (
852+ result1
853+ . accessed_slots
854+ . get( & address2)
855+ . unwrap( ) ,
856+ & HashSet :: from( [ store_key1. clone( ) , store_key2. clone( ) ] )
857+ ) ;
839858 }
840859}
0 commit comments