@@ -4,7 +4,8 @@ use crate::accountant::db_access_objects::utils::{
44} ;
55use crate :: accountant:: db_big_integer:: big_int_divider:: BigIntDivider ;
66use crate :: accountant:: { checked_conversion, comma_joined_stringifiable} ;
7- use crate :: blockchain:: errors:: AppRpcError ;
7+ use crate :: blockchain:: errors:: rpc_errors:: AppRpcErrorKind ;
8+ use crate :: blockchain:: errors:: validation_status:: PreviousAttempts ;
89use crate :: database:: rusqlite_wrappers:: ConnectionWrapper ;
910use itertools:: Itertools ;
1011use masq_lib:: utils:: ExpectValue ;
@@ -25,7 +26,7 @@ pub enum FailedPayableDaoError {
2526
2627#[ derive( Debug , Clone , PartialEq , Eq , Serialize , Deserialize ) ]
2728pub enum FailureReason {
28- Submission ( AppRpcError ) ,
29+ Submission ( AppRpcErrorKind ) ,
2930 Reverted ,
3031 PendingTooLong ,
3132}
@@ -75,7 +76,7 @@ impl FromStr for FailureStatus {
7576#[ derive( Debug , Clone , PartialEq , Eq , Serialize , Deserialize ) ]
7677pub enum ValidationStatus {
7778 Waiting ,
78- Reattempting { attempt : usize , error : AppRpcError } ,
79+ Reattempting ( PreviousAttempts ) ,
7980}
8081
8182#[ derive( Clone , Debug , PartialEq , Eq ) ]
@@ -381,16 +382,22 @@ mod tests {
381382 make_read_only_db_connection, FailedTxBuilder ,
382383 } ;
383384 use crate :: accountant:: db_access_objects:: utils:: current_unix_timestamp;
384- use crate :: blockchain:: errors:: { AppRpcError , LocalError , RemoteError } ;
385- use crate :: blockchain:: test_utils:: make_tx_hash;
385+ use crate :: blockchain:: errors:: rpc_errors:: AppRpcErrorKind ;
386+ use crate :: blockchain:: errors:: validation_status:: {
387+ PreviousAttempts , ValidationFailureClockReal ,
388+ } ;
389+ use crate :: blockchain:: errors:: BlockchainErrorKind ;
390+ use crate :: blockchain:: test_utils:: { make_tx_hash, ValidationFailureClockMock } ;
386391 use crate :: database:: db_initializer:: {
387392 DbInitializationConfig , DbInitializer , DbInitializerReal ,
388393 } ;
389394 use crate :: database:: test_utils:: ConnectionWrapperMock ;
390395 use masq_lib:: test_utils:: utils:: ensure_node_home_directory_exists;
391396 use rusqlite:: Connection ;
392397 use std:: collections:: { HashMap , HashSet } ;
398+ use std:: ops:: Add ;
393399 use std:: str:: FromStr ;
400+ use std:: time:: { Duration , SystemTime } ;
394401
395402 #[ test]
396403 fn insert_new_records_works ( ) {
@@ -584,11 +591,8 @@ mod tests {
584591 fn failure_reason_from_str_works ( ) {
585592 // Submission error
586593 assert_eq ! (
587- FailureReason :: from_str( r#"{"Submission":{"Local":{"Decoder":"Test decoder error"}}}"# )
588- . unwrap( ) ,
589- FailureReason :: Submission ( AppRpcError :: Local ( LocalError :: Decoder (
590- "Test decoder error" . to_string( )
591- ) ) )
594+ FailureReason :: from_str( r#"{"Submission":{"Local":{"Decoder"}}}"# ) . unwrap( ) ,
595+ FailureReason :: Submission ( AppRpcErrorKind :: Decoder )
592596 ) ;
593597
594598 // Reverted
@@ -620,6 +624,11 @@ mod tests {
620624
621625 #[ test]
622626 fn failure_status_from_str_works ( ) {
627+ let validation_failure_clock = ValidationFailureClockMock :: default ( ) . now_result (
628+ SystemTime :: UNIX_EPOCH
629+ . add ( Duration :: from_secs ( 1755080031 ) )
630+ . add ( Duration :: from_nanos ( 612180914 ) ) ,
631+ ) ;
623632 assert_eq ! (
624633 FailureStatus :: from_str( "\" RetryRequired\" " ) . unwrap( ) ,
625634 FailureStatus :: RetryRequired
@@ -631,8 +640,8 @@ mod tests {
631640 ) ;
632641
633642 assert_eq ! (
634- FailureStatus :: from_str( r#"{"RecheckRequired":{"Reattempting":{"attempt":2,"error ":{"Remote":"Unreachable" }}}}"# ) . unwrap( ) ,
635- FailureStatus :: RecheckRequired ( ValidationStatus :: Reattempting { attempt : 2 , error : AppRpcError :: Remote ( RemoteError :: Unreachable ) } )
643+ FailureStatus :: from_str( r#"{"RecheckRequired":{"Reattempting":{"ServerUnreachable":{"firstSeen ":{"secs_since_epoch":1755080031,"nanos_since_epoch":612180914},"attempts":1 }}}}"# ) . unwrap( ) ,
644+ FailureStatus :: RecheckRequired ( ValidationStatus :: Reattempting ( PreviousAttempts :: new ( BlockchainErrorKind :: AppRpc ( AppRpcErrorKind :: ServerUnreachable ) , & validation_failure_clock ) ) )
636645 ) ;
637646
638647 assert_eq ! (
@@ -713,10 +722,12 @@ mod tests {
713722 let tx3 = FailedTxBuilder :: default ( )
714723 . hash ( make_tx_hash ( 3 ) )
715724 . reason ( PendingTooLong )
716- . status ( RecheckRequired ( ValidationStatus :: Reattempting {
717- attempt : 1 ,
718- error : AppRpcError :: Remote ( RemoteError :: Unreachable ) ,
719- } ) )
725+ . status ( RecheckRequired ( ValidationStatus :: Reattempting (
726+ PreviousAttempts :: new (
727+ BlockchainErrorKind :: AppRpc ( AppRpcErrorKind :: ServerUnreachable ) ,
728+ & ValidationFailureClockReal :: default ( ) ,
729+ ) ,
730+ ) ) )
720731 . build ( ) ;
721732 let tx4 = FailedTxBuilder :: default ( )
722733 . hash ( make_tx_hash ( 4 ) )
@@ -768,10 +779,10 @@ mod tests {
768779 ( tx1. hash , Concluded ) ,
769780 (
770781 tx2. hash ,
771- RecheckRequired ( ValidationStatus :: Reattempting {
772- attempt : 1 ,
773- error : AppRpcError :: Remote ( RemoteError :: Unreachable ) ,
774- } ) ,
782+ RecheckRequired ( ValidationStatus :: Reattempting ( PreviousAttempts :: new (
783+ BlockchainErrorKind :: AppRpc ( AppRpcErrorKind :: ServerUnreachable ) ,
784+ & ValidationFailureClockReal :: default ( ) ,
785+ ) ) ) ,
775786 ) ,
776787 ( tx3. hash , Concluded ) ,
777788 ] ) ;
@@ -785,10 +796,10 @@ mod tests {
785796 assert_eq ! ( tx2. status, RecheckRequired ( ValidationStatus :: Waiting ) ) ;
786797 assert_eq ! (
787798 updated_txs[ 1 ] . status,
788- RecheckRequired ( ValidationStatus :: Reattempting {
789- attempt : 1 ,
790- error : AppRpcError :: Remote ( RemoteError :: Unreachable )
791- } )
799+ RecheckRequired ( ValidationStatus :: Reattempting ( PreviousAttempts :: new (
800+ BlockchainErrorKind :: AppRpc ( AppRpcErrorKind :: ServerUnreachable ) ,
801+ & ValidationFailureClockReal :: default ( )
802+ ) ) )
792803 ) ;
793804 assert_eq ! ( tx3. status, RetryRequired ) ;
794805 assert_eq ! ( updated_txs[ 2 ] . status, Concluded ) ;
0 commit comments