diff --git a/src/bdk.udl b/src/bdk.udl index 138950c..c52b9ac 100644 --- a/src/bdk.udl +++ b/src/bdk.udl @@ -63,15 +63,24 @@ interface DatabaseConfig { Sled(SledDbConfiguration config); }; -dictionary ConfirmedTransaction { +dictionary TransactionDetails { u64? fees; - u32 height; - u64 timestamp; u64 received; u64 sent; string id; }; +dictionary Confirmation { + u32 height; + u64 timestamp; +}; + +[Enum] +interface Transaction { + Unconfirmed(TransactionDetails details); + Confirmed(TransactionDetails details, Confirmation confirmation); +}; + interface OfflineWallet { [Throws=BdkError] constructor(string descriptor, Network network, DatabaseConfig database_config); @@ -83,7 +92,7 @@ interface OfflineWallet { [Throws=BdkError] void sign([ByRef] PartiallySignedBitcoinTransaction psbt); [Throws=BdkError] - sequence get_transactions(); + sequence get_transactions(); }; dictionary ElectrumConfig { @@ -123,7 +132,7 @@ interface OnlineWallet { [Throws=BdkError] void sign([ByRef] PartiallySignedBitcoinTransaction psbt); [Throws=BdkError] - sequence get_transactions(); + sequence get_transactions(); // OnlineWalletInterface Network get_network(); diff --git a/src/lib.rs b/src/lib.rs index 2972e14..02c22b5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,7 +8,7 @@ use bdk::blockchain::{ use bdk::database::any::{AnyDatabase, SledDbConfiguration}; use bdk::database::{AnyDatabaseConfig, ConfigurableDatabase}; use bdk::wallet::AddressIndex; -use bdk::{Error, SignOptions, Wallet}; +use bdk::{ConfirmationTime, Error, SignOptions, Wallet}; use std::convert::TryFrom; use std::str::FromStr; use std::sync::{Mutex, MutexGuard}; @@ -58,15 +58,24 @@ impl WalletHolder<()> for OfflineWallet { } #[derive(Debug, Clone, PartialEq, Eq, Default)] -pub struct ConfirmedTransaction { +pub struct TransactionDetails { pub fees: Option, - pub height: u32, - pub timestamp: u64, pub received: u64, pub sent: u64, pub id: String, } +type Confirmation = ConfirmationTime; +pub enum Transaction { + Unconfirmed { + details: TransactionDetails, + }, + Confirmed { + details: TransactionDetails, + confirmation: Confirmation, + }, +} + trait OfflineWalletOperations: WalletHolder { fn get_new_address(&self) -> String { self.get_wallet() @@ -92,18 +101,24 @@ trait OfflineWalletOperations: WalletHolder { } } - fn get_transactions(&self) -> Result, Error> { + fn get_transactions(&self) -> Result, Error> { let transactions = self.get_wallet().list_transactions(true)?; Ok(transactions .iter() - .filter(|x| x.confirmation_time.is_some()) - .map(|x| ConfirmedTransaction { - fees: x.fee, - height: x.confirmation_time.clone().map_or(0, |c| c.height), - timestamp: x.confirmation_time.clone().map_or(0, |c| c.timestamp), - id: x.txid.to_string(), - received: x.received, - sent: x.sent, + .map(|x| -> Transaction { + let details = TransactionDetails { + fees: x.fee, + id: x.txid.to_string(), + received: x.received, + sent: x.sent, + }; + match x.confirmation_time.clone() { + Some(confirmation) => Transaction::Confirmed { + details, + confirmation, + }, + None => Transaction::Unconfirmed { details }, + } }) .collect()) }