@@ -32,8 +32,8 @@ use crate::ln::channel::{
3232 MIN_CHAN_DUST_LIMIT_SATOSHIS , UNFUNDED_CHANNEL_AGE_LIMIT_TICKS ,
3333} ;
3434use 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 ,
3737} ;
3838use crate :: ln:: msgs;
3939use crate :: ln:: msgs:: {
@@ -9680,3 +9680,147 @@ pub fn test_multi_post_event_actions() {
96809680 do_test_multi_post_event_actions ( true ) ;
96819681 do_test_multi_post_event_actions ( false ) ;
96829682}
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