diff --git a/src/lib.rs b/src/lib.rs index 8499900..0e49d29 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -331,13 +331,13 @@ fn to_script_pubkey(address: &str) -> Result { .map_err(|e| BdkError::Generic(e.to_string())) } -#[derive(Clone)] +#[derive(Clone, Debug)] enum RbfValue { Default, Value(u32), } -#[derive(Clone)] +#[derive(Clone, Debug)] struct TxBuilder { recipients: Vec<(String, u64)>, fee_rate: Option, @@ -505,3 +505,70 @@ impl BumpFeeTxBuilder { } uniffi::deps::static_assertions::assert_impl_all!(Wallet: Sync, Send); + +// The goal of these tests to to ensure `bdk-ffi` intermediate code correctly calls `bdk` APIs. +// These tests should not be used to verify `bdk` behavior that is already tested in the `bdk` +// crate. +#[cfg(test)] +mod test { + use crate::{TxBuilder, Wallet}; + use bdk::bitcoin::Address; + use bdk::bitcoin::Network::Testnet; + use bdk::wallet::get_funded_wallet; + use std::str::FromStr; + use std::sync::Mutex; + + #[test] + fn test_drain_wallet() { + let test_wpkh = "wpkh(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW)"; + let (funded_wallet, _, _) = get_funded_wallet(test_wpkh); + let test_wallet = Wallet { + wallet_mutex: Mutex::new(funded_wallet), + }; + let drain_to_address = "tb1ql7w62elx9ucw4pj5lgw4l028hmuw80sndtntxt".to_string(); + let tx_builder = TxBuilder::new() + .drain_wallet() + .drain_to(drain_to_address.clone()); + //dbg!(&tx_builder); + assert_eq!(tx_builder.drain_wallet, true); + assert_eq!(tx_builder.drain_to, Some(drain_to_address)); + + let psbt = tx_builder.finish(&test_wallet).unwrap(); + let psbt = psbt.internal.lock().unwrap().clone(); + + // confirm one input with 50,000 sats + assert_eq!(psbt.inputs.len(), 1); + let input_value = psbt + .inputs + .get(0) + .cloned() + .unwrap() + .non_witness_utxo + .unwrap() + .output + .get(0) + .unwrap() + .value; + assert_eq!(input_value, 50_000 as u64); + + // confirm one output to correct address with all sats - fee + assert_eq!(psbt.outputs.len(), 1); + let output_address = Address::from_script( + &psbt + .unsigned_tx + .output + .get(0) + .cloned() + .unwrap() + .script_pubkey, + Testnet, + ) + .unwrap(); + assert_eq!( + output_address, + Address::from_str("tb1ql7w62elx9ucw4pj5lgw4l028hmuw80sndtntxt").unwrap() + ); + let output_value = psbt.unsigned_tx.output.get(0).cloned().unwrap().value; + assert_eq!(output_value, 49_890 as u64); // input - fee + } +}