@@ -772,10 +772,19 @@ impl<'a> FunctionRunner<'a> {
772772 identified_contracts,
773773 & self . cr . mcr . known_contracts ,
774774 ) ;
775+
776+ // Filter out additional invariants to test if we already have a persisted failure.
775777 let invariant_contract = InvariantContract {
776778 address : self . address ,
777779 invariant_fn : func,
778- invariant_fns : invariants,
780+ invariant_fns : invariants
781+ . into_iter ( )
782+ . filter ( |( invariant_fn, _) | {
783+ * invariant_fn == func
784+ || ( invariant_config. continuous_run
785+ && !canonicalized ( failure_dir. join ( invariant_fn. name . clone ( ) ) ) . exists ( ) )
786+ } )
787+ . collect ( ) ,
779788 call_after_invariant,
780789 abi : & self . cr . contract . abi ,
781790 } ;
@@ -893,6 +902,7 @@ impl<'a> FunctionRunner<'a> {
893902 . errors
894903 . get ( & invariant_contract. invariant_fn . name )
895904 . and_then ( |err| err. revert_reason ( ) ) ;
905+ let mut other_failures = vec ! [ ] ;
896906
897907 if success {
898908 // If invariants ran successfully, replay the last run to collect logs and
@@ -965,12 +975,20 @@ impl<'a> FunctionRunner<'a> {
965975 continue ;
966976 }
967977
968- // Generate counterexamples for other invariants broken.
969- if let Some ( error) = invariant_result. errors . get ( & invariant. name )
978+ // Generate counterexamples for broken invariant, if there is no failure persisted
979+ // already.
980+ let persisted_failure = canonicalized ( failure_dir. join ( invariant. name . clone ( ) ) ) ;
981+ if !persisted_failure. exists ( )
982+ && let Some ( error) = invariant_result. errors . get ( & invariant. name )
970983 && let InvariantFuzzError :: BrokenInvariant ( case_data)
971984 | InvariantFuzzError :: Revert ( case_data) = error
972985 && let TestError :: Fail ( _, ref calls) = case_data. test_error
973986 {
987+ other_failures. push ( format ! (
988+ "{}: {}" ,
989+ invariant. name,
990+ error. revert_reason( ) . unwrap_or_default( )
991+ ) ) ;
974992 match generate_counterexample (
975993 self . clone_executor ( ) ,
976994 & self . cr . mcr . known_contracts ,
@@ -982,7 +1000,7 @@ impl<'a> FunctionRunner<'a> {
9821000 // Persist error in invariant failure dir.
9831001 record_invariant_failure (
9841002 failure_dir. as_path ( ) ,
985- canonicalized ( failure_dir . join ( invariant . name . clone ( ) ) ) . as_path ( ) ,
1003+ persisted_failure . as_path ( ) ,
9861004 & call_sequence,
9871005 test_bytecode,
9881006 ) ;
@@ -999,6 +1017,7 @@ impl<'a> FunctionRunner<'a> {
9991017 invariant_result. gas_report_traces ,
10001018 success,
10011019 reason,
1020+ other_failures,
10021021 counterexample,
10031022 invariant_result. cases ,
10041023 invariant_result. reverts ,
0 commit comments