Skip to content

Commit d5df624

Browse files
committed
Add create_funding_transaction method
1 parent 273617a commit d5df624

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

src/access.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,41 @@ where
336336

337337
Ok(())
338338
}
339+
340+
pub(crate) fn create_funding_transaction(
341+
&self, output_script: &Script, value_sats: u64, confirmation_target: ConfirmationTarget,
342+
) -> Result<Transaction, Error> {
343+
let num_blocks = num_blocks_from_conf_target(confirmation_target);
344+
let fee_rate = self.blockchain.estimate_fee(num_blocks)?;
345+
346+
let locked_wallet = self.wallet.lock().unwrap();
347+
let mut tx_builder = locked_wallet.build_tx();
348+
349+
tx_builder.add_recipient(output_script.clone(), value_sats).fee_rate(fee_rate).enable_rbf();
350+
351+
let (mut psbt, _) = tx_builder.finish()?;
352+
log_trace!(self.logger, "Created funding PSBT: {:?}", psbt);
353+
354+
// We double-check that no inputs try to spend non-witness outputs. As we use a SegWit
355+
// wallet descriptor this technically shouldn't ever happen, but better safe than sorry.
356+
for input in &psbt.inputs {
357+
if input.witness_utxo.is_none() {
358+
log_error!(self.logger, "Tried to spend a non-witness funding output. This must not ever happen. Panicking!");
359+
panic!("Tried to spend a non-witness funding output. This must not ever happen.");
360+
}
361+
}
362+
363+
if !locked_wallet.sign(&mut psbt, SignOptions::default())? {
364+
return Err(Error::FundingTxCreationFailed);
365+
}
366+
367+
Ok(psbt.extract_tx())
368+
}
369+
370+
pub(crate) fn get_new_address(&self) -> Result<bitcoin::Address, Error> {
371+
let address_info = self.wallet.lock().unwrap().get_address(AddressIndex::New)?;
372+
Ok(address_info.address)
373+
}
339374
}
340375

341376
struct ConfirmedTx {

0 commit comments

Comments
 (0)