Skip to content

Commit 0690996

Browse files
committed
f DRY up onchain sending/draining
1 parent fde2fe9 commit 0690996

File tree

2 files changed

+35
-65
lines changed

2 files changed

+35
-65
lines changed

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -850,7 +850,7 @@ impl Node {
850850
log_error!(self.logger, "Unable to send payment due to insufficient funds.");
851851
return Err(Error::InsufficientFunds);
852852
}
853-
self.wallet.send_to_address(address, amount_sats)
853+
self.wallet.send_to_address(address, Some(amount_sats))
854854
}
855855

856856
/// Send an on-chain payment to the given address, draining all the available funds.
@@ -860,7 +860,7 @@ impl Node {
860860
return Err(Error::NotRunning);
861861
}
862862

863-
self.wallet.drain_to_address(address)
863+
self.wallet.send_to_address(address, None)
864864
}
865865

866866
/// Retrieve a list of known channels.

src/wallet.rs

Lines changed: 33 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,12 @@ where
208208
Ok(self.inner.lock().unwrap().get_balance()?)
209209
}
210210

211+
/// Send funds to the given address.
212+
///
213+
/// If `amount_msat_or_drain` is `None` the wallet will be drained, i.e., all available funds will be
214+
/// spent.
211215
pub(crate) fn send_to_address(
212-
&self, address: &bitcoin::Address, amount_sats: u64,
216+
&self, address: &bitcoin::Address, amount_msat_or_drain: Option<u64>,
213217
) -> Result<Txid, Error> {
214218
let confirmation_target = ConfirmationTarget::Normal;
215219
let fee_rate = self.estimate_fee_rate(confirmation_target);
@@ -218,63 +222,18 @@ where
218222
let locked_wallet = self.inner.lock().unwrap();
219223
let mut tx_builder = locked_wallet.build_tx();
220224

221-
tx_builder
222-
.add_recipient(address.script_pubkey(), amount_sats)
223-
.fee_rate(fee_rate)
224-
.enable_rbf();
225-
226-
let mut psbt = match tx_builder.finish() {
227-
Ok((psbt, _)) => {
228-
log_trace!(self.logger, "Created PSBT: {:?}", psbt);
229-
psbt
230-
}
231-
Err(err) => {
232-
log_error!(self.logger, "Failed to create transaction: {}", err);
233-
return Err(err.into());
234-
}
235-
};
236-
237-
match locked_wallet.sign(&mut psbt, SignOptions::default()) {
238-
Ok(finalized) => {
239-
if !finalized {
240-
return Err(Error::OnchainTxCreationFailed);
241-
}
242-
}
243-
Err(err) => {
244-
log_error!(self.logger, "Failed to create transaction: {}", err);
245-
return Err(err.into());
246-
}
225+
if let Some(amount_sats) = amount_msat_or_drain {
226+
tx_builder
227+
.add_recipient(address.script_pubkey(), amount_sats)
228+
.fee_rate(fee_rate)
229+
.enable_rbf();
230+
} else {
231+
tx_builder
232+
.drain_wallet()
233+
.drain_to(address.script_pubkey())
234+
.fee_rate(fee_rate)
235+
.enable_rbf();
247236
}
248-
psbt.extract_tx()
249-
};
250-
251-
self.broadcast_transaction(&tx);
252-
253-
let txid = tx.txid();
254-
log_info!(
255-
self.logger,
256-
"Created new transaction {} sending {}sats on-chain to address {}",
257-
txid,
258-
amount_sats,
259-
address
260-
);
261-
262-
Ok(txid)
263-
}
264-
265-
pub(crate) fn drain_to_address(&self, address: &bitcoin::Address) -> Result<Txid, Error> {
266-
let confirmation_target = ConfirmationTarget::Normal;
267-
let fee_rate = self.estimate_fee_rate(confirmation_target);
268-
269-
let tx = {
270-
let locked_wallet = self.inner.lock().unwrap();
271-
let mut tx_builder = locked_wallet.build_tx();
272-
273-
tx_builder
274-
.drain_wallet()
275-
.drain_to(address.script_pubkey())
276-
.fee_rate(fee_rate)
277-
.enable_rbf();
278237

279238
let mut psbt = match tx_builder.finish() {
280239
Ok((psbt, _)) => {
@@ -304,12 +263,23 @@ where
304263
self.broadcast_transaction(&tx);
305264

306265
let txid = tx.txid();
307-
log_info!(
308-
self.logger,
309-
"Created new transaction {} sending all available on-chain funds to address {}",
310-
txid,
311-
address
312-
);
266+
267+
if let Some(amount_sats) = amount_msat_or_drain {
268+
log_info!(
269+
self.logger,
270+
"Created new transaction {} sending {}sats on-chain to address {}",
271+
txid,
272+
amount_sats,
273+
address
274+
);
275+
} else {
276+
log_info!(
277+
self.logger,
278+
"Created new transaction {} sending all available on-chain funds to address {}",
279+
txid,
280+
address
281+
);
282+
}
313283

314284
Ok(txid)
315285
}

0 commit comments

Comments
 (0)