diff --git a/bdk-ffi/src/bdk.udl b/bdk-ffi/src/bdk.udl index fecd33f..6720cd1 100644 --- a/bdk-ffi/src/bdk.udl +++ b/bdk-ffi/src/bdk.udl @@ -100,6 +100,17 @@ dictionary TxOut { Script script_pubkey; }; +[Enum] +interface ChainPosition { + Confirmed(u32 height, u64 timestamp); + Unconfirmed(u64 timestamp); +}; + +dictionary CanonicalTx { + Transaction transaction; + ChainPosition chain_position; +}; + // ------------------------------------------------------------------------ // bdk crate - wallet module // ------------------------------------------------------------------------ @@ -147,7 +158,7 @@ interface Wallet { SentAndReceivedValues sent_and_received([ByRef] Transaction tx); - sequence transactions(); + sequence transactions(); [Throws=CalculateFeeError] u64 calculate_fee([ByRef] Transaction tx); @@ -363,17 +374,6 @@ interface Address { boolean is_valid_for_network(Network network); }; -[Enum] -interface ConfirmationDetails { - Confirmed(u32 height, u64 timestamp); - Unconfirmed(u64 timestamp); -}; - -dictionary TransactionDetails { - Transaction transaction; - ConfirmationDetails confirmation; -}; - interface Transaction { [Throws=Alpha3Error] constructor(sequence transaction_bytes); diff --git a/bdk-ffi/src/bitcoin.rs b/bdk-ffi/src/bitcoin.rs index 8fee1c1..261deeb 100644 --- a/bdk-ffi/src/bitcoin.rs +++ b/bdk-ffi/src/bitcoin.rs @@ -1,3 +1,5 @@ +use crate::error::Alpha3Error; + use bdk::bitcoin::address::{NetworkChecked, NetworkUnchecked}; use bdk::bitcoin::blockdata::script::ScriptBuf as BdkScriptBuf; use bdk::bitcoin::blockdata::transaction::TxOut as BdkTxOut; @@ -8,10 +10,7 @@ use bdk::bitcoin::Network; use bdk::bitcoin::OutPoint as BdkOutPoint; use bdk::bitcoin::Transaction as BdkTransaction; use bdk::bitcoin::Txid; -use bdk::chain::tx_graph::CanonicalTx as BdkCanonicalTx; -use crate::error::Alpha3Error; -use bdk::chain::{ChainPosition, ConfirmationTimeHeightAnchor}; use std::io::Cursor; use std::str::FromStr; use std::sync::{Arc, Mutex}; @@ -116,36 +115,6 @@ impl From for Address { } } -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum ConfirmationDetails { - Confirmed { height: u32, timestamp: u64 }, - Unconfirmed { timestamp: u64 }, -} - -pub struct TransactionDetails { - pub transaction: Arc, - pub confirmation: ConfirmationDetails, -} - -impl<'a> From> - for TransactionDetails -{ - fn from(tx: BdkCanonicalTx<'a, BdkTransaction, ConfirmationTimeHeightAnchor>) -> Self { - let confirmation = match tx.chain_position { - ChainPosition::Confirmed(anchor) => ConfirmationDetails::Confirmed { - height: anchor.confirmation_height, - timestamp: anchor.confirmation_time, - }, - ChainPosition::Unconfirmed(timestamp) => ConfirmationDetails::Unconfirmed { timestamp }, - }; - - TransactionDetails { - transaction: Arc::new(Transaction::from(tx.tx_node.tx)), - confirmation, - } - } -} - #[derive(Debug, Clone, PartialEq, Eq)] pub struct Transaction { inner: BdkTransaction, diff --git a/bdk-ffi/src/lib.rs b/bdk-ffi/src/lib.rs index e899d33..3a28118 100644 --- a/bdk-ffi/src/lib.rs +++ b/bdk-ffi/src/lib.rs @@ -17,6 +17,8 @@ use crate::error::Alpha3Error; use crate::error::CalculateFeeError; use crate::error::EsploraError; use crate::error::FeeRateError; +use crate::error::PersistenceError; +use crate::error::WalletCreationError; use crate::esplora::EsploraClient; use crate::keys::DerivationPath; use crate::keys::DescriptorPublicKey; @@ -25,6 +27,8 @@ use crate::keys::Mnemonic; use crate::types::AddressIndex; use crate::types::AddressInfo; use crate::types::Balance; +use crate::types::CanonicalTx; +use crate::types::ChainPosition; use crate::types::FeeRate; use crate::types::LocalOutput; use crate::types::ScriptAmount; @@ -34,11 +38,6 @@ use crate::wallet::TxBuilder; use crate::wallet::Update; use crate::wallet::Wallet; -use crate::bitcoin::ConfirmationDetails; -use crate::bitcoin::TransactionDetails; - -use crate::error::PersistenceError; -use crate::error::WalletCreationError; use bdk::bitcoin::Network; use bdk::keys::bip39::WordCount; use bdk::wallet::tx_builder::ChangeSpendPolicy; diff --git a/bdk-ffi/src/types.rs b/bdk-ffi/src/types.rs index 326a63f..ca68668 100644 --- a/bdk-ffi/src/types.rs +++ b/bdk-ffi/src/types.rs @@ -1,16 +1,46 @@ -use crate::bitcoin::{Address, OutPoint, Script, TxOut}; +use crate::bitcoin::{Address, OutPoint, Script, Transaction, TxOut}; +use crate::error::FeeRateError; +use bdk::bitcoin::FeeRate as BdkFeeRate; +use bdk::bitcoin::Transaction as BdkTransaction; +use bdk::chain::tx_graph::CanonicalTx as BdkCanonicalTx; +use bdk::chain::{ChainPosition as BdkChainPosition, ConfirmationTimeHeightAnchor}; use bdk::wallet::AddressIndex as BdkAddressIndex; use bdk::wallet::AddressInfo as BdkAddressInfo; use bdk::wallet::Balance as BdkBalance; use bdk::KeychainKind; use bdk::LocalOutput as BdkLocalOutput; -use bdk::bitcoin::FeeRate as BdkFeeRate; - -use crate::error::FeeRateError; use std::sync::Arc; +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum ChainPosition { + Confirmed { height: u32, timestamp: u64 }, + Unconfirmed { timestamp: u64 }, +} + +pub struct CanonicalTx { + pub transaction: Arc, + pub chain_position: ChainPosition, +} + +impl From> for CanonicalTx { + fn from(tx: BdkCanonicalTx<'_, BdkTransaction, ConfirmationTimeHeightAnchor>) -> Self { + let chain_position = match tx.chain_position { + BdkChainPosition::Confirmed(anchor) => ChainPosition::Confirmed { + height: anchor.confirmation_height, + timestamp: anchor.confirmation_time, + }, + BdkChainPosition::Unconfirmed(timestamp) => ChainPosition::Unconfirmed { timestamp }, + }; + + CanonicalTx { + transaction: Arc::new(Transaction::from(tx.tx_node.tx)), + chain_position, + } + } +} + #[derive(Clone, Debug)] pub struct FeeRate(pub BdkFeeRate); diff --git a/bdk-ffi/src/wallet.rs b/bdk-ffi/src/wallet.rs index 07ae46a..49b0133 100644 --- a/bdk-ffi/src/wallet.rs +++ b/bdk-ffi/src/wallet.rs @@ -1,10 +1,7 @@ -use crate::bitcoin::{OutPoint, PartiallySignedTransaction, Transaction, TransactionDetails}; +use crate::bitcoin::{OutPoint, PartiallySignedTransaction, Script, Transaction}; use crate::descriptor::Descriptor; use crate::error::{Alpha3Error, CalculateFeeError, PersistenceError, WalletCreationError}; -use crate::types::ScriptAmount; -use crate::types::{Balance, FeeRate}; -use crate::Script; -use crate::{AddressIndex, AddressInfo}; +use crate::types::{AddressIndex, AddressInfo, Balance, CanonicalTx, FeeRate, ScriptAmount}; use bdk::bitcoin::blockdata::script::ScriptBuf as BdkScriptBuf; use bdk::bitcoin::psbt::PartiallySignedTransaction as BdkPartiallySignedTransaction; @@ -104,7 +101,7 @@ impl Wallet { SentAndReceivedValues { sent, received } } - pub fn transactions(&self) -> Vec { + pub fn transactions(&self) -> Vec { self.get_wallet() .transactions() .map(|tx| tx.into())