From 1f0b053872889f5dff340035a9e3cd3488688152 Mon Sep 17 00:00:00 2001 From: Steve Myers Date: Thu, 24 Feb 2022 17:16:25 -0800 Subject: [PATCH 1/2] Fix bin/generate with no features --- src/bin/generate.rs | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/bin/generate.rs b/src/bin/generate.rs index d33a4b8..4734ca2 100644 --- a/src/bin/generate.rs +++ b/src/bin/generate.rs @@ -1,14 +1,13 @@ -use std::env; -use std::fs; -use std::io::Write; -use std::path::Path; +pub const BDK_UDL: &str = "src/bdk.udl"; -const BDK_UDL: &str = "src/bdk.udl"; - -fn fixup_python_lib_path>( +#[cfg(feature = "generate-python")] +fn fixup_python_lib_path>( out_dir: O, lib_name: &str, ) -> Result<(), Box> { + use std::fs; + use std::io::Write; + const LOAD_INDIRECT_DEF: &str = "def loadIndirect():"; let bindings_file = out_dir.as_ref().join("bdk.py"); @@ -40,7 +39,10 @@ def _loadIndirectOld():"#, Ok(()) } +#[cfg(feature = "generate-python")] fn generate_python() -> Result<(), Box> { + use std::env; + let out_path = env::var("GENERATE_PYTHON_BINDINGS_OUT") .map_err(|_| String::from("`GENERATE_PYTHON_BINDINGS_OUT` env variable missing"))?; uniffi_bindgen::generate_bindings(&format!("{}/{}", env!("CARGO_MANIFEST_DIR"), BDK_UDL), None, vec!["python"], Some(&out_path), false)?; @@ -53,5 +55,7 @@ fn generate_python() -> Result<(), Box> { } fn main() -> Result<(), Box> { - generate_python() + #[cfg(feature = "generate-python")] + generate_python()?; + Ok(()) } From c039281ffcbaab8048ff87426a413c953a1e5ece Mon Sep 17 00:00:00 2001 From: Steve Myers Date: Thu, 24 Feb 2022 11:48:19 -0800 Subject: [PATCH 2/2] Add PSBT deserialize and serialize functions, remove details --- src/bdk.udl | 3 +++ src/bin/generate.rs | 8 +++++++- src/lib.rs | 26 +++++++++++++++++--------- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/bdk.udl b/src/bdk.udl index 2b58a78..80fd4cc 100644 --- a/src/bdk.udl +++ b/src/bdk.udl @@ -131,6 +131,9 @@ interface Wallet { interface PartiallySignedBitcoinTransaction { [Throws=BdkError] constructor([ByRef] Wallet wallet, string recipient, u64 amount, float? fee_rate); + [Name=deserialize,Throws=BdkError] + constructor(string psbt_base64); + string serialize(); }; dictionary ExtendedKeyInfo { diff --git a/src/bin/generate.rs b/src/bin/generate.rs index 4734ca2..fc6ecf8 100644 --- a/src/bin/generate.rs +++ b/src/bin/generate.rs @@ -45,7 +45,13 @@ fn generate_python() -> Result<(), Box> { let out_path = env::var("GENERATE_PYTHON_BINDINGS_OUT") .map_err(|_| String::from("`GENERATE_PYTHON_BINDINGS_OUT` env variable missing"))?; - uniffi_bindgen::generate_bindings(&format!("{}/{}", env!("CARGO_MANIFEST_DIR"), BDK_UDL), None, vec!["python"], Some(&out_path), false)?; + uniffi_bindgen::generate_bindings( + &format!("{}/{}", env!("CARGO_MANIFEST_DIR"), BDK_UDL), + None, + vec!["python"], + Some(&out_path), + false, + )?; if let Some(name) = env::var("GENERATE_PYTHON_BINDINGS_FIXUP_LIB_PATH").ok() { fixup_python_lib_path(&out_path, &name)?; diff --git a/src/lib.rs b/src/lib.rs index f8537c9..c92b426 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,7 +12,7 @@ use bdk::keys::bip39::{Language, Mnemonic, WordCount}; use bdk::keys::{DerivableKey, ExtendedKey, GeneratableKey, GeneratedKey}; use bdk::miniscript::BareCtx; use bdk::wallet::AddressIndex; -use bdk::{BlockTime, Error, FeeRate, SignOptions, Wallet as BdkWallet }; +use bdk::{BlockTime, Error, FeeRate, SignOptions, Wallet as BdkWallet}; use std::convert::TryFrom; use std::str::FromStr; use std::sync::{Mutex, MutexGuard}; @@ -155,7 +155,6 @@ impl Progress for BdkProgressHolder { struct PartiallySignedBitcoinTransaction { internal: Mutex, - details: bdk::TransactionDetails, } impl PartiallySignedBitcoinTransaction { @@ -168,7 +167,7 @@ impl PartiallySignedBitcoinTransaction { let wallet = wallet.get_wallet(); match Address::from_str(&recipient) { Ok(address) => { - let (psbt, details) = { + let (psbt, _details) = { let mut builder = wallet.build_tx(); builder.add_recipient(address.script_pubkey(), amount); if let Some(sat_per_vb) = fee_rate { @@ -178,7 +177,6 @@ impl PartiallySignedBitcoinTransaction { }; Ok(PartiallySignedBitcoinTransaction { internal: Mutex::new(psbt), - details, }) } Err(..) => Err(BdkError::Generic( @@ -186,6 +184,18 @@ impl PartiallySignedBitcoinTransaction { )), } } + + pub fn deserialize(psbt_base64: String) -> Result { + let psbt: PartiallySignedTransaction = PartiallySignedTransaction::from_str(&psbt_base64)?; + Ok(PartiallySignedBitcoinTransaction { + internal: Mutex::new(psbt), + }) + } + + pub fn serialize(&self) -> String { + let psbt = self.internal.lock().unwrap().clone(); + psbt.to_string() + } } impl WalletHolder for Wallet { @@ -254,13 +264,11 @@ impl Wallet { .sync(BdkProgressHolder { progress_update }, max_address_param) } - fn broadcast( - &self, - psbt: &PartiallySignedBitcoinTransaction, - ) -> Result { + fn broadcast(&self, psbt: &PartiallySignedBitcoinTransaction) -> Result { let tx = psbt.internal.lock().unwrap().clone().extract_tx(); self.get_wallet().broadcast(&tx)?; - Ok(Transaction::from(&psbt.details)) + let tx_details = self.get_wallet().get_tx(&tx.txid(), true)?; + Ok(Transaction::from(&tx_details.unwrap())) } }