@@ -33,8 +33,8 @@ use crate::ln::channel::{
33
33
MIN_CHAN_DUST_LIMIT_SATOSHIS , UNFUNDED_CHANNEL_AGE_LIMIT_TICKS ,
34
34
} ;
35
35
use crate :: ln:: channelmanager:: {
36
- PaymentId , RAACommitmentOrder , RecipientOnionFields , BREAKDOWN_TIMEOUT , DISABLE_GOSSIP_TICKS ,
37
- ENABLE_GOSSIP_TICKS , MIN_CLTV_EXPIRY_DELTA ,
36
+ PaymentId , RAACommitmentOrder , RecipientOnionFields , Retry , BREAKDOWN_TIMEOUT ,
37
+ DISABLE_GOSSIP_TICKS , ENABLE_GOSSIP_TICKS , MIN_CLTV_EXPIRY_DELTA ,
38
38
} ;
39
39
use crate :: ln:: msgs;
40
40
use crate :: ln:: msgs:: {
@@ -9703,3 +9703,147 @@ pub fn test_multi_post_event_actions() {
9703
9703
do_test_multi_post_event_actions ( true ) ;
9704
9704
do_test_multi_post_event_actions ( false ) ;
9705
9705
}
9706
+
9707
+ #[ xtest( feature = "_externalize_tests" ) ]
9708
+ fn test_stale_force_close_with_identical_htlcs ( ) {
9709
+ // Test that when two identical HTLCs are relayed and force-closes
9710
+ // with a stale state, that we fail both HTLCs back immediately.
9711
+ let chanmon_cfgs = create_chanmon_cfgs ( 4 ) ;
9712
+ let node_cfgs = create_node_cfgs ( 4 , & chanmon_cfgs) ;
9713
+ let node_chanmgrs = create_node_chanmgrs ( 4 , & node_cfgs, & [ None , None , None , None ] ) ;
9714
+ let mut nodes = create_network ( 4 , & node_cfgs, & node_chanmgrs) ;
9715
+
9716
+ let chan_a_b = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
9717
+ let _chan_b_c = create_announced_chan_between_nodes ( & nodes, 1 , 2 ) ;
9718
+ let _chan_d_b = create_announced_chan_between_nodes ( & nodes, 3 , 1 ) ;
9719
+
9720
+ let ( _payment_preimage, payment_hash, payment_secret) = get_payment_preimage_hash ! ( nodes[ 2 ] ) ;
9721
+
9722
+ let payment_params = PaymentParameters :: from_node_id ( nodes[ 2 ] . node . get_our_node_id ( ) , 100 ) ;
9723
+ let scorer = test_utils:: TestScorer :: new ( ) ;
9724
+ let random_seed_bytes = chanmon_cfgs[ 1 ] . keys_manager . get_secure_random_bytes ( ) ;
9725
+ let route_params = RouteParameters :: from_payment_params_and_value ( payment_params, 1_000_000 ) ;
9726
+
9727
+ let route = get_route (
9728
+ & nodes[ 0 ] . node . get_our_node_id ( ) ,
9729
+ & route_params,
9730
+ & nodes[ 0 ] . network_graph . read_only ( ) ,
9731
+ None ,
9732
+ nodes[ 0 ] . logger ,
9733
+ & scorer,
9734
+ & Default :: default ( ) ,
9735
+ & random_seed_bytes,
9736
+ )
9737
+ . unwrap ( ) ;
9738
+
9739
+ nodes[ 0 ] . router . expect_find_route ( route_params. clone ( ) , Ok ( route. clone ( ) ) ) ;
9740
+ nodes[ 0 ]
9741
+ . node
9742
+ . send_payment (
9743
+ payment_hash,
9744
+ RecipientOnionFields :: secret_only ( payment_secret) ,
9745
+ PaymentId ( [ 1 ; 32 ] ) ,
9746
+ route_params. clone ( ) ,
9747
+ Retry :: Attempts ( 0 ) ,
9748
+ )
9749
+ . unwrap ( ) ;
9750
+
9751
+ let ev1 = remove_first_msg_event_to_node (
9752
+ & nodes[ 1 ] . node . get_our_node_id ( ) ,
9753
+ & mut nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ,
9754
+ ) ;
9755
+ let mut send_ev1 = SendEvent :: from_event ( ev1) ;
9756
+
9757
+ nodes[ 1 ] . node . handle_update_add_htlc ( nodes[ 0 ] . node . get_our_node_id ( ) , & send_ev1. msgs [ 0 ] ) ;
9758
+ nodes[ 1 ] . node . handle_commitment_signed_batch_test (
9759
+ nodes[ 0 ] . node . get_our_node_id ( ) ,
9760
+ & send_ev1. commitment_msg ,
9761
+ ) ;
9762
+
9763
+ let mut b_events = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
9764
+ for ev in b_events. drain ( ..) {
9765
+ match ev {
9766
+ MessageSendEvent :: SendRevokeAndACK { node_id, msg } => {
9767
+ assert_eq ! ( node_id, nodes[ 0 ] . node. get_our_node_id( ) ) ;
9768
+ nodes[ 0 ] . node . handle_revoke_and_ack ( nodes[ 1 ] . node . get_our_node_id ( ) , & msg) ;
9769
+ } ,
9770
+ MessageSendEvent :: UpdateHTLCs { node_id, updates, .. } => {
9771
+ assert_eq ! ( node_id, nodes[ 0 ] . node. get_our_node_id( ) ) ;
9772
+ nodes[ 0 ] . node . handle_commitment_signed_batch_test (
9773
+ nodes[ 1 ] . node . get_our_node_id ( ) ,
9774
+ & updates. commitment_signed ,
9775
+ ) ;
9776
+ let mut a_events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
9777
+ for a_ev in a_events. drain ( ..) {
9778
+ if let MessageSendEvent :: SendRevokeAndACK { node_id, msg } = a_ev {
9779
+ assert_eq ! ( node_id, nodes[ 1 ] . node. get_our_node_id( ) ) ;
9780
+ nodes[ 1 ] . node . handle_revoke_and_ack ( nodes[ 0 ] . node . get_our_node_id ( ) , & msg) ;
9781
+ }
9782
+ }
9783
+ } ,
9784
+ _ => { } ,
9785
+ }
9786
+ }
9787
+
9788
+ nodes[ 1 ] . node . process_pending_htlc_forwards ( ) ;
9789
+ let _ = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
9790
+
9791
+ let stale_commitment_tx = get_local_commitment_txn ! ( nodes[ 0 ] , chan_a_b. 2 ) [ 0 ] . clone ( ) ;
9792
+
9793
+ * nodes[ 0 ] . network_payment_count . borrow_mut ( ) -= 1 ;
9794
+ nodes[ 0 ] . router . expect_find_route ( route_params. clone ( ) , Ok ( route. clone ( ) ) ) ;
9795
+ nodes[ 0 ]
9796
+ . node
9797
+ . send_payment (
9798
+ payment_hash,
9799
+ RecipientOnionFields :: secret_only ( payment_secret) ,
9800
+ PaymentId ( [ 2 ; 32 ] ) ,
9801
+ route_params. clone ( ) ,
9802
+ Retry :: Attempts ( 0 ) ,
9803
+ )
9804
+ . unwrap ( ) ;
9805
+
9806
+ let ev2 = remove_first_msg_event_to_node (
9807
+ & nodes[ 1 ] . node . get_our_node_id ( ) ,
9808
+ & mut nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ,
9809
+ ) ;
9810
+ let mut send_ev2 = SendEvent :: from_event ( ev2) ;
9811
+
9812
+ nodes[ 1 ] . node . handle_update_add_htlc ( nodes[ 0 ] . node . get_our_node_id ( ) , & send_ev2. msgs [ 0 ] ) ;
9813
+ nodes[ 1 ] . node . handle_commitment_signed_batch_test (
9814
+ nodes[ 0 ] . node . get_our_node_id ( ) ,
9815
+ & send_ev2. commitment_msg ,
9816
+ ) ;
9817
+
9818
+ let mut b2_events = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
9819
+ for ev in b2_events. drain ( ..) {
9820
+ match ev {
9821
+ MessageSendEvent :: SendRevokeAndACK { node_id, msg } => {
9822
+ assert_eq ! ( node_id, nodes[ 0 ] . node. get_our_node_id( ) ) ;
9823
+ nodes[ 0 ] . node . handle_revoke_and_ack ( nodes[ 1 ] . node . get_our_node_id ( ) , & msg) ;
9824
+ } ,
9825
+ MessageSendEvent :: UpdateHTLCs { node_id, updates, .. } => {
9826
+ assert_eq ! ( node_id, nodes[ 0 ] . node. get_our_node_id( ) ) ;
9827
+ nodes[ 0 ] . node . handle_commitment_signed_batch_test (
9828
+ nodes[ 1 ] . node . get_our_node_id ( ) ,
9829
+ & updates. commitment_signed ,
9830
+ ) ;
9831
+ } ,
9832
+ _ => { } ,
9833
+ }
9834
+ }
9835
+
9836
+ nodes[ 1 ] . node . process_pending_htlc_forwards ( ) ;
9837
+ let _ = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
9838
+
9839
+ mine_transaction ( & nodes[ 1 ] , & stale_commitment_tx) ;
9840
+ connect_blocks ( & nodes[ 1 ] , ANTI_REORG_DELAY ) ;
9841
+
9842
+ let events = nodes[ 1 ] . node . get_and_clear_pending_events ( ) ;
9843
+ let failed_count =
9844
+ events. iter ( ) . filter ( |e| matches ! ( e, Event :: HTLCHandlingFailed { .. } ) ) . count ( ) ;
9845
+ assert_eq ! ( failed_count, 2 ) ;
9846
+
9847
+ check_added_monitors ! ( & nodes[ 1 ] , 1 ) ;
9848
+ nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
9849
+ }
0 commit comments