10
10
use bitcoin:: secp256k1:: { PublicKey , Secp256k1 , SecretKey } ;
11
11
use crate :: blinded_path:: BlindedPath ;
12
12
use crate :: blinded_path:: payment:: { ForwardNode , ForwardTlvs , PaymentConstraints , PaymentRelay , ReceiveTlvs } ;
13
- use crate :: events:: { HTLCDestination , MessageSendEventsProvider } ;
13
+ use crate :: events:: { HTLCDestination , MessageSendEvent , MessageSendEventsProvider } ;
14
14
use crate :: ln:: PaymentSecret ;
15
15
use crate :: ln:: channelmanager;
16
16
use crate :: ln:: channelmanager:: { PaymentId , RecipientOnionFields } ;
@@ -459,6 +459,7 @@ fn two_hop_blinded_path_success() {
459
459
claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] , & nodes[ 2 ] ] , payment_preimage) ;
460
460
}
461
461
462
+ #[ derive( PartialEq ) ]
462
463
enum ReceiveCheckFail {
463
464
// The recipient fails the payment upon `PaymentClaimable`.
464
465
RecipientFail ,
@@ -467,13 +468,17 @@ enum ReceiveCheckFail {
467
468
// The incoming HTLC did not satisfy our requirements; in this case it underpaid us according to
468
469
// the expected receive amount in the onion.
469
470
ReceiveRequirements ,
471
+ // The incoming HTLC errors when added to the Channel, in this case due to the HTLC being
472
+ // delivered out-of-order with a shutdown message.
473
+ ChannelCheck ,
470
474
}
471
475
472
476
#[ test]
473
477
fn multi_hop_receiver_fail ( ) {
474
478
do_multi_hop_receiver_fail ( ReceiveCheckFail :: RecipientFail ) ;
475
479
do_multi_hop_receiver_fail ( ReceiveCheckFail :: OnionDecodeFail ) ;
476
480
do_multi_hop_receiver_fail ( ReceiveCheckFail :: ReceiveRequirements ) ;
481
+ do_multi_hop_receiver_fail ( ReceiveCheckFail :: ChannelCheck ) ;
477
482
}
478
483
479
484
fn do_multi_hop_receiver_fail ( check : ReceiveCheckFail ) {
@@ -486,7 +491,12 @@ fn do_multi_hop_receiver_fail(check: ReceiveCheckFail) {
486
491
let session_priv = [ 3 ; 32 ] ;
487
492
* nodes[ 0 ] . keys_manager . override_random_bytes . lock ( ) . unwrap ( ) = Some ( session_priv) ;
488
493
create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 1_000_000 , 0 ) ;
489
- let chan_upd_1_2 = create_announced_chan_between_nodes_with_value ( & nodes, 1 , 2 , 1_000_000 , 0 ) . 0 . contents ;
494
+ let ( chan_upd_1_2, chan_id_1_2) = {
495
+ let ( chan_upd, _, channel_id, ..) = create_announced_chan_between_nodes_with_value (
496
+ & nodes, 1 , 2 , 1_000_000 , 0
497
+ ) ;
498
+ ( chan_upd. contents , channel_id)
499
+ } ;
490
500
491
501
let amt_msat = 5000 ;
492
502
let ( _, payment_hash, payment_secret) = get_payment_preimage_hash ( & nodes[ 2 ] , Some ( amt_msat) , None ) ;
@@ -566,6 +576,19 @@ fn do_multi_hop_receiver_fail(check: ReceiveCheckFail) {
566
576
check_added_monitors ! ( nodes[ 2 ] , 0 ) ;
567
577
do_commitment_signed_dance ( & nodes[ 2 ] , & nodes[ 1 ] , & payment_event_1_2. commitment_msg , true , true ) ;
568
578
} ,
579
+ ReceiveCheckFail :: ChannelCheck => {
580
+ nodes[ 2 ] . node . close_channel ( & chan_id_1_2, & nodes[ 1 ] . node . get_our_node_id ( ) ) . unwrap ( ) ;
581
+ let node_2_shutdown = get_event_msg ! ( nodes[ 2 ] , MessageSendEvent :: SendShutdown , nodes[ 1 ] . node. get_our_node_id( ) ) ;
582
+ nodes[ 1 ] . node . handle_shutdown ( & nodes[ 2 ] . node . get_our_node_id ( ) , & node_2_shutdown) ;
583
+ let node_1_shutdown = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendShutdown , nodes[ 2 ] . node. get_our_node_id( ) ) ;
584
+
585
+ nodes[ 2 ] . node . handle_update_add_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & payment_event_1_2. msgs [ 0 ] ) ;
586
+ nodes[ 2 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & payment_event_1_2. commitment_msg ) ;
587
+ check_added_monitors ! ( nodes[ 2 ] , 1 ) ;
588
+
589
+ nodes[ 2 ] . node . handle_shutdown ( & nodes[ 1 ] . node . get_our_node_id ( ) , & node_1_shutdown) ;
590
+ commitment_signed_dance ! ( nodes[ 2 ] , nodes[ 1 ] , ( ) , false , true , false , false ) ;
591
+ }
569
592
}
570
593
571
594
let updates_2_1 = get_htlc_update_msgs ! ( nodes[ 2 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
@@ -576,7 +599,20 @@ fn do_multi_hop_receiver_fail(check: ReceiveCheckFail) {
576
599
nodes[ 1 ] . node . handle_update_fail_malformed_htlc ( & nodes[ 2 ] . node . get_our_node_id ( ) , update_malformed) ;
577
600
do_commitment_signed_dance ( & nodes[ 1 ] , & nodes[ 2 ] , & updates_2_1. commitment_signed , true , false ) ;
578
601
579
- let updates_1_0 = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
602
+ let updates_1_0 = if check == ReceiveCheckFail :: ChannelCheck {
603
+ let events = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
604
+ assert_eq ! ( events. len( ) , 2 ) ;
605
+ events. into_iter ( ) . find_map ( |ev| {
606
+ match ev {
607
+ MessageSendEvent :: UpdateHTLCs { node_id, updates } => {
608
+ assert_eq ! ( node_id, nodes[ 0 ] . node. get_our_node_id( ) ) ;
609
+ return Some ( updates)
610
+ } ,
611
+ MessageSendEvent :: SendClosingSigned { .. } => None ,
612
+ _ => panic ! ( )
613
+ }
614
+ } ) . unwrap ( )
615
+ } else { get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) } ;
580
616
assert_eq ! ( updates_1_0. update_fail_htlcs. len( ) , 1 ) ;
581
617
nodes[ 0 ] . node . handle_update_fail_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & updates_1_0. update_fail_htlcs [ 0 ] ) ;
582
618
do_commitment_signed_dance ( & nodes[ 0 ] , & nodes[ 1 ] , & updates_1_0. commitment_signed , false , false ) ;
0 commit comments