Skip to content

Commit f84a00e

Browse files
committed
Update Offers Test to Verify BOLT12 Invoice Reply Paths
1. Updated the Offers Test to check the reply paths in BOLT12 Invoices. 2. Changed the `extract_invoice` return type from `Option<BlindedMessagePath>` to `BlindedMessagePath` since all BOLT12Invoices now have a corresponding reply path by default.
1 parent 3bdc567 commit f84a00e

File tree

1 file changed

+28
-14
lines changed

1 file changed

+28
-14
lines changed

lightning/src/ln/offers_tests.rs

+28-14
Original file line numberDiff line numberDiff line change
@@ -219,12 +219,12 @@ fn extract_invoice_request<'a, 'b, 'c>(
219219
}
220220
}
221221

222-
fn extract_invoice<'a, 'b, 'c>(node: &Node<'a, 'b, 'c>, message: &OnionMessage) -> (Bolt12Invoice, Option<BlindedMessagePath>) {
222+
fn extract_invoice<'a, 'b, 'c>(node: &Node<'a, 'b, 'c>, message: &OnionMessage) -> (Bolt12Invoice, BlindedMessagePath) {
223223
match node.onion_messenger.peel_onion_message(message) {
224224
Ok(PeeledOnion::Receive(message, _, reply_path)) => match message {
225225
ParsedOnionMessageContents::Offers(offers_message) => match offers_message {
226226
OffersMessage::InvoiceRequest(invoice_request) => panic!("Unexpected invoice_request: {:?}", invoice_request),
227-
OffersMessage::Invoice(invoice) => (invoice, reply_path),
227+
OffersMessage::Invoice(invoice) => (invoice, reply_path.unwrap()),
228228
#[cfg(async_payments)]
229229
OffersMessage::StaticInvoice(invoice) => panic!("Unexpected static invoice: {:?}", invoice),
230230
OffersMessage::InvoiceError(error) => panic!("Unexpected invoice_error: {:?}", error),
@@ -508,15 +508,15 @@ fn creates_and_pays_for_offer_using_two_hop_blinded_path() {
508508
features.set_onion_messages_optional();
509509
features.set_route_blinding_optional();
510510

511-
let chanmon_cfgs = create_chanmon_cfgs(6);
512-
let node_cfgs = create_node_cfgs(6, &chanmon_cfgs);
511+
let chanmon_cfgs = create_chanmon_cfgs(7);
512+
let node_cfgs = create_node_cfgs(7, &chanmon_cfgs);
513513

514514
*node_cfgs[1].override_init_features.borrow_mut() = Some(features);
515515

516516
let node_chanmgrs = create_node_chanmgrs(
517-
6, &node_cfgs, &[None, Some(accept_forward_cfg), None, None, None, None]
517+
7, &node_cfgs, &[None, Some(accept_forward_cfg), None, None, None, None, None]
518518
);
519-
let nodes = create_network(6, &node_cfgs, &node_chanmgrs);
519+
let nodes = create_network(7, &node_cfgs, &node_chanmgrs);
520520

521521
create_unannounced_chan_between_nodes_with_value(&nodes, 0, 1, 10_000_000, 1_000_000_000);
522522
create_unannounced_chan_between_nodes_with_value(&nodes, 2, 3, 10_000_000, 1_000_000_000);
@@ -580,13 +580,22 @@ fn creates_and_pays_for_offer_using_two_hop_blinded_path() {
580580
let onion_message = charlie.onion_messenger.next_onion_message_for_peer(david_id).unwrap();
581581
david.onion_messenger.handle_onion_message(&charlie_id, &onion_message);
582582

583-
let (invoice, _) = extract_invoice(david, &onion_message);
583+
let (invoice, reply_path) = extract_invoice(david, &onion_message);
584584
assert_eq!(invoice.amount_msats(), 10_000_000);
585585
assert_ne!(invoice.signing_pubkey(), alice_id);
586586
assert!(!invoice.payment_paths().is_empty());
587587
for path in invoice.payment_paths() {
588588
assert_eq!(path.introduction_node(), &IntroductionNode::NodeId(bob_id));
589589
}
590+
// Both Bob and Charlie have an equal number of channels and need to be connected
591+
// to Alice when she's handling the message. Therefore, either Bob or Charlie could
592+
// serve as the introduction node for the reply path back to Alice.
593+
assert!(
594+
matches!(
595+
reply_path.introduction_node(),
596+
&IntroductionNode::NodeId(node_id) if node_id == bob_id || node_id == charlie_id,
597+
)
598+
);
590599

591600
route_bolt12_payment(david, &[charlie, bob, alice], &invoice);
592601
expect_recent_payment!(david, RecentPaymentDetails::Pending, payment_id);
@@ -659,7 +668,7 @@ fn creates_and_pays_for_refund_using_two_hop_blinded_path() {
659668
let onion_message = charlie.onion_messenger.next_onion_message_for_peer(david_id).unwrap();
660669
david.onion_messenger.handle_onion_message(&charlie_id, &onion_message);
661670

662-
let (invoice, _) = extract_invoice(david, &onion_message);
671+
let (invoice, reply_path) = extract_invoice(david, &onion_message);
663672
assert_eq!(invoice, expected_invoice);
664673

665674
assert_eq!(invoice.amount_msats(), 10_000_000);
@@ -668,6 +677,8 @@ fn creates_and_pays_for_refund_using_two_hop_blinded_path() {
668677
for path in invoice.payment_paths() {
669678
assert_eq!(path.introduction_node(), &IntroductionNode::NodeId(bob_id));
670679
}
680+
assert_eq!(reply_path.introduction_node(), &IntroductionNode::NodeId(bob_id));
681+
671682

672683
route_bolt12_payment(david, &[charlie, bob, alice], &invoice);
673684
expect_recent_payment!(david, RecentPaymentDetails::Pending, payment_id);
@@ -726,13 +737,14 @@ fn creates_and_pays_for_offer_using_one_hop_blinded_path() {
726737
let onion_message = alice.onion_messenger.next_onion_message_for_peer(bob_id).unwrap();
727738
bob.onion_messenger.handle_onion_message(&alice_id, &onion_message);
728739

729-
let (invoice, _) = extract_invoice(bob, &onion_message);
740+
let (invoice, reply_path) = extract_invoice(bob, &onion_message);
730741
assert_eq!(invoice.amount_msats(), 10_000_000);
731742
assert_ne!(invoice.signing_pubkey(), alice_id);
732743
assert!(!invoice.payment_paths().is_empty());
733744
for path in invoice.payment_paths() {
734745
assert_eq!(path.introduction_node(), &IntroductionNode::NodeId(alice_id));
735746
}
747+
assert_eq!(reply_path.introduction_node(), &IntroductionNode::NodeId(alice_id));
736748

737749
route_bolt12_payment(bob, &[alice], &invoice);
738750
expect_recent_payment!(bob, RecentPaymentDetails::Pending, payment_id);
@@ -779,7 +791,7 @@ fn creates_and_pays_for_refund_using_one_hop_blinded_path() {
779791
let onion_message = alice.onion_messenger.next_onion_message_for_peer(bob_id).unwrap();
780792
bob.onion_messenger.handle_onion_message(&alice_id, &onion_message);
781793

782-
let (invoice, _) = extract_invoice(bob, &onion_message);
794+
let (invoice, reply_path) = extract_invoice(bob, &onion_message);
783795
assert_eq!(invoice, expected_invoice);
784796

785797
assert_eq!(invoice.amount_msats(), 10_000_000);
@@ -788,6 +800,7 @@ fn creates_and_pays_for_refund_using_one_hop_blinded_path() {
788800
for path in invoice.payment_paths() {
789801
assert_eq!(path.introduction_node(), &IntroductionNode::NodeId(alice_id));
790802
}
803+
assert_eq!(reply_path.introduction_node(), &IntroductionNode::NodeId(alice_id));
791804

792805
route_bolt12_payment(bob, &[alice], &invoice);
793806
expect_recent_payment!(bob, RecentPaymentDetails::Pending, payment_id);
@@ -1044,7 +1057,7 @@ fn send_invoice_for_refund_with_distinct_reply_path() {
10441057
let onion_message = bob.onion_messenger.next_onion_message_for_peer(alice_id).unwrap();
10451058

10461059
let (_, reply_path) = extract_invoice(alice, &onion_message);
1047-
assert_eq!(reply_path.unwrap().introduction_node(), &IntroductionNode::NodeId(charlie_id));
1060+
assert_eq!(reply_path.introduction_node(), &IntroductionNode::NodeId(charlie_id));
10481061

10491062
// Send, extract and verify the second Invoice Request message
10501063
let onion_message = david.onion_messenger.next_onion_message_for_peer(bob_id).unwrap();
@@ -1053,7 +1066,7 @@ fn send_invoice_for_refund_with_distinct_reply_path() {
10531066
let onion_message = bob.onion_messenger.next_onion_message_for_peer(alice_id).unwrap();
10541067

10551068
let (_, reply_path) = extract_invoice(alice, &onion_message);
1056-
assert_eq!(reply_path.unwrap().introduction_node(), &IntroductionNode::NodeId(nodes[6].node.get_our_node_id()));
1069+
assert_eq!(reply_path.introduction_node(), &IntroductionNode::NodeId(nodes[6].node.get_our_node_id()));
10571070
}
10581071

10591072
/// Checks that a deferred invoice can be paid asynchronously from an Event::InvoiceReceived.
@@ -1190,12 +1203,13 @@ fn creates_offer_with_blinded_path_using_unannounced_introduction_node() {
11901203
let onion_message = alice.onion_messenger.next_onion_message_for_peer(bob_id).unwrap();
11911204
bob.onion_messenger.handle_onion_message(&alice_id, &onion_message);
11921205

1193-
let (invoice, _) = extract_invoice(bob, &onion_message);
1206+
let (invoice, reply_path) = extract_invoice(bob, &onion_message);
11941207
assert_ne!(invoice.signing_pubkey(), alice_id);
11951208
assert!(!invoice.payment_paths().is_empty());
11961209
for path in invoice.payment_paths() {
11971210
assert_eq!(path.introduction_node(), &IntroductionNode::NodeId(bob_id));
11981211
}
1212+
assert_eq!(reply_path.introduction_node(), &IntroductionNode::NodeId(bob_id));
11991213

12001214
route_bolt12_payment(bob, &[alice], &invoice);
12011215
expect_recent_payment!(bob, RecentPaymentDetails::Pending, payment_id);
@@ -1239,7 +1253,7 @@ fn creates_refund_with_blinded_path_using_unannounced_introduction_node() {
12391253

12401254
let onion_message = alice.onion_messenger.next_onion_message_for_peer(bob_id).unwrap();
12411255

1242-
let (invoice, _) = extract_invoice(bob, &onion_message);
1256+
let (invoice, _reply_path) = extract_invoice(bob, &onion_message);
12431257
assert_eq!(invoice, expected_invoice);
12441258
assert_ne!(invoice.signing_pubkey(), alice_id);
12451259
assert!(!invoice.payment_paths().is_empty());

0 commit comments

Comments
 (0)