@@ -330,6 +330,38 @@ fn extract_payment_preimage(event: &Event) -> PaymentPreimage {
330
330
}
331
331
}
332
332
333
+ fn expect_offer_paths_requests ( recipient : & Node , next_hop_nodes : & [ & Node ] ) {
334
+ // We want to check that the async recipient has enqueued at least one `OfferPathsRequest` and no
335
+ // other message types. Check this by iterating through all their outbound onion messages, peeling
336
+ // multiple times if the messages are forwarded through other nodes.
337
+ let per_msg_recipient_msgs = recipient. onion_messenger . release_pending_msgs ( ) ;
338
+ let mut pk_to_msg = Vec :: new ( ) ;
339
+ for ( pk, msgs) in per_msg_recipient_msgs {
340
+ for msg in msgs {
341
+ pk_to_msg. push ( ( pk, msg) ) ;
342
+ }
343
+ }
344
+ let mut num_offer_paths_reqs: u8 = 0 ;
345
+ while let Some ( ( pk, msg) ) = pk_to_msg. pop ( ) {
346
+ let node = next_hop_nodes. iter ( ) . find ( |node| node. node . get_our_node_id ( ) == pk) . unwrap ( ) ;
347
+ let peeled_msg = node. onion_messenger . peel_onion_message ( & msg) . unwrap ( ) ;
348
+ match peeled_msg {
349
+ PeeledOnion :: AsyncPayments ( AsyncPaymentsMessage :: OfferPathsRequest ( _) , _, _) => {
350
+ num_offer_paths_reqs += 1 ;
351
+ } ,
352
+ PeeledOnion :: Forward ( next_hop, msg) => {
353
+ let next_pk = match next_hop {
354
+ crate :: blinded_path:: message:: NextMessageHop :: NodeId ( pk) => pk,
355
+ _ => panic ! ( ) ,
356
+ } ;
357
+ pk_to_msg. push ( ( next_pk, msg) ) ;
358
+ } ,
359
+ _ => panic ! ( "Unexpected message" ) ,
360
+ }
361
+ }
362
+ assert ! ( num_offer_paths_reqs > 0 ) ;
363
+ }
364
+
333
365
fn advance_time_by ( duration : Duration , node : & Node ) {
334
366
let target_time = ( node. node . duration_since_epoch ( ) + duration) . as_secs ( ) as u32 ;
335
367
let block = create_dummy_block ( node. best_block_hash ( ) , target_time, Vec :: new ( ) ) ;
@@ -512,6 +544,7 @@ fn ignore_unexpected_static_invoice() {
512
544
let inv_server_paths =
513
545
nodes[ 1 ] . node . blinded_paths_for_async_recipient ( recipient_id. clone ( ) , None ) . unwrap ( ) ;
514
546
nodes[ 2 ] . node . set_paths_to_static_invoice_server ( inv_server_paths) . unwrap ( ) ;
547
+ expect_offer_paths_requests ( & nodes[ 2 ] , & [ & nodes[ 0 ] , & nodes[ 1 ] ] ) ;
515
548
516
549
// Initiate payment to the sender's intended offer.
517
550
let valid_static_invoice =
@@ -609,6 +642,7 @@ fn async_receive_flow_success() {
609
642
let inv_server_paths =
610
643
nodes[ 1 ] . node . blinded_paths_for_async_recipient ( recipient_id. clone ( ) , None ) . unwrap ( ) ;
611
644
nodes[ 2 ] . node . set_paths_to_static_invoice_server ( inv_server_paths) . unwrap ( ) ;
645
+ expect_offer_paths_requests ( & nodes[ 2 ] , & [ & nodes[ 0 ] , & nodes[ 1 ] ] ) ;
612
646
613
647
let invoice_flow_res =
614
648
pass_static_invoice_server_messages ( & nodes[ 1 ] , & nodes[ 2 ] , recipient_id. clone ( ) ) ;
@@ -671,6 +705,7 @@ fn expired_static_invoice_fail() {
671
705
let inv_server_paths =
672
706
nodes[ 1 ] . node . blinded_paths_for_async_recipient ( recipient_id. clone ( ) , None ) . unwrap ( ) ;
673
707
nodes[ 2 ] . node . set_paths_to_static_invoice_server ( inv_server_paths) . unwrap ( ) ;
708
+ expect_offer_paths_requests ( & nodes[ 2 ] , & [ & nodes[ 0 ] , & nodes[ 1 ] ] ) ;
674
709
675
710
let static_invoice =
676
711
pass_static_invoice_server_messages ( & nodes[ 1 ] , & nodes[ 2 ] , recipient_id. clone ( ) ) . invoice ;
@@ -746,6 +781,7 @@ fn timeout_unreleased_payment() {
746
781
let inv_server_paths =
747
782
server. node . blinded_paths_for_async_recipient ( recipient_id. clone ( ) , None ) . unwrap ( ) ;
748
783
recipient. node . set_paths_to_static_invoice_server ( inv_server_paths) . unwrap ( ) ;
784
+ expect_offer_paths_requests ( & nodes[ 2 ] , & [ & nodes[ 0 ] , & nodes[ 1 ] ] ) ;
749
785
750
786
let static_invoice =
751
787
pass_static_invoice_server_messages ( server, recipient, recipient_id. clone ( ) ) . invoice ;
@@ -831,6 +867,7 @@ fn async_receive_mpp() {
831
867
let inv_server_paths =
832
868
nodes[ 1 ] . node . blinded_paths_for_async_recipient ( recipient_id. clone ( ) , None ) . unwrap ( ) ;
833
869
nodes[ 3 ] . node . set_paths_to_static_invoice_server ( inv_server_paths) . unwrap ( ) ;
870
+ expect_offer_paths_requests ( & nodes[ 3 ] , & [ & nodes[ 0 ] , & nodes[ 1 ] , & nodes[ 2 ] ] ) ;
834
871
835
872
let static_invoice =
836
873
pass_static_invoice_server_messages ( & nodes[ 1 ] , & nodes[ 3 ] , recipient_id. clone ( ) ) . invoice ;
@@ -924,6 +961,7 @@ fn amount_doesnt_match_invreq() {
924
961
let inv_server_paths =
925
962
nodes[ 1 ] . node . blinded_paths_for_async_recipient ( recipient_id. clone ( ) , None ) . unwrap ( ) ;
926
963
nodes[ 3 ] . node . set_paths_to_static_invoice_server ( inv_server_paths) . unwrap ( ) ;
964
+ expect_offer_paths_requests ( & nodes[ 3 ] , & [ & nodes[ 0 ] , & nodes[ 1 ] , & nodes[ 2 ] ] ) ;
927
965
928
966
let static_invoice =
929
967
pass_static_invoice_server_messages ( & nodes[ 1 ] , & nodes[ 3 ] , recipient_id. clone ( ) ) . invoice ;
@@ -1124,6 +1162,7 @@ fn invalid_async_receive_with_retry<F1, F2>(
1124
1162
let inv_server_paths =
1125
1163
nodes[ 1 ] . node . blinded_paths_for_async_recipient ( recipient_id. clone ( ) , None ) . unwrap ( ) ;
1126
1164
nodes[ 2 ] . node . set_paths_to_static_invoice_server ( inv_server_paths) . unwrap ( ) ;
1165
+ expect_offer_paths_requests ( & nodes[ 2 ] , & [ & nodes[ 0 ] , & nodes[ 1 ] ] ) ;
1127
1166
1128
1167
// Set the random bytes so we can predict the offer nonce.
1129
1168
let hardcoded_random_bytes = [ 42 ; 32 ] ;
@@ -1251,6 +1290,7 @@ fn expired_static_invoice_message_path() {
1251
1290
let inv_server_paths =
1252
1291
nodes[ 1 ] . node . blinded_paths_for_async_recipient ( recipient_id. clone ( ) , None ) . unwrap ( ) ;
1253
1292
nodes[ 2 ] . node . set_paths_to_static_invoice_server ( inv_server_paths) . unwrap ( ) ;
1293
+ expect_offer_paths_requests ( & nodes[ 2 ] , & [ & nodes[ 0 ] , & nodes[ 1 ] ] ) ;
1254
1294
1255
1295
let static_invoice =
1256
1296
pass_static_invoice_server_messages ( & nodes[ 1 ] , & nodes[ 2 ] , recipient_id. clone ( ) ) . invoice ;
@@ -1315,6 +1355,7 @@ fn expired_static_invoice_payment_path() {
1315
1355
let inv_server_paths =
1316
1356
nodes[ 1 ] . node . blinded_paths_for_async_recipient ( recipient_id. clone ( ) , None ) . unwrap ( ) ;
1317
1357
nodes[ 2 ] . node . set_paths_to_static_invoice_server ( inv_server_paths) . unwrap ( ) ;
1358
+ expect_offer_paths_requests ( & nodes[ 2 ] , & [ & nodes[ 0 ] , & nodes[ 1 ] ] ) ;
1318
1359
1319
1360
// Make sure all nodes are at the same block height in preparation for CLTV timeout things.
1320
1361
let node_max_height =
@@ -1576,10 +1617,12 @@ fn limit_offer_paths_requests() {
1576
1617
let inv_server_paths =
1577
1618
server. node . blinded_paths_for_async_recipient ( recipient_id, None ) . unwrap ( ) ;
1578
1619
recipient. node . set_paths_to_static_invoice_server ( inv_server_paths) . unwrap ( ) ;
1620
+ expect_offer_paths_requests ( & nodes[ 1 ] , & [ & nodes[ 0 ] ] ) ;
1579
1621
1580
1622
// Up to TEST_MAX_UPDATE_ATTEMPTS offer_paths_requests are allowed to be sent out before the async
1581
1623
// recipient should give up.
1582
- for _ in 0 ..TEST_MAX_UPDATE_ATTEMPTS {
1624
+ // Subtract 1 because we sent the first request when invoice server paths were set above.
1625
+ for _ in 0 ..TEST_MAX_UPDATE_ATTEMPTS - 1 {
1583
1626
recipient. node . test_check_refresh_async_receive_offers ( ) ;
1584
1627
let offer_paths_req = recipient
1585
1628
. onion_messenger
@@ -1744,6 +1787,7 @@ fn refresh_static_invoices() {
1744
1787
let inv_server_paths =
1745
1788
server. node . blinded_paths_for_async_recipient ( recipient_id. clone ( ) , None ) . unwrap ( ) ;
1746
1789
recipient. node . set_paths_to_static_invoice_server ( inv_server_paths) . unwrap ( ) ;
1790
+ expect_offer_paths_requests ( & nodes[ 2 ] , & [ & nodes[ 0 ] , & nodes[ 1 ] ] ) ;
1747
1791
1748
1792
// Set up the recipient to have one offer and an invoice with the static invoice server.
1749
1793
let flow_res = pass_static_invoice_server_messages ( server, recipient, recipient_id. clone ( ) ) ;
@@ -2136,6 +2180,7 @@ fn invoice_server_is_not_channel_peer() {
2136
2180
let inv_server_paths =
2137
2181
invoice_server. node . blinded_paths_for_async_recipient ( recipient_id. clone ( ) , None ) . unwrap ( ) ;
2138
2182
recipient. node . set_paths_to_static_invoice_server ( inv_server_paths) . unwrap ( ) ;
2183
+ expect_offer_paths_requests ( & nodes[ 2 ] , & [ & nodes[ 0 ] , & nodes[ 1 ] , & nodes[ 3 ] ] ) ;
2139
2184
let invoice =
2140
2185
pass_static_invoice_server_messages ( invoice_server, recipient, recipient_id. clone ( ) )
2141
2186
. invoice ;
0 commit comments