Skip to content

Commit 07bf08b

Browse files
authored
Merge pull request #3903 from TheBlueMatt/2025-07-bpi
Allow setting an HRN in invoice_requests built by `pay_for_offer`
2 parents b002e43 + dbf40d3 commit 07bf08b

File tree

7 files changed

+251
-214
lines changed

7 files changed

+251
-214
lines changed

lightning-dns-resolver/src/lib.rs

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ mod test {
164164
};
165165
use lightning::blinded_path::NodeIdLookUp;
166166
use lightning::events::{Event, PaymentPurpose};
167-
use lightning::ln::channelmanager::{PaymentId, Retry};
167+
use lightning::ln::channelmanager::{OptionalOfferPaymentParams, PaymentId};
168168
use lightning::ln::functional_test_utils::*;
169169
use lightning::ln::msgs::{
170170
BaseMessageHandler, ChannelMessageHandler, Init, OnionMessageHandler,
@@ -175,7 +175,6 @@ mod test {
175175
use lightning::onion_message::messenger::{
176176
AOnionMessenger, Destination, MessageRouter, OnionMessagePath, OnionMessenger,
177177
};
178-
use lightning::routing::router::RouteParametersConfig;
179178
use lightning::sign::{KeysManager, NodeSigner, ReceiveAuthKey, Recipient};
180179
use lightning::types::features::InitFeatures;
181180
use lightning::types::payment::PaymentHash;
@@ -380,23 +379,18 @@ mod test {
380379
async fn pay_offer_flow<'a, 'b, 'c>(
381380
nodes: &[Node<'a, 'b, 'c>], resolver_messenger: &impl AOnionMessenger,
382381
resolver_id: PublicKey, payer_id: PublicKey, payee_id: PublicKey, offer: Offer,
383-
name: HumanReadableName, amt: u64, payment_id: PaymentId, payer_note: Option<String>,
384-
retry: Retry, params: RouteParametersConfig, resolvers: Vec<Destination>,
382+
name: HumanReadableName, payment_id: PaymentId, payer_note: Option<String>,
383+
resolvers: Vec<Destination>,
385384
) {
386385
// Override contents to offer provided
387386
let proof_override = &nodes[0].node.testing_dnssec_proof_offer_resolution_override;
388387
proof_override.lock().unwrap().insert(name.clone(), offer);
388+
let amt = 42_000;
389+
let mut opts = OptionalOfferPaymentParams::default();
390+
opts.payer_note = payer_note.clone();
389391
nodes[0]
390392
.node
391-
.pay_for_offer_from_human_readable_name(
392-
name,
393-
amt,
394-
payment_id,
395-
payer_note.clone(),
396-
retry,
397-
params,
398-
resolvers,
399-
)
393+
.pay_for_offer_from_human_readable_name(name, amt, payment_id, opts, resolvers)
400394
.unwrap();
401395

402396
let query = nodes[0].onion_messenger.next_onion_message_for_peer(resolver_id).unwrap();
@@ -493,9 +487,6 @@ mod test {
493487

494488
let bs_offer = nodes[1].node.create_offer_builder().unwrap().build().unwrap();
495489
let resolvers = vec![Destination::Node(resolver_id)];
496-
let retry = Retry::Attempts(0);
497-
let amt = 42_000;
498-
let params = RouteParametersConfig::default();
499490

500491
pay_offer_flow(
501492
&nodes,
@@ -505,11 +496,8 @@ mod test {
505496
payee_id,
506497
bs_offer.clone(),
507498
name.clone(),
508-
amt,
509499
PaymentId([42; 32]),
510500
None,
511-
retry,
512-
params,
513501
resolvers.clone(),
514502
)
515503
.await;
@@ -523,11 +511,8 @@ mod test {
523511
payee_id,
524512
bs_offer,
525513
name,
526-
amt,
527514
PaymentId([21; 32]),
528515
Some("foo".into()),
529-
retry,
530-
params,
531516
resolvers,
532517
)
533518
.await;

lightning/src/ln/async_payments_tests.rs

Lines changed: 21 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ use crate::events::{
1515
Event, HTLCHandlingFailureType, PaidBolt12Invoice, PaymentFailureReason, PaymentPurpose,
1616
};
1717
use crate::ln::blinded_payment_tests::{fail_blinded_htlc_backwards, get_blinded_route_parameters};
18-
use crate::ln::channelmanager::{Bolt12PaymentError, PaymentId, RecipientOnionFields};
18+
use crate::ln::channelmanager::{
19+
Bolt12PaymentError, OptionalOfferPaymentParams, PaymentId, RecipientOnionFields,
20+
};
1921
use crate::ln::functional_test_utils::*;
2022
use crate::ln::inbound_payment;
2123
use crate::ln::msgs;
@@ -49,7 +51,7 @@ use crate::onion_message::messenger::{
4951
use crate::onion_message::offers::OffersMessage;
5052
use crate::onion_message::packet::ParsedOnionMessageContents;
5153
use crate::prelude::*;
52-
use crate::routing::router::{Payee, PaymentParameters, RouteParametersConfig};
54+
use crate::routing::router::{Payee, PaymentParameters};
5355
use crate::sign::NodeSigner;
5456
use crate::sync::Mutex;
5557
use crate::types::features::Bolt12InvoiceFeatures;
@@ -501,11 +503,7 @@ fn static_invoice_unknown_required_features() {
501503
// unknown required features.
502504
let amt_msat = 5000;
503505
let payment_id = PaymentId([1; 32]);
504-
let params = RouteParametersConfig::default();
505-
nodes[0]
506-
.node
507-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(0), params)
508-
.unwrap();
506+
nodes[0].node.pay_for_offer(&offer, Some(amt_msat), payment_id, Default::default()).unwrap();
509507

510508
// Don't forward the invreq since the invoice was created outside of the normal flow, instead
511509
// manually construct the response.
@@ -577,11 +575,7 @@ fn ignore_unexpected_static_invoice() {
577575

578576
let amt_msat = 5000;
579577
let payment_id = PaymentId([1; 32]);
580-
let params = RouteParametersConfig::default();
581-
nodes[0]
582-
.node
583-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(0), params)
584-
.unwrap();
578+
nodes[0].node.pay_for_offer(&offer, Some(amt_msat), payment_id, Default::default()).unwrap();
585579

586580
let invreq_om = nodes[0]
587581
.onion_messenger
@@ -710,11 +704,7 @@ fn ignore_duplicate_invoice() {
710704
let offer = async_recipient.node.get_async_receive_offer().unwrap();
711705
let amt_msat = 5000;
712706
let payment_id = PaymentId([1; 32]);
713-
let params = RouteParametersConfig::default();
714-
sender
715-
.node
716-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(0), params)
717-
.unwrap();
707+
sender.node.pay_for_offer(&offer, Some(amt_msat), payment_id, Default::default()).unwrap();
718708

719709
let sender_node_id = sender.node.get_our_node_id();
720710
let always_online_node_id = always_online_node.node.get_our_node_id();
@@ -812,10 +802,7 @@ fn ignore_duplicate_invoice() {
812802

813803
// Now handle case where the sender pays regular invoice and ignores static invoice.
814804
let payment_id = PaymentId([2; 32]);
815-
sender
816-
.node
817-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(0), params)
818-
.unwrap();
805+
sender.node.pay_for_offer(&offer, Some(amt_msat), payment_id, Default::default()).unwrap();
819806

820807
let invreq_om =
821808
sender.onion_messenger.next_onion_message_for_peer(always_online_node_id).unwrap();
@@ -921,11 +908,7 @@ fn async_receive_flow_success() {
921908
let offer = nodes[2].node.get_async_receive_offer().unwrap();
922909
let amt_msat = 5000;
923910
let payment_id = PaymentId([1; 32]);
924-
let params = RouteParametersConfig::default();
925-
nodes[0]
926-
.node
927-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(0), params)
928-
.unwrap();
911+
nodes[0].node.pay_for_offer(&offer, Some(amt_msat), payment_id, Default::default()).unwrap();
929912
let release_held_htlc_om = pass_async_payments_oms(
930913
static_invoice.clone(),
931914
&nodes[0],
@@ -985,11 +968,7 @@ fn expired_static_invoice_fail() {
985968

986969
let amt_msat = 5000;
987970
let payment_id = PaymentId([1; 32]);
988-
let params = RouteParametersConfig::default();
989-
nodes[0]
990-
.node
991-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(0), params)
992-
.unwrap();
971+
nodes[0].node.pay_for_offer(&offer, Some(amt_msat), payment_id, Default::default()).unwrap();
993972

994973
let invreq_om = nodes[0]
995974
.onion_messenger
@@ -1072,11 +1051,7 @@ fn timeout_unreleased_payment() {
10721051

10731052
let amt_msat = 5000;
10741053
let payment_id = PaymentId([1; 32]);
1075-
let params = RouteParametersConfig::default();
1076-
sender
1077-
.node
1078-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(0), params)
1079-
.unwrap();
1054+
sender.node.pay_for_offer(&offer, Some(amt_msat), payment_id, Default::default()).unwrap();
10801055

10811056
let invreq_om =
10821057
sender.onion_messenger.next_onion_message_for_peer(server.node.get_our_node_id()).unwrap();
@@ -1169,11 +1144,7 @@ fn async_receive_mpp() {
11691144

11701145
let amt_msat = 15_000_000;
11711146
let payment_id = PaymentId([1; 32]);
1172-
let params = RouteParametersConfig::default();
1173-
nodes[0]
1174-
.node
1175-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(1), params)
1176-
.unwrap();
1147+
nodes[0].node.pay_for_offer(&offer, Some(amt_msat), payment_id, Default::default()).unwrap();
11771148
let release_held_htlc_om_3_0 = pass_async_payments_oms(
11781149
static_invoice,
11791150
&nodes[0],
@@ -1271,11 +1242,7 @@ fn amount_doesnt_match_invreq() {
12711242

12721243
let amt_msat = 5000;
12731244
let payment_id = PaymentId([1; 32]);
1274-
let params = RouteParametersConfig::default();
1275-
nodes[0]
1276-
.node
1277-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(1), params)
1278-
.unwrap();
1245+
nodes[0].node.pay_for_offer(&offer, Some(amt_msat), payment_id, Default::default()).unwrap();
12791246
let release_held_htlc_om_3_0 = pass_async_payments_oms(
12801247
static_invoice,
12811248
&nodes[0],
@@ -1518,11 +1485,7 @@ fn invalid_async_receive_with_retry<F1, F2>(
15181485
let static_invoice = invoice_flow_res.invoice;
15191486
let offer = nodes[2].node.get_async_receive_offer().unwrap();
15201487

1521-
let params = RouteParametersConfig::default();
1522-
nodes[0]
1523-
.node
1524-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(2), params)
1525-
.unwrap();
1488+
nodes[0].node.pay_for_offer(&offer, Some(amt_msat), payment_id, Default::default()).unwrap();
15261489
let release_held_htlc_om_2_0 = pass_async_payments_oms(
15271490
static_invoice,
15281491
&nodes[0],
@@ -1616,11 +1579,7 @@ fn expired_static_invoice_message_path() {
16161579

16171580
let amt_msat = 5000;
16181581
let payment_id = PaymentId([1; 32]);
1619-
let params = RouteParametersConfig::default();
1620-
nodes[0]
1621-
.node
1622-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(1), params)
1623-
.unwrap();
1582+
nodes[0].node.pay_for_offer(&offer, Some(amt_msat), payment_id, Default::default()).unwrap();
16241583

16251584
// While the invoice is unexpired, respond with release_held_htlc.
16261585
let (held_htlc_available_om, _release_held_htlc_om) = pass_async_payments_oms(
@@ -1733,11 +1692,9 @@ fn expired_static_invoice_payment_path() {
17331692

17341693
let amt_msat = 5000;
17351694
let payment_id = PaymentId([1; 32]);
1736-
let params = RouteParametersConfig::default();
1737-
nodes[0]
1738-
.node
1739-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(0), params)
1740-
.unwrap();
1695+
let mut params: OptionalOfferPaymentParams = Default::default();
1696+
params.retry_strategy = Retry::Attempts(0);
1697+
nodes[0].node.pay_for_offer(&offer, Some(amt_msat), payment_id, params).unwrap();
17411698
let release_held_htlc_om = pass_async_payments_oms(
17421699
static_invoice,
17431700
&nodes[0],
@@ -2181,11 +2138,7 @@ fn refresh_static_invoices_for_used_offers() {
21812138
let offer = recipient.node.get_async_receive_offer().unwrap();
21822139
let amt_msat = 5000;
21832140
let payment_id = PaymentId([1; 32]);
2184-
let params = RouteParametersConfig::default();
2185-
sender
2186-
.node
2187-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(0), params)
2188-
.unwrap();
2141+
sender.node.pay_for_offer(&offer, Some(amt_msat), payment_id, Default::default()).unwrap();
21892142

21902143
let release_held_htlc_om = pass_async_payments_oms(
21912144
updated_invoice.clone(),
@@ -2517,11 +2470,7 @@ fn invoice_server_is_not_channel_peer() {
25172470
let offer = recipient.node.get_async_receive_offer().unwrap();
25182471
let amt_msat = 5000;
25192472
let payment_id = PaymentId([1; 32]);
2520-
let params = RouteParametersConfig::default();
2521-
sender
2522-
.node
2523-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(0), params)
2524-
.unwrap();
2473+
sender.node.pay_for_offer(&offer, Some(amt_msat), payment_id, Default::default()).unwrap();
25252474

25262475
// Do the held_htlc_available --> release_held_htlc dance.
25272476
let release_held_htlc_om = pass_async_payments_oms(
@@ -2583,11 +2532,7 @@ fn invoice_request_forwarded_to_async_recipient() {
25832532
let offer = async_recipient.node.get_async_receive_offer().unwrap();
25842533
let amt_msat = 5000;
25852534
let payment_id = PaymentId([1; 32]);
2586-
let params = RouteParametersConfig::default();
2587-
sender
2588-
.node
2589-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(0), params)
2590-
.unwrap();
2535+
sender.node.pay_for_offer(&offer, Some(amt_msat), payment_id, Default::default()).unwrap();
25912536

25922537
let sender_node_id = sender.node.get_our_node_id();
25932538

0 commit comments

Comments
 (0)