@@ -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,43 @@ 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
+ 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`].
639
674
///
640
675
/// This is not exported to bindings users since bindings don't support move semantics
641
676
pub fn with_bolt11_features ( self , features : InvoiceFeatures ) -> Result < Self , ( ) > {
@@ -651,7 +686,7 @@ impl PaymentParameters {
651
686
}
652
687
653
688
/// Includes hints for routing to the payee. Errors if the parameters were initialized with
654
- /// blinded payment paths .
689
+ /// [`PaymentParameters::from_bolt12_invoice`] .
655
690
///
656
691
/// This is not exported to bindings users since bindings don't support move semantics
657
692
pub fn with_route_hints ( self , route_hints : Vec < RouteHint > ) -> Result < Self , ( ) > {
0 commit comments