@@ -37,10 +37,11 @@ use crate::ln::inbound_payment;
37
37
use crate :: offers:: async_receive_offer_cache:: AsyncReceiveOfferCache ;
38
38
use crate :: offers:: invoice:: {
39
39
Bolt12Invoice , DerivedSigningPubkey , ExplicitSigningPubkey , InvoiceBuilder ,
40
- UnsignedBolt12Invoice , DEFAULT_RELATIVE_EXPIRY ,
40
+ DEFAULT_RELATIVE_EXPIRY ,
41
+ } ;
42
+ use crate :: offers:: invoice_request:: {
43
+ InvoiceRequest , InvoiceRequestBuilder , InvoiceSigningInfo , VerifiedInvoiceRequest ,
41
44
} ;
42
- use crate :: offers:: invoice_error:: InvoiceError ;
43
- use crate :: offers:: invoice_request:: { InvoiceRequest , InvoiceRequestBuilder , InvoiceSigningInfo } ;
44
45
use crate :: offers:: nonce:: Nonce ;
45
46
use crate :: offers:: offer:: { DerivedMetadata , Offer , OfferBuilder } ;
46
47
use crate :: offers:: parse:: Bolt12SemanticError ;
@@ -50,7 +51,7 @@ use crate::onion_message::messenger::{Destination, MessageRouter, MessageSendIns
50
51
use crate :: onion_message:: offers:: OffersMessage ;
51
52
use crate :: onion_message:: packet:: OnionMessageContents ;
52
53
use crate :: routing:: router:: Router ;
53
- use crate :: sign:: { EntropySource , NodeSigner , ReceiveAuthKey } ;
54
+ use crate :: sign:: { EntropySource , ReceiveAuthKey } ;
54
55
use crate :: sync:: { Mutex , RwLock } ;
55
56
use crate :: types:: payment:: { PaymentHash , PaymentSecret } ;
56
57
use crate :: util:: ser:: Writeable ;
@@ -918,94 +919,126 @@ where
918
919
Ok ( builder. into ( ) )
919
920
}
920
921
921
- /// Creates a response for the provided [`InvoiceSigningInfo`].
922
+ /// Creates an [`InvoiceBuilder`] with [`DerivedSigningPubkey`] for the
923
+ /// provided [`VerifiedInvoiceRequest<DerivedSigningPubkey>`].
924
+ ///
925
+ /// Returns the invoice builder along with a [`MessageContext`] that can
926
+ /// later be used to respond to the counterparty.
922
927
///
923
- /// A response can be either an [`OffersMessage::Invoice`] with additional [`MessageContext`],
924
- /// or an [`OffersMessage::InvoiceError`], depending on the [`InvoiceRequest `].
928
+ /// Use this method when you want to inspect or modify the [`InvoiceBuilder`]
929
+ /// before signing and generating the final [`Bolt12Invoice `].
925
930
///
926
- /// An [`OffersMessage::InvoiceError`] will be generated if:
927
- /// - We fail to generate valid payment paths to include in the [`Bolt12Invoice`].
928
- /// - We fail to generate a valid signed [`Bolt12Invoice`] for the [`InvoiceRequest`].
929
- pub fn create_response_for_invoice_request < ES : Deref , NS : Deref , R : Deref > (
930
- & self , signer : & NS , router : & R , entropy_source : ES , invoice_request : InvoiceSigningInfo ,
931
- amount_msats : u64 , payment_hash : PaymentHash , payment_secret : PaymentSecret ,
931
+ /// # Errors
932
+ ///
933
+ /// Returns a [`Bolt12SemanticError`] if:
934
+ /// - User call the function with [`VerifiedInvoiceRequest<ExplicitSigningPubkey>`].
935
+ /// - Valid blinded payment paths could not be generated for the [`Bolt12Invoice`].
936
+ /// - The [`InvoiceBuilder`] could not be created from the [`InvoiceRequest`].
937
+ pub fn create_invoice_builder_from_invoice_request_with_keys < ' a , ES : Deref , R : Deref > (
938
+ & ' a self , router : & R , entropy_source : ES ,
939
+ invoice_request : & ' a VerifiedInvoiceRequest < DerivedSigningPubkey > , amount_msats : u64 ,
940
+ payment_hash : PaymentHash , payment_secret : PaymentSecret ,
932
941
usable_channels : Vec < ChannelDetails > ,
933
- ) -> ( OffersMessage , Option < MessageContext > )
942
+ ) -> Result < ( InvoiceBuilder < ' a , DerivedSigningPubkey > , MessageContext ) , Bolt12SemanticError >
934
943
where
935
944
ES :: Target : EntropySource ,
936
- NS :: Target : NodeSigner ,
945
+
937
946
R :: Target : Router ,
938
947
{
939
948
let entropy = & * entropy_source;
940
- let secp_ctx = & self . secp_ctx ;
949
+ let relative_expiry = DEFAULT_RELATIVE_EXPIRY . as_secs ( ) as u32 ;
941
950
951
+ let context = PaymentContext :: Bolt12Offer ( Bolt12OfferContext {
952
+ offer_id : invoice_request. offer_id ,
953
+ invoice_request : invoice_request. fields ( ) ,
954
+ } ) ;
955
+
956
+ let payment_paths = self
957
+ . create_blinded_payment_paths (
958
+ router,
959
+ entropy,
960
+ usable_channels,
961
+ Some ( amount_msats) ,
962
+ payment_secret,
963
+ context,
964
+ relative_expiry,
965
+ )
966
+ . map_err ( |_| Bolt12SemanticError :: MissingPaths ) ?;
967
+
968
+ #[ cfg( feature = "std" ) ]
969
+ let builder = invoice_request. respond_using_derived_keys ( payment_paths, payment_hash) ;
970
+ #[ cfg( not( feature = "std" ) ) ]
971
+ let builder = invoice_request. respond_using_derived_keys_no_std (
972
+ payment_paths,
973
+ payment_hash,
974
+ Duration :: from_secs ( self . highest_seen_timestamp . load ( Ordering :: Acquire ) as u64 ) ,
975
+ ) ;
976
+ let builder = builder. map ( |b| InvoiceBuilder :: from ( b) . allow_mpp ( ) ) ?;
977
+
978
+ let context = MessageContext :: Offers ( OffersContext :: InboundPayment { payment_hash } ) ;
979
+
980
+ Ok ( ( builder, context) )
981
+ }
982
+
983
+ /// Creates an [`InvoiceBuilder`] with [`ExplicitSigningPubkey`] for the
984
+ /// provided [`VerifiedInvoiceRequest<ExplicitSigningPubkey>`].
985
+ ///
986
+ /// Returns the invoice builder along with a [`MessageContext`] that can
987
+ /// later be used to respond to the counterparty.
988
+ ///
989
+ /// Use this method when you want to inspect or modify the [`InvoiceBuilder`]
990
+ /// before signing and generating the final [`Bolt12Invoice`].
991
+ ///
992
+ /// # Errors
993
+ ///
994
+ /// Returns a [`Bolt12SemanticError`] if:
995
+ /// - User call the function with [`VerifiedInvoiceRequest<DerivedSigningPubkey>`].
996
+ /// - Valid blinded payment paths could not be generated for the [`Bolt12Invoice`].
997
+ /// - The [`InvoiceBuilder`] could not be created from the [`InvoiceRequest`].
998
+ pub fn create_invoice_builder_from_invoice_request_without_keys < ' a , ES : Deref , R : Deref > (
999
+ & ' a self , router : & R , entropy_source : ES ,
1000
+ invoice_request : & ' a VerifiedInvoiceRequest < ExplicitSigningPubkey > , amount_msats : u64 ,
1001
+ payment_hash : PaymentHash , payment_secret : PaymentSecret ,
1002
+ usable_channels : Vec < ChannelDetails > ,
1003
+ ) -> Result < ( InvoiceBuilder < ' a , ExplicitSigningPubkey > , MessageContext ) , Bolt12SemanticError >
1004
+ where
1005
+ ES :: Target : EntropySource ,
1006
+ R :: Target : Router ,
1007
+ {
1008
+ let entropy = & * entropy_source;
942
1009
let relative_expiry = DEFAULT_RELATIVE_EXPIRY . as_secs ( ) as u32 ;
943
1010
944
1011
let context = PaymentContext :: Bolt12Offer ( Bolt12OfferContext {
945
- offer_id : invoice_request. offer_id ( ) ,
1012
+ offer_id : invoice_request. offer_id ,
946
1013
invoice_request : invoice_request. fields ( ) ,
947
1014
} ) ;
948
1015
949
- let payment_paths = match self . create_blinded_payment_paths (
950
- router,
951
- entropy,
952
- usable_channels,
953
- Some ( amount_msats) ,
954
- payment_secret,
955
- context,
956
- relative_expiry,
957
- ) {
958
- Ok ( paths) => paths,
959
- Err ( _) => {
960
- let error = InvoiceError :: from ( Bolt12SemanticError :: MissingPaths ) ;
961
- return ( OffersMessage :: InvoiceError ( error. into ( ) ) , None ) ;
962
- } ,
963
- } ;
1016
+ let payment_paths = self
1017
+ . create_blinded_payment_paths (
1018
+ router,
1019
+ entropy,
1020
+ usable_channels,
1021
+ Some ( amount_msats) ,
1022
+ payment_secret,
1023
+ context,
1024
+ relative_expiry,
1025
+ )
1026
+ . map_err ( |_| Bolt12SemanticError :: MissingPaths ) ?;
964
1027
1028
+ #[ cfg( feature = "std" ) ]
1029
+ let builder = invoice_request. respond_with ( payment_paths, payment_hash) ;
965
1030
#[ cfg( not( feature = "std" ) ) ]
966
- let created_at = Duration :: from_secs ( self . highest_seen_timestamp . load ( Ordering :: Acquire ) as u64 ) ;
1031
+ let builder = invoice_request. respond_with_no_std (
1032
+ payment_paths,
1033
+ payment_hash,
1034
+ Duration :: from_secs ( self . highest_seen_timestamp . load ( Ordering :: Acquire ) as u64 ) ,
1035
+ ) ;
967
1036
968
- let response = match invoice_request {
969
- InvoiceSigningInfo :: DerivedKeys ( request) => {
970
- #[ cfg( feature = "std" ) ]
971
- let builder = request. respond_using_derived_keys ( payment_paths, payment_hash) ;
972
- #[ cfg( not( feature = "std" ) ) ]
973
- let builder = request. respond_using_derived_keys_no_std ( payment_paths, payment_hash, created_at) ;
974
- builder
975
- . map ( InvoiceBuilder :: < DerivedSigningPubkey > :: from)
976
- . and_then ( |builder| builder. allow_mpp ( ) . build_and_sign ( secp_ctx) )
977
- . map_err ( InvoiceError :: from)
978
- } ,
979
- InvoiceSigningInfo :: ExplicitKeys ( request) => {
980
- #[ cfg( feature = "std" ) ]
981
- let builder = request. respond_with ( payment_paths, payment_hash) ;
982
- #[ cfg( not( feature = "std" ) ) ]
983
- let builder = request. respond_with_no_std ( payment_paths, payment_hash, created_at) ;
984
- builder
985
- . map ( InvoiceBuilder :: < ExplicitSigningPubkey > :: from)
986
- . and_then ( |builder| builder. allow_mpp ( ) . build ( ) )
987
- . map_err ( InvoiceError :: from)
988
- . and_then ( |invoice| {
989
- #[ cfg( c_bindings) ]
990
- let mut invoice = invoice;
991
- invoice
992
- . sign ( |invoice : & UnsignedBolt12Invoice | {
993
- signer. sign_bolt12_invoice ( invoice)
994
- } )
995
- . map_err ( InvoiceError :: from)
996
- } )
997
- } ,
998
- } ;
1037
+ let builder = builder. map ( |b| InvoiceBuilder :: from ( b) . allow_mpp ( ) ) ?;
999
1038
1000
- match response {
1001
- Ok ( invoice) => {
1002
- let context =
1003
- MessageContext :: Offers ( OffersContext :: InboundPayment { payment_hash } ) ;
1039
+ let context = MessageContext :: Offers ( OffersContext :: InboundPayment { payment_hash } ) ;
1004
1040
1005
- ( OffersMessage :: Invoice ( invoice) , Some ( context) )
1006
- } ,
1007
- Err ( error) => ( OffersMessage :: InvoiceError ( error. into ( ) ) , None ) ,
1008
- }
1041
+ Ok ( ( builder, context) )
1009
1042
}
1010
1043
1011
1044
/// Enqueues the created [`InvoiceRequest`] to be sent to the counterparty.
@@ -1032,6 +1065,7 @@ where
1032
1065
/// valid reply paths for the counterparty to send back the corresponding [`Bolt12Invoice`]
1033
1066
/// or [`InvoiceError`].
1034
1067
///
1068
+ /// [`InvoiceError`]: crate::offers::invoice_error::InvoiceError
1035
1069
/// [`supports_onion_messages`]: crate::types::features::Features::supports_onion_messages
1036
1070
pub fn enqueue_invoice_request (
1037
1071
& self , invoice_request : InvoiceRequest , payment_id : PaymentId , nonce : Nonce ,
@@ -1077,6 +1111,7 @@ where
1077
1111
/// reply paths for the counterparty to send back the corresponding [`InvoiceError`] if we fail
1078
1112
/// to create blinded reply paths
1079
1113
///
1114
+ /// [`InvoiceError`]: crate::offers::invoice_error::InvoiceError
1080
1115
/// [`supports_onion_messages`]: crate::types::features::Features::supports_onion_messages
1081
1116
pub fn enqueue_invoice (
1082
1117
& self , invoice : Bolt12Invoice , refund : & Refund , peers : Vec < MessageForwardNode > ,
0 commit comments