diff --git a/.gitignore b/.gitignore index 757510aa..c91c338a 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 4bea6971..6c041aba 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", @@ -124,8 +129,8 @@ callback interface BdkProgress { interface Wallet { [Throws=BdkError] constructor(string descriptor, string? change_descriptor, Network network, DatabaseConfig database_config, BlockchainConfig blockchain_config); - string get_new_address(); - AddressInformation get_last_unused_address(); + [Throws=BdkError] + AddressInfo get_address(AddressIndex address_index); [Throws=BdkError] u64 get_balance(); [Throws=BdkError] diff --git a/src/lib.rs b/src/lib.rs index a26ef60f..bb651683 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,10 +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::wallet::AddressIndex; +// use bdk::wallet::AddressInfo; use bdk::{BlockTime, Error, FeeRate, SignOptions, Wallet as BdkWallet}; use std::convert::TryFrom; +use std::convert::From; use std::str::FromStr; use std::sync::{Arc, Mutex, MutexGuard}; @@ -23,11 +24,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 }, @@ -199,31 +228,26 @@ impl Wallet { .sync(BdkProgressHolder { progress_update }, max_address_param) } - fn get_new_address(&self) -> String { - self.get_wallet() - .get_address(AddressIndex::New) - .unwrap() - .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_last_unused_address(&self) -> String { - // self.get_wallet() - // .get_address(AddressIndex::LastUnused) - // .unwrap() - // .address - // .to_string() + // 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) -> 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_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()