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