@@ -4595,6 +4595,75 @@ fn test_monitor_update_fail_no_rebroadcast() {
4595
4595
claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , payment_preimage_1) ;
4596
4596
}
4597
4597
4598
+ #[ test]
4599
+ fn test_monitor_update_raa_while_paused ( ) {
4600
+ // Tests handling of an RAA while monitor updating has already been marked failed.
4601
+ // Backported from chanmon_fail_consistency fuzz tests as this used to be broken.
4602
+ let mut nodes = create_network ( 2 ) ;
4603
+ create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
4604
+
4605
+ send_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , 5000000 ) ;
4606
+
4607
+ let route = nodes[ 0 ] . router . get_route ( & nodes[ 1 ] . node . get_our_node_id ( ) , None , & Vec :: new ( ) , 1000000 , TEST_FINAL_CLTV ) . unwrap ( ) ;
4608
+ let ( payment_preimage_1, our_payment_hash_1) = get_payment_preimage_hash ! ( nodes[ 0 ] ) ;
4609
+ nodes[ 0 ] . node . send_payment ( route, our_payment_hash_1) . unwrap ( ) ;
4610
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4611
+ let send_event_1 = SendEvent :: from_event ( nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) . remove ( 0 ) ) ;
4612
+
4613
+ let route = nodes[ 1 ] . router . get_route ( & nodes[ 0 ] . node . get_our_node_id ( ) , None , & Vec :: new ( ) , 1000000 , TEST_FINAL_CLTV ) . unwrap ( ) ;
4614
+ let ( payment_preimage_2, our_payment_hash_2) = get_payment_preimage_hash ! ( nodes[ 0 ] ) ;
4615
+ nodes[ 1 ] . node . send_payment ( route, our_payment_hash_2) . unwrap ( ) ;
4616
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4617
+ let send_event_2 = SendEvent :: from_event ( nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) . remove ( 0 ) ) ;
4618
+
4619
+ nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & send_event_1. msgs [ 0 ] ) . unwrap ( ) ;
4620
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & send_event_1. commitment_msg ) . unwrap ( ) ;
4621
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4622
+ let bs_raa = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 0 ] . node. get_our_node_id( ) ) ;
4623
+
4624
+ * nodes[ 0 ] . chan_monitor . update_ret . lock ( ) . unwrap ( ) = Err ( ChannelMonitorUpdateErr :: TemporaryFailure ) ;
4625
+ nodes[ 0 ] . node . handle_update_add_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & send_event_2. msgs [ 0 ] ) . unwrap ( ) ;
4626
+ 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 ( ) {
4627
+ assert_eq ! ( err, "Failed to update ChannelMonitor" ) ;
4628
+ } else { panic ! ( ) ; }
4629
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4630
+
4631
+ 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 ( ) {
4632
+ assert_eq ! ( err, "Previous monitor update failure prevented responses to RAA" ) ;
4633
+ } else { panic ! ( ) ; }
4634
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4635
+
4636
+ * nodes[ 0 ] . chan_monitor . update_ret . lock ( ) . unwrap ( ) = Ok ( ( ) ) ;
4637
+ nodes[ 0 ] . node . test_restore_channel_monitor ( ) ;
4638
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4639
+
4640
+ let as_update_raa = get_revoke_commit_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
4641
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_update_raa. 0 ) . unwrap ( ) ;
4642
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4643
+ let bs_cs = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
4644
+
4645
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_update_raa. 1 ) . unwrap ( ) ;
4646
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4647
+ let bs_second_raa = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 0 ] . node. get_our_node_id( ) ) ;
4648
+
4649
+ nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_cs. commitment_signed ) . unwrap ( ) ;
4650
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4651
+ let as_second_raa = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 1 ] . node. get_our_node_id( ) ) ;
4652
+
4653
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_second_raa) . unwrap ( ) ;
4654
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4655
+ expect_pending_htlcs_forwardable ! ( nodes[ 0 ] ) ;
4656
+ expect_payment_received ! ( nodes[ 0 ] , our_payment_hash_2, 1000000 ) ;
4657
+
4658
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_second_raa) . unwrap ( ) ;
4659
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4660
+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
4661
+ expect_payment_received ! ( nodes[ 1 ] , our_payment_hash_1, 1000000 ) ;
4662
+
4663
+ claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , payment_preimage_1) ;
4664
+ claim_payment ( & nodes[ 1 ] , & [ & nodes[ 0 ] ] , payment_preimage_2) ;
4665
+ }
4666
+
4598
4667
fn do_test_monitor_update_fail_raa ( test_ignore_second_cs : bool ) {
4599
4668
// Tests handling of a monitor update failure when processing an incoming RAA
4600
4669
let mut nodes = create_network ( 3 ) ;
0 commit comments