Add sign and broadcast to wallet
This commit is contained in:
parent
04eee046cb
commit
4e1c6bd62b
@ -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 {
|
||||
|
31
src/lib.rs
31
src/lib.rs
@ -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 (psbt, _) = {
|
||||
let mut builder = wallet.build_tx();
|
||||
builder.add_recipient(address.script_pubkey(), amount);
|
||||
let (pst, ..) = builder.finish()?;
|
||||
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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user