Skip to content

Commit fc2b9af

Browse files
committed
Allow Explicit Specification of Blinded Path Type in Refund
Similar to the offer case, this commit introduces the ability to explicitly specify the Blinded Path type.
1 parent 258b301 commit fc2b9af

File tree

2 files changed

+36
-45
lines changed

2 files changed

+36
-45
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1975,7 +1975,7 @@ where
19751975
/// ```
19761976
/// # use core::time::Duration;
19771977
/// # use lightning::events::{Event, EventsProvider};
1978-
/// # use lightning::ln::channelmanager::{AChannelManager, PaymentId, RecentPaymentDetails, Retry};
1978+
/// # use lightning::ln::channelmanager::{AChannelManager, BlindedPathType, PaymentId, RecentPaymentDetails, Retry};
19791979
/// # use lightning::offers::parse::Bolt12SemanticError;
19801980
/// #
19811981
/// # fn example<T: AChannelManager>(
@@ -1984,9 +1984,10 @@ where
19841984
/// # ) -> Result<(), Bolt12SemanticError> {
19851985
/// # let channel_manager = channel_manager.get_cm();
19861986
/// let payment_id = PaymentId([42; 32]);
1987+
/// let blinded_path = Some(BlindedPathType::Full);
19871988
/// let refund = channel_manager
19881989
/// .create_refund_builder(
1989-
/// amount_msats, absolute_expiry, payment_id, retry, max_total_routing_fee_msat
1990+
/// amount_msats, absolute_expiry, payment_id, retry, max_total_routing_fee_msat, blinded_path
19901991
/// )?
19911992
/// # ;
19921993
/// # // Needed for compiling for c_bindings
@@ -9216,7 +9217,7 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => {
92169217
/// [Avoiding Duplicate Payments]: #avoiding-duplicate-payments
92179218
pub fn create_refund_builder(
92189219
&$self, amount_msats: u64, absolute_expiry: Duration, payment_id: PaymentId,
9219-
retry_strategy: Retry, max_total_routing_fee_msat: Option<u64>
9220+
retry_strategy: Retry, max_total_routing_fee_msat: Option<u64>, blinded_path: Option<BlindedPathType>
92209221
) -> Result<$builder, Bolt12SemanticError> {
92219222
let node_id = $self.get_our_node_id();
92229223
let expanded_key = &$self.inbound_payment_key;
@@ -9225,16 +9226,24 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => {
92259226

92269227
let nonce = Nonce::from_entropy_source(entropy);
92279228
let context = OffersContext::OutboundPayment { payment_id, nonce, hmac: None };
9228-
let path = $self.create_blinded_paths_using_absolute_expiry(context, Some(absolute_expiry))
9229+
9230+
let mut builder = RefundBuilder::deriving_signing_pubkey(
9231+
node_id, expanded_key, nonce, secp_ctx,
9232+
amount_msats, payment_id,
9233+
)?
9234+
.chain_hash($self.chain_hash)
9235+
.absolute_expiry(absolute_expiry);
9236+
9237+
if let Some(path_type) = blinded_path {
9238+
let path = match path_type {
9239+
BlindedPathType::Compact => $self.create_compact_blinded_paths(context),
9240+
BlindedPathType::Full => $self.create_blinded_paths(MessageContext::Offers(context)),
9241+
}
92299242
.and_then(|paths| paths.into_iter().next().ok_or(()))
92309243
.map_err(|_| Bolt12SemanticError::MissingPaths)?;
92319244

9232-
let builder = RefundBuilder::deriving_signing_pubkey(
9233-
node_id, expanded_key, nonce, secp_ctx, amount_msats, payment_id
9234-
)?
9235-
.chain_hash($self.chain_hash)
9236-
.absolute_expiry(absolute_expiry)
9237-
.path(path);
9245+
builder = builder.path(path)
9246+
}
92389247

92399248
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop($self);
92409249

@@ -9618,25 +9627,7 @@ where
96189627
inbound_payment::get_payment_preimage(payment_hash, payment_secret, &self.inbound_payment_key)
96199628
}
96209629

9621-
/// Creates a collection of blinded paths by delegating to [`MessageRouter`] based on
9622-
/// the path's intended lifetime.
9623-
///
9624-
/// Whether or not the path is compact depends on whether the path is short-lived or long-lived,
9625-
/// respectively, based on the given `absolute_expiry` as seconds since the Unix epoch. See
9626-
/// [`MAX_SHORT_LIVED_RELATIVE_EXPIRY`].
9627-
fn create_blinded_paths_using_absolute_expiry(
9628-
&self, context: OffersContext, absolute_expiry: Option<Duration>,
9629-
) -> Result<Vec<BlindedMessagePath>, ()> {
9630-
let now = self.duration_since_epoch();
9631-
let max_short_lived_absolute_expiry = now.saturating_add(MAX_SHORT_LIVED_RELATIVE_EXPIRY);
9632-
9633-
if absolute_expiry.unwrap_or(Duration::MAX) <= max_short_lived_absolute_expiry {
9634-
self.create_compact_blinded_paths(context)
9635-
} else {
9636-
self.create_blinded_paths(MessageContext::Offers(context))
9637-
}
9638-
}
9639-
9630+
#[cfg(test)]
96409631
pub(super) fn duration_since_epoch(&self) -> Duration {
96419632
#[cfg(not(feature = "std"))]
96429633
let now = Duration::from_secs(

lightning/src/ln/offers_tests.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ fn creates_short_lived_refund() {
455455
let absolute_expiry = bob.node.duration_since_epoch() + MAX_SHORT_LIVED_RELATIVE_EXPIRY;
456456
let payment_id = PaymentId([1; 32]);
457457
let refund = bob.node
458-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
458+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Compact))
459459
.unwrap()
460460
.build().unwrap();
461461
assert_eq!(refund.absolute_expiry(), Some(absolute_expiry));
@@ -484,7 +484,7 @@ fn creates_long_lived_refund() {
484484
+ Duration::from_secs(1);
485485
let payment_id = PaymentId([1; 32]);
486486
let refund = bob.node
487-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
487+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
488488
.unwrap()
489489
.build().unwrap();
490490
assert_eq!(refund.absolute_expiry(), Some(absolute_expiry));
@@ -642,7 +642,7 @@ fn creates_and_pays_for_refund_using_two_hop_blinded_path() {
642642
let absolute_expiry = Duration::from_secs(u64::MAX);
643643
let payment_id = PaymentId([1; 32]);
644644
let refund = david.node
645-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
645+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
646646
.unwrap()
647647
.build().unwrap();
648648
assert_eq!(refund.amount_msats(), 10_000_000);
@@ -770,7 +770,7 @@ fn creates_and_pays_for_refund_using_one_hop_blinded_path() {
770770
let absolute_expiry = Duration::from_secs(u64::MAX);
771771
let payment_id = PaymentId([1; 32]);
772772
let refund = bob.node
773-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
773+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
774774
.unwrap()
775775
.build().unwrap();
776776
assert_eq!(refund.amount_msats(), 10_000_000);
@@ -878,7 +878,7 @@ fn pays_for_refund_without_blinded_paths() {
878878
let absolute_expiry = Duration::from_secs(u64::MAX);
879879
let payment_id = PaymentId([1; 32]);
880880
let refund = bob.node
881-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
881+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
882882
.unwrap()
883883
.clear_paths()
884884
.build().unwrap();
@@ -1033,7 +1033,7 @@ fn send_invoice_for_refund_with_distinct_reply_path() {
10331033
let absolute_expiry = Duration::from_secs(u64::MAX);
10341034
let payment_id = PaymentId([1; 32]);
10351035
let refund = alice.node
1036-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
1036+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
10371037
.unwrap()
10381038
.build().unwrap();
10391039
assert_ne!(refund.payer_signing_pubkey(), alice_id);
@@ -1309,7 +1309,7 @@ fn creates_refund_with_blinded_path_using_unannounced_introduction_node() {
13091309
let absolute_expiry = Duration::from_secs(u64::MAX);
13101310
let payment_id = PaymentId([1; 32]);
13111311
let refund = bob.node
1312-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
1312+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
13131313
.unwrap()
13141314
.build().unwrap();
13151315
assert_ne!(refund.payer_signing_pubkey(), bob_id);
@@ -1592,7 +1592,7 @@ fn fails_authentication_when_handling_invoice_for_refund() {
15921592
let absolute_expiry = Duration::from_secs(u64::MAX);
15931593
let payment_id = PaymentId([1; 32]);
15941594
let refund = david.node
1595-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
1595+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
15961596
.unwrap()
15971597
.build().unwrap();
15981598
assert_ne!(refund.payer_signing_pubkey(), david_id);
@@ -1626,7 +1626,7 @@ fn fails_authentication_when_handling_invoice_for_refund() {
16261626
let invalid_path = refund.paths().first().unwrap().clone();
16271627
let payment_id = PaymentId([2; 32]);
16281628
let refund = david.node
1629-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
1629+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
16301630
.unwrap()
16311631
.build().unwrap();
16321632
assert_ne!(refund.payer_signing_pubkey(), david_id);
@@ -1754,7 +1754,7 @@ fn fails_creating_refund_or_sending_invoice_without_connected_peers() {
17541754
let absolute_expiry = david.node.duration_since_epoch() + MAX_SHORT_LIVED_RELATIVE_EXPIRY;
17551755
let payment_id = PaymentId([1; 32]);
17561756
match david.node.create_refund_builder(
1757-
10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None
1757+
10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full)
17581758
) {
17591759
Ok(_) => panic!("Expected error"),
17601760
Err(e) => assert_eq!(e, Bolt12SemanticError::MissingPaths),
@@ -1765,7 +1765,7 @@ fn fails_creating_refund_or_sending_invoice_without_connected_peers() {
17651765
reconnect_nodes(args);
17661766

17671767
let refund = david.node
1768-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
1768+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
17691769
.unwrap()
17701770
.build().unwrap();
17711771

@@ -1823,7 +1823,7 @@ fn fails_sending_invoice_with_unsupported_chain_for_refund() {
18231823
let absolute_expiry = Duration::from_secs(u64::MAX);
18241824
let payment_id = PaymentId([1; 32]);
18251825
let refund = bob.node
1826-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
1826+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
18271827
.unwrap()
18281828
.chain(Network::Signet)
18291829
.build().unwrap();
@@ -1921,13 +1921,13 @@ fn fails_creating_refund_with_duplicate_payment_id() {
19211921
let payment_id = PaymentId([1; 32]);
19221922
assert!(
19231923
nodes[0].node.create_refund_builder(
1924-
10_000, absolute_expiry, payment_id, Retry::Attempts(0), None
1924+
10_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full)
19251925
).is_ok()
19261926
);
19271927
expect_recent_payment!(nodes[0], RecentPaymentDetails::AwaitingInvoice, payment_id);
19281928

19291929
match nodes[0].node.create_refund_builder(
1930-
10_000, absolute_expiry, payment_id, Retry::Attempts(0), None
1930+
10_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full)
19311931
) {
19321932
Ok(_) => panic!("Expected error"),
19331933
Err(e) => assert_eq!(e, Bolt12SemanticError::DuplicatePaymentId),
@@ -2047,7 +2047,7 @@ fn fails_sending_invoice_without_blinded_payment_paths_for_refund() {
20472047
let absolute_expiry = Duration::from_secs(u64::MAX);
20482048
let payment_id = PaymentId([1; 32]);
20492049
let refund = david.node
2050-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
2050+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
20512051
.unwrap()
20522052
.build().unwrap();
20532053

@@ -2096,7 +2096,7 @@ fn fails_paying_invoice_more_than_once() {
20962096
let absolute_expiry = Duration::from_secs(u64::MAX);
20972097
let payment_id = PaymentId([1; 32]);
20982098
let refund = david.node
2099-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
2099+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
21002100
.unwrap()
21012101
.build().unwrap();
21022102
expect_recent_payment!(david, RecentPaymentDetails::AwaitingInvoice, payment_id);

0 commit comments

Comments
 (0)