Add sign and broadcast to wallet

This commit is contained in:
Sudarsan Balaji 2021-10-16 20:19:34 +05:30
parent 04eee046cb
commit 4e1c6bd62b
2 changed files with 31 additions and 8 deletions

View File

@ -104,6 +104,10 @@ interface OnlineWallet {
void sync(BdkProgress progress_update, u32? max_address_param);
[Throws=BdkError]
u64 get_balance();
[Throws=BdkError]
void sign([ByRef] PartiallySignedBitcoinTransaction psbt);
[Throws=BdkError]
string broadcast([ByRef] PartiallySignedBitcoinTransaction psbt);
};
interface PartiallySignedBitcoinTransaction {

View File

@ -1,4 +1,3 @@
use bdk::address_validator::AddressValidatorError;
use bdk::bitcoin::util::psbt::PartiallySignedTransaction;
use bdk::bitcoin::{Address, Network};
use bdk::blockchain::any::{AnyBlockchain, AnyBlockchainConfig};
@ -9,7 +8,7 @@ use bdk::blockchain::{
use bdk::database::any::{AnyDatabase, SledDbConfiguration};
use bdk::database::{AnyDatabaseConfig, ConfigurableDatabase};
use bdk::wallet::AddressIndex;
use bdk::{Error, Wallet};
use bdk::{Error, SignOptions, Wallet};
use std::convert::TryFrom;
use std::str::FromStr;
use std::sync::{Mutex, MutexGuard};
@ -114,15 +113,17 @@ impl PartiallySignedBitcoinTransaction {
let wallet = online_wallet.get_wallet();
match Address::from_str(&recipient) {
Ok(address) => {
let mut builder = wallet.build_tx();
builder.add_recipient(address.script_pubkey(), amount);
let (pst, ..) = builder.finish()?;
let (psbt, _) = {
let mut builder = wallet.build_tx();
builder.add_recipient(address.script_pubkey(), amount);
builder.finish()?
};
Ok(PartiallySignedBitcoinTransaction {
internal: Mutex::new(pst),
internal: Mutex::new(psbt),
})
}
Err(..) => Err(BdkError::AddressValidator(
AddressValidatorError::InvalidScript,
Err(..) => Err(BdkError::Generic(
"failed to read wallet address".to_string(),
)),
}
}
@ -190,6 +191,24 @@ impl OnlineWallet {
fn get_balance(&self) -> Result<u64, Error> {
self.wallet.lock().unwrap().get_balance()
}
fn sign<'a>(&self, psbt: &'a PartiallySignedBitcoinTransaction) -> Result<(), Error> {
let mut psbt = psbt.internal.lock().unwrap();
let finalized = self.get_wallet().sign(&mut psbt, SignOptions::default())?;
match finalized {
true => Ok(()),
false => Err(BdkError::Generic(format!(
"transaction signing not finalized {:?}",
psbt
))),
}
}
fn broadcast<'a>(&self, psbt: &'a PartiallySignedBitcoinTransaction) -> Result<String, Error> {
let tx = psbt.internal.lock().unwrap().clone().extract_tx();
let tx_id = self.get_wallet().broadcast(tx)?;
Ok(tx_id.to_string())
}
}
impl WalletHolder<AnyBlockchain> for OnlineWallet {