Skip to content

Commit 5981c17

Browse files
committed
Introduce payment dummy hops in DefaultRouter
1 parent 6abf36e commit 5981c17

File tree

4 files changed

+89
-37
lines changed

4 files changed

+89
-37
lines changed

lightning-dns-resolver/src/lib.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ mod test {
175175
use lightning::onion_message::messenger::{
176176
AOnionMessenger, Destination, MessageRouter, OnionMessagePath, OnionMessenger,
177177
};
178+
use lightning::routing::router::DEFAULT_PAYMENT_DUMMY_HOPS;
178179
use lightning::sign::{KeysManager, NodeSigner, ReceiveAuthKey, Recipient};
179180
use lightning::types::features::InitFeatures;
180181
use lightning::types::payment::PaymentHash;
@@ -419,6 +420,12 @@ mod test {
419420
let updates = get_htlc_update_msgs(&nodes[0], &payee_id);
420421
nodes[1].node.handle_update_add_htlc(payer_id, &updates.update_add_htlcs[0]);
421422
do_commitment_signed_dance(&nodes[1], &nodes[0], &updates.commitment_signed, false, false);
423+
424+
for _ in 0..DEFAULT_PAYMENT_DUMMY_HOPS {
425+
assert!(nodes[1].node.needs_pending_htlc_processing());
426+
nodes[1].node.process_pending_htlc_forwards();
427+
}
428+
422429
expect_and_process_pending_htlcs(&nodes[1], false);
423430

424431
let claimable_events = nodes[1].node.get_and_clear_pending_events();

lightning/src/ln/async_payments_tests.rs

Lines changed: 45 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
use crate::blinded_path::message::{
1111
BlindedMessagePath, MessageContext, NextMessageHop, OffersContext,
1212
};
13-
use crate::blinded_path::payment::PaymentContext;
1413
use crate::blinded_path::payment::{AsyncBolt12OfferContext, BlindedPaymentTlvs};
14+
use crate::blinded_path::payment::{DummyTlvs, PaymentContext};
1515
use crate::chain::channelmonitor::{HTLC_FAIL_BACK_BUFFER, LATENCY_GRACE_PERIOD_BLOCKS};
1616
use crate::events::{
1717
Event, EventsProvider, HTLCHandlingFailureReason, HTLCHandlingFailureType, PaidBolt12Invoice,
@@ -55,7 +55,7 @@ use crate::onion_message::messenger::{
5555
use crate::onion_message::offers::OffersMessage;
5656
use crate::onion_message::packet::ParsedOnionMessageContents;
5757
use crate::prelude::*;
58-
use crate::routing::router::{Payee, PaymentParameters};
58+
use crate::routing::router::{Payee, PaymentParameters, DEFAULT_PAYMENT_DUMMY_HOPS};
5959
use crate::sign::NodeSigner;
6060
use crate::sync::Mutex;
6161
use crate::types::features::Bolt12InvoiceFeatures;
@@ -984,7 +984,8 @@ fn ignore_duplicate_invoice() {
984984
check_added_monitors!(sender, 1);
985985

986986
let route: &[&[&Node]] = &[&[always_online_node, async_recipient]];
987-
let args = PassAlongPathArgs::new(sender, route[0], amt_msat, payment_hash, ev);
987+
let args = PassAlongPathArgs::new(sender, route[0], amt_msat, payment_hash, ev)
988+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
988989
let claimable_ev = do_pass_along_path(args).unwrap();
989990
let keysend_preimage = extract_payment_preimage(&claimable_ev);
990991
let (res, _) =
@@ -1063,7 +1064,8 @@ fn ignore_duplicate_invoice() {
10631064
check_added_monitors!(sender, 1);
10641065

10651066
let args = PassAlongPathArgs::new(sender, route[0], amt_msat, payment_hash, ev)
1066-
.without_clearing_recipient_events();
1067+
.without_clearing_recipient_events()
1068+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
10671069
do_pass_along_path(args);
10681070

10691071
let payment_preimage = match get_event!(async_recipient, Event::PaymentClaimable) {
@@ -1138,7 +1140,8 @@ fn async_receive_flow_success() {
11381140
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
11391141

11401142
let route: &[&[&Node]] = &[&[&nodes[1], &nodes[2]]];
1141-
let args = PassAlongPathArgs::new(&nodes[0], route[0], amt_msat, payment_hash, ev);
1143+
let args = PassAlongPathArgs::new(&nodes[0], route[0], amt_msat, payment_hash, ev)
1144+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
11421145
let claimable_ev = do_pass_along_path(args).unwrap();
11431146
let keysend_preimage = extract_payment_preimage(&claimable_ev);
11441147
let (res, _) =
@@ -1375,11 +1378,13 @@ fn async_receive_mpp() {
13751378
};
13761379

13771380
let args = PassAlongPathArgs::new(&nodes[0], expected_route[0], amt_msat, payment_hash, ev)
1378-
.without_claimable_event();
1381+
.without_claimable_event()
1382+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
13791383
do_pass_along_path(args);
13801384

13811385
let ev = remove_first_msg_event_to_node(&nodes[2].node.get_our_node_id(), &mut events);
1382-
let args = PassAlongPathArgs::new(&nodes[0], expected_route[1], amt_msat, payment_hash, ev);
1386+
let args = PassAlongPathArgs::new(&nodes[0], expected_route[1], amt_msat, payment_hash, ev)
1387+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
13831388
let claimable_ev = do_pass_along_path(args).unwrap();
13841389
let keysend_preimage = match claimable_ev {
13851390
Event::PaymentClaimable {
@@ -1497,7 +1502,8 @@ fn amount_doesnt_match_invreq() {
14971502
let route: &[&[&Node]] = &[&[&nodes[1], &nodes[3]]];
14981503
let args = PassAlongPathArgs::new(&nodes[0], route[0], amt_msat, payment_hash, ev)
14991504
.without_claimable_event()
1500-
.expect_failure(HTLCHandlingFailureType::Receive { payment_hash });
1505+
.expect_failure(HTLCHandlingFailureType::Receive { payment_hash })
1506+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
15011507
do_pass_along_path(args);
15021508

15031509
// Modify the invoice request stored in our outbounds to be the correct one, to make sure the
@@ -1521,7 +1527,8 @@ fn amount_doesnt_match_invreq() {
15211527
ev, MessageSendEvent::UpdateHTLCs { ref updates, .. } if updates.update_add_htlcs.len() == 1));
15221528
check_added_monitors!(nodes[0], 1);
15231529
let route: &[&[&Node]] = &[&[&nodes[2], &nodes[3]]];
1524-
let args = PassAlongPathArgs::new(&nodes[0], route[0], amt_msat, payment_hash, ev);
1530+
let args = PassAlongPathArgs::new(&nodes[0], route[0], amt_msat, payment_hash, ev)
1531+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
15251532
let claimable_ev = do_pass_along_path(args).unwrap();
15261533
let keysend_preimage = extract_payment_preimage(&claimable_ev);
15271534
claim_payment_along_route(ClaimAlongRouteArgs::new(&nodes[0], route, keysend_preimage));
@@ -1712,7 +1719,8 @@ fn invalid_async_receive_with_retry<F1, F2>(
17121719
let payment_hash = extract_payment_hash(&ev);
17131720

17141721
let route: &[&[&Node]] = &[&[&nodes[1], &nodes[2]]];
1715-
let args = PassAlongPathArgs::new(&nodes[0], route[0], amt_msat, payment_hash, ev);
1722+
let args = PassAlongPathArgs::new(&nodes[0], route[0], amt_msat, payment_hash, ev)
1723+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
17161724
do_pass_along_path(args);
17171725

17181726
// Fail the HTLC backwards to enable us to more easily modify the now-Retryable outbound to test
@@ -1739,7 +1747,8 @@ fn invalid_async_receive_with_retry<F1, F2>(
17391747
let route: &[&[&Node]] = &[&[&nodes[1], &nodes[2]]];
17401748
let args = PassAlongPathArgs::new(&nodes[0], route[0], amt_msat, payment_hash, ev)
17411749
.without_claimable_event()
1742-
.expect_failure(HTLCHandlingFailureType::Receive { payment_hash });
1750+
.expect_failure(HTLCHandlingFailureType::Receive { payment_hash })
1751+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
17431752
do_pass_along_path(args);
17441753
fail_blinded_htlc_backwards(payment_hash, 1, &[&nodes[0], &nodes[1], &nodes[2]], true);
17451754

@@ -1751,7 +1760,8 @@ fn invalid_async_receive_with_retry<F1, F2>(
17511760
let mut ev = remove_first_msg_event_to_node(&nodes[1].node.get_our_node_id(), &mut events);
17521761
check_added_monitors!(nodes[0], 1);
17531762
let route: &[&[&Node]] = &[&[&nodes[1], &nodes[2]]];
1754-
let args = PassAlongPathArgs::new(&nodes[0], route[0], amt_msat, payment_hash, ev);
1763+
let args = PassAlongPathArgs::new(&nodes[0], route[0], amt_msat, payment_hash, ev)
1764+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
17551765
let claimable_ev = do_pass_along_path(args).unwrap();
17561766
let keysend_preimage = extract_payment_preimage(&claimable_ev);
17571767
claim_payment_along_route(ClaimAlongRouteArgs::new(&nodes[0], route, keysend_preimage));
@@ -1858,6 +1868,13 @@ fn expired_static_invoice_payment_path() {
18581868
blinded_path
18591869
.advance_path_by_one(&nodes[1].keys_manager, &nodes[1].node, &secp_ctx)
18601870
.unwrap();
1871+
1872+
for _ in 0..DEFAULT_PAYMENT_DUMMY_HOPS {
1873+
blinded_path
1874+
.advance_path_by_one(&nodes[2].keys_manager, &nodes[2].node, &secp_ctx)
1875+
.unwrap();
1876+
}
1877+
18611878
match blinded_path.decrypt_intro_payload(&nodes[2].keys_manager).unwrap().0 {
18621879
BlindedPaymentTlvs::Receive(tlvs) => tlvs.payment_constraints.max_cltv_expiry,
18631880
_ => panic!(),
@@ -1920,7 +1937,8 @@ fn expired_static_invoice_payment_path() {
19201937
let route: &[&[&Node]] = &[&[&nodes[1], &nodes[2]]];
19211938
let args = PassAlongPathArgs::new(&nodes[0], route[0], amt_msat, payment_hash, ev)
19221939
.without_claimable_event()
1923-
.expect_failure(HTLCHandlingFailureType::Receive { payment_hash });
1940+
.expect_failure(HTLCHandlingFailureType::Receive { payment_hash })
1941+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
19241942
do_pass_along_path(args);
19251943
fail_blinded_htlc_backwards(payment_hash, 1, &[&nodes[0], &nodes[1], &nodes[2]], false);
19261944
nodes[2].logger.assert_log_contains(
@@ -2363,7 +2381,8 @@ fn refresh_static_invoices_for_used_offers() {
23632381
check_added_monitors!(sender, 1);
23642382

23652383
let route: &[&[&Node]] = &[&[server, recipient]];
2366-
let args = PassAlongPathArgs::new(sender, route[0], amt_msat, payment_hash, ev);
2384+
let args = PassAlongPathArgs::new(sender, route[0], amt_msat, payment_hash, ev)
2385+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
23672386
let claimable_ev = do_pass_along_path(args).unwrap();
23682387
let keysend_preimage = extract_payment_preimage(&claimable_ev);
23692388
let res = claim_payment_along_route(ClaimAlongRouteArgs::new(sender, route, keysend_preimage));
@@ -2697,7 +2716,8 @@ fn invoice_server_is_not_channel_peer() {
26972716
check_added_monitors!(sender, 1);
26982717

26992718
let route: &[&[&Node]] = &[&[forwarding_node, recipient]];
2700-
let args = PassAlongPathArgs::new(sender, route[0], amt_msat, payment_hash, ev);
2719+
let args = PassAlongPathArgs::new(sender, route[0], amt_msat, payment_hash, ev)
2720+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
27012721
let claimable_ev = do_pass_along_path(args).unwrap();
27022722
let keysend_preimage = extract_payment_preimage(&claimable_ev);
27032723
let res = claim_payment_along_route(ClaimAlongRouteArgs::new(sender, route, keysend_preimage));
@@ -2936,7 +2956,8 @@ fn async_payment_e2e() {
29362956
check_added_monitors!(sender_lsp, 1);
29372957

29382958
let path: &[&Node] = &[invoice_server, recipient];
2939-
let args = PassAlongPathArgs::new(sender_lsp, path, amt_msat, payment_hash, ev);
2959+
let args = PassAlongPathArgs::new(sender_lsp, path, amt_msat, payment_hash, ev)
2960+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
29402961
let claimable_ev = do_pass_along_path(args).unwrap();
29412962

29422963
let route: &[&[&Node]] = &[&[sender_lsp, invoice_server, recipient]];
@@ -3173,7 +3194,8 @@ fn intercepted_hold_htlc() {
31733194
check_added_monitors!(lsp, 1);
31743195

31753196
let path: &[&Node] = &[recipient];
3176-
let args = PassAlongPathArgs::new(lsp, path, amt_msat, payment_hash, ev);
3197+
let args = PassAlongPathArgs::new(lsp, path, amt_msat, payment_hash, ev)
3198+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
31773199
let claimable_ev = do_pass_along_path(args).unwrap();
31783200

31793201
let route: &[&[&Node]] = &[&[lsp, recipient]];
@@ -3276,15 +3298,17 @@ fn async_payment_mpp() {
32763298
assert_eq!(events.len(), 1);
32773299
let ev = remove_first_msg_event_to_node(&recipient.node.get_our_node_id(), &mut events);
32783300
let args = PassAlongPathArgs::new(lsp_a, expected_path, amt_msat, payment_hash, ev)
3279-
.without_claimable_event();
3301+
.without_claimable_event()
3302+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
32803303
do_pass_along_path(args);
32813304

32823305
lsp_b.node.process_pending_htlc_forwards();
32833306
check_added_monitors!(lsp_b, 1);
32843307
let mut events = lsp_b.node.get_and_clear_pending_msg_events();
32853308
assert_eq!(events.len(), 1);
32863309
let ev = remove_first_msg_event_to_node(&recipient.node.get_our_node_id(), &mut events);
3287-
let args = PassAlongPathArgs::new(lsp_b, expected_path, amt_msat, payment_hash, ev);
3310+
let args = PassAlongPathArgs::new(lsp_b, expected_path, amt_msat, payment_hash, ev)
3311+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
32883312
let claimable_ev = do_pass_along_path(args).unwrap();
32893313

32903314
let keysend_preimage = match claimable_ev {
@@ -3420,7 +3444,8 @@ fn release_htlc_races_htlc_onion_decode() {
34203444
check_added_monitors!(sender_lsp, 1);
34213445

34223446
let path: &[&Node] = &[invoice_server, recipient];
3423-
let args = PassAlongPathArgs::new(sender_lsp, path, amt_msat, payment_hash, ev);
3447+
let args = PassAlongPathArgs::new(sender_lsp, path, amt_msat, payment_hash, ev)
3448+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
34243449
let claimable_ev = do_pass_along_path(args).unwrap();
34253450

34263451
let route: &[&[&Node]] = &[&[sender_lsp, invoice_server, recipient]];

lightning/src/ln/offers_tests.rs

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ use bitcoin::secp256k1::{PublicKey, Secp256k1};
4747
use core::time::Duration;
4848
use crate::blinded_path::IntroductionNode;
4949
use crate::blinded_path::message::BlindedMessagePath;
50-
use crate::blinded_path::payment::{Bolt12OfferContext, Bolt12RefundContext, PaymentContext};
50+
use crate::blinded_path::payment::{Bolt12OfferContext, Bolt12RefundContext, DummyTlvs, PaymentContext};
5151
use crate::blinded_path::message::OffersContext;
5252
use crate::events::{ClosureReason, Event, HTLCHandlingFailureType, PaidBolt12Invoice, PaymentFailureReason, PaymentPurpose};
5353
use crate::ln::channelmanager::{Bolt12PaymentError, PaymentId, RecentPaymentDetails, RecipientOnionFields, Retry, self};
@@ -63,7 +63,7 @@ use crate::offers::parse::Bolt12SemanticError;
6363
use crate::onion_message::messenger::{DefaultMessageRouter, Destination, MessageSendInstructions, NodeIdMessageRouter, NullMessageRouter, PeeledOnion, PADDED_PATH_LENGTH};
6464
use crate::onion_message::offers::OffersMessage;
6565
use crate::routing::gossip::{NodeAlias, NodeId};
66-
use crate::routing::router::{PaymentParameters, RouteParameters, RouteParametersConfig};
66+
use crate::routing::router::{DEFAULT_PAYMENT_DUMMY_HOPS, PaymentParameters, RouteParameters, RouteParametersConfig};
6767
use crate::sign::{NodeSigner, Recipient};
6868
use crate::util::ser::Writeable;
6969

@@ -178,7 +178,8 @@ fn route_bolt12_payment<'a, 'b, 'c>(
178178
let amount_msats = invoice.amount_msats();
179179
let payment_hash = invoice.payment_hash();
180180
let args = PassAlongPathArgs::new(node, path, amount_msats, payment_hash, ev)
181-
.without_clearing_recipient_events();
181+
.without_clearing_recipient_events()
182+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
182183
do_pass_along_path(args);
183184
}
184185

@@ -1432,7 +1433,20 @@ fn creates_offer_with_blinded_path_using_unannounced_introduction_node() {
14321433
route_bolt12_payment(bob, &[alice], &invoice);
14331434
expect_recent_payment!(bob, RecentPaymentDetails::Pending, payment_id);
14341435

1435-
claim_bolt12_payment(bob, &[alice], payment_context, &invoice);
1436+
// When the payer is the introduction node of a blinded path, LDK doesn't
1437+
// subtract the forward fee for the `payer -> next_hop` channel (see
1438+
// `BlindedPaymentPath::advance_path_by_one`). This keeps fee logic simple,
1439+
// at the cost of a small, intentional overpayment.
1440+
//
1441+
// In the old two-hop case (payer as introduction node → payee), this never
1442+
// surfaced because the payer simply wasn’t charged the forward fee.
1443+
//
1444+
// With dummy hops in LDK v0.3, even a real two-node path can appear as a
1445+
// longer blinded route, so the overpayment shows up in tests.
1446+
//
1447+
// Until the fee-handling trade-off is revisited, we pass an expected extra
1448+
// fee here so tests can compensate for it.
1449+
claim_bolt12_payment_with_extra_fees(bob, &[alice], payment_context, &invoice, Some(1000));
14361450
expect_recent_payment!(bob, RecentPaymentDetails::Fulfilled, payment_id);
14371451
}
14381452

@@ -2444,12 +2458,13 @@ fn rejects_keysend_to_non_static_invoice_path() {
24442458

24452459
let args = PassAlongPathArgs::new(&nodes[0], route[0], amt_msat, payment_hash, ev)
24462460
.with_payment_preimage(payment_preimage)
2447-
.expect_failure(HTLCHandlingFailureType::Receive { payment_hash });
2461+
.expect_failure(HTLCHandlingFailureType::Receive { payment_hash })
2462+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
24482463
do_pass_along_path(args);
24492464
let mut updates = get_htlc_update_msgs(&nodes[1], &nodes[0].node.get_our_node_id());
2450-
nodes[0].node.handle_update_fail_htlc(nodes[1].node.get_our_node_id(), &updates.update_fail_htlcs[0]);
2465+
nodes[0].node.handle_update_fail_malformed_htlc(nodes[1].node.get_our_node_id(), &updates.update_fail_malformed_htlcs[0]);
24512466
do_commitment_signed_dance(&nodes[0], &nodes[1], &updates.commitment_signed, false, false);
2452-
expect_payment_failed_conditions(&nodes[0], payment_hash, true, PaymentFailedConditions::new());
2467+
expect_payment_failed_conditions(&nodes[0], payment_hash, false, PaymentFailedConditions::new());
24532468
}
24542469

24552470
#[test]
@@ -2508,12 +2523,14 @@ fn no_double_pay_with_stale_channelmanager() {
25082523

25092524
let ev = remove_first_msg_event_to_node(&bob_id, &mut events);
25102525
let args = PassAlongPathArgs::new(&nodes[0], expected_route[0], amt_msat, payment_hash, ev)
2511-
.without_clearing_recipient_events();
2526+
.without_clearing_recipient_events()
2527+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
25122528
do_pass_along_path(args);
25132529

25142530
let ev = remove_first_msg_event_to_node(&bob_id, &mut events);
25152531
let args = PassAlongPathArgs::new(&nodes[0], expected_route[0], amt_msat, payment_hash, ev)
2516-
.without_clearing_recipient_events();
2532+
.without_clearing_recipient_events()
2533+
.with_dummy_tlvs(&[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS]);
25172534
do_pass_along_path(args);
25182535

25192536
expect_recent_payment!(nodes[0], RecentPaymentDetails::Pending, payment_id);

lightning/src/routing/router.rs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ use bitcoin::secp256k1::{self, PublicKey, Secp256k1};
1313
use lightning_invoice::Bolt11Invoice;
1414

1515
use crate::blinded_path::payment::{
16-
BlindedPaymentPath, ForwardTlvs, PaymentConstraints, PaymentForwardNode, PaymentRelay,
17-
ReceiveTlvs,
16+
BlindedPaymentPath, DummyTlvs, ForwardTlvs, PaymentConstraints, PaymentForwardNode,
17+
PaymentRelay, ReceiveTlvs,
1818
};
1919
use crate::blinded_path::{BlindedHop, Direction, IntroductionNode};
2020
use crate::crypto::chacha20::ChaCha20;
@@ -74,6 +74,9 @@ pub struct DefaultRouter<
7474
score_params: SP,
7575
}
7676

77+
/// The number of dummy hops included in [`BlindedPaymentPath`]s created by [`DefaultRouter`].
78+
pub const DEFAULT_PAYMENT_DUMMY_HOPS: usize = 3;
79+
7780
impl<
7881
G: Deref<Target = NetworkGraph<L>>,
7982
L: Deref,
@@ -198,9 +201,9 @@ where
198201
})
199202
})
200203
.map(|forward_node| {
201-
BlindedPaymentPath::new(
202-
&[forward_node], recipient, local_node_receive_key, tlvs.clone(), u64::MAX, MIN_FINAL_CLTV_EXPIRY_DELTA,
203-
&*self.entropy_source, secp_ctx
204+
BlindedPaymentPath::new_with_dummy_hops(
205+
&[forward_node], recipient, &[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS],
206+
local_node_receive_key, tlvs.clone(), u64::MAX, MIN_FINAL_CLTV_EXPIRY_DELTA, &*self.entropy_source, secp_ctx
204207
)
205208
})
206209
.take(MAX_PAYMENT_PATHS)
@@ -210,9 +213,9 @@ where
210213
Ok(paths) if !paths.is_empty() => Ok(paths),
211214
_ => {
212215
if network_graph.nodes().contains_key(&NodeId::from_pubkey(&recipient)) {
213-
BlindedPaymentPath::new(
214-
&[], recipient, local_node_receive_key, tlvs, u64::MAX, MIN_FINAL_CLTV_EXPIRY_DELTA, &*self.entropy_source,
215-
secp_ctx
216+
BlindedPaymentPath::new_with_dummy_hops(
217+
&[], recipient, &[DummyTlvs::default(); DEFAULT_PAYMENT_DUMMY_HOPS],
218+
local_node_receive_key, tlvs, u64::MAX, MIN_FINAL_CLTV_EXPIRY_DELTA, &*self.entropy_source, secp_ctx
216219
).map(|path| vec![path])
217220
} else {
218221
Err(())

0 commit comments

Comments
 (0)