From c074a92e0c6830320919197ad0246df7b783de34 Mon Sep 17 00:00:00 2001 From: thunderbiscuit Date: Fri, 8 Apr 2022 14:20:28 -0400 Subject: [PATCH 1/3] Add address index to return type of get_last_unused_address --- src/bdk.udl | 7 ++++++- src/lib.rs | 26 +++++++++++++++++++++----- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/bdk.udl b/src/bdk.udl index 46a1ead..e9fa4f4 100644 --- a/src/bdk.udl +++ b/src/bdk.udl @@ -49,6 +49,11 @@ enum BdkError { "Rusqlite", }; +dictionary AddressInformation { + u32 index; + string address; +}; + enum Network { "Bitcoin", "Testnet", @@ -127,7 +132,7 @@ interface Wallet { [Throws=BdkError] constructor(string descriptor, string? change_descriptor, Network network, DatabaseConfig database_config); string get_new_address(); - string get_last_unused_address(); + AddressInformation get_last_unused_address(); [Throws=BdkError] u64 get_balance(); [Throws=BdkError] diff --git a/src/lib.rs b/src/lib.rs index 7b58ddb..31e8553 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,6 +13,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::wallet::AddressInfo; use bdk::{ BlockTime, Error, FeeRate, SignOptions, SyncOptions as BdkSyncOptions, Wallet as BdkWallet, }; @@ -26,6 +27,11 @@ uniffi_macros::include_scaffolding!("bdk"); type BdkError = Error; +pub struct AddressInformation { + pub index: u32, + pub address: String, +} + pub enum DatabaseConfig { Memory, Sled { config: SledDbConfiguration }, @@ -243,12 +249,22 @@ impl Wallet { .to_string() } - fn get_last_unused_address(&self) -> String { - self.get_wallet() + // fn get_last_unused_address(&self) -> String { + // self.get_wallet() + // .get_address(AddressIndex::LastUnused) + // .unwrap() + // .address + // .to_string() + // } + + fn get_last_unused_address(&self) -> AddressInformation { + let address_info = self.get_wallet() .get_address(AddressIndex::LastUnused) - .unwrap() - .address - .to_string() + .unwrap(); + return AddressInformation { + index: address_info.index, + address: address_info.address.to_string() + } } fn get_balance(&self) -> Result { From 04d538ad459e764178757471137aaef411130667 Mon Sep 17 00:00:00 2001 From: thunderbiscuit Date: Tue, 19 Apr 2022 14:30:12 -0400 Subject: [PATCH 2/3] Add get_address method on the wallet --- .gitignore | 1 + src/bdk.udl | 10 +++++--- src/lib.rs | 74 ++++++++++++++++++++++++++++++++++------------------- 3 files changed, 56 insertions(+), 29 deletions(-) diff --git a/.gitignore b/.gitignore index 757510a..c91c338 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ testdb xcuserdata .lsp .clj-kondo +.idea/ diff --git a/src/bdk.udl b/src/bdk.udl index e9fa4f4..2253ca2 100644 --- a/src/bdk.udl +++ b/src/bdk.udl @@ -49,11 +49,16 @@ enum BdkError { "Rusqlite", }; -dictionary AddressInformation { +dictionary AddressInfo { u32 index; string address; }; +enum AddressIndex { + "New", + "LastUnused", +}; + enum Network { "Bitcoin", "Testnet", @@ -131,8 +136,7 @@ callback interface Progress { interface Wallet { [Throws=BdkError] constructor(string descriptor, string? change_descriptor, Network network, DatabaseConfig database_config); - string get_new_address(); - AddressInformation get_last_unused_address(); + AddressInfo get_address(AddressIndex address_index); [Throws=BdkError] u64 get_balance(); [Throws=BdkError] diff --git a/src/lib.rs b/src/lib.rs index 31e8553..43446e2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,12 +12,11 @@ use bdk::database::{AnyDatabaseConfig, ConfigurableDatabase}; use bdk::keys::bip39::{Language, Mnemonic, WordCount}; use bdk::keys::{DerivableKey, ExtendedKey, GeneratableKey, GeneratedKey}; use bdk::miniscript::BareCtx; -use bdk::wallet::AddressIndex; -use bdk::wallet::AddressInfo; use bdk::{ BlockTime, Error, FeeRate, SignOptions, SyncOptions as BdkSyncOptions, Wallet as BdkWallet, }; use std::convert::TryFrom; +use std::convert::From; use std::fmt; use std::ops::Deref; use std::str::FromStr; @@ -27,11 +26,39 @@ uniffi_macros::include_scaffolding!("bdk"); type BdkError = Error; -pub struct AddressInformation { +// we redefine a simpler version of bdk::wallet::AddressInfo +// it has an `address` field of type String +// instead of the `address` field of type `Address` defined in bitcoin::util::address::Address +pub struct AddressInfo { pub index: u32, pub address: String, } +impl From for AddressInfo { + fn from(x: bdk::wallet::AddressInfo) -> AddressInfo { + AddressInfo { + index: x.index, + address: x.address.to_string() + } + } +} + +// we redefine a simpler version of bdk::wallet::AddressIndex +// only keeping the `New` and `LastUnused` variants of the enum +pub enum AddressIndex { + New, + LastUnused, +} + +impl From for bdk::wallet::AddressIndex { + fn from(x: AddressIndex) -> bdk::wallet::AddressIndex { + match x { + AddressIndex::New => bdk::wallet::AddressIndex::New, + AddressIndex::LastUnused => bdk::wallet::AddressIndex::LastUnused + } + } +} + pub enum DatabaseConfig { Memory, Sled { config: SledDbConfiguration }, @@ -241,32 +268,27 @@ impl Wallet { self.get_wallet().sync(blockchain.deref(), bdk_sync_opts) } - fn get_new_address(&self) -> String { - self.get_wallet() - .get_address(AddressIndex::New) - .unwrap() - .address - .to_string() - } - - // fn get_last_unused_address(&self) -> String { - // self.get_wallet() - // .get_address(AddressIndex::LastUnused) - // .unwrap() - // .address - // .to_string() - // } - - fn get_last_unused_address(&self) -> AddressInformation { - let address_info = self.get_wallet() - .get_address(AddressIndex::LastUnused) - .unwrap(); - return AddressInformation { - index: address_info.index, - address: address_info.address.to_string() + fn get_address(&self, address_index: AddressIndex) -> Result { + match self.get_wallet().get_address(bdk::wallet::AddressIndex::from(address_index)) { + Ok(address_info) => Ok(AddressInfo::from(address_info)), + Err(bdk_error) => Err(bdk_error), } } + // fn get_new_address(&self) -> Result { + // match self.get_wallet().get_address(AddressIndex::New) { + // Ok(address_info) => Ok(AddressInformation::from(address_info)), + // Err(BdkError) => Err(BdkError), + // } + // } + + // fn get_last_unused_address(&self) -> Result { + // match self.get_wallet().get_address(AddressIndex::LastUnused) { + // Ok(address_info) => Ok(AddressInformation::from(address_info)), + // Err(BdkError) => Err(BdkError), + // } + // } + fn get_balance(&self) -> Result { self.get_wallet().get_balance() } From 6beb98ca4c463443e1b846d46141e599972eeff3 Mon Sep 17 00:00:00 2001 From: thunderbiscuit Date: Mon, 16 May 2022 12:07:11 -0400 Subject: [PATCH 3/3] Incorporate PR review fixes --- src/bdk.udl | 1 + src/lib.rs | 41 +++++++++++------------------------------ 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/src/bdk.udl b/src/bdk.udl index 2253ca2..0f9d579 100644 --- a/src/bdk.udl +++ b/src/bdk.udl @@ -136,6 +136,7 @@ callback interface Progress { interface Wallet { [Throws=BdkError] constructor(string descriptor, string? change_descriptor, Network network, DatabaseConfig database_config); + [Throws=BdkError] AddressInfo get_address(AddressIndex address_index); [Throws=BdkError] u64 get_balance(); diff --git a/src/lib.rs b/src/lib.rs index 43446e2..a001e87 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,12 +11,13 @@ use bdk::database::any::{AnyDatabase, SledDbConfiguration, SqliteDbConfiguration use bdk::database::{AnyDatabaseConfig, ConfigurableDatabase}; use bdk::keys::bip39::{Language, Mnemonic, WordCount}; use bdk::keys::{DerivableKey, ExtendedKey, GeneratableKey, GeneratedKey}; +use bdk::wallet::AddressInfo as BdkAddressInfo; +use bdk::wallet::AddressIndex as BdkAddressIndex; use bdk::miniscript::BareCtx; +use std::convert::{TryFrom, From}; use bdk::{ BlockTime, Error, FeeRate, SignOptions, SyncOptions as BdkSyncOptions, Wallet as BdkWallet, }; -use std::convert::TryFrom; -use std::convert::From; use std::fmt; use std::ops::Deref; use std::str::FromStr; @@ -26,15 +27,12 @@ uniffi_macros::include_scaffolding!("bdk"); type BdkError = Error; -// we redefine a simpler version of bdk::wallet::AddressInfo -// it has an `address` field of type String -// instead of the `address` field of type `Address` defined in bitcoin::util::address::Address pub struct AddressInfo { pub index: u32, pub address: String, } -impl From for AddressInfo { +impl From for AddressInfo { fn from(x: bdk::wallet::AddressInfo) -> AddressInfo { AddressInfo { index: x.index, @@ -43,18 +41,16 @@ impl From for AddressInfo { } } -// we redefine a simpler version of bdk::wallet::AddressIndex -// only keeping the `New` and `LastUnused` variants of the enum pub enum AddressIndex { New, LastUnused, } -impl From for bdk::wallet::AddressIndex { - fn from(x: AddressIndex) -> bdk::wallet::AddressIndex { +impl From for BdkAddressIndex { + fn from(x: AddressIndex) -> BdkAddressIndex { match x { - AddressIndex::New => bdk::wallet::AddressIndex::New, - AddressIndex::LastUnused => bdk::wallet::AddressIndex::LastUnused + AddressIndex::New => BdkAddressIndex::New, + AddressIndex::LastUnused => BdkAddressIndex::LastUnused } } } @@ -269,26 +265,11 @@ impl Wallet { } fn get_address(&self, address_index: AddressIndex) -> Result { - match self.get_wallet().get_address(bdk::wallet::AddressIndex::from(address_index)) { - Ok(address_info) => Ok(AddressInfo::from(address_info)), - Err(bdk_error) => Err(bdk_error), - } + self.get_wallet() + .get_address(address_index.into()) + .map(AddressInfo::from) } - // fn get_new_address(&self) -> Result { - // match self.get_wallet().get_address(AddressIndex::New) { - // Ok(address_info) => Ok(AddressInformation::from(address_info)), - // Err(BdkError) => Err(BdkError), - // } - // } - - // fn get_last_unused_address(&self) -> Result { - // match self.get_wallet().get_address(AddressIndex::LastUnused) { - // Ok(address_info) => Ok(AddressInformation::from(address_info)), - // Err(BdkError) => Err(BdkError), - // } - // } - fn get_balance(&self) -> Result { self.get_wallet().get_balance() }