@@ -26,7 +26,7 @@ use std::vec::IntoIter;
2626
2727use lightning:: ln:: channelmanager:: PaymentId ;
2828use lightning:: offers:: offer:: Offer ;
29- use lightning:: onion_message:: dns_resolution:: HumanReadableName ;
29+ use lightning:: onion_message:: dns_resolution:: HumanReadableName as LdkHumanReadableName ;
3030use lightning_invoice:: { Bolt11Invoice , Bolt11InvoiceDescription , Description } ;
3131
3232use bip21:: de:: ParamKind ;
@@ -40,6 +40,11 @@ use tokio::time::timeout;
4040
4141type Uri < ' a > = bip21:: Uri < ' a , NetworkChecked , Extras > ;
4242
43+ #[ cfg( not( feature = "uniffi" ) ) ]
44+ type HumanReadableName = LdkHumanReadableName ;
45+ #[ cfg( feature = "uniffi" ) ]
46+ type HumanReadableName = Arc < crate :: ffi:: HumanReadableName > ;
47+
4348#[ derive( Debug , Clone ) ]
4449struct Extras {
4550 bolt11_invoice : Option < Bolt11Invoice > ,
@@ -162,18 +167,39 @@ impl UnifiedPayment {
162167 Error :: HrnResolverNotConfigured
163168 } ) ?;
164169
165- println ! ( "Parsing instructions..." ) ;
170+ const TIMEOUT_DURATION : Duration = Duration :: from_secs ( 30 ) ;
166171
167- let instructions =
168- PaymentInstructions :: parse ( uri_str, self . config . network , resolver. as_ref ( ) , false )
169- . await
170- . map_err ( |e| {
171- log_error ! ( self . logger, "Failed to parse payment instructions: {:?}" , e) ;
172- println ! ( "Failed to parse payment instructions: {:?}" , e) ;
173- Error :: UriParameterParsingFailed
174- } ) ?;
172+ let target_network;
173+
174+ if let Ok ( hrn) = LdkHumanReadableName :: from_encoded ( uri_str) {
175+ let hrn: HumanReadableName = maybe_wrap ( hrn. clone ( ) ) ;
175176
176- println ! ( "Sending..." ) ;
177+ target_network =
178+ match crate :: dnssec_testing_utils:: get_testing_offer_override ( Some ( hrn. clone ( ) ) ) {
179+ Some ( _) => bitcoin:: Network :: Bitcoin ,
180+ _ => self . config . network ,
181+ } ;
182+ } else {
183+ target_network = self . config . network ;
184+ } ;
185+
186+ let instructions = timeout (
187+ TIMEOUT_DURATION ,
188+ PaymentInstructions :: parse ( uri_str, target_network, resolver. as_ref ( ) , false ) ,
189+ )
190+ . await
191+ . map_err ( |_| {
192+ log_error ! (
193+ self . logger,
194+ "Payment instruction parsing timed out after {:?}" ,
195+ TIMEOUT_DURATION
196+ ) ;
197+ Error :: TimeoutOccurred
198+ } ) ?
199+ . map_err ( |e| {
200+ log_error ! ( self . logger, "Failed to parse payment instructions: {:?}" , e) ;
201+ Error :: UriParameterParsingFailed
202+ } ) ?;
177203
178204 let resolved = match instructions {
179205 PaymentInstructions :: ConfigurableAmount ( instr) => {
@@ -208,7 +234,7 @@ impl UnifiedPayment {
208234 {
209235 let offer = maybe_wrap ( offer. clone ( ) ) ;
210236
211- let payment_result = if let Ok ( hrn) = HumanReadableName :: from_encoded ( uri_str) {
237+ let payment_result = if let Ok ( hrn) = LdkHumanReadableName :: from_encoded ( uri_str) {
212238 let hrn = maybe_wrap ( hrn. clone ( ) ) ;
213239 self . bolt12_payment . send_using_amount ( & offer, amount_msat. unwrap_or ( 0 ) , None , None , Some ( hrn) )
214240 } else if let Some ( amount_msat) = amount_msat {
0 commit comments