Skip to content

Commit 3d3ff1d

Browse files
committed
Allow setting an HRN in invoice_requests built by pay_for_offer
If a user did their own BIP 353 lookup to fetch an offer from a human readable name, we still want them to be able to use `ChannelManager::pay_for_offer`. Because BIP 353 offer payments require that the `invoice_request` include the human readable name, we need to add an argument to set the `invoice_request` HRN to `pay_for_offer`, which we do here.
1 parent 2689ced commit 3d3ff1d

File tree

3 files changed

+28
-25
lines changed

3 files changed

+28
-25
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2312,7 +2312,7 @@ where
23122312
/// # let channel_manager = channel_manager.get_cm();
23132313
/// let payment_id = PaymentId([42; 32]);
23142314
/// match channel_manager.pay_for_offer(
2315-
/// offer, amount_msats, payment_id, Default::default(),
2315+
/// offer, amount_msats, payment_id, Default::default(), None,
23162316
/// ) {
23172317
/// Ok(()) => println!("Requesting invoice for offer"),
23182318
/// Err(e) => println!("Unable to request invoice for offer: {:?}", e),
@@ -11180,6 +11180,9 @@ where
1118011180
/// `amount_msats` allows you to overpay what is required to satisfy the offer, or may be
1118111181
/// required if the offer does not require a specific amount.
1118211182
///
11183+
/// If the [`Offer`] was built from a human readable name resolved using BIP 353,
11184+
/// `derived_from_hrn` must be set to `Some` to include the name.
11185+
///
1118311186
/// # Payment
1118411187
///
1118511188
/// The provided `payment_id` is used to ensure that only one invoice is paid for the request
@@ -11215,7 +11218,7 @@ where
1121511218
/// [Avoiding Duplicate Payments]: #avoiding-duplicate-payments
1121611219
pub fn pay_for_offer(
1121711220
&self, offer: &Offer, amount_msats: Option<u64>, payment_id: PaymentId,
11218-
optional_info: OptionalOfferPaymentInfo,
11221+
optional_info: OptionalOfferPaymentInfo, derived_from_hrn: Option<HumanReadableName>,
1121911222
) -> Result<(), Bolt12SemanticError> {
1122011223
let create_pending_payment_fn = |invoice_request: &InvoiceRequest, nonce| {
1122111224
let expiration = StaleExpiration::TimerTicks(1);
@@ -11241,7 +11244,7 @@ where
1124111244
amount_msats,
1124211245
optional_info.payer_note,
1124311246
payment_id,
11244-
None,
11247+
derived_from_hrn,
1124511248
create_pending_payment_fn,
1124611249
)
1124711250
}

lightning/src/ln/max_payment_path_len_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,7 @@ fn bolt12_invoice_too_large_blinded_paths() {
521521
let payment_id = PaymentId([1; 32]);
522522
nodes[0]
523523
.node
524-
.pay_for_offer(&offer, Some(5000), payment_id, OptionalOfferPaymentInfo::default())
524+
.pay_for_offer(&offer, Some(5000), payment_id, OptionalOfferPaymentInfo::default(), None)
525525
.unwrap();
526526
let invreq_om = nodes[0]
527527
.onion_messenger

lightning/src/ln/offers_tests.rs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,7 @@ fn creates_and_pays_for_offer_using_two_hop_blinded_path() {
543543
}
544544

545545
let payment_id = PaymentId([1; 32]);
546-
david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default())
546+
david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None)
547547
.unwrap();
548548
expect_recent_payment!(david, RecentPaymentDetails::AwaitingInvoice, payment_id);
549549

@@ -712,7 +712,7 @@ fn creates_and_pays_for_offer_using_one_hop_blinded_path() {
712712
}
713713

714714
let payment_id = PaymentId([1; 32]);
715-
bob.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default()).unwrap();
715+
bob.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None).unwrap();
716716
expect_recent_payment!(bob, RecentPaymentDetails::AwaitingInvoice, payment_id);
717717

718718
let onion_message = bob.onion_messenger.next_onion_message_for_peer(alice_id).unwrap();
@@ -833,7 +833,7 @@ fn pays_for_offer_without_blinded_paths() {
833833
assert!(offer.paths().is_empty());
834834

835835
let payment_id = PaymentId([1; 32]);
836-
bob.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default()).unwrap();
836+
bob.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None).unwrap();
837837
expect_recent_payment!(bob, RecentPaymentDetails::AwaitingInvoice, payment_id);
838838

839839
let onion_message = bob.onion_messenger.next_onion_message_for_peer(alice_id).unwrap();
@@ -960,7 +960,7 @@ fn send_invoice_requests_with_distinct_reply_path() {
960960
}
961961

962962
let payment_id = PaymentId([1; 32]);
963-
david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default())
963+
david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None)
964964
.unwrap();
965965
expect_recent_payment!(david, RecentPaymentDetails::AwaitingInvoice, payment_id);
966966
connect_peers(david, bob);
@@ -1094,7 +1094,7 @@ fn creates_and_pays_for_offer_with_retry() {
10941094
assert_eq!(path.introduction_node(), &IntroductionNode::NodeId(alice_id));
10951095
}
10961096
let payment_id = PaymentId([1; 32]);
1097-
bob.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default()).unwrap();
1097+
bob.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None).unwrap();
10981098
expect_recent_payment!(bob, RecentPaymentDetails::AwaitingInvoice, payment_id);
10991099

11001100
let _lost_onion_message = bob.onion_messenger.next_onion_message_for_peer(alice_id).unwrap();
@@ -1166,7 +1166,7 @@ fn pays_bolt12_invoice_asynchronously() {
11661166
.build().unwrap();
11671167

11681168
let payment_id = PaymentId([1; 32]);
1169-
bob.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default()).unwrap();
1169+
bob.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None).unwrap();
11701170
expect_recent_payment!(bob, RecentPaymentDetails::AwaitingInvoice, payment_id);
11711171

11721172
let onion_message = bob.onion_messenger.next_onion_message_for_peer(alice_id).unwrap();
@@ -1263,7 +1263,7 @@ fn creates_offer_with_blinded_path_using_unannounced_introduction_node() {
12631263
}
12641264

12651265
let payment_id = PaymentId([1; 32]);
1266-
bob.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default()).unwrap();
1266+
bob.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None).unwrap();
12671267
expect_recent_payment!(bob, RecentPaymentDetails::AwaitingInvoice, payment_id);
12681268

12691269
let onion_message = bob.onion_messenger.next_onion_message_for_peer(alice_id).unwrap();
@@ -1404,7 +1404,7 @@ fn fails_authentication_when_handling_invoice_request() {
14041404

14051405
// Send the invoice request directly to Alice instead of using a blinded path.
14061406
let payment_id = PaymentId([1; 32]);
1407-
david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default())
1407+
david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None)
14081408
.unwrap();
14091409
expect_recent_payment!(david, RecentPaymentDetails::AwaitingInvoice, payment_id);
14101410

@@ -1430,7 +1430,7 @@ fn fails_authentication_when_handling_invoice_request() {
14301430

14311431
// Send the invoice request to Alice using an invalid blinded path.
14321432
let payment_id = PaymentId([2; 32]);
1433-
david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default())
1433+
david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None)
14341434
.unwrap();
14351435
expect_recent_payment!(david, RecentPaymentDetails::AwaitingInvoice, payment_id);
14361436

@@ -1507,7 +1507,7 @@ fn fails_authentication_when_handling_invoice_for_offer() {
15071507

15081508
// Initiate an invoice request, but abandon tracking it.
15091509
let payment_id = PaymentId([1; 32]);
1510-
david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default())
1510+
david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None)
15111511
.unwrap();
15121512
david.node.abandon_payment(payment_id);
15131513
get_event!(david, Event::PaymentFailed);
@@ -1524,7 +1524,7 @@ fn fails_authentication_when_handling_invoice_for_offer() {
15241524
};
15251525

15261526
let payment_id = PaymentId([2; 32]);
1527-
david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default())
1527+
david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None)
15281528
.unwrap();
15291529
expect_recent_payment!(david, RecentPaymentDetails::AwaitingInvoice, payment_id);
15301530

@@ -1708,7 +1708,7 @@ fn fails_creating_or_paying_for_offer_without_connected_peers() {
17081708

17091709
let payment_id = PaymentId([1; 32]);
17101710

1711-
match david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default()) {
1711+
match david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None) {
17121712
Ok(_) => panic!("Expected error"),
17131713
Err(e) => assert_eq!(e, Bolt12SemanticError::MissingPaths),
17141714
}
@@ -1721,7 +1721,7 @@ fn fails_creating_or_paying_for_offer_without_connected_peers() {
17211721

17221722
assert!(
17231723
david.node.pay_for_offer(
1724-
&offer, None, payment_id, OptionalOfferPaymentInfo::default()
1724+
&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None
17251725
).is_ok()
17261726
);
17271727

@@ -1812,7 +1812,7 @@ fn fails_creating_invoice_request_for_unsupported_chain() {
18121812
.build().unwrap();
18131813

18141814
let payment_id = PaymentId([1; 32]);
1815-
match bob.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default()) {
1815+
match bob.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None) {
18161816
Ok(_) => panic!("Expected error"),
18171817
Err(e) => assert_eq!(e, Bolt12SemanticError::UnsupportedChain),
18181818
}
@@ -1871,7 +1871,7 @@ fn fails_creating_invoice_request_without_blinded_reply_path() {
18711871

18721872
let payment_id = PaymentId([1; 32]);
18731873

1874-
match david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default()) {
1874+
match david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None) {
18751875
Ok(_) => panic!("Expected error"),
18761876
Err(e) => assert_eq!(e, Bolt12SemanticError::MissingPaths),
18771877
}
@@ -1906,12 +1906,12 @@ fn fails_creating_invoice_request_with_duplicate_payment_id() {
19061906
let payment_id = PaymentId([1; 32]);
19071907
assert!(
19081908
david.node.pay_for_offer(
1909-
&offer, None, payment_id, OptionalOfferPaymentInfo::default()
1909+
&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None
19101910
).is_ok()
19111911
);
19121912
expect_recent_payment!(david, RecentPaymentDetails::AwaitingInvoice, payment_id);
19131913

1914-
match david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default()) {
1914+
match david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None) {
19151915
Ok(_) => panic!("Expected error"),
19161916
Err(e) => assert_eq!(e, Bolt12SemanticError::DuplicatePaymentId),
19171917
}
@@ -1990,7 +1990,7 @@ fn fails_sending_invoice_without_blinded_payment_paths_for_offer() {
19901990
.build().unwrap();
19911991

19921992
let payment_id = PaymentId([1; 32]);
1993-
david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default())
1993+
david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None)
19941994
.unwrap();
19951995

19961996
connect_peers(david, bob);
@@ -2199,7 +2199,7 @@ fn fails_paying_invoice_with_unknown_required_features() {
21992199
.build().unwrap();
22002200

22012201
let payment_id = PaymentId([1; 32]);
2202-
david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default())
2202+
david.node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None)
22032203
.unwrap();
22042204

22052205
connect_peers(david, bob);
@@ -2276,7 +2276,7 @@ fn rejects_keysend_to_non_static_invoice_path() {
22762276
let offer = nodes[1].node.create_offer_builder(None).unwrap().build().unwrap();
22772277
let amt_msat = 5000;
22782278
let payment_id = PaymentId([1; 32]);
2279-
nodes[0].node.pay_for_offer(&offer, Some(amt_msat), payment_id, OptionalOfferPaymentInfo::default()).unwrap();
2279+
nodes[0].node.pay_for_offer(&offer, Some(amt_msat), payment_id, OptionalOfferPaymentInfo::default(), None).unwrap();
22802280
let invreq_om = nodes[0].onion_messenger.next_onion_message_for_peer(nodes[1].node.get_our_node_id()).unwrap();
22812281
nodes[1].onion_messenger.handle_onion_message(nodes[0].node.get_our_node_id(), &invreq_om);
22822282
let invoice_om = nodes[1].onion_messenger.next_onion_message_for_peer(nodes[0].node.get_our_node_id()).unwrap();
@@ -2361,7 +2361,7 @@ fn no_double_pay_with_stale_channelmanager() {
23612361
assert!(offer.paths().is_empty());
23622362

23632363
let payment_id = PaymentId([1; 32]);
2364-
nodes[0].node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default()).unwrap();
2364+
nodes[0].node.pay_for_offer(&offer, None, payment_id, OptionalOfferPaymentInfo::default(), None).unwrap();
23652365
expect_recent_payment!(nodes[0], RecentPaymentDetails::AwaitingInvoice, payment_id);
23662366

23672367
let invreq_om = nodes[0].onion_messenger.next_onion_message_for_peer(bob_id).unwrap();

0 commit comments

Comments
 (0)