@@ -557,6 +557,19 @@ macro_rules! expect_pending_htlcs_forwardable {
557
557
} }
558
558
}
559
559
560
+ macro_rules! expect_payment_received {
561
+ ( $node: expr, $payment_hash: expr) => { {
562
+ let events = $node. node. get_and_clear_pending_events( ) ;
563
+ assert_eq!( events. len( ) , 1 ) ;
564
+ match events[ 0 ] {
565
+ Event :: PaymentReceived { ref payment_hash, .. } => {
566
+ assert_eq!( * payment_hash, $payment_hash) ;
567
+ } ,
568
+ _ => panic!( "Unexpected event" ) ,
569
+ } ;
570
+ } }
571
+ }
572
+
560
573
fn send_along_route_with_hash ( origin_node : & Node , route : Route , expected_route : & [ & Node ] , recv_value : u64 , our_payment_hash : PaymentHash ) {
561
574
let mut payment_event = {
562
575
origin_node. node . send_payment ( route, our_payment_hash) . unwrap ( ) ;
@@ -4720,6 +4733,75 @@ fn test_monitor_update_fail_no_rebroadcast() {
4720
4733
claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , payment_preimage_1) ;
4721
4734
}
4722
4735
4736
+ #[ test]
4737
+ fn test_monitor_update_raa_while_paused ( ) {
4738
+ // Tests handling of an RAA while monitor updating has already been marked failed.
4739
+ // Backported from chanmon_fail_consistency fuzz tests as this used to be broken.
4740
+ let mut nodes = create_network ( 2 ) ;
4741
+ create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
4742
+
4743
+ send_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , 5000000 ) ;
4744
+
4745
+ let route = nodes[ 0 ] . router . get_route ( & nodes[ 1 ] . node . get_our_node_id ( ) , None , & Vec :: new ( ) , 1000000 , TEST_FINAL_CLTV ) . unwrap ( ) ;
4746
+ let ( payment_preimage_1, our_payment_hash_1) = get_payment_preimage_hash ! ( nodes[ 0 ] ) ;
4747
+ nodes[ 0 ] . node . send_payment ( route, our_payment_hash_1) . unwrap ( ) ;
4748
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4749
+ let send_event_1 = SendEvent :: from_event ( nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) . remove ( 0 ) ) ;
4750
+
4751
+ let route = nodes[ 1 ] . router . get_route ( & nodes[ 0 ] . node . get_our_node_id ( ) , None , & Vec :: new ( ) , 1000000 , TEST_FINAL_CLTV ) . unwrap ( ) ;
4752
+ let ( payment_preimage_2, our_payment_hash_2) = get_payment_preimage_hash ! ( nodes[ 0 ] ) ;
4753
+ nodes[ 1 ] . node . send_payment ( route, our_payment_hash_2) . unwrap ( ) ;
4754
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4755
+ let send_event_2 = SendEvent :: from_event ( nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) . remove ( 0 ) ) ;
4756
+
4757
+ nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & send_event_1. msgs [ 0 ] ) . unwrap ( ) ;
4758
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & send_event_1. commitment_msg ) . unwrap ( ) ;
4759
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4760
+ let bs_raa = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 0 ] . node. get_our_node_id( ) ) ;
4761
+
4762
+ * nodes[ 0 ] . chan_monitor . update_ret . lock ( ) . unwrap ( ) = Err ( ChannelMonitorUpdateErr :: TemporaryFailure ) ;
4763
+ nodes[ 0 ] . node . handle_update_add_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & send_event_2. msgs [ 0 ] ) . unwrap ( ) ;
4764
+ if let msgs:: HandleError { err, action : Some ( msgs:: ErrorAction :: IgnoreError ) } = nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & send_event_2. commitment_msg ) . unwrap_err ( ) {
4765
+ assert_eq ! ( err, "Failed to update ChannelMonitor" ) ;
4766
+ } else { panic ! ( ) ; }
4767
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4768
+
4769
+ if let msgs:: HandleError { err, action : Some ( msgs:: ErrorAction :: IgnoreError ) } = nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_raa) . unwrap_err ( ) {
4770
+ assert_eq ! ( err, "Previous monitor update failure prevented responses to RAA" ) ;
4771
+ } else { panic ! ( ) ; }
4772
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4773
+
4774
+ * nodes[ 0 ] . chan_monitor . update_ret . lock ( ) . unwrap ( ) = Ok ( ( ) ) ;
4775
+ nodes[ 0 ] . node . test_restore_channel_monitor ( ) ;
4776
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4777
+
4778
+ let as_update_raa = get_revoke_commit_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
4779
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_update_raa. 0 ) . unwrap ( ) ;
4780
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4781
+ let bs_cs = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
4782
+
4783
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_update_raa. 1 ) . unwrap ( ) ;
4784
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4785
+ let bs_second_raa = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 0 ] . node. get_our_node_id( ) ) ;
4786
+
4787
+ nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_cs. commitment_signed ) . unwrap ( ) ;
4788
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4789
+ let as_second_raa = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 1 ] . node. get_our_node_id( ) ) ;
4790
+
4791
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_second_raa) . unwrap ( ) ;
4792
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4793
+ expect_pending_htlcs_forwardable ! ( nodes[ 0 ] ) ;
4794
+ expect_payment_received ! ( nodes[ 0 ] , our_payment_hash_2) ;
4795
+
4796
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_second_raa) . unwrap ( ) ;
4797
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4798
+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
4799
+ expect_payment_received ! ( nodes[ 1 ] , our_payment_hash_1) ;
4800
+
4801
+ claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , payment_preimage_1) ;
4802
+ claim_payment ( & nodes[ 1 ] , & [ & nodes[ 0 ] ] , payment_preimage_2) ;
4803
+ }
4804
+
4723
4805
fn do_test_monitor_update_fail_raa ( test_ignore_second_cs : bool ) {
4724
4806
// Tests handling of a monitor update failure when processing an incoming RAA
4725
4807
let mut nodes = create_network ( 3 ) ;
0 commit comments