diff --git a/crates/bitcoind_rpc/tests/test_emitter.rs b/crates/bitcoind_rpc/tests/test_emitter.rs index 2c8b1e11..2c2c863d 100644 --- a/crates/bitcoind_rpc/tests/test_emitter.rs +++ b/crates/bitcoind_rpc/tests/test_emitter.rs @@ -3,9 +3,8 @@ use std::collections::{BTreeMap, BTreeSet}; use bdk_bitcoind_rpc::Emitter; use bdk_chain::{ bitcoin::{Address, Amount, Txid}, - keychain::Balance, local_chain::{CheckPoint, LocalChain}, - Append, BlockId, IndexedTxGraph, SpkTxOutIndex, + Append, Balance, BlockId, IndexedTxGraph, SpkTxOutIndex, }; use bdk_testenv::{anyhow, TestEnv}; use bitcoin::{hashes::Hash, Block, OutPoint, ScriptBuf, WScriptHash}; diff --git a/crates/chain/src/keychain.rs b/crates/chain/src/balance.rs similarity index 64% rename from crates/chain/src/keychain.rs rename to crates/chain/src/balance.rs index 2a0500a4..569755a9 100644 --- a/crates/chain/src/keychain.rs +++ b/crates/chain/src/balance.rs @@ -1,20 +1,4 @@ -//! Module for keychain related structures. -//! -//! A keychain here is a set of application-defined indexes for a miniscript descriptor where we can -//! derive script pubkeys at a particular derivation index. The application's index is simply -//! anything that implements `Ord`. -//! -//! [`KeychainTxOutIndex`] indexes script pubkeys of keychains and scans in relevant outpoints (that -//! has a `txout` containing an indexed script pubkey). Internally, this uses [`SpkTxOutIndex`], but -//! also maintains "revealed" and "lookahead" index counts per keychain. -//! -//! [`SpkTxOutIndex`]: crate::SpkTxOutIndex - -#[cfg(feature = "miniscript")] -mod txout_index; -use bitcoin::{Amount, ScriptBuf}; -#[cfg(feature = "miniscript")] -pub use txout_index::*; +use bitcoin::Amount; /// Balance, differentiated into various categories. #[derive(Debug, PartialEq, Eq, Clone, Default)] @@ -49,11 +33,6 @@ impl Balance { } } -/// A tuple of keychain index and `T` representing the indexed value. -pub type Indexed = (u32, T); -/// A tuple of keychain `K`, derivation index (`u32`) and a `T` associated with them. -pub type KeychainIndexed = ((K, u32), T); - impl core::fmt::Display for Balance { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!( diff --git a/crates/chain/src/changeset.rs b/crates/chain/src/changeset.rs index d8422840..3dabc5a4 100644 --- a/crates/chain/src/changeset.rs +++ b/crates/chain/src/changeset.rs @@ -16,7 +16,8 @@ pub struct CombinedChangeSet { /// Changes to the [`LocalChain`](crate::local_chain::LocalChain). pub chain: crate::local_chain::ChangeSet, /// Changes to [`IndexedTxGraph`](crate::indexed_tx_graph::IndexedTxGraph). - pub indexed_tx_graph: crate::indexed_tx_graph::ChangeSet>, + pub indexed_tx_graph: + crate::indexed_tx_graph::ChangeSet>, /// Stores the network type of the transaction data. pub network: Option, } @@ -62,11 +63,14 @@ impl From for CombinedChangeSet { } #[cfg(feature = "miniscript")] -impl From>> +impl From>> for CombinedChangeSet { fn from( - indexed_tx_graph: crate::indexed_tx_graph::ChangeSet>, + indexed_tx_graph: crate::indexed_tx_graph::ChangeSet< + A, + crate::indexer::keychain_txout::ChangeSet, + >, ) -> Self { Self { indexed_tx_graph, @@ -76,8 +80,8 @@ impl From From> for CombinedChangeSet { - fn from(indexer: crate::keychain::ChangeSet) -> Self { +impl From> for CombinedChangeSet { + fn from(indexer: crate::indexer::keychain_txout::ChangeSet) -> Self { Self { indexed_tx_graph: crate::indexed_tx_graph::ChangeSet { indexer, diff --git a/crates/chain/src/indexed_tx_graph.rs b/crates/chain/src/indexed_tx_graph.rs index 3848ba64..41392c02 100644 --- a/crates/chain/src/indexed_tx_graph.rs +++ b/crates/chain/src/indexed_tx_graph.rs @@ -5,7 +5,7 @@ use bitcoin::{Block, OutPoint, Transaction, TxOut, Txid}; use crate::{ tx_graph::{self, TxGraph}, - Anchor, AnchorFromBlockPosition, Append, BlockId, + Anchor, AnchorFromBlockPosition, Append, BlockId, Indexer, }; /// The [`IndexedTxGraph`] combines a [`TxGraph`] and an [`Indexer`] implementation. @@ -320,8 +320,10 @@ impl From> for ChangeSet { } #[cfg(feature = "miniscript")] -impl From> for ChangeSet> { - fn from(indexer: crate::keychain::ChangeSet) -> Self { +impl From> + for ChangeSet> +{ + fn from(indexer: crate::indexer::keychain_txout::ChangeSet) -> Self { Self { graph: Default::default(), indexer, @@ -329,30 +331,6 @@ impl From> for ChangeSet Self::ChangeSet; - - /// Scans a transaction for relevant outpoints, which are stored and indexed internally. - fn index_tx(&mut self, tx: &Transaction) -> Self::ChangeSet; - - /// Apply changeset to itself. - fn apply_changeset(&mut self, changeset: Self::ChangeSet); - - /// Determines the [`ChangeSet`] between `self` and an empty [`Indexer`]. - fn initial_changeset(&self) -> Self::ChangeSet; - - /// Determines whether the transaction should be included in the index. - fn is_tx_relevant(&self, tx: &Transaction) -> bool; -} - impl AsRef> for IndexedTxGraph { fn as_ref(&self) -> &TxGraph { &self.graph diff --git a/crates/chain/src/indexer.rs b/crates/chain/src/indexer.rs new file mode 100644 index 00000000..22e83981 --- /dev/null +++ b/crates/chain/src/indexer.rs @@ -0,0 +1,33 @@ +//! [`Indexer`] provides utilities for indexing transaction data. + +use bitcoin::{OutPoint, Transaction, TxOut}; + +#[cfg(feature = "miniscript")] +pub mod keychain_txout; +pub mod spk_txout; + +/// Utilities for indexing transaction data. +/// +/// Types which implement this trait can be used to construct an [`IndexedTxGraph`]. +/// This trait's methods should rarely be called directly. +/// +/// [`IndexedTxGraph`]: crate::IndexedTxGraph +pub trait Indexer { + /// The resultant "changeset" when new transaction data is indexed. + type ChangeSet; + + /// Scan and index the given `outpoint` and `txout`. + fn index_txout(&mut self, outpoint: OutPoint, txout: &TxOut) -> Self::ChangeSet; + + /// Scans a transaction for relevant outpoints, which are stored and indexed internally. + fn index_tx(&mut self, tx: &Transaction) -> Self::ChangeSet; + + /// Apply changeset to itself. + fn apply_changeset(&mut self, changeset: Self::ChangeSet); + + /// Determines the [`ChangeSet`](Indexer::ChangeSet) between `self` and an empty [`Indexer`]. + fn initial_changeset(&self) -> Self::ChangeSet; + + /// Determines whether the transaction should be included in the index. + fn is_tx_relevant(&self, tx: &Transaction) -> bool; +} diff --git a/crates/chain/src/keychain/txout_index.rs b/crates/chain/src/indexer/keychain_txout.rs similarity index 98% rename from crates/chain/src/keychain/txout_index.rs rename to crates/chain/src/indexer/keychain_txout.rs index 758f16cb..1d9f41f7 100644 --- a/crates/chain/src/keychain/txout_index.rs +++ b/crates/chain/src/indexer/keychain_txout.rs @@ -1,18 +1,19 @@ +//! [`KeychainTxOutIndex`] controls how script pubkeys are revealed for multiple keychains and +//! indexes [`TxOut`]s with them. + use crate::{ collections::*, - indexed_tx_graph::Indexer, miniscript::{Descriptor, DescriptorPublicKey}, spk_iter::BIP32_MAX_INDEX, - DescriptorExt, DescriptorId, SpkIterator, SpkTxOutIndex, + DescriptorExt, DescriptorId, Indexed, Indexer, KeychainIndexed, SpkIterator, SpkTxOutIndex, }; use alloc::{borrow::ToOwned, vec::Vec}; -use bitcoin::{Amount, OutPoint, Script, SignedAmount, Transaction, TxOut, Txid}; +use bitcoin::{Amount, OutPoint, Script, ScriptBuf, SignedAmount, Transaction, TxOut, Txid}; use core::{ fmt::Debug, ops::{Bound, RangeBounds}, }; -use super::*; use crate::Append; /// The default lookahead for a [`KeychainTxOutIndex`] @@ -73,7 +74,7 @@ pub const DEFAULT_LOOKAHEAD: u32 = 25; /// ## Synopsis /// /// ``` -/// use bdk_chain::keychain::KeychainTxOutIndex; +/// use bdk_chain::indexer::keychain_txout::KeychainTxOutIndex; /// # use bdk_chain::{ miniscript::{Descriptor, DescriptorPublicKey} }; /// # use core::str::FromStr; /// @@ -98,7 +99,7 @@ pub const DEFAULT_LOOKAHEAD: u32 = 25; /// let _ = txout_index.insert_descriptor(MyKeychain::MyAppUser { user_id: 42 }, descriptor_42)?; /// /// let new_spk_for_user = txout_index.reveal_next_spk(&MyKeychain::MyAppUser{ user_id: 42 }); -/// # Ok::<_, bdk_chain::keychain::InsertDescriptorError<_>>(()) +/// # Ok::<_, bdk_chain::indexer::keychain_txout::InsertDescriptorError<_>>(()) /// ``` /// /// [`Ord`]: core::cmp::Ord @@ -859,8 +860,7 @@ impl std::error::Error for InsertDescriptorError {} /// `keychains_added` is *not* monotone, once it is set any attempt to change it is subject to the /// same *one-to-one* keychain <-> descriptor mapping invariant as [`KeychainTxOutIndex`] itself. /// -/// [`KeychainTxOutIndex`]: crate::keychain::KeychainTxOutIndex -/// [`apply_changeset`]: crate::keychain::KeychainTxOutIndex::apply_changeset +/// [`apply_changeset`]: KeychainTxOutIndex::apply_changeset /// [`append`]: Self::append #[derive(Clone, Debug, PartialEq)] #[cfg_attr( diff --git a/crates/chain/src/spk_txout_index.rs b/crates/chain/src/indexer/spk_txout.rs similarity index 99% rename from crates/chain/src/spk_txout_index.rs rename to crates/chain/src/indexer/spk_txout.rs index f664af89..ead446a7 100644 --- a/crates/chain/src/spk_txout_index.rs +++ b/crates/chain/src/indexer/spk_txout.rs @@ -1,8 +1,10 @@ +//! [`SpkTxOutIndex`] is an index storing [`TxOut`]s that have a script pubkey that matches those in a list. + use core::ops::RangeBounds; use crate::{ collections::{hash_map::Entry, BTreeMap, BTreeSet, HashMap}, - indexed_tx_graph::Indexer, + Indexer, }; use bitcoin::{Amount, OutPoint, Script, ScriptBuf, SignedAmount, Transaction, TxOut, Txid}; diff --git a/crates/chain/src/lib.rs b/crates/chain/src/lib.rs index 94f81441..ec0c61a3 100644 --- a/crates/chain/src/lib.rs +++ b/crates/chain/src/lib.rs @@ -21,14 +21,15 @@ #![warn(missing_docs)] pub use bitcoin; -mod spk_txout_index; -pub use spk_txout_index::*; +mod balance; +pub use balance::*; mod chain_data; pub use chain_data::*; pub mod indexed_tx_graph; pub use indexed_tx_graph::IndexedTxGraph; -pub mod keychain; -pub use keychain::{Indexed, KeychainIndexed}; +pub mod indexer; +pub use indexer::spk_txout::*; +pub use indexer::Indexer; pub mod local_chain; mod tx_data_traits; pub mod tx_graph; @@ -98,3 +99,8 @@ pub mod collections { /// How many confirmations are needed f or a coinbase output to be spent. pub const COINBASE_MATURITY: u32 = 100; + +/// A tuple of keychain index and `T` representing the indexed value. +pub type Indexed = (u32, T); +/// A tuple of keychain `K`, derivation index (`u32`) and a `T` associated with them. +pub type KeychainIndexed = ((K, u32), T); diff --git a/crates/chain/src/spk_client.rs b/crates/chain/src/spk_client.rs index 24bd9b4a..1ddf7a6d 100644 --- a/crates/chain/src/spk_client.rs +++ b/crates/chain/src/spk_client.rs @@ -1,8 +1,7 @@ //! Helper types for spk-based blockchain clients. use crate::{ - collections::BTreeMap, keychain::Indexed, local_chain::CheckPoint, - ConfirmationTimeHeightAnchor, TxGraph, + collections::BTreeMap, local_chain::CheckPoint, ConfirmationTimeHeightAnchor, Indexed, TxGraph, }; use alloc::boxed::Box; use bitcoin::{OutPoint, Script, ScriptBuf, Txid}; @@ -160,7 +159,7 @@ impl SyncRequest { #[must_use] pub fn populate_with_revealed_spks( self, - index: &crate::keychain::KeychainTxOutIndex, + index: &crate::indexer::keychain_txout::KeychainTxOutIndex, spk_range: impl core::ops::RangeBounds, ) -> Self { use alloc::borrow::ToOwned; @@ -216,12 +215,12 @@ impl FullScanRequest { /// [`KeychainTxOutIndex::all_unbounded_spk_iters`] and is used to populate the /// [`FullScanRequest`]. /// - /// [`KeychainTxOutIndex::all_unbounded_spk_iters`]: crate::keychain::KeychainTxOutIndex::all_unbounded_spk_iters + /// [`KeychainTxOutIndex::all_unbounded_spk_iters`]: crate::indexer::keychain_txout::KeychainTxOutIndex::all_unbounded_spk_iters #[cfg(feature = "miniscript")] #[must_use] pub fn from_keychain_txout_index( chain_tip: CheckPoint, - index: &crate::keychain::KeychainTxOutIndex, + index: &crate::indexer::keychain_txout::KeychainTxOutIndex, ) -> Self where K: core::fmt::Debug, diff --git a/crates/chain/src/spk_iter.rs b/crates/chain/src/spk_iter.rs index dd4c0a8f..7228b719 100644 --- a/crates/chain/src/spk_iter.rs +++ b/crates/chain/src/spk_iter.rs @@ -1,7 +1,7 @@ use crate::{ bitcoin::{secp256k1::Secp256k1, ScriptBuf}, - keychain::Indexed, miniscript::{Descriptor, DescriptorPublicKey}, + Indexed, }; use core::{borrow::Borrow, ops::Bound, ops::RangeBounds}; @@ -137,7 +137,7 @@ where mod test { use crate::{ bitcoin::secp256k1::Secp256k1, - keychain::KeychainTxOutIndex, + indexer::keychain_txout::KeychainTxOutIndex, miniscript::{Descriptor, DescriptorPublicKey}, spk_iter::{SpkIterator, BIP32_MAX_INDEX}, }; diff --git a/crates/chain/src/tx_graph.rs b/crates/chain/src/tx_graph.rs index b79aa434..1532d13a 100644 --- a/crates/chain/src/tx_graph.rs +++ b/crates/chain/src/tx_graph.rs @@ -89,8 +89,7 @@ //! [`insert_txout`]: TxGraph::insert_txout use crate::{ - collections::*, keychain::Balance, Anchor, Append, BlockId, ChainOracle, ChainPosition, - FullTxOut, + collections::*, Anchor, Append, Balance, BlockId, ChainOracle, ChainPosition, FullTxOut, }; use alloc::collections::vec_deque::VecDeque; use alloc::sync::Arc; diff --git a/crates/chain/tests/test_indexed_tx_graph.rs b/crates/chain/tests/test_indexed_tx_graph.rs index dbd7fd30..57f98374 100644 --- a/crates/chain/tests/test_indexed_tx_graph.rs +++ b/crates/chain/tests/test_indexed_tx_graph.rs @@ -8,9 +8,9 @@ use std::{collections::BTreeSet, sync::Arc}; use crate::common::DESCRIPTORS; use bdk_chain::{ indexed_tx_graph::{self, IndexedTxGraph}, - keychain::{self, Balance, KeychainTxOutIndex}, + indexer::keychain_txout::KeychainTxOutIndex, local_chain::LocalChain, - tx_graph, Append, ChainPosition, ConfirmationHeightAnchor, DescriptorExt, + tx_graph, Append, Balance, ChainPosition, ConfirmationHeightAnchor, DescriptorExt, }; use bitcoin::{ secp256k1::Secp256k1, Amount, OutPoint, Script, ScriptBuf, Transaction, TxIn, TxOut, @@ -26,6 +26,7 @@ use miniscript::Descriptor; /// agnostic. #[test] fn insert_relevant_txs() { + use bdk_chain::indexer::keychain_txout; let (descriptor, _) = Descriptor::parse_descriptor(&Secp256k1::signing_only(), DESCRIPTORS[0]) .expect("must be valid"); let spk_0 = descriptor.at_derivation_index(0).unwrap().script_pubkey(); @@ -76,7 +77,7 @@ fn insert_relevant_txs() { txs: txs.iter().cloned().map(Arc::new).collect(), ..Default::default() }, - indexer: keychain::ChangeSet { + indexer: keychain_txout::ChangeSet { last_revealed: [(descriptor.descriptor_id(), 9_u32)].into(), keychains_added: [].into(), }, @@ -90,7 +91,7 @@ fn insert_relevant_txs() { // The initial changeset will also contain info about the keychain we added let initial_changeset = indexed_tx_graph::ChangeSet { graph: changeset.graph, - indexer: keychain::ChangeSet { + indexer: keychain_txout::ChangeSet { last_revealed: changeset.indexer.last_revealed, keychains_added: [((), descriptor)].into(), }, diff --git a/crates/chain/tests/test_keychain_txout_index.rs b/crates/chain/tests/test_keychain_txout_index.rs index 2c1c34e7..751786dd 100644 --- a/crates/chain/tests/test_keychain_txout_index.rs +++ b/crates/chain/tests/test_keychain_txout_index.rs @@ -4,9 +4,8 @@ mod common; use bdk_chain::{ collections::BTreeMap, - indexed_tx_graph::Indexer, - keychain::{self, ChangeSet, KeychainTxOutIndex}, - Append, DescriptorExt, DescriptorId, + indexer::keychain_txout::{ChangeSet, KeychainTxOutIndex}, + Append, DescriptorExt, DescriptorId, Indexer, }; use bitcoin::{secp256k1::Secp256k1, Amount, OutPoint, ScriptBuf, Transaction, TxOut}; @@ -31,8 +30,8 @@ fn init_txout_index( external_descriptor: Descriptor, internal_descriptor: Descriptor, lookahead: u32, -) -> bdk_chain::keychain::KeychainTxOutIndex { - let mut txout_index = bdk_chain::keychain::KeychainTxOutIndex::::new(lookahead); +) -> KeychainTxOutIndex { + let mut txout_index = KeychainTxOutIndex::::new(lookahead); let _ = txout_index .insert_descriptor(TestKeychain::External, external_descriptor) @@ -146,8 +145,6 @@ fn when_apply_contradictory_changesets_they_are_ignored() { #[test] fn test_set_all_derivation_indices() { - use bdk_chain::indexed_tx_graph::Indexer; - let external_descriptor = parse_descriptor(DESCRIPTORS[0]); let internal_descriptor = parse_descriptor(DESCRIPTORS[1]); let mut txout_index = @@ -169,7 +166,7 @@ fn test_set_all_derivation_indices() { assert_eq!(txout_index.last_revealed_indices(), derive_to); assert_eq!( txout_index.reveal_to_target_multi(&derive_to), - keychain::ChangeSet::default(), + ChangeSet::default(), "no changes if we set to the same thing" ); assert_eq!(txout_index.initial_changeset().last_revealed, last_revealed); @@ -304,7 +301,7 @@ fn test_lookahead() { ], ..common::new_tx(external_index) }; - assert_eq!(txout_index.index_tx(&tx), keychain::ChangeSet::default()); + assert_eq!(txout_index.index_tx(&tx), ChangeSet::default()); assert_eq!( txout_index.last_revealed_index(&TestKeychain::External), Some(last_external_index) @@ -643,14 +640,14 @@ fn insert_descriptor_no_change() { let mut txout_index = KeychainTxOutIndex::<()>::default(); assert_eq!( txout_index.insert_descriptor((), desc.clone()), - Ok(keychain::ChangeSet { + Ok(ChangeSet { keychains_added: [((), desc.clone())].into(), last_revealed: Default::default() }), ); assert_eq!( txout_index.insert_descriptor((), desc.clone()), - Ok(keychain::ChangeSet::default()), + Ok(ChangeSet::default()), "inserting the same descriptor for keychain should return an empty changeset", ); } diff --git a/crates/chain/tests/test_spk_txout_index.rs b/crates/chain/tests/test_spk_txout_index.rs index 8be25270..ccad2af0 100644 --- a/crates/chain/tests/test_spk_txout_index.rs +++ b/crates/chain/tests/test_spk_txout_index.rs @@ -1,4 +1,4 @@ -use bdk_chain::{indexed_tx_graph::Indexer, SpkTxOutIndex}; +use bdk_chain::{Indexer, SpkTxOutIndex}; use bitcoin::{ absolute, transaction, Amount, OutPoint, ScriptBuf, SignedAmount, Transaction, TxIn, TxOut, }; diff --git a/crates/chain/tests/test_tx_graph_conflicts.rs b/crates/chain/tests/test_tx_graph_conflicts.rs index 512b076d..802ba5c7 100644 --- a/crates/chain/tests/test_tx_graph_conflicts.rs +++ b/crates/chain/tests/test_tx_graph_conflicts.rs @@ -5,7 +5,7 @@ mod common; use std::collections::{BTreeSet, HashSet}; -use bdk_chain::{keychain::Balance, BlockId}; +use bdk_chain::{Balance, BlockId}; use bitcoin::{Amount, OutPoint, Script}; use common::*; diff --git a/crates/electrum/tests/test_electrum.rs b/crates/electrum/tests/test_electrum.rs index 9788b251..1befb326 100644 --- a/crates/electrum/tests/test_electrum.rs +++ b/crates/electrum/tests/test_electrum.rs @@ -1,9 +1,8 @@ use bdk_chain::{ bitcoin::{hashes::Hash, Address, Amount, ScriptBuf, WScriptHash}, - keychain::Balance, local_chain::LocalChain, spk_client::SyncRequest, - ConfirmationTimeHeightAnchor, IndexedTxGraph, SpkTxOutIndex, + Balance, ConfirmationTimeHeightAnchor, IndexedTxGraph, SpkTxOutIndex, }; use bdk_electrum::BdkElectrumClient; use bdk_testenv::{anyhow, bitcoincore_rpc::RpcApi, TestEnv}; diff --git a/crates/esplora/src/async_ext.rs b/crates/esplora/src/async_ext.rs index dff52fdd..939c43a2 100644 --- a/crates/esplora/src/async_ext.rs +++ b/crates/esplora/src/async_ext.rs @@ -231,7 +231,7 @@ async fn chain_update( } /// This performs a full scan to get an update for the [`TxGraph`] and -/// [`KeychainTxOutIndex`](bdk_chain::keychain::KeychainTxOutIndex). +/// [`KeychainTxOutIndex`](bdk_chain::indexer::keychain_txout::KeychainTxOutIndex). async fn full_scan_for_index_and_graph( client: &esplora_client::AsyncClient, keychain_spks: BTreeMap< diff --git a/crates/esplora/src/blocking_ext.rs b/crates/esplora/src/blocking_ext.rs index 5093b4ef..adad25c2 100644 --- a/crates/esplora/src/blocking_ext.rs +++ b/crates/esplora/src/blocking_ext.rs @@ -213,7 +213,7 @@ fn chain_update( } /// This performs a full scan to get an update for the [`TxGraph`] and -/// [`KeychainTxOutIndex`](bdk_chain::keychain::KeychainTxOutIndex). +/// [`KeychainTxOutIndex`](bdk_chain::indexer::keychain_txout::KeychainTxOutIndex). fn full_scan_for_index_and_graph_blocking( client: &esplora_client::BlockingClient, keychain_spks: BTreeMap>>, diff --git a/crates/sqlite/src/store.rs b/crates/sqlite/src/store.rs index 4cd81f50..82b25b5d 100644 --- a/crates/sqlite/src/store.rs +++ b/crates/sqlite/src/store.rs @@ -14,7 +14,8 @@ use std::sync::{Arc, Mutex}; use crate::Error; use bdk_chain::CombinedChangeSet; use bdk_chain::{ - indexed_tx_graph, keychain, local_chain, tx_graph, Anchor, Append, DescriptorExt, DescriptorId, + indexed_tx_graph, indexer::keychain_txout, local_chain, tx_graph, Anchor, Append, + DescriptorExt, DescriptorId, }; /// Persists data in to a relational schema based [SQLite] database file. @@ -187,7 +188,7 @@ where /// If keychain exists only update last active index. fn insert_keychains( db_transaction: &rusqlite::Transaction, - tx_graph_changeset: &indexed_tx_graph::ChangeSet>, + tx_graph_changeset: &indexed_tx_graph::ChangeSet>, ) -> Result<(), Error> { let keychain_changeset = &tx_graph_changeset.indexer; for (keychain, descriptor) in keychain_changeset.keychains_added.iter() { @@ -206,7 +207,7 @@ where /// Update descriptor last revealed index. fn update_last_revealed( db_transaction: &rusqlite::Transaction, - tx_graph_changeset: &indexed_tx_graph::ChangeSet>, + tx_graph_changeset: &indexed_tx_graph::ChangeSet>, ) -> Result<(), Error> { let keychain_changeset = &tx_graph_changeset.indexer; for (descriptor_id, last_revealed) in keychain_changeset.last_revealed.iter() { @@ -279,7 +280,7 @@ impl Store { /// Error if trying to insert existing txid. fn insert_txs( db_transaction: &rusqlite::Transaction, - tx_graph_changeset: &indexed_tx_graph::ChangeSet>, + tx_graph_changeset: &indexed_tx_graph::ChangeSet>, ) -> Result<(), Error> { for tx in tx_graph_changeset.graph.txs.iter() { let insert_tx_stmt = &mut db_transaction @@ -343,7 +344,7 @@ impl Store { /// Error if trying to insert existing outpoint. fn insert_txouts( db_transaction: &rusqlite::Transaction, - tx_graph_changeset: &indexed_tx_graph::ChangeSet>, + tx_graph_changeset: &indexed_tx_graph::ChangeSet>, ) -> Result<(), Error> { for txout in tx_graph_changeset.graph.txouts.iter() { let insert_txout_stmt = &mut db_transaction @@ -393,7 +394,7 @@ impl Store { /// Update transaction last seen times. fn update_last_seen( db_transaction: &rusqlite::Transaction, - tx_graph_changeset: &indexed_tx_graph::ChangeSet>, + tx_graph_changeset: &indexed_tx_graph::ChangeSet>, ) -> Result<(), Error> { for tx_last_seen in tx_graph_changeset.graph.last_seen.iter() { let insert_or_update_tx_stmt = &mut db_transaction @@ -418,7 +419,7 @@ where /// Insert anchors. fn insert_anchors( db_transaction: &rusqlite::Transaction, - tx_graph_changeset: &indexed_tx_graph::ChangeSet>, + tx_graph_changeset: &indexed_tx_graph::ChangeSet>, ) -> Result<(), Error> { // serde_json::to_string for anchor in tx_graph_changeset.graph.anchors.iter() { @@ -514,12 +515,12 @@ where last_seen, }; - let indexer: keychain::ChangeSet = keychain::ChangeSet { + let indexer = keychain_txout::ChangeSet { keychains_added, last_revealed, }; - let indexed_tx_graph: indexed_tx_graph::ChangeSet> = + let indexed_tx_graph: indexed_tx_graph::ChangeSet> = indexed_tx_graph::ChangeSet { graph, indexer }; if network.is_none() && chain.is_empty() && indexed_tx_graph.is_empty() { @@ -547,7 +548,7 @@ mod test { use bdk_chain::miniscript::Descriptor; use bdk_chain::CombinedChangeSet; use bdk_chain::{ - indexed_tx_graph, keychain, tx_graph, BlockId, ConfirmationHeightAnchor, + indexed_tx_graph, tx_graph, BlockId, ConfirmationHeightAnchor, ConfirmationTimeHeightAnchor, DescriptorExt, }; use std::str::FromStr; @@ -684,12 +685,12 @@ mod test { .into(), }; - let keychain_changeset = keychain::ChangeSet { + let keychain_changeset = keychain_txout::ChangeSet { keychains_added: [(ext_keychain, ext_desc), (int_keychain, int_desc)].into(), last_revealed: [(ext_desc_id, 124), (int_desc_id, 421)].into(), }; - let graph_changeset: indexed_tx_graph::ChangeSet> = + let graph_changeset: indexed_tx_graph::ChangeSet> = indexed_tx_graph::ChangeSet { graph: tx_graph_changeset, indexer: keychain_changeset, @@ -712,10 +713,10 @@ mod test { last_seen: [(tx2.compute_txid(), 1708919121)].into(), }; - let graph_changeset2: indexed_tx_graph::ChangeSet> = + let graph_changeset2: indexed_tx_graph::ChangeSet> = indexed_tx_graph::ChangeSet { graph: tx_graph_changeset2, - indexer: keychain::ChangeSet::default(), + indexer: keychain_txout::ChangeSet::default(), }; changesets.push(CombinedChangeSet { @@ -732,10 +733,10 @@ mod test { last_seen: BTreeMap::default(), }; - let graph_changeset3: indexed_tx_graph::ChangeSet> = + let graph_changeset3: indexed_tx_graph::ChangeSet> = indexed_tx_graph::ChangeSet { graph: tx_graph_changeset3, - indexer: keychain::ChangeSet::default(), + indexer: keychain_txout::ChangeSet::default(), }; changesets.push(CombinedChangeSet { diff --git a/crates/wallet/src/wallet/mod.rs b/crates/wallet/src/wallet/mod.rs index 23d7eb11..be158a06 100644 --- a/crates/wallet/src/wallet/mod.rs +++ b/crates/wallet/src/wallet/mod.rs @@ -19,10 +19,10 @@ use alloc::{ sync::Arc, vec::Vec, }; -pub use bdk_chain::keychain::Balance; +pub use bdk_chain::Balance; use bdk_chain::{ indexed_tx_graph, - keychain::KeychainTxOutIndex, + indexer::keychain_txout::KeychainTxOutIndex, local_chain::{ self, ApplyHeaderError, CannotConnectError, CheckPoint, CheckPointIter, LocalChain, }, @@ -112,7 +112,7 @@ pub struct Wallet { /// An update to [`Wallet`]. /// -/// It updates [`bdk_chain::keychain::KeychainTxOutIndex`], [`bdk_chain::TxGraph`] and [`local_chain::LocalChain`] atomically. +/// It updates [`KeychainTxOutIndex`], [`bdk_chain::TxGraph`] and [`local_chain::LocalChain`] atomically. #[derive(Debug, Clone, Default)] pub struct Update { /// Contains the last active derivation indices per keychain (`K`), which is used to update the @@ -2451,7 +2451,7 @@ fn create_signers( let _ = index .insert_descriptor(KeychainKind::Internal, descriptor) .map_err(|e| { - use bdk_chain::keychain::InsertDescriptorError; + use bdk_chain::indexer::keychain_txout::InsertDescriptorError; match e { InsertDescriptorError::DescriptorAlreadyAssigned { .. } => { crate::descriptor::error::Error::ExternalAndInternalAreTheSame diff --git a/crates/wallet/tests/common.rs b/crates/wallet/tests/common.rs index 0a3e479b..c124ba21 100644 --- a/crates/wallet/tests/common.rs +++ b/crates/wallet/tests/common.rs @@ -1,13 +1,12 @@ #![allow(unused)] - -use bdk_chain::indexed_tx_graph::Indexer; use bdk_chain::{BlockId, ConfirmationTime, ConfirmationTimeHeightAnchor, TxGraph}; -use bdk_wallet::wallet::Update; -use bdk_wallet::{KeychainKind, LocalOutput, Wallet}; -use bitcoin::hashes::Hash; +use bdk_wallet::{ + wallet::{Update, Wallet}, + KeychainKind, LocalOutput, +}; use bitcoin::{ - transaction, Address, Amount, BlockHash, FeeRate, Network, OutPoint, Transaction, TxIn, TxOut, - Txid, + hashes::Hash, transaction, Address, Amount, BlockHash, FeeRate, Network, OutPoint, Transaction, + TxIn, TxOut, Txid, }; use std::str::FromStr; diff --git a/example-crates/example_bitcoind_rpc_polling/src/main.rs b/example-crates/example_bitcoind_rpc_polling/src/main.rs index 38e79647..084b9381 100644 --- a/example-crates/example_bitcoind_rpc_polling/src/main.rs +++ b/example-crates/example_bitcoind_rpc_polling/src/main.rs @@ -13,7 +13,8 @@ use bdk_bitcoind_rpc::{ }; use bdk_chain::{ bitcoin::{constants::genesis_block, Block, Transaction}, - indexed_tx_graph, keychain, + indexed_tx_graph, + indexer::keychain_txout, local_chain::{self, LocalChain}, Append, ConfirmationTimeHeightAnchor, IndexedTxGraph, }; @@ -37,7 +38,7 @@ const DB_COMMIT_DELAY: Duration = Duration::from_secs(60); type ChangeSet = ( local_chain::ChangeSet, - indexed_tx_graph::ChangeSet>, + indexed_tx_graph::ChangeSet>, ); #[derive(Debug)] diff --git a/example-crates/example_cli/src/lib.rs b/example-crates/example_cli/src/lib.rs index b1862fb8..bd2e3b8c 100644 --- a/example-crates/example_cli/src/lib.rs +++ b/example-crates/example_cli/src/lib.rs @@ -14,7 +14,7 @@ use bdk_chain::{ transaction, Address, Amount, Network, Sequence, Transaction, TxIn, TxOut, }, indexed_tx_graph::{self, IndexedTxGraph}, - keychain::{self, KeychainTxOutIndex}, + indexer::keychain_txout::{self, KeychainTxOutIndex}, local_chain, miniscript::{ descriptor::{DescriptorSecretKey, KeyMap}, @@ -30,7 +30,7 @@ use clap::{Parser, Subcommand}; pub type KeychainTxGraph = IndexedTxGraph>; pub type KeychainChangeSet = ( local_chain::ChangeSet, - indexed_tx_graph::ChangeSet>, + indexed_tx_graph::ChangeSet>, ); #[derive(Parser)] @@ -191,7 +191,7 @@ impl core::fmt::Display for Keychain { } pub struct CreateTxChange { - pub index_changeset: keychain::ChangeSet, + pub index_changeset: keychain_txout::ChangeSet, pub change_keychain: Keychain, pub index: u32, } @@ -207,7 +207,7 @@ pub fn create_tx( where O::Error: std::error::Error + Send + Sync + 'static, { - let mut changeset = keychain::ChangeSet::default(); + let mut changeset = keychain_txout::ChangeSet::default(); let assets = bdk_tmp_plan::Assets { keys: keymap.iter().map(|(pk, _)| pk.clone()).collect(), diff --git a/example-crates/example_electrum/src/main.rs b/example-crates/example_electrum/src/main.rs index 79c6f79e..2ea4d86f 100644 --- a/example-crates/example_electrum/src/main.rs +++ b/example-crates/example_electrum/src/main.rs @@ -7,7 +7,7 @@ use bdk_chain::{ bitcoin::{constants::genesis_block, Address, Network, Txid}, collections::BTreeSet, indexed_tx_graph::{self, IndexedTxGraph}, - keychain, + indexer::keychain_txout, local_chain::{self, LocalChain}, spk_client::{FullScanRequest, SyncRequest}, Append, ConfirmationHeightAnchor, @@ -100,7 +100,7 @@ pub struct ScanOptions { type ChangeSet = ( local_chain::ChangeSet, - indexed_tx_graph::ChangeSet>, + indexed_tx_graph::ChangeSet>, ); fn main() -> anyhow::Result<()> { diff --git a/example-crates/example_esplora/src/main.rs b/example-crates/example_esplora/src/main.rs index 60cf1ef3..49b3167d 100644 --- a/example-crates/example_esplora/src/main.rs +++ b/example-crates/example_esplora/src/main.rs @@ -7,7 +7,7 @@ use std::{ use bdk_chain::{ bitcoin::{constants::genesis_block, Address, Network, Txid}, indexed_tx_graph::{self, IndexedTxGraph}, - keychain, + indexer::keychain_txout, local_chain::{self, LocalChain}, spk_client::{FullScanRequest, SyncRequest}, Append, ConfirmationTimeHeightAnchor, @@ -26,7 +26,7 @@ const DB_PATH: &str = ".bdk_esplora_example.db"; type ChangeSet = ( local_chain::ChangeSet, - indexed_tx_graph::ChangeSet>, + indexed_tx_graph::ChangeSet>, ); #[derive(Subcommand, Debug, Clone)]