@@ -33,8 +33,8 @@ use crate::ln::channel::{
3333MIN_CHAN_DUST_LIMIT_SATOSHIS , UNFUNDED_CHANNEL_AGE_LIMIT_TICKS ,
3434} ;
3535use 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 ,
3838} ;
3939use crate :: ln:: msgs;
4040use crate :: ln:: msgs:: {
@@ -9703,3 +9703,147 @@ pub fn test_multi_post_event_actions() {
97039703do_test_multi_post_event_actions ( true ) ;
97049704do_test_multi_post_event_actions ( false ) ;
97059705}
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