diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fd92ba8..ba39b03d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +- APIs Added + - `TxBuilder.add_data(data: Vec)` + - `Wallet.list_unspent()` returns `Vec` + ## [v0.7.0] - Update BDK to version 0.19.0 diff --git a/src/bdk.udl b/src/bdk.udl index 39bdf12b..54952ef0 100644 --- a/src/bdk.udl +++ b/src/bdk.udl @@ -149,6 +149,28 @@ callback interface Progress { void update(f32 progress, string? message); }; +dictionary OutPoint { + string txid; + u32 vout; +}; + +dictionary TxOut { + u64 value; + string address; +}; + +enum KeychainKind { + "External", + "Internal", +}; + +dictionary LocalUtxo { + OutPoint outpoint; + TxOut txout; + KeychainKind keychain; + boolean is_spent; +}; + interface Wallet { [Throws=BdkError] constructor(string descriptor, string? change_descriptor, Network network, DatabaseConfig database_config); @@ -169,6 +191,9 @@ interface Wallet { [Throws=BdkError] void sync([ByRef] Blockchain blockchain, Progress? progress); + + [Throws=BdkError] + sequence list_unspent(); }; interface PartiallySignedBitcoinTransaction { diff --git a/src/lib.rs b/src/lib.rs index 0e49d29a..e33b516e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -15,7 +15,8 @@ use bdk::miniscript::BareCtx; use bdk::wallet::AddressIndex as BdkAddressIndex; use bdk::wallet::AddressInfo as BdkAddressInfo; use bdk::{ - BlockTime, Error, FeeRate, SignOptions, SyncOptions as BdkSyncOptions, Wallet as BdkWallet, + BlockTime, Error, FeeRate, KeychainKind, SignOptions, SyncOptions as BdkSyncOptions, + Wallet as BdkWallet, }; use std::convert::{From, TryFrom}; use std::fmt; @@ -172,6 +173,51 @@ struct Wallet { wallet_mutex: Mutex>, } +pub struct OutPoint { + txid: String, + vout: u32, +} + +pub struct TxOut { + value: u64, + address: String, +} + +pub struct LocalUtxo { + outpoint: OutPoint, + txout: TxOut, + keychain: KeychainKind, + is_spent: bool, +} + +// This trait is used to convert the bdk TxOut type with field `script_pubkey: Script` +// into the bdk-ffi TxOut type which has a field `address: String` instead +trait NetworkLocalUtxo { + fn from_utxo(x: &bdk::LocalUtxo, network: Network) -> LocalUtxo; +} + +impl NetworkLocalUtxo for LocalUtxo { + fn from_utxo(x: &bdk::LocalUtxo, network: Network) -> LocalUtxo { + LocalUtxo { + outpoint: OutPoint { + txid: x.outpoint.txid.to_string(), + vout: x.outpoint.vout, + }, + txout: TxOut { + value: x.txout.value, + address: bdk::bitcoin::util::address::Address::from_script( + &x.txout.script_pubkey, + network, + ) + .unwrap() + .to_string(), + }, + keychain: x.keychain, + is_spent: x.is_spent, + } + } +} + pub trait Progress: Send + Sync + 'static { fn update(&self, progress: f32, message: Option); } @@ -283,6 +329,14 @@ impl Wallet { let transactions = self.get_wallet().list_transactions(true)?; Ok(transactions.iter().map(Transaction::from).collect()) } + + fn list_unspent(&self) -> Result, Error> { + let unspents = self.get_wallet().list_unspent()?; + Ok(unspents + .iter() + .map(|u| LocalUtxo::from_utxo(u, self.get_network())) + .collect()) + } } pub struct ExtendedKeyInfo {