@@ -208,8 +208,12 @@ where
208
208
Ok ( self . inner . lock ( ) . unwrap ( ) . get_balance ( ) ?)
209
209
}
210
210
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.
211
215
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 > ,
213
217
) -> Result < Txid , Error > {
214
218
let confirmation_target = ConfirmationTarget :: Normal ;
215
219
let fee_rate = self . estimate_fee_rate ( confirmation_target) ;
@@ -218,63 +222,18 @@ where
218
222
let locked_wallet = self . inner . lock ( ) . unwrap ( ) ;
219
223
let mut tx_builder = locked_wallet. build_tx ( ) ;
220
224
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 ( ) ;
247
236
}
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 ( ) ;
278
237
279
238
let mut psbt = match tx_builder. finish ( ) {
280
239
Ok ( ( psbt, _) ) => {
@@ -304,12 +263,23 @@ where
304
263
self . broadcast_transaction ( & tx) ;
305
264
306
265
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
+ }
313
283
314
284
Ok ( txid)
315
285
}
0 commit comments