Skip to content

Commit 010c184

Browse files
Add utils for creating blinded PaymentParameters
1 parent 6b6d549 commit 010c184

File tree

1 file changed

+39
-4
lines changed

1 file changed

+39
-4
lines changed

lightning/src/routing/router.rs

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use crate::ln::PaymentHash;
1818
use crate::ln::channelmanager::{ChannelDetails, PaymentId};
1919
use crate::ln::features::{Bolt12InvoiceFeatures, ChannelFeatures, InvoiceFeatures, NodeFeatures};
2020
use crate::ln::msgs::{DecodeError, ErrorAction, LightningError, MAX_VALUE_MSAT};
21-
use crate::offers::invoice::BlindedPayInfo;
21+
use crate::offers::invoice::{BlindedPayInfo, Invoice as Bolt12Invoice};
2222
use crate::routing::gossip::{DirectedChannelInfo, EffectiveCapacity, ReadOnlyNetworkGraph, NetworkGraph, NodeId, RoutingFees};
2323
use crate::routing::scoring::{ChannelUsage, LockableScore, Score};
2424
use crate::util::ser::{Writeable, Readable, ReadableArgs, Writer};
@@ -634,8 +634,43 @@ impl PaymentParameters {
634634
.expect("PaymentParameters::from_node_id should always initialize the payee as unblinded")
635635
}
636636

637-
/// Includes the payee's features. Errors if the parameters were initialized with blinded payment
638-
/// paths.
637+
/// Creates parameters for paying to a blinded payee from the provided invoice. Sets
638+
/// [`Payee::Blinded::route_hints`], [`Payee::Blinded::features`], and
639+
/// [`PaymentParameters::expiry_time`].
640+
pub fn from_bolt12_invoice(invoice: &Bolt12Invoice) -> Self {
641+
let route_hints = invoice.payment_paths().iter()
642+
.map(|(path, info)| (info.clone(), path.clone())).collect();
643+
Self::blinded(route_hints)
644+
.with_bolt12_features(invoice.features().clone()).unwrap()
645+
.with_expiry_time(invoice.created_at().as_secs().saturating_add(invoice.relative_expiry().as_secs()))
646+
}
647+
648+
// TODO: fix tuple order to be consistent with [`crate::offers::invoice::Invoice::payment_paths`]
649+
fn blinded(blinded_route_hints: Vec<(BlindedPayInfo, BlindedPath)>) -> Self {
650+
Self {
651+
payee: Payee::Blinded { route_hints: blinded_route_hints, features: None },
652+
expiry_time: None,
653+
max_total_cltv_expiry_delta: DEFAULT_MAX_TOTAL_CLTV_EXPIRY_DELTA,
654+
max_path_count: DEFAULT_MAX_PATH_COUNT,
655+
max_channel_saturation_power_of_half: 2,
656+
previously_failed_channels: Vec::new(),
657+
}
658+
}
659+
660+
/// Includes the payee's features. Errors if the parameters were not initialized with
661+
/// [`PaymentParameters::from_bolt12_invoice`].
662+
///
663+
/// This is not exported to bindings users since bindings don't support move semantics
664+
pub fn with_bolt12_features(self, features: Bolt12InvoiceFeatures) -> Result<Self, ()> {
665+
match self.payee {
666+
Payee::Clear { .. } => Err(()),
667+
Payee::Blinded { route_hints, .. } =>
668+
Ok(Self { payee: Payee::Blinded { route_hints, features: Some(features) }, ..self })
669+
}
670+
}
671+
672+
/// Includes the payee's features. Errors if the parameters were initialized with
673+
/// [`PaymentParameters::from_bolt12_invoice`].
639674
///
640675
/// This is not exported to bindings users since bindings don't support move semantics
641676
pub fn with_bolt11_features(self, features: InvoiceFeatures) -> Result<Self, ()> {
@@ -651,7 +686,7 @@ impl PaymentParameters {
651686
}
652687

653688
/// Includes hints for routing to the payee. Errors if the parameters were initialized with
654-
/// blinded payment paths.
689+
/// [`PaymentParameters::from_bolt12_invoice`].
655690
///
656691
/// This is not exported to bindings users since bindings don't support move semantics
657692
pub fn with_route_hints(self, route_hints: Vec<RouteHint>) -> Result<Self, ()> {

0 commit comments

Comments
 (0)