@@ -22,7 +22,7 @@ use crate::ln::onion_utils;
22
22
use crate :: ln:: onion_utils:: INVALID_ONION_BLINDING ;
23
23
use crate :: ln:: outbound_payment:: Retry ;
24
24
use crate :: prelude:: * ;
25
- use crate :: routing:: router:: { PaymentParameters , RouteParameters } ;
25
+ use crate :: routing:: router:: { Payee , PaymentParameters , RouteParameters } ;
26
26
use crate :: util:: config:: UserConfig ;
27
27
use crate :: util:: test_utils;
28
28
@@ -505,6 +505,8 @@ enum ReceiveCheckFail {
505
505
// The HTLC is successfully added to the inbound channel but fails receive checks in
506
506
// process_pending_htlc_forwards.
507
507
ProcessPendingHTLCsCheck ,
508
+ // The HTLC violates the `PaymentConstraints` contained within the receiver's encrypted payload.
509
+ PaymentConstraints ,
508
510
}
509
511
510
512
#[ test]
@@ -514,6 +516,7 @@ fn multi_hop_receiver_fail() {
514
516
do_multi_hop_receiver_fail ( ReceiveCheckFail :: ReceiveRequirements ) ;
515
517
do_multi_hop_receiver_fail ( ReceiveCheckFail :: ChannelCheck ) ;
516
518
do_multi_hop_receiver_fail ( ReceiveCheckFail :: ProcessPendingHTLCsCheck ) ;
519
+ do_multi_hop_receiver_fail ( ReceiveCheckFail :: PaymentConstraints ) ;
517
520
}
518
521
519
522
fn do_multi_hop_receiver_fail ( check : ReceiveCheckFail ) {
@@ -539,7 +542,7 @@ fn do_multi_hop_receiver_fail(check: ReceiveCheckFail) {
539
542
Some ( TEST_FINAL_CLTV as u16 - 2 )
540
543
} else { None } ;
541
544
let ( _, payment_hash, payment_secret) = get_payment_preimage_hash ( & nodes[ 2 ] , Some ( amt_msat) , final_cltv_delta) ;
542
- let route_params = get_blinded_route_parameters ( amt_msat, payment_secret,
545
+ let mut route_params = get_blinded_route_parameters ( amt_msat, payment_secret,
543
546
nodes. iter ( ) . skip ( 1 ) . map ( |n| n. node . get_our_node_id ( ) ) . collect ( ) , & [ & chan_upd_1_2] ,
544
547
& chanmon_cfgs[ 2 ] . keys_manager ) ;
545
548
@@ -548,7 +551,25 @@ fn do_multi_hop_receiver_fail(check: ReceiveCheckFail) {
548
551
// Set the final CLTV expiry too low to trigger the failure in process_pending_htlc_forwards.
549
552
route. paths [ 0 ] . blinded_tail . as_mut ( ) . map ( |bt| bt. excess_final_cltv_expiry_delta = TEST_FINAL_CLTV - 2 ) ;
550
553
route
551
- } else {
554
+ } else if check == ReceiveCheckFail :: PaymentConstraints {
555
+ // Create a blinded path where the receiver's encrypted payload has an htlc_minimum_msat that is
556
+ // violated by `amt_msat`, and stick it in the route_params without changing the corresponding
557
+ // BlindedPayInfo (to ensure pathfinding still succeeds).
558
+ let high_htlc_min_bp = {
559
+ let mut high_htlc_minimum_upd = chan_upd_1_2. clone ( ) ;
560
+ high_htlc_minimum_upd. htlc_minimum_msat = amt_msat + 1000 ;
561
+ let high_htlc_min_params = get_blinded_route_parameters ( amt_msat, payment_secret,
562
+ nodes. iter ( ) . skip ( 1 ) . map ( |n| n. node . get_our_node_id ( ) ) . collect ( ) , & [ & high_htlc_minimum_upd] ,
563
+ & chanmon_cfgs[ 2 ] . keys_manager ) ;
564
+ if let Payee :: Blinded { route_hints, .. } = high_htlc_min_params. payment_params . payee {
565
+ route_hints[ 0 ] . 1 . clone ( )
566
+ } else { panic ! ( ) }
567
+ } ;
568
+ if let Payee :: Blinded { ref mut route_hints, .. } = route_params. payment_params . payee {
569
+ route_hints[ 0 ] . 1 = high_htlc_min_bp;
570
+ } else { panic ! ( ) }
571
+ find_route ( & nodes[ 0 ] , & route_params) . unwrap ( )
572
+ } else {
552
573
find_route ( & nodes[ 0 ] , & route_params) . unwrap ( )
553
574
} ;
554
575
node_cfgs[ 0 ] . router . expect_find_route ( route_params. clone ( ) , Ok ( route. clone ( ) ) ) ;
@@ -643,6 +664,11 @@ fn do_multi_hop_receiver_fail(check: ReceiveCheckFail) {
643
664
expect_pending_htlcs_forwardable_and_htlc_handling_failed_ignore ! ( nodes[ 2 ] ,
644
665
vec![ HTLCDestination :: FailedPayment { payment_hash } ] ) ;
645
666
check_added_monitors ! ( nodes[ 2 ] , 1 ) ;
667
+ } ,
668
+ ReceiveCheckFail :: PaymentConstraints => {
669
+ nodes[ 2 ] . node . handle_update_add_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & payment_event_1_2. msgs [ 0 ] ) ;
670
+ check_added_monitors ! ( nodes[ 2 ] , 0 ) ;
671
+ do_commitment_signed_dance ( & nodes[ 2 ] , & nodes[ 1 ] , & payment_event_1_2. commitment_msg , true , true ) ;
646
672
}
647
673
}
648
674
0 commit comments