@@ -19,11 +19,11 @@ use crate::events::{ClosureReason, Event, HTLCDestination, MessageSendEvent, Mes
19
19
use crate :: ln:: channel:: EXPIRE_PREV_CONFIG_TICKS ;
20
20
use crate :: ln:: channelmanager:: { BREAKDOWN_TIMEOUT , ChannelManager , MPP_TIMEOUT_TICKS , MIN_CLTV_EXPIRY_DELTA , PaymentId , PaymentSendFailure , IDEMPOTENCY_TIMEOUT_TICKS , RecentPaymentDetails , RecipientOnionFields , HTLCForwardInfo , PendingHTLCRouting , PendingAddHTLCInfo } ;
21
21
use crate :: ln:: features:: InvoiceFeatures ;
22
- use crate :: ln:: { msgs, PaymentSecret } ;
22
+ use crate :: ln:: { msgs, PaymentSecret , PaymentPreimage } ;
23
23
use crate :: ln:: msgs:: ChannelMessageHandler ;
24
24
use crate :: ln:: outbound_payment:: Retry ;
25
25
use crate :: routing:: gossip:: { EffectiveCapacity , RoutingFees } ;
26
- use crate :: routing:: router:: { get_route, Path , PaymentParameters , Route , Router , RouteHint , RouteHintHop , RouteHop , RouteParameters } ;
26
+ use crate :: routing:: router:: { get_route, Path , PaymentParameters , Route , Router , RouteHint , RouteHintHop , RouteHop , RouteParameters , find_route } ;
27
27
use crate :: routing:: scoring:: ChannelUsage ;
28
28
use crate :: util:: test_utils;
29
29
use crate :: util:: errors:: APIError ;
@@ -236,6 +236,53 @@ fn mpp_receive_timeout() {
236
236
do_mpp_receive_timeout ( false ) ;
237
237
}
238
238
239
+ #[ test]
240
+ fn test_mpp_keysend ( ) {
241
+ let mut mpp_keysend_config = test_default_channel_config ( ) ;
242
+ mpp_keysend_config. accept_mpp_keysend = true ;
243
+ let chanmon_cfgs = create_chanmon_cfgs ( 4 ) ;
244
+ let node_cfgs = create_node_cfgs ( 4 , & chanmon_cfgs) ;
245
+ let node_chanmgrs = create_node_chanmgrs ( 4 , & node_cfgs, & [ None , None , None , Some ( mpp_keysend_config) ] ) ;
246
+ let nodes = create_network ( 4 , & node_cfgs, & node_chanmgrs) ;
247
+
248
+ create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
249
+ create_announced_chan_between_nodes ( & nodes, 0 , 2 ) ;
250
+ create_announced_chan_between_nodes ( & nodes, 1 , 3 ) ;
251
+ create_announced_chan_between_nodes ( & nodes, 2 , 3 ) ;
252
+ let network_graph = nodes[ 0 ] . network_graph . clone ( ) ;
253
+
254
+ let payer_pubkey = nodes[ 0 ] . node . get_our_node_id ( ) ;
255
+ let payee_pubkey = nodes[ 3 ] . node . get_our_node_id ( ) ;
256
+ let recv_value = 15_000_000 ;
257
+ let route_params = RouteParameters {
258
+ payment_params : PaymentParameters :: for_keysend ( payee_pubkey, 40 , true ) ,
259
+ final_value_msat : recv_value,
260
+ } ;
261
+ let scorer = test_utils:: TestScorer :: new ( ) ;
262
+ let random_seed_bytes = chanmon_cfgs[ 0 ] . keys_manager . get_secure_random_bytes ( ) ;
263
+ let route = find_route ( & payer_pubkey, & route_params, & network_graph, None , nodes[ 0 ] . logger ,
264
+ & scorer, & ( ) , & random_seed_bytes) . unwrap ( ) ;
265
+
266
+ let payment_preimage = PaymentPreimage ( [ 42 ; 32 ] ) ;
267
+ let payment_secret = PaymentSecret ( payment_preimage. 0 ) ;
268
+ let payment_hash = nodes[ 0 ] . node . send_spontaneous_payment ( & route, Some ( payment_preimage) ,
269
+ RecipientOnionFields :: secret_only ( payment_secret) , PaymentId ( payment_preimage. 0 ) ) . unwrap ( ) ;
270
+ check_added_monitors ! ( nodes[ 0 ] , 2 ) ;
271
+
272
+ let expected_route: & [ & [ & Node ] ] = & [ & [ & nodes[ 1 ] , & nodes[ 3 ] ] , & [ & nodes[ 2 ] , & nodes[ 3 ] ] ] ;
273
+ let mut events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
274
+ assert_eq ! ( events. len( ) , 2 ) ;
275
+
276
+ let ev = remove_first_msg_event_to_node ( & nodes[ 1 ] . node . get_our_node_id ( ) , & mut events) ;
277
+ pass_along_path ( & nodes[ 0 ] , expected_route[ 0 ] , recv_value, payment_hash. clone ( ) ,
278
+ Some ( payment_secret) , ev. clone ( ) , false , Some ( payment_preimage) ) ;
279
+
280
+ let ev = remove_first_msg_event_to_node ( & nodes[ 2 ] . node . get_our_node_id ( ) , & mut events) ;
281
+ pass_along_path ( & nodes[ 0 ] , expected_route[ 1 ] , recv_value, payment_hash. clone ( ) ,
282
+ Some ( payment_secret) , ev. clone ( ) , true , Some ( payment_preimage) ) ;
283
+ claim_payment_along_route ( & nodes[ 0 ] , expected_route, false , payment_preimage) ;
284
+ }
285
+
239
286
#[ test]
240
287
fn test_reject_mpp_keysend_htlc ( ) {
241
288
// This test enforces that we reject MPP keysend HTLCs if our config states we don't support
0 commit comments