@@ -374,3 +374,61 @@ fn do_forward_fail_in_process_pending_htlc_fwds(check: ProcessPendingHTLCsCheck)
374
374
expect_payment_failed_conditions ( & nodes[ 0 ] , payment_hash, false ,
375
375
PaymentFailedConditions :: new ( ) . expected_htlc_error_data ( INVALID_ONION_BLINDING , & [ 0 ; 32 ] ) ) ;
376
376
}
377
+
378
+ #[ test]
379
+ fn blinded_intercept_payment ( ) {
380
+ let chanmon_cfgs = create_chanmon_cfgs ( 3 ) ;
381
+ let node_cfgs = create_node_cfgs ( 3 , & chanmon_cfgs) ;
382
+ let mut intercept_forwards_config = test_default_channel_config ( ) ;
383
+ intercept_forwards_config. accept_intercept_htlcs = true ;
384
+ let node_chanmgrs = create_node_chanmgrs ( 3 , & node_cfgs, & [ None , Some ( intercept_forwards_config) , None ] ) ;
385
+ let nodes = create_network ( 3 , & node_cfgs, & node_chanmgrs) ;
386
+ create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 1_000_000 , 0 ) ;
387
+ let chan_upd = create_announced_chan_between_nodes_with_value ( & nodes, 1 , 2 , 1_000_000 , 0 ) . 0 . contents ;
388
+
389
+ let amt_msat = 5000 ;
390
+ let ( _, payment_hash, payment_secret) = get_payment_preimage_hash ( & nodes[ 2 ] , Some ( amt_msat) , None ) ;
391
+ let intercept_scid = nodes[ 1 ] . node . get_intercept_scid ( ) ;
392
+ let mut intercept_chan_upd = chan_upd;
393
+ intercept_chan_upd. short_channel_id = intercept_scid;
394
+ let route_params = get_blinded_route_parameters ( amt_msat, payment_secret,
395
+ nodes. iter ( ) . skip ( 1 ) . map ( |n| n. node . get_our_node_id ( ) ) . collect ( ) , & [ & intercept_chan_upd] ,
396
+ & chanmon_cfgs[ 2 ] . keys_manager ) ;
397
+
398
+ nodes[ 0 ] . node . send_payment ( payment_hash, RecipientOnionFields :: spontaneous_empty ( ) ,
399
+ PaymentId ( payment_hash. 0 ) , route_params, Retry :: Attempts ( 0 ) ) . unwrap ( ) ;
400
+ check_added_monitors ( & nodes[ 0 ] , 1 ) ;
401
+ let payment_event = {
402
+ let mut events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
403
+ assert_eq ! ( events. len( ) , 1 ) ;
404
+ SendEvent :: from_event ( events. remove ( 0 ) )
405
+ } ;
406
+ nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) ;
407
+ commitment_signed_dance ! ( nodes[ 1 ] , nodes[ 0 ] , & payment_event. commitment_msg, false , true ) ;
408
+
409
+ let events = nodes[ 1 ] . node . get_and_clear_pending_events ( ) ;
410
+ assert_eq ! ( events. len( ) , 1 ) ;
411
+ let intercept_id = match events[ 0 ] {
412
+ crate :: events:: Event :: HTLCIntercepted {
413
+ intercept_id, payment_hash : pmt_hash,
414
+ requested_next_hop_scid : short_channel_id, ..
415
+ } => {
416
+ assert_eq ! ( pmt_hash, payment_hash) ;
417
+ assert_eq ! ( short_channel_id, intercept_scid) ;
418
+ intercept_id
419
+ } ,
420
+ _ => panic ! ( )
421
+ } ;
422
+
423
+ nodes[ 1 ] . node . fail_intercepted_htlc ( intercept_id) . unwrap ( ) ;
424
+ expect_pending_htlcs_forwardable_and_htlc_handling_failed_ignore ! ( nodes[ 1 ] , vec![ HTLCDestination :: UnknownNextHop { requested_forward_scid: intercept_scid } ] ) ;
425
+ nodes[ 1 ] . node . process_pending_htlc_forwards ( ) ;
426
+ let update_fail = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
427
+ check_added_monitors ! ( & nodes[ 1 ] , 1 ) ;
428
+ assert ! ( update_fail. update_fail_htlcs. len( ) == 1 ) ;
429
+ let fail_msg = update_fail. update_fail_htlcs [ 0 ] . clone ( ) ;
430
+ nodes[ 0 ] . node . handle_update_fail_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & fail_msg) ;
431
+ commitment_signed_dance ! ( nodes[ 0 ] , nodes[ 1 ] , update_fail. commitment_signed, false ) ;
432
+ expect_payment_failed_conditions ( & nodes[ 0 ] , payment_hash, false ,
433
+ PaymentFailedConditions :: new ( ) . expected_htlc_error_data ( INVALID_ONION_BLINDING , & [ 0 ; 32 ] ) ) ;
434
+ }
0 commit comments