diff --git a/src/bdk.udl b/src/bdk.udl index 0283237..6bc08b0 100644 --- a/src/bdk.udl +++ b/src/bdk.udl @@ -105,3 +105,8 @@ interface OnlineWallet { [Throws=BdkError] u64 get_balance(); }; + +interface PartiallySignedBitcoinTransaction { + [Throws=BdkError] + constructor([ByRef] OnlineWallet wallet, string recipient, u64 amount); +}; diff --git a/src/lib.rs b/src/lib.rs index 9bd5669..99f50ed 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,6 @@ -use bdk::bitcoin::Network; +use bdk::address_validator::AddressValidatorError; +use bdk::bitcoin::util::psbt::PartiallySignedTransaction; +use bdk::bitcoin::{Address, Network}; use bdk::blockchain::any::{AnyBlockchain, AnyBlockchainConfig}; use bdk::blockchain::Progress; use bdk::blockchain::{ @@ -7,9 +9,9 @@ use bdk::blockchain::{ use bdk::database::any::{AnyDatabase, SledDbConfiguration}; use bdk::database::{AnyDatabaseConfig, ConfigurableDatabase}; use bdk::wallet::AddressIndex; -use bdk::Error; -use bdk::Wallet; +use bdk::{Error, Wallet}; use std::convert::TryFrom; +use std::str::FromStr; use std::sync::{Mutex, MutexGuard}; uniffi_macros::include_scaffolding!("bdk"); @@ -103,6 +105,29 @@ impl Progress for BdkProgressHolder { } } +struct PartiallySignedBitcoinTransaction { + internal: Mutex, +} + +impl PartiallySignedBitcoinTransaction { + fn new(online_wallet: &OnlineWallet, recipient: String, amount: u64) -> Result { + 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()?; + Ok(PartiallySignedBitcoinTransaction { + internal: Mutex::new(pst), + }) + } + Err(..) => Err(BdkError::AddressValidator( + AddressValidatorError::InvalidScript, + )), + } + } +} + impl OnlineWallet { fn new( descriptor: String,