@@ -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 ( ) ;
@@ -4594,6 +4607,76 @@ fn test_monitor_update_fail_no_rebroadcast() {
4594
4607
claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , payment_preimage_1) ;
4595
4608
}
4596
4609
4610
+ #[ test]
4611
+ fn test_monitor_update_raa_while_paused ( ) {
4612
+ // Tests handling of an RAA while monitor updating has already been marked failed.
4613
+ // Backported from chanmon_fail_consistency fuzz tests as this used to be broken.
4614
+ let mut nodes = create_network ( 2 ) ;
4615
+ create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
4616
+
4617
+ send_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , 5000000 ) ;
4618
+
4619
+ let route = nodes[ 0 ] . router . get_route ( & nodes[ 1 ] . node . get_our_node_id ( ) , None , & Vec :: new ( ) , 1000000 , TEST_FINAL_CLTV ) . unwrap ( ) ;
4620
+ let ( payment_preimage_1, our_payment_hash_1) = get_payment_preimage_hash ! ( nodes[ 0 ] ) ;
4621
+ nodes[ 0 ] . node . send_payment ( route, our_payment_hash_1) . unwrap ( ) ;
4622
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4623
+ let send_event_1 = SendEvent :: from_event ( nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) . remove ( 0 ) ) ;
4624
+
4625
+ let route = nodes[ 1 ] . router . get_route ( & nodes[ 0 ] . node . get_our_node_id ( ) , None , & Vec :: new ( ) , 1000000 , TEST_FINAL_CLTV ) . unwrap ( ) ;
4626
+ let ( payment_preimage_2, our_payment_hash_2) = get_payment_preimage_hash ! ( nodes[ 0 ] ) ;
4627
+ nodes[ 1 ] . node . send_payment ( route, our_payment_hash_2) . unwrap ( ) ;
4628
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4629
+ let send_event_2 = SendEvent :: from_event ( nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) . remove ( 0 ) ) ;
4630
+
4631
+ nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & send_event_1. msgs [ 0 ] ) . unwrap ( ) ;
4632
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & send_event_1. commitment_msg ) . unwrap ( ) ;
4633
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4634
+ let bs_raa = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 0 ] . node. get_our_node_id( ) ) ;
4635
+
4636
+ * nodes[ 0 ] . chan_monitor . update_ret . lock ( ) . unwrap ( ) = Err ( ChannelMonitorUpdateErr :: TemporaryFailure ) ;
4637
+ nodes[ 0 ] . node . handle_update_add_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & send_event_2. msgs [ 0 ] ) . unwrap ( ) ;
4638
+ 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 ( ) {
4639
+ assert_eq ! ( err, "Failed to update ChannelMonitor" ) ;
4640
+ } else { panic ! ( ) ; }
4641
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4642
+ assert ! ( nodes[ 1 ] . node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
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
+
4597
4680
fn do_test_monitor_update_fail_raa ( test_ignore_second_cs : bool ) {
4598
4681
// Tests handling of a monitor update failure when processing an incoming RAA
4599
4682
let mut nodes = create_network ( 3 ) ;
0 commit comments