Skip to content

Commit 2d2f3a2

Browse files
committed
Update create_offer_builder to use create_blinded_paths
This change updates the default `create_offer_builder` to always use `create_blinded_paths`, enabling deterministic creation of only full-length blinded paths. Now that we provide `create_offer_builder_using_router`, users who need custom path logic (like compact blinded path) can pass in their own `MessageRouter`. This allows the default builder to remain simple and consistent, while offering flexibility through the alternate function.
1 parent 4dcfe1b commit 2d2f3a2

File tree

4 files changed

+38
-43
lines changed

4 files changed

+38
-43
lines changed

lightning-dns-resolver/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ mod test {
396396
let name = HumanReadableName::from_encoded("[email protected]").unwrap();
397397

398398
// When we get the proof back, override its contents to an offer from nodes[1]
399-
let bs_offer = nodes[1].node.create_offer_builder(None).unwrap().build().unwrap();
399+
let bs_offer = nodes[1].node.create_offer_builder().unwrap().build().unwrap();
400400
let proof_override = &nodes[0].node.testing_dnssec_proof_offer_resolution_override;
401401
proof_override.lock().unwrap().insert(name.clone(), bs_offer);
402402

lightning/src/ln/channelmanager.rs

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2091,9 +2091,8 @@ where
20912091
/// #
20922092
/// # fn example<T: AChannelManager>(channel_manager: T) -> Result<(), Bolt12SemanticError> {
20932093
/// # let channel_manager = channel_manager.get_cm();
2094-
/// # let absolute_expiry = None;
20952094
/// let offer = channel_manager
2096-
/// .create_offer_builder(absolute_expiry)?
2095+
/// .create_offer_builder()?
20972096
/// # ;
20982097
/// # // Needed for compiling for c_bindings
20992098
/// # let builder: lightning::offers::offer::OfferBuilder<_, _> = offer.into();
@@ -10179,9 +10178,8 @@ macro_rules! create_offer_builder { ($self: ident, $builder: ty) => {
1017910178
///
1018010179
/// # Privacy
1018110180
///
10182-
/// Uses [`MessageRouter`] to construct a [`BlindedMessagePath`] for the offer based on the given
10183-
/// `absolute_expiry` according to [`MAX_SHORT_LIVED_RELATIVE_EXPIRY`]. See those docs for
10184-
/// privacy implications as well as those of the parameterized [`Router`], which implements
10181+
/// Uses [`MessageRouter`] to construct a [`BlindedMessagePath`] for the offer. See those docs
10182+
/// for privacy implications as well as those of the parameterized [`Router`], which implements
1018510183
/// [`MessageRouter`].
1018610184
///
1018710185
/// Also, uses a derived signing pubkey in the offer for recipient privacy.
@@ -10197,28 +10195,21 @@ macro_rules! create_offer_builder { ($self: ident, $builder: ty) => {
1019710195
///
1019810196
/// [`Offer`]: crate::offers::offer::Offer
1019910197
/// [`InvoiceRequest`]: crate::offers::invoice_request::InvoiceRequest
10200-
pub fn create_offer_builder(
10201-
&$self, absolute_expiry: Option<Duration>
10202-
) -> Result<$builder, Bolt12SemanticError> {
10198+
pub fn create_offer_builder(&$self) -> Result<$builder, Bolt12SemanticError> {
1020310199
let node_id = $self.get_our_node_id();
1020410200
let expanded_key = &$self.inbound_payment_key;
1020510201
let entropy = &*$self.entropy_source;
1020610202
let secp_ctx = &$self.secp_ctx;
1020710203

1020810204
let nonce = Nonce::from_entropy_source(entropy);
10209-
let context = OffersContext::InvoiceRequest { nonce };
10210-
let path = $self.create_blinded_paths_using_absolute_expiry(context, absolute_expiry)
10205+
let context = MessageContext::Offers(OffersContext::InvoiceRequest { nonce });
10206+
let path = $self.create_blinded_paths(context)
1021110207
.and_then(|paths| paths.into_iter().next().ok_or(()))
1021210208
.map_err(|_| Bolt12SemanticError::MissingPaths)?;
1021310209
let builder = OfferBuilder::deriving_signing_pubkey(node_id, expanded_key, nonce, secp_ctx)
1021410210
.chain_hash($self.chain_hash)
1021510211
.path(path);
1021610212

10217-
let builder = match absolute_expiry {
10218-
None => builder,
10219-
Some(absolute_expiry) => builder.absolute_expiry(absolute_expiry),
10220-
};
10221-
1022210213
Ok(builder.into())
1022310214
}
1022410215

lightning/src/ln/max_payment_path_len_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ fn bolt12_invoice_too_large_blinded_paths() {
396396
)
397397
]);
398398

399-
let offer = nodes[1].node.create_offer_builder(None).unwrap().build().unwrap();
399+
let offer = nodes[1].node.create_offer_builder().unwrap().build().unwrap();
400400
let payment_id = PaymentId([1; 32]);
401401
nodes[0].node.pay_for_offer(&offer, None, Some(5000), None, payment_id, Retry::Attempts(0), RouteParametersConfig::default()).unwrap();
402402
let invreq_om = nodes[0].onion_messenger.next_onion_message_for_peer(nodes[1].node.get_our_node_id()).unwrap();

lightning/src/ln/offers_tests.rs

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ use crate::offers::invoice_error::InvoiceError;
5858
use crate::offers::invoice_request::{InvoiceRequest, InvoiceRequestFields};
5959
use crate::offers::nonce::Nonce;
6060
use crate::offers::parse::Bolt12SemanticError;
61-
use crate::onion_message::messenger::{Destination, PeeledOnion, MessageSendInstructions};
61+
use crate::onion_message::messenger::{CompactMessageRouter, Destination, MessageSendInstructions, PeeledOnion};
6262
use crate::onion_message::offers::OffersMessage;
6363
use crate::onion_message::packet::ParsedOnionMessageContents;
6464
use crate::routing::gossip::{NodeAlias, NodeId};
@@ -297,7 +297,7 @@ fn prefers_non_tor_nodes_in_blinded_paths() {
297297
announce_node_address(charlie, &[alice, bob, david, &nodes[4], &nodes[5]], tor.clone());
298298

299299
let offer = bob.node
300-
.create_offer_builder(None).unwrap()
300+
.create_offer_builder().unwrap()
301301
.amount_msats(10_000_000)
302302
.build().unwrap();
303303
assert_ne!(offer.issuer_signing_pubkey(), Some(bob_id));
@@ -313,7 +313,7 @@ fn prefers_non_tor_nodes_in_blinded_paths() {
313313
announce_node_address(&nodes[5], &[alice, bob, charlie, david, &nodes[4]], tor.clone());
314314

315315
let offer = bob.node
316-
.create_offer_builder(None).unwrap()
316+
.create_offer_builder().unwrap()
317317
.amount_msats(10_000_000)
318318
.build().unwrap();
319319
assert_ne!(offer.issuer_signing_pubkey(), Some(bob_id));
@@ -364,7 +364,7 @@ fn prefers_more_connected_nodes_in_blinded_paths() {
364364
disconnect_peers(david, &[bob, &nodes[4], &nodes[5]]);
365365

366366
let offer = bob.node
367-
.create_offer_builder(None).unwrap()
367+
.create_offer_builder().unwrap()
368368
.amount_msats(10_000_000)
369369
.build().unwrap();
370370
assert_ne!(offer.issuer_signing_pubkey(), Some(bob_id));
@@ -389,9 +389,11 @@ fn creates_short_lived_offer() {
389389
let alice_id = alice.node.get_our_node_id();
390390
let bob = &nodes[1];
391391

392+
let router = CompactMessageRouter::new(alice.network_graph, alice.node.entropy_source);
392393
let absolute_expiry = alice.node.duration_since_epoch() + MAX_SHORT_LIVED_RELATIVE_EXPIRY;
393394
let offer = alice.node
394-
.create_offer_builder(Some(absolute_expiry)).unwrap()
395+
.create_offer_builder_using_router(router).unwrap()
396+
.absolute_expiry(absolute_expiry)
395397
.build().unwrap();
396398
assert_eq!(offer.absolute_expiry(), Some(absolute_expiry));
397399
assert!(!offer.paths().is_empty());
@@ -418,8 +420,9 @@ fn creates_long_lived_offer() {
418420
let absolute_expiry = alice.node.duration_since_epoch() + MAX_SHORT_LIVED_RELATIVE_EXPIRY
419421
+ Duration::from_secs(1);
420422
let offer = alice.node
421-
.create_offer_builder(Some(absolute_expiry))
423+
.create_offer_builder()
422424
.unwrap()
425+
.absolute_expiry(absolute_expiry)
423426
.build().unwrap();
424427
assert_eq!(offer.absolute_expiry(), Some(absolute_expiry));
425428
assert!(!offer.paths().is_empty());
@@ -428,7 +431,7 @@ fn creates_long_lived_offer() {
428431
}
429432

430433
let offer = alice.node
431-
.create_offer_builder(None).unwrap()
434+
.create_offer_builder().unwrap()
432435
.build().unwrap();
433436
assert_eq!(offer.absolute_expiry(), None);
434437
assert!(!offer.paths().is_empty());
@@ -532,7 +535,7 @@ fn creates_and_pays_for_offer_using_two_hop_blinded_path() {
532535
disconnect_peers(david, &[bob, &nodes[4], &nodes[5]]);
533536

534537
let offer = alice.node
535-
.create_offer_builder(None)
538+
.create_offer_builder()
536539
.unwrap()
537540
.amount_msats(10_000_000)
538541
.build().unwrap();
@@ -702,7 +705,7 @@ fn creates_and_pays_for_offer_using_one_hop_blinded_path() {
702705
let bob_id = bob.node.get_our_node_id();
703706

704707
let offer = alice.node
705-
.create_offer_builder(None).unwrap()
708+
.create_offer_builder().unwrap()
706709
.amount_msats(10_000_000)
707710
.build().unwrap();
708711
assert_ne!(offer.issuer_signing_pubkey(), Some(alice_id));
@@ -825,7 +828,7 @@ fn pays_for_offer_without_blinded_paths() {
825828
let bob_id = bob.node.get_our_node_id();
826829

827830
let offer = alice.node
828-
.create_offer_builder(None).unwrap()
831+
.create_offer_builder().unwrap()
829832
.clear_paths()
830833
.amount_msats(10_000_000)
831834
.build().unwrap();
@@ -949,7 +952,7 @@ fn send_invoice_requests_with_distinct_reply_path() {
949952
disconnect_peers(david, &[bob, &nodes[4], &nodes[5]]);
950953

951954
let offer = alice.node
952-
.create_offer_builder(None)
955+
.create_offer_builder()
953956
.unwrap()
954957
.amount_msats(10_000_000)
955958
.build().unwrap();
@@ -1085,7 +1088,7 @@ fn creates_and_pays_for_offer_with_retry() {
10851088
let bob_id = bob.node.get_our_node_id();
10861089

10871090
let offer = alice.node
1088-
.create_offer_builder(None).unwrap()
1091+
.create_offer_builder().unwrap()
10891092
.amount_msats(10_000_000)
10901093
.build().unwrap();
10911094
assert_ne!(offer.issuer_signing_pubkey(), Some(alice_id));
@@ -1161,7 +1164,7 @@ fn pays_bolt12_invoice_asynchronously() {
11611164
let bob_id = bob.node.get_our_node_id();
11621165

11631166
let offer = alice.node
1164-
.create_offer_builder(None).unwrap()
1167+
.create_offer_builder().unwrap()
11651168
.amount_msats(10_000_000)
11661169
.build().unwrap();
11671170

@@ -1246,7 +1249,7 @@ fn creates_offer_with_blinded_path_using_unannounced_introduction_node() {
12461249
let bob_id = bob.node.get_our_node_id();
12471250

12481251
let offer = alice.node
1249-
.create_offer_builder(None).unwrap()
1252+
.create_offer_builder().unwrap()
12501253
.amount_msats(10_000_000)
12511254
.build().unwrap();
12521255
assert_ne!(offer.issuer_signing_pubkey(), Some(alice_id));
@@ -1376,7 +1379,7 @@ fn fails_authentication_when_handling_invoice_request() {
13761379
disconnect_peers(david, &[bob, &nodes[4], &nodes[5]]);
13771380

13781381
let offer = alice.node
1379-
.create_offer_builder(None)
1382+
.create_offer_builder()
13801383
.unwrap()
13811384
.amount_msats(10_000_000)
13821385
.build().unwrap();
@@ -1388,7 +1391,7 @@ fn fails_authentication_when_handling_invoice_request() {
13881391
}
13891392

13901393
let invalid_path = alice.node
1391-
.create_offer_builder(None)
1394+
.create_offer_builder()
13921395
.unwrap()
13931396
.build().unwrap()
13941397
.paths().first().unwrap()
@@ -1488,7 +1491,7 @@ fn fails_authentication_when_handling_invoice_for_offer() {
14881491
disconnect_peers(david, &[bob, &nodes[4], &nodes[5]]);
14891492

14901493
let offer = alice.node
1491-
.create_offer_builder(None)
1494+
.create_offer_builder()
14921495
.unwrap()
14931496
.amount_msats(10_000_000)
14941497
.build().unwrap();
@@ -1685,7 +1688,7 @@ fn fails_creating_or_paying_for_offer_without_connected_peers() {
16851688
disconnect_peers(david, &[bob, charlie, &nodes[4], &nodes[5]]);
16861689

16871690
let absolute_expiry = alice.node.duration_since_epoch() + MAX_SHORT_LIVED_RELATIVE_EXPIRY;
1688-
match alice.node.create_offer_builder(Some(absolute_expiry)) {
1691+
match alice.node.create_offer_builder() {
16891692
Ok(_) => panic!("Expected error"),
16901693
Err(e) => assert_eq!(e, Bolt12SemanticError::MissingPaths),
16911694
}
@@ -1695,8 +1698,9 @@ fn fails_creating_or_paying_for_offer_without_connected_peers() {
16951698
reconnect_nodes(args);
16961699

16971700
let offer = alice.node
1698-
.create_offer_builder(Some(absolute_expiry)).unwrap()
1701+
.create_offer_builder().unwrap()
16991702
.amount_msats(10_000_000)
1703+
.absolute_expiry(absolute_expiry)
17001704
.build().unwrap();
17011705

17021706
let payment_id = PaymentId([1; 32]);
@@ -1799,7 +1803,7 @@ fn fails_creating_invoice_request_for_unsupported_chain() {
17991803
let bob = &nodes[1];
18001804

18011805
let offer = alice.node
1802-
.create_offer_builder(None).unwrap()
1806+
.create_offer_builder().unwrap()
18031807
.clear_chains()
18041808
.chain(Network::Signet)
18051809
.build().unwrap();
@@ -1858,7 +1862,7 @@ fn fails_creating_invoice_request_without_blinded_reply_path() {
18581862
disconnect_peers(david, &[bob, charlie, &nodes[4], &nodes[5]]);
18591863

18601864
let offer = alice.node
1861-
.create_offer_builder(None).unwrap()
1865+
.create_offer_builder().unwrap()
18621866
.amount_msats(10_000_000)
18631867
.build().unwrap();
18641868

@@ -1892,7 +1896,7 @@ fn fails_creating_invoice_request_with_duplicate_payment_id() {
18921896
disconnect_peers(alice, &[charlie, david, &nodes[4], &nodes[5]]);
18931897

18941898
let offer = alice.node
1895-
.create_offer_builder(None).unwrap()
1899+
.create_offer_builder().unwrap()
18961900
.amount_msats(10_000_000)
18971901
.build().unwrap();
18981902

@@ -1978,7 +1982,7 @@ fn fails_sending_invoice_without_blinded_payment_paths_for_offer() {
19781982
disconnect_peers(david, &[bob, &nodes[4], &nodes[5]]);
19791983

19801984
let offer = alice.node
1981-
.create_offer_builder(None).unwrap()
1985+
.create_offer_builder().unwrap()
19821986
.amount_msats(10_000_000)
19831987
.build().unwrap();
19841988

@@ -2187,7 +2191,7 @@ fn fails_paying_invoice_with_unknown_required_features() {
21872191
disconnect_peers(david, &[bob, &nodes[4], &nodes[5]]);
21882192

21892193
let offer = alice.node
2190-
.create_offer_builder(None).unwrap()
2194+
.create_offer_builder().unwrap()
21912195
.amount_msats(10_000_000)
21922196
.build().unwrap();
21932197

@@ -2266,7 +2270,7 @@ fn rejects_keysend_to_non_static_invoice_path() {
22662270
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 0);
22672271

22682272
// First pay the offer and save the payment preimage and invoice.
2269-
let offer = nodes[1].node.create_offer_builder(None).unwrap().build().unwrap();
2273+
let offer = nodes[1].node.create_offer_builder().unwrap().build().unwrap();
22702274
let amt_msat = 5000;
22712275
let payment_id = PaymentId([1; 32]);
22722276
nodes[0].node.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(1), RouteParametersConfig::default()).unwrap();
@@ -2346,7 +2350,7 @@ fn no_double_pay_with_stale_channelmanager() {
23462350

23472351
let amt_msat = nodes[0].node.list_usable_channels()[0].next_outbound_htlc_limit_msat + 1; // Force MPP
23482352
let offer = nodes[1].node
2349-
.create_offer_builder(None).unwrap()
2353+
.create_offer_builder().unwrap()
23502354
.clear_paths()
23512355
.amount_msats(amt_msat)
23522356
.build().unwrap();

0 commit comments

Comments
 (0)