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