Merge pull request #21 from notmandatory/list-incomplete-transactions

List both confirmed and unconfirmed transactions
This commit is contained in:
Sudarsan Balaji 2021-10-18 17:35:14 +05:30 committed by GitHub
commit f34e59e289
2 changed files with 42 additions and 18 deletions

View File

@ -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<ConfirmedTransaction> get_transactions();
sequence<Transaction> get_transactions();
};
dictionary ElectrumConfig {
@ -123,7 +132,7 @@ interface OnlineWallet {
[Throws=BdkError]
void sign([ByRef] PartiallySignedBitcoinTransaction psbt);
[Throws=BdkError]
sequence<ConfirmedTransaction> get_transactions();
sequence<Transaction> get_transactions();
// OnlineWalletInterface
Network get_network();

View File

@ -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<u64>,
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<B>: WalletHolder<B> {
fn get_new_address(&self) -> String {
self.get_wallet()
@ -92,18 +101,24 @@ trait OfflineWalletOperations<B>: WalletHolder<B> {
}
}
fn get_transactions(&self) -> Result<Vec<ConfirmedTransaction>, Error> {
fn get_transactions(&self) -> Result<Vec<Transaction>, 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())
}