Skip to content

Commit 2ca719b

Browse files
committed
fix: unifying recipients before send
1 parent 5b8d1b1 commit 2ca719b

3 files changed

Lines changed: 31 additions & 21 deletions

File tree

src/commands.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ pub enum OfflineWalletSubCommand {
380380
/// Adds a recipient to the transaction.
381381
// Clap Doesn't support complex vector parsing https://github.com/clap-rs/clap/issues/1704.
382382
// Address and amount parsing is done at run time in handler function.
383-
#[arg(env = "ADDRESS:SAT", long = "to", required = true, value_parser = parse_recipient)]
383+
#[arg(env = "ADDRESS:SAT", long = "to", value_parser = parse_recipient)]
384384
recipients: Vec<(ScriptBuf, u64)>,
385385
#[cfg(feature = "dns_payment")]
386386
/// Adds DNS recipients to the transaction

src/dns_payment_instructions.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ use bitcoin_payment_instructions::{
44
PaymentMethodType, amount, dns_resolver::DNSHrnResolver,
55
};
66
use core::{net::SocketAddr, str::FromStr};
7+
use tokio::time::timeout;
78

8-
use crate::{error::BDKCliError as Error, utils::shorten};
9+
use crate::error::BDKCliError as Error;
910

1011
#[derive(Debug)]
1112
pub struct ResolvedPaymentInfo {
@@ -24,7 +25,7 @@ impl ResolvedPaymentInfo {
2425
.iter()
2526
.map(|pm| match pm {
2627
PaymentMethod::LightningBolt11(bolt11) => {
27-
format!("Bolt 11 invoice ({})", shorten(bolt11, 20, 15))
28+
format!("Bolt 11 invoice ({})", bolt11)
2829
}
2930
PaymentMethod::LightningBolt12(offer) => format!("Bolt 12 invoice ({})", offer),
3031
PaymentMethod::OnChain(address) => format!("On chain ({})", address),
@@ -58,7 +59,12 @@ pub(crate) async fn parse_dns_instructions(
5859
ParseError::HrnResolutionError("Unable to create socket from provided address")
5960
})?;
6061
let resolver = DNSHrnResolver(sock_addr);
61-
let instructions = PaymentInstructions::parse(hrn, network, &resolver, true).await?;
62+
let instructions = timeout(
63+
std::time::Duration::from_secs(30),
64+
PaymentInstructions::parse(hrn, network, &resolver, true),
65+
)
66+
.await
67+
.map_err(|_| ParseError::HrnResolutionError("Resolution request timed out"))??;
6268
Ok((resolver, instructions))
6369
}
6470

src/handlers.rs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,7 @@ pub async fn handle_offline_wallet_subcommand(
529529
}
530530
}
531531
CreateTx {
532-
recipients,
532+
mut recipients,
533533
#[cfg(feature = "dns_payment")]
534534
dns_recipients,
535535
#[cfg(feature = "dns_payment")]
@@ -547,28 +547,32 @@ pub async fn handle_offline_wallet_subcommand(
547547
} => {
548548
let mut tx_builder = wallet.build_tx();
549549

550+
#[cfg(feature = "dns_payment")]
551+
for recipient in dns_recipients {
552+
log::info!("Resolving DNS instructions for recipient {}", recipient.0);
553+
let amount = Amount::from_sat(recipient.1);
554+
let (resolver, instructions) =
555+
parse_dns_instructions(&recipient.0, cli_opts.network, &dns_resolver)
556+
.await
557+
.map_err(|e| Error::Generic(format!("Parsing error occured {e:#?}")))?;
558+
let payment = process_instructions(amount, &instructions, resolver).await?;
559+
560+
recipients.push((payment.0.into(), payment.1.to_sat()));
561+
}
562+
563+
if recipients.is_empty() {
564+
return Err(Error::Generic(
565+
"Either --to or --to_dns parameters must be specified".to_string(),
566+
));
567+
}
568+
550569
if send_all {
551570
tx_builder.drain_wallet().drain_to(recipients[0].0.clone());
552571
} else {
553-
#[allow(unused_mut)]
554-
let mut recipients: Vec<_> = recipients
572+
let recipients: Vec<_> = recipients
555573
.into_iter()
556574
.map(|(script, amount)| (script, Amount::from_sat(amount)))
557575
.collect();
558-
559-
#[cfg(feature = "dns_payment")]
560-
for recipient in dns_recipients {
561-
println!("Resolving DNS instructions for recipient {}", recipient.0);
562-
let amount = Amount::from_sat(recipient.1);
563-
let (resolver, instructions) =
564-
parse_dns_instructions(&recipient.0, cli_opts.network, &dns_resolver)
565-
.await
566-
.map_err(|e| Error::Generic(format!("Parsing error occured {e:#?}")))?;
567-
let payment = process_instructions(amount, &instructions, resolver).await?;
568-
569-
recipients.push((payment.0.into(), payment.1));
570-
}
571-
572576
tx_builder.set_recipients(recipients);
573577
}
574578

0 commit comments

Comments
 (0)