From 8f5ca7f0fcb2e1804fce157f43fb3af8f806ceb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Wed, 8 Jun 2022 15:02:29 +0200 Subject: [PATCH 1/4] Add Wallet list_unspent method --- src/bdk.udl | 24 +++++++++++++++++++++++ src/lib.rs | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/src/bdk.udl b/src/bdk.udl index 39bdf12..e9d1d24 100644 --- a/src/bdk.udl +++ b/src/bdk.udl @@ -149,6 +149,27 @@ 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; +}; + interface Wallet { [Throws=BdkError] constructor(string descriptor, string? change_descriptor, Network network, DatabaseConfig database_config); @@ -169,6 +190,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 0e49d29..54b749d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -172,6 +172,57 @@ struct Wallet { wallet_mutex: Mutex>, } +pub struct OutPoint { + txid: String, + vout: u32, +} + +pub struct TxOut { + value: u64, + address: String, +} + +pub enum KeychainKind { + External = 0, + Internal = 1, +} + +impl From for KeychainKind { + fn from(x: bdk::KeychainKind) -> KeychainKind { + match x { + bdk::KeychainKind::External => KeychainKind::External, + bdk::KeychainKind::Internal => KeychainKind::Internal, + } + } +} + +pub struct LocalUtxo { + outpoint: OutPoint, + txout: TxOut, + keychain: KeychainKind, +} + +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: KeychainKind::from(x.keychain), + } + } +} + pub trait Progress: Send + Sync + 'static { fn update(&self, progress: f32, message: Option); } @@ -283,6 +334,11 @@ 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 { From 28a9b302d593a04c75dd6a0ec415746079d5739a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Sat, 18 Jun 2022 15:38:39 +0200 Subject: [PATCH 2/4] Post review changes --- src/bdk.udl | 1 + src/lib.rs | 35 ++++++++++++++++------------------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/bdk.udl b/src/bdk.udl index e9d1d24..54952ef 100644 --- a/src/bdk.udl +++ b/src/bdk.udl @@ -168,6 +168,7 @@ dictionary LocalUtxo { OutPoint outpoint; TxOut txout; KeychainKind keychain; + boolean is_spent; }; interface Wallet { diff --git a/src/lib.rs b/src/lib.rs index 54b749d..fd2a7ed 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; @@ -182,27 +183,15 @@ pub struct TxOut { address: String, } -pub enum KeychainKind { - External = 0, - Internal = 1, -} - -impl From for KeychainKind { - fn from(x: bdk::KeychainKind) -> KeychainKind { - match x { - bdk::KeychainKind::External => KeychainKind::External, - bdk::KeychainKind::Internal => KeychainKind::Internal, - } - } -} - pub struct LocalUtxo { outpoint: OutPoint, txout: TxOut, keychain: KeychainKind, + is_spent: bool, } -trait NetworkLocalUtxo: { +/// Trait used to convert a script to an address using the wallet network +trait NetworkLocalUtxo { fn from_utxo(x: &bdk::LocalUtxo, network: Network) -> LocalUtxo; } @@ -216,9 +205,14 @@ impl NetworkLocalUtxo for LocalUtxo { txout: TxOut { value: x.txout.value, address: bdk::bitcoin::util::address::Address::from_script( - &x.txout.script_pubkey, network).unwrap().to_string(), + &x.txout.script_pubkey, + network, + ) + .unwrap() + .to_string(), }, - keychain: KeychainKind::from(x.keychain), + keychain: x.keychain, + is_spent: x.is_spent, } } } @@ -337,7 +331,10 @@ impl Wallet { 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()) + Ok(unspents + .iter() + .map(|u| LocalUtxo::from_utxo(u, self.get_network())) + .collect()) } } From fad5e3cefdfec2e396928b8621e96407570b3fc4 Mon Sep 17 00:00:00 2001 From: thunderbiscuit Date: Wed, 22 Jun 2022 14:48:56 -0300 Subject: [PATCH 3/4] Fix comment for NetworkLocalUtxo trait --- src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index fd2a7ed..e33b516 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -190,7 +190,8 @@ pub struct LocalUtxo { is_spent: bool, } -/// Trait used to convert a script to an address using the wallet network +// 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; } From 2ac42b3ae0a128e15ae9fa933939b8cfc37c38df Mon Sep 17 00:00:00 2001 From: thunderbiscuit Date: Tue, 12 Jul 2022 12:05:31 -0400 Subject: [PATCH 4/4] Add list_unspent and add_data methods to changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fd92ba..ba39b03 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