@@ -18,7 +18,7 @@ use crate::ln::PaymentHash;
18
18
use crate :: ln:: channelmanager:: { ChannelDetails , PaymentId } ;
19
19
use crate :: ln:: features:: { Bolt12InvoiceFeatures , ChannelFeatures , InvoiceFeatures , NodeFeatures } ;
20
20
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 } ;
22
22
use crate :: routing:: gossip:: { DirectedChannelInfo , EffectiveCapacity , ReadOnlyNetworkGraph , NetworkGraph , NodeId , RoutingFees } ;
23
23
use crate :: routing:: scoring:: { ChannelUsage , LockableScore , Score } ;
24
24
use crate :: util:: ser:: { Writeable , Readable , ReadableArgs , Writer } ;
@@ -634,8 +634,40 @@ impl PaymentParameters {
634
634
. expect ( "PaymentParameters::from_node_id should always initialize the payee as unblinded" )
635
635
}
636
636
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
+ Self :: blinded ( invoice. payment_paths ( ) . to_vec ( ) )
642
+ . with_bolt12_features ( invoice. features ( ) . clone ( ) ) . unwrap ( )
643
+ . with_expiry_time ( invoice. created_at ( ) . as_secs ( ) . saturating_add ( invoice. relative_expiry ( ) . as_secs ( ) ) )
644
+ }
645
+
646
+ fn blinded ( blinded_route_hints : Vec < ( BlindedPayInfo , BlindedPath ) > ) -> Self {
647
+ Self {
648
+ payee : Payee :: Blinded { route_hints : blinded_route_hints, features : None } ,
649
+ expiry_time : None ,
650
+ max_total_cltv_expiry_delta : DEFAULT_MAX_TOTAL_CLTV_EXPIRY_DELTA ,
651
+ max_path_count : DEFAULT_MAX_PATH_COUNT ,
652
+ max_channel_saturation_power_of_half : 2 ,
653
+ previously_failed_channels : Vec :: new ( ) ,
654
+ }
655
+ }
656
+
657
+ /// Includes the payee's features. Errors if the parameters were not initialized with
658
+ /// [`PaymentParameters::from_bolt12_invoice`].
659
+ ///
660
+ /// This is not exported to bindings users since bindings don't support move semantics
661
+ pub fn with_bolt12_features ( self , features : Bolt12InvoiceFeatures ) -> Result < Self , ( ) > {
662
+ match self . payee {
663
+ Payee :: Clear { .. } => Err ( ( ) ) ,
664
+ Payee :: Blinded { route_hints, .. } =>
665
+ Ok ( Self { payee : Payee :: Blinded { route_hints, features : Some ( features) } , ..self } )
666
+ }
667
+ }
668
+
669
+ /// Includes the payee's features. Errors if the parameters were initialized with
670
+ /// [`PaymentParameters::from_bolt12_invoice`].
639
671
///
640
672
/// This is not exported to bindings users since bindings don't support move semantics
641
673
pub fn with_bolt11_features ( self , features : InvoiceFeatures ) -> Result < Self , ( ) > {
@@ -651,7 +683,7 @@ impl PaymentParameters {
651
683
}
652
684
653
685
/// Includes hints for routing to the payee. Errors if the parameters were initialized with
654
- /// blinded payment paths .
686
+ /// [`PaymentParameters::from_bolt12_invoice`] .
655
687
///
656
688
/// This is not exported to bindings users since bindings don't support move semantics
657
689
pub fn with_route_hints ( self , route_hints : Vec < RouteHint > ) -> Result < Self , ( ) > {
0 commit comments