@@ -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