@@ -558,6 +558,19 @@ macro_rules! expect_pending_htlcs_forwardable {
558
558
} }
559
559
}
560
560
561
+ macro_rules! expect_payment_received {
562
+ ( $node: expr, $payment_hash: expr) => { {
563
+ let events = $node. node. get_and_clear_pending_events( ) ;
564
+ assert_eq!( events. len( ) , 1 ) ;
565
+ match events[ 0 ] {
566
+ Event :: PaymentReceived { ref payment_hash, .. } => {
567
+ assert_eq!( * payment_hash, $payment_hash) ;
568
+ } ,
569
+ _ => panic!( "Unexpected event" ) ,
570
+ } ;
571
+ } }
572
+ }
573
+
561
574
fn send_along_route_with_hash ( origin_node : & Node , route : Route , expected_route : & [ & Node ] , recv_value : u64 , our_payment_hash : PaymentHash ) {
562
575
let mut payment_event = {
563
576
origin_node. node . send_payment ( route, our_payment_hash) . unwrap ( ) ;
@@ -4595,6 +4608,75 @@ fn test_monitor_update_fail_no_rebroadcast() {
4595
4608
claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , payment_preimage_1) ;
4596
4609
}
4597
4610
4611
+ #[ test]
4612
+ fn test_monitor_update_raa_while_paused ( ) {
4613
+ // Tests handling of an RAA while monitor updating has already been marked failed.
4614
+ // Backported from chanmon_fail_consistency fuzz tests as this used to be broken.
4615
+ let mut nodes = create_network ( 2 ) ;
4616
+ create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
4617
+
4618
+ send_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , 5000000 ) ;
4619
+
4620
+ let route = nodes[ 0 ] . router . get_route ( & nodes[ 1 ] . node . get_our_node_id ( ) , None , & Vec :: new ( ) , 1000000 , TEST_FINAL_CLTV ) . unwrap ( ) ;
4621
+ let ( payment_preimage_1, our_payment_hash_1) = get_payment_preimage_hash ! ( nodes[ 0 ] ) ;
4622
+ nodes[ 0 ] . node . send_payment ( route, our_payment_hash_1) . unwrap ( ) ;
4623
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4624
+ let send_event_1 = SendEvent :: from_event ( nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) . remove ( 0 ) ) ;
4625
+
4626
+ let route = nodes[ 1 ] . router . get_route ( & nodes[ 0 ] . node . get_our_node_id ( ) , None , & Vec :: new ( ) , 1000000 , TEST_FINAL_CLTV ) . unwrap ( ) ;
4627
+ let ( payment_preimage_2, our_payment_hash_2) = get_payment_preimage_hash ! ( nodes[ 0 ] ) ;
4628
+ nodes[ 1 ] . node . send_payment ( route, our_payment_hash_2) . unwrap ( ) ;
4629
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4630
+ let send_event_2 = SendEvent :: from_event ( nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) . remove ( 0 ) ) ;
4631
+
4632
+ nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & send_event_1. msgs [ 0 ] ) . unwrap ( ) ;
4633
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & send_event_1. commitment_msg ) . unwrap ( ) ;
4634
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4635
+ let bs_raa = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 0 ] . node. get_our_node_id( ) ) ;
4636
+
4637
+ * nodes[ 0 ] . chan_monitor . update_ret . lock ( ) . unwrap ( ) = Err ( ChannelMonitorUpdateErr :: TemporaryFailure ) ;
4638
+ nodes[ 0 ] . node . handle_update_add_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & send_event_2. msgs [ 0 ] ) . unwrap ( ) ;
4639
+ 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 ( ) {
4640
+ assert_eq ! ( err, "Failed to update ChannelMonitor" ) ;
4641
+ } else { panic ! ( ) ; }
4642
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4643
+
4644
+ 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 ( ) {
4645
+ assert_eq ! ( err, "Previous monitor update failure prevented responses to RAA" ) ;
4646
+ } else { panic ! ( ) ; }
4647
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4648
+
4649
+ * nodes[ 0 ] . chan_monitor . update_ret . lock ( ) . unwrap ( ) = Ok ( ( ) ) ;
4650
+ nodes[ 0 ] . node . test_restore_channel_monitor ( ) ;
4651
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4652
+
4653
+ let as_update_raa = get_revoke_commit_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
4654
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_update_raa. 0 ) . unwrap ( ) ;
4655
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4656
+ let bs_cs = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
4657
+
4658
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_update_raa. 1 ) . unwrap ( ) ;
4659
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4660
+ let bs_second_raa = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 0 ] . node. get_our_node_id( ) ) ;
4661
+
4662
+ nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_cs. commitment_signed ) . unwrap ( ) ;
4663
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4664
+ let as_second_raa = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 1 ] . node. get_our_node_id( ) ) ;
4665
+
4666
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_second_raa) . unwrap ( ) ;
4667
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4668
+ expect_pending_htlcs_forwardable ! ( nodes[ 0 ] ) ;
4669
+ expect_payment_received ! ( nodes[ 0 ] , our_payment_hash_2) ;
4670
+
4671
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_second_raa) . unwrap ( ) ;
4672
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4673
+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
4674
+ expect_payment_received ! ( nodes[ 1 ] , our_payment_hash_1) ;
4675
+
4676
+ claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , payment_preimage_1) ;
4677
+ claim_payment ( & nodes[ 1 ] , & [ & nodes[ 0 ] ] , payment_preimage_2) ;
4678
+ }
4679
+
4598
4680
fn do_test_monitor_update_fail_raa ( test_ignore_second_cs : bool ) {
4599
4681
// Tests handling of a monitor update failure when processing an incoming RAA
4600
4682
let mut nodes = create_network ( 3 ) ;
0 commit comments