pub struct Wallet<D = ()> { /* private fields */ }Expand description
A Bitcoin wallet
+pub struct Wallet<D = ()> { /* private fields */ }Expand description
A Bitcoin wallet
The Wallet struct acts as a way of coherently interfacing with output descriptors and related transactions.
Its main components are:
-
@@ -142,7 +142,7 @@ transactions related to your wallet into it.
sourcepub fn staged(&self) -> &KeychainChangeSet<KeychainKind, ConfirmationTime>
pub fn staged(&self) -> &KeychainChangeSet<KeychainKind, ConfirmationTime>
Returns the changes that will be staged with the next call to commit.
sourcepub fn as_chain_graph(&self) -> &ChainGraph<ConfirmationTime>
pub fn as_chain_graph(&self) -> &ChainGraph<ConfirmationTime>
Get a reference to the inner ChainGraph.
Trait Implementations§
Auto Trait Implementations§
impl<D = ()> !RefUnwindSafe for Wallet<D>
impl<D> Send for Wallet<D>where
D: Send,
impl<D> Sync for Wallet<D>where
D: Sync,
impl<D> Unpin for Wallet<D>where
D: Unpin,
impl<D = ()> !UnwindSafe for Wallet<D>
Blanket Implementations§
Trait Implementations§
Auto Trait Implementations§
impl<D = ()> !RefUnwindSafe for Wallet<D>
impl<D> Send for Wallet<D>where
D: Send,
impl<D> Sync for Wallet<D>where
D: Sync,
impl<D> Unpin for Wallet<D>where
D: Unpin,
impl<D = ()> !UnwindSafe for Wallet<D>
Blanket Implementations§
source§impl<T, U> Into<U> for Twhere
U: From<T>,
impl<T, U> Into<U> for Twhere
U: From<T>,
const: unstable · source§fn into(self) -> U
fn into(self) -> U
Calls U::from(self).
That is, this conversion is whatever the implementation of
From<T> for U chooses to do.
List of all items
Structs
- BlockId
- FullTxOut
- SpkTxOutIndex
- chain_graph::ChainGraph
- chain_graph::ChangeSet
- chain_graph::UnresolvableConflict
- keychain::Balance
- keychain::DerivationAdditions
- keychain::KeychainChangeSet
- keychain::KeychainScan
- keychain::KeychainTracker
- keychain::KeychainTxOutIndex
- keychain::persist::Persist
- sparse_chain::ChangeSet
- sparse_chain::SparseChain
- tx_graph::Additions
- tx_graph::TxDescendants
- tx_graph::TxGraph
Enums
- ConfirmationTime
- TxHeight
- chain_graph::InsertTxError
- chain_graph::NewError
- chain_graph::UpdateError
- sparse_chain::InsertCheckpointError
- sparse_chain::InsertTxError
- sparse_chain::UpdateError
Traits
Type Definitions
Constants
List of all items
Structs
- BlockId
- FullTxOut
- SpkTxOutIndex
- chain_graph::ChainGraph
- chain_graph::ChangeSet
- chain_graph::UnresolvableConflict
- indexed_tx_graph::IndexedAdditions
- indexed_tx_graph::IndexedTxGraph
- keychain::Balance
- keychain::DerivationAdditions
- keychain::KeychainChangeSet
- keychain::KeychainScan
- keychain::KeychainTracker
- keychain::KeychainTxOutIndex
- keychain::persist::Persist
- local_chain::LocalChain
- local_chain::UpdateNotConnectedError
- sparse_chain::ChangeSet
- sparse_chain::SparseChain
- tx_graph::Additions
- tx_graph::CanonicalTx
- tx_graph::TxDescendants
- tx_graph::TxGraph
- tx_graph::TxNode
Enums
- ConfirmationTime
- ObservedAs
- TxHeight
- chain_graph::InsertTxError
- chain_graph::NewError
- chain_graph::UpdateError
- sparse_chain::InsertCheckpointError
- sparse_chain::InsertTxError
- sparse_chain::UpdateError
Traits
- Anchor
- Append
- ChainOracle
- DescriptorExt
- ForEachTxOut
- indexed_tx_graph::Indexer
- indexed_tx_graph::OwnedIndexer
- keychain::persist::PersistBackend
- sparse_chain::ChainPosition
Type Definitions
Constants
Redirecting to ../../bdk_chain/enum.ObservedAs.html...
+ + + \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/struct.ChainGraph.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/struct.ChainGraph.html index 0c9895a5de..41ac85a563 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/struct.ChainGraph.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/struct.ChainGraph.html @@ -1,4 +1,4 @@ -Struct bdk_chain::chain_graph::ChainGraph
source · pub struct ChainGraph<P = TxHeight> { /* private fields */ }Expand description
A consistent combination of a SparseChain<P> and a TxGraph<T>.
Struct bdk_chain::chain_graph::ChainGraph
source · pub struct ChainGraph<P = TxHeight> { /* private fields */ }Expand description
A consistent combination of a SparseChain<P> and a TxGraph<T>.
SparseChain only keeps track of transaction ids and their position in the chain, but you often
want to store the full transactions as well. Additionally, you want to make sure that everything
in the chain is consistent with the full transaction data. ChainGraph enforces these two
@@ -80,7 +80,7 @@ in ascending order.
outpoint does not need to be in the graph or the chain for this to
return Some(_).
Trait Implementations§
source§impl<P> AsRef<ChainGraph<P>> for ChainGraph<P>
impl<P> AsRef<ChainGraph<P>> for ChainGraph<P>
source§fn as_ref(&self) -> &ChainGraph<P>
fn as_ref(&self) -> &ChainGraph<P>
source§impl<K, P> AsRef<ChainGraph<P>> for KeychainTracker<K, P>
impl<K, P> AsRef<ChainGraph<P>> for KeychainTracker<K, P>
source§fn as_ref(&self) -> &ChainGraph<P>
fn as_ref(&self) -> &ChainGraph<P>
source§impl<P> AsRef<SparseChain<P>> for ChainGraph<P>
impl<P> AsRef<SparseChain<P>> for ChainGraph<P>
source§fn as_ref(&self) -> &SparseChain<P>
fn as_ref(&self) -> &SparseChain<P>
source§impl<P> AsRef<TxGraph> for ChainGraph<P>
impl<P> AsRef<TxGraph> for ChainGraph<P>
source§impl<P: Clone> Clone for ChainGraph<P>
impl<P: Clone> Clone for ChainGraph<P>
source§fn clone(&self) -> ChainGraph<P>
fn clone(&self) -> ChainGraph<P>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moresource§impl<P: Debug> Debug for ChainGraph<P>
impl<P: Debug> Debug for ChainGraph<P>
source§impl<P> Default for ChainGraph<P>
impl<P> Default for ChainGraph<P>
source§impl<P> ForEachTxOut for ChainGraph<P>
impl<P> ForEachTxOut for ChainGraph<P>
source§fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
f will be called with each outpoint/txout pair.source§impl<K, P> From<ChainGraph<P>> for KeychainScan<K, P>
impl<K, P> From<ChainGraph<P>> for KeychainScan<K, P>
source§fn from(update: ChainGraph<P>) -> Self
fn from(update: ChainGraph<P>) -> Self
source§impl<P: PartialEq> PartialEq<ChainGraph<P>> for ChainGraph<P>
impl<P: PartialEq> PartialEq<ChainGraph<P>> for ChainGraph<P>
source§fn eq(&self, other: &ChainGraph<P>) -> bool
fn eq(&self, other: &ChainGraph<P>) -> bool
self and other values to be equal, and is used
+Trait Implementations§
source§impl<P> AsRef<ChainGraph<P>> for ChainGraph<P>
impl<P> AsRef<ChainGraph<P>> for ChainGraph<P>
source§fn as_ref(&self) -> &ChainGraph<P>
fn as_ref(&self) -> &ChainGraph<P>
source§impl<K, P> AsRef<ChainGraph<P>> for KeychainTracker<K, P>
impl<K, P> AsRef<ChainGraph<P>> for KeychainTracker<K, P>
source§fn as_ref(&self) -> &ChainGraph<P>
fn as_ref(&self) -> &ChainGraph<P>
source§impl<P> AsRef<SparseChain<P>> for ChainGraph<P>
impl<P> AsRef<SparseChain<P>> for ChainGraph<P>
source§fn as_ref(&self) -> &SparseChain<P>
fn as_ref(&self) -> &SparseChain<P>
source§impl<P: Clone> Clone for ChainGraph<P>
impl<P: Clone> Clone for ChainGraph<P>
source§fn clone(&self) -> ChainGraph<P>
fn clone(&self) -> ChainGraph<P>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moresource§impl<P: Debug> Debug for ChainGraph<P>
impl<P: Debug> Debug for ChainGraph<P>
source§impl<P> Default for ChainGraph<P>
impl<P> Default for ChainGraph<P>
source§impl<P> ForEachTxOut for ChainGraph<P>
impl<P> ForEachTxOut for ChainGraph<P>
source§fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
f will be called with each outpoint/txout pair.source§impl<K, P> From<ChainGraph<P>> for KeychainScan<K, P>
impl<K, P> From<ChainGraph<P>> for KeychainScan<K, P>
source§fn from(update: ChainGraph<P>) -> Self
fn from(update: ChainGraph<P>) -> Self
source§impl<P: PartialEq> PartialEq<ChainGraph<P>> for ChainGraph<P>
impl<P: PartialEq> PartialEq<ChainGraph<P>> for ChainGraph<P>
source§fn eq(&self, other: &ChainGraph<P>) -> bool
fn eq(&self, other: &ChainGraph<P>) -> bool
impl<P> StructuralPartialEq for ChainGraph<P>
Auto Trait Implementations§
impl<P> RefUnwindSafe for ChainGraph<P>where
P: RefUnwindSafe,
impl<P> Send for ChainGraph<P>where
P: Send,
impl<P> Sync for ChainGraph<P>where
P: Sync,
impl<P> Unpin for ChainGraph<P>where
P: Unpin,
impl<P> UnwindSafe for ChainGraph<P>where
P: UnwindSafe + RefUnwindSafe,
Blanket Implementations§
source§impl<T, U> Into<U> for Twhere
U: From<T>,
impl<T, U> Into<U> for Twhere
U: From<T>,
const: unstable · source§fn into(self) -> U
fn into(self) -> U
Calls U::from(self).
sourcepub fn contains_eviction(&self) -> bool
pub fn contains_eviction(&self) -> bool
Returns true if this ChangeSet contains transaction evictions.
sourcepub fn append(&mut self, other: ChangeSet<P>)where
P: ChainPosition,
pub fn append(&mut self, other: ChangeSet<P>)where
P: ChainPosition,
Appends the changes in other into self such that applying self afterward has the same
effect as sequentially applying the original self and other.
Trait Implementations§
source§impl<'de, P> Deserialize<'de> for ChangeSet<P>where
P: Deserialize<'de>,
impl<'de, P> Deserialize<'de> for ChangeSet<P>where
P: Deserialize<'de>,
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
source§impl<P> ForEachTxOut for ChangeSet<P>
impl<P> ForEachTxOut for ChangeSet<P>
source§fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
f will be called with each outpoint/txout pair.source§impl<K, P> From<ChangeSet<P>> for KeychainChangeSet<K, P>
impl<K, P> From<ChangeSet<P>> for KeychainChangeSet<K, P>
Trait Implementations§
source§impl<'de, P> Deserialize<'de> for ChangeSet<P>where
P: Deserialize<'de>,
impl<'de, P> Deserialize<'de> for ChangeSet<P>where
P: Deserialize<'de>,
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
source§impl<P> ForEachTxOut for ChangeSet<P>
impl<P> ForEachTxOut for ChangeSet<P>
source§fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
f will be called with each outpoint/txout pair.source§impl<K, P> From<ChangeSet<P>> for KeychainChangeSet<K, P>
impl<K, P> From<ChangeSet<P>> for KeychainChangeSet<K, P>
source§impl<P: PartialEq> PartialEq<ChangeSet<P>> for ChangeSet<P>
impl<P: PartialEq> PartialEq<ChangeSet<P>> for ChangeSet<P>
impl<P> StructuralPartialEq for ChangeSet<P>
Auto Trait Implementations§
impl<P> RefUnwindSafe for ChangeSet<P>where
P: RefUnwindSafe,
impl<P> Send for ChangeSet<P>where
P: Send,
impl<P> Sync for ChangeSet<P>where
P: Sync,
impl<P> Unpin for ChangeSet<P>
impl<P> UnwindSafe for ChangeSet<P>where
P: RefUnwindSafe,
Blanket Implementations§
source§impl<T, U> Into<U> for Twhere
U: From<T>,
impl<T, U> Into<U> for Twhere
U: From<T>,
const: unstable · source§fn into(self) -> U
fn into(self) -> U
Calls U::from(self).
Redirecting to ../../bdk_chain/trait.ChainOracle.html...
+ + + \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/constant.COINBASE_MATURITY.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/constant.COINBASE_MATURITY.html index 90b7284b60..cf47758c6c 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/constant.COINBASE_MATURITY.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/constant.COINBASE_MATURITY.html @@ -1,2 +1,2 @@ -Constant bdk_chain::COINBASE_MATURITY
source · pub const COINBASE_MATURITY: u32 = 100;Expand description
How many confirmations are needed f or a coinbase output to be spent.
+Constant bdk_chain::COINBASE_MATURITY
source · pub const COINBASE_MATURITY: u32 = 100;Expand description
How many confirmations are needed f or a coinbase output to be spent.
Enum bdk_chain::ConfirmationTime
source · pub enum ConfirmationTime {
+ConfirmationTime in bdk_chain - Rust Enum bdk_chain::ConfirmationTime
source · Expand description
Block height and timestamp at which a transaction is confirmed.
-Variants§
Implementations§
source§impl ConfirmationTime
sourcepub fn is_confirmed(&self) -> bool
Trait Implementations§
source§impl ChainPosition for ConfirmationTime
source§fn max_ord_of_height(height: TxHeight) -> Self
Get the positionâs upper bound of a given height.source§fn min_ord_of_height(height: TxHeight) -> Self
Get the positionâs lower bound of a given height.source§fn unconfirmed() -> Self
Get the unconfirmed position.source§impl Clone for ConfirmationTime
source§fn clone(&self) -> ConfirmationTime
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moresource§impl Debug for ConfirmationTime
source§impl<'de> Deserialize<'de> for ConfirmationTime
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read moresource§impl Hash for ConfirmationTime
source§impl Ord for ConfirmationTime
source§fn cmp(&self, other: &ConfirmationTime) -> Ordering
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
Compares and returns the maximum of two values. Read moresource§impl PartialEq<ConfirmationTime> for ConfirmationTime
source§fn eq(&self, other: &ConfirmationTime) -> bool
This method tests for self and other values to be equal, and is used
+Variants§
Implementations§
source§impl ConfirmationTime
sourcepub fn is_confirmed(&self) -> bool
Trait Implementations§
source§impl ChainPosition for ConfirmationTime
source§fn max_ord_of_height(height: TxHeight) -> Self
Get the positionâs upper bound of a given height.source§fn min_ord_of_height(height: TxHeight) -> Self
Get the positionâs lower bound of a given height.source§fn unconfirmed() -> Self
Get the unconfirmed position.source§impl Clone for ConfirmationTime
source§fn clone(&self) -> ConfirmationTime
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moresource§impl Debug for ConfirmationTime
source§impl<'de> Deserialize<'de> for ConfirmationTime
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read moresource§impl Hash for ConfirmationTime
source§impl Ord for ConfirmationTime
source§fn cmp(&self, other: &ConfirmationTime) -> Ordering
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
Compares and returns the maximum of two values. Read moresource§impl PartialEq<ConfirmationTime> for ConfirmationTime
source§fn eq(&self, other: &ConfirmationTime) -> bool
source§impl PartialOrd<ConfirmationTime> for ConfirmationTime
source§impl PartialOrd<ConfirmationTime> for ConfirmationTime
source§fn partial_cmp(&self, other: &ConfirmationTime) -> Option<Ordering>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
This method tests less than or equal to (for self and other) and is used by the <=
operator. Read moresource§impl Serialize for ConfirmationTime
source§impl Copy for ConfirmationTime
source§impl Eq for ConfirmationTime
source§impl StructuralEq for ConfirmationTime
source§impl StructuralPartialEq for ConfirmationTime
Auto Trait Implementations§
§impl RefUnwindSafe for ConfirmationTime
§impl Send for ConfirmationTime
§impl Sync for ConfirmationTime
§impl Unpin for ConfirmationTime
§impl UnwindSafe for ConfirmationTime
Blanket Implementations§
source§impl Serialize for ConfirmationTime
source§impl Copy for ConfirmationTime
source§impl Eq for ConfirmationTime
source§impl StructuralEq for ConfirmationTime
source§impl StructuralPartialEq for ConfirmationTime
Auto Trait Implementations§
§impl RefUnwindSafe for ConfirmationTime
§impl Send for ConfirmationTime
§impl Sync for ConfirmationTime
§impl Unpin for ConfirmationTime
§impl UnwindSafe for ConfirmationTime
Blanket Implementations§
source§impl<T, U> Into<U> for Twhere
U: From<T>,
const: unstable · source§fn into(self) -> U
Calls U::from(self).
That is, this conversion is whatever the implementation of
From<T> for U chooses to do.
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.ObservedAs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.ObservedAs.html
new file mode 100644
index 0000000000..92a02eac13
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.ObservedAs.html
@@ -0,0 +1,16 @@
+ObservedAs in bdk_chain - Rust Enum bdk_chain::ObservedAs
source · pub enum ObservedAs<A> {
+ Confirmed(A),
+ Unconfirmed(u64),
+}
Expand description
Represents an observation of some chain data.
+The generic A should be a Anchor implementation.
+Variants§
§Confirmed(A)
The chain data is seen as confirmed, and in anchored by A.
+§Unconfirmed(u64)
The chain data is seen in mempool at this given timestamp.
+Implementations§
source§impl<A: Clone> ObservedAs<&A>
sourcepub fn cloned(self) -> ObservedAs<A>
Trait Implementations§
source§impl<A: Clone> Clone for ObservedAs<A>
source§fn clone(&self) -> ObservedAs<A>
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moresource§impl<A: Debug> Debug for ObservedAs<A>
source§impl<A: Hash> Hash for ObservedAs<A>
source§impl<A: Ord> Ord for ObservedAs<A>
source§fn cmp(&self, other: &ObservedAs<A>) -> Ordering
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
Compares and returns the maximum of two values. Read moresource§impl<A: PartialEq> PartialEq<ObservedAs<A>> for ObservedAs<A>
source§fn eq(&self, other: &ObservedAs<A>) -> bool
source§impl<A: PartialOrd> PartialOrd<ObservedAs<A>> for ObservedAs<A>
source§fn partial_cmp(&self, other: &ObservedAs<A>) -> Option<Ordering>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
This method tests less than or equal to (for self and other) and is used by the <=
+operator. Read moresource§impl<A: Copy> Copy for ObservedAs<A>
source§impl<A: Eq> Eq for ObservedAs<A>
source§impl<A> StructuralEq for ObservedAs<A>
source§impl<A> StructuralPartialEq for ObservedAs<A>
Auto Trait Implementations§
§impl<A> RefUnwindSafe for ObservedAs<A>where
A: RefUnwindSafe,
§impl<A> Send for ObservedAs<A>where
A: Send,
§impl<A> Sync for ObservedAs<A>where
A: Sync,
§impl<A> Unpin for ObservedAs<A>where
A: Unpin,
§impl<A> UnwindSafe for ObservedAs<A>where
A: UnwindSafe,
Blanket Implementations§
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.TxHeight.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.TxHeight.html
index 0f43c2130a..84de3f56e2 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.TxHeight.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.TxHeight.html
@@ -1,12 +1,12 @@
-TxHeight in bdk_chain - Rust pub enum TxHeight {
+TxHeight in bdk_chain - Rust pub enum TxHeight {
Confirmed(u32),
Unconfirmed,
}
Expand description
Represents the height at which a transaction is confirmed.
-Variants§
Implementations§
Trait Implementations§
source§impl ChainPosition for TxHeight
source§fn max_ord_of_height(height: TxHeight) -> Self
Get the positionâs upper bound of a given height.source§fn min_ord_of_height(height: TxHeight) -> Self
Get the positionâs lower bound of a given height.source§fn unconfirmed() -> Self
Get the unconfirmed position.source§impl<'de> Deserialize<'de> for TxHeight
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read moresource§impl Ord for TxHeight
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
Compares and returns the maximum of two values. Read moresource§impl PartialEq<TxHeight> for TxHeight
source§fn eq(&self, other: &TxHeight) -> bool
This method tests for self and other values to be equal, and is used
+Variants§
Implementations§
Trait Implementations§
source§impl ChainPosition for TxHeight
source§fn max_ord_of_height(height: TxHeight) -> Self
Get the positionâs upper bound of a given height.source§fn min_ord_of_height(height: TxHeight) -> Self
Get the positionâs lower bound of a given height.source§fn unconfirmed() -> Self
Get the unconfirmed position.source§impl<'de> Deserialize<'de> for TxHeight
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read moresource§impl Ord for TxHeight
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
Compares and returns the maximum of two values. Read moresource§impl PartialOrd<TxHeight> for TxHeight
source§impl PartialOrd<TxHeight> for TxHeight
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
This method tests less than or equal to (for self and other) and is used by the <=
operator. Read moresource§impl Copy for TxHeight
source§impl Eq for TxHeight
source§impl StructuralEq for TxHeight
source§impl StructuralPartialEq for TxHeight
Auto Trait Implementations§
§impl RefUnwindSafe for TxHeight
§impl Send for TxHeight
§impl Sync for TxHeight
§impl Unpin for TxHeight
§impl UnwindSafe for TxHeight
Blanket Implementations§
source§impl Copy for TxHeight
source§impl Eq for TxHeight
source§impl StructuralEq for TxHeight
source§impl StructuralPartialEq for TxHeight
Auto Trait Implementations§
§impl RefUnwindSafe for TxHeight
§impl Send for TxHeight
§impl Sync for TxHeight
§impl Unpin for TxHeight
§impl UnwindSafe for TxHeight
Blanket Implementations§
source§impl<T, U> Into<U> for Twhere
U: From<T>,
const: unstable · source§fn into(self) -> U
Calls U::from(self).
That is, this conversion is whatever the implementation of
From<T> for U chooses to do.
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/index.html
index fae5df0e19..8e4806b3ec 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/index.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/index.html
@@ -1,4 +1,4 @@
-bdk_chain - Rust Expand description
This crate is a collection of core structures for Bitcoin Dev Kit (alpha release).
+bdk_chain - Rust Expand description
This crate is a collection of core structures for Bitcoin Dev Kit (alpha release).
The goal of this crate is to give wallets the mechanisms needed to:
- Figure out what data they need to fetch.
@@ -15,4 +15,4 @@ consistently.
- Data persistence agnostic â
bdk_chain does not care where you cache on-chain data, what you
cache or how you fetch it.
-Re-exports
Modules
Module for structures that combine the features of sparse_chain and tx_graph.Module for keychain related structures.Module for structures that maintain sparse (purposely incomplete) snapshots of blockchain data.Module for structures that store and traverse transactions.Structs
A reference to a block in the canonical chain.A TxOut with as much data as we can retrieve about itAn index storing TxOuts that have a script pubkey that matches those in a list.Enums
Block height and timestamp at which a transaction is confirmed.Represents the height at which a transaction is confirmed.Constants
How many confirmations are needed f or a coinbase output to be spent.Traits
A trait to extend the functionality of a miniscript descriptor.Trait to do something with every txout contained in a structure.
\ No newline at end of file
+Re-exports
Modules
Module for structures that combine the features of sparse_chain and tx_graph.Module for keychain related structures.Module for structures that maintain sparse (purposely incomplete) snapshots of blockchain data.Module for structures that store and traverse transactions.Structs
A reference to a block in the canonical chain.A TxOut with as much data as we can retrieve about itAn index storing TxOuts that have a script pubkey that matches those in a list.Enums
Block height and timestamp at which a transaction is confirmed.Represents an observation of some chain data.Represents the height at which a transaction is confirmed.Constants
How many confirmations are needed f or a coinbase output to be spent.Traits
Trait that âanchorsâ blockchain data to a specific block of height and hash.Trait that makes an object appendable.Represents a service that tracks the blockchain.A trait to extend the functionality of a miniscript descriptor.Trait to do something with every txout contained in a structure.
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/index.html
new file mode 100644
index 0000000000..dc4e6b4a87
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/index.html
@@ -0,0 +1 @@
+bdk_chain::indexed_tx_graph - Rust Module bdk_chain::indexed_tx_graph
source · Structs
A structure that represents changes to an IndexedTxGraph.Traits
Represents a structure that can index transaction data.A trait that extends Indexer to also index âownedâ script pubkeys.
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/sidebar-items.js
new file mode 100644
index 0000000000..c28daaac7b
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"struct":[["IndexedAdditions","A structure that represents changes to an [`IndexedTxGraph`]."],["IndexedTxGraph","A struct that combines [`TxGraph`] and an [`Indexer`] implementation."]],"trait":[["Indexer","Represents a structure that can index transaction data."],["OwnedIndexer","A trait that extends [`Indexer`] to also index âownedâ script pubkeys."]]};
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/struct.IndexedAdditions.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/struct.IndexedAdditions.html
new file mode 100644
index 0000000000..b7be12afa4
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/struct.IndexedAdditions.html
@@ -0,0 +1,13 @@
+IndexedAdditions in bdk_chain::indexed_tx_graph - Rust Struct bdk_chain::indexed_tx_graph::IndexedAdditions
source · pub struct IndexedAdditions<A, IA> {
+ pub graph_additions: Additions<A>,
+ pub index_additions: IA,
+}
Expand description
A structure that represents changes to an IndexedTxGraph.
+Fields§
§graph_additions: Additions<A>TxGraph additions.
+§index_additions: IAIndexer additions.
+Trait Implementations§
source§impl<A: Clone, IA: Clone> Clone for IndexedAdditions<A, IA>
source§fn clone(&self) -> IndexedAdditions<A, IA>
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moresource§impl<A, IA: Default> Default for IndexedAdditions<A, IA>
source§impl<'de, A, IA> Deserialize<'de> for IndexedAdditions<A, IA>where
A: Ord + Deserialize<'de>,
IA: Deserialize<'de>,
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read moresource§impl<A: PartialEq, IA: PartialEq> PartialEq<IndexedAdditions<A, IA>> for IndexedAdditions<A, IA>
source§fn eq(&self, other: &IndexedAdditions<A, IA>) -> bool
source§impl<A, IA> StructuralPartialEq for IndexedAdditions<A, IA>
Auto Trait Implementations§
§impl<A, IA> RefUnwindSafe for IndexedAdditions<A, IA>where
A: RefUnwindSafe,
IA: RefUnwindSafe,
§impl<A, IA> Send for IndexedAdditions<A, IA>where
A: Send,
IA: Send,
§impl<A, IA> Sync for IndexedAdditions<A, IA>where
A: Sync,
IA: Sync,
§impl<A, IA> Unpin for IndexedAdditions<A, IA>where
IA: Unpin,
§impl<A, IA> UnwindSafe for IndexedAdditions<A, IA>where
A: RefUnwindSafe,
IA: UnwindSafe,
Blanket Implementations§
source§impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/struct.IndexedTxGraph.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/struct.IndexedTxGraph.html
new file mode 100644
index 0000000000..6e547e51ff
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/struct.IndexedTxGraph.html
@@ -0,0 +1,24 @@
+IndexedTxGraph in bdk_chain::indexed_tx_graph - Rust Struct bdk_chain::indexed_tx_graph::IndexedTxGraph
source · pub struct IndexedTxGraph<A, I> {
+ pub index: I,
+ /* private fields */
+}
Expand description
Fields§
§index: ITransaction index.
+Implementations§
source§impl<A: Anchor, I: Indexer> IndexedTxGraph<A, I>
sourcepub fn apply_additions(&mut self, additions: IndexedAdditions<A, I::Additions>)
Applies the IndexedAdditions to the IndexedTxGraph.
+source§impl<A: Anchor, I: Indexer> IndexedTxGraph<A, I>where
I::Additions: Default + Append,
sourcepub fn apply_update(
&mut self,
update: TxGraph<A>
) -> IndexedAdditions<A, I::Additions>
Apply an update directly.
+update is a TxGraph<A> and the resultant changes is returned as IndexedAdditions.
+sourcepub fn insert_txout(
&mut self,
outpoint: OutPoint,
txout: &TxOut
) -> IndexedAdditions<A, I::Additions>
Insert a floating txout of given outpoint.
+sourcepub fn insert_tx(
&mut self,
tx: &Transaction,
anchors: impl IntoIterator<Item = A>,
seen_at: Option<u64>
) -> IndexedAdditions<A, I::Additions>
Insert and index a transaction into the graph.
+anchors can be provided to anchor the transaction to various blocks. seen_at is a
+unix timestamp of when the transaction is last seen.
+sourcepub fn insert_relevant_txs<'t>(
&mut self,
txs: impl IntoIterator<Item = (&'t Transaction, impl IntoIterator<Item = A>)>,
seen_at: Option<u64>
) -> IndexedAdditions<A, I::Additions>
Insert relevant transactions from the given txs iterator.
+Relevancy is determined by the Indexer::is_tx_relevant implementation of I. Irrelevant
+transactions in txs will be ignored. txs do not need to be in topological order.
+anchors can be provided to anchor the transactions to blocks. seen_at is a unix
+timestamp of when the transactions are last seen.
+source§impl<A: Anchor, I: OwnedIndexer> IndexedTxGraph<A, I>
sourcepub fn try_list_owned_txouts<'a, C: ChainOracle + 'a>(
&'a self,
chain: &'a C,
chain_tip: BlockId
) -> impl Iterator<Item = Result<FullTxOut<ObservedAs<A>>, C::Error>> + 'a
sourcepub fn list_owned_txouts<'a, C: ChainOracle<Error = Infallible> + 'a>(
&'a self,
chain: &'a C,
chain_tip: BlockId
) -> impl Iterator<Item = FullTxOut<ObservedAs<A>>> + 'a
sourcepub fn try_list_owned_unspents<'a, C: ChainOracle + 'a>(
&'a self,
chain: &'a C,
chain_tip: BlockId
) -> impl Iterator<Item = Result<FullTxOut<ObservedAs<A>>, C::Error>> + 'a
sourcepub fn list_owned_unspents<'a, C: ChainOracle<Error = Infallible> + 'a>(
&'a self,
chain: &'a C,
chain_tip: BlockId
) -> impl Iterator<Item = FullTxOut<ObservedAs<A>>> + 'a
sourcepub fn try_balance<C, F>(
&self,
chain: &C,
chain_tip: BlockId,
should_trust: F
) -> Result<Balance, C::Error>where
C: ChainOracle,
F: FnMut(&Script) -> bool,
sourcepub fn balance<C, F>(
&self,
chain: &C,
chain_tip: BlockId,
should_trust: F
) -> Balancewhere
C: ChainOracle<Error = Infallible>,
F: FnMut(&Script) -> bool,
Trait Implementations§
Auto Trait Implementations§
§impl<A, I> RefUnwindSafe for IndexedTxGraph<A, I>where
A: RefUnwindSafe,
I: RefUnwindSafe,
§impl<A, I> Send for IndexedTxGraph<A, I>where
A: Send,
I: Send,
§impl<A, I> Sync for IndexedTxGraph<A, I>where
A: Sync,
I: Sync,
§impl<A, I> Unpin for IndexedTxGraph<A, I>where
I: Unpin,
§impl<A, I> UnwindSafe for IndexedTxGraph<A, I>where
A: RefUnwindSafe,
I: UnwindSafe,
Blanket Implementations§
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/trait.Indexer.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/trait.Indexer.html
new file mode 100644
index 0000000000..3016904dba
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/trait.Indexer.html
@@ -0,0 +1,14 @@
+Indexer in bdk_chain::indexed_tx_graph - Rust Trait bdk_chain::indexed_tx_graph::Indexer
source · pub trait Indexer {
+ type Additions;
+
+ fn index_txout(
&mut self,
outpoint: OutPoint,
txout: &TxOut
) -> Self::Additions;
+ fn index_tx(&mut self, tx: &Transaction) -> Self::Additions;
+ fn apply_additions(&mut self, additions: Self::Additions);
+ fn is_tx_relevant(&self, tx: &Transaction) -> bool;
+}
Expand description
Represents a structure that can index transaction data.
+Required Associated Types§
Required Methods§
sourcefn index_txout(&mut self, outpoint: OutPoint, txout: &TxOut) -> Self::Additions
Scan and index the given outpoint and txout.
+sourcefn index_tx(&mut self, tx: &Transaction) -> Self::Additions
Scan and index the given transaction.
+sourcefn apply_additions(&mut self, additions: Self::Additions)
Apply additions to itself.
+sourcefn is_tx_relevant(&self, tx: &Transaction) -> bool
Determines whether the transaction should be included in the index.
+Implementors§
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/trait.OwnedIndexer.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/trait.OwnedIndexer.html
new file mode 100644
index 0000000000..cad231de6d
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/trait.OwnedIndexer.html
@@ -0,0 +1,5 @@
+OwnedIndexer in bdk_chain::indexed_tx_graph - Rust Trait bdk_chain::indexed_tx_graph::OwnedIndexer
source · pub trait OwnedIndexer: Indexer {
+ fn is_spk_owned(&self, spk: &Script) -> bool;
+}
Expand description
A trait that extends Indexer to also index âownedâ script pubkeys.
+Required Methods§
sourcefn is_spk_owned(&self, spk: &Script) -> bool
Determines whether a given script pubkey (spk) is owned.
+Implementors§
source§impl<I: Clone + Ord + 'static> OwnedIndexer for SpkTxOutIndex<I>
source§impl<K: Clone + Ord + Debug + 'static> OwnedIndexer for KeychainTxOutIndex<K>
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/constant.BIP32_MAX_INDEX.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/constant.BIP32_MAX_INDEX.html
index cace177a79..5fd7a2ea02 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/constant.BIP32_MAX_INDEX.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/constant.BIP32_MAX_INDEX.html
@@ -1,2 +1,2 @@
-BIP32_MAX_INDEX in bdk_chain::keychain - Rust Constant bdk_chain::keychain::BIP32_MAX_INDEX
source · pub const BIP32_MAX_INDEX: u32 = _; // 2_147_483_647u32
Expand description
Maximum BIP32 derivation index.
+BIP32_MAX_INDEX in bdk_chain::keychain - Rust
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/index.html
index 68b7a79968..434334ecf4 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/index.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/index.html
@@ -1,4 +1,4 @@
-bdk_chain::keychain - Rust Expand description
Module for keychain related structures.
+bdk_chain::keychain - Rust Expand description
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.
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.Balance.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.Balance.html
index 4a4a26d98c..ed16d706a3 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.Balance.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.Balance.html
@@ -1,4 +1,4 @@
-Balance in bdk_chain::keychain - Rust pub struct Balance {
+Balance in bdk_chain::keychain - Rust pub struct Balance {
pub immature: u64,
pub trusted_pending: u64,
pub untrusted_pending: u64,
@@ -8,13 +8,13 @@
§trusted_pending: u64Unconfirmed UTXOs generated by a wallet tx
§untrusted_pending: u64Unconfirmed UTXOs received from an external wallet
§confirmed: u64Confirmed and immediately spendable balance
-Implementations§
source§impl Balance
sourcepub fn trusted_spendable(&self) -> u64
Get sum of trusted_pending and confirmed coins.
+Implementations§
Trait Implementations§
source§impl<'de> Deserialize<'de> for Balance
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read moreTrait Implementations§
source§impl<'de> Deserialize<'de> for Balance
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read moresource§impl Eq for Balance
source§impl StructuralEq for Balance
source§impl StructuralPartialEq for Balance
Auto Trait Implementations§
§impl RefUnwindSafe for Balance
§impl Send for Balance
§impl Sync for Balance
§impl Unpin for Balance
§impl UnwindSafe for Balance
Blanket Implementations§
source§impl Eq for Balance
source§impl StructuralEq for Balance
source§impl StructuralPartialEq for Balance
Auto Trait Implementations§
§impl RefUnwindSafe for Balance
§impl Send for Balance
§impl Sync for Balance
§impl Unpin for Balance
§impl UnwindSafe for Balance
Blanket Implementations§
source§impl<T, U> Into<U> for Twhere
U: From<T>,
const: unstable · source§fn into(self) -> U
Calls U::from(self).
That is, this conversion is whatever the implementation of
From<T> for U chooses to do.
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.DerivationAdditions.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.DerivationAdditions.html
index 96a3bca32e..3f7868f341 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.DerivationAdditions.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.DerivationAdditions.html
@@ -1,14 +1,14 @@
-DerivationAdditions in bdk_chain::keychain - Rust Struct bdk_chain::keychain::DerivationAdditions
source · Expand description
Represents updates to the derivation index of a KeychainTxOutIndex.
+DerivationAdditions in bdk_chain::keychain - Rust Struct bdk_chain::keychain::DerivationAdditions
source · Expand description
Represents updates to the derivation index of a KeychainTxOutIndex.
It can be applied to KeychainTxOutIndex with apply_additions. `DerivationAdditions are
monotone in that they will never decrease the revealed derivation index.
-Tuple Fields§
§0: BTreeMap<K, u32>Implementations§
source§impl<K> DerivationAdditions<K>
source§impl<K: Ord> DerivationAdditions<K>
sourcepub fn append(&mut self, other: Self)
Append another DerivationAdditions into self.
+Tuple Fields§
§0: BTreeMap<K, u32>Implementations§
Trait Implementations§
source§impl<K: Ord> Append for DerivationAdditions<K>
source§fn append(&mut self, other: Self)
Append another DerivationAdditions into self.
If the keychain already exists, increase the index when the otherâs index > selfâs index.
If the keychain did not exist, append the new keychain.
-Trait Implementations§
source§impl<K: Clone> Clone for DerivationAdditions<K>
source§fn clone(&self) -> DerivationAdditions<K>
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moresource§impl<K: Debug> Debug for DerivationAdditions<K>
source§impl<K> Default for DerivationAdditions<K>
source§impl<'de, K> Deserialize<'de> for DerivationAdditions<K>where
K: Ord + Deserialize<'de>,
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read moresource§impl<K, P> From<DerivationAdditions<K>> for KeychainChangeSet<K, P>
source§fn from(additions: DerivationAdditions<K>) -> Self
Converts to this type from the input type.source§impl<K: PartialEq> PartialEq<DerivationAdditions<K>> for DerivationAdditions<K>
source§fn eq(&self, other: &DerivationAdditions<K>) -> bool
This method tests for self and other values to be equal, and is used
+source§impl<K: Clone> Clone for DerivationAdditions<K>
source§fn clone(&self) -> DerivationAdditions<K>
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moresource§impl<K: Debug> Debug for DerivationAdditions<K>
source§impl<K> Default for DerivationAdditions<K>
source§impl<'de, K> Deserialize<'de> for DerivationAdditions<K>where
K: Ord + Deserialize<'de>,
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read moresource§impl<K, P> From<DerivationAdditions<K>> for KeychainChangeSet<K, P>
source§fn from(additions: DerivationAdditions<K>) -> Self
Converts to this type from the input type.source§impl<K: PartialEq> PartialEq<DerivationAdditions<K>> for DerivationAdditions<K>
source§fn eq(&self, other: &DerivationAdditions<K>) -> bool
source§impl<K> StructuralPartialEq for DerivationAdditions<K>
Auto Trait Implementations§
§impl<K> RefUnwindSafe for DerivationAdditions<K>where
K: RefUnwindSafe,
§impl<K> Send for DerivationAdditions<K>where
K: Send,
§impl<K> Sync for DerivationAdditions<K>where
K: Sync,
§impl<K> Unpin for DerivationAdditions<K>
§impl<K> UnwindSafe for DerivationAdditions<K>where
K: RefUnwindSafe,
Blanket Implementations§
source§impl<K> StructuralPartialEq for DerivationAdditions<K>
Auto Trait Implementations§
§impl<K> RefUnwindSafe for DerivationAdditions<K>where
K: RefUnwindSafe,
§impl<K> Send for DerivationAdditions<K>where
K: Send,
§impl<K> Sync for DerivationAdditions<K>where
K: Sync,
§impl<K> Unpin for DerivationAdditions<K>
§impl<K> UnwindSafe for DerivationAdditions<K>where
K: RefUnwindSafe,
Blanket Implementations§
source§impl<T, U> Into<U> for Twhere
U: From<T>,
const: unstable · source§fn into(self) -> U
Calls U::from(self).
That is, this conversion is whatever the implementation of
From<T> for U chooses to do.
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainChangeSet.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainChangeSet.html
index af47e0e54e..6dafa0d7c9 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainChangeSet.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainChangeSet.html
@@ -1,16 +1,16 @@
-KeychainChangeSet in bdk_chain::keychain - Rust Struct bdk_chain::keychain::KeychainChangeSet
source · pub struct KeychainChangeSet<K, P> {
+KeychainChangeSet in bdk_chain::keychain - Rust Struct bdk_chain::keychain::KeychainChangeSet
source · pub struct KeychainChangeSet<K, P> {
pub derivation_indices: DerivationAdditions<K>,
pub chain_graph: ChangeSet<P>,
}
Expand description
Represents changes to a KeychainTracker.
This is essentially a combination of DerivationAdditions and chain_graph::ChangeSet.
Fields§
§derivation_indices: DerivationAdditions<K>The changes in local keychain derivation indices
§chain_graph: ChangeSet<P>The changes that have occurred in the blockchain
-Implementations§
source§impl<K, P> KeychainChangeSet<K, P>
sourcepub fn is_empty(&self) -> bool
Returns whether the KeychainChangeSet is empty (no changes recorded).
-sourcepub fn append(&mut self, other: KeychainChangeSet<K, P>)where
K: Ord,
P: ChainPosition,
Appends the changes in other into self such that applying self afterward has the same
+
Implementations§
source§impl<K, P> KeychainChangeSet<K, P>
sourcepub fn is_empty(&self) -> bool
Returns whether the KeychainChangeSet is empty (no changes recorded).
+sourcepub fn append(&mut self, other: KeychainChangeSet<K, P>)where
K: Ord,
P: ChainPosition,
Appends the changes in other into self such that applying self afterward has the same
effect as sequentially applying the original self and other.
Note the derivation indices cannot be decreased, so other will only change the derivation
index for a keychain, if itâs value is higher than the one in self.
-Trait Implementations§
source§impl<K: Clone, P: Clone> Clone for KeychainChangeSet<K, P>
source§fn clone(&self) -> KeychainChangeSet<K, P>
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moresource§impl<K, P> Default for KeychainChangeSet<K, P>
source§impl<'de, K, P> Deserialize<'de> for KeychainChangeSet<K, P>where
K: Ord + Deserialize<'de>,
P: Deserialize<'de>,
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read moresource§impl<K, P> ForEachTxOut for KeychainChangeSet<K, P>
source§fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
The provided closure f will be called with each outpoint/txout pair.source§impl<K, P> From<ChangeSet<P>> for KeychainChangeSet<K, P>
source§impl<K, P> From<DerivationAdditions<K>> for KeychainChangeSet<K, P>
source§fn from(additions: DerivationAdditions<K>) -> Self
Converts to this type from the input type.Auto Trait Implementations§
§impl<K, P> RefUnwindSafe for KeychainChangeSet<K, P>where
K: RefUnwindSafe,
P: RefUnwindSafe,
§impl<K, P> Send for KeychainChangeSet<K, P>where
K: Send,
P: Send,
§impl<K, P> Sync for KeychainChangeSet<K, P>where
K: Sync,
P: Sync,
§impl<K, P> Unpin for KeychainChangeSet<K, P>
§impl<K, P> UnwindSafe for KeychainChangeSet<K, P>where
K: RefUnwindSafe,
P: RefUnwindSafe,
Blanket Implementations§
Trait Implementations§
source§impl<K: Clone, P: Clone> Clone for KeychainChangeSet<K, P>
source§fn clone(&self) -> KeychainChangeSet<K, P>
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moresource§impl<K, P> Default for KeychainChangeSet<K, P>
source§impl<'de, K, P> Deserialize<'de> for KeychainChangeSet<K, P>where
K: Ord + Deserialize<'de>,
P: Deserialize<'de>,
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read moresource§impl<K, P> ForEachTxOut for KeychainChangeSet<K, P>
source§fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
The provided closure f will be called with each outpoint/txout pair.source§impl<K, P> From<ChangeSet<P>> for KeychainChangeSet<K, P>
source§impl<K, P> From<DerivationAdditions<K>> for KeychainChangeSet<K, P>
source§fn from(additions: DerivationAdditions<K>) -> Self
Converts to this type from the input type.Auto Trait Implementations§
§impl<K, P> RefUnwindSafe for KeychainChangeSet<K, P>where
K: RefUnwindSafe,
P: RefUnwindSafe,
§impl<K, P> Send for KeychainChangeSet<K, P>where
K: Send,
P: Send,
§impl<K, P> Sync for KeychainChangeSet<K, P>where
K: Sync,
P: Sync,
§impl<K, P> Unpin for KeychainChangeSet<K, P>
§impl<K, P> UnwindSafe for KeychainChangeSet<K, P>where
K: RefUnwindSafe,
P: RefUnwindSafe,
Blanket Implementations§
source§impl<T, U> Into<U> for Twhere
U: From<T>,
const: unstable · source§fn into(self) -> U
Calls U::from(self).
That is, this conversion is whatever the implementation of
From<T> for U chooses to do.
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainScan.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainScan.html
index 1fb3f1baa0..86c2bc731a 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainScan.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainScan.html
@@ -1,12 +1,12 @@
-KeychainScan in bdk_chain::keychain - Rust Struct bdk_chain::keychain::KeychainScan
source · pub struct KeychainScan<K, P> {
+KeychainScan in bdk_chain::keychain - Rust Struct bdk_chain::keychain::KeychainScan
source · pub struct KeychainScan<K, P> {
pub update: ChainGraph<P>,
pub last_active_indices: BTreeMap<K, u32>,
}
Expand description
An update that includes the last active indexes of each keychain.
Fields§
§update: ChainGraph<P>The update data in the form of a chain that could be applied
§last_active_indices: BTreeMap<K, u32>The last active indexes of each keychain
-Trait Implementations§
source§impl<K, P> AsRef<TxGraph> for KeychainScan<K, P>
source§impl<K: Clone, P: Clone> Clone for KeychainScan<K, P>
source§fn clone(&self) -> KeychainScan<K, P>
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moresource§impl<K, P> Default for KeychainScan<K, P>
source§impl<K, P> From<ChainGraph<P>> for KeychainScan<K, P>
source§fn from(update: ChainGraph<P>) -> Self
Converts to this type from the input type.source§impl<K: PartialEq, P: PartialEq> PartialEq<KeychainScan<K, P>> for KeychainScan<K, P>
source§fn eq(&self, other: &KeychainScan<K, P>) -> bool
This method tests for self and other values to be equal, and is used
+Trait Implementations§
source§impl<K: Clone, P: Clone> Clone for KeychainScan<K, P>
source§fn clone(&self) -> KeychainScan<K, P>
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moresource§impl<K, P> Default for KeychainScan<K, P>
source§impl<K, P> From<ChainGraph<P>> for KeychainScan<K, P>
source§fn from(update: ChainGraph<P>) -> Self
Converts to this type from the input type.source§impl<K: PartialEq, P: PartialEq> PartialEq<KeychainScan<K, P>> for KeychainScan<K, P>
source§fn eq(&self, other: &KeychainScan<K, P>) -> bool
source§impl<K, P> StructuralPartialEq for KeychainScan<K, P>
Auto Trait Implementations§
§impl<K, P> RefUnwindSafe for KeychainScan<K, P>where
K: RefUnwindSafe,
P: RefUnwindSafe,
§impl<K, P> Send for KeychainScan<K, P>where
K: Send,
P: Send,
§impl<K, P> Sync for KeychainScan<K, P>where
K: Sync,
P: Sync,
§impl<K, P> Unpin for KeychainScan<K, P>where
P: Unpin,
§impl<K, P> UnwindSafe for KeychainScan<K, P>where
K: RefUnwindSafe,
P: UnwindSafe + RefUnwindSafe,
Blanket Implementations§
source§impl<K, P> StructuralPartialEq for KeychainScan<K, P>
Auto Trait Implementations§
§impl<K, P> RefUnwindSafe for KeychainScan<K, P>where
K: RefUnwindSafe,
P: RefUnwindSafe,
§impl<K, P> Send for KeychainScan<K, P>where
K: Send,
P: Send,
§impl<K, P> Sync for KeychainScan<K, P>where
K: Sync,
P: Sync,
§impl<K, P> Unpin for KeychainScan<K, P>where
P: Unpin,
§impl<K, P> UnwindSafe for KeychainScan<K, P>where
K: RefUnwindSafe,
P: UnwindSafe + RefUnwindSafe,
Blanket Implementations§
source§impl<T, U> Into<U> for Twhere
U: From<T>,
const: unstable · source§fn into(self) -> U
Calls U::from(self).
That is, this conversion is whatever the implementation of
From<T> for U chooses to do.
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainTracker.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainTracker.html
index b126f93d08..a5bb940441 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainTracker.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainTracker.html
@@ -1,4 +1,4 @@
-KeychainTracker in bdk_chain::keychain - Rust Struct bdk_chain::keychain::KeychainTracker
source · pub struct KeychainTracker<K, P> {
+KeychainTracker in bdk_chain::keychain - Rust Struct bdk_chain::keychain::KeychainTracker
source · pub struct KeychainTracker<K, P> {
pub txout_index: KeychainTxOutIndex<K>,
/* private fields */
}
Expand description
A convenient combination of a KeychainTxOutIndex and a ChainGraph.
@@ -65,7 +65,7 @@ a payment made to addresses on that keychain.
where the unconfirmed outputâs value is accounted for in Balance.
sourcepub fn balance_at(&self, height: u32) -> u64
Returns the balance of all spendable confirmed unspent outputs of this tracker at a
particular height.
-
Trait Implementations§
source§impl<K, P> AsRef<ChainGraph<P>> for KeychainTracker<K, P>
source§fn as_ref(&self) -> &ChainGraph<P>
Converts this type into a shared reference of the (usually inferred) input type.source§impl<K, P> AsRef<SparseChain<P>> for KeychainTracker<K, P>
source§fn as_ref(&self) -> &SparseChain<P>
Converts this type into a shared reference of the (usually inferred) input type.source§impl<K, P> AsRef<TxGraph> for KeychainTracker<K, P>
source§impl<K: Clone, P: Clone> Clone for KeychainTracker<K, P>
source§fn clone(&self) -> KeychainTracker<K, P>
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moreAuto Trait Implementations§
§impl<K, P> RefUnwindSafe for KeychainTracker<K, P>where
K: RefUnwindSafe,
P: RefUnwindSafe,
§impl<K, P> Send for KeychainTracker<K, P>where
K: Send,
P: Send,
§impl<K, P> Sync for KeychainTracker<K, P>where
K: Sync,
P: Sync,
§impl<K, P> Unpin for KeychainTracker<K, P>where
K: Unpin,
P: Unpin,
§impl<K, P> UnwindSafe for KeychainTracker<K, P>where
K: UnwindSafe + RefUnwindSafe,
P: UnwindSafe + RefUnwindSafe,
Blanket Implementations§
Trait Implementations§
source§impl<K, P> AsRef<ChainGraph<P>> for KeychainTracker<K, P>
source§fn as_ref(&self) -> &ChainGraph<P>
Converts this type into a shared reference of the (usually inferred) input type.source§impl<K, P> AsRef<SparseChain<P>> for KeychainTracker<K, P>
source§fn as_ref(&self) -> &SparseChain<P>
Converts this type into a shared reference of the (usually inferred) input type.source§impl<K: Clone, P: Clone> Clone for KeychainTracker<K, P>
source§fn clone(&self) -> KeychainTracker<K, P>
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moreAuto Trait Implementations§
§impl<K, P> RefUnwindSafe for KeychainTracker<K, P>where
K: RefUnwindSafe,
P: RefUnwindSafe,
§impl<K, P> Send for KeychainTracker<K, P>where
K: Send,
P: Send,
§impl<K, P> Sync for KeychainTracker<K, P>where
K: Sync,
P: Sync,
§impl<K, P> Unpin for KeychainTracker<K, P>where
K: Unpin,
P: Unpin,
§impl<K, P> UnwindSafe for KeychainTracker<K, P>where
K: UnwindSafe + RefUnwindSafe,
P: UnwindSafe + RefUnwindSafe,
Blanket Implementations§
source§impl<T, U> Into<U> for Twhere
U: From<T>,
const: unstable · source§fn into(self) -> U
Calls U::from(self).
That is, this conversion is whatever the implementation of
From<T> for U chooses to do.
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainTxOutIndex.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainTxOutIndex.html
index 00172ea3fa..dedc973d98 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainTxOutIndex.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainTxOutIndex.html
@@ -1,4 +1,4 @@
-KeychainTxOutIndex in bdk_chain::keychain - Rust Struct bdk_chain::keychain::KeychainTxOutIndex
source · pub struct KeychainTxOutIndex<K> { /* private fields */ }
Expand description
A convenient wrapper around SpkTxOutIndex that relates script pubkeys to miniscript public
+
KeychainTxOutIndex in bdk_chain::keychain - Rust Struct bdk_chain::keychain::KeychainTxOutIndex
source · pub struct KeychainTxOutIndex<K> { /* private fields */ }
Expand description
A convenient wrapper around SpkTxOutIndex that relates script pubkeys to miniscript public
Descriptors.
Descriptors are referenced by the provided keychain generic (K).
Script pubkeys for a descriptor are revealed chronologically from index 0. I.e., If the last
@@ -27,7 +27,7 @@ txout_index.add_keychain(MyKeychain::Internal, internal_descriptor);
txout_index.add_keychain(MyKeychain::MyAppUser { user_id: 42 }, descriptor_for_user_42);
let new_spk_for_user = txout_index.reveal_next_spk(&MyKeychain::MyAppUser{ user_id: 42 });
-Implementations§
source§impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K>
sourcepub fn scan(&mut self, txouts: &impl ForEachTxOut) -> DerivationAdditions<K>
Scans an object for relevant outpoints, which are stored and indexed internally.
+Implementations§
source§impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K>
sourcepub fn scan(&mut self, txouts: &impl ForEachTxOut) -> DerivationAdditions<K>
Scans an object for relevant outpoints, which are stored and indexed internally.
If the matched script pubkey is part of the lookahead, the last stored index is updated for
the script pubkeyâs keychain and the DerivationAdditions returned will reflect the
change.
@@ -39,35 +39,35 @@ your txouts.
your chain state (i.e., SparseChain, ChainGraph).
See ForEachTxout for the types that support this.
-sourcepub fn scan_txout(
&mut self,
op: OutPoint,
txout: &TxOut
) -> DerivationAdditions<K>
Scan a single outpoint for a matching script pubkey.
+sourcepub fn scan_txout(
&mut self,
op: OutPoint,
txout: &TxOut
) -> DerivationAdditions<K>
Scan a single outpoint for a matching script pubkey.
If it matches, this will store and index it.
-sourcepub fn inner(&self) -> &SpkTxOutIndex<(K, u32)>
Return a reference to the internal SpkTxOutIndex.
-sourcepub fn keychains(&self) -> &BTreeMap<K, Descriptor<DescriptorPublicKey>>
Return a reference to the internal map of the keychain to descriptors.
-sourcepub fn add_keychain(
&mut self,
keychain: K,
descriptor: Descriptor<DescriptorPublicKey>
)
Add a keychain to the trackerâs txout_index with a descriptor to derive addresses.
+sourcepub fn inner(&self) -> &SpkTxOutIndex<(K, u32)>
Return a reference to the internal SpkTxOutIndex.
+sourcepub fn keychains(&self) -> &BTreeMap<K, Descriptor<DescriptorPublicKey>>
Return a reference to the internal map of the keychain to descriptors.
+sourcepub fn add_keychain(
&mut self,
keychain: K,
descriptor: Descriptor<DescriptorPublicKey>
)
Add a keychain to the trackerâs txout_index with a descriptor to derive addresses.
Adding a keychain means you will be able to derive new script pubkeys under that keychain
and the txout index will discover transaction outputs with those script pubkeys.
Panics
This will panic if a different descriptor is introduced to the same keychain.
-sourcepub fn lookaheads(&self) -> &BTreeMap<K, u32>
Return the lookahead setting for each keychain.
+sourcepub fn lookaheads(&self) -> &BTreeMap<K, u32>
Return the lookahead setting for each keychain.
Refer to set_lookahead for a deeper explanation of the lookahead.
-sourcepub fn set_lookahead_for_all(&mut self, lookahead: u32)
Convenience method to call set_lookahead for all keychains.
-sourcepub fn set_lookahead(&mut self, keychain: &K, lookahead: u32)
Set the lookahead count for keychain.
+sourcepub fn set_lookahead_for_all(&mut self, lookahead: u32)
Convenience method to call set_lookahead for all keychains.
+sourcepub fn set_lookahead(&mut self, keychain: &K, lookahead: u32)
Set the lookahead count for keychain.
The lookahead is the number of scripts to cache ahead of the last stored script index. This
is useful during a scan via scan or scan_txout.
Panics
This will panic if the keychain does not exist.
-sourcepub fn lookahead_to_target_multi(&mut self, target_indexes: BTreeMap<K, u32>)
Convenience method to call lookahead_to_target for multiple keychains.
-sourcepub fn lookahead_to_target(&mut self, keychain: &K, target_index: u32)
Store lookahead scripts until target_index.
+sourcepub fn lookahead_to_target_multi(&mut self, target_indexes: BTreeMap<K, u32>)
Convenience method to call lookahead_to_target for multiple keychains.
+sourcepub fn lookahead_to_target(&mut self, keychain: &K, target_index: u32)
Store lookahead scripts until target_index.
This does not change the lookahead setting.
-sourcepub fn spks_of_all_keychains(
&self
) -> BTreeMap<K, impl Iterator<Item = (u32, Script)> + Clone>
Generates script pubkey iterators for every keychain. The iterators iterate over all
+
sourcepub fn spks_of_all_keychains(
&self
) -> BTreeMap<K, impl Iterator<Item = (u32, Script)> + Clone>
Generates script pubkey iterators for every keychain. The iterators iterate over all
derivable script pubkeys.
-sourcepub fn spks_of_keychain(
&self,
keychain: &K
) -> impl Iterator<Item = (u32, Script)> + Clone
Generates a script pubkey iterator for the given keychainâs descriptor (if it exists). The
+
sourcepub fn spks_of_keychain(
&self,
keychain: &K
) -> impl Iterator<Item = (u32, Script)> + Clone
Generates a script pubkey iterator for the given keychainâs descriptor (if it exists). The
iterator iterates over all derivable scripts of the keychainâs descriptor.
Panics
This will panic if the keychain does not exist.
-sourcepub fn revealed_spks_of_all_keychains(
&self
) -> BTreeMap<K, impl Iterator<Item = (u32, &Script)> + Clone>
Convenience method to get revealed_spks_of_keychain of all keychains.
-sourcepub fn revealed_spks_of_keychain(
&self,
keychain: &K
) -> impl DoubleEndedIterator<Item = (u32, &Script)> + Clone
Iterates over the script pubkeys revealed by this index under keychain.
-sourcepub fn next_index(&self, keychain: &K) -> (u32, bool)
Get the next derivation index for keychain. The next index is the index after the last revealed
+
sourcepub fn revealed_spks_of_all_keychains(
&self
) -> BTreeMap<K, impl Iterator<Item = (u32, &Script)> + Clone>
Convenience method to get revealed_spks_of_keychain of all keychains.
+sourcepub fn revealed_spks_of_keychain(
&self,
keychain: &K
) -> impl DoubleEndedIterator<Item = (u32, &Script)> + Clone
Iterates over the script pubkeys revealed by this index under keychain.
+sourcepub fn next_index(&self, keychain: &K) -> (u32, bool)
Get the next derivation index for keychain. The next index is the index after the last revealed
derivation index.
The second field in the returned tuple represents whether the next derivation index is new.
There are two scenarios where the next derivation index is reused (not new):
@@ -78,11 +78,11 @@ There are two scenarios where the next derivation index is reused (not new):
Not checking the second field of the tuple may result in address reuse.
Panics
Panics if the keychain does not exist.
-sourcepub fn last_revealed_indices(&self) -> &BTreeMap<K, u32>
Get the last derivation index that is revealed for each keychain.
+sourcepub fn last_revealed_indices(&self) -> &BTreeMap<K, u32>
Get the last derivation index that is revealed for each keychain.
Keychains with no revealed indices will not be included in the returned BTreeMap.
-sourcepub fn last_revealed_index(&self, keychain: &K) -> Option<u32>
Get the last derivation index revealed for keychain.
-sourcepub fn reveal_to_target_multi(
&mut self,
keychains: &BTreeMap<K, u32>
) -> (BTreeMap<K, impl Iterator<Item = (u32, Script)>>, DerivationAdditions<K>)
Convenience method to call Self::reveal_to_target on multiple keychains.
-sourcepub fn reveal_to_target(
&mut self,
keychain: &K,
target_index: u32
) -> (impl Iterator<Item = (u32, Script)>, DerivationAdditions<K>)
Reveals script pubkeys of the keychainâs descriptor up to and including the
+
sourcepub fn last_revealed_index(&self, keychain: &K) -> Option<u32>
Get the last derivation index revealed for keychain.
+sourcepub fn reveal_to_target_multi(
&mut self,
keychains: &BTreeMap<K, u32>
) -> (BTreeMap<K, impl Iterator<Item = (u32, Script)>>, DerivationAdditions<K>)
Convenience method to call Self::reveal_to_target on multiple keychains.
+sourcepub fn reveal_to_target(
&mut self,
keychain: &K,
target_index: u32
) -> (impl Iterator<Item = (u32, Script)>, DerivationAdditions<K>)
Reveals script pubkeys of the keychainâs descriptor up to and including the
target_index.
If the target_index cannot be reached (due to the descriptor having no wildcard and/or
the target_index is in the hardened index range), this method will make a best-effort and
@@ -92,7 +92,7 @@ reveal up to the last possible index.
pubkeys are revealed, then both of these will be empty.
Panics
Panics if keychain does not exist.
-sourcepub fn reveal_next_spk(
&mut self,
keychain: &K
) -> ((u32, &Script), DerivationAdditions<K>)
Attempts to reveal the next script pubkey for keychain.
+sourcepub fn reveal_next_spk(
&mut self,
keychain: &K
) -> ((u32, &Script), DerivationAdditions<K>)
Attempts to reveal the next script pubkey for keychain.
Returns the derivation index of the revealed script pubkey, the revealed script pubkey and a
DerivationAdditions which represents changes in the last revealed index (if any).
When a new script cannot be revealed, we return the last revealed script and an empty
@@ -103,7 +103,7 @@ pubkeys are revealed, then both of these will be empty.
Panics
Panics if the keychain does not exist.
-sourcepub fn next_unused_spk(
&mut self,
keychain: &K
) -> ((u32, &Script), DerivationAdditions<K>)
Gets the next unused script pubkey in the keychain. I.e., the script pubkey with the lowest
+
sourcepub fn next_unused_spk(
&mut self,
keychain: &K
) -> ((u32, &Script), DerivationAdditions<K>)
Gets the next unused script pubkey in the keychain. I.e., the script pubkey with the lowest
index that has not been used yet.
This will derive and reveal a new script pubkey if no more unused script pubkeys exist.
If the descriptor has no wildcard and already has a used script pubkey or if a descriptor
@@ -111,34 +111,34 @@ has used all scripts up to the derivation bounds, then the last derived script p
returned.
Panics
Panics if keychain has never been added to the index
-sourcepub fn mark_used(&mut self, keychain: &K, index: u32) -> bool
Marks the script pubkey at index as used even though the tracker hasnât seen an output with it.
+
sourcepub fn mark_used(&mut self, keychain: &K, index: u32) -> bool
Marks the script pubkey at index as used even though the tracker hasnât seen an output with it.
This only has an effect when the index had been added to self already and was unused.
Returns whether the index was initially present as unused.
This is useful when you want to reserve a script pubkey for something but donât want to add
the transaction output using it to the index yet. Other callers will consider index on
keychain used until you call unmark_used.
-sourcepub fn unmark_used(&mut self, keychain: &K, index: u32) -> bool
Undoes the effect of mark_used. Returns whether the index is inserted back into
+
sourcepub fn unmark_used(&mut self, keychain: &K, index: u32) -> bool
Undoes the effect of mark_used. Returns whether the index is inserted back into
unused.
Note that if self has scanned an output with this script pubkey, then this will have no
effect.
-sourcepub fn unused_spks_of_keychain(
&self,
keychain: &K
) -> impl DoubleEndedIterator<Item = (u32, &Script)>
Iterates over all unused script pubkeys for a keychain stored in the index.
-sourcepub fn txouts_of_keychain(
&self,
keychain: &K
) -> impl DoubleEndedIterator<Item = (u32, OutPoint)> + '_
Iterates over all the [OutPoint] that have a TxOut with a script pubkey derived from
+
sourcepub fn unused_spks_of_keychain(
&self,
keychain: &K
) -> impl DoubleEndedIterator<Item = (u32, &Script)>
Iterates over all unused script pubkeys for a keychain stored in the index.
+sourcepub fn txouts_of_keychain(
&self,
keychain: &K
) -> impl DoubleEndedIterator<Item = (u32, OutPoint)> + '_
Iterates over all the [OutPoint] that have a TxOut with a script pubkey derived from
keychain.
-sourcepub fn last_used_index(&self, keychain: &K) -> Option<u32>
Returns the highest derivation index of the keychain where KeychainTxOutIndex has
+
sourcepub fn last_used_index(&self, keychain: &K) -> Option<u32>
Returns the highest derivation index of the keychain where KeychainTxOutIndex has
found a [TxOut] with itâs script pubkey.
-sourcepub fn last_used_indices(&self) -> BTreeMap<K, u32>
Returns the highest derivation index of each keychain that KeychainTxOutIndex has found
+
sourcepub fn last_used_indices(&self) -> BTreeMap<K, u32>
Returns the highest derivation index of each keychain that KeychainTxOutIndex has found
a [TxOut] with itâs script pubkey.
-sourcepub fn apply_additions(&mut self, additions: DerivationAdditions<K>)
Applies the derivation additions to the KeychainTxOutIndex, extending the number of
+
sourcepub fn apply_additions(&mut self, additions: DerivationAdditions<K>)
Applies the derivation additions to the KeychainTxOutIndex, extending the number of
derived scripts per keychain, as specified in the additions.
-Methods from Deref<Target = SpkTxOutIndex<(K, u32)>>§
sourcepub fn txouts(
&self
) -> impl DoubleEndedIterator<Item = (&I, OutPoint, &TxOut)> + ExactSizeIterator
Iterate over all known txouts that spend to tracked script pubkeys.
-sourcepub fn txouts_in_tx(
&self,
txid: Txid
) -> impl DoubleEndedIterator<Item = (&I, OutPoint, &TxOut)>
Finds all txouts on a transaction that has previously been scanned and indexed.
-sourcepub fn outputs_in_range(
&self,
range: impl RangeBounds<I>
) -> impl DoubleEndedIterator<Item = (&I, OutPoint)>
Iterates over all the outputs with script pubkeys in an index range.
-Methods from Deref<Target = SpkTxOutIndex<(K, u32)>>§
sourcepub fn txouts(
&self
) -> impl DoubleEndedIterator<Item = (&I, OutPoint, &TxOut)> + ExactSizeIterator
Iterate over all known txouts that spend to tracked script pubkeys.
+sourcepub fn txouts_in_tx(
&self,
txid: Txid
) -> impl DoubleEndedIterator<Item = (&I, OutPoint, &TxOut)>
Finds all txouts on a transaction that has previously been scanned and indexed.
+sourcepub fn outputs_in_range(
&self,
range: impl RangeBounds<I>
) -> impl DoubleEndedIterator<Item = (&I, OutPoint)>
Iterates over all the outputs with script pubkeys in an index range.
+sourcepub fn txout(&self, outpoint: OutPoint) -> Option<(&I, &TxOut)>
Returns the txout and script pubkey index of the TxOut at OutPoint.
Returns None if the TxOut hasnât been scanned or if nothing matching was found there.
-sourcepub fn spk_at_index(&self, index: &I) -> Option<&Script>
Returns the script that has been inserted at the index.
+sourcepub fn spk_at_index(&self, index: &I) -> Option<&Script>
Returns the script that has been inserted at the index.
If that index hasnât been inserted yet, it will return None.
-sourcepub fn all_spks(&self) -> &BTreeMap<I, Script>
The script pubkeys that are being tracked by the index.
-sourcepub fn unused_spks<R>(
&self,
range: R
) -> impl DoubleEndedIterator<Item = (&I, &Script)>where
R: RangeBounds<I>,
Iterates over all unused script pubkeys in an index range.
+sourcepub fn all_spks(&self) -> &BTreeMap<I, Script>
The script pubkeys that are being tracked by the index.
+sourcepub fn unused_spks<R>(
&self,
range: R
) -> impl DoubleEndedIterator<Item = (&I, &Script)>where
R: RangeBounds<I>,
Iterates over all unused script pubkeys in an index range.
Here, âunusedâ means that after the script pubkey was stored in the index, the index has
never scanned a transaction output with it.
Example
@@ -149,25 +149,25 @@ never scanned a transaction output with it.
let change_index = 1;
let unused_change_spks =
txout_index.unused_spks((change_index, u32::MIN)..(change_index, u32::MAX));
-sourcepub fn is_used(&self, index: &I) -> bool
Returns whether the script pubkey at index has been used or not.
+sourcepub fn is_used(&self, index: &I) -> bool
Returns whether the script pubkey at index has been used or not.
Here, âunusedâ means that after the script pubkey was stored in the index, the index has
never scanned a transaction output with it.
-sourcepub fn index_of_spk(&self, script: &Script) -> Option<&I>
Returns the index associated with the script pubkey.
-sourcepub fn sent_and_received(&self, tx: &Transaction) -> (u64, u64)
Computes total input value going from script pubkeys in the index (sent) and the total output
+
sourcepub fn index_of_spk(&self, script: &Script) -> Option<&I>
Returns the index associated with the script pubkey.
+sourcepub fn sent_and_received(&self, tx: &Transaction) -> (u64, u64)
Computes total input value going from script pubkeys in the index (sent) and the total output
value going to script pubkeys in the index (received) in tx. For the sent to be computed
correctly, the output being spent must have already been scanned by the index. Calculating
received just uses the transaction outputs directly, so it will be correct even if it has not
been scanned.
-sourcepub fn net_value(&self, tx: &Transaction) -> i64
Computes the net value that this transaction gives to the script pubkeys in the index and
+
sourcepub fn net_value(&self, tx: &Transaction) -> i64
Computes the net value that this transaction gives to the script pubkeys in the index and
takes from the transaction outputs in the index. Shorthand for calling
sent_and_received and subtracting sent from received.
-sourcepub fn is_relevant(&self, tx: &Transaction) -> bool
Whether any of the inputs of this transaction spend a txout tracked or whether any output
+
sourcepub fn is_relevant(&self, tx: &Transaction) -> bool
Whether any of the inputs of this transaction spend a txout tracked or whether any output
matches one of our script pubkeys.
It is easily possible to misuse this method and get false negatives by calling it before you
have scanned the TxOuts the transaction is spending. For example, if you want to filter out
all the transactions in a block that are irrelevant, you must first scan all the
transactions in the block and only then use this method.
-Trait Implementations§
source§impl<K: Clone> Clone for KeychainTxOutIndex<K>
source§fn clone(&self) -> KeychainTxOutIndex<K>
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moresource§impl<K: Debug> Debug for KeychainTxOutIndex<K>
source§impl<K> Default for KeychainTxOutIndex<K>
Auto Trait Implementations§
§impl<K> RefUnwindSafe for KeychainTxOutIndex<K>where
K: RefUnwindSafe,
§impl<K> Send for KeychainTxOutIndex<K>where
K: Send,
§impl<K> Sync for KeychainTxOutIndex<K>where
K: Sync,
§impl<K> Unpin for KeychainTxOutIndex<K>where
K: Unpin,
§impl<K> UnwindSafe for KeychainTxOutIndex<K>where
K: UnwindSafe + RefUnwindSafe,
Blanket Implementations§
Trait Implementations§
source§impl<K: Clone> Clone for KeychainTxOutIndex<K>
source§fn clone(&self) -> KeychainTxOutIndex<K>
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moresource§impl<K: Debug> Debug for KeychainTxOutIndex<K>
source§impl<K> Default for KeychainTxOutIndex<K>
source§impl<K> Deref for KeychainTxOutIndex<K>
source§impl<K: Clone + Ord + Debug + 'static> Indexer for KeychainTxOutIndex<K>
§type Additions = DerivationAdditions<K>
The resultant âadditionsâ when new transaction data is indexed.source§fn index_txout(&mut self, outpoint: OutPoint, txout: &TxOut) -> Self::Additions
Scan and index the given outpoint and txout.source§fn index_tx(&mut self, tx: &Transaction) -> Self::Additions
Scan and index the given transaction.source§fn apply_additions(&mut self, additions: Self::Additions)
Apply additions to itself.source§fn is_tx_relevant(&self, tx: &Transaction) -> bool
Determines whether the transaction should be included in the index.source§impl<K: Clone + Ord + Debug + 'static> OwnedIndexer for KeychainTxOutIndex<K>
source§fn is_spk_owned(&self, spk: &Script) -> bool
Determines whether a given script pubkey (spk) is owned.Auto Trait Implementations§
§impl<K> RefUnwindSafe for KeychainTxOutIndex<K>where
K: RefUnwindSafe,
§impl<K> Send for KeychainTxOutIndex<K>where
K: Send,
§impl<K> Sync for KeychainTxOutIndex<K>where
K: Sync,
§impl<K> Unpin for KeychainTxOutIndex<K>where
K: Unpin,
§impl<K> UnwindSafe for KeychainTxOutIndex<K>where
K: UnwindSafe + RefUnwindSafe,
Blanket Implementations§
source§impl<T, U> Into<U> for Twhere
U: From<T>,
const: unstable · source§fn into(self) -> U
Calls U::from(self).
That is, this conversion is whatever the implementation of
From<T> for U chooses to do.
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/index.html
new file mode 100644
index 0000000000..1195ca8bfc
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/index.html
@@ -0,0 +1,2 @@
+bdk_chain::local_chain - Rust Module bdk_chain::local_chain
source · Structs
This is a local implementation of ChainOracle.Represents an update failure of LocalChain due to the update not connecting to the original
+chain.Type Definitions
This is the return value of determine_changeset and represents changes to LocalChain.
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/sidebar-items.js
new file mode 100644
index 0000000000..6afaa15420
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"struct":[["LocalChain","This is a local implementation of [`ChainOracle`]."],["UpdateNotConnectedError","Represents an update failure of [`LocalChain`] due to the update not connecting to the original chain."]],"type":[["ChangeSet","This is the return value of `determine_changeset` and represents changes to [`LocalChain`]."]]};
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.LocalChain.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.LocalChain.html
new file mode 100644
index 0000000000..28ae2ce7d3
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.LocalChain.html
@@ -0,0 +1,24 @@
+LocalChain in bdk_chain::local_chain - Rust Struct bdk_chain::local_chain::LocalChain
source · pub struct LocalChain { /* private fields */ }
Expand description
This is a local implementation of ChainOracle.
+TODO: We need a cache/snapshot thing for chain oracle.
+
+- Minimize calls to remotes.
+- Can we cache it forever? Should we drop stuff?
+- Assume anything deeper than (i.e. 10) blocks wonât be reorged.
+- Is this a cache on txs or block? or both?
+TODO: Parents of children are confirmed if children are confirmed.
+
+Implementations§
source§impl LocalChain
sourcepub fn from_blocks<B>(blocks: B) -> Selfwhere
B: IntoIterator<Item = BlockId>,
sourcepub fn tip(&self) -> Option<BlockId>
sourcepub fn determine_changeset(
&self,
update: &Self
) -> Result<ChangeSet, UpdateNotConnectedError>
This is like the sparsechainâs logic, expect we must guarantee that all invalidated heights
+are to be re-filled.
+sourcepub fn apply_changeset(&mut self, changeset: ChangeSet)
Applies the given changeset.
+sourcepub fn apply_update(
&mut self,
update: Self
) -> Result<ChangeSet, UpdateNotConnectedError>
Updates LocalChain with an update LocalChain.
+This is equivalent to calling determine_changeset and apply_changeset in sequence.
+sourcepub fn initial_changeset(&self) -> ChangeSet
sourcepub fn heights(&self) -> BTreeSet<u32>
Trait Implementations§
source§impl ChainOracle for LocalChain
source§impl Clone for LocalChain
source§fn clone(&self) -> LocalChain
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moresource§impl Debug for LocalChain
source§impl Default for LocalChain
source§fn default() -> LocalChain
Returns the âdefault valueâ for a type. Read moresource§impl From<LocalChain> for BTreeMap<u32, BlockHash>
source§fn from(value: LocalChain) -> Self
Converts to this type from the input type.source§impl Ord for LocalChain
source§fn cmp(&self, other: &LocalChain) -> Ordering
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
Compares and returns the maximum of two values. Read moresource§impl PartialEq<LocalChain> for LocalChain
source§fn eq(&self, other: &LocalChain) -> bool
source§impl PartialOrd<LocalChain> for LocalChain
source§fn partial_cmp(&self, other: &LocalChain) -> Option<Ordering>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
This method tests less than or equal to (for self and other) and is used by the <=
+operator. Read moresource§impl Eq for LocalChain
source§impl StructuralEq for LocalChain
source§impl StructuralPartialEq for LocalChain
Auto Trait Implementations§
§impl RefUnwindSafe for LocalChain
§impl Send for LocalChain
§impl Sync for LocalChain
§impl Unpin for LocalChain
§impl UnwindSafe for LocalChain
Blanket Implementations§
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.UpdateNotConnectedError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.UpdateNotConnectedError.html
new file mode 100644
index 0000000000..8380589068
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.UpdateNotConnectedError.html
@@ -0,0 +1,13 @@
+UpdateNotConnectedError in bdk_chain::local_chain - Rust Struct bdk_chain::local_chain::UpdateNotConnectedError
source · pub struct UpdateNotConnectedError(pub u32);
Expand description
Represents an update failure of LocalChain due to the update not connecting to the original
+chain.
+The update cannot be applied to the chain because the chain suffix it represents did not
+connect to the existing chain. This error case contains the checkpoint height to include so
+that the chains can connect.
+Tuple Fields§
§0: u32Trait Implementations§
source§impl Clone for UpdateNotConnectedError
source§fn clone(&self) -> UpdateNotConnectedError
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moresource§impl Debug for UpdateNotConnectedError
source§impl Display for UpdateNotConnectedError
source§impl Error for UpdateNotConnectedError
1.30.0 · source§fn source(&self) -> Option<&(dyn Error + 'static)>
The lower-level source of this error, if any. Read more1.0.0 · source§fn description(&self) -> &str
ðDeprecated since 1.42.0: use the Display impl or to_string()source§impl PartialEq<UpdateNotConnectedError> for UpdateNotConnectedError
source§fn eq(&self, other: &UpdateNotConnectedError) -> bool
source§impl StructuralPartialEq for UpdateNotConnectedError
Auto Trait Implementations§
§impl RefUnwindSafe for UpdateNotConnectedError
§impl Send for UpdateNotConnectedError
§impl Sync for UpdateNotConnectedError
§impl Unpin for UpdateNotConnectedError
§impl UnwindSafe for UpdateNotConnectedError
Blanket Implementations§
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/type.ChangeSet.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/type.ChangeSet.html
new file mode 100644
index 0000000000..47ec5a7928
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/type.ChangeSet.html
@@ -0,0 +1,2 @@
+ChangeSet in bdk_chain::local_chain - Rust Type Definition bdk_chain::local_chain::ChangeSet
source · Expand description
This is the return value of determine_changeset and represents changes to LocalChain.
+
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sidebar-items.js
index cae94de312..81cad8a580 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sidebar-items.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sidebar-items.js
@@ -1 +1 @@
-window.SIDEBAR_ITEMS = {"constant":[["COINBASE_MATURITY","How many confirmations are needed f or a coinbase output to be spent."]],"enum":[["ConfirmationTime","Block height and timestamp at which a transaction is confirmed."],["TxHeight","Represents the height at which a transaction is confirmed."]],"externcrate":[["serde",""]],"mod":[["chain_graph","Module for structures that combine the features of [`sparse_chain`] and [`tx_graph`]."],["keychain","Module for keychain related structures."],["sparse_chain","Module for structures that maintain sparse (purposely incomplete) snapshots of blockchain data."],["tx_graph","Module for structures that store and traverse transactions."]],"struct":[["BlockId","A reference to a block in the canonical chain."],["FullTxOut","A `TxOut` with as much data as we can retrieve about it"],["SpkTxOutIndex","An index storing `TxOut`s that have a script pubkey that matches those in a list."]],"trait":[["DescriptorExt","A trait to extend the functionality of a miniscript descriptor."],["ForEachTxOut","Trait to do something with every txout contained in a structure."]]};
\ No newline at end of file
+window.SIDEBAR_ITEMS = {"constant":[["COINBASE_MATURITY","How many confirmations are needed f or a coinbase output to be spent."]],"enum":[["ConfirmationTime","Block height and timestamp at which a transaction is confirmed."],["ObservedAs","Represents an observation of some chain data."],["TxHeight","Represents the height at which a transaction is confirmed."]],"externcrate":[["serde",""]],"mod":[["chain_graph","Module for structures that combine the features of [`sparse_chain`] and [`tx_graph`]."],["indexed_tx_graph",""],["keychain","Module for keychain related structures."],["local_chain",""],["sparse_chain","Module for structures that maintain sparse (purposely incomplete) snapshots of blockchain data."],["tx_graph","Module for structures that store and traverse transactions."]],"struct":[["BlockId","A reference to a block in the canonical chain."],["FullTxOut","A `TxOut` with as much data as we can retrieve about it"],["SpkTxOutIndex","An index storing `TxOut`s that have a script pubkey that matches those in a list."]],"trait":[["Anchor","Trait that âanchorsâ blockchain data to a specific block of height and hash."],["Append","Trait that makes an object appendable."],["ChainOracle","Represents a service that tracks the blockchain."],["DescriptorExt","A trait to extend the functionality of a miniscript descriptor."],["ForEachTxOut","Trait to do something with every txout contained in a structure."]]};
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/trait.ChainPosition.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/trait.ChainPosition.html
index f3040ab5dc..407cf40c88 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/trait.ChainPosition.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/trait.ChainPosition.html
@@ -10,4 +10,4 @@
sourcefn max_ord_of_height(height: TxHeight) -> Self
Get the positionâs upper bound of a given height.
sourcefn min_ord_of_height(height: TxHeight) -> Self
Get the positionâs lower bound of a given height.
Provided Methods§
sourcefn unconfirmed() -> Self
Get the unconfirmed position.
-Implementors§
source§impl ChainPosition for ConfirmationTime
source§impl ChainPosition for TxHeight
\ No newline at end of file
+Implementors§
source§impl ChainPosition for ConfirmationTime
source§impl ChainPosition for TxHeight
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.BlockId.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.BlockId.html
index 7ff15e3967..33e5116ab7 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.BlockId.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.BlockId.html
@@ -1,14 +1,14 @@
-BlockId in bdk_chain - Rust pub struct BlockId {
+BlockId in bdk_chain - Rust pub struct BlockId {
pub height: u32,
pub hash: BlockHash,
}
Expand description
A reference to a block in the canonical chain.
Fields§
§height: u32The height of the block.
§hash: BlockHashThe hash of the block.
-Trait Implementations§
source§impl<'de> Deserialize<'de> for BlockId
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read moresource§impl Ord for BlockId
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
Compares and returns the maximum of two values. Read moresource§impl PartialEq<BlockId> for BlockId
source§fn eq(&self, other: &BlockId) -> bool
This method tests for self and other values to be equal, and is used
+Trait Implementations§
source§impl Anchor for BlockId
source§fn anchor_block(&self) -> BlockId
Returns the BlockId that the associated blockchain data is âanchoredâ in.source§fn confirmation_height_upper_bound(&self) -> u32
Get the upper bound of the chain dataâs confirmation height. Read moresource§impl<'de> Deserialize<'de> for BlockId
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read moresource§impl Ord for BlockId
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
Compares and returns the maximum of two values. Read moresource§impl PartialOrd<BlockId> for BlockId
source§impl PartialOrd<BlockId> for BlockId
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
This method tests less than or equal to (for self and other) and is used by the <=
operator. Read moresource§impl Copy for BlockId
source§impl Eq for BlockId
source§impl StructuralEq for BlockId
source§impl StructuralPartialEq for BlockId
Auto Trait Implementations§
§impl RefUnwindSafe for BlockId
§impl Send for BlockId
§impl Sync for BlockId
§impl Unpin for BlockId
§impl UnwindSafe for BlockId
Blanket Implementations§
source§impl Copy for BlockId
source§impl Eq for BlockId
source§impl StructuralEq for BlockId
source§impl StructuralPartialEq for BlockId
Auto Trait Implementations§
§impl RefUnwindSafe for BlockId
§impl Send for BlockId
§impl Sync for BlockId
§impl Unpin for BlockId
§impl UnwindSafe for BlockId
Blanket Implementations§
source§impl<T, U> Into<U> for Twhere
U: From<T>,
const: unstable · source§fn into(self) -> U
Calls U::from(self).
That is, this conversion is whatever the implementation of
From<T> for U chooses to do.
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.FullTxOut.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.FullTxOut.html
index 447bf89729..b948d1f35a 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.FullTxOut.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.FullTxOut.html
@@ -1,22 +1,37 @@
-FullTxOut in bdk_chain - Rust pub struct FullTxOut<I> {
+FullTxOut in bdk_chain - Rust pub struct FullTxOut<P> {
pub outpoint: OutPoint,
pub txout: TxOut,
- pub chain_position: I,
- pub spent_by: Option<(I, Txid)>,
+ pub chain_position: P,
+ pub spent_by: Option<(P, Txid)>,
pub is_on_coinbase: bool,
}
Expand description
A TxOut with as much data as we can retrieve about it
Fields§
§outpoint: OutPointThe location of the TxOut.
§txout: TxOutThe TxOut.
-§chain_position: IThe position of the transaction in outpoint in the overall chain.
-§spent_by: Option<(I, Txid)>The txid and chain position of the transaction (if any) that has spent this output.
+§chain_position: PThe position of the transaction in outpoint in the overall chain.
+§spent_by: Option<(P, Txid)>The txid and chain position of the transaction (if any) that has spent this output.
§is_on_coinbase: boolWhether this output is on a coinbase transaction.
-Implementations§
source§impl<I: ChainPosition> FullTxOut<I>
sourcepub fn is_spendable_at(&self, height: u32) -> bool
Whether the utxo is/was/will be spendable at height.
+Implementations§
source§impl<P: ChainPosition> FullTxOut<P>
Trait Implementations§
source§impl<A: Anchor> FullTxOut<ObservedAs<A>>
sourcepub fn is_mature(&self, tip: u32) -> bool
Whether the txout is considered mature.
+This is the alternative version of is_mature which depends on chain_position being a
+ObservedAs<A> where A implements Anchor.
+Depending on the implementation of confirmation_height_upper_bound in Anchor, this
+method may return false-negatives. In other words, interpretted confirmation count may be
+less than the actual value.
+sourcepub fn is_confirmed_and_spendable(&self, tip: u32) -> bool
Whether the utxo is/was/will be spendable with chain tip.
+This method does not take into account the locktime.
+This is the alternative version of is_spendable_at which depends on chain_position
+being a ObservedAs<A> where A implements Anchor.
+Depending on the implementation of confirmation_height_upper_bound in Anchor, this
+method may return false-negatives. In other words, interpretted confirmation count may be
+less than the actual value.
+Trait Implementations§
source§impl<P: Ord> Ord for FullTxOut<P>
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
Compares and returns the maximum of two values. Read moresource§impl<P: PartialEq> PartialEq<FullTxOut<P>> for FullTxOut<P>
source§impl<I> StructuralPartialEq for FullTxOut<I>
Auto Trait Implementations§
§impl<I> RefUnwindSafe for FullTxOut<I>where
I: RefUnwindSafe,
§impl<I> Send for FullTxOut<I>where
I: Send,
§impl<I> Sync for FullTxOut<I>where
I: Sync,
§impl<I> Unpin for FullTxOut<I>where
I: Unpin,
§impl<I> UnwindSafe for FullTxOut<I>where
I: UnwindSafe,
Blanket Implementations§
source§impl<P: PartialOrd> PartialOrd<FullTxOut<P>> for FullTxOut<P>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
This method tests less than or equal to (for self and other) and is used by the <=
+operator. Read moresource§impl<P: Eq> Eq for FullTxOut<P>
source§impl<P> StructuralEq for FullTxOut<P>
source§impl<P> StructuralPartialEq for FullTxOut<P>
Auto Trait Implementations§
§impl<P> RefUnwindSafe for FullTxOut<P>where
P: RefUnwindSafe,
§impl<P> Send for FullTxOut<P>where
P: Send,
§impl<P> Sync for FullTxOut<P>where
P: Sync,
§impl<P> Unpin for FullTxOut<P>where
P: Unpin,
§impl<P> UnwindSafe for FullTxOut<P>where
P: UnwindSafe,
Blanket Implementations§
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.SpkTxOutIndex.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.SpkTxOutIndex.html
index 6859e09736..9acd34d7cb 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.SpkTxOutIndex.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.SpkTxOutIndex.html
@@ -1,4 +1,4 @@
-SpkTxOutIndex in bdk_chain - Rust Struct bdk_chain::SpkTxOutIndex
source · pub struct SpkTxOutIndex<I> { /* private fields */ }
Expand description
An index storing TxOuts that have a script pubkey that matches those in a list.
+SpkTxOutIndex in bdk_chain - Rust Struct bdk_chain::SpkTxOutIndex
source · pub struct SpkTxOutIndex<I> { /* private fields */ }
Expand description
An index storing TxOuts that have a script pubkey that matches those in a list.
The basic idea is that you insert script pubkeys you care about into the index with
insert_spk and then when you call scan, the index will look at any txouts you pass in and
store and index any txouts matching one of its script pubkeys.
@@ -9,7 +9,7 @@ combination of (keychain, derivation_index).
in there in the first place. SpkTxOutIndex is intentionally monotone â you cannot delete or
modify txouts that have been indexed. To find out which txouts from the index are actually in the
chain or unspent, you must use other sources of information like a SparseChain.
-Implementations§
source§impl<I: Clone + Ord> SpkTxOutIndex<I>
sourcepub fn scan(&mut self, txouts: &impl ForEachTxOut) -> BTreeSet<I>
Scans an object containing many txouts.
+Implementations§
source§impl<I: Clone + Ord> SpkTxOutIndex<I>
sourcepub fn scan(&mut self, txouts: &impl ForEachTxOut) -> BTreeSet<I>
Scans an object containing many txouts.
Typically, this is used in two situations:
- After loading transaction data from the disk, you may scan over all the txouts to restore all
@@ -17,19 +17,19 @@ your txouts.
- When getting new data from the chain, you usually scan it before incorporating it into your chain state.
See ForEachTxout for the types that support this.
-sourcepub fn scan_txout(&mut self, op: OutPoint, txout: &TxOut) -> Option<&I>
Scan a single TxOut for a matching script pubkey and returns the index that matches the
+
sourcepub fn scan_txout(&mut self, op: OutPoint, txout: &TxOut) -> Option<&I>
Scan a single TxOut for a matching script pubkey and returns the index that matches the
script pubkey (if any).
-sourcepub fn txouts(
&self
) -> impl DoubleEndedIterator<Item = (&I, OutPoint, &TxOut)> + ExactSizeIterator
Iterate over all known txouts that spend to tracked script pubkeys.
-sourcepub fn txouts_in_tx(
&self,
txid: Txid
) -> impl DoubleEndedIterator<Item = (&I, OutPoint, &TxOut)>
Finds all txouts on a transaction that has previously been scanned and indexed.
-sourcepub fn outputs_in_range(
&self,
range: impl RangeBounds<I>
) -> impl DoubleEndedIterator<Item = (&I, OutPoint)>
Iterates over all the outputs with script pubkeys in an index range.
-sourcepub fn txout(&self, outpoint: OutPoint) -> Option<(&I, &TxOut)>
Returns the txout and script pubkey index of the TxOut at OutPoint.
+sourcepub fn txouts(
&self
) -> impl DoubleEndedIterator<Item = (&I, OutPoint, &TxOut)> + ExactSizeIterator
Iterate over all known txouts that spend to tracked script pubkeys.
+sourcepub fn txouts_in_tx(
&self,
txid: Txid
) -> impl DoubleEndedIterator<Item = (&I, OutPoint, &TxOut)>
Finds all txouts on a transaction that has previously been scanned and indexed.
+sourcepub fn outputs_in_range(
&self,
range: impl RangeBounds<I>
) -> impl DoubleEndedIterator<Item = (&I, OutPoint)>
Iterates over all the outputs with script pubkeys in an index range.
+sourcepub fn txout(&self, outpoint: OutPoint) -> Option<(&I, &TxOut)>
Returns the txout and script pubkey index of the TxOut at OutPoint.
Returns None if the TxOut hasnât been scanned or if nothing matching was found there.
-sourcepub fn spk_at_index(&self, index: &I) -> Option<&Script>
Returns the script that has been inserted at the index.
+sourcepub fn spk_at_index(&self, index: &I) -> Option<&Script>
Returns the script that has been inserted at the index.
If that index hasnât been inserted yet, it will return None.
-sourcepub fn all_spks(&self) -> &BTreeMap<I, Script>
The script pubkeys that are being tracked by the index.
-sourcepub fn insert_spk(&mut self, index: I, spk: Script) -> bool
Adds a script pubkey to scan for. Returns false and does nothing if spk already exists in the map
+sourcepub fn all_spks(&self) -> &BTreeMap<I, Script>
The script pubkeys that are being tracked by the index.
+sourcepub fn insert_spk(&mut self, index: I, spk: Script) -> bool
Adds a script pubkey to scan for. Returns false and does nothing if spk already exists in the map
the index will look for outputs spending to this spk whenever it scans new data.
-sourcepub fn unused_spks<R>(
&self,
range: R
) -> impl DoubleEndedIterator<Item = (&I, &Script)>where
R: RangeBounds<I>,
Iterates over all unused script pubkeys in an index range.
+sourcepub fn unused_spks<R>(
&self,
range: R
) -> impl DoubleEndedIterator<Item = (&I, &Script)>where
R: RangeBounds<I>,
Iterates over all unused script pubkeys in an index range.
Here, âunusedâ means that after the script pubkey was stored in the index, the index has
never scanned a transaction output with it.
Example
@@ -40,35 +40,35 @@ never scanned a transaction output with it.
let change_index = 1;
let unused_change_spks =
txout_index.unused_spks((change_index, u32::MIN)..(change_index, u32::MAX));
-sourcepub fn is_used(&self, index: &I) -> bool
Returns whether the script pubkey at index has been used or not.
+sourcepub fn is_used(&self, index: &I) -> bool
Returns whether the script pubkey at index has been used or not.
Here, âunusedâ means that after the script pubkey was stored in the index, the index has
never scanned a transaction output with it.
-sourcepub fn mark_used(&mut self, index: &I) -> bool
Marks the script pubkey at index as used even though it hasnât seen an output spending to it.
+
sourcepub fn mark_used(&mut self, index: &I) -> bool
Marks the script pubkey at index as used even though it hasnât seen an output spending to it.
This only affects when the index had already been added to self and was unused.
Returns whether the index was initially present as unused.
This is useful when you want to reserve a script pubkey for something but donât want to add
the transaction output using it to the index yet. Other callers will consider the index used
until you call unmark_used.
-sourcepub fn unmark_used(&mut self, index: &I) -> bool
Undoes the effect of mark_used. Returns whether the index is inserted back into
+
sourcepub fn unmark_used(&mut self, index: &I) -> bool
Undoes the effect of mark_used. Returns whether the index is inserted back into
unused.
Note that if self has scanned an output with this script pubkey then this will have no
effect.
-sourcepub fn index_of_spk(&self, script: &Script) -> Option<&I>
Returns the index associated with the script pubkey.
-sourcepub fn sent_and_received(&self, tx: &Transaction) -> (u64, u64)
Computes total input value going from script pubkeys in the index (sent) and the total output
+
sourcepub fn index_of_spk(&self, script: &Script) -> Option<&I>
Returns the index associated with the script pubkey.
+sourcepub fn sent_and_received(&self, tx: &Transaction) -> (u64, u64)
Computes total input value going from script pubkeys in the index (sent) and the total output
value going to script pubkeys in the index (received) in tx. For the sent to be computed
correctly, the output being spent must have already been scanned by the index. Calculating
received just uses the transaction outputs directly, so it will be correct even if it has not
been scanned.
-sourcepub fn net_value(&self, tx: &Transaction) -> i64
Computes the net value that this transaction gives to the script pubkeys in the index and
+
sourcepub fn net_value(&self, tx: &Transaction) -> i64
Computes the net value that this transaction gives to the script pubkeys in the index and
takes from the transaction outputs in the index. Shorthand for calling
sent_and_received and subtracting sent from received.
-sourcepub fn is_relevant(&self, tx: &Transaction) -> bool
Whether any of the inputs of this transaction spend a txout tracked or whether any output
+
sourcepub fn is_relevant(&self, tx: &Transaction) -> bool
Whether any of the inputs of this transaction spend a txout tracked or whether any output
matches one of our script pubkeys.
It is easily possible to misuse this method and get false negatives by calling it before you
have scanned the TxOuts the transaction is spending. For example, if you want to filter out
all the transactions in a block that are irrelevant, you must first scan all the
transactions in the block and only then use this method.
-Trait Implementations§
source§impl<I: Clone> Clone for SpkTxOutIndex<I>
source§fn clone(&self) -> SpkTxOutIndex<I>
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moresource§impl<I: Debug> Debug for SpkTxOutIndex<I>
Auto Trait Implementations§
§impl<I> RefUnwindSafe for SpkTxOutIndex<I>where
I: RefUnwindSafe,
§impl<I> Send for SpkTxOutIndex<I>where
I: Send,
§impl<I> Sync for SpkTxOutIndex<I>where
I: Sync,
§impl<I> Unpin for SpkTxOutIndex<I>where
I: Unpin,
§impl<I> UnwindSafe for SpkTxOutIndex<I>where
I: UnwindSafe + RefUnwindSafe,
Blanket Implementations§
Trait Implementations§
source§impl<I: Clone> Clone for SpkTxOutIndex<I>
source§fn clone(&self) -> SpkTxOutIndex<I>
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moresource§impl<I: Debug> Debug for SpkTxOutIndex<I>
source§impl<I> Default for SpkTxOutIndex<I>
source§impl<I: Clone + Ord + 'static> Indexer for SpkTxOutIndex<I>
source§fn index_txout(&mut self, outpoint: OutPoint, txout: &TxOut) -> Self::Additions
Scan and index the given outpoint and txout.source§fn index_tx(&mut self, tx: &Transaction) -> Self::Additions
Scan and index the given transaction.source§fn apply_additions(&mut self, _additions: Self::Additions)
Apply additions to itself.source§fn is_tx_relevant(&self, tx: &Transaction) -> bool
Determines whether the transaction should be included in the index.source§impl<I: Clone + Ord + 'static> OwnedIndexer for SpkTxOutIndex<I>
source§fn is_spk_owned(&self, spk: &Script) -> bool
Determines whether a given script pubkey (spk) is owned.Auto Trait Implementations§
§impl<I> RefUnwindSafe for SpkTxOutIndex<I>where
I: RefUnwindSafe,
§impl<I> Send for SpkTxOutIndex<I>where
I: Send,
§impl<I> Sync for SpkTxOutIndex<I>where
I: Sync,
§impl<I> Unpin for SpkTxOutIndex<I>where
I: Unpin,
§impl<I> UnwindSafe for SpkTxOutIndex<I>where
I: UnwindSafe + RefUnwindSafe,
Blanket Implementations§
source§impl<T, U> Into<U> for Twhere
U: From<T>,
const: unstable · source§fn into(self) -> U
Calls U::from(self).
That is, this conversion is whatever the implementation of
From<T> for U chooses to do.
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.Anchor.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.Anchor.html
new file mode 100644
index 0000000000..3afba442df
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.Anchor.html
@@ -0,0 +1,14 @@
+Anchor in bdk_chain - Rust pub trait Anchor: Debug + Clone + Eq + PartialOrd + Ord + Hash {
+ fn anchor_block(&self) -> BlockId;
+
+ fn confirmation_height_upper_bound(&self) -> u32 { ... }
+}
Expand description
Trait that âanchorsâ blockchain data to a specific block of height and hash.
+I.e. If transaction A is anchored in block B, then if block B is in the best chain, we can
+assume that transaction A is also confirmed in the best chain. This does not necessarily mean
+that transaction A is confirmed in block B. It could also mean transaction A is confirmed in a
+parent block of B.
+Required Methods§
sourcefn anchor_block(&self) -> BlockId
Returns the BlockId that the associated blockchain data is âanchoredâ in.
+Provided Methods§
sourcefn confirmation_height_upper_bound(&self) -> u32
Get the upper bound of the chain dataâs confirmation height.
+The default definition gives a pessimistic answer. This can be overridden by the Anchor
+implementation for a more accurate value.
+Implementations on Foreign Types§
Implementors§
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.Append.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.Append.html
new file mode 100644
index 0000000000..4966b00f6c
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.Append.html
@@ -0,0 +1,5 @@
+Append in bdk_chain - Rust
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.ChainOracle.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.ChainOracle.html
new file mode 100644
index 0000000000..e81059905a
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.ChainOracle.html
@@ -0,0 +1,11 @@
+ChainOracle in bdk_chain - Rust Trait bdk_chain::ChainOracle
source · pub trait ChainOracle {
+ type Error: Debug;
+
+ fn is_block_in_chain(
&self,
block: BlockId,
static_block: BlockId
) -> Result<Option<bool>, Self::Error>;
+}
Expand description
Represents a service that tracks the blockchain.
+The main method is is_block_in_chain which determines whether a given block of BlockId
+is an ancestor of another âstatic blockâ.
+Required Associated Types§
Required Methods§
Implementors§
source§impl ChainOracle for LocalChain
§type Error = Infallible
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.ForEachTxOut.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.ForEachTxOut.html
index 18f72e5353..c583f8c9b4 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.ForEachTxOut.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.ForEachTxOut.html
@@ -1,7 +1,7 @@
-ForEachTxOut in bdk_chain - Rust Trait bdk_chain::ForEachTxOut
source · pub trait ForEachTxOut {
+ForEachTxOut in bdk_chain - Rust Trait bdk_chain::ForEachTxOut
source · pub trait ForEachTxOut {
fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)));
}
Expand description
Trait to do something with every txout contained in a structure.
We would prefer to just work with things that can give us an Iterator<Item=(OutPoint, &TxOut)>
here, but rustâs type system makes it extremely hard to do this (without trait objects).
-Required Methods§
sourcefn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
The provided closure f will be called with each outpoint/txout pair.
-Implementations on Foreign Types§
source§impl ForEachTxOut for Block
source§fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
source§impl ForEachTxOut for Transaction
source§fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
Implementors§
source§impl ForEachTxOut for Additions
source§impl ForEachTxOut for TxGraph
source§impl<K, P> ForEachTxOut for KeychainChangeSet<K, P>
source§impl<P> ForEachTxOut for ChainGraph<P>
source§impl<P> ForEachTxOut for ChangeSet<P>
\ No newline at end of file
+
Required Methods§
sourcefn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
The provided closure f will be called with each outpoint/txout pair.
+Implementations on Foreign Types§
source§impl ForEachTxOut for Block
source§fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
source§impl ForEachTxOut for Transaction
source§fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
Implementors§
source§impl<A> ForEachTxOut for Additions<A>
source§impl<A> ForEachTxOut for TxGraph<A>
source§impl<K, P> ForEachTxOut for KeychainChangeSet<K, P>
source§impl<P> ForEachTxOut for ChainGraph<P>
source§impl<P> ForEachTxOut for ChangeSet<P>
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_data_traits/trait.Anchor.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_data_traits/trait.Anchor.html
new file mode 100644
index 0000000000..5490c43cc0
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_data_traits/trait.Anchor.html
@@ -0,0 +1,11 @@
+
+
+
+
+ Redirection
+
+
+ Redirecting to ../../bdk_chain/trait.Anchor.html...
+
+
+
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_data_traits/trait.Append.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_data_traits/trait.Append.html
new file mode 100644
index 0000000000..a82440df4a
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_data_traits/trait.Append.html
@@ -0,0 +1,11 @@
+
+
+
+
+ Redirection
+
+
+ Redirecting to ../../bdk_chain/trait.Append.html...
+
+
+
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/index.html
index 5d593a8d94..9c45dd6f5c 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/index.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/index.html
@@ -1,4 +1,4 @@
-bdk_chain::tx_graph - Rust Expand description
Module for structures that store and traverse transactions.
+bdk_chain::tx_graph - Rust Expand description
Module for structures that store and traverse transactions.
TxGraph is a monotone structure that inserts transactions and indexes the spends. The
Additions structure reports changes of TxGraph but can also be applied to a
TxGraph as well. Lastly, TxDescendants is an Iterator that traverses descendants of
@@ -10,7 +10,7 @@ identifying and traversing conflicts and descendants of a given transaction.
Additions can be applied back to a TxGraph or be used to inform persistent storage
of the changes to TxGraph.
-let mut graph = TxGraph::default();
+let mut graph: TxGraph = TxGraph::default();
// preview a transaction insertion (not actually inserted)
let additions = graph.insert_tx_preview(tx_a);
@@ -21,7 +21,7 @@ of the changes to TxGraphlet already_applied_additions = graph.insert_tx(tx_b);
A TxGraph can also be updated with another TxGraph.
-let mut graph = TxGraph::default();
+let mut graph: TxGraph = TxGraph::default();
let update = TxGraph::new(vec![tx_a, tx_b]);
// preview additions as the result of the update
@@ -33,4 +33,4 @@ of the changes to TxGraphlet additions = graph.apply_update(update);
assert!(additions.is_empty());
-
Structs
An iterator that traverses transaction descendants.A graph of transactions and spends.
\ No newline at end of file
+Structs
An outwards-facing view of a transaction that is part of the best chainâs history.An iterator that traverses transaction descendants.A graph of transactions and spends.
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/sidebar-items.js
index d4832c6c20..f9d4a17595 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/sidebar-items.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/sidebar-items.js
@@ -1 +1 @@
-window.SIDEBAR_ITEMS = {"struct":[["Additions","A structure that represents changes to a [`TxGraph`]."],["TxDescendants","An iterator that traverses transaction descendants."],["TxGraph","A graph of transactions and spends."]]};
\ No newline at end of file
+window.SIDEBAR_ITEMS = {"struct":[["Additions","A structure that represents changes to a [`TxGraph`]."],["CanonicalTx","An outwards-facing view of a transaction that is part of the best chainâs history."],["TxDescendants","An iterator that traverses transaction descendants."],["TxGraph","A graph of transactions and spends."],["TxNode","An outward-facing view of a (transaction) node in the [`TxGraph`]."]]};
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.Additions.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.Additions.html
index dc70bce8bd..4023fb8073 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.Additions.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.Additions.html
@@ -1,18 +1,18 @@
-Additions in bdk_chain::tx_graph - Rust pub struct Additions {
+Additions in bdk_chain::tx_graph - Rust pub struct Additions<A = ()> {
pub tx: BTreeSet<Transaction>,
pub txout: BTreeMap<OutPoint, TxOut>,
+ pub anchors: BTreeSet<(A, Txid)>,
+ pub last_seen: BTreeMap<Txid, u64>,
}
Expand description
A structure that represents changes to a TxGraph.
It is named âadditionsâ because TxGraph is monotone, so transactions can only be added and
not removed.
Refer to module-level documentation for more.
-Fields§
§tx: BTreeSet<Transaction>§txout: BTreeMap<OutPoint, TxOut>Implementations§
Trait Implementations§
source§impl<'de> Deserialize<'de> for Additions
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read moresource§impl ForEachTxOut for Additions
source§fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
The provided closure f will be called with each outpoint/txout pair.source§impl PartialEq<Additions> for Additions
source§fn eq(&self, other: &Additions) -> bool
This method tests for self and other values to be equal, and is used
+Fields§
§tx: BTreeSet<Transaction>§txout: BTreeMap<OutPoint, TxOut>§anchors: BTreeSet<(A, Txid)>§last_seen: BTreeMap<Txid, u64>Implementations§
Trait Implementations§
source§impl<'de, A> Deserialize<'de> for Additions<A>where
A: Ord + Deserialize<'de>,
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read moresource§impl<A> ForEachTxOut for Additions<A>
source§fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
The provided closure f will be called with each outpoint/txout pair.source§impl<A: PartialEq> PartialEq<Additions<A>> for Additions<A>
source§impl StructuralPartialEq for Additions
Auto Trait Implementations§
§impl RefUnwindSafe for Additions
§impl Send for Additions
§impl Sync for Additions
§impl Unpin for Additions
§impl UnwindSafe for Additions
Blanket Implementations§
source§impl<A> StructuralPartialEq for Additions<A>
Auto Trait Implementations§
§impl<A> RefUnwindSafe for Additions<A>where
A: RefUnwindSafe,
§impl<A> Send for Additions<A>where
A: Send,
§impl<A> Sync for Additions<A>where
A: Sync,
§impl<A> Unpin for Additions<A>
§impl<A> UnwindSafe for Additions<A>where
A: RefUnwindSafe,
Blanket Implementations§
source§impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
\ No newline at end of file
+source§impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.CanonicalTx.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.CanonicalTx.html
new file mode 100644
index 0000000000..834797382c
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.CanonicalTx.html
@@ -0,0 +1,15 @@
+CanonicalTx in bdk_chain::tx_graph - Rust Struct bdk_chain::tx_graph::CanonicalTx
source · pub struct CanonicalTx<'a, T, A> {
+ pub observed_as: ObservedAs<&'a A>,
+ pub node: TxNode<'a, T, A>,
+}
Expand description
An outwards-facing view of a transaction that is part of the best chainâs history.
+Fields§
§observed_as: ObservedAs<&'a A>How the transaction is observed as (confirmed or unconfirmed).
+§node: TxNode<'a, T, A>The transaction node (as part of the graph).
+Trait Implementations§
source§impl<'a, T: Clone, A: Clone> Clone for CanonicalTx<'a, T, A>
source§fn clone(&self) -> CanonicalTx<'a, T, A>
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moresource§impl<'a, T: Ord, A: Ord> Ord for CanonicalTx<'a, T, A>
source§fn cmp(&self, other: &CanonicalTx<'a, T, A>) -> Ordering
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
Compares and returns the maximum of two values. Read moresource§impl<'a, T: PartialEq, A: PartialEq> PartialEq<CanonicalTx<'a, T, A>> for CanonicalTx<'a, T, A>
source§fn eq(&self, other: &CanonicalTx<'a, T, A>) -> bool
source§impl<'a, T: PartialOrd, A: PartialOrd> PartialOrd<CanonicalTx<'a, T, A>> for CanonicalTx<'a, T, A>
source§fn partial_cmp(&self, other: &CanonicalTx<'a, T, A>) -> Option<Ordering>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
This method tests less than or equal to (for self and other) and is used by the <=
+operator. Read moresource§impl<'a, T: Eq, A: Eq> Eq for CanonicalTx<'a, T, A>
source§impl<'a, T, A> StructuralEq for CanonicalTx<'a, T, A>
source§impl<'a, T, A> StructuralPartialEq for CanonicalTx<'a, T, A>
Auto Trait Implementations§
§impl<'a, T, A> RefUnwindSafe for CanonicalTx<'a, T, A>where
A: RefUnwindSafe,
T: RefUnwindSafe,
§impl<'a, T, A> Send for CanonicalTx<'a, T, A>where
A: Sync,
T: Sync,
§impl<'a, T, A> Sync for CanonicalTx<'a, T, A>where
A: Sync,
T: Sync,
§impl<'a, T, A> Unpin for CanonicalTx<'a, T, A>
§impl<'a, T, A> UnwindSafe for CanonicalTx<'a, T, A>where
A: RefUnwindSafe,
T: RefUnwindSafe,
Blanket Implementations§
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxDescendants.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxDescendants.html
index 9c89591dbd..6b021ea1ea 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxDescendants.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxDescendants.html
@@ -1,6 +1,6 @@
-TxDescendants in bdk_chain::tx_graph - Rust Struct bdk_chain::tx_graph::TxDescendants
source · pub struct TxDescendants<'g, F> { /* private fields */ }
Expand description
An iterator that traverses transaction descendants.
+TxDescendants in bdk_chain::tx_graph - Rust Struct bdk_chain::tx_graph::TxDescendants
source · pub struct TxDescendants<'g, A, F> { /* private fields */ }
Expand description
An iterator that traverses transaction descendants.
This struct is created by the walk_descendants method of TxGraph.
-Trait Implementations§
source§impl<'g, F, O> Iterator for TxDescendants<'g, F>where
F: FnMut(usize, Txid) -> Option<O>,
source§fn next(&mut self) -> Option<Self::Item>
Advances the iterator and returns the next value. Read moresource§fn next_chunk<const N: usize>(
&mut self
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
ð¬This is a nightly-only experimental API. (iter_next_chunk)Advances the iterator and returns an array containing the next N values. Read more1.0.0 · source§fn size_hint(&self) -> (usize, Option<usize>)
Returns the bounds on the remaining length of the iterator. Read more1.0.0 · source§fn count(self) -> usizewhere
Self: Sized,
Consumes the iterator, counting the number of iterations and returning it. Read more1.0.0 · source§fn last(self) -> Option<Self::Item>where
Self: Sized,
Consumes the iterator, returning the last element. Read moresource§fn advance_by(&mut self, n: usize) -> Result<(), usize>
ð¬This is a nightly-only experimental API. (iter_advance_by)Advances the iterator by n elements. Read more1.0.0 · source§fn nth(&mut self, n: usize) -> Option<Self::Item>
Returns the nth element of the iterator. Read more1.28.0 · source§fn step_by(self, step: usize) -> StepBy<Self>where
Self: Sized,
Creates an iterator starting at the same point, but stepping by
+Trait Implementations§
source§impl<'g, A, F, O> Iterator for TxDescendants<'g, A, F>where
F: FnMut(usize, Txid) -> Option<O>,
source§fn next(&mut self) -> Option<Self::Item>
Advances the iterator and returns the next value. Read moresource§fn next_chunk<const N: usize>(
&mut self
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
ð¬This is a nightly-only experimental API. (iter_next_chunk)Advances the iterator and returns an array containing the next N values. Read more1.0.0 · source§fn size_hint(&self) -> (usize, Option<usize>)
Returns the bounds on the remaining length of the iterator. Read more1.0.0 · source§fn count(self) -> usizewhere
Self: Sized,
Consumes the iterator, counting the number of iterations and returning it. Read more1.0.0 · source§fn last(self) -> Option<Self::Item>where
Self: Sized,
Consumes the iterator, returning the last element. Read moresource§fn advance_by(&mut self, n: usize) -> Result<(), usize>
ð¬This is a nightly-only experimental API. (iter_advance_by)Advances the iterator by n elements. Read more1.0.0 · source§fn nth(&mut self, n: usize) -> Option<Self::Item>
Returns the nth element of the iterator. Read more1.28.0 · source§fn step_by(self, step: usize) -> StepBy<Self>where
Self: Sized,
Creates an iterator starting at the same point, but stepping by
the given amount at each iteration. Read more1.0.0 · source§fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>where
Self: Sized,
U: IntoIterator<Item = Self::Item>,
Takes two iterators and creates a new iterator over both in sequence. Read more1.0.0 · source§fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>where
Self: Sized,
U: IntoIterator,
âZips upâ two iterators into a single iterator of pairs. Read moresource§fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>where
Self: Sized,
G: FnMut() -> Self::Item,
ð¬This is a nightly-only experimental API. (iter_intersperse)Creates a new iterator which places an item generated by separator
between adjacent items of the original iterator. Read more1.0.0 · source§fn map<B, F>(self, f: F) -> Map<Self, F>where
Self: Sized,
F: FnMut(Self::Item) -> B,
Takes a closure and creates an iterator which calls that closure on each
element. Read more1.21.0 · source§fn for_each<F>(self, f: F)where
Self: Sized,
F: FnMut(Self::Item),
Calls a closure on each element of an iterator. Read more1.0.0 · source§fn filter<P>(self, predicate: P) -> Filter<Self, P>where
Self: Sized,
P: FnMut(&Self::Item) -> bool,
Creates an iterator which uses a closure to determine if an element
@@ -32,11 +32,11 @@ less than those of another. Read more1.5.0 · source§fn gt<I>(self, other: I) -> boolwhere
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
Self: Sized,
Determines if the elements of this Iterator are lexicographically
greater than those of another. Read more1.5.0 · source§fn ge<I>(self, other: I) -> boolwhere
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
Self: Sized,
Determines if the elements of this Iterator are lexicographically
greater than or equal to those of another. Read moresource§fn is_sorted_by<F>(self, compare: F) -> boolwhere
Self: Sized,
F: FnMut(&Self::Item, &Self::Item) -> Option<Ordering>,
ð¬This is a nightly-only experimental API. (is_sorted)Checks if the elements of this iterator are sorted using the given comparator function. Read moresource§fn is_sorted_by_key<F, K>(self, f: F) -> boolwhere
Self: Sized,
F: FnMut(Self::Item) -> K,
K: PartialOrd<K>,
ð¬This is a nightly-only experimental API. (is_sorted)Checks if the elements of this iterator are sorted using the given key extraction
-function. Read moreAuto Trait Implementations§
§impl<'g, F> RefUnwindSafe for TxDescendants<'g, F>where
F: RefUnwindSafe,
§impl<'g, F> Send for TxDescendants<'g, F>where
F: Send,
§impl<'g, F> Sync for TxDescendants<'g, F>where
F: Sync,
§impl<'g, F> Unpin for TxDescendants<'g, F>where
F: Unpin,
§impl<'g, F> UnwindSafe for TxDescendants<'g, F>where
F: UnwindSafe,
Blanket Implementations§
§impl<T> CheckedSum<Amount> for Twhere
T: Iterator<Item = Amount>,
§fn checked_sum(self) -> Option<Amount>
Calculate the sum over the iterator using checked arithmetic. If an over or underflow would
-happen it returns None. Read more§impl<T> CheckedSum<SignedAmount> for Twhere
T: Iterator<Item = SignedAmount>,
§fn checked_sum(self) -> Option<SignedAmount>
Calculate the sum over the iterator using checked arithmetic. If an over or underflow would
-happen it returns None. Read moreAuto Trait Implementations§
§impl<'g, A, F> RefUnwindSafe for TxDescendants<'g, A, F>where
A: RefUnwindSafe,
F: RefUnwindSafe,
§impl<'g, A, F> Send for TxDescendants<'g, A, F>where
A: Sync,
F: Send,
§impl<'g, A, F> Sync for TxDescendants<'g, A, F>where
A: Sync,
F: Sync,
§impl<'g, A, F> Unpin for TxDescendants<'g, A, F>where
F: Unpin,
§impl<'g, A, F> UnwindSafe for TxDescendants<'g, A, F>where
A: RefUnwindSafe,
F: UnwindSafe,
Blanket Implementations§
§impl<T> CheckedSum<Amount> for Twhere
T: Iterator<Item = Amount>,
§fn checked_sum(self) -> Option<Amount>
Calculate the sum over the iterator using checked arithmetic. If an over or underflow would
+happen it returns None. Read more§impl<T> CheckedSum<SignedAmount> for Twhere
T: Iterator<Item = SignedAmount>,
§fn checked_sum(self) -> Option<SignedAmount>
Calculate the sum over the iterator using checked arithmetic. If an over or underflow would
+happen it returns None. Read moresource§impl<I> IntoIterator for Iwhere
I: Iterator,
source§impl<I> IteratorRandom for Iwhere
I: Iterator,
source§fn choose<R>(self, rng: &mut R) -> Option<Self::Item>where
R: Rng + ?Sized,
Choose one element at random from the iterator. Read moresource§fn choose_stable<R>(self, rng: &mut R) -> Option<Self::Item>where
R: Rng + ?Sized,
Choose one element at random from the iterator. Read more
\ No newline at end of file
+source§impl<I> IntoIterator for Iwhere
I: Iterator,
source§impl<I> IteratorRandom for Iwhere
I: Iterator,
source§fn choose<R>(self, rng: &mut R) -> Option<Self::Item>where
R: Rng + ?Sized,
Choose one element at random from the iterator. Read moresource§fn choose_stable<R>(self, rng: &mut R) -> Option<Self::Item>where
R: Rng + ?Sized,
Choose one element at random from the iterator. Read more
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxGraph.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxGraph.html
index 49e2136532..b211eac6bb 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxGraph.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxGraph.html
@@ -1,49 +1,33 @@
-TxGraph in bdk_chain::tx_graph - Rust pub struct TxGraph { /* private fields */ }
Expand description
A graph of transactions and spends.
+TxGraph in bdk_chain::tx_graph - Rust pub struct TxGraph<A = ()> { /* private fields */ }
Expand description
A graph of transactions and spends.
See the module-level documentation for more.
-Implementations§
source§impl TxGraph
sourcepub fn all_txouts(&self) -> impl Iterator<Item = (OutPoint, &TxOut)>
Iterate over all tx outputs known by TxGraph.
-sourcepub fn full_transactions(&self) -> impl Iterator<Item = &Transaction>
Iterate over all full transactions in the graph.
-sourcepub fn get_tx(&self, txid: Txid) -> Option<&Transaction>
Get a transaction by txid. This only returns Some for full transactions.
+Implementations§
source§impl<A> TxGraph<A>
sourcepub fn all_txouts(&self) -> impl Iterator<Item = (OutPoint, &TxOut)>
Iterate over all tx outputs known by TxGraph.
+This includes txouts of both full transactions as well as floating transactions.
+sourcepub fn floating_txouts(&self) -> impl Iterator<Item = (OutPoint, &TxOut)>
Iterate over floating txouts known by TxGraph.
+Floating txouts are txouts that do not have the residing full transaction contained in the
+graph.
+sourcepub fn full_txs(&self) -> impl Iterator<Item = TxNode<'_, Transaction, A>>
Iterate over all full transactions in the graph.
+sourcepub fn get_tx(&self, txid: Txid) -> Option<&Transaction>
Get a transaction by txid. This only returns Some for full transactions.
Refer to get_txout for getting a specific [TxOut].
-sourcepub fn get_txout(&self, outpoint: OutPoint) -> Option<&TxOut>
Obtains a single tx output (if any) at the specified outpoint.
-sourcepub fn txouts(&self, txid: Txid) -> Option<BTreeMap<u32, &TxOut>>
Returns a BTreeMap of vout to output of the provided txid.
-sourcepub fn calculate_fee(&self, tx: &Transaction) -> Option<i64>
Calculates the fee of a given transaction. Returns 0 if tx is a coinbase transaction.
+
sourcepub fn get_tx_node(&self, txid: Txid) -> Option<TxNode<'_, Transaction, A>>
Get a transaction node by txid. This only returns Some for full transactions.
+sourcepub fn get_txout(&self, outpoint: OutPoint) -> Option<&TxOut>
Obtains a single tx output (if any) at the specified outpoint.
+sourcepub fn tx_outputs(&self, txid: Txid) -> Option<BTreeMap<u32, &TxOut>>
Returns known outputs of a given txid.
+Returns a BTreeMap of vout to output of the provided txid.
+sourcepub fn calculate_fee(&self, tx: &Transaction) -> Option<i64>
Calculates the fee of a given transaction. Returns 0 if tx is a coinbase transaction.
Returns Some(_) if we have all the TxOuts being spent by tx in the graph (either as
the full transactions or individual txouts). If the returned value is negative, then the
transaction is invalid according to the graph.
Returns None if weâre missing an input for the tx in the graph.
Note tx does not have to be in the graph for this to work.
-source§impl TxGraph
sourcepub fn new(txs: impl IntoIterator<Item = Transaction>) -> Self
Construct a new TxGraph from a list of transactions.
-sourcepub fn insert_txout(&mut self, outpoint: OutPoint, txout: TxOut) -> Additions
Inserts the given [TxOut] at [OutPoint].
-Note this will ignore the action if we already have the full transaction that the txout is
-alleged to be on (even if it doesnât match it!).
-sourcepub fn apply_update(&mut self, update: TxGraph) -> Additions
Extends this graph with another so that self becomes the union of the two sets of
-transactions.
-The returned Additions is the set difference between update and self (transactions that
-exist in update but not in self).
-sourcepub fn apply_additions(&mut self, additions: Additions)
sourcepub fn determine_additions(&self, update: &TxGraph) -> Additions
sourcepub fn insert_tx_preview(&self, tx: Transaction) -> Additions
sourcepub fn insert_txout_preview(&self, outpoint: OutPoint, txout: TxOut) -> Additions
source§impl TxGraph
sourcepub fn outspends(&self, outpoint: OutPoint) -> &HashSet<Txid>
The transactions spending from this output.
+sourcepub fn outspends(&self, outpoint: OutPoint) -> &HashSet<Txid>
The transactions spending from this output.
TxGraph allows conflicting transactions within the graph. Obviously the transactions in
the returned set will never be in the same active-chain.
-sourcepub fn tx_outspends(
&self,
txid: Txid
) -> impl DoubleEndedIterator<Item = (u32, &HashSet<Txid>)> + '_
Iterates over the transactions spending from txid.
+sourcepub fn tx_spends(
&self,
txid: Txid
) -> impl DoubleEndedIterator<Item = (u32, &HashSet<Txid>)> + '_
Iterates over the transactions spending from txid.
The iterator item is a union of (vout, txid-set) where:
vout is the provided txidâs outpoint that is being spent
txid-set is the set of txids spending the vout.
-sourcepub fn partial_transactions(
&self
) -> impl Iterator<Item = (Txid, &BTreeMap<u32, TxOut>)>
Iterate over all partial transactions (outputs only) in the graph.
-sourcepub fn walk_descendants<'g, F, O>(
&'g self,
txid: Txid,
walk_map: F
) -> TxDescendants<'_, F> âwhere
F: FnMut(usize, Txid) -> Option<O> + 'g,
Creates an iterator that filters and maps descendants from the starting txid.
+sourcepub fn walk_descendants<'g, F, O>(
&'g self,
txid: Txid,
walk_map: F
) -> TxDescendants<'_, A, F> âwhere
F: FnMut(usize, Txid) -> Option<O> + 'g,
Creates an iterator that filters and maps descendants from the starting txid.
The supplied closure takes in two inputs (depth, descendant_txid):
depth is the distance between the starting txid and the descendant_txid. I.e., if the
@@ -52,19 +36,93 @@ descendant is spending an output of the starting txid; the de
The supplied closure returns an Option<T>, allowing the caller to map each node it vists
and decide whether to visit descendants.
-sourcepub fn walk_conflicts<'g, F, O>(
&'g self,
tx: &'g Transaction,
walk_map: F
) -> TxDescendants<'_, F> âwhere
F: FnMut(usize, Txid) -> Option<O> + 'g,
Creates an iterator that both filters and maps conflicting transactions (this includes
+
sourcepub fn walk_conflicts<'g, F, O>(
&'g self,
tx: &'g Transaction,
walk_map: F
) -> TxDescendants<'_, A, F> âwhere
F: FnMut(usize, Txid) -> Option<O> + 'g,
Creates an iterator that both filters and maps conflicting transactions (this includes
descendants of directly-conflicting transactions, which are also considered conflicts).
Refer to Self::walk_descendants for walk_map usage.
-sourcepub fn direct_conflicts_of_tx<'g>(
&'g self,
tx: &'g Transaction
) -> impl Iterator<Item = (usize, Txid)> + '_
Given a transaction, return an iterator of txids that directly conflict with the given
+
sourcepub fn direct_conflicts_of_tx<'g>(
&'g self,
tx: &'g Transaction
) -> impl Iterator<Item = (usize, Txid)> + '_
Given a transaction, return an iterator of txids that directly conflict with the given
transactionâs inputs (spends). The conflicting txids are returned with the given
transactionâs vin (in which it conflicts).
Note that this only returns directly conflicting txids and does not include descendants of
those txids (which are technically also conflicting).
-Trait Implementations§
source§impl<P> AsRef<TxGraph> for ChainGraph<P>
source§impl<K, P> AsRef<TxGraph> for KeychainScan<K, P>
source§impl<K, P> AsRef<TxGraph> for KeychainTracker<K, P>
source§impl ForEachTxOut for TxGraph
source§fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
The provided closure f will be called with each outpoint/txout pair.source§impl<A: Clone + Ord> TxGraph<A>
sourcepub fn new(txs: impl IntoIterator<Item = Transaction>) -> Self
Construct a new TxGraph from a list of transactions.
+sourcepub fn insert_txout_preview(
&self,
outpoint: OutPoint,
txout: TxOut
) -> Additions<A>
Returns the resultant Additions if the given txout is inserted at outpoint. Does not
+mutate self.
+Inserting floating txouts are useful for determining fee/feerate of transactions we care
+about.
+The Additions result will be empty if the outpoint (or a full transaction containing
+the outpoint) already existed in self.
+sourcepub fn insert_txout(&mut self, outpoint: OutPoint, txout: TxOut) -> Additions<A>
Inserts the given [TxOut] at [OutPoint].
+This is equivalent to calling insert_txout_preview and apply_additions in sequence.
+sourcepub fn insert_tx_preview(&self, tx: Transaction) -> Additions<A>
sourcepub fn insert_anchor_preview(&self, txid: Txid, anchor: A) -> Additions<A>
Returns the resultant Additions if the txid is set in anchor.
+sourcepub fn insert_anchor(&mut self, txid: Txid, anchor: A) -> Additions<A>
Inserts the given anchor into TxGraph.
+This is equivalent to calling insert_anchor_preview and apply_additions in sequence.
+The Additions returned will be empty if graph already knows that txid exists in
+anchor.
+sourcepub fn insert_seen_at_preview(&self, txid: Txid, seen_at: u64) -> Additions<A>
sourcepub fn insert_seen_at(&mut self, txid: Txid, seen_at: u64) -> Additions<A>
Inserts the given seen_at into TxGraph.
+This is equivalent to calling insert_seen_at_preview and apply_additions in
+sequence.
+sourcepub fn apply_update(&mut self, update: TxGraph<A>) -> Additions<A>
Extends this graph with another so that self becomes the union of the two sets of
+transactions.
+The returned Additions is the set difference between update and self (transactions that
+exist in update but not in self).
+sourcepub fn apply_additions(&mut self, additions: Additions<A>)
source§impl<A: Anchor> TxGraph<A>
sourcepub fn relevant_heights(&self) -> impl Iterator<Item = u32> + '_
Get all heights that are relevant to the graph.
+sourcepub fn try_get_chain_position<C: ChainOracle>(
&self,
chain: &C,
chain_tip: BlockId,
txid: Txid
) -> Result<Option<ObservedAs<&A>>, C::Error>
Get the position of the transaction in chain with tip chain_tip.
+If the given transaction of txid does not exist in the chain of chain_tip, None is
+returned.
+Error
+An error will occur if the ChainOracle implementation (chain) fails. If the
+ChainOracle is infallible, get_chain_position can be used instead.
+sourcepub fn get_chain_position<C: ChainOracle<Error = Infallible>>(
&self,
chain: &C,
chain_tip: BlockId,
txid: Txid
) -> Option<ObservedAs<&A>>
Get the position of the transaction in chain with tip chain_tip.
+This is the infallible version of try_get_chain_position.
+sourcepub fn try_get_chain_spend<C: ChainOracle>(
&self,
chain: &C,
chain_tip: BlockId,
outpoint: OutPoint
) -> Result<Option<(ObservedAs<&A>, Txid)>, C::Error>
Get the txid of the spending transaction and where the spending transaction is observed in
+the chain of chain_tip.
+If no in-chain transaction spends outpoint, None will be returned.
+Error
+An error will occur only if the ChainOracle implementation (chain) fails.
+If the ChainOracle is infallible, get_chain_spend can be used instead.
+sourcepub fn get_chain_spend<C: ChainOracle<Error = Infallible>>(
&self,
chain: &C,
static_block: BlockId,
outpoint: OutPoint
) -> Option<(ObservedAs<&A>, Txid)>
Get the txid of the spending transaction and where the spending transaction is observed in
+the chain of chain_tip.
+This is the infallible version of try_get_chain_spend
+sourcepub fn try_list_chain_txs<'a, C: ChainOracle + 'a>(
&'a self,
chain: &'a C,
chain_tip: BlockId
) -> impl Iterator<Item = Result<CanonicalTx<'a, Transaction, A>, C::Error>>
List graph transactions that are in chain with chain_tip.
+Each transaction is represented as a CanonicalTx that contains where the transaction is
+observed in-chain, and the TxNode.
+Error
+If the ChainOracle implementation (chain) fails, an error will be returned with the
+returned item.
+If the ChainOracle is infallible, list_chain_txs can be used instead.
+sourcepub fn list_chain_txs<'a, C: ChainOracle + 'a>(
&'a self,
chain: &'a C,
chain_tip: BlockId
) -> impl Iterator<Item = CanonicalTx<'a, Transaction, A>>
List graph transactions that are in chain with chain_tip.
+This is the infallible version of try_list_chain_txs.
+sourcepub fn try_list_chain_txouts<'a, C: ChainOracle + 'a>(
&'a self,
chain: &'a C,
chain_tip: BlockId
) -> impl Iterator<Item = Result<FullTxOut<ObservedAs<A>>, C::Error>> + 'a
List outputs that are in chain with chain_tip.
+Floating ouputs are not iterated over.
+The filter_predicate should return true for outputs that we wish to iterate over.
+Error
+A returned item can error if the ChainOracle implementation (chain) fails.
+If the ChainOracle is infallible, list_chain_txouts can be used instead.
+sourcepub fn list_chain_txouts<'a, C: ChainOracle<Error = Infallible> + 'a>(
&'a self,
chain: &'a C,
chain_tip: BlockId
) -> impl Iterator<Item = FullTxOut<ObservedAs<A>>> + 'a
List outputs that are in chain with chain_tip.
+This is the infallible version of try_list_chain_txouts.
+sourcepub fn try_list_chain_unspents<'a, C: ChainOracle + 'a>(
&'a self,
chain: &'a C,
chain_tip: BlockId
) -> impl Iterator<Item = Result<FullTxOut<ObservedAs<A>>, C::Error>> + 'a
List unspent outputs (UTXOs) that are in chain with chain_tip.
+Floating outputs are not iterated over.
+Error
+An item can be an error if the ChainOracle implementation fails. If the oracle is
+infallible, list_chain_unspents can be used instead.
+sourcepub fn list_chain_unspents<'a, C: ChainOracle<Error = Infallible> + 'a>(
&'a self,
chain: &'a C,
static_block: BlockId
) -> impl Iterator<Item = FullTxOut<ObservedAs<A>>> + 'a
List unspent outputs (UTXOs) that are in chain with chain_tip.
+This is the infallible version of try_list_chain_unspents.
+Trait Implementations§
source§impl<A> ForEachTxOut for TxGraph<A>
source§fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut)))
The provided closure f will be called with each outpoint/txout pair.source§impl<A: PartialEq> PartialEq<TxGraph<A>> for TxGraph<A>
source§impl StructuralPartialEq for TxGraph
Auto Trait Implementations§
§impl RefUnwindSafe for TxGraph
§impl Send for TxGraph
§impl Sync for TxGraph
§impl Unpin for TxGraph
§impl UnwindSafe for TxGraph
Blanket Implementations§
source§impl<A> StructuralPartialEq for TxGraph<A>
Auto Trait Implementations§
§impl<A> RefUnwindSafe for TxGraph<A>where
A: RefUnwindSafe,
§impl<A> Send for TxGraph<A>where
A: Send,
§impl<A> Sync for TxGraph<A>where
A: Sync,
§impl<A> Unpin for TxGraph<A>
§impl<A> UnwindSafe for TxGraph<A>where
A: RefUnwindSafe,
Blanket Implementations§
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxNode.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxNode.html
new file mode 100644
index 0000000000..8d1c8d7374
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxNode.html
@@ -0,0 +1,19 @@
+TxNode in bdk_chain::tx_graph - Rust pub struct TxNode<'a, T, A> {
+ pub txid: Txid,
+ pub tx: &'a T,
+ pub anchors: &'a BTreeSet<A>,
+ pub last_seen_unconfirmed: u64,
+}
Expand description
An outward-facing view of a (transaction) node in the TxGraph.
+Fields§
§txid: TxidTxid of the transaction.
+§tx: &'a TA partial or full representation of the transaction.
+§anchors: &'a BTreeSet<A>The blocks that the transaction is âanchoredâ in.
+§last_seen_unconfirmed: u64The last-seen unix timestamp of the transaction as unconfirmed.
+Trait Implementations§
source§impl<'a, T: Ord, A: Ord> Ord for TxNode<'a, T, A>
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
Compares and returns the maximum of two values. Read moresource§impl<'a, T: PartialEq, A: PartialEq> PartialEq<TxNode<'a, T, A>> for TxNode<'a, T, A>
source§impl<'a, T: PartialOrd, A: PartialOrd> PartialOrd<TxNode<'a, T, A>> for TxNode<'a, T, A>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
This method tests less than or equal to (for self and other) and is used by the <=
+operator. Read moresource§impl<'a, T: Eq, A: Eq> Eq for TxNode<'a, T, A>
source§impl<'a, T, A> StructuralEq for TxNode<'a, T, A>
source§impl<'a, T, A> StructuralPartialEq for TxNode<'a, T, A>
Auto Trait Implementations§
§impl<'a, T, A> RefUnwindSafe for TxNode<'a, T, A>where
A: RefUnwindSafe,
T: RefUnwindSafe,
§impl<'a, T, A> Send for TxNode<'a, T, A>where
A: Sync,
T: Sync,
§impl<'a, T, A> Sync for TxNode<'a, T, A>where
A: Sync,
T: Sync,
§impl<'a, T, A> Unpin for TxNode<'a, T, A>
§impl<'a, T, A> UnwindSafe for TxNode<'a, T, A>where
A: RefUnwindSafe,
T: RefUnwindSafe,
Blanket Implementations§
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/chain_oracle/trait.ChainOracle.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/chain_oracle/trait.ChainOracle.js
new file mode 100644
index 0000000000..1a8211de1a
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/chain_oracle/trait.ChainOracle.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"bdk_chain":[]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/indexed_tx_graph/trait.Indexer.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/indexed_tx_graph/trait.Indexer.js
new file mode 100644
index 0000000000..1a8211de1a
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/indexed_tx_graph/trait.Indexer.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"bdk_chain":[]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/indexed_tx_graph/trait.OwnedIndexer.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/indexed_tx_graph/trait.OwnedIndexer.js
new file mode 100644
index 0000000000..1a8211de1a
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/indexed_tx_graph/trait.OwnedIndexer.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"bdk_chain":[]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/tx_data_traits/trait.Anchor.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/tx_data_traits/trait.Anchor.js
new file mode 100644
index 0000000000..1a8211de1a
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/tx_data_traits/trait.Anchor.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"bdk_chain":[]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/tx_data_traits/trait.Append.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/tx_data_traits/trait.Append.js
new file mode 100644
index 0000000000..1a8211de1a
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/tx_data_traits/trait.Append.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"bdk_chain":[]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/clone/trait.Clone.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/clone/trait.Clone.js
index 7b9d2d5d98..51dd79c48b 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/clone/trait.Clone.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/clone/trait.Clone.js
@@ -1,6 +1,6 @@
(function() {var implementors = {
"bdk":[["impl Clone for PkOrF"],["impl Clone for SatisfiableItem"],["impl Clone for Satisfaction"],["impl Clone for Policy"],["impl Clone for Condition"],["impl<'a> Clone for BuildSatisfaction<'a>"],["impl Clone for ScriptContextEnum"],["impl<K: Clone, Ctx: ScriptContext> Clone for GeneratedKey<K, Ctx>"],["impl Clone for PrivateKeyGenerateOptions"],["impl Clone for KeychainKind"],["impl Clone for FeeRate"],["impl Clone for LocalUtxo"],["impl Clone for WeightedUtxo"],["impl Clone for Utxo"],["impl Clone for TransactionDetails"],["impl Clone for LargestFirstCoinSelection"],["impl Clone for OldestFirstCoinSelection"],["impl Clone for BranchAndBoundCoinSelection"],["impl Clone for SignerId"],["impl Clone for SignerError"],["impl Clone for SignerContext"],["impl<S: Clone + Sized + Debug + Clone> Clone for SignerWrapper<S>"],["impl Clone for SignerOrdering"],["impl Clone for SignersContainer"],["impl Clone for SignOptions"],["impl Clone for TapLeavesOptions"],["impl Clone for CreateTx"],["impl Clone for BumpFee"],["impl<'a, D, Cs: Clone, Ctx> Clone for TxBuilder<'a, D, Cs, Ctx>"],["impl Clone for TxOrdering"],["impl Clone for ChangeSpendPolicy"]],
-"bdk_chain":[["impl<P: Clone> Clone for ChainGraph<P>"],["impl<P: Clone> Clone for ChangeSet<P>"],["impl<P: Clone> Clone for NewError<P>"],["impl<P: Clone> Clone for InsertTxError<P>"],["impl<P: Clone> Clone for UpdateError<P>"],["impl<P: Clone> Clone for UnresolvableConflict<P>"],["impl<I: Clone> Clone for SpkTxOutIndex<I>"],["impl Clone for TxHeight"],["impl Clone for ConfirmationTime"],["impl Clone for BlockId"],["impl<I: Clone> Clone for FullTxOut<I>"],["impl<K: Clone, P: Clone> Clone for KeychainTracker<K, P>"],["impl<K: Clone> Clone for KeychainTxOutIndex<K>"],["impl<K: Clone> Clone for DerivationAdditions<K>"],["impl<K: Clone, P: Clone> Clone for KeychainScan<K, P>"],["impl<K: Clone, P: Clone> Clone for KeychainChangeSet<K, P>"],["impl Clone for Balance"],["impl<P: Clone> Clone for SparseChain<P>"],["impl<P: Clone> Clone for InsertTxError<P>"],["impl Clone for InsertCheckpointError"],["impl<P: Clone> Clone for UpdateError<P>"],["impl<P: Clone> Clone for ChangeSet<P>"],["impl Clone for TxGraph"],["impl Clone for Additions"]],
+"bdk_chain":[["impl<P: Clone> Clone for ChainGraph<P>"],["impl<P: Clone> Clone for ChangeSet<P>"],["impl<P: Clone> Clone for NewError<P>"],["impl<P: Clone> Clone for InsertTxError<P>"],["impl<P: Clone> Clone for UpdateError<P>"],["impl<P: Clone> Clone for UnresolvableConflict<P>"],["impl<I: Clone> Clone for SpkTxOutIndex<I>"],["impl<A: Clone> Clone for ObservedAs<A>"],["impl Clone for TxHeight"],["impl Clone for ConfirmationTime"],["impl Clone for BlockId"],["impl<P: Clone> Clone for FullTxOut<P>"],["impl<A: Clone, IA: Clone> Clone for IndexedAdditions<A, IA>"],["impl<K: Clone, P: Clone> Clone for KeychainTracker<K, P>"],["impl<K: Clone> Clone for KeychainTxOutIndex<K>"],["impl<K: Clone> Clone for DerivationAdditions<K>"],["impl<K: Clone, P: Clone> Clone for KeychainScan<K, P>"],["impl<K: Clone, P: Clone> Clone for KeychainChangeSet<K, P>"],["impl Clone for Balance"],["impl Clone for LocalChain"],["impl Clone for UpdateNotConnectedError"],["impl<P: Clone> Clone for SparseChain<P>"],["impl<P: Clone> Clone for InsertTxError<P>"],["impl Clone for InsertCheckpointError"],["impl<P: Clone> Clone for UpdateError<P>"],["impl<P: Clone> Clone for ChangeSet<P>"],["impl<A: Clone> Clone for TxGraph<A>"],["impl<'a, T: Clone, A: Clone> Clone for TxNode<'a, T, A>"],["impl<'a, T: Clone, A: Clone> Clone for CanonicalTx<'a, T, A>"],["impl<A: Clone> Clone for Additions<A>"]],
"bdk_coin_select":[["impl Clone for WeightedValue"],["impl Clone for CoinSelectorOpt"],["impl<'a> Clone for CoinSelector<'a>"],["impl Clone for SelectionError"],["impl Clone for SelectionConstraint"],["impl Clone for Selection"],["impl Clone for ExcessStrategyKind"],["impl Clone for ExcessStrategy"]],
"bdk_tmp_plan":[["impl<Ak: Clone> Clone for Requirements<Ak>"],["impl<Ak: Clone> Clone for RequiredSignatures<Ak>"],["impl Clone for SigningError"],["impl<Ak: Clone> Clone for PlanKey<Ak>"],["impl<AK: Clone> Clone for Plan<AK>"],["impl Clone for SatisfactionMaterial"],["impl<K: Clone> Clone for Assets<K>"]],
"keychain_tracker_electrum_example":[["impl Clone for ElectrumCommands"],["impl Clone for ScanOptions"]],
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Eq.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Eq.js
index cf17e91c08..75081f5d46 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Eq.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Eq.js
@@ -1,6 +1,6 @@
(function() {var implementors = {
"bdk":[["impl Eq for PkOrF"],["impl Eq for SatisfiableItem"],["impl Eq for Satisfaction"],["impl Eq for Policy"],["impl Eq for Condition"],["impl Eq for PolicyError"],["impl Eq for ScriptContextEnum"],["impl Eq for KeychainKind"],["impl Eq for LocalUtxo"],["impl Eq for WeightedUtxo"],["impl Eq for Utxo"],["impl Eq for TransactionDetails"],["impl Eq for SignerId"],["impl Eq for SignerError"],["impl Eq for SignerContext"],["impl Eq for SignerOrdering"],["impl Eq for TapLeavesOptions"],["impl Eq for TxOrdering"],["impl Eq for ChangeSpendPolicy"],["impl Eq for AddressInfo"]],
-"bdk_chain":[["impl Eq for TxHeight"],["impl Eq for ConfirmationTime"],["impl Eq for BlockId"],["impl Eq for Balance"]],
+"bdk_chain":[["impl<A: Eq> Eq for ObservedAs<A>"],["impl Eq for TxHeight"],["impl Eq for ConfirmationTime"],["impl Eq for BlockId"],["impl<P: Eq> Eq for FullTxOut<P>"],["impl Eq for Balance"],["impl Eq for LocalChain"],["impl<'a, T: Eq, A: Eq> Eq for TxNode<'a, T, A>"],["impl<'a, T: Eq, A: Eq> Eq for CanonicalTx<'a, T, A>"]],
"bdk_coin_select":[["impl Eq for SelectionConstraint"],["impl Eq for ExcessStrategyKind"]],
"keychain_tracker_example_cli":[["impl Eq for Keychain"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Ord.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Ord.js
index 2528266e74..5bd7a1008b 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Ord.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Ord.js
@@ -1,6 +1,6 @@
(function() {var implementors = {
"bdk":[["impl Ord for KeychainKind"],["impl Ord for TransactionDetails"],["impl Ord for SignerId"],["impl Ord for SignerOrdering"],["impl Ord for TxOrdering"],["impl Ord for ChangeSpendPolicy"]],
-"bdk_chain":[["impl Ord for TxHeight"],["impl Ord for ConfirmationTime"],["impl Ord for BlockId"]],
+"bdk_chain":[["impl<A: Ord> Ord for ObservedAs<A>"],["impl Ord for TxHeight"],["impl Ord for ConfirmationTime"],["impl Ord for BlockId"],["impl<P: Ord> Ord for FullTxOut<P>"],["impl Ord for LocalChain"],["impl<'a, T: Ord, A: Ord> Ord for TxNode<'a, T, A>"],["impl<'a, T: Ord, A: Ord> Ord for CanonicalTx<'a, T, A>"]],
"bdk_coin_select":[["impl Ord for ExcessStrategyKind"]],
"keychain_tracker_example_cli":[["impl Ord for Keychain"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialEq.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialEq.js
index 075118c0b1..84486104d0 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialEq.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialEq.js
@@ -1,6 +1,6 @@
(function() {var implementors = {
"bdk":[["impl PartialEq<PkOrF> for PkOrF"],["impl PartialEq<SatisfiableItem> for SatisfiableItem"],["impl PartialEq<Satisfaction> for Satisfaction"],["impl PartialEq<Policy> for Policy"],["impl PartialEq<Condition> for Condition"],["impl PartialEq<PolicyError> for PolicyError"],["impl PartialEq<ScriptContextEnum> for ScriptContextEnum"],["impl PartialEq<KeychainKind> for KeychainKind"],["impl PartialEq<FeeRate> for FeeRate"],["impl PartialEq<LocalUtxo> for LocalUtxo"],["impl PartialEq<WeightedUtxo> for WeightedUtxo"],["impl PartialEq<Utxo> for Utxo"],["impl PartialEq<TransactionDetails> for TransactionDetails"],["impl PartialEq<SignerId> for SignerId"],["impl PartialEq<SignerError> for SignerError"],["impl PartialEq<SignerContext> for SignerContext"],["impl PartialEq<SignerOrdering> for SignerOrdering"],["impl PartialEq<TapLeavesOptions> for TapLeavesOptions"],["impl PartialEq<TxOrdering> for TxOrdering"],["impl PartialEq<ChangeSpendPolicy> for ChangeSpendPolicy"],["impl PartialEq<AddressInfo> for AddressInfo"]],
-"bdk_chain":[["impl<P: PartialEq> PartialEq<ChainGraph<P>> for ChainGraph<P>"],["impl<P: PartialEq> PartialEq<ChangeSet<P>> for ChangeSet<P>"],["impl<P: PartialEq> PartialEq<NewError<P>> for NewError<P>"],["impl<P: PartialEq> PartialEq<InsertTxError<P>> for InsertTxError<P>"],["impl<P: PartialEq> PartialEq<UpdateError<P>> for UpdateError<P>"],["impl<P: PartialEq> PartialEq<UnresolvableConflict<P>> for UnresolvableConflict<P>"],["impl PartialEq<TxHeight> for TxHeight"],["impl PartialEq<ConfirmationTime> for ConfirmationTime"],["impl PartialEq<BlockId> for BlockId"],["impl<I: PartialEq> PartialEq<FullTxOut<I>> for FullTxOut<I>"],["impl<K: PartialEq> PartialEq<DerivationAdditions<K>> for DerivationAdditions<K>"],["impl<K: PartialEq, P: PartialEq> PartialEq<KeychainScan<K, P>> for KeychainScan<K, P>"],["impl PartialEq<Balance> for Balance"],["impl<P: PartialEq> PartialEq<SparseChain<P>> for SparseChain<P>"],["impl<P: PartialEq> PartialEq<InsertTxError<P>> for InsertTxError<P>"],["impl PartialEq<InsertCheckpointError> for InsertCheckpointError"],["impl<P: PartialEq> PartialEq<UpdateError<P>> for UpdateError<P>"],["impl<P: PartialEq> PartialEq<ChangeSet<P>> for ChangeSet<P>"],["impl PartialEq<TxGraph> for TxGraph"],["impl PartialEq<Additions> for Additions"]],
+"bdk_chain":[["impl<P: PartialEq> PartialEq<ChainGraph<P>> for ChainGraph<P>"],["impl<P: PartialEq> PartialEq<ChangeSet<P>> for ChangeSet<P>"],["impl<P: PartialEq> PartialEq<NewError<P>> for NewError<P>"],["impl<P: PartialEq> PartialEq<InsertTxError<P>> for InsertTxError<P>"],["impl<P: PartialEq> PartialEq<UpdateError<P>> for UpdateError<P>"],["impl<P: PartialEq> PartialEq<UnresolvableConflict<P>> for UnresolvableConflict<P>"],["impl<A: PartialEq> PartialEq<ObservedAs<A>> for ObservedAs<A>"],["impl PartialEq<TxHeight> for TxHeight"],["impl PartialEq<ConfirmationTime> for ConfirmationTime"],["impl PartialEq<BlockId> for BlockId"],["impl<P: PartialEq> PartialEq<FullTxOut<P>> for FullTxOut<P>"],["impl<A: PartialEq, IA: PartialEq> PartialEq<IndexedAdditions<A, IA>> for IndexedAdditions<A, IA>"],["impl<K: PartialEq> PartialEq<DerivationAdditions<K>> for DerivationAdditions<K>"],["impl<K: PartialEq, P: PartialEq> PartialEq<KeychainScan<K, P>> for KeychainScan<K, P>"],["impl PartialEq<Balance> for Balance"],["impl PartialEq<LocalChain> for LocalChain"],["impl PartialEq<UpdateNotConnectedError> for UpdateNotConnectedError"],["impl<P: PartialEq> PartialEq<SparseChain<P>> for SparseChain<P>"],["impl<P: PartialEq> PartialEq<InsertTxError<P>> for InsertTxError<P>"],["impl PartialEq<InsertCheckpointError> for InsertCheckpointError"],["impl<P: PartialEq> PartialEq<UpdateError<P>> for UpdateError<P>"],["impl<P: PartialEq> PartialEq<ChangeSet<P>> for ChangeSet<P>"],["impl<A: PartialEq> PartialEq<TxGraph<A>> for TxGraph<A>"],["impl<'a, T: PartialEq, A: PartialEq> PartialEq<TxNode<'a, T, A>> for TxNode<'a, T, A>"],["impl<'a, T: PartialEq, A: PartialEq> PartialEq<CanonicalTx<'a, T, A>> for CanonicalTx<'a, T, A>"],["impl<A: PartialEq> PartialEq<Additions<A>> for Additions<A>"]],
"bdk_coin_select":[["impl PartialEq<SelectionConstraint> for SelectionConstraint"],["impl PartialEq<ExcessStrategyKind> for ExcessStrategyKind"]],
"keychain_tracker_electrum_example":[["impl PartialEq<ScanOptions> for ScanOptions"]],
"keychain_tracker_esplora_example":[["impl PartialEq<ScanOptions> for ScanOptions"]],
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialOrd.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialOrd.js
index 7fc8d3fdde..553ddb48c7 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialOrd.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialOrd.js
@@ -1,6 +1,6 @@
(function() {var implementors = {
"bdk":[["impl PartialOrd<Condition> for Condition"],["impl PartialOrd<KeychainKind> for KeychainKind"],["impl PartialOrd<FeeRate> for FeeRate"],["impl PartialOrd<TransactionDetails> for TransactionDetails"],["impl PartialOrd<SignerId> for SignerId"],["impl PartialOrd<SignerOrdering> for SignerOrdering"],["impl PartialOrd<TxOrdering> for TxOrdering"],["impl PartialOrd<ChangeSpendPolicy> for ChangeSpendPolicy"]],
-"bdk_chain":[["impl PartialOrd<TxHeight> for TxHeight"],["impl PartialOrd<ConfirmationTime> for ConfirmationTime"],["impl PartialOrd<BlockId> for BlockId"]],
+"bdk_chain":[["impl<A: PartialOrd> PartialOrd<ObservedAs<A>> for ObservedAs<A>"],["impl PartialOrd<TxHeight> for TxHeight"],["impl PartialOrd<ConfirmationTime> for ConfirmationTime"],["impl PartialOrd<BlockId> for BlockId"],["impl<P: PartialOrd> PartialOrd<FullTxOut<P>> for FullTxOut<P>"],["impl PartialOrd<LocalChain> for LocalChain"],["impl<'a, T: PartialOrd, A: PartialOrd> PartialOrd<TxNode<'a, T, A>> for TxNode<'a, T, A>"],["impl<'a, T: PartialOrd, A: PartialOrd> PartialOrd<CanonicalTx<'a, T, A>> for CanonicalTx<'a, T, A>"]],
"bdk_coin_select":[["impl PartialOrd<ExcessStrategyKind> for ExcessStrategyKind"]],
"keychain_tracker_example_cli":[["impl PartialOrd<Keychain> for Keychain"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.AsRef.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.AsRef.js
index 78f9f3865e..bb39e80e78 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.AsRef.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.AsRef.js
@@ -1,5 +1,5 @@
(function() {var implementors = {
-"bdk":[["impl AsRef<[u8]> for KeychainKind"],["impl<D> AsRef<TxGraph> for Wallet<D>"],["impl<D> AsRef<ChainGraph<ConfirmationTime>> for Wallet<D>"]],
-"bdk_chain":[["impl<P> AsRef<SparseChain<P>> for ChainGraph<P>"],["impl<P> AsRef<TxGraph> for ChainGraph<P>"],["impl<P> AsRef<ChainGraph<P>> for ChainGraph<P>"],["impl<K, P> AsRef<SparseChain<P>> for KeychainTracker<K, P>"],["impl<K, P> AsRef<TxGraph> for KeychainTracker<K, P>"],["impl<K, P> AsRef<ChainGraph<P>> for KeychainTracker<K, P>"],["impl<K> AsRef<BTreeMap<K, u32, Global>> for DerivationAdditions<K>"],["impl<K, P> AsRef<TxGraph> for KeychainScan<K, P>"],["impl<P> AsRef<SparseChain<P>> for SparseChain<P>"],["impl AsRef<TxGraph> for TxGraph"]],
+"bdk":[["impl AsRef<[u8]> for KeychainKind"],["impl<D> AsRef<TxGraph<()>> for Wallet<D>"],["impl<D> AsRef<ChainGraph<ConfirmationTime>> for Wallet<D>"]],
+"bdk_chain":[["impl<P> AsRef<SparseChain<P>> for ChainGraph<P>"],["impl<P> AsRef<TxGraph<()>> for ChainGraph<P>"],["impl<P> AsRef<ChainGraph<P>> for ChainGraph<P>"],["impl<K, P> AsRef<SparseChain<P>> for KeychainTracker<K, P>"],["impl<K, P> AsRef<TxGraph<()>> for KeychainTracker<K, P>"],["impl<K, P> AsRef<ChainGraph<P>> for KeychainTracker<K, P>"],["impl<K> AsRef<BTreeMap<K, u32, Global>> for DerivationAdditions<K>"],["impl<K, P> AsRef<TxGraph<()>> for KeychainScan<K, P>"],["impl AsRef<BTreeMap<u32, BlockHash, Global>> for LocalChain"],["impl<P> AsRef<SparseChain<P>> for SparseChain<P>"],["impl<A> AsRef<TxGraph<A>> for TxGraph<A>"]],
"bdk_electrum":[["impl<K, P> AsRef<SparseChain<P>> for ElectrumUpdate<K, P>"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.From.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.From.js
index f23f8bb67b..ec4cad3d8a 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.From.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.From.js
@@ -1,6 +1,6 @@
(function() {var implementors = {
"bdk":[["impl From<Error> for Error"],["impl From<PolicyError> for Error"],["impl From<SignerError> for Error"],["impl From<KeyError> for Error"],["impl From<Error> for Error"],["impl From<Error> for Error"],["impl From<Error> for Error"],["impl From<KeyError> for Error"],["impl From<Error> for Error"],["impl From<Error> for Error"],["impl From<Error> for Error"],["impl From<Error> for Error"],["impl From<Error> for Error"],["impl From<PolicyError> for Error"],["impl From<bool> for Satisfaction"],["impl From<SatisfiableItem> for Policy"],["impl<Ctx: ScriptContext> From<ExtendedPubKey> for ExtendedKey<Ctx>"],["impl<Ctx: ScriptContext> From<ExtendedPrivKey> for ExtendedKey<Ctx>"],["impl From<Error> for KeyError"],["impl From<Error> for KeyError"],["impl From<Hash> for SignerId"],["impl From<Fingerprint> for SignerId"],["impl From<Error> for SignerError"]],
-"bdk_chain":[["impl<P> From<InsertTxError<P>> for InsertTxError<P>"],["impl<P> From<UpdateError<P>> for UpdateError<P>"],["impl<P> From<UnresolvableConflict<P>> for UpdateError<P>"],["impl<P> From<UnresolvableConflict<P>> for InsertTxError<P>"],["impl From<Option<u32>> for TxHeight"],["impl From<TxHeight> for Option<u32>"],["impl From<(u32, BlockHash)> for BlockId"],["impl From<BlockId> for (u32, BlockHash)"],["impl From<(&u32, &BlockHash)> for BlockId"],["impl<K, P> From<ChainGraph<P>> for KeychainScan<K, P>"],["impl<K, P> From<ChangeSet<P>> for KeychainChangeSet<K, P>"],["impl<K, P> From<DerivationAdditions<K>> for KeychainChangeSet<K, P>"]],
+"bdk_chain":[["impl<P> From<InsertTxError<P>> for InsertTxError<P>"],["impl<P> From<UpdateError<P>> for UpdateError<P>"],["impl<P> From<UnresolvableConflict<P>> for UpdateError<P>"],["impl<P> From<UnresolvableConflict<P>> for InsertTxError<P>"],["impl From<Option<u32>> for TxHeight"],["impl From<TxHeight> for Option<u32>"],["impl From<(u32, BlockHash)> for BlockId"],["impl From<BlockId> for (u32, BlockHash)"],["impl From<(&u32, &BlockHash)> for BlockId"],["impl<K, P> From<ChainGraph<P>> for KeychainScan<K, P>"],["impl<K, P> From<ChangeSet<P>> for KeychainChangeSet<K, P>"],["impl<K, P> From<DerivationAdditions<K>> for KeychainChangeSet<K, P>"],["impl From<LocalChain> for BTreeMap<u32, BlockHash>"],["impl From<BTreeMap<u32, BlockHash, Global>> for LocalChain"]],
"bdk_coin_select":[["impl From<usize> for BnbLimit"],["impl From<Duration> for BnbLimit"]],
"bdk_file_store":[["impl From<Error> for FileError"],["impl From<Error> for IterError"]],
"bdk_tmp_plan":[["impl From<Error> for SigningError"],["impl From<Error> for SigningError"]]
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/default/trait.Default.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/default/trait.Default.js
index c334df796e..79b6bbd4aa 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/default/trait.Default.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/default/trait.Default.js
@@ -1,6 +1,6 @@
(function() {var implementors = {
"bdk":[["impl Default for Condition"],["impl Default for PrivateKeyGenerateOptions"],["impl Default for FeeRate"],["impl Default for LargestFirstCoinSelection"],["impl Default for OldestFirstCoinSelection"],["impl Default for BranchAndBoundCoinSelection"],["impl Default for SignerOrdering"],["impl Default for SignersContainer"],["impl Default for TapLeavesOptions"],["impl Default for SignOptions"],["impl Default for CreateTx"],["impl Default for BumpFee"],["impl Default for TxOrdering"],["impl Default for ChangeSpendPolicy"]],
-"bdk_chain":[["impl<P> Default for ChainGraph<P>"],["impl<P> Default for ChangeSet<P>"],["impl<I> Default for SpkTxOutIndex<I>"],["impl Default for TxHeight"],["impl Default for BlockId"],["impl<K, P> Default for KeychainTracker<K, P>"],["impl<K> Default for KeychainTxOutIndex<K>"],["impl<K> Default for DerivationAdditions<K>"],["impl<K, P> Default for KeychainScan<K, P>"],["impl<K, P> Default for KeychainChangeSet<K, P>"],["impl Default for Balance"],["impl<P> Default for SparseChain<P>"],["impl<I> Default for ChangeSet<I>"],["impl Default for TxGraph"],["impl Default for Additions"]],
+"bdk_chain":[["impl<P> Default for ChainGraph<P>"],["impl<P> Default for ChangeSet<P>"],["impl<I> Default for SpkTxOutIndex<I>"],["impl Default for TxHeight"],["impl Default for BlockId"],["impl<A, I: Default> Default for IndexedTxGraph<A, I>"],["impl<A, IA: Default> Default for IndexedAdditions<A, IA>"],["impl<K, P> Default for KeychainTracker<K, P>"],["impl<K> Default for KeychainTxOutIndex<K>"],["impl<K> Default for DerivationAdditions<K>"],["impl<K, P> Default for KeychainScan<K, P>"],["impl<K, P> Default for KeychainChangeSet<K, P>"],["impl Default for Balance"],["impl Default for LocalChain"],["impl<P> Default for SparseChain<P>"],["impl<I> Default for ChangeSet<I>"],["impl<A> Default for TxGraph<A>"],["impl<A> Default for Additions<A>"]],
"bdk_electrum":[["impl<K, P> Default for ElectrumUpdate<K, P>"]],
"bdk_tmp_plan":[["impl<Ak> Default for RequiredSignatures<Ak>"],["impl<Ak> Default for Requirements<Ak>"],["impl Default for SatisfactionMaterial"],["impl<K> Default for Assets<K>"]],
"keychain_tracker_example_cli":[["impl Default for CoinSelectionAlgo"]]
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/error/trait.Error.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/error/trait.Error.js
index 8d4e9585db..f2a82b9f7f 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/error/trait.Error.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/error/trait.Error.js
@@ -1,6 +1,6 @@
(function() {var implementors = {
"bdk":[["impl Error for Error"],["impl Error for Error"],["impl Error for PolicyError"],["impl Error for KeyError"],["impl Error for SignerError"],["impl<P: Display + Debug> Error for NewError<P>"]],
-"bdk_chain":[["impl<P: Debug> Error for NewError<P>"],["impl<P: Debug> Error for InsertTxError<P>"],["impl<P: Debug> Error for UpdateError<P>"],["impl<P: Debug> Error for UnresolvableConflict<P>"],["impl<P: Debug> Error for InsertTxError<P>"],["impl Error for InsertCheckpointError"],["impl<P: Debug> Error for UpdateError<P>"]],
+"bdk_chain":[["impl<P: Debug> Error for NewError<P>"],["impl<P: Debug> Error for InsertTxError<P>"],["impl<P: Debug> Error for UpdateError<P>"],["impl<P: Debug> Error for UnresolvableConflict<P>"],["impl Error for UpdateNotConnectedError"],["impl<P: Debug> Error for InsertTxError<P>"],["impl Error for InsertCheckpointError"],["impl<P: Debug> Error for UpdateError<P>"]],
"bdk_coin_select":[["impl Error for SelectionError"]],
"bdk_file_store":[["impl Error for FileError"],["impl Error for IterError"]],
"bdk_tmp_plan":[["impl Error for SigningError"]]
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Debug.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Debug.js
index 4661e89a13..0282e86883 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Debug.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Debug.js
@@ -1,6 +1,6 @@
(function() {var implementors = {
"bdk":[["impl Debug for Error"],["impl Debug for Error"],["impl Debug for PkOrF"],["impl Debug for SatisfiableItem"],["impl Debug for Satisfaction"],["impl Debug for Policy"],["impl Debug for Condition"],["impl Debug for PolicyError"],["impl<'a> Debug for BuildSatisfaction<'a>"],["impl<Ctx: Debug + ScriptContext> Debug for DescriptorKey<Ctx>"],["impl Debug for ScriptContextEnum"],["impl Debug for PrivateKeyGenerateOptions"],["impl Debug for KeyError"],["impl Debug for KeychainKind"],["impl Debug for FeeRate"],["impl Debug for LocalUtxo"],["impl Debug for WeightedUtxo"],["impl Debug for Utxo"],["impl Debug for TransactionDetails"],["impl Debug for Excess"],["impl Debug for CoinSelectionResult"],["impl Debug for LargestFirstCoinSelection"],["impl Debug for OldestFirstCoinSelection"],["impl Debug for BranchAndBoundCoinSelection"],["impl Debug for FullyNodedExport"],["impl Debug for SignerId"],["impl Debug for SignerError"],["impl Debug for SignerContext"],["impl<S: Debug + Sized + Debug + Clone> Debug for SignerWrapper<S>"],["impl Debug for SignerOrdering"],["impl Debug for SignersContainer"],["impl Debug for SignOptions"],["impl Debug for TapLeavesOptions"],["impl Debug for CreateTx"],["impl Debug for BumpFee"],["impl<'a, D: Debug, Cs: Debug, Ctx: Debug> Debug for TxBuilder<'a, D, Cs, Ctx>"],["impl Debug for TxOrdering"],["impl Debug for ChangeSpendPolicy"],["impl<D: Debug> Debug for Wallet<D>"],["impl Debug for AddressIndex"],["impl Debug for AddressInfo"],["impl<P: Debug> Debug for NewError<P>"]],
-"bdk_chain":[["impl<P: Debug> Debug for ChainGraph<P>"],["impl<P: Debug> Debug for ChangeSet<P>"],["impl<P: Debug> Debug for NewError<P>"],["impl<P: Debug> Debug for InsertTxError<P>"],["impl<P: Debug> Debug for UpdateError<P>"],["impl<P: Debug> Debug for UnresolvableConflict<P>"],["impl<I: Debug> Debug for SpkTxOutIndex<I>"],["impl Debug for TxHeight"],["impl Debug for ConfirmationTime"],["impl Debug for BlockId"],["impl<I: Debug> Debug for FullTxOut<I>"],["impl<K: Debug, P: Debug, B: Debug> Debug for Persist<K, P, B>"],["impl<K: Debug, P: Debug> Debug for KeychainTracker<K, P>"],["impl<K: Debug> Debug for KeychainTxOutIndex<K>"],["impl<K: Debug> Debug for DerivationAdditions<K>"],["impl<K: Debug, P: Debug> Debug for KeychainScan<K, P>"],["impl<K: Debug, P: Debug> Debug for KeychainChangeSet<K, P>"],["impl Debug for Balance"],["impl<P: Debug> Debug for SparseChain<P>"],["impl<P: Debug> Debug for InsertTxError<P>"],["impl Debug for InsertCheckpointError"],["impl<P: Debug> Debug for UpdateError<P>"],["impl<P: Debug> Debug for ChangeSet<P>"],["impl Debug for TxGraph"],["impl Debug for Additions"]],
+"bdk_chain":[["impl<P: Debug> Debug for ChainGraph<P>"],["impl<P: Debug> Debug for ChangeSet<P>"],["impl<P: Debug> Debug for NewError<P>"],["impl<P: Debug> Debug for InsertTxError<P>"],["impl<P: Debug> Debug for UpdateError<P>"],["impl<P: Debug> Debug for UnresolvableConflict<P>"],["impl<I: Debug> Debug for SpkTxOutIndex<I>"],["impl<A: Debug> Debug for ObservedAs<A>"],["impl Debug for TxHeight"],["impl Debug for ConfirmationTime"],["impl Debug for BlockId"],["impl<P: Debug> Debug for FullTxOut<P>"],["impl<A: Debug, IA: Debug> Debug for IndexedAdditions<A, IA>"],["impl<K: Debug, P: Debug, B: Debug> Debug for Persist<K, P, B>"],["impl<K: Debug, P: Debug> Debug for KeychainTracker<K, P>"],["impl<K: Debug> Debug for KeychainTxOutIndex<K>"],["impl<K: Debug> Debug for DerivationAdditions<K>"],["impl<K: Debug, P: Debug> Debug for KeychainScan<K, P>"],["impl<K: Debug, P: Debug> Debug for KeychainChangeSet<K, P>"],["impl Debug for Balance"],["impl Debug for LocalChain"],["impl Debug for UpdateNotConnectedError"],["impl<P: Debug> Debug for SparseChain<P>"],["impl<P: Debug> Debug for InsertTxError<P>"],["impl Debug for InsertCheckpointError"],["impl<P: Debug> Debug for UpdateError<P>"],["impl<P: Debug> Debug for ChangeSet<P>"],["impl<A: Debug> Debug for TxGraph<A>"],["impl<'a, T: Debug, A: Debug> Debug for TxNode<'a, T, A>"],["impl<'a, T: Debug, A: Debug> Debug for CanonicalTx<'a, T, A>"],["impl<A: Debug> Debug for Additions<A>"]],
"bdk_coin_select":[["impl Debug for WeightedValue"],["impl Debug for CoinSelectorOpt"],["impl<'a> Debug for CoinSelector<'a>"],["impl Debug for SelectionError"],["impl Debug for SelectionConstraint"],["impl Debug for Selection"],["impl Debug for ExcessStrategyKind"],["impl Debug for ExcessStrategy"]],
"bdk_file_store":[["impl<K: Debug, P: Debug> Debug for KeychainStore<K, P>"],["impl Debug for FileError"],["impl Debug for IterError"]],
"bdk_tmp_plan":[["impl<Ak: Debug> Debug for Requirements<Ak>"],["impl<Ak: Debug> Debug for RequiredSignatures<Ak>"],["impl Debug for SigningError"],["impl<Ak: Debug> Debug for PlanKey<Ak>"],["impl<AK: Debug> Debug for Plan<AK>"],["impl Debug for SatisfactionMaterial"],["impl<K: Debug> Debug for Assets<K>"]],
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Display.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Display.js
index 63778fe478..ae2cd5f1b0 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Display.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Display.js
@@ -1,6 +1,6 @@
(function() {var implementors = {
"bdk":[["impl Display for Error"],["impl Display for Error"],["impl Display for PolicyError"],["impl Display for KeyError"],["impl Display for SignerError"],["impl Display for AddressInfo"],["impl<P> Display for NewError<P>where
P: Display,"]],
-"bdk_chain":[["impl<P: Debug> Display for NewError<P>"],["impl<P: Debug> Display for InsertTxError<P>"],["impl<P: Debug> Display for UpdateError<P>"],["impl<P: Debug> Display for UnresolvableConflict<P>"],["impl Display for TxHeight"],["impl Display for Balance"],["impl<P: Debug> Display for InsertTxError<P>"],["impl Display for InsertCheckpointError"],["impl<P: Debug> Display for UpdateError<P>"]],
+"bdk_chain":[["impl<P: Debug> Display for NewError<P>"],["impl<P: Debug> Display for InsertTxError<P>"],["impl<P: Debug> Display for UpdateError<P>"],["impl<P: Debug> Display for UnresolvableConflict<P>"],["impl Display for TxHeight"],["impl Display for Balance"],["impl Display for UpdateNotConnectedError"],["impl<P: Debug> Display for InsertTxError<P>"],["impl Display for InsertCheckpointError"],["impl<P: Debug> Display for UpdateError<P>"]],
"bdk_coin_select":[["impl Display for SelectionError"],["impl Display for SelectionConstraint"],["impl Display for ExcessStrategyKind"]],
"bdk_file_store":[["impl Display for FileError"],["impl Display for IterError"]],
"bdk_tmp_plan":[["impl Display for SigningError"]],
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/hash/trait.Hash.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/hash/trait.Hash.js
index c7d299a200..f749ecd595 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/hash/trait.Hash.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/hash/trait.Hash.js
@@ -1,5 +1,5 @@
(function() {var implementors = {
"bdk":[["impl Hash for PkOrF"],["impl Hash for Condition"],["impl Hash for KeychainKind"],["impl Hash for LocalUtxo"],["impl Hash for SignerId"],["impl Hash for TxOrdering"],["impl Hash for ChangeSpendPolicy"]],
-"bdk_chain":[["impl Hash for TxHeight"],["impl Hash for ConfirmationTime"]],
+"bdk_chain":[["impl<A: Hash> Hash for ObservedAs<A>"],["impl Hash for TxHeight"],["impl Hash for ConfirmationTime"],["impl Hash for BlockId"]],
"bdk_coin_select":[["impl Hash for ExcessStrategyKind"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/iter/traits/iterator/trait.Iterator.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/iter/traits/iterator/trait.Iterator.js
index 37c6281a6a..096f588444 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/iter/traits/iterator/trait.Iterator.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/iter/traits/iterator/trait.Iterator.js
@@ -1,5 +1,5 @@
(function() {var implementors = {
-"bdk_chain":[["impl<'g, F, O> Iterator for TxDescendants<'g, F>where
F: FnMut(usize, Txid) -> Option<O>,"]],
+"bdk_chain":[["impl<'g, A, F, O> Iterator for TxDescendants<'g, A, F>where
F: FnMut(usize, Txid) -> Option<O>,"]],
"bdk_coin_select":[["impl<'c, 'f, S: Ord + Copy + Display> Iterator for BnbIter<'c, 'f, S>"]],
"bdk_file_store":[["impl<'a, V> Iterator for EntryIter<'a, V>where
V: DeserializeOwned,"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Copy.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Copy.js
index b6e1c862ef..26d542e1cc 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Copy.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Copy.js
@@ -1,6 +1,6 @@
(function() {var implementors = {
"bdk":[["impl Copy for Condition"],["impl<'a> Copy for BuildSatisfaction<'a>"],["impl Copy for ScriptContextEnum"],["impl Copy for PrivateKeyGenerateOptions"],["impl Copy for KeychainKind"],["impl Copy for FeeRate"],["impl Copy for LargestFirstCoinSelection"],["impl Copy for OldestFirstCoinSelection"],["impl Copy for SignerContext"],["impl Copy for TxOrdering"],["impl Copy for ChangeSpendPolicy"]],
-"bdk_chain":[["impl Copy for TxHeight"],["impl Copy for ConfirmationTime"],["impl Copy for BlockId"]],
+"bdk_chain":[["impl<A: Copy> Copy for ObservedAs<A>"],["impl Copy for TxHeight"],["impl Copy for ConfirmationTime"],["impl Copy for BlockId"]],
"bdk_coin_select":[["impl Copy for WeightedValue"],["impl Copy for CoinSelectorOpt"],["impl Copy for SelectionConstraint"],["impl Copy for ExcessStrategyKind"],["impl Copy for ExcessStrategy"]],
"keychain_tracker_example_cli":[["impl Copy for Keychain"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Freeze.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Freeze.js
index e59134cc76..e1fafd00e6 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Freeze.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Freeze.js
@@ -1,6 +1,6 @@
(function() {var implementors = {
"bdk":[["impl Freeze for Error",1,["bdk::error::Error"]],["impl Freeze for Error",1,["bdk::descriptor::error::Error"]],["impl Freeze for PkOrF",1,["bdk::descriptor::policy::PkOrF"]],["impl Freeze for SatisfiableItem",1,["bdk::descriptor::policy::SatisfiableItem"]],["impl Freeze for Satisfaction",1,["bdk::descriptor::policy::Satisfaction"]],["impl Freeze for Policy",1,["bdk::descriptor::policy::Policy"]],["impl Freeze for Condition",1,["bdk::descriptor::policy::Condition"]],["impl Freeze for PolicyError",1,["bdk::descriptor::policy::PolicyError"]],["impl<'a> Freeze for BuildSatisfaction<'a>",1,["bdk::descriptor::policy::BuildSatisfaction"]],["impl<K> Freeze for P2Pkh<K>where
K: Freeze,",1,["bdk::descriptor::template::P2Pkh"]],["impl<K> Freeze for P2Wpkh_P2Sh<K>where
K: Freeze,",1,["bdk::descriptor::template::P2Wpkh_P2Sh"]],["impl<K> Freeze for P2Wpkh<K>where
K: Freeze,",1,["bdk::descriptor::template::P2Wpkh"]],["impl<K> Freeze for Bip44<K>where
K: Freeze,",1,["bdk::descriptor::template::Bip44"]],["impl<K> Freeze for Bip44Public<K>where
K: Freeze,",1,["bdk::descriptor::template::Bip44Public"]],["impl<K> Freeze for Bip49<K>where
K: Freeze,",1,["bdk::descriptor::template::Bip49"]],["impl<K> Freeze for Bip49Public<K>where
K: Freeze,",1,["bdk::descriptor::template::Bip49Public"]],["impl<K> Freeze for Bip84<K>where
K: Freeze,",1,["bdk::descriptor::template::Bip84"]],["impl<K> Freeze for Bip84Public<K>where
K: Freeze,",1,["bdk::descriptor::template::Bip84Public"]],["impl<Ctx> Freeze for DescriptorKey<Ctx>",1,["bdk::keys::DescriptorKey"]],["impl Freeze for ScriptContextEnum",1,["bdk::keys::ScriptContextEnum"]],["impl<Ctx> Freeze for ExtendedKey<Ctx>",1,["bdk::keys::ExtendedKey"]],["impl<K, Ctx> Freeze for GeneratedKey<K, Ctx>where
K: Freeze,",1,["bdk::keys::GeneratedKey"]],["impl Freeze for PrivateKeyGenerateOptions",1,["bdk::keys::PrivateKeyGenerateOptions"]],["impl Freeze for KeyError",1,["bdk::keys::KeyError"]],["impl Freeze for KeychainKind",1,["bdk::types::KeychainKind"]],["impl Freeze for FeeRate",1,["bdk::types::FeeRate"]],["impl Freeze for LocalUtxo",1,["bdk::types::LocalUtxo"]],["impl Freeze for WeightedUtxo",1,["bdk::types::WeightedUtxo"]],["impl Freeze for Utxo",1,["bdk::types::Utxo"]],["impl Freeze for TransactionDetails",1,["bdk::types::TransactionDetails"]],["impl Freeze for Excess",1,["bdk::wallet::coin_selection::Excess"]],["impl Freeze for CoinSelectionResult",1,["bdk::wallet::coin_selection::CoinSelectionResult"]],["impl Freeze for LargestFirstCoinSelection",1,["bdk::wallet::coin_selection::LargestFirstCoinSelection"]],["impl Freeze for OldestFirstCoinSelection",1,["bdk::wallet::coin_selection::OldestFirstCoinSelection"]],["impl Freeze for BranchAndBoundCoinSelection",1,["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]],["impl Freeze for FullyNodedExport",1,["bdk::wallet::export::FullyNodedExport"]],["impl Freeze for SignerId",1,["bdk::wallet::signer::SignerId"]],["impl Freeze for SignerError",1,["bdk::wallet::signer::SignerError"]],["impl Freeze for SignerContext",1,["bdk::wallet::signer::SignerContext"]],["impl<S> Freeze for SignerWrapper<S>where
S: Freeze,",1,["bdk::wallet::signer::SignerWrapper"]],["impl Freeze for SignerOrdering",1,["bdk::wallet::signer::SignerOrdering"]],["impl Freeze for SignersContainer",1,["bdk::wallet::signer::SignersContainer"]],["impl Freeze for SignOptions",1,["bdk::wallet::signer::SignOptions"]],["impl Freeze for TapLeavesOptions",1,["bdk::wallet::signer::TapLeavesOptions"]],["impl Freeze for CreateTx",1,["bdk::wallet::tx_builder::CreateTx"]],["impl Freeze for BumpFee",1,["bdk::wallet::tx_builder::BumpFee"]],["impl<'a, D, Cs, Ctx> Freeze for TxBuilder<'a, D, Cs, Ctx>where
Cs: Freeze,",1,["bdk::wallet::tx_builder::TxBuilder"]],["impl Freeze for TxOrdering",1,["bdk::wallet::tx_builder::TxOrdering"]],["impl Freeze for ChangeSpendPolicy",1,["bdk::wallet::tx_builder::ChangeSpendPolicy"]],["impl<D> Freeze for Wallet<D>where
D: Freeze,",1,["bdk::wallet::Wallet"]],["impl Freeze for AddressIndex",1,["bdk::wallet::AddressIndex"]],["impl Freeze for AddressInfo",1,["bdk::wallet::AddressInfo"]],["impl<P> Freeze for NewError<P>where
P: Freeze,",1,["bdk::wallet::NewError"]]],
-"bdk_chain":[["impl<P> Freeze for ChainGraph<P>",1,["bdk_chain::chain_graph::ChainGraph"]],["impl<P> Freeze for ChangeSet<P>",1,["bdk_chain::chain_graph::ChangeSet"]],["impl<P> Freeze for NewError<P>where
P: Freeze,",1,["bdk_chain::chain_graph::NewError"]],["impl<P> Freeze for InsertTxError<P>where
P: Freeze,",1,["bdk_chain::chain_graph::InsertTxError"]],["impl<P> Freeze for UpdateError<P>where
P: Freeze,",1,["bdk_chain::chain_graph::UpdateError"]],["impl<P> Freeze for UnresolvableConflict<P>where
P: Freeze,",1,["bdk_chain::chain_graph::UnresolvableConflict"]],["impl<I> Freeze for SpkTxOutIndex<I>",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl Freeze for TxHeight",1,["bdk_chain::chain_data::TxHeight"]],["impl Freeze for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Freeze for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl<I> Freeze for FullTxOut<I>where
I: Freeze,",1,["bdk_chain::chain_data::FullTxOut"]],["impl<K, P, B> Freeze for Persist<K, P, B>where
B: Freeze,",1,["bdk_chain::keychain::persist::Persist"]],["impl<K, P> Freeze for KeychainTracker<K, P>",1,["bdk_chain::keychain::tracker::KeychainTracker"]],["impl<K> Freeze for KeychainTxOutIndex<K>",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> Freeze for DerivationAdditions<K>",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, P> Freeze for KeychainScan<K, P>",1,["bdk_chain::keychain::KeychainScan"]],["impl<K, P> Freeze for KeychainChangeSet<K, P>",1,["bdk_chain::keychain::KeychainChangeSet"]],["impl Freeze for Balance",1,["bdk_chain::keychain::Balance"]],["impl<P> Freeze for SparseChain<P>",1,["bdk_chain::sparse_chain::SparseChain"]],["impl<P> Freeze for InsertTxError<P>where
P: Freeze,",1,["bdk_chain::sparse_chain::InsertTxError"]],["impl Freeze for InsertCheckpointError",1,["bdk_chain::sparse_chain::InsertCheckpointError"]],["impl<P> Freeze for UpdateError<P>where
P: Freeze,",1,["bdk_chain::sparse_chain::UpdateError"]],["impl<P> Freeze for ChangeSet<P>",1,["bdk_chain::sparse_chain::ChangeSet"]],["impl Freeze for TxGraph",1,["bdk_chain::tx_graph::TxGraph"]],["impl Freeze for Additions",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, F> Freeze for TxDescendants<'g, F>where
F: Freeze,",1,["bdk_chain::tx_graph::TxDescendants"]]],
+"bdk_chain":[["impl<P> Freeze for ChainGraph<P>",1,["bdk_chain::chain_graph::ChainGraph"]],["impl<P> Freeze for ChangeSet<P>",1,["bdk_chain::chain_graph::ChangeSet"]],["impl<P> Freeze for NewError<P>where
P: Freeze,",1,["bdk_chain::chain_graph::NewError"]],["impl<P> Freeze for InsertTxError<P>where
P: Freeze,",1,["bdk_chain::chain_graph::InsertTxError"]],["impl<P> Freeze for UpdateError<P>where
P: Freeze,",1,["bdk_chain::chain_graph::UpdateError"]],["impl<P> Freeze for UnresolvableConflict<P>where
P: Freeze,",1,["bdk_chain::chain_graph::UnresolvableConflict"]],["impl<I> Freeze for SpkTxOutIndex<I>",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<A> Freeze for ObservedAs<A>where
A: Freeze,",1,["bdk_chain::chain_data::ObservedAs"]],["impl Freeze for TxHeight",1,["bdk_chain::chain_data::TxHeight"]],["impl Freeze for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Freeze for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl<P> Freeze for FullTxOut<P>where
P: Freeze,",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A, I> Freeze for IndexedTxGraph<A, I>where
I: Freeze,",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> Freeze for IndexedAdditions<A, IA>where
IA: Freeze,",1,["bdk_chain::indexed_tx_graph::IndexedAdditions"]],["impl<K, P, B> Freeze for Persist<K, P, B>where
B: Freeze,",1,["bdk_chain::keychain::persist::Persist"]],["impl<K, P> Freeze for KeychainTracker<K, P>",1,["bdk_chain::keychain::tracker::KeychainTracker"]],["impl<K> Freeze for KeychainTxOutIndex<K>",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> Freeze for DerivationAdditions<K>",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, P> Freeze for KeychainScan<K, P>",1,["bdk_chain::keychain::KeychainScan"]],["impl<K, P> Freeze for KeychainChangeSet<K, P>",1,["bdk_chain::keychain::KeychainChangeSet"]],["impl Freeze for Balance",1,["bdk_chain::keychain::Balance"]],["impl Freeze for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl Freeze for UpdateNotConnectedError",1,["bdk_chain::local_chain::UpdateNotConnectedError"]],["impl<P> Freeze for SparseChain<P>",1,["bdk_chain::sparse_chain::SparseChain"]],["impl<P> Freeze for InsertTxError<P>where
P: Freeze,",1,["bdk_chain::sparse_chain::InsertTxError"]],["impl Freeze for InsertCheckpointError",1,["bdk_chain::sparse_chain::InsertCheckpointError"]],["impl<P> Freeze for UpdateError<P>where
P: Freeze,",1,["bdk_chain::sparse_chain::UpdateError"]],["impl<P> Freeze for ChangeSet<P>",1,["bdk_chain::sparse_chain::ChangeSet"]],["impl<A> Freeze for TxGraph<A>",1,["bdk_chain::tx_graph::TxGraph"]],["impl<'a, T, A> Freeze for TxNode<'a, T, A>",1,["bdk_chain::tx_graph::TxNode"]],["impl<'a, T, A> Freeze for CanonicalTx<'a, T, A>",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<A> Freeze for Additions<A>",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, A, F> Freeze for TxDescendants<'g, A, F>where
F: Freeze,",1,["bdk_chain::tx_graph::TxDescendants"]]],
"bdk_coin_select":[["impl Freeze for WeightedValue",1,["bdk_coin_select::coin_selector::WeightedValue"]],["impl Freeze for CoinSelectorOpt",1,["bdk_coin_select::coin_selector::CoinSelectorOpt"]],["impl<'a> Freeze for CoinSelector<'a>",1,["bdk_coin_select::coin_selector::CoinSelector"]],["impl Freeze for SelectionError",1,["bdk_coin_select::coin_selector::SelectionError"]],["impl Freeze for SelectionConstraint",1,["bdk_coin_select::coin_selector::SelectionConstraint"]],["impl Freeze for Selection",1,["bdk_coin_select::coin_selector::Selection"]],["impl Freeze for ExcessStrategyKind",1,["bdk_coin_select::coin_selector::ExcessStrategyKind"]],["impl Freeze for ExcessStrategy",1,["bdk_coin_select::coin_selector::ExcessStrategy"]],["impl Freeze for BranchStrategy",1,["bdk_coin_select::bnb::BranchStrategy"]],["impl<'c, S> Freeze for Bnb<'c, S>where
S: Freeze,",1,["bdk_coin_select::bnb::Bnb"]],["impl<'c, 'f, S> Freeze for BnbIter<'c, 'f, S>where
S: Freeze,",1,["bdk_coin_select::bnb::BnbIter"]],["impl Freeze for BnbLimit",1,["bdk_coin_select::bnb::BnbLimit"]]],
"bdk_electrum":[["impl<K, P> Freeze for ElectrumUpdate<K, P>",1,["bdk_electrum::ElectrumUpdate"]]],
"bdk_file_store":[["impl<K, P> Freeze for KeychainStore<K, P>",1,["bdk_file_store::file_store::KeychainStore"]],["impl Freeze for FileError",1,["bdk_file_store::file_store::FileError"]],["impl Freeze for IterError",1,["bdk_file_store::file_store::IterError"]],["impl<'a, V> Freeze for EntryIter<'a, V>",1,["bdk_file_store::file_store::EntryIter"]]],
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Send.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Send.js
index fa6dd93999..c74282df49 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Send.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Send.js
@@ -1,6 +1,6 @@
(function() {var implementors = {
"bdk":[["impl Send for Error",1,["bdk::error::Error"]],["impl Send for Error",1,["bdk::descriptor::error::Error"]],["impl Send for PkOrF",1,["bdk::descriptor::policy::PkOrF"]],["impl Send for SatisfiableItem",1,["bdk::descriptor::policy::SatisfiableItem"]],["impl Send for Satisfaction",1,["bdk::descriptor::policy::Satisfaction"]],["impl Send for Policy",1,["bdk::descriptor::policy::Policy"]],["impl Send for Condition",1,["bdk::descriptor::policy::Condition"]],["impl Send for PolicyError",1,["bdk::descriptor::policy::PolicyError"]],["impl<'a> Send for BuildSatisfaction<'a>",1,["bdk::descriptor::policy::BuildSatisfaction"]],["impl<K> Send for P2Pkh<K>where
K: Send,",1,["bdk::descriptor::template::P2Pkh"]],["impl<K> Send for P2Wpkh_P2Sh<K>where
K: Send,",1,["bdk::descriptor::template::P2Wpkh_P2Sh"]],["impl<K> Send for P2Wpkh<K>where
K: Send,",1,["bdk::descriptor::template::P2Wpkh"]],["impl<K> Send for Bip44<K>where
K: Send,",1,["bdk::descriptor::template::Bip44"]],["impl<K> Send for Bip44Public<K>where
K: Send,",1,["bdk::descriptor::template::Bip44Public"]],["impl<K> Send for Bip49<K>where
K: Send,",1,["bdk::descriptor::template::Bip49"]],["impl<K> Send for Bip49Public<K>where
K: Send,",1,["bdk::descriptor::template::Bip49Public"]],["impl<K> Send for Bip84<K>where
K: Send,",1,["bdk::descriptor::template::Bip84"]],["impl<K> Send for Bip84Public<K>where
K: Send,",1,["bdk::descriptor::template::Bip84Public"]],["impl<Ctx> Send for DescriptorKey<Ctx>where
Ctx: Send,",1,["bdk::keys::DescriptorKey"]],["impl Send for ScriptContextEnum",1,["bdk::keys::ScriptContextEnum"]],["impl<Ctx> Send for ExtendedKey<Ctx>where
Ctx: Send,",1,["bdk::keys::ExtendedKey"]],["impl<K, Ctx> Send for GeneratedKey<K, Ctx>where
Ctx: Send,
K: Send,",1,["bdk::keys::GeneratedKey"]],["impl Send for PrivateKeyGenerateOptions",1,["bdk::keys::PrivateKeyGenerateOptions"]],["impl Send for KeyError",1,["bdk::keys::KeyError"]],["impl Send for KeychainKind",1,["bdk::types::KeychainKind"]],["impl Send for FeeRate",1,["bdk::types::FeeRate"]],["impl Send for LocalUtxo",1,["bdk::types::LocalUtxo"]],["impl Send for WeightedUtxo",1,["bdk::types::WeightedUtxo"]],["impl Send for Utxo",1,["bdk::types::Utxo"]],["impl Send for TransactionDetails",1,["bdk::types::TransactionDetails"]],["impl Send for Excess",1,["bdk::wallet::coin_selection::Excess"]],["impl Send for CoinSelectionResult",1,["bdk::wallet::coin_selection::CoinSelectionResult"]],["impl Send for LargestFirstCoinSelection",1,["bdk::wallet::coin_selection::LargestFirstCoinSelection"]],["impl Send for OldestFirstCoinSelection",1,["bdk::wallet::coin_selection::OldestFirstCoinSelection"]],["impl Send for BranchAndBoundCoinSelection",1,["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]],["impl Send for FullyNodedExport",1,["bdk::wallet::export::FullyNodedExport"]],["impl Send for SignerId",1,["bdk::wallet::signer::SignerId"]],["impl Send for SignerError",1,["bdk::wallet::signer::SignerError"]],["impl Send for SignerContext",1,["bdk::wallet::signer::SignerContext"]],["impl<S> Send for SignerWrapper<S>where
S: Send,",1,["bdk::wallet::signer::SignerWrapper"]],["impl Send for SignerOrdering",1,["bdk::wallet::signer::SignerOrdering"]],["impl Send for SignersContainer",1,["bdk::wallet::signer::SignersContainer"]],["impl Send for SignOptions",1,["bdk::wallet::signer::SignOptions"]],["impl Send for TapLeavesOptions",1,["bdk::wallet::signer::TapLeavesOptions"]],["impl Send for CreateTx",1,["bdk::wallet::tx_builder::CreateTx"]],["impl Send for BumpFee",1,["bdk::wallet::tx_builder::BumpFee"]],["impl<'a, D, Cs, Ctx> !Send for TxBuilder<'a, D, Cs, Ctx>",1,["bdk::wallet::tx_builder::TxBuilder"]],["impl Send for TxOrdering",1,["bdk::wallet::tx_builder::TxOrdering"]],["impl Send for ChangeSpendPolicy",1,["bdk::wallet::tx_builder::ChangeSpendPolicy"]],["impl<D> Send for Wallet<D>where
D: Send,",1,["bdk::wallet::Wallet"]],["impl Send for AddressIndex",1,["bdk::wallet::AddressIndex"]],["impl Send for AddressInfo",1,["bdk::wallet::AddressInfo"]],["impl<P> Send for NewError<P>where
P: Send,",1,["bdk::wallet::NewError"]]],
-"bdk_chain":[["impl<P> Send for ChainGraph<P>where
P: Send,",1,["bdk_chain::chain_graph::ChainGraph"]],["impl<P> Send for ChangeSet<P>where
P: Send,",1,["bdk_chain::chain_graph::ChangeSet"]],["impl<P> Send for NewError<P>where
P: Send,",1,["bdk_chain::chain_graph::NewError"]],["impl<P> Send for InsertTxError<P>where
P: Send,",1,["bdk_chain::chain_graph::InsertTxError"]],["impl<P> Send for UpdateError<P>where
P: Send,",1,["bdk_chain::chain_graph::UpdateError"]],["impl<P> Send for UnresolvableConflict<P>where
P: Send,",1,["bdk_chain::chain_graph::UnresolvableConflict"]],["impl<I> Send for SpkTxOutIndex<I>where
I: Send,",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl Send for TxHeight",1,["bdk_chain::chain_data::TxHeight"]],["impl Send for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Send for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl<I> Send for FullTxOut<I>where
I: Send,",1,["bdk_chain::chain_data::FullTxOut"]],["impl<K, P, B> Send for Persist<K, P, B>where
B: Send,
K: Send,
P: Send,",1,["bdk_chain::keychain::persist::Persist"]],["impl<K, P> Send for KeychainTracker<K, P>where
K: Send,
P: Send,",1,["bdk_chain::keychain::tracker::KeychainTracker"]],["impl<K> Send for KeychainTxOutIndex<K>where
K: Send,",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> Send for DerivationAdditions<K>where
K: Send,",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, P> Send for KeychainScan<K, P>where
K: Send,
P: Send,",1,["bdk_chain::keychain::KeychainScan"]],["impl<K, P> Send for KeychainChangeSet<K, P>where
K: Send,
P: Send,",1,["bdk_chain::keychain::KeychainChangeSet"]],["impl Send for Balance",1,["bdk_chain::keychain::Balance"]],["impl<P> Send for SparseChain<P>where
P: Send,",1,["bdk_chain::sparse_chain::SparseChain"]],["impl<P> Send for InsertTxError<P>where
P: Send,",1,["bdk_chain::sparse_chain::InsertTxError"]],["impl Send for InsertCheckpointError",1,["bdk_chain::sparse_chain::InsertCheckpointError"]],["impl<P> Send for UpdateError<P>where
P: Send,",1,["bdk_chain::sparse_chain::UpdateError"]],["impl<P> Send for ChangeSet<P>where
P: Send,",1,["bdk_chain::sparse_chain::ChangeSet"]],["impl Send for TxGraph",1,["bdk_chain::tx_graph::TxGraph"]],["impl Send for Additions",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, F> Send for TxDescendants<'g, F>where
F: Send,",1,["bdk_chain::tx_graph::TxDescendants"]]],
+"bdk_chain":[["impl<P> Send for ChainGraph<P>where
P: Send,",1,["bdk_chain::chain_graph::ChainGraph"]],["impl<P> Send for ChangeSet<P>where
P: Send,",1,["bdk_chain::chain_graph::ChangeSet"]],["impl<P> Send for NewError<P>where
P: Send,",1,["bdk_chain::chain_graph::NewError"]],["impl<P> Send for InsertTxError<P>where
P: Send,",1,["bdk_chain::chain_graph::InsertTxError"]],["impl<P> Send for UpdateError<P>where
P: Send,",1,["bdk_chain::chain_graph::UpdateError"]],["impl<P> Send for UnresolvableConflict<P>where
P: Send,",1,["bdk_chain::chain_graph::UnresolvableConflict"]],["impl<I> Send for SpkTxOutIndex<I>where
I: Send,",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<A> Send for ObservedAs<A>where
A: Send,",1,["bdk_chain::chain_data::ObservedAs"]],["impl Send for TxHeight",1,["bdk_chain::chain_data::TxHeight"]],["impl Send for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Send for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl<P> Send for FullTxOut<P>where
P: Send,",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A, I> Send for IndexedTxGraph<A, I>where
A: Send,
I: Send,",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> Send for IndexedAdditions<A, IA>where
A: Send,
IA: Send,",1,["bdk_chain::indexed_tx_graph::IndexedAdditions"]],["impl<K, P, B> Send for Persist<K, P, B>where
B: Send,
K: Send,
P: Send,",1,["bdk_chain::keychain::persist::Persist"]],["impl<K, P> Send for KeychainTracker<K, P>where
K: Send,
P: Send,",1,["bdk_chain::keychain::tracker::KeychainTracker"]],["impl<K> Send for KeychainTxOutIndex<K>where
K: Send,",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> Send for DerivationAdditions<K>where
K: Send,",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, P> Send for KeychainScan<K, P>where
K: Send,
P: Send,",1,["bdk_chain::keychain::KeychainScan"]],["impl<K, P> Send for KeychainChangeSet<K, P>where
K: Send,
P: Send,",1,["bdk_chain::keychain::KeychainChangeSet"]],["impl Send for Balance",1,["bdk_chain::keychain::Balance"]],["impl Send for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl Send for UpdateNotConnectedError",1,["bdk_chain::local_chain::UpdateNotConnectedError"]],["impl<P> Send for SparseChain<P>where
P: Send,",1,["bdk_chain::sparse_chain::SparseChain"]],["impl<P> Send for InsertTxError<P>where
P: Send,",1,["bdk_chain::sparse_chain::InsertTxError"]],["impl Send for InsertCheckpointError",1,["bdk_chain::sparse_chain::InsertCheckpointError"]],["impl<P> Send for UpdateError<P>where
P: Send,",1,["bdk_chain::sparse_chain::UpdateError"]],["impl<P> Send for ChangeSet<P>where
P: Send,",1,["bdk_chain::sparse_chain::ChangeSet"]],["impl<A> Send for TxGraph<A>where
A: Send,",1,["bdk_chain::tx_graph::TxGraph"]],["impl<'a, T, A> Send for TxNode<'a, T, A>where
A: Sync,
T: Sync,",1,["bdk_chain::tx_graph::TxNode"]],["impl<'a, T, A> Send for CanonicalTx<'a, T, A>where
A: Sync,
T: Sync,",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<A> Send for Additions<A>where
A: Send,",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, A, F> Send for TxDescendants<'g, A, F>where
A: Sync,
F: Send,",1,["bdk_chain::tx_graph::TxDescendants"]]],
"bdk_coin_select":[["impl Send for WeightedValue",1,["bdk_coin_select::coin_selector::WeightedValue"]],["impl Send for CoinSelectorOpt",1,["bdk_coin_select::coin_selector::CoinSelectorOpt"]],["impl<'a> Send for CoinSelector<'a>",1,["bdk_coin_select::coin_selector::CoinSelector"]],["impl Send for SelectionError",1,["bdk_coin_select::coin_selector::SelectionError"]],["impl Send for SelectionConstraint",1,["bdk_coin_select::coin_selector::SelectionConstraint"]],["impl Send for Selection",1,["bdk_coin_select::coin_selector::Selection"]],["impl Send for ExcessStrategyKind",1,["bdk_coin_select::coin_selector::ExcessStrategyKind"]],["impl Send for ExcessStrategy",1,["bdk_coin_select::coin_selector::ExcessStrategy"]],["impl Send for BranchStrategy",1,["bdk_coin_select::bnb::BranchStrategy"]],["impl<'c, S> Send for Bnb<'c, S>where
S: Send,",1,["bdk_coin_select::bnb::Bnb"]],["impl<'c, 'f, S> !Send for BnbIter<'c, 'f, S>",1,["bdk_coin_select::bnb::BnbIter"]],["impl Send for BnbLimit",1,["bdk_coin_select::bnb::BnbLimit"]]],
"bdk_electrum":[["impl<K, P> Send for ElectrumUpdate<K, P>where
K: Send,
P: Send,",1,["bdk_electrum::ElectrumUpdate"]]],
"bdk_file_store":[["impl<K, P> Send for KeychainStore<K, P>where
K: Send,
P: Send,",1,["bdk_file_store::file_store::KeychainStore"]],["impl Send for FileError",1,["bdk_file_store::file_store::FileError"]],["impl Send for IterError",1,["bdk_file_store::file_store::IterError"]],["impl<'a, V> Send for EntryIter<'a, V>where
V: Send,",1,["bdk_file_store::file_store::EntryIter"]]],
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralEq.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralEq.js
index 54de3d13b6..f41e9524b5 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralEq.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralEq.js
@@ -1,6 +1,6 @@
(function() {var implementors = {
"bdk":[["impl StructuralEq for PkOrF"],["impl StructuralEq for SatisfiableItem"],["impl StructuralEq for Satisfaction"],["impl StructuralEq for Policy"],["impl StructuralEq for Condition"],["impl StructuralEq for PolicyError"],["impl StructuralEq for ScriptContextEnum"],["impl StructuralEq for KeychainKind"],["impl StructuralEq for LocalUtxo"],["impl StructuralEq for WeightedUtxo"],["impl StructuralEq for Utxo"],["impl StructuralEq for TransactionDetails"],["impl StructuralEq for SignerId"],["impl StructuralEq for SignerError"],["impl StructuralEq for SignerContext"],["impl StructuralEq for SignerOrdering"],["impl StructuralEq for TapLeavesOptions"],["impl StructuralEq for TxOrdering"],["impl StructuralEq for ChangeSpendPolicy"],["impl StructuralEq for AddressInfo"]],
-"bdk_chain":[["impl StructuralEq for TxHeight"],["impl StructuralEq for ConfirmationTime"],["impl StructuralEq for BlockId"],["impl StructuralEq for Balance"]],
+"bdk_chain":[["impl<A> StructuralEq for ObservedAs<A>"],["impl StructuralEq for TxHeight"],["impl StructuralEq for ConfirmationTime"],["impl StructuralEq for BlockId"],["impl<P> StructuralEq for FullTxOut<P>"],["impl StructuralEq for Balance"],["impl StructuralEq for LocalChain"],["impl<'a, T, A> StructuralEq for TxNode<'a, T, A>"],["impl<'a, T, A> StructuralEq for CanonicalTx<'a, T, A>"]],
"bdk_coin_select":[["impl StructuralEq for SelectionConstraint"],["impl StructuralEq for ExcessStrategyKind"]],
"keychain_tracker_example_cli":[["impl StructuralEq for Keychain"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralPartialEq.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralPartialEq.js
index dcc9f07dbe..096ac5dec1 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralPartialEq.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralPartialEq.js
@@ -1,6 +1,6 @@
(function() {var implementors = {
"bdk":[["impl StructuralPartialEq for PkOrF"],["impl StructuralPartialEq for SatisfiableItem"],["impl StructuralPartialEq for Satisfaction"],["impl StructuralPartialEq for Policy"],["impl StructuralPartialEq for Condition"],["impl StructuralPartialEq for PolicyError"],["impl StructuralPartialEq for ScriptContextEnum"],["impl StructuralPartialEq for KeychainKind"],["impl StructuralPartialEq for FeeRate"],["impl StructuralPartialEq for LocalUtxo"],["impl StructuralPartialEq for WeightedUtxo"],["impl StructuralPartialEq for Utxo"],["impl StructuralPartialEq for TransactionDetails"],["impl StructuralPartialEq for SignerId"],["impl StructuralPartialEq for SignerError"],["impl StructuralPartialEq for SignerContext"],["impl StructuralPartialEq for SignerOrdering"],["impl StructuralPartialEq for TapLeavesOptions"],["impl StructuralPartialEq for TxOrdering"],["impl StructuralPartialEq for ChangeSpendPolicy"],["impl StructuralPartialEq for AddressInfo"]],
-"bdk_chain":[["impl<P> StructuralPartialEq for ChainGraph<P>"],["impl<P> StructuralPartialEq for ChangeSet<P>"],["impl<P> StructuralPartialEq for NewError<P>"],["impl<P> StructuralPartialEq for InsertTxError<P>"],["impl<P> StructuralPartialEq for UpdateError<P>"],["impl<P> StructuralPartialEq for UnresolvableConflict<P>"],["impl StructuralPartialEq for TxHeight"],["impl StructuralPartialEq for ConfirmationTime"],["impl StructuralPartialEq for BlockId"],["impl<I> StructuralPartialEq for FullTxOut<I>"],["impl<K> StructuralPartialEq for DerivationAdditions<K>"],["impl<K, P> StructuralPartialEq for KeychainScan<K, P>"],["impl StructuralPartialEq for Balance"],["impl<P> StructuralPartialEq for SparseChain<P>"],["impl<P> StructuralPartialEq for InsertTxError<P>"],["impl StructuralPartialEq for InsertCheckpointError"],["impl<P> StructuralPartialEq for UpdateError<P>"],["impl<P> StructuralPartialEq for ChangeSet<P>"],["impl StructuralPartialEq for TxGraph"],["impl StructuralPartialEq for Additions"]],
+"bdk_chain":[["impl<P> StructuralPartialEq for ChainGraph<P>"],["impl<P> StructuralPartialEq for ChangeSet<P>"],["impl<P> StructuralPartialEq for NewError<P>"],["impl<P> StructuralPartialEq for InsertTxError<P>"],["impl<P> StructuralPartialEq for UpdateError<P>"],["impl<P> StructuralPartialEq for UnresolvableConflict<P>"],["impl<A> StructuralPartialEq for ObservedAs<A>"],["impl StructuralPartialEq for TxHeight"],["impl StructuralPartialEq for ConfirmationTime"],["impl StructuralPartialEq for BlockId"],["impl<P> StructuralPartialEq for FullTxOut<P>"],["impl<A, IA> StructuralPartialEq for IndexedAdditions<A, IA>"],["impl<K> StructuralPartialEq for DerivationAdditions<K>"],["impl<K, P> StructuralPartialEq for KeychainScan<K, P>"],["impl StructuralPartialEq for Balance"],["impl StructuralPartialEq for LocalChain"],["impl StructuralPartialEq for UpdateNotConnectedError"],["impl<P> StructuralPartialEq for SparseChain<P>"],["impl<P> StructuralPartialEq for InsertTxError<P>"],["impl StructuralPartialEq for InsertCheckpointError"],["impl<P> StructuralPartialEq for UpdateError<P>"],["impl<P> StructuralPartialEq for ChangeSet<P>"],["impl<A> StructuralPartialEq for TxGraph<A>"],["impl<'a, T, A> StructuralPartialEq for TxNode<'a, T, A>"],["impl<'a, T, A> StructuralPartialEq for CanonicalTx<'a, T, A>"],["impl<A> StructuralPartialEq for Additions<A>"]],
"bdk_coin_select":[["impl StructuralPartialEq for SelectionConstraint"],["impl StructuralPartialEq for ExcessStrategyKind"]],
"keychain_tracker_electrum_example":[["impl StructuralPartialEq for ScanOptions"]],
"keychain_tracker_esplora_example":[["impl StructuralPartialEq for ScanOptions"]],
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Sync.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Sync.js
index dc30c1abba..7418fd284d 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Sync.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Sync.js
@@ -1,6 +1,6 @@
(function() {var implementors = {
"bdk":[["impl Sync for Error",1,["bdk::error::Error"]],["impl Sync for Error",1,["bdk::descriptor::error::Error"]],["impl Sync for PkOrF",1,["bdk::descriptor::policy::PkOrF"]],["impl Sync for SatisfiableItem",1,["bdk::descriptor::policy::SatisfiableItem"]],["impl Sync for Satisfaction",1,["bdk::descriptor::policy::Satisfaction"]],["impl Sync for Policy",1,["bdk::descriptor::policy::Policy"]],["impl Sync for Condition",1,["bdk::descriptor::policy::Condition"]],["impl Sync for PolicyError",1,["bdk::descriptor::policy::PolicyError"]],["impl<'a> Sync for BuildSatisfaction<'a>",1,["bdk::descriptor::policy::BuildSatisfaction"]],["impl<K> Sync for P2Pkh<K>where
K: Sync,",1,["bdk::descriptor::template::P2Pkh"]],["impl<K> Sync for P2Wpkh_P2Sh<K>where
K: Sync,",1,["bdk::descriptor::template::P2Wpkh_P2Sh"]],["impl<K> Sync for P2Wpkh<K>where
K: Sync,",1,["bdk::descriptor::template::P2Wpkh"]],["impl<K> Sync for Bip44<K>where
K: Sync,",1,["bdk::descriptor::template::Bip44"]],["impl<K> Sync for Bip44Public<K>where
K: Sync,",1,["bdk::descriptor::template::Bip44Public"]],["impl<K> Sync for Bip49<K>where
K: Sync,",1,["bdk::descriptor::template::Bip49"]],["impl<K> Sync for Bip49Public<K>where
K: Sync,",1,["bdk::descriptor::template::Bip49Public"]],["impl<K> Sync for Bip84<K>where
K: Sync,",1,["bdk::descriptor::template::Bip84"]],["impl<K> Sync for Bip84Public<K>where
K: Sync,",1,["bdk::descriptor::template::Bip84Public"]],["impl<Ctx> Sync for DescriptorKey<Ctx>where
Ctx: Sync,",1,["bdk::keys::DescriptorKey"]],["impl Sync for ScriptContextEnum",1,["bdk::keys::ScriptContextEnum"]],["impl<Ctx> Sync for ExtendedKey<Ctx>where
Ctx: Sync,",1,["bdk::keys::ExtendedKey"]],["impl<K, Ctx> Sync for GeneratedKey<K, Ctx>where
Ctx: Sync,
K: Sync,",1,["bdk::keys::GeneratedKey"]],["impl Sync for PrivateKeyGenerateOptions",1,["bdk::keys::PrivateKeyGenerateOptions"]],["impl Sync for KeyError",1,["bdk::keys::KeyError"]],["impl Sync for KeychainKind",1,["bdk::types::KeychainKind"]],["impl Sync for FeeRate",1,["bdk::types::FeeRate"]],["impl Sync for LocalUtxo",1,["bdk::types::LocalUtxo"]],["impl Sync for WeightedUtxo",1,["bdk::types::WeightedUtxo"]],["impl Sync for Utxo",1,["bdk::types::Utxo"]],["impl Sync for TransactionDetails",1,["bdk::types::TransactionDetails"]],["impl Sync for Excess",1,["bdk::wallet::coin_selection::Excess"]],["impl Sync for CoinSelectionResult",1,["bdk::wallet::coin_selection::CoinSelectionResult"]],["impl Sync for LargestFirstCoinSelection",1,["bdk::wallet::coin_selection::LargestFirstCoinSelection"]],["impl Sync for OldestFirstCoinSelection",1,["bdk::wallet::coin_selection::OldestFirstCoinSelection"]],["impl Sync for BranchAndBoundCoinSelection",1,["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]],["impl Sync for FullyNodedExport",1,["bdk::wallet::export::FullyNodedExport"]],["impl Sync for SignerId",1,["bdk::wallet::signer::SignerId"]],["impl Sync for SignerError",1,["bdk::wallet::signer::SignerError"]],["impl Sync for SignerContext",1,["bdk::wallet::signer::SignerContext"]],["impl<S> Sync for SignerWrapper<S>where
S: Sync,",1,["bdk::wallet::signer::SignerWrapper"]],["impl Sync for SignerOrdering",1,["bdk::wallet::signer::SignerOrdering"]],["impl Sync for SignersContainer",1,["bdk::wallet::signer::SignersContainer"]],["impl Sync for SignOptions",1,["bdk::wallet::signer::SignOptions"]],["impl Sync for TapLeavesOptions",1,["bdk::wallet::signer::TapLeavesOptions"]],["impl Sync for CreateTx",1,["bdk::wallet::tx_builder::CreateTx"]],["impl Sync for BumpFee",1,["bdk::wallet::tx_builder::BumpFee"]],["impl<'a, D, Cs, Ctx> !Sync for TxBuilder<'a, D, Cs, Ctx>",1,["bdk::wallet::tx_builder::TxBuilder"]],["impl Sync for TxOrdering",1,["bdk::wallet::tx_builder::TxOrdering"]],["impl Sync for ChangeSpendPolicy",1,["bdk::wallet::tx_builder::ChangeSpendPolicy"]],["impl<D> Sync for Wallet<D>where
D: Sync,",1,["bdk::wallet::Wallet"]],["impl Sync for AddressIndex",1,["bdk::wallet::AddressIndex"]],["impl Sync for AddressInfo",1,["bdk::wallet::AddressInfo"]],["impl<P> Sync for NewError<P>where
P: Sync,",1,["bdk::wallet::NewError"]]],
-"bdk_chain":[["impl<P> Sync for ChainGraph<P>where
P: Sync,",1,["bdk_chain::chain_graph::ChainGraph"]],["impl<P> Sync for ChangeSet<P>where
P: Sync,",1,["bdk_chain::chain_graph::ChangeSet"]],["impl<P> Sync for NewError<P>where
P: Sync,",1,["bdk_chain::chain_graph::NewError"]],["impl<P> Sync for InsertTxError<P>where
P: Sync,",1,["bdk_chain::chain_graph::InsertTxError"]],["impl<P> Sync for UpdateError<P>where
P: Sync,",1,["bdk_chain::chain_graph::UpdateError"]],["impl<P> Sync for UnresolvableConflict<P>where
P: Sync,",1,["bdk_chain::chain_graph::UnresolvableConflict"]],["impl<I> Sync for SpkTxOutIndex<I>where
I: Sync,",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl Sync for TxHeight",1,["bdk_chain::chain_data::TxHeight"]],["impl Sync for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Sync for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl<I> Sync for FullTxOut<I>where
I: Sync,",1,["bdk_chain::chain_data::FullTxOut"]],["impl<K, P, B> Sync for Persist<K, P, B>where
B: Sync,
K: Sync,
P: Sync,",1,["bdk_chain::keychain::persist::Persist"]],["impl<K, P> Sync for KeychainTracker<K, P>where
K: Sync,
P: Sync,",1,["bdk_chain::keychain::tracker::KeychainTracker"]],["impl<K> Sync for KeychainTxOutIndex<K>where
K: Sync,",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> Sync for DerivationAdditions<K>where
K: Sync,",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, P> Sync for KeychainScan<K, P>where
K: Sync,
P: Sync,",1,["bdk_chain::keychain::KeychainScan"]],["impl<K, P> Sync for KeychainChangeSet<K, P>where
K: Sync,
P: Sync,",1,["bdk_chain::keychain::KeychainChangeSet"]],["impl Sync for Balance",1,["bdk_chain::keychain::Balance"]],["impl<P> Sync for SparseChain<P>where
P: Sync,",1,["bdk_chain::sparse_chain::SparseChain"]],["impl<P> Sync for InsertTxError<P>where
P: Sync,",1,["bdk_chain::sparse_chain::InsertTxError"]],["impl Sync for InsertCheckpointError",1,["bdk_chain::sparse_chain::InsertCheckpointError"]],["impl<P> Sync for UpdateError<P>where
P: Sync,",1,["bdk_chain::sparse_chain::UpdateError"]],["impl<P> Sync for ChangeSet<P>where
P: Sync,",1,["bdk_chain::sparse_chain::ChangeSet"]],["impl Sync for TxGraph",1,["bdk_chain::tx_graph::TxGraph"]],["impl Sync for Additions",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, F> Sync for TxDescendants<'g, F>where
F: Sync,",1,["bdk_chain::tx_graph::TxDescendants"]]],
+"bdk_chain":[["impl<P> Sync for ChainGraph<P>where
P: Sync,",1,["bdk_chain::chain_graph::ChainGraph"]],["impl<P> Sync for ChangeSet<P>where
P: Sync,",1,["bdk_chain::chain_graph::ChangeSet"]],["impl<P> Sync for NewError<P>where
P: Sync,",1,["bdk_chain::chain_graph::NewError"]],["impl<P> Sync for InsertTxError<P>where
P: Sync,",1,["bdk_chain::chain_graph::InsertTxError"]],["impl<P> Sync for UpdateError<P>where
P: Sync,",1,["bdk_chain::chain_graph::UpdateError"]],["impl<P> Sync for UnresolvableConflict<P>where
P: Sync,",1,["bdk_chain::chain_graph::UnresolvableConflict"]],["impl<I> Sync for SpkTxOutIndex<I>where
I: Sync,",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<A> Sync for ObservedAs<A>where
A: Sync,",1,["bdk_chain::chain_data::ObservedAs"]],["impl Sync for TxHeight",1,["bdk_chain::chain_data::TxHeight"]],["impl Sync for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Sync for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl<P> Sync for FullTxOut<P>where
P: Sync,",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A, I> Sync for IndexedTxGraph<A, I>where
A: Sync,
I: Sync,",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> Sync for IndexedAdditions<A, IA>where
A: Sync,
IA: Sync,",1,["bdk_chain::indexed_tx_graph::IndexedAdditions"]],["impl<K, P, B> Sync for Persist<K, P, B>where
B: Sync,
K: Sync,
P: Sync,",1,["bdk_chain::keychain::persist::Persist"]],["impl<K, P> Sync for KeychainTracker<K, P>where
K: Sync,
P: Sync,",1,["bdk_chain::keychain::tracker::KeychainTracker"]],["impl<K> Sync for KeychainTxOutIndex<K>where
K: Sync,",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> Sync for DerivationAdditions<K>where
K: Sync,",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, P> Sync for KeychainScan<K, P>where
K: Sync,
P: Sync,",1,["bdk_chain::keychain::KeychainScan"]],["impl<K, P> Sync for KeychainChangeSet<K, P>where
K: Sync,
P: Sync,",1,["bdk_chain::keychain::KeychainChangeSet"]],["impl Sync for Balance",1,["bdk_chain::keychain::Balance"]],["impl Sync for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl Sync for UpdateNotConnectedError",1,["bdk_chain::local_chain::UpdateNotConnectedError"]],["impl<P> Sync for SparseChain<P>where
P: Sync,",1,["bdk_chain::sparse_chain::SparseChain"]],["impl<P> Sync for InsertTxError<P>where
P: Sync,",1,["bdk_chain::sparse_chain::InsertTxError"]],["impl Sync for InsertCheckpointError",1,["bdk_chain::sparse_chain::InsertCheckpointError"]],["impl<P> Sync for UpdateError<P>where
P: Sync,",1,["bdk_chain::sparse_chain::UpdateError"]],["impl<P> Sync for ChangeSet<P>where
P: Sync,",1,["bdk_chain::sparse_chain::ChangeSet"]],["impl<A> Sync for TxGraph<A>where
A: Sync,",1,["bdk_chain::tx_graph::TxGraph"]],["impl<'a, T, A> Sync for TxNode<'a, T, A>where
A: Sync,
T: Sync,",1,["bdk_chain::tx_graph::TxNode"]],["impl<'a, T, A> Sync for CanonicalTx<'a, T, A>where
A: Sync,
T: Sync,",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<A> Sync for Additions<A>where
A: Sync,",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, A, F> Sync for TxDescendants<'g, A, F>where
A: Sync,
F: Sync,",1,["bdk_chain::tx_graph::TxDescendants"]]],
"bdk_coin_select":[["impl Sync for WeightedValue",1,["bdk_coin_select::coin_selector::WeightedValue"]],["impl Sync for CoinSelectorOpt",1,["bdk_coin_select::coin_selector::CoinSelectorOpt"]],["impl<'a> Sync for CoinSelector<'a>",1,["bdk_coin_select::coin_selector::CoinSelector"]],["impl Sync for SelectionError",1,["bdk_coin_select::coin_selector::SelectionError"]],["impl Sync for SelectionConstraint",1,["bdk_coin_select::coin_selector::SelectionConstraint"]],["impl Sync for Selection",1,["bdk_coin_select::coin_selector::Selection"]],["impl Sync for ExcessStrategyKind",1,["bdk_coin_select::coin_selector::ExcessStrategyKind"]],["impl Sync for ExcessStrategy",1,["bdk_coin_select::coin_selector::ExcessStrategy"]],["impl Sync for BranchStrategy",1,["bdk_coin_select::bnb::BranchStrategy"]],["impl<'c, S> Sync for Bnb<'c, S>where
S: Sync,",1,["bdk_coin_select::bnb::Bnb"]],["impl<'c, 'f, S> !Sync for BnbIter<'c, 'f, S>",1,["bdk_coin_select::bnb::BnbIter"]],["impl Sync for BnbLimit",1,["bdk_coin_select::bnb::BnbLimit"]]],
"bdk_electrum":[["impl<K, P> Sync for ElectrumUpdate<K, P>where
K: Sync,
P: Sync,",1,["bdk_electrum::ElectrumUpdate"]]],
"bdk_file_store":[["impl<K, P> Sync for KeychainStore<K, P>where
K: Sync,
P: Sync,",1,["bdk_file_store::file_store::KeychainStore"]],["impl Sync for FileError",1,["bdk_file_store::file_store::FileError"]],["impl Sync for IterError",1,["bdk_file_store::file_store::IterError"]],["impl<'a, V> Sync for EntryIter<'a, V>where
V: Sync,",1,["bdk_file_store::file_store::EntryIter"]]],
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Unpin.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Unpin.js
index 9d4e67c412..70feb2cc32 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Unpin.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Unpin.js
@@ -1,6 +1,6 @@
(function() {var implementors = {
"bdk":[["impl Unpin for Error",1,["bdk::error::Error"]],["impl Unpin for Error",1,["bdk::descriptor::error::Error"]],["impl Unpin for PkOrF",1,["bdk::descriptor::policy::PkOrF"]],["impl Unpin for SatisfiableItem",1,["bdk::descriptor::policy::SatisfiableItem"]],["impl Unpin for Satisfaction",1,["bdk::descriptor::policy::Satisfaction"]],["impl Unpin for Policy",1,["bdk::descriptor::policy::Policy"]],["impl Unpin for Condition",1,["bdk::descriptor::policy::Condition"]],["impl Unpin for PolicyError",1,["bdk::descriptor::policy::PolicyError"]],["impl<'a> Unpin for BuildSatisfaction<'a>",1,["bdk::descriptor::policy::BuildSatisfaction"]],["impl<K> Unpin for P2Pkh<K>where
K: Unpin,",1,["bdk::descriptor::template::P2Pkh"]],["impl<K> Unpin for P2Wpkh_P2Sh<K>where
K: Unpin,",1,["bdk::descriptor::template::P2Wpkh_P2Sh"]],["impl<K> Unpin for P2Wpkh<K>where
K: Unpin,",1,["bdk::descriptor::template::P2Wpkh"]],["impl<K> Unpin for Bip44<K>where
K: Unpin,",1,["bdk::descriptor::template::Bip44"]],["impl<K> Unpin for Bip44Public<K>where
K: Unpin,",1,["bdk::descriptor::template::Bip44Public"]],["impl<K> Unpin for Bip49<K>where
K: Unpin,",1,["bdk::descriptor::template::Bip49"]],["impl<K> Unpin for Bip49Public<K>where
K: Unpin,",1,["bdk::descriptor::template::Bip49Public"]],["impl<K> Unpin for Bip84<K>where
K: Unpin,",1,["bdk::descriptor::template::Bip84"]],["impl<K> Unpin for Bip84Public<K>where
K: Unpin,",1,["bdk::descriptor::template::Bip84Public"]],["impl<Ctx> Unpin for DescriptorKey<Ctx>where
Ctx: Unpin,",1,["bdk::keys::DescriptorKey"]],["impl Unpin for ScriptContextEnum",1,["bdk::keys::ScriptContextEnum"]],["impl<Ctx> Unpin for ExtendedKey<Ctx>where
Ctx: Unpin,",1,["bdk::keys::ExtendedKey"]],["impl<K, Ctx> Unpin for GeneratedKey<K, Ctx>where
Ctx: Unpin,
K: Unpin,",1,["bdk::keys::GeneratedKey"]],["impl Unpin for PrivateKeyGenerateOptions",1,["bdk::keys::PrivateKeyGenerateOptions"]],["impl Unpin for KeyError",1,["bdk::keys::KeyError"]],["impl Unpin for KeychainKind",1,["bdk::types::KeychainKind"]],["impl Unpin for FeeRate",1,["bdk::types::FeeRate"]],["impl Unpin for LocalUtxo",1,["bdk::types::LocalUtxo"]],["impl Unpin for WeightedUtxo",1,["bdk::types::WeightedUtxo"]],["impl Unpin for Utxo",1,["bdk::types::Utxo"]],["impl Unpin for TransactionDetails",1,["bdk::types::TransactionDetails"]],["impl Unpin for Excess",1,["bdk::wallet::coin_selection::Excess"]],["impl Unpin for CoinSelectionResult",1,["bdk::wallet::coin_selection::CoinSelectionResult"]],["impl Unpin for LargestFirstCoinSelection",1,["bdk::wallet::coin_selection::LargestFirstCoinSelection"]],["impl Unpin for OldestFirstCoinSelection",1,["bdk::wallet::coin_selection::OldestFirstCoinSelection"]],["impl Unpin for BranchAndBoundCoinSelection",1,["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]],["impl Unpin for FullyNodedExport",1,["bdk::wallet::export::FullyNodedExport"]],["impl Unpin for SignerId",1,["bdk::wallet::signer::SignerId"]],["impl Unpin for SignerError",1,["bdk::wallet::signer::SignerError"]],["impl Unpin for SignerContext",1,["bdk::wallet::signer::SignerContext"]],["impl<S> Unpin for SignerWrapper<S>where
S: Unpin,",1,["bdk::wallet::signer::SignerWrapper"]],["impl Unpin for SignerOrdering",1,["bdk::wallet::signer::SignerOrdering"]],["impl Unpin for SignersContainer",1,["bdk::wallet::signer::SignersContainer"]],["impl Unpin for SignOptions",1,["bdk::wallet::signer::SignOptions"]],["impl Unpin for TapLeavesOptions",1,["bdk::wallet::signer::TapLeavesOptions"]],["impl Unpin for CreateTx",1,["bdk::wallet::tx_builder::CreateTx"]],["impl Unpin for BumpFee",1,["bdk::wallet::tx_builder::BumpFee"]],["impl<'a, D, Cs, Ctx> Unpin for TxBuilder<'a, D, Cs, Ctx>where
Cs: Unpin,
Ctx: Unpin,",1,["bdk::wallet::tx_builder::TxBuilder"]],["impl Unpin for TxOrdering",1,["bdk::wallet::tx_builder::TxOrdering"]],["impl Unpin for ChangeSpendPolicy",1,["bdk::wallet::tx_builder::ChangeSpendPolicy"]],["impl<D> Unpin for Wallet<D>where
D: Unpin,",1,["bdk::wallet::Wallet"]],["impl Unpin for AddressIndex",1,["bdk::wallet::AddressIndex"]],["impl Unpin for AddressInfo",1,["bdk::wallet::AddressInfo"]],["impl<P> Unpin for NewError<P>where
P: Unpin,",1,["bdk::wallet::NewError"]]],
-"bdk_chain":[["impl<P> Unpin for ChainGraph<P>where
P: Unpin,",1,["bdk_chain::chain_graph::ChainGraph"]],["impl<P> Unpin for ChangeSet<P>",1,["bdk_chain::chain_graph::ChangeSet"]],["impl<P> Unpin for NewError<P>where
P: Unpin,",1,["bdk_chain::chain_graph::NewError"]],["impl<P> Unpin for InsertTxError<P>where
P: Unpin,",1,["bdk_chain::chain_graph::InsertTxError"]],["impl<P> Unpin for UpdateError<P>where
P: Unpin,",1,["bdk_chain::chain_graph::UpdateError"]],["impl<P> Unpin for UnresolvableConflict<P>where
P: Unpin,",1,["bdk_chain::chain_graph::UnresolvableConflict"]],["impl<I> Unpin for SpkTxOutIndex<I>where
I: Unpin,",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl Unpin for TxHeight",1,["bdk_chain::chain_data::TxHeight"]],["impl Unpin for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Unpin for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl<I> Unpin for FullTxOut<I>where
I: Unpin,",1,["bdk_chain::chain_data::FullTxOut"]],["impl<K, P, B> Unpin for Persist<K, P, B>where
B: Unpin,",1,["bdk_chain::keychain::persist::Persist"]],["impl<K, P> Unpin for KeychainTracker<K, P>where
K: Unpin,
P: Unpin,",1,["bdk_chain::keychain::tracker::KeychainTracker"]],["impl<K> Unpin for KeychainTxOutIndex<K>where
K: Unpin,",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> Unpin for DerivationAdditions<K>",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, P> Unpin for KeychainScan<K, P>where
P: Unpin,",1,["bdk_chain::keychain::KeychainScan"]],["impl<K, P> Unpin for KeychainChangeSet<K, P>",1,["bdk_chain::keychain::KeychainChangeSet"]],["impl Unpin for Balance",1,["bdk_chain::keychain::Balance"]],["impl<P> Unpin for SparseChain<P>where
P: Unpin,",1,["bdk_chain::sparse_chain::SparseChain"]],["impl<P> Unpin for InsertTxError<P>where
P: Unpin,",1,["bdk_chain::sparse_chain::InsertTxError"]],["impl Unpin for InsertCheckpointError",1,["bdk_chain::sparse_chain::InsertCheckpointError"]],["impl<P> Unpin for UpdateError<P>where
P: Unpin,",1,["bdk_chain::sparse_chain::UpdateError"]],["impl<P> Unpin for ChangeSet<P>",1,["bdk_chain::sparse_chain::ChangeSet"]],["impl Unpin for TxGraph",1,["bdk_chain::tx_graph::TxGraph"]],["impl Unpin for Additions",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, F> Unpin for TxDescendants<'g, F>where
F: Unpin,",1,["bdk_chain::tx_graph::TxDescendants"]]],
+"bdk_chain":[["impl<P> Unpin for ChainGraph<P>where
P: Unpin,",1,["bdk_chain::chain_graph::ChainGraph"]],["impl<P> Unpin for ChangeSet<P>",1,["bdk_chain::chain_graph::ChangeSet"]],["impl<P> Unpin for NewError<P>where
P: Unpin,",1,["bdk_chain::chain_graph::NewError"]],["impl<P> Unpin for InsertTxError<P>where
P: Unpin,",1,["bdk_chain::chain_graph::InsertTxError"]],["impl<P> Unpin for UpdateError<P>where
P: Unpin,",1,["bdk_chain::chain_graph::UpdateError"]],["impl<P> Unpin for UnresolvableConflict<P>where
P: Unpin,",1,["bdk_chain::chain_graph::UnresolvableConflict"]],["impl<I> Unpin for SpkTxOutIndex<I>where
I: Unpin,",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<A> Unpin for ObservedAs<A>where
A: Unpin,",1,["bdk_chain::chain_data::ObservedAs"]],["impl Unpin for TxHeight",1,["bdk_chain::chain_data::TxHeight"]],["impl Unpin for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Unpin for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl<P> Unpin for FullTxOut<P>where
P: Unpin,",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A, I> Unpin for IndexedTxGraph<A, I>where
I: Unpin,",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> Unpin for IndexedAdditions<A, IA>where
IA: Unpin,",1,["bdk_chain::indexed_tx_graph::IndexedAdditions"]],["impl<K, P, B> Unpin for Persist<K, P, B>where
B: Unpin,",1,["bdk_chain::keychain::persist::Persist"]],["impl<K, P> Unpin for KeychainTracker<K, P>where
K: Unpin,
P: Unpin,",1,["bdk_chain::keychain::tracker::KeychainTracker"]],["impl<K> Unpin for KeychainTxOutIndex<K>where
K: Unpin,",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> Unpin for DerivationAdditions<K>",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, P> Unpin for KeychainScan<K, P>where
P: Unpin,",1,["bdk_chain::keychain::KeychainScan"]],["impl<K, P> Unpin for KeychainChangeSet<K, P>",1,["bdk_chain::keychain::KeychainChangeSet"]],["impl Unpin for Balance",1,["bdk_chain::keychain::Balance"]],["impl Unpin for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl Unpin for UpdateNotConnectedError",1,["bdk_chain::local_chain::UpdateNotConnectedError"]],["impl<P> Unpin for SparseChain<P>where
P: Unpin,",1,["bdk_chain::sparse_chain::SparseChain"]],["impl<P> Unpin for InsertTxError<P>where
P: Unpin,",1,["bdk_chain::sparse_chain::InsertTxError"]],["impl Unpin for InsertCheckpointError",1,["bdk_chain::sparse_chain::InsertCheckpointError"]],["impl<P> Unpin for UpdateError<P>where
P: Unpin,",1,["bdk_chain::sparse_chain::UpdateError"]],["impl<P> Unpin for ChangeSet<P>",1,["bdk_chain::sparse_chain::ChangeSet"]],["impl<A> Unpin for TxGraph<A>",1,["bdk_chain::tx_graph::TxGraph"]],["impl<'a, T, A> Unpin for TxNode<'a, T, A>",1,["bdk_chain::tx_graph::TxNode"]],["impl<'a, T, A> Unpin for CanonicalTx<'a, T, A>",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<A> Unpin for Additions<A>",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, A, F> Unpin for TxDescendants<'g, A, F>where
F: Unpin,",1,["bdk_chain::tx_graph::TxDescendants"]]],
"bdk_coin_select":[["impl Unpin for WeightedValue",1,["bdk_coin_select::coin_selector::WeightedValue"]],["impl Unpin for CoinSelectorOpt",1,["bdk_coin_select::coin_selector::CoinSelectorOpt"]],["impl<'a> Unpin for CoinSelector<'a>",1,["bdk_coin_select::coin_selector::CoinSelector"]],["impl Unpin for SelectionError",1,["bdk_coin_select::coin_selector::SelectionError"]],["impl Unpin for SelectionConstraint",1,["bdk_coin_select::coin_selector::SelectionConstraint"]],["impl Unpin for Selection",1,["bdk_coin_select::coin_selector::Selection"]],["impl Unpin for ExcessStrategyKind",1,["bdk_coin_select::coin_selector::ExcessStrategyKind"]],["impl Unpin for ExcessStrategy",1,["bdk_coin_select::coin_selector::ExcessStrategy"]],["impl Unpin for BranchStrategy",1,["bdk_coin_select::bnb::BranchStrategy"]],["impl<'c, S> Unpin for Bnb<'c, S>where
S: Unpin,",1,["bdk_coin_select::bnb::Bnb"]],["impl<'c, 'f, S> Unpin for BnbIter<'c, 'f, S>where
S: Unpin,
'c: 'f,",1,["bdk_coin_select::bnb::BnbIter"]],["impl Unpin for BnbLimit",1,["bdk_coin_select::bnb::BnbLimit"]]],
"bdk_electrum":[["impl<K, P> Unpin for ElectrumUpdate<K, P>where
P: Unpin,",1,["bdk_electrum::ElectrumUpdate"]]],
"bdk_file_store":[["impl<K, P> Unpin for KeychainStore<K, P>where
K: Unpin,
P: Unpin,",1,["bdk_file_store::file_store::KeychainStore"]],["impl Unpin for FileError",1,["bdk_file_store::file_store::FileError"]],["impl Unpin for IterError",1,["bdk_file_store::file_store::IterError"]],["impl<'a, V> Unpin for EntryIter<'a, V>where
V: Unpin,",1,["bdk_file_store::file_store::EntryIter"]]],
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/ops/deref/trait.Deref.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/ops/deref/trait.Deref.js
index dc6c5312e6..84bee7a628 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/ops/deref/trait.Deref.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/ops/deref/trait.Deref.js
@@ -1,4 +1,4 @@
(function() {var implementors = {
"bdk":[["impl<K, Ctx: ScriptContext> Deref for GeneratedKey<K, Ctx>"],["impl<S: Sized + Debug + Clone> Deref for SignerWrapper<S>"],["impl Deref for AddressInfo"]],
-"bdk_chain":[["impl<K> Deref for KeychainTxOutIndex<K>"]]
+"bdk_chain":[["impl<K> Deref for KeychainTxOutIndex<K>"],["impl<'a, T, A> Deref for TxNode<'a, T, A>"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js
index bf72d94f56..408db434ef 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js
@@ -1,6 +1,6 @@
(function() {var implementors = {
"bdk":[["impl RefUnwindSafe for Error",1,["bdk::error::Error"]],["impl RefUnwindSafe for Error",1,["bdk::descriptor::error::Error"]],["impl RefUnwindSafe for PkOrF",1,["bdk::descriptor::policy::PkOrF"]],["impl RefUnwindSafe for SatisfiableItem",1,["bdk::descriptor::policy::SatisfiableItem"]],["impl RefUnwindSafe for Satisfaction",1,["bdk::descriptor::policy::Satisfaction"]],["impl RefUnwindSafe for Policy",1,["bdk::descriptor::policy::Policy"]],["impl RefUnwindSafe for Condition",1,["bdk::descriptor::policy::Condition"]],["impl RefUnwindSafe for PolicyError",1,["bdk::descriptor::policy::PolicyError"]],["impl<'a> RefUnwindSafe for BuildSatisfaction<'a>",1,["bdk::descriptor::policy::BuildSatisfaction"]],["impl<K> RefUnwindSafe for P2Pkh<K>where
K: RefUnwindSafe,",1,["bdk::descriptor::template::P2Pkh"]],["impl<K> RefUnwindSafe for P2Wpkh_P2Sh<K>where
K: RefUnwindSafe,",1,["bdk::descriptor::template::P2Wpkh_P2Sh"]],["impl<K> RefUnwindSafe for P2Wpkh<K>where
K: RefUnwindSafe,",1,["bdk::descriptor::template::P2Wpkh"]],["impl<K> RefUnwindSafe for Bip44<K>where
K: RefUnwindSafe,",1,["bdk::descriptor::template::Bip44"]],["impl<K> RefUnwindSafe for Bip44Public<K>where
K: RefUnwindSafe,",1,["bdk::descriptor::template::Bip44Public"]],["impl<K> RefUnwindSafe for Bip49<K>where
K: RefUnwindSafe,",1,["bdk::descriptor::template::Bip49"]],["impl<K> RefUnwindSafe for Bip49Public<K>where
K: RefUnwindSafe,",1,["bdk::descriptor::template::Bip49Public"]],["impl<K> RefUnwindSafe for Bip84<K>where
K: RefUnwindSafe,",1,["bdk::descriptor::template::Bip84"]],["impl<K> RefUnwindSafe for Bip84Public<K>where
K: RefUnwindSafe,",1,["bdk::descriptor::template::Bip84Public"]],["impl<Ctx> RefUnwindSafe for DescriptorKey<Ctx>where
Ctx: RefUnwindSafe,",1,["bdk::keys::DescriptorKey"]],["impl RefUnwindSafe for ScriptContextEnum",1,["bdk::keys::ScriptContextEnum"]],["impl<Ctx> RefUnwindSafe for ExtendedKey<Ctx>where
Ctx: RefUnwindSafe,",1,["bdk::keys::ExtendedKey"]],["impl<K, Ctx> RefUnwindSafe for GeneratedKey<K, Ctx>where
Ctx: RefUnwindSafe,
K: RefUnwindSafe,",1,["bdk::keys::GeneratedKey"]],["impl RefUnwindSafe for PrivateKeyGenerateOptions",1,["bdk::keys::PrivateKeyGenerateOptions"]],["impl RefUnwindSafe for KeyError",1,["bdk::keys::KeyError"]],["impl RefUnwindSafe for KeychainKind",1,["bdk::types::KeychainKind"]],["impl RefUnwindSafe for FeeRate",1,["bdk::types::FeeRate"]],["impl RefUnwindSafe for LocalUtxo",1,["bdk::types::LocalUtxo"]],["impl RefUnwindSafe for WeightedUtxo",1,["bdk::types::WeightedUtxo"]],["impl RefUnwindSafe for Utxo",1,["bdk::types::Utxo"]],["impl RefUnwindSafe for TransactionDetails",1,["bdk::types::TransactionDetails"]],["impl RefUnwindSafe for Excess",1,["bdk::wallet::coin_selection::Excess"]],["impl RefUnwindSafe for CoinSelectionResult",1,["bdk::wallet::coin_selection::CoinSelectionResult"]],["impl RefUnwindSafe for LargestFirstCoinSelection",1,["bdk::wallet::coin_selection::LargestFirstCoinSelection"]],["impl RefUnwindSafe for OldestFirstCoinSelection",1,["bdk::wallet::coin_selection::OldestFirstCoinSelection"]],["impl RefUnwindSafe for BranchAndBoundCoinSelection",1,["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]],["impl RefUnwindSafe for FullyNodedExport",1,["bdk::wallet::export::FullyNodedExport"]],["impl RefUnwindSafe for SignerId",1,["bdk::wallet::signer::SignerId"]],["impl RefUnwindSafe for SignerError",1,["bdk::wallet::signer::SignerError"]],["impl RefUnwindSafe for SignerContext",1,["bdk::wallet::signer::SignerContext"]],["impl<S> RefUnwindSafe for SignerWrapper<S>where
S: RefUnwindSafe,",1,["bdk::wallet::signer::SignerWrapper"]],["impl RefUnwindSafe for SignerOrdering",1,["bdk::wallet::signer::SignerOrdering"]],["impl !RefUnwindSafe for SignersContainer",1,["bdk::wallet::signer::SignersContainer"]],["impl RefUnwindSafe for SignOptions",1,["bdk::wallet::signer::SignOptions"]],["impl RefUnwindSafe for TapLeavesOptions",1,["bdk::wallet::signer::TapLeavesOptions"]],["impl RefUnwindSafe for CreateTx",1,["bdk::wallet::tx_builder::CreateTx"]],["impl RefUnwindSafe for BumpFee",1,["bdk::wallet::tx_builder::BumpFee"]],["impl<'a, D, Cs, Ctx> !RefUnwindSafe for TxBuilder<'a, D, Cs, Ctx>",1,["bdk::wallet::tx_builder::TxBuilder"]],["impl RefUnwindSafe for TxOrdering",1,["bdk::wallet::tx_builder::TxOrdering"]],["impl RefUnwindSafe for ChangeSpendPolicy",1,["bdk::wallet::tx_builder::ChangeSpendPolicy"]],["impl<D = ()> !RefUnwindSafe for Wallet<D>",1,["bdk::wallet::Wallet"]],["impl RefUnwindSafe for AddressIndex",1,["bdk::wallet::AddressIndex"]],["impl RefUnwindSafe for AddressInfo",1,["bdk::wallet::AddressInfo"]],["impl<P> RefUnwindSafe for NewError<P>where
P: RefUnwindSafe,",1,["bdk::wallet::NewError"]]],
-"bdk_chain":[["impl<P> RefUnwindSafe for ChainGraph<P>where
P: RefUnwindSafe,",1,["bdk_chain::chain_graph::ChainGraph"]],["impl<P> RefUnwindSafe for ChangeSet<P>where
P: RefUnwindSafe,",1,["bdk_chain::chain_graph::ChangeSet"]],["impl<P> RefUnwindSafe for NewError<P>where
P: RefUnwindSafe,",1,["bdk_chain::chain_graph::NewError"]],["impl<P> RefUnwindSafe for InsertTxError<P>where
P: RefUnwindSafe,",1,["bdk_chain::chain_graph::InsertTxError"]],["impl<P> RefUnwindSafe for UpdateError<P>where
P: RefUnwindSafe,",1,["bdk_chain::chain_graph::UpdateError"]],["impl<P> RefUnwindSafe for UnresolvableConflict<P>where
P: RefUnwindSafe,",1,["bdk_chain::chain_graph::UnresolvableConflict"]],["impl<I> RefUnwindSafe for SpkTxOutIndex<I>where
I: RefUnwindSafe,",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl RefUnwindSafe for TxHeight",1,["bdk_chain::chain_data::TxHeight"]],["impl RefUnwindSafe for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl RefUnwindSafe for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl<I> RefUnwindSafe for FullTxOut<I>where
I: RefUnwindSafe,",1,["bdk_chain::chain_data::FullTxOut"]],["impl<K, P, B> RefUnwindSafe for Persist<K, P, B>where
B: RefUnwindSafe,
K: RefUnwindSafe,
P: RefUnwindSafe,",1,["bdk_chain::keychain::persist::Persist"]],["impl<K, P> RefUnwindSafe for KeychainTracker<K, P>where
K: RefUnwindSafe,
P: RefUnwindSafe,",1,["bdk_chain::keychain::tracker::KeychainTracker"]],["impl<K> RefUnwindSafe for KeychainTxOutIndex<K>where
K: RefUnwindSafe,",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> RefUnwindSafe for DerivationAdditions<K>where
K: RefUnwindSafe,",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, P> RefUnwindSafe for KeychainScan<K, P>where
K: RefUnwindSafe,
P: RefUnwindSafe,",1,["bdk_chain::keychain::KeychainScan"]],["impl<K, P> RefUnwindSafe for KeychainChangeSet<K, P>where
K: RefUnwindSafe,
P: RefUnwindSafe,",1,["bdk_chain::keychain::KeychainChangeSet"]],["impl RefUnwindSafe for Balance",1,["bdk_chain::keychain::Balance"]],["impl<P> RefUnwindSafe for SparseChain<P>where
P: RefUnwindSafe,",1,["bdk_chain::sparse_chain::SparseChain"]],["impl<P> RefUnwindSafe for InsertTxError<P>where
P: RefUnwindSafe,",1,["bdk_chain::sparse_chain::InsertTxError"]],["impl RefUnwindSafe for InsertCheckpointError",1,["bdk_chain::sparse_chain::InsertCheckpointError"]],["impl<P> RefUnwindSafe for UpdateError<P>where
P: RefUnwindSafe,",1,["bdk_chain::sparse_chain::UpdateError"]],["impl<P> RefUnwindSafe for ChangeSet<P>where
P: RefUnwindSafe,",1,["bdk_chain::sparse_chain::ChangeSet"]],["impl RefUnwindSafe for TxGraph",1,["bdk_chain::tx_graph::TxGraph"]],["impl RefUnwindSafe for Additions",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, F> RefUnwindSafe for TxDescendants<'g, F>where
F: RefUnwindSafe,",1,["bdk_chain::tx_graph::TxDescendants"]]],
+"bdk_chain":[["impl<P> RefUnwindSafe for ChainGraph<P>where
P: RefUnwindSafe,",1,["bdk_chain::chain_graph::ChainGraph"]],["impl<P> RefUnwindSafe for ChangeSet<P>where
P: RefUnwindSafe,",1,["bdk_chain::chain_graph::ChangeSet"]],["impl<P> RefUnwindSafe for NewError<P>where
P: RefUnwindSafe,",1,["bdk_chain::chain_graph::NewError"]],["impl<P> RefUnwindSafe for InsertTxError<P>where
P: RefUnwindSafe,",1,["bdk_chain::chain_graph::InsertTxError"]],["impl<P> RefUnwindSafe for UpdateError<P>where
P: RefUnwindSafe,",1,["bdk_chain::chain_graph::UpdateError"]],["impl<P> RefUnwindSafe for UnresolvableConflict<P>where
P: RefUnwindSafe,",1,["bdk_chain::chain_graph::UnresolvableConflict"]],["impl<I> RefUnwindSafe for SpkTxOutIndex<I>where
I: RefUnwindSafe,",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<A> RefUnwindSafe for ObservedAs<A>where
A: RefUnwindSafe,",1,["bdk_chain::chain_data::ObservedAs"]],["impl RefUnwindSafe for TxHeight",1,["bdk_chain::chain_data::TxHeight"]],["impl RefUnwindSafe for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl RefUnwindSafe for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl<P> RefUnwindSafe for FullTxOut<P>where
P: RefUnwindSafe,",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A, I> RefUnwindSafe for IndexedTxGraph<A, I>where
A: RefUnwindSafe,
I: RefUnwindSafe,",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> RefUnwindSafe for IndexedAdditions<A, IA>where
A: RefUnwindSafe,
IA: RefUnwindSafe,",1,["bdk_chain::indexed_tx_graph::IndexedAdditions"]],["impl<K, P, B> RefUnwindSafe for Persist<K, P, B>where
B: RefUnwindSafe,
K: RefUnwindSafe,
P: RefUnwindSafe,",1,["bdk_chain::keychain::persist::Persist"]],["impl<K, P> RefUnwindSafe for KeychainTracker<K, P>where
K: RefUnwindSafe,
P: RefUnwindSafe,",1,["bdk_chain::keychain::tracker::KeychainTracker"]],["impl<K> RefUnwindSafe for KeychainTxOutIndex<K>where
K: RefUnwindSafe,",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> RefUnwindSafe for DerivationAdditions<K>where
K: RefUnwindSafe,",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, P> RefUnwindSafe for KeychainScan<K, P>where
K: RefUnwindSafe,
P: RefUnwindSafe,",1,["bdk_chain::keychain::KeychainScan"]],["impl<K, P> RefUnwindSafe for KeychainChangeSet<K, P>where
K: RefUnwindSafe,
P: RefUnwindSafe,",1,["bdk_chain::keychain::KeychainChangeSet"]],["impl RefUnwindSafe for Balance",1,["bdk_chain::keychain::Balance"]],["impl RefUnwindSafe for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl RefUnwindSafe for UpdateNotConnectedError",1,["bdk_chain::local_chain::UpdateNotConnectedError"]],["impl<P> RefUnwindSafe for SparseChain<P>where
P: RefUnwindSafe,",1,["bdk_chain::sparse_chain::SparseChain"]],["impl<P> RefUnwindSafe for InsertTxError<P>where
P: RefUnwindSafe,",1,["bdk_chain::sparse_chain::InsertTxError"]],["impl RefUnwindSafe for InsertCheckpointError",1,["bdk_chain::sparse_chain::InsertCheckpointError"]],["impl<P> RefUnwindSafe for UpdateError<P>where
P: RefUnwindSafe,",1,["bdk_chain::sparse_chain::UpdateError"]],["impl<P> RefUnwindSafe for ChangeSet<P>where
P: RefUnwindSafe,",1,["bdk_chain::sparse_chain::ChangeSet"]],["impl<A> RefUnwindSafe for TxGraph<A>where
A: RefUnwindSafe,",1,["bdk_chain::tx_graph::TxGraph"]],["impl<'a, T, A> RefUnwindSafe for TxNode<'a, T, A>where
A: RefUnwindSafe,
T: RefUnwindSafe,",1,["bdk_chain::tx_graph::TxNode"]],["impl<'a, T, A> RefUnwindSafe for CanonicalTx<'a, T, A>where
A: RefUnwindSafe,
T: RefUnwindSafe,",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<A> RefUnwindSafe for Additions<A>where
A: RefUnwindSafe,",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, A, F> RefUnwindSafe for TxDescendants<'g, A, F>where
A: RefUnwindSafe,
F: RefUnwindSafe,",1,["bdk_chain::tx_graph::TxDescendants"]]],
"bdk_coin_select":[["impl RefUnwindSafe for WeightedValue",1,["bdk_coin_select::coin_selector::WeightedValue"]],["impl RefUnwindSafe for CoinSelectorOpt",1,["bdk_coin_select::coin_selector::CoinSelectorOpt"]],["impl<'a> RefUnwindSafe for CoinSelector<'a>",1,["bdk_coin_select::coin_selector::CoinSelector"]],["impl RefUnwindSafe for SelectionError",1,["bdk_coin_select::coin_selector::SelectionError"]],["impl RefUnwindSafe for SelectionConstraint",1,["bdk_coin_select::coin_selector::SelectionConstraint"]],["impl RefUnwindSafe for Selection",1,["bdk_coin_select::coin_selector::Selection"]],["impl RefUnwindSafe for ExcessStrategyKind",1,["bdk_coin_select::coin_selector::ExcessStrategyKind"]],["impl RefUnwindSafe for ExcessStrategy",1,["bdk_coin_select::coin_selector::ExcessStrategy"]],["impl RefUnwindSafe for BranchStrategy",1,["bdk_coin_select::bnb::BranchStrategy"]],["impl<'c, S> RefUnwindSafe for Bnb<'c, S>where
S: RefUnwindSafe,",1,["bdk_coin_select::bnb::Bnb"]],["impl<'c, 'f, S> !RefUnwindSafe for BnbIter<'c, 'f, S>",1,["bdk_coin_select::bnb::BnbIter"]],["impl RefUnwindSafe for BnbLimit",1,["bdk_coin_select::bnb::BnbLimit"]]],
"bdk_electrum":[["impl<K, P> RefUnwindSafe for ElectrumUpdate<K, P>where
K: RefUnwindSafe,
P: RefUnwindSafe,",1,["bdk_electrum::ElectrumUpdate"]]],
"bdk_file_store":[["impl<K, P> RefUnwindSafe for KeychainStore<K, P>where
K: RefUnwindSafe,
P: RefUnwindSafe,",1,["bdk_file_store::file_store::KeychainStore"]],["impl !RefUnwindSafe for FileError",1,["bdk_file_store::file_store::FileError"]],["impl !RefUnwindSafe for IterError",1,["bdk_file_store::file_store::IterError"]],["impl<'a, V> RefUnwindSafe for EntryIter<'a, V>where
V: RefUnwindSafe,",1,["bdk_file_store::file_store::EntryIter"]]],
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.UnwindSafe.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.UnwindSafe.js
index d9a8b33f69..a97d1bc761 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.UnwindSafe.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.UnwindSafe.js
@@ -1,6 +1,6 @@
(function() {var implementors = {
"bdk":[["impl UnwindSafe for Error",1,["bdk::error::Error"]],["impl UnwindSafe for Error",1,["bdk::descriptor::error::Error"]],["impl UnwindSafe for PkOrF",1,["bdk::descriptor::policy::PkOrF"]],["impl UnwindSafe for SatisfiableItem",1,["bdk::descriptor::policy::SatisfiableItem"]],["impl UnwindSafe for Satisfaction",1,["bdk::descriptor::policy::Satisfaction"]],["impl UnwindSafe for Policy",1,["bdk::descriptor::policy::Policy"]],["impl UnwindSafe for Condition",1,["bdk::descriptor::policy::Condition"]],["impl UnwindSafe for PolicyError",1,["bdk::descriptor::policy::PolicyError"]],["impl<'a> UnwindSafe for BuildSatisfaction<'a>",1,["bdk::descriptor::policy::BuildSatisfaction"]],["impl<K> UnwindSafe for P2Pkh<K>where
K: UnwindSafe,",1,["bdk::descriptor::template::P2Pkh"]],["impl<K> UnwindSafe for P2Wpkh_P2Sh<K>where
K: UnwindSafe,",1,["bdk::descriptor::template::P2Wpkh_P2Sh"]],["impl<K> UnwindSafe for P2Wpkh<K>where
K: UnwindSafe,",1,["bdk::descriptor::template::P2Wpkh"]],["impl<K> UnwindSafe for Bip44<K>where
K: UnwindSafe,",1,["bdk::descriptor::template::Bip44"]],["impl<K> UnwindSafe for Bip44Public<K>where
K: UnwindSafe,",1,["bdk::descriptor::template::Bip44Public"]],["impl<K> UnwindSafe for Bip49<K>where
K: UnwindSafe,",1,["bdk::descriptor::template::Bip49"]],["impl<K> UnwindSafe for Bip49Public<K>where
K: UnwindSafe,",1,["bdk::descriptor::template::Bip49Public"]],["impl<K> UnwindSafe for Bip84<K>where
K: UnwindSafe,",1,["bdk::descriptor::template::Bip84"]],["impl<K> UnwindSafe for Bip84Public<K>where
K: UnwindSafe,",1,["bdk::descriptor::template::Bip84Public"]],["impl<Ctx> UnwindSafe for DescriptorKey<Ctx>where
Ctx: UnwindSafe,",1,["bdk::keys::DescriptorKey"]],["impl UnwindSafe for ScriptContextEnum",1,["bdk::keys::ScriptContextEnum"]],["impl<Ctx> UnwindSafe for ExtendedKey<Ctx>where
Ctx: UnwindSafe,",1,["bdk::keys::ExtendedKey"]],["impl<K, Ctx> UnwindSafe for GeneratedKey<K, Ctx>where
Ctx: UnwindSafe,
K: UnwindSafe,",1,["bdk::keys::GeneratedKey"]],["impl UnwindSafe for PrivateKeyGenerateOptions",1,["bdk::keys::PrivateKeyGenerateOptions"]],["impl UnwindSafe for KeyError",1,["bdk::keys::KeyError"]],["impl UnwindSafe for KeychainKind",1,["bdk::types::KeychainKind"]],["impl UnwindSafe for FeeRate",1,["bdk::types::FeeRate"]],["impl UnwindSafe for LocalUtxo",1,["bdk::types::LocalUtxo"]],["impl UnwindSafe for WeightedUtxo",1,["bdk::types::WeightedUtxo"]],["impl UnwindSafe for Utxo",1,["bdk::types::Utxo"]],["impl UnwindSafe for TransactionDetails",1,["bdk::types::TransactionDetails"]],["impl UnwindSafe for Excess",1,["bdk::wallet::coin_selection::Excess"]],["impl UnwindSafe for CoinSelectionResult",1,["bdk::wallet::coin_selection::CoinSelectionResult"]],["impl UnwindSafe for LargestFirstCoinSelection",1,["bdk::wallet::coin_selection::LargestFirstCoinSelection"]],["impl UnwindSafe for OldestFirstCoinSelection",1,["bdk::wallet::coin_selection::OldestFirstCoinSelection"]],["impl UnwindSafe for BranchAndBoundCoinSelection",1,["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]],["impl UnwindSafe for FullyNodedExport",1,["bdk::wallet::export::FullyNodedExport"]],["impl UnwindSafe for SignerId",1,["bdk::wallet::signer::SignerId"]],["impl UnwindSafe for SignerError",1,["bdk::wallet::signer::SignerError"]],["impl UnwindSafe for SignerContext",1,["bdk::wallet::signer::SignerContext"]],["impl<S> UnwindSafe for SignerWrapper<S>where
S: UnwindSafe,",1,["bdk::wallet::signer::SignerWrapper"]],["impl UnwindSafe for SignerOrdering",1,["bdk::wallet::signer::SignerOrdering"]],["impl !UnwindSafe for SignersContainer",1,["bdk::wallet::signer::SignersContainer"]],["impl UnwindSafe for SignOptions",1,["bdk::wallet::signer::SignOptions"]],["impl UnwindSafe for TapLeavesOptions",1,["bdk::wallet::signer::TapLeavesOptions"]],["impl UnwindSafe for CreateTx",1,["bdk::wallet::tx_builder::CreateTx"]],["impl UnwindSafe for BumpFee",1,["bdk::wallet::tx_builder::BumpFee"]],["impl<'a, D, Cs, Ctx> !UnwindSafe for TxBuilder<'a, D, Cs, Ctx>",1,["bdk::wallet::tx_builder::TxBuilder"]],["impl UnwindSafe for TxOrdering",1,["bdk::wallet::tx_builder::TxOrdering"]],["impl UnwindSafe for ChangeSpendPolicy",1,["bdk::wallet::tx_builder::ChangeSpendPolicy"]],["impl<D = ()> !UnwindSafe for Wallet<D>",1,["bdk::wallet::Wallet"]],["impl UnwindSafe for AddressIndex",1,["bdk::wallet::AddressIndex"]],["impl UnwindSafe for AddressInfo",1,["bdk::wallet::AddressInfo"]],["impl<P> UnwindSafe for NewError<P>where
P: UnwindSafe,",1,["bdk::wallet::NewError"]]],
-"bdk_chain":[["impl<P> UnwindSafe for ChainGraph<P>where
P: UnwindSafe + RefUnwindSafe,",1,["bdk_chain::chain_graph::ChainGraph"]],["impl<P> UnwindSafe for ChangeSet<P>where
P: RefUnwindSafe,",1,["bdk_chain::chain_graph::ChangeSet"]],["impl<P> UnwindSafe for NewError<P>where
P: UnwindSafe,",1,["bdk_chain::chain_graph::NewError"]],["impl<P> UnwindSafe for InsertTxError<P>where
P: UnwindSafe,",1,["bdk_chain::chain_graph::InsertTxError"]],["impl<P> UnwindSafe for UpdateError<P>where
P: UnwindSafe,",1,["bdk_chain::chain_graph::UpdateError"]],["impl<P> UnwindSafe for UnresolvableConflict<P>where
P: UnwindSafe,",1,["bdk_chain::chain_graph::UnresolvableConflict"]],["impl<I> UnwindSafe for SpkTxOutIndex<I>where
I: UnwindSafe + RefUnwindSafe,",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl UnwindSafe for TxHeight",1,["bdk_chain::chain_data::TxHeight"]],["impl UnwindSafe for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl UnwindSafe for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl<I> UnwindSafe for FullTxOut<I>where
I: UnwindSafe,",1,["bdk_chain::chain_data::FullTxOut"]],["impl<K, P, B> UnwindSafe for Persist<K, P, B>where
B: UnwindSafe,
K: RefUnwindSafe,
P: RefUnwindSafe,",1,["bdk_chain::keychain::persist::Persist"]],["impl<K, P> UnwindSafe for KeychainTracker<K, P>where
K: UnwindSafe + RefUnwindSafe,
P: UnwindSafe + RefUnwindSafe,",1,["bdk_chain::keychain::tracker::KeychainTracker"]],["impl<K> UnwindSafe for KeychainTxOutIndex<K>where
K: UnwindSafe + RefUnwindSafe,",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> UnwindSafe for DerivationAdditions<K>where
K: RefUnwindSafe,",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, P> UnwindSafe for KeychainScan<K, P>where
K: RefUnwindSafe,
P: UnwindSafe + RefUnwindSafe,",1,["bdk_chain::keychain::KeychainScan"]],["impl<K, P> UnwindSafe for KeychainChangeSet<K, P>where
K: RefUnwindSafe,
P: RefUnwindSafe,",1,["bdk_chain::keychain::KeychainChangeSet"]],["impl UnwindSafe for Balance",1,["bdk_chain::keychain::Balance"]],["impl<P> UnwindSafe for SparseChain<P>where
P: UnwindSafe + RefUnwindSafe,",1,["bdk_chain::sparse_chain::SparseChain"]],["impl<P> UnwindSafe for InsertTxError<P>where
P: UnwindSafe,",1,["bdk_chain::sparse_chain::InsertTxError"]],["impl UnwindSafe for InsertCheckpointError",1,["bdk_chain::sparse_chain::InsertCheckpointError"]],["impl<P> UnwindSafe for UpdateError<P>where
P: UnwindSafe,",1,["bdk_chain::sparse_chain::UpdateError"]],["impl<P> UnwindSafe for ChangeSet<P>where
P: RefUnwindSafe,",1,["bdk_chain::sparse_chain::ChangeSet"]],["impl UnwindSafe for TxGraph",1,["bdk_chain::tx_graph::TxGraph"]],["impl UnwindSafe for Additions",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, F> UnwindSafe for TxDescendants<'g, F>where
F: UnwindSafe,",1,["bdk_chain::tx_graph::TxDescendants"]]],
+"bdk_chain":[["impl<P> UnwindSafe for ChainGraph<P>where
P: UnwindSafe + RefUnwindSafe,",1,["bdk_chain::chain_graph::ChainGraph"]],["impl<P> UnwindSafe for ChangeSet<P>where
P: RefUnwindSafe,",1,["bdk_chain::chain_graph::ChangeSet"]],["impl<P> UnwindSafe for NewError<P>where
P: UnwindSafe,",1,["bdk_chain::chain_graph::NewError"]],["impl<P> UnwindSafe for InsertTxError<P>where
P: UnwindSafe,",1,["bdk_chain::chain_graph::InsertTxError"]],["impl<P> UnwindSafe for UpdateError<P>where
P: UnwindSafe,",1,["bdk_chain::chain_graph::UpdateError"]],["impl<P> UnwindSafe for UnresolvableConflict<P>where
P: UnwindSafe,",1,["bdk_chain::chain_graph::UnresolvableConflict"]],["impl<I> UnwindSafe for SpkTxOutIndex<I>where
I: UnwindSafe + RefUnwindSafe,",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<A> UnwindSafe for ObservedAs<A>where
A: UnwindSafe,",1,["bdk_chain::chain_data::ObservedAs"]],["impl UnwindSafe for TxHeight",1,["bdk_chain::chain_data::TxHeight"]],["impl UnwindSafe for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl UnwindSafe for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl<P> UnwindSafe for FullTxOut<P>where
P: UnwindSafe,",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A, I> UnwindSafe for IndexedTxGraph<A, I>where
A: RefUnwindSafe,
I: UnwindSafe,",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> UnwindSafe for IndexedAdditions<A, IA>where
A: RefUnwindSafe,
IA: UnwindSafe,",1,["bdk_chain::indexed_tx_graph::IndexedAdditions"]],["impl<K, P, B> UnwindSafe for Persist<K, P, B>where
B: UnwindSafe,
K: RefUnwindSafe,
P: RefUnwindSafe,",1,["bdk_chain::keychain::persist::Persist"]],["impl<K, P> UnwindSafe for KeychainTracker<K, P>where
K: UnwindSafe + RefUnwindSafe,
P: UnwindSafe + RefUnwindSafe,",1,["bdk_chain::keychain::tracker::KeychainTracker"]],["impl<K> UnwindSafe for KeychainTxOutIndex<K>where
K: UnwindSafe + RefUnwindSafe,",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> UnwindSafe for DerivationAdditions<K>where
K: RefUnwindSafe,",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, P> UnwindSafe for KeychainScan<K, P>where
K: RefUnwindSafe,
P: UnwindSafe + RefUnwindSafe,",1,["bdk_chain::keychain::KeychainScan"]],["impl<K, P> UnwindSafe for KeychainChangeSet<K, P>where
K: RefUnwindSafe,
P: RefUnwindSafe,",1,["bdk_chain::keychain::KeychainChangeSet"]],["impl UnwindSafe for Balance",1,["bdk_chain::keychain::Balance"]],["impl UnwindSafe for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl UnwindSafe for UpdateNotConnectedError",1,["bdk_chain::local_chain::UpdateNotConnectedError"]],["impl<P> UnwindSafe for SparseChain<P>where
P: UnwindSafe + RefUnwindSafe,",1,["bdk_chain::sparse_chain::SparseChain"]],["impl<P> UnwindSafe for InsertTxError<P>where
P: UnwindSafe,",1,["bdk_chain::sparse_chain::InsertTxError"]],["impl UnwindSafe for InsertCheckpointError",1,["bdk_chain::sparse_chain::InsertCheckpointError"]],["impl<P> UnwindSafe for UpdateError<P>where
P: UnwindSafe,",1,["bdk_chain::sparse_chain::UpdateError"]],["impl<P> UnwindSafe for ChangeSet<P>where
P: RefUnwindSafe,",1,["bdk_chain::sparse_chain::ChangeSet"]],["impl<A> UnwindSafe for TxGraph<A>where
A: RefUnwindSafe,",1,["bdk_chain::tx_graph::TxGraph"]],["impl<'a, T, A> UnwindSafe for TxNode<'a, T, A>where
A: RefUnwindSafe,
T: RefUnwindSafe,",1,["bdk_chain::tx_graph::TxNode"]],["impl<'a, T, A> UnwindSafe for CanonicalTx<'a, T, A>where
A: RefUnwindSafe,
T: RefUnwindSafe,",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<A> UnwindSafe for Additions<A>where
A: RefUnwindSafe,",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, A, F> UnwindSafe for TxDescendants<'g, A, F>where
A: RefUnwindSafe,
F: UnwindSafe,",1,["bdk_chain::tx_graph::TxDescendants"]]],
"bdk_coin_select":[["impl UnwindSafe for WeightedValue",1,["bdk_coin_select::coin_selector::WeightedValue"]],["impl UnwindSafe for CoinSelectorOpt",1,["bdk_coin_select::coin_selector::CoinSelectorOpt"]],["impl<'a> UnwindSafe for CoinSelector<'a>",1,["bdk_coin_select::coin_selector::CoinSelector"]],["impl UnwindSafe for SelectionError",1,["bdk_coin_select::coin_selector::SelectionError"]],["impl UnwindSafe for SelectionConstraint",1,["bdk_coin_select::coin_selector::SelectionConstraint"]],["impl UnwindSafe for Selection",1,["bdk_coin_select::coin_selector::Selection"]],["impl UnwindSafe for ExcessStrategyKind",1,["bdk_coin_select::coin_selector::ExcessStrategyKind"]],["impl UnwindSafe for ExcessStrategy",1,["bdk_coin_select::coin_selector::ExcessStrategy"]],["impl UnwindSafe for BranchStrategy",1,["bdk_coin_select::bnb::BranchStrategy"]],["impl<'c, S> UnwindSafe for Bnb<'c, S>where
S: UnwindSafe,",1,["bdk_coin_select::bnb::Bnb"]],["impl<'c, 'f, S> !UnwindSafe for BnbIter<'c, 'f, S>",1,["bdk_coin_select::bnb::BnbIter"]],["impl UnwindSafe for BnbLimit",1,["bdk_coin_select::bnb::BnbLimit"]]],
"bdk_electrum":[["impl<K, P> UnwindSafe for ElectrumUpdate<K, P>where
K: RefUnwindSafe,
P: UnwindSafe + RefUnwindSafe,",1,["bdk_electrum::ElectrumUpdate"]]],
"bdk_file_store":[["impl<K, P> UnwindSafe for KeychainStore<K, P>where
K: UnwindSafe,
P: UnwindSafe,",1,["bdk_file_store::file_store::KeychainStore"]],["impl !UnwindSafe for FileError",1,["bdk_file_store::file_store::FileError"]],["impl !UnwindSafe for IterError",1,["bdk_file_store::file_store::IterError"]],["impl<'a, V> !UnwindSafe for EntryIter<'a, V>",1,["bdk_file_store::file_store::EntryIter"]]],
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/de/trait.Deserialize.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/de/trait.Deserialize.js
index 646f688fe3..5aaa535939 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/de/trait.Deserialize.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/de/trait.Deserialize.js
@@ -1,5 +1,5 @@
(function() {var implementors = {
"bdk":[["impl<'de> Deserialize<'de> for KeychainKind"],["impl<'de> Deserialize<'de> for LocalUtxo"],["impl<'de> Deserialize<'de> for TransactionDetails"],["impl<'de> Deserialize<'de> for FullyNodedExport"]],
-"bdk_chain":[["impl<'de, P> Deserialize<'de> for ChangeSet<P>where
P: Deserialize<'de>,"],["impl<'de> Deserialize<'de> for TxHeight"],["impl<'de> Deserialize<'de> for ConfirmationTime"],["impl<'de> Deserialize<'de> for BlockId"],["impl<'de, K> Deserialize<'de> for DerivationAdditions<K>where
K: Ord + Deserialize<'de>,"],["impl<'de, K, P> Deserialize<'de> for KeychainChangeSet<K, P>where
K: Ord + Deserialize<'de>,
P: Deserialize<'de>,"],["impl<'de> Deserialize<'de> for Balance"],["impl<'de, P> Deserialize<'de> for ChangeSet<P>where
P: Deserialize<'de>,"],["impl<'de> Deserialize<'de> for Additions"]],
+"bdk_chain":[["impl<'de, P> Deserialize<'de> for ChangeSet<P>where
P: Deserialize<'de>,"],["impl<'de> Deserialize<'de> for TxHeight"],["impl<'de> Deserialize<'de> for ConfirmationTime"],["impl<'de> Deserialize<'de> for BlockId"],["impl<'de, A, IA> Deserialize<'de> for IndexedAdditions<A, IA>where
A: Ord + Deserialize<'de>,
IA: Deserialize<'de>,"],["impl<'de, K> Deserialize<'de> for DerivationAdditions<K>where
K: Ord + Deserialize<'de>,"],["impl<'de, K, P> Deserialize<'de> for KeychainChangeSet<K, P>where
K: Ord + Deserialize<'de>,
P: Deserialize<'de>,"],["impl<'de> Deserialize<'de> for Balance"],["impl<'de, P> Deserialize<'de> for ChangeSet<P>where
P: Deserialize<'de>,"],["impl<'de, A> Deserialize<'de> for Additions<A>where
A: Ord + Deserialize<'de>,"]],
"keychain_tracker_example_cli":[["impl<'de> Deserialize<'de> for Keychain"],["impl<'de> Deserialize<'de> for AddrsOutput"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/ser/trait.Serialize.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/ser/trait.Serialize.js
index 0183c9c920..0071e068b2 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/ser/trait.Serialize.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/ser/trait.Serialize.js
@@ -1,5 +1,5 @@
(function() {var implementors = {
"bdk":[["impl Serialize for PkOrF"],["impl Serialize for SatisfiableItem"],["impl Serialize for Satisfaction"],["impl Serialize for Policy"],["impl Serialize for Condition"],["impl Serialize for KeychainKind"],["impl Serialize for LocalUtxo"],["impl Serialize for TransactionDetails"],["impl Serialize for FullyNodedExport"]],
-"bdk_chain":[["impl<P> Serialize for ChangeSet<P>where
P: Serialize,"],["impl Serialize for TxHeight"],["impl Serialize for ConfirmationTime"],["impl Serialize for BlockId"],["impl<K> Serialize for DerivationAdditions<K>where
K: Ord + Serialize,"],["impl<K, P> Serialize for KeychainChangeSet<K, P>where
K: Ord + Serialize,
P: Serialize,"],["impl Serialize for Balance"],["impl<P> Serialize for ChangeSet<P>where
P: Serialize,"],["impl Serialize for Additions"]],
+"bdk_chain":[["impl<P> Serialize for ChangeSet<P>where
P: Serialize,"],["impl Serialize for TxHeight"],["impl Serialize for ConfirmationTime"],["impl Serialize for BlockId"],["impl<A, IA> Serialize for IndexedAdditions<A, IA>where
A: Ord + Serialize,
IA: Serialize,"],["impl<K> Serialize for DerivationAdditions<K>where
K: Ord + Serialize,"],["impl<K, P> Serialize for KeychainChangeSet<K, P>where
K: Ord + Serialize,
P: Serialize,"],["impl Serialize for Balance"],["impl<P> Serialize for ChangeSet<P>where
P: Serialize,"],["impl<A> Serialize for Additions<A>where
A: Ord + Serialize,"]],
"keychain_tracker_example_cli":[["impl Serialize for Keychain"],["impl Serialize for AddrsOutput"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/enum.EsploraCommands.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/enum.EsploraCommands.html
index 9251b64240..52b997ee28 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/enum.EsploraCommands.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/enum.EsploraCommands.html
@@ -18,11 +18,11 @@
§scan_options: ScanOptionsScans particular addresses using esplora API.
Trait Implementations§
source§impl Clone for EsploraCommands
source§fn clone(&self) -> EsploraCommands
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moresource§impl Debug for EsploraCommands
source§impl FromArgMatches for EsploraCommands
source§fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>
source§fn from_arg_matches_mut(
__clap_arg_matches: &mut ArgMatches
) -> Result<Self, Error>
source§fn update_from_arg_matches(
&mut self,
__clap_arg_matches: &ArgMatches
) -> Result<(), Error>
Assign values from ArgMatches to self.source§fn update_from_arg_matches_mut<'b>(
&mut self,
__clap_arg_matches: &mut ArgMatches
) -> Result<(), Error>
Assign values from ArgMatches to self.source§impl Subcommand for EsploraCommands
source§fn augment_subcommands<'b>(__clap_app: Command<'b>) -> Command<'b>
source§fn augment_subcommands_for_update<'b>(__clap_app: Command<'b>) -> Command<'b>
source§fn has_subcommand(__clap_name: &str) -> bool
Test whether Self can parse a specific subcommandAuto Trait Implementations§
§impl RefUnwindSafe for EsploraCommands
§impl Send for EsploraCommands
§impl Sync for EsploraCommands
§impl Unpin for EsploraCommands
§impl UnwindSafe for EsploraCommands
Blanket Implementations§
source§impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
§impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
source§impl<T> WithSubscriber for T
source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
source§fn with_current_subscriber(self) -> WithDispatch<Self>
\ No newline at end of file
+§impl<T> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
§fn with_current_subscriber(self) -> WithDispatch<Self>
Attaches the current default Subscriber to this type, returning a
+[WithDispatch] wrapper. Read more
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/struct.ScanOptions.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/struct.ScanOptions.html
index eb2e201057..bf607c1823 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/struct.ScanOptions.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/struct.ScanOptions.html
@@ -3,11 +3,11 @@
}Fields§
§parallel_requests: usizeTrait Implementations§
source§impl Args for ScanOptions
source§fn augment_args<'b>(__clap_app: Command<'b>) -> Command<'b>
source§fn augment_args_for_update<'b>(__clap_app: Command<'b>) -> Command<'b>
source§impl Clone for ScanOptions
source§fn clone(&self) -> ScanOptions
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moresource§impl CommandFactory for ScanOptions
source§fn into_app_for_update<'b>() -> Command<'b>
Deprecated, replaced with CommandFactory::command_for_update§fn command_for_update<'help>() -> App<'help>
source§impl Debug for ScanOptions
source§impl FromArgMatches for ScanOptions
source§fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>
source§fn from_arg_matches_mut(
__clap_arg_matches: &mut ArgMatches
) -> Result<Self, Error>
source§fn update_from_arg_matches(
&mut self,
__clap_arg_matches: &ArgMatches
) -> Result<(), Error>
Assign values from ArgMatches to self.source§fn update_from_arg_matches_mut(
&mut self,
__clap_arg_matches: &mut ArgMatches
) -> Result<(), Error>
Assign values from ArgMatches to self.source§impl Parser for ScanOptions
§fn parse_from<I, T>(itr: I) -> Selfwhere
I: IntoIterator<Item = T>,
T: Into<OsString> + Clone,
Parse from iterator, exit on error§fn try_parse_from<I, T>(itr: I) -> Result<Self, Error>where
I: IntoIterator<Item = T>,
T: Into<OsString> + Clone,
Parse from iterator, return Err on error.§fn update_from<I, T>(&mut self, itr: I)where
I: IntoIterator<Item = T>,
T: Into<OsString> + Clone,
Update from iterator, exit on error§fn try_update_from<I, T>(&mut self, itr: I) -> Result<(), Error>where
I: IntoIterator<Item = T>,
T: Into<OsString> + Clone,
Update from iterator, return Err on error.source§impl PartialEq<ScanOptions> for ScanOptions
source§fn eq(&self, other: &ScanOptions) -> bool
source§impl StructuralPartialEq for ScanOptions
Auto Trait Implementations§
§impl RefUnwindSafe for ScanOptions
§impl Send for ScanOptions
§impl Sync for ScanOptions
§impl Unpin for ScanOptions
§impl UnwindSafe for ScanOptions
Blanket Implementations§
source§impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
§impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
source§impl<T> WithSubscriber for T
source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
source§fn with_current_subscriber(self) -> WithDispatch<Self>
\ No newline at end of file
+§impl<T> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
§fn with_current_subscriber(self) -> WithDispatch<Self>
Attaches the current default Subscriber to this type, returning a
+[WithDispatch] wrapper. Read more
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search-index.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search-index.js
index 83f8e15af5..52ada82d11 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search-index.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search-index.js
@@ -1,6 +1,6 @@
var searchIndex = JSON.parse('{\
-"bdk":{"doc":"bdk","t":[13,13,13,13,13,4,13,3,13,13,13,13,13,2,13,13,13,13,13,13,4,13,3,13,13,13,13,13,13,13,2,13,13,13,3,13,2,13,4,8,2,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,12,0,14,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,14,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,0,11,12,11,11,11,11,0,12,12,12,11,11,11,2,11,2,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,12,11,11,11,11,11,11,11,12,10,5,11,11,11,11,11,11,11,0,11,12,12,12,12,12,12,13,6,4,2,4,3,6,8,13,6,8,16,6,4,3,13,13,2,8,4,13,13,6,13,13,4,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,12,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,10,11,11,0,11,11,11,11,11,11,11,11,11,11,11,10,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,12,5,5,5,5,13,13,4,13,13,13,13,13,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,13,13,4,13,3,6,13,13,6,13,13,13,13,13,13,13,13,13,13,13,4,3,4,13,13,13,13,13,4,4,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,12,11,11,11,12,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,3,3,3,3,3,3,8,6,3,3,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,8,4,4,4,16,16,8,4,13,8,8,3,8,13,13,13,16,4,6,13,13,13,16,13,3,13,8,4,13,13,13,3,3,4,3,13,6,13,13,13,5,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,11,5,11,10,11,11,5,10,11,12,12,11,11,11,11,11,11,10,12,11,11,11,11,10,11,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,8,10,10,10,4,3,3,13,8,13,13,4,13,13,6,6,3,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,12,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,10,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,12,11,11,11,11,11,5,3,13,8,3,6,4,3,13,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,5,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,3,6,12,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,13,13,13,13,13,13,8,13,13,13,13,13,13,13,13,13,13,13,13,13,13,3,8,4,4,4,3,3,3,13,4,8,13,11,12,12,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,10,11,11,10,11,12,11,12,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,13,3,13,13,4,3,13,13,3,8,4,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11],"n":["Bip32","BnBNoExactMatch","BnBTotalTriesExceeded","ChecksumMismatch","Descriptor","Error","External","FeeRate","FeeRateTooLow","FeeRateUnavailable","FeeTooLow","Foreign","Generic","HdKeyPaths","InsufficientFunds","Internal","InvalidOutpoint","InvalidPolicyPathError","IrreplaceableTransaction","Key","KeychainKind","Local","LocalUtxo","Miniscript","MiniscriptPsbt","MissingKeyOrigin","NoRecipients","NoUtxosSelected","OutputBelowDustLimit","Psbt","SignOptions","Signer","SpendingPolicyRequired","TransactionConfirmed","TransactionDetails","TransactionNotFound","TxBuilder","UnknownUtxo","Utxo","Vbytes","Wallet","WeightedUtxo","as_byte","as_ref","as_sat_per_vb","base32_len","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","chain","check_base32","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","confirmation_time","confirmation_time","default","default_min_relay_fee","derivation_index","descriptor","descriptor","deserialize","deserialize","deserialize","eq","eq","eq","eq","eq","eq","fee","fee_vb","fee_wu","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fragment","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_btc_per_kvb","from_sat_per_kvb","from_sat_per_kwu","from_sat_per_vb","from_vb","from_wu","hash","hash","into","into","into","into","into","into","into","is_spent","keychain","keys","outpoint","outpoint","partial_cmp","partial_cmp","partial_cmp","provide","psbt","received","satisfaction_weight","sent","serialize","serialize","serialize","signer","sub","template","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","transaction","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","txid","txout","txout","type_id","type_id","type_id","type_id","type_id","type_id","type_id","utxo","vbytes","version","vzip","vzip","vzip","vzip","vzip","vzip","vzip","wallet","write_base32","available","needed","required","required","outpoint","psbt_input","Bare","DerivedDescriptor","Descriptor","DescriptorError","DescriptorPublicKey","DescriptorXKey","ExtendedDescriptor","ExtractPolicy","Hardened","HdKeyPaths","IntoWalletDescriptor","Key","KeyMap","Legacy","Miniscript","None","Pkh","Policy","ScriptContext","Segwitv0","Sh","Single","TapKeyOrigins","Tr","Unhardened","Wildcard","Wpkh","Wsh","XPub","address","as_enum","as_enum","as_inner","at_derivation_index","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","branches","calc_checksum","check_global_consensus_validity","check_global_consensus_validity","check_global_consensus_validity","check_global_policy_validity","check_global_policy_validity","check_global_validity","check_local_consensus_validity","check_local_consensus_validity","check_local_consensus_validity","check_local_policy_validity","check_local_policy_validity","check_local_policy_validity","check_local_validity","check_terminal_non_malleable","check_terminal_non_malleable","check_terminal_non_malleable","check_witness","check_witness","check_witness","checksum","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","cmp","contains_raw_pkh","derivation_path","derive","derived_descriptor","derived_descriptor","desc_type","deserialize","deserialize","dust_value","encode","eq","eq","eq","eq","eq","eq","error","explicit_script","ext","ext_check","extract_policy","extract_policy","extract_policy","find_derivation_index_for_spk","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_key","for_each_key","from","from","from","from","from","from","from","from","from","from","from","from","from_ast","from_str","from_str","from_str_ext","from_str_insane","from_tree","from_tree","get_nth_child","get_nth_pk","get_satisfaction","get_satisfaction_mall","has_mixed_timelocks","has_repeated_keys","has_wildcard","hash","hash","hash","hash","hash","hash","into","into","into","into","into","into","into_inner","into_wallet_descriptor","into_wallet_descriptor","is_deriveable","is_non_malleable","iter","iter_pk","lift","lift","lift_check","matches","max_satisfaction_size","max_satisfaction_size","max_satisfaction_size","max_satisfaction_size","max_satisfaction_weight","max_satisfaction_witness_elements","name_str","name_str","name_str","new_bare","new_pk","new_pkh","new_sh","new_sh_sortedmulti","new_sh_with_wpkh","new_sh_with_wsh","new_sh_wpkh","new_sh_wsh","new_sh_wsh_sortedmulti","new_tr","new_wpkh","new_wsh","new_wsh_sortedmulti","node","origin","other_top_level_checks","parse","parse_descriptor","parse_insane","parse_with_ext","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","pk_len","pk_len","pk_len","policy","requires_sig","sanity_check","sanity_check","satisfy","satisfy","satisfy_malleable","script_code","script_pubkey","script_size","serialize","serialize","sig_type","sig_type","sig_type","template","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string_with_secret","top_level_checks","top_level_type_check","translate_pk","translate_pk","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","ty","type_id","type_id","type_id","type_id","type_id","type_id","unsigned_script_sig","vzip","vzip","vzip","vzip","vzip","vzip","wildcard","within_resource_limits","xkey","calc_checksum","calc_checksum_bytes","get_checksum","get_checksum_bytes","Base58","Bip32","Error","HardenedDerivationXpub","Hex","InvalidDescriptorCharacter","InvalidDescriptorChecksum","InvalidHdKeyPath","Key","Miniscript","Pk","Policy","borrow","borrow_mut","fmt","fmt","from","from","from","from","from","from","from","from","into","provide","to_string","try_from","try_into","type_id","vzip","AbsoluteTimelock","AddOnLeaf","AddOnPartialComplete","BuildSatisfaction","Complete","Condition","ConditionMap","EcdsaSignature","Fingerprint","FoldedConditionMap","Hash160Preimage","Hash256Preimage","IncompatibleConditions","IndexOutOfRange","MixedTimelockUnits","Multisig","None","None","NotEnoughItemsSelected","Partial","PartialComplete","PkOrF","Policy","PolicyError","Psbt","PsbtTimelocks","Pubkey","RelativeTimelock","Ripemd160Preimage","Satisfaction","SatisfiableItem","SchnorrSignature","Sha256Preimage","Thresh","XOnlyPubkey","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","contribution","csv","default","eq","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","get_condition","hash","hash","id","id","into","into","into","into","into","into","into","is_leaf","is_leaf","is_null","item","partial_cmp","provide","requires_path","satisfaction","serialize","serialize","serialize","serialize","serialize","timelock","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","current_height","input_max_height","psbt","condition","conditions","conditions","items","items","m","m","n","n","sorted","sorted","hash","hash","hash","hash","items","keys","threshold","threshold","value","value","Bip44","Bip44Public","Bip49","Bip49Public","Bip84","Bip84Public","DescriptorTemplate","DescriptorTemplateOut","P2Pkh","P2Wpkh","P2Wpkh_P2Sh","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build","build","build","build","build","build","build","build","build","build","from","from","from","from","from","from","from","from","from","into","into","into","into","into","into","into","into","into","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","Bip32","DerivableKey","DescriptorKey","DescriptorPublicKey","DescriptorSecretKey","Entropy","Error","ExtScriptContext","ExtendedKey","FullKey","GeneratableDefaultOptions","GeneratableKey","GeneratedKey","IntoDescriptorKey","InvalidChecksum","InvalidNetwork","InvalidScriptContext","Key","KeyError","KeyMap","Legacy","Message","Miniscript","Options","Private","PrivateKeyGenerateOptions","Public","ScriptContext","ScriptContextEnum","Segwitv0","Single","Single","SinglePriv","SinglePub","SinglePubKey","SortedMultiVec","Tap","ValidNetworks","XOnly","XPrv","XPub","any_network","as_enum","at_derivation_index","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","check_global_consensus_validity","check_global_policy_validity","check_global_validity","check_local_consensus_validity","check_local_policy_validity","check_local_validity","check_terminal_non_malleable","check_witness","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","compressed","default","deref","derive","encode","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_key","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_public","from_secret","from_str","from_str","from_tree","full_derivation_path","generate","generate_default","generate_with_entropy","generate_with_entropy_default","has_secret","has_wildcard","hash","hash","hash","hash","into","into","into","into","into","into","into","into","into","into","into","into","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_extended_key","into_extended_key","into_extended_key","into_key","into_xprv","into_xpub","is_deriveable","is_legacy","is_legacy","is_segwit_v0","is_segwit_v0","is_taproot","is_taproot","is_uncompressed","is_x_only_key","k","key","key","lift","mainnet_network","master_fingerprint","max_satisfaction_size","max_satisfaction_size","max_satisfaction_witness_elements","merge_networks","name_str","new","origin","origin","other_top_level_checks","override_valid_networks","partial_cmp","partial_cmp","partial_cmp","partial_cmp","pk_len","pks","provide","sanity_check","satisfy","script_size","sig_type","sorted_node","test_networks","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_public","to_string","to_string","to_string","to_string","top_level_checks","top_level_type_check","translate_pk","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","PsbtUtils","fee_amount","fee_rate","get_utxo_for","AddressIndex","AddressInfo","Balance","Descriptor","IsDust","LastUnused","New","NewError","Peek","Persist","Update","UpdateError","Wallet","add","add_signer","address","apply_update","as_chain_graph","as_graph","as_ref","as_ref","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build_fee_bump","build_tx","cancel_tx","checkpoints","clone","clone_into","coin_selection","commit","confirmed","default","deref","derivation_index","derivation_of_spk","descriptor_checksum","deserialize","eq","eq","export","finalize_psbt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","get_address","get_balance","get_descriptor_for_keychain","get_internal_address","get_psbt_input","get_signers","get_tx","get_utxo","immature","index","insert_checkpoint","insert_tx","into","into","into","into","into","is_dust","is_mine","keychain","keychanins","latest_checkpoint","list_transactions","list_unspent","network","new","new_no_persist","next_derivation_index","policies","provide","public_descriptor","secp_ctx","serialize","sign","signer","spks_of_all_keychains","spks_of_keychain","staged","to_owned","to_string","to_string","to_string","total","transactions","trusted_pending","trusted_spendable","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","tx_builder","type_id","type_id","type_id","type_id","type_id","untrusted_pending","vzip","vzip","vzip","vzip","vzip","wallet_name_from_descriptor","BranchAndBoundCoinSelection","Change","CoinSelectionAlgorithm","CoinSelectionResult","DefaultCoinSelectionAlgorithm","Excess","LargestFirstCoinSelection","NoChange","OldestFirstCoinSelection","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","coin_select","coin_select","coin_select","coin_select","decide_change","default","default","default","excess","fee_amount","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","into","into","into","into","into","local_selected_amount","new","selected","selected_amount","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","amount","change_fee","dust_threshold","fee","remaining_amount","FullyNodedExport","WalletExport","blockheight","borrow","borrow_mut","change_descriptor","descriptor","deserialize","export_wallet","fmt","from","from_str","into","label","serialize","to_string","try_from","try_into","type_id","vzip","All","Dummy","Exclude","Fingerprint","Include","InputIndexOutOfRange","InputSigner","InvalidKey","InvalidNonWitnessUtxo","InvalidSighash","Legacy","MissingHdKeypath","MissingKey","MissingNonWitnessUtxo","MissingWitnessScript","MissingWitnessUtxo","NonStandardSighash","None","PkHash","Segwitv0","SighashError","SignOptions","SignerCommon","SignerContext","SignerError","SignerId","SignerOrdering","SignerWrapper","SignersContainer","Tap","TapLeavesOptions","TransactionSigner","UserCanceled","add_external","allow_all_sighashes","allow_grinding","as_key_map","assume_height","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","default","default","default","default","deref","descriptor_secret_key","descriptor_secret_key","descriptor_secret_key","eq","eq","eq","eq","eq","find","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","hash","id","id","id","ids","into","into","into","into","into","into","into","into","new","new","partial_cmp","partial_cmp","provide","remove","remove_partial_sigs","sign_input","sign_input","sign_input","sign_transaction","sign_transaction","sign_with_tap_internal_key","signers","tap_leaves_options","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","trust_witness_utxo","try_finalize","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","is_internal_key","Bip69Lexicographic","BumpFee","ChangeAllowed","ChangeForbidden","ChangeSpendPolicy","CreateTx","OnlyChange","Shuffle","TxBuilder","TxBuilderContext","TxOrdering","Untouched","add_data","add_foreign_utxo","add_global_xpubs","add_recipient","add_unspendable","add_utxo","add_utxos","allow_dust","allow_shrinking","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","change_policy","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","coin_selection","current_height","default","default","default","default","do_not_spend_change","drain_to","drain_wallet","enable_rbf","enable_rbf_with_sequence","eq","eq","fee_absolute","fee_rate","finish","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","hash","hash","include_output_redeem_witness_script","into","into","into","into","into","manually_selected_only","nlocktime","only_spend_change","only_witness_utxo","ordering","partial_cmp","partial_cmp","policy_path","set_recipients","sighash","sort_tx","to_owned","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","unspendable","version","vzip","vzip","vzip","vzip","vzip"],"q":["bdk","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::Error","","","","bdk::Utxo","","bdk::descriptor","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor::checksum","","","","bdk::descriptor::error","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor::policy","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor::policy::BuildSatisfaction","","","bdk::descriptor::policy::Satisfaction","","","","","","","","","","","bdk::descriptor::policy::SatisfiableItem","","","","","","","","","","bdk::descriptor::template","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::keys","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::psbt","","","","bdk::wallet","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::coin_selection","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::coin_selection::Excess","","","","","bdk::wallet::export","","","","","","","","","","","","","","","","","","","","bdk::wallet::signer","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::signer::SignerContext","bdk::wallet::tx_builder","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"d":["BIP32 error","Branch and bound coin selection tries to avoid needing a â¦","Branch and bound coin selection possible attempts with â¦","Descriptor checksum mismatch","Error related to the parsing and usage of descriptors","Errors that can be thrown by the Wallet","External","Fee rate","When bumping a tx the fee rate requested is lower than â¦","Node doesnât have data to estimate a fee rate","When bumping a tx the absolute fee requested is lower than â¦","A UTXO owned by another wallet.","Generic error","","Walletâs UTXO set is not enough to cover recipientâs â¦","Internal, usually used for change outputs","Requested outpoint doesnât exist in the tx (vout greater â¦","Error while extracting and manipulating policies","Trying to replace a tx that has a sequence >= 0xFFFFFFFE","Error while working with keys","Types of keychains","A UTXO owned by the local wallet.","An unspent output owned by a Wallet.","Miniscript error","Miniscript PSBT error","In order to use the TxBuilder::add_global_xpubs option â¦","Cannot build a tx without recipients","manually_selected_only option is selected but no utxo has â¦","Output created is under the dust limit, 546 satoshis","Partially signed bitcoin transaction error","","Signing error","Spending policy is not compatible with this KeychainKind","Happens when trying to bump a transaction that is already â¦","A wallet transaction","Thrown when a tx is not found in the internal database","","Happens when trying to spend an UTXO that is not in the â¦","An unspent transaction output (UTXO).","Trait implemented by types that can be used to measure â¦","","A Utxo with its satisfaction_weight.","Return KeychainKind as a byte","","Return the value as satoshi/vbyte","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The confirmation time for transaction containing this utxo","If the transaction is confirmed, contains height and Unix â¦","","Create a new FeeRate with the default min relay fee value","The derivation index for the script pubkey in the wallet","Descriptors","Macro to write full descriptors with code","","","","","","","","","","Fee value in sats if it was available.","Calculate absolute fee in Satoshis using size in virtual â¦","Calculate absolute fee in Satoshis using size in weight â¦","","","","","","","","","Macro to write descriptor fragments with code","","","","","","","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Create a new instance of FeeRate given a float fee rate in â¦","Create a new instance of FeeRate given a float fee rate in â¦","Create a new instance of FeeRate given a float fee rate in â¦","Create a new instance of FeeRate given a float fee rate in â¦","Calculate fee rate from fee and vbytes.","Calculate fee rate from fee and weight units (wu).","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Whether this UTXO is spent or not","Type of keychain","Key formats","Get the location of the UTXO","Reference to a transaction output","","","","","Additional functions on the rust-bitcoin â¦","Received value (sats) Sum of owned outputs of this â¦","The weight of the witness data and scriptSig expressed in â¦","Sent value (sats) Sum of owned inputs of this transaction.","","","","","","","","","","","","","","Optional transaction","","","","","","","","","","","","","","","Transaction id","Get the TxOut of the UTXO","Transaction output","","","","","","","","The UTXO","Convert weight units to virtual bytes.","Get the version of BDK at runtime","","","","","","","","Wallet","","Sats available for spending","Sats needed for some transaction","Required fee rate (satoshi/vbyte)","Required fee absolute value (satoshi)","The location of the output.","The information about the input we require to add it to a â¦","A raw scriptpubkey (including pay-to-pubkey) under Legacy â¦","Alias for a Descriptor that contains extended derived keys","Script descriptor","","The descriptor pubkey, either a single pubkey or an xpub.","An extended key with origin, derivation path, and wildcard.","Alias for a Descriptor that can contain extended keys â¦","Trait implemented on Descriptors to add a method to â¦","Unhardened wildcard, e.g. *h","Alias for the type of maps that represent derivation paths â¦","Trait for types which can be converted into an â¦","The consensus key associated with the type. Must be a â¦","Alias type for a map of public key to secret key","Legacy ScriptContext To be used as P2SH scripts For â¦","Top-level script AST type","No wildcard","Pay-to-PubKey-Hash","","The ScriptContext for Miniscript. Additional type â¦","Segwitv0 ScriptContext","Pay-to-ScriptHash(includes nested wsh/wpkh/sorted multi)","Single public key.","Alias for the type of maps that represent taproot key â¦","Pay-to-Taproot","Unhardened wildcard, e.g. *","Whether a descriptor has a wildcard in it","Pay-to-Witness-PubKey-Hash","Pay-to-Witness-ScriptHash with Segwitv0 context","Extended public key (xpub).","Computes the Bitcoin address of the descriptor, if one â¦","","","Get a reference to the inner AstElem representing the root â¦","Replaces all wildcards (i.e. /*) in the descriptor with a â¦","","","","","","","","","","","","","Enumerates all child nodes of the current AST node (self) â¦","","Depending on script Context, some of the Terminals might â¦","","","Depending on script Context, some of the script resource â¦","","Check the consensus + policy(if not disabled) rules that â¦","Consensus rules at the Miniscript satisfaction time. It is â¦","","","Policy rules at the Miniscript satisfaction time. It is â¦","","","Check the consensus + policy(if not disabled) rules â¦","Depending on ScriptContext, fragments can be malleable. â¦","","","Check whether the given satisfaction is valid under the â¦","","","Descriptor checksum","","","","","","","","","","","","","","","","","","","Whether the given miniscript contains a raw pkh fragment","The derivation path","Deprecated name for [at_derivation_index].","Convert all the public keys in the descriptor to â¦","Convert all the public keys in the descriptor to â¦","Get the DescriptorType of Descriptor","","","","Encode as a Bitcoin script","","","","","","","Descriptor errors","Computes the the underlying script before any hashing is â¦","Additional information helpful for extra analysis.","Check whether the miniscript follows the given Extra â¦","Extract the spending policy","","","Utility method for deriving the descriptor at each index â¦","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","","Returns the argument unchanged.","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Add type information(Type and Extdata) to Miniscript based â¦","","Parse a Miniscript from string and perform sanity checks â¦","Attempt to parse an Miniscripts that donât follow the â¦","Attempt to parse an insane(scripts donât clear sanity â¦","Parse an expression tree into a descriptor.","Parse an expression tree into a Miniscript. As a general â¦","Returns child node with given index, if any","Returns Option::Some with cloned nâth public key from â¦","Returns satisfying non-malleable witness and scriptSig to â¦","Returns a possilbly mallable satisfying non-malleable â¦","Whether the miniscript contains a combination of timelocks","Whether the miniscript has repeated Pk or Pkh","Whether or not the descriptor has any wildcards i.e. /*.","","","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Extracts the AstElem representing the root of the â¦","Convert to wallet descriptor","","Whether or not the descriptor has any wildcards","Whether the miniscript is malleable","Creates a new Iter iterator that will iterate over all â¦","Creates a new PkIter iterator that will iterate over all â¦","","","Lifting corresponds conversion of miniscript into Policy [â¦","Compares this key with a keysource and returns the â¦","Depending on script context, the size of a satifaction â¦","","","Maximum size, in bytes, of a satisfying witness. For â¦","Computes an upper bound on the weight of a satisfying â¦","Maximum number of witness elements used to satisfy the â¦","Local helper function to display error messages with â¦","","","Create a new bare descriptor from witness script Errors â¦","Create a new pk descriptor","Create a new PkH descriptor","Create a new sh for a given redeem script Errors when â¦","Create a new sh sortedmulti descriptor with threshold k â¦","Create a new sh wrapper for the given wpkh descriptor","Create a new sh wrapper for the given wsh descriptor","Create a new sh wrapped wpkh from Pk. Errors when â¦","Create a new sh wrapped wsh descriptor with witness script â¦","Create a new sh wrapped wsh sortedmulti descriptor from â¦","Create new tr descriptor Errors when miniscript exceeds â¦","Create a new Wpkh descriptor Will return Err if â¦","Create a new wsh descriptor from witness script Errors â¦","Create a new wsh sorted multi descriptor Errors when â¦","A node in the Abstract Syntax Tree(","Origin information","Other top level checks that are context specific","Attempt to parse a Script into Miniscript representation.","Parse a descriptor that may contain secret keys","Attempt to parse an insane(scripts donât clear sanity â¦","Attempt to parse an miniscript with extra features that â¦","","","","","","","Get the len of public key when serialized based on context â¦","","","Descriptor policy","Whether all spend paths of miniscript require a signature","Checks whether the descriptor is safe.","Check whether the underlying Miniscript is safe under the â¦","Attempts to produce a non-malleable satisfying witness and â¦","Attempt to produce non-malleable satisfying witness for the","Attempt to produce a malleable satisfying witness for the â¦","Computes the scriptCode of a transaction output.","Computes the scriptpubkey of the descriptor.","Size, in bytes of the script-pubkey. If this Miniscript is â¦","","","The type of signature required for satisfaction","","","Descriptor templates","","","","","","","","","Serialize a descriptor to string with its secret keys","Check top level consensus rules.","Check whether the top-level is type B","Converts a descriptor using abstract keys to one using â¦","Translates a struct from one generic to another where the â¦","","","","","","","","","","","","","The correctness and malleability type information for the â¦","","","","","","","Computes the scriptSig that will be in place for an â¦","","","","","","","Whether the descriptor is wildcard","Whether the miniscript can exceed the resource â¦","The extended key","Compute the checksum of a descriptor, excludes any â¦","Compute the checksum bytes of a descriptor, excludes any â¦","Compute the checksum of a descriptor","Compute the checksum bytes of a descriptor","Error during base58 decoding","BIP32 error","Errors related to the parsing and usage of descriptors","The descriptor contains hardened derivation steps on â¦","Hex decoding error","Invalid byte found in the descriptor checksum","The provided descriptor doesnât match its checksum","Invalid HD Key path, such as having a wildcard but a â¦","Error thrown while working with keys","Miniscript error","Key-related error","Error while extracting and manipulating policies","","","","","Returns the argument unchanged.","","","","","","","","Calls U::from(self).","","","","","","","Absolute timeclock timestamp","Can not add to an item that is Satisfaction::None or â¦","Can not add to an item that is â¦","Options to build the satisfaction field in the policy","Can satisfy the policy item","An extra condition that must be satisfied but that is out â¦","Type for a map of sets of Condition items keyed by each setâ¦","ECDSA Signature for a raw public key","An extended key fingerprint","Type for a map of folded sets of Condition items keyed by â¦","SHA256 then RIPEMD160 preimage hash","Double SHA256 preimage hash","Incompatible conditions (not currently used)","Index out of range for an item to satisfy a â¦","Can not merge CSV or timelock values unless both are less â¦","Multi-signature public keys with threshold count","Cannot satisfy or contribute to the policy item","Donât generate satisfaction field","Not enough items are selected to satisfy a â¦","Only a partial satisfaction of some kind of threshold â¦","Can reach the threshold of some kind of threshold policy","A unique identifier for a key","Descriptor spending policy","Errors that can happen while extracting and manipulating â¦","Analyze the given PSBT to check for existing signatures","Like Psbt variant and also check for expired timelocks","A legacy public key","Relative timelock locktime","RIPEMD160 preimage hash","Represent if and how much a policy item is satisfied by â¦","An item that needs to be satisfied","Schnorr Signature for a raw public key","SHA256 preimage hash","Threshold items with threshold count","A x-only public key","","","","","","","","","","","","","","","","","","","","","","","","","","","How the walletâs descriptor can satisfy this policy node","Optional CheckSequenceVerify condition","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Return the conditions that are set by the spending policy â¦","","","Returns a unique id for the SatisfiableItem","Identifier for this policy node","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Returns whether the SatisfiableItem is a leaf item","Returns whether the Satisfaction is a leaf item","Returns true if there are no extra conditions to verify","Type of this policy node","","","Return whether or not a specific path in the policy tree â¦","How much a given PSBT already satisfies this policy node â¦","","","","","","Optional timelock condition","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Current blockchain height","The highest confirmation height between the inputs CSV â¦","Given PSBT","Extra conditions that also need to be satisfied","Extra conditions that also need to be satisfied","Extra conditions that also need to be satisfied","The items that can be satisfied by the descriptor or are â¦","The items that can be satisfied by the descriptor","Threshold","Threshold","Total number of items","Total number of items","Whether the items are sorted in lexicographic order (used â¦","Whether the items are sorted in lexicographic order (used â¦","The digest value","The digest value","The digest value","The digest value","The policy items","The raw public key or extended key fingerprint","The required threshold count","The required threshold count","The timelock value","The timelock value","BIP44 template. Expands to pkh(key/44'/{0,1}'/0'/{0,1}/*)","BIP44 public template. Expands to pkh(key/{0,1}/*)","BIP49 template. Expands to â¦","BIP49 public template. Expands to sh(wpkh(key/{0,1}/*))","BIP84 template. Expands to wpkh(key/84'/{0,1}'/0'/{0,1}/*)","BIP84 public template. Expands to wpkh(key/{0,1}/*)","Trait for descriptor templates that can be built into a â¦","Type alias for the return type of DescriptorTemplate, â¦","P2PKH template. Expands to a descriptor pkh(key)","P2WPKH template. Expands to a descriptor wpkh(key)","P2WPKH-P2SH template. Expands to a descriptor sh(wpkh(key))","","","","","","","","","","","","","","","","","","","Build the complete descriptor","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","BIP32 error","Trait for keys that can be derived.","Container for public or secret keys","The descriptor pubkey, either a single pubkey or an xpub.","The descriptor secret key, either a single private key or â¦","Type specifying the amount of entropy required e.g. [u8;32]","Returned error in case of failure","Trait that adds extra useful methods to ScriptContexts","Enum for extended keys that can be either xprv or xpub","A bitcoin public key (compressed or uncompressed).","Trait that allows generating a key with the default options","Trait for keys that can be generated","Output of a GeneratableKey key generation","Trait for objects that can be turned into a public or â¦","The key has an invalid checksum","The key is not valid for the given network","The key cannot exist in the given script context","The consensus key associated with the type. Must be a â¦","Errors thrown while working with keys","Alias type for a map of public key to secret key","Legacy scripts","Custom error message","Miniscript error","Extra options required by the generate_with_entropy","A private extended key, aka an xprv","Options for generating a PrivateKey","A public extended key, aka an xpub","The ScriptContext for Miniscript. Additional type â¦","Enum representation of the known valid ScriptContexts","Segwitv0 scripts","Single public key.","Single private key.","A descriptor bitcoin::PrivateKey with optional origin â¦","A descriptor SinglePubKey with optional origin information.","Single public key without any origin or range information.","Contents of a âsortedmultiâ descriptor","Taproot scripts","Set of valid networks for a key","An xonly public key.","Extended private key (xpriv).","Extended public key (xpub).","Create a set containing mainnet, testnet, signet, and â¦","Returns the ScriptContext as a ScriptContextEnum","Replaces any wildcard (i.e. /*) in the key with a â¦","","","","","","","","","","","","","","","","","","","","","","","","","Depending on script Context, some of the Terminals might â¦","Depending on script Context, some of the script resource â¦","Check the consensus + policy(if not disabled) rules that â¦","Consensus rules at the Miniscript satisfaction time. It is â¦","Policy rules at the Miniscript satisfaction time. It is â¦","Check the consensus + policy(if not disabled) rules â¦","Depending on ScriptContext, fragments can be malleable. â¦","Check whether the given satisfaction is valid under the â¦","","","","","","","","","","","","","","","","","","","Whether the generated key should be âcompressedâ or not","","","Deprecated name of [at_derivation_index].","Encode as a Bitcoin script","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Create an instance given a public key and a set of valid â¦","Create an instance given a secret key and a set of valid â¦","","","Parse an expression tree into a SortedMultiVec","Full path, from the master key","Generate a key given the options with a random entropy","Generate a key with the default options and a random â¦","Generate a key given the extra options and the entropy","Generate a key with the default options and a given entropy","Return whether or not the key contains the private data","Whether or not the key has a wildcard","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Turn the key into a DescriptorKey within the requested â¦","Consume self and turn it into a DescriptorKey by adding â¦","","","","","","Consume self and turn it into an ExtendedKey","","","Consumes self and returns the key","Transform the ExtendedKey into an ExtendedPrivKey for the â¦","Transform the ExtendedKey into an ExtendedPubKey for the â¦","Whether or not the key has a wildcard","Returns whether the script context is Legacy","Returns whether the script context is â¦","Returns whether the script context is Segwitv0","Returns whether the script context is â¦","Returns whether the script context is Tap, aka Taproot or â¦","Returns whether the script context is â¦","","","signatures required","The public key.","The private key.","","Create a set only containing mainnet","The fingerprint of the master key associated with this â¦","Depending on script context, the size of a satifaction â¦","Maximum size, in bytes, of a satisfying witness. In â¦","Maximum number of witness elements used to satisfy the â¦","Compute the intersection of two sets","Local helper function to display error messages with â¦","Create a new instance of SortedMultiVec given a list of â¦","Origin information (fingerprint and derivation path).","Origin information (fingerprint and derivation path).","Other top level checks that are context specific","Override the computed set of valid networks","","","","","Get the len of public key when serialized based on context â¦","public keys inside sorted Multi","","utility function to sanity a sorted multi vec","Attempt to produce a satisfying witness for the witness â¦","Size, in bytes of the script-pubkey. If this Miniscript is â¦","The type of signature required for satisfaction","Create Terminal::Multi containing sorted pubkeys","Create a set containing testnet and regtest","","","","","","","","Returns the public version of this key.","","","","","Check top level consensus rules.","Check whether the top-level is type B","This will panic if fpk returns an uncompressed key when â¦","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Trait to add functions to extract utxos and calculate fees.","The total transaction fee amount, sum of input amounts â¦","The transactionâs fee rate. This value will only be â¦","Get the TxOut for the specified input index, if it doesnââ¦","The address index selection strategy to use to derived an â¦","A derived address and the index it was found at. For â¦","Balance, differentiated into various categories.","There was problem with the descriptors passed in","Trait to check if a value is below the dust limit. We are â¦","Return the address for the current descriptor index if it â¦","Return a new address after incrementing the current â¦","Error returned from Wallet::new","Return the address for a specific descriptor index. Does â¦","We were unable to load the walletâs data from the â¦","The update to a Wallet used in Wallet::apply_update. This â¦","Error indicating that something was wrong with an Update<T>â¦","A Bitcoin wallet","","Add an external signer","Address","Applies an update to the wallet and stages the changes â¦","Get a reference to the inner ChainGraph.","Get a reference to the inner TxGraph.","","","","","","","","","","","","","Bump the fee of a transaction previously created with this â¦","Start building a transaction.","Informs the wallet that you no longer intend to broadcast â¦","Get all the checkpoints the wallet is currently storing â¦","","","Coin selection","Commits all curently staged changed to the persistence â¦","Confirmed and immediately spendable balance","","","The derivation index of this wallet. It will return None â¦","Finds how the wallet derived the script pubkey spk.","Return the checksum of the public descriptor associated to â¦","","","","Wallet export","Finalize a PSBT, i.e., for each input determine if â¦","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Return a derived address using the external descriptor, â¦","Return the balance, separated into available, â¦","Returns the descriptor used to create addresses for a â¦","Return a derived address using the internal (change) â¦","get the corresponding PSBT Input for a LocalUtxo","Get the signers","Return a single transactions made and received by the â¦","Returns the utxo owned by this wallet corresponding to â¦","All coinbase outputs not yet matured","Child index of this address","Add a new checkpoint to the walletâs internal view of â¦","Add a transaction to the walletâs internal view of the â¦","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Check whether or not a value is below dust limit","Return whether or not a script is part of this wallet â¦","Type of keychain","Iterator over all keychains in this wallet","Returns the latest checkpoint.","Deprecated. use Wallet::transactions instead.","Return the list of unspent outputs of this wallet","Get the Bitcoin network the wallet is using.","Create a wallet from a descriptor (and an optional â¦","Creates a wallet that does not persist data.","The index of the next address that you would get if you â¦","Return the spending policies for the walletâs descriptor","","Return the âpublicâ version of the walletâs â¦","Return the secp256k1 context used for all signing â¦","","Sign a transaction with all the walletâs signers, in the â¦","Generalized signers","Returns a iterators of all the script pubkeys for the â¦","Gets an iterator over all the script pubkeys in a single â¦","Returns the changes that will be staged with the next call â¦","","","","","Get the whole balance visible to the wallet.","Iterate over the transactions in the wallet in order of â¦","Unconfirmed UTXOs generated by a wallet tx","Get sum of trusted_pending and confirmed coins.","","","","","","","","","","","Transaction builder","","","","","","Unconfirmed UTXOs received from an external wallet","","","","","","Deterministically generate a unique name given the â¦","Branch and bound coin selection","Itâs possible to create spendable output from excess â¦","Trait for generalized coin selection algorithms","Result of a successful coin selection","Default coin selection algorithm used by TxBuilder if not â¦","Remaining amount after performing coin selection","Simple and dumb coin selection","Itâs not possible to create spendable output from excess â¦","OldestFirstCoinSelection always picks the utxo with the â¦","","","","","","","","","","","","","","","","","Perform the coin selection","","","","Decide if change can be created","","","","Remaining amount after deducing fees and outgoing outputs","Total fee amount for the selected utxos in satoshis","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","The total value of the inputs selected from the local â¦","Create new instance with target size for change output","List of outputs selected for use as inputs","The total value of the inputs selected.","","","","","","","","","","","","","","","","","","","","","","","","Effective amount available to create change after â¦","The calculated fee for the drain TxOut with the selected â¦","Threshold to consider amount as dust for this particular â¦","The deducted change output fee","Exceeding amount of current selection over outgoing value â¦","Structure that contains the export of a wallet","Alias for FullyNodedExport","Earliest block to rescan when looking for the walletâs â¦","","","Return the internal descriptor, if present","Return the external descriptor","","Export a wallet","","Returns the argument unchanged.","","Calls U::from(self).","Arbitrary label for the wallet","","","","","","","The signer will sign all the leaves it has a key for.","Dummy identifier","The signer wonât sign the specified leaves.","The fingerprint of a BIP32 extended key","The signer wonât sign leaves other than the ones â¦","Input index is out of range","PSBT Input signer","The private key in use has the right fingerprint but â¦","The non_witness_utxo specified is invalid","Invalid SIGHASH for the signing context in use","Legacy context","The fingerprint and derivation path are missing from the â¦","The private key is missing for the required public key","The non_witness_utxo field of the transaction is required â¦","The witness_script field of the transaction is required to â¦","The witness_utxo field of the transaction is required to â¦","The psbt contains a non-SIGHASH_ALL sighash in one of its â¦","The signer wonât sign any leaf.","Bitcoin HASH160 (RIPEMD160 after SHA256) hash of an ECDSA â¦","Segwit v0 context (BIP 143)","Error while computing the hash to sign","Options for a software signer","Common signer methods","Signing context","Signing error","Identifier of a signer in the SignersContainers. Used as a â¦","Defines the order in which signers are called","Wrapper structure to pair a signer with its context","Container for multiple signers","Taproot context (BIP 340)","Customize which taproot script-path leaves the signer â¦","PSBT signer","The user canceled the operation","Adds an external signer to the container for the specified â¦","Whether the signer should use the sighash_type set in the â¦","Whether we should grind ECDSA signature to ensure signing â¦","Create a map of public keys to secret keys","Whether the wallet should assume a specific height has â¦","","","","","","","","","","","","","","","","","Build a new signer container from a KeyMap","","","","","","","","","","","","","","","","","","","","","","","","Return the secret key for the signer","","","","","","","","Finds the signer with lowest ordering for a given id in â¦","","","","","","","","","","","","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Return the SignerId for this signer","","","Returns the list of identifiers of all the signers in the â¦","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Create a wrapped signer from a signer and a context","Default constructor","","","","Removes a signer from the container and returns it","Whether to remove partial signatures from the PSBT inputs â¦","Sign a single psbt input","","","Sign all the inputs of the psbt","","Whether we should try to sign a taproot transaction with â¦","Returns the list of signers in the container, sorted by â¦","Specifies which Taproot script-spend leaves we should sign â¦","","","","","","","","","","Whether the signer should trust the witness_utxo, if the â¦","Whether to try finalizing the PSBT after the inputs are â¦","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Whether the signer can sign for the internal key or not","BIP69 / Lexicographic","Marker type to indicate the TxBuilder is being used to â¦","Use both change and non-change outputs (default)","Only use non-change outputs (see â¦","Policy regarding the use of change outputs when creating a â¦","Marker type to indicate the TxBuilder is being used to â¦","Only use change outputs (see TxBuilder::only_spend_change)","Randomized (default)","A transaction builder","Context in which the TxBuilder is valid","Ordering of the transactionâs inputs and outputs","Unchanged","Add data as an output, using OP_RETURN","Add a foreign UTXO i.e. a UTXO not owned by this wallet.","Fill-in the PSBT_GLOBAL_XPUB field with the extended keys â¦","Add a recipient to the internal list","Add a utxo to the internal list of unspendable utxos","Add a utxo to the internal list of utxos that must be spent","Add the list of outpoints to the internal list of UTXOs â¦","Set whether or not the dust limit is checked.","Explicitly tells the wallet that it is allowed to reduce â¦","","","","","","","","","","","Set a specific ChangeSpendPolicy. See â¦","","","","","","","","","","","","","Choose the coin selection algorithm","Set the current blockchain height.","","","","","Do not spend change outputs","Sets the address to drain excess coins to.","Spend all the available inputs. This respects filters like â¦","Enable signaling RBF","Enable signaling RBF with a specific nSequence value","","","Set an absolute fee","Set a custom fee rate","Finish building the transaction.","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Fill-in the psbt::Output::redeem_script and â¦","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Only spend utxos added by add_utxo.","Use a specific nLockTime while creating the transaction","Only spend change outputs","Only Fill-in the psbt::Input::witness_utxo field when â¦","Choose the ordering for inputs and outputs of the â¦","","","Set the policy path to use while creating the transaction â¦","Replace the recipients already added with a new list","Sign with a specific sig hash","Sort transaction inputs and outputs by TxOrdering variant","","","","","","","","","","","","","","","","","","","","","Replace the internal list of unspendable utxos with a new â¦","Build a transaction with a specific version","","","","",""],"i":[17,17,17,17,17,0,1,0,17,17,17,12,17,0,17,1,17,17,17,17,0,12,0,17,17,17,17,17,17,17,0,17,17,17,0,17,0,17,0,0,0,0,1,1,3,1,17,1,3,10,11,12,13,17,1,3,10,11,12,13,0,1,1,3,10,11,12,13,1,3,10,11,12,13,1,13,10,13,3,3,10,0,0,1,10,13,1,3,10,11,12,13,13,3,3,17,17,1,3,10,11,12,13,0,17,17,17,17,17,17,17,17,1,3,10,11,12,13,3,3,3,3,3,3,1,10,17,1,3,10,11,12,13,10,10,0,12,10,1,3,13,17,0,13,11,13,1,10,13,0,3,0,1,3,10,11,12,13,17,13,17,1,3,10,11,12,13,17,1,3,10,11,12,13,13,12,10,17,1,3,10,11,12,13,11,168,0,17,1,3,10,11,12,13,0,1,169,169,170,171,172,172,34,0,0,0,0,0,0,0,45,0,0,58,0,0,0,45,34,0,0,0,34,40,0,34,45,0,34,34,40,34,46,47,38,34,44,45,34,46,47,38,44,45,34,46,47,38,38,0,58,46,47,58,47,58,58,46,47,58,46,47,58,58,46,47,58,46,47,0,44,45,34,46,47,38,44,45,34,46,47,38,44,45,34,46,47,38,38,44,34,34,34,34,34,38,34,38,44,45,34,46,47,38,0,34,38,38,173,34,38,34,44,45,34,34,46,47,38,38,34,38,44,45,34,34,34,34,34,34,34,46,47,38,38,34,38,38,38,34,38,38,38,34,34,38,38,34,44,45,34,46,47,38,44,45,34,46,47,38,38,142,68,34,38,38,38,34,38,38,44,58,46,47,38,34,38,58,46,47,34,34,34,34,34,34,34,34,34,34,34,34,34,34,38,44,58,38,34,38,38,44,45,34,46,47,38,58,46,47,0,38,34,38,34,38,38,34,34,38,34,38,58,46,47,0,44,45,34,46,47,38,34,38,34,58,58,34,38,44,45,34,46,47,38,44,45,34,46,47,38,38,44,45,34,46,47,38,34,44,45,34,46,47,38,44,38,44,0,0,0,0,22,22,0,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,83,23,23,0,84,0,0,83,82,0,83,83,23,23,23,83,84,56,23,84,84,0,0,0,56,56,82,83,83,0,0,83,83,83,82,82,83,84,57,85,23,56,82,83,84,57,85,23,56,82,83,84,57,85,56,82,83,84,57,85,56,57,85,85,82,83,84,57,85,23,82,83,84,57,85,23,23,56,82,83,84,84,57,57,85,23,56,57,82,85,83,57,82,83,84,57,85,23,56,83,84,85,57,85,23,57,57,82,83,84,57,85,85,82,83,84,57,85,56,23,82,83,84,57,85,23,56,82,83,84,57,85,23,56,82,83,84,57,85,23,56,82,83,84,57,85,23,56,174,174,174,175,176,177,176,177,176,177,176,177,176,177,178,179,180,181,182,183,183,182,184,185,0,0,0,0,0,0,0,0,0,0,0,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,186,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,87,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,25,0,0,0,0,187,187,0,0,105,0,0,0,0,25,25,25,58,0,0,37,25,25,187,111,0,111,0,0,37,40,108,0,0,0,0,37,0,105,108,40,0,188,40,111,101,107,37,102,25,103,40,108,104,109,105,111,101,107,37,102,25,103,40,108,104,109,105,58,58,58,58,58,58,58,58,101,37,102,103,40,104,105,101,37,102,103,40,104,105,103,40,104,105,102,102,101,40,103,37,103,40,104,105,107,37,102,25,25,103,103,40,40,108,108,104,109,105,103,111,111,111,101,107,37,102,25,25,25,103,40,40,108,104,109,105,107,107,40,108,103,40,187,189,187,189,111,40,103,40,104,105,111,101,107,37,102,25,103,40,108,104,109,105,88,92,101,101,107,40,108,92,111,101,101,111,111,40,188,37,188,37,188,37,40,40,103,104,109,103,0,40,58,103,103,0,58,103,104,109,58,107,103,40,104,105,58,103,25,103,103,103,58,103,0,101,37,102,103,40,104,105,108,25,103,40,108,58,58,103,111,101,107,37,102,25,103,40,108,104,109,105,111,101,107,37,102,25,103,40,108,104,109,105,111,101,107,37,102,25,103,40,108,104,109,105,111,101,107,37,102,25,103,40,108,104,109,105,0,190,190,190,0,0,0,135,0,134,134,0,134,135,0,0,0,116,117,131,117,117,117,117,117,116,117,134,131,135,116,117,134,131,135,117,117,117,117,116,116,0,117,116,116,131,117,117,117,116,116,131,0,117,116,116,117,134,131,131,135,135,116,117,134,131,135,117,117,117,117,117,117,117,117,116,131,117,117,116,117,134,131,135,191,117,131,117,117,117,117,117,117,117,117,117,135,117,117,116,117,0,117,117,117,116,116,131,135,116,117,116,116,116,117,134,131,135,116,117,134,131,135,0,116,117,134,131,135,116,116,117,134,131,135,0,0,150,0,0,0,0,0,150,0,150,149,146,147,148,150,149,146,147,148,146,147,148,146,147,148,161,146,147,148,0,146,147,148,149,149,150,149,146,147,148,150,149,146,147,148,150,149,146,147,148,149,148,149,149,146,147,148,150,149,146,147,148,150,149,146,147,148,150,149,146,147,148,150,149,146,147,148,192,193,193,192,193,0,0,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,157,152,157,152,157,24,0,24,24,24,154,24,24,24,24,24,24,157,152,154,24,0,0,0,0,0,0,0,0,154,0,0,24,55,133,133,55,133,152,24,154,156,118,55,133,157,152,24,154,156,118,55,133,157,55,152,24,154,156,118,55,133,157,152,24,154,156,118,55,133,157,152,118,118,55,133,157,156,194,156,156,152,24,154,118,157,55,152,24,24,154,156,118,55,133,157,152,152,152,24,24,154,156,118,55,133,157,152,194,156,156,55,152,24,154,156,118,55,133,157,156,55,152,118,24,55,133,195,156,156,119,156,133,55,133,152,24,154,156,118,55,133,157,24,133,133,152,24,154,156,118,55,133,157,152,24,154,156,118,55,133,157,152,24,154,156,118,55,133,157,152,24,154,156,118,55,133,157,196,164,0,163,163,0,0,163,164,0,0,0,164,128,128,128,128,128,128,128,128,128,129,127,128,164,163,129,127,128,164,163,128,129,127,128,164,163,129,127,128,164,163,164,163,128,128,129,127,164,163,128,128,128,128,128,164,163,128,128,128,129,127,128,164,163,129,127,128,164,163,164,163,128,129,127,128,164,163,128,128,128,128,128,164,163,128,128,128,164,129,127,128,164,163,129,127,128,164,163,129,127,128,164,163,129,127,128,164,163,128,128,129,127,128,164,163],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[1,2],[1],[3,4],[[],5],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,[[],[[9,[[8,[6,7]]]]]],[1,1],[3,3],[10,10],[11,11],[12,12],[13,13],[[]],[[]],[[]],[[]],[[]],[[]],[[1,1],14],[[13,13],14],0,0,[[],3],[[],3],0,0,0,[[],[[9,[1]]]],[[],[[9,[10]]]],[[],[[9,[13]]]],[[1,1],15],[[3,3],15],[[10,10],15],[[11,11],15],[[12,12],15],[[13,13],15],0,[[3,5],16],[[3,5],16],[[17,18],19],[[17,18],19],[[1,18],19],[[3,18],19],[[10,18],19],[[11,18],19],[[12,18],19],[[13,18],19],0,[20,17],[21,17],[22,17],[23,17],[24,17],[25,17],[[]],[26,17],[[]],[[]],[[]],[[]],[[]],[[]],[4,3],[4,3],[4,3],[4,3],[[16,5],3],[[16,5],3],[1],[10],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,[12,27],0,[[1,1],[[28,[14]]]],[[3,3],[[28,[14]]]],[[13,13],[[28,[14]]]],[29],0,0,0,0,[1,9],[10,9],[13,9],0,[[3,3]],0,[[]],[[]],[[]],[[]],[[]],[[]],[[],30],0,[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],0,[12,31],0,[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],0,[[],5],[[],33],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,[[],9],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[34,35],[[9,[36,26]]]],[[],37],[[],37],[38,39],[[[34,[40]],41],[[34,[42]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[38,[[8,[38,7]]]],0,[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[39,[[9,[43]]]],[39,[[9,[43]]]],[39,[[9,[43]]]],[[],[[9,[43]]]],[[],[[9,[43]]]],[[],[[9,[43]]]],0,[44,44],[45,45],[34,34],[46,46],[47,47],[38,38],[[]],[[]],[[]],[[]],[[]],[[]],[[44,44],14],[[45,45],14],[[34,34],14],[[46,46],14],[[47,47],14],[[38,38],14],[38,15],0,[[[34,[40]],41],[[34,[42]]]],[[[34,[42]],48],[[9,[[34,[49]],50]]]],[[[34,[40]],48,41],[[9,[[34,[49]],50]]]],[34,51],[[],[[9,[34]]]],[[],[[9,[38]]]],[[[34,[40]]],16],[38,52],[[44,44],15],[[45,45],15],[[34,34],15],[[46,46],15],[[47,47],15],[[38,38],15],0,[34,[[9,[52,26]]]],0,[[38,53],[[9,[54]]]],[[55,56,48],[[9,[[28,[57]],22]]]],[[[34,[40]],55,56,48],[[9,[[28,[57]],22]]]],[[[38,[40,58]],55,56,48],[[9,[[28,[57]],22]]]],[[[34,[40]],48,52,[59,[41]]],[[9,[28,50]]]],[[44,18],[[9,[60]]]],[[45,18],[[9,[60]]]],[[34,18],[[9,[60]]]],[[34,18],[[9,[60]]]],[[46,18],[[9,[60]]]],[[47,18],[[9,[60]]]],[[38,18],[[9,[60]]]],[[38,18],[[9,[60]]]],[34,15],[38,15],[[]],[[]],[61,34],[62,34],[63,34],[64,34],[[]],[65,34],[66,34],[[]],[[]],[[]],[39,[[9,[38,26]]]],[33,[[9,[34,26]]]],[33,[[9,[38,26]]]],[[33,53],[[9,[38,26]]]],[33,[[9,[38,26]]]],[67,[[9,[34,26]]]],[67,[[9,[38,26]]]],[[38,5],[[28,[38]]]],[[38,5],28],[34,[[9,[26]]]],[34,[[9,[26]]]],[38,15],[38,15],[[[34,[40]]],15],[44],[45],[34],[46],[47],[38],[[]],[[]],[[]],[[]],[[]],[[]],[38,39],[[48,35],[[9,[22]]]],[[68,48,35],[[9,[22]]]],[[[34,[40]]],15],[38,15],[38,69],[38,70],[34,[[9,[71,26]]]],[38,[[9,[71,26]]]],[38,[[9,[72]]]],[[44,48],[[28,[73]]]],[38,[[28,[5]]]],[38,[[28,[5]]]],[38,[[28,[5]]]],[38,[[9,[5,26]]]],[34,[[9,[5,26]]]],[38,[[9,[5,26]]]],[[],33],[[],33],[[],33],[[[38,[74]]],[[9,[34,26]]]],[[],34],[[],34],[[[38,[46]]],[[9,[34,26]]]],[[5,[8,[7]]],[[9,[34,26]]]],[66,34],[62,34],[[],[[9,[34,26]]]],[[[38,[47]]],[[9,[34,26]]]],[[5,[8,[7]]],[[9,[34,26]]]],[[[28,[75]]],[[9,[34,26]]]],[[],[[9,[34,26]]]],[[[38,[47]]],[[9,[34,26]]]],[[5,[8,[7]]],[[9,[34,26]]]],0,0,[38,[[9,[26]]]],[52,[[9,[38,26]]]],[[48,33],[[9,[26]]]],[52,[[9,[38,26]]]],[[52,53],[[9,[38,26]]]],[[44,44],[[28,[14]]]],[[45,45],[[28,[14]]]],[[34,34],[[28,[14]]]],[[46,46],[[28,[14]]]],[[47,47],[[28,[14]]]],[[38,38],[[28,[14]]]],[[],5],[[],5],[[],5],0,[38,15],[34,[[9,[26]]]],[38,[[9,[54]]]],[[34,76],[[9,[26]]]],[38,[[9,[[8,[[8,[2,7]],7]],26]]]],[38,[[9,[[8,[[8,[2,7]],7]],26]]]],[34,[[9,[52,26]]]],[34,52],[38,5],[34,9],[38,9],[[],77],[[],77],[[],77],0,[[]],[[]],[[]],[[]],[[]],[[]],[[],30],[[],30],[[[34,[40]],78],30],[38,[[9,[26]]]],[38,[[9,[26]]]],[34,9],[38,9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],0,[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[34,52],[[]],[[]],[[]],[[]],[[]],[[]],0,[38,15],0,[33,[[9,[30,22]]]],[33,[[9,[22]]]],[33,[[9,[30,22]]]],[33,[[9,[22]]]],0,0,0,0,0,0,0,0,0,0,0,0,[[]],[[]],[[22,18],19],[[22,18],19],[[]],[23,22],[79,22],[25,22],[80,22],[26,22],[81,22],[20,22],[[]],[29],[[],30],[[],9],[[],9],[[],32],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[82,82],[83,83],[84,84],[57,57],[85,85],[56,56],[[]],[[]],[[]],[[]],[[]],[[]],0,0,[[],85],[[82,82],15],[[83,83],15],[[84,84],15],[[57,57],15],[[85,85],15],[[23,23],15],[[82,18],19],[[83,18],19],[[84,18],19],[[57,18],19],[[85,18],19],[[23,18],19],[[23,18],19],[[56,18],19],[[]],[[]],[15,84],[[]],[[]],[83,57],[[]],[[]],[[]],[[57,86],[[9,[85,23]]]],[82],[85],[83,30],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[83,15],[84,15],[85,15],0,[[85,85],[[28,[14]]]],[29],[57,15],0,[82,9],[83,9],[84,9],[57,9],[85,9],0,[[]],[[]],[[]],[[]],[[]],[[]],[[],30],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[35,[[9,[87,22]]]],[[[89,[[88,[46]]]],35],[[9,[87,22]]]],[[[90,[[88,[47]]]],35],[[9,[87,22]]]],[[[91,[[88,[47]]]],35],[[9,[87,22]]]],[[[93,[[92,[46]]]],35],[[9,[87,22]]]],[[[94,[[92,[46]]]],35],[[9,[87,22]]]],[[[95,[[92,[47]]]],35],[[9,[87,22]]]],[[[96,[[92,[47]]]],35],[[9,[87,22]]]],[[[97,[[92,[47]]]],35],[[9,[87,22]]]],[[[98,[[92,[47]]]],35],[[9,[87,22]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[87,48,35],[[9,[22]]]],[[48,35],[[9,[22]]]],[[48,35],[[9,[22]]]],[[48,35],[[9,[22]]]],[[48,35],[[9,[22]]]],[[48,35],[[9,[22]]]],[[48,35],[[9,[22]]]],[[48,35],[[9,[22]]]],[[48,35],[[9,[22]]]],[[48,35],[[9,[22]]]],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[],99],[[],37],[[40,41],42],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[39,[[9,[43]]]],[[],[[9,[43]]]],[[[101,[100,58]]],[[101,[100,58]]]],[37,37],[102,102],[103,103],[40,40],[104,104],[105,105],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[103,103],14],[[40,40],14],[[104,104],14],[[105,105],14],0,[[],102],[[[101,[58]]]],[[40,41],42],[103,52],[[37,37],15],[[103,103],15],[[40,40],15],[[104,104],15],[[105,105],15],[[[107,[[0,[106,58]]]],18],19],[[37,18],19],[[102,18],19],[[25,18],19],[[25,18],19],[[103,18],[[9,[60]]]],[[103,18],[[9,[60]]]],[[40,18],[[9,[60]]]],[[40,18],[[9,[60]]]],[[108,18],[[9,[60]]]],[[108,18],[[9,[60]]]],[[104,18],[[9,[60]]]],[[109,18],[[9,[60]]]],[[105,18],[[9,[60]]]],[103,15],[110,[[111,[58]]]],[[]],[112,[[111,[58]]]],[[]],[[]],[[]],[[]],[20,25],[26,25],[[]],[[]],[[]],[42,40],[[]],[[]],[[]],[[]],[[40,99],[[107,[58]]]],[[108,99],[[107,[58]]]],[33,[[9,[40]]]],[33,[[9,[108]]]],[67,[[9,[103,26]]]],[40,73],[[],[[9,[101]]]],[[],[[9,[101]]]],[[],[[9,[101]]]],[[],[[9,[101]]]],[[[111,[58]]],15],[40,15],[103],[40],[104],[105],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],[[9,[107,25]]]],[[[28,[113]],73],[[9,[107,25]]]],[[101,[28,[113]],73],[[9,[107,25]]]],[101,[[9,[107,25]]]],[[[107,[58]]],[[9,[[107,[58]],25]]]],[40,[[9,[[107,[58]],25]]]],[108,[[9,[[107,[58]],25]]]],[[],[[9,[111,25]]]],[[[111,[58]]],[[9,[[111,[58]],25]]]],[101,[[9,[111,25]]]],[[[101,[58]]]],[[[111,[58]],35],[[28,[112]]]],[[[111,[58]],35,48],110],[40,15],[[],15],[37,15],[[],15],[37,15],[[],15],[37,15],[40,15],[40,15],0,0,0,[103,[[9,[71,26]]]],[[],99],[40,114],[38,[[28,[5]]]],[103,5],[103,5],[[99,99],99],[[],33],[[5,[8,[7]]],[[9,[103,26]]]],0,0,[38,[[9,[26]]]],[[[107,[58]],99],[[107,[58]]]],[[103,103],[[28,[14]]]],[[40,40],[[28,[14]]]],[[104,104],[[28,[14]]]],[[105,105],[[28,[14]]]],[[],5],0,[29],[103,[[9,[26]]]],[103,[[9,[[8,[[8,[2,7]],7]],26]]]],[103,5],[[],77],[103,39],[[],99],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[108,48],[[9,[40,115]]]],[[],30],[[],30],[[],30],[[],30],[38,[[9,[26]]]],[38,[[9,[26]]]],[103,[[9,[103]]]],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,[[],[[28,[16]]]],[[],[[28,[3]]]],[5,[[28,[31]]]],0,0,0,0,0,0,0,0,0,0,0,0,0,[[116,116],116],[[117,1,118,[120,[119]]]],0,[[117,121],[[9,[122]]]],[117,123],[117,124],[117,124],[117,123],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[117,125],[[9,[[128,[126,127]],17]]]],[117,[[128,[126,129]]]],[[117,130]],[117,86],[116,116],[[]],0,[117,9],0,[[],116],[131],[[117,1],[[28,[41]]]],[[117,52],28],[[117,1],30],[[],[[9,[116]]]],[[116,116],15],[[131,131],15],0,[[117,132,133],[[9,[15,17]]]],[[116,18],[[9,[60]]]],[[116,18],[[9,[60]]]],[[[117,[106]],18],19],[[134,18],19],[[131,18],19],[[131,18],19],[[135,18],19],[[[135,[106]],18],19],[[]],[[]],[[]],[[]],[[]],[[117,134],131],[117,116],[[117,1],68],[[117,134],131],[[117,10,[28,[136]],15],[[9,[137,17]]]],[[117,1],[[120,[55]]]],[[117,125,15],[[28,[13]]]],[[117,27],[[28,[10]]]],0,0,[[117,138],[[9,[15,139]]]],[[117,130,140],[[9,[15,[141,[140]]]]]],[[]],[[]],[[]],[[]],[[]],[52,15],[[117,52],15],0,[117,86],[117,[[28,[138]]]],[[117,15],[[8,[13]]]],[117,[[8,[10]]]],[117,35],[[142,[28,[142]],35],[[9,[117,135]]]],[[142,[28,[142]],35],[[9,[117,22]]]],[[117,1],41],[[117,1],[[9,[[28,[57]],17]]]],[29],[[117,1],[[28,[68]]]],[117,48],[116,9],[[117,132,133],[[9,[15,17]]]],0,[117,[[86,[1,[0,[143,100]]]]]],[[117,1],[[0,[143,100]]]],[117,144],[[]],[[],30],[[],30],[[],30],[116,16],[117,145],0,[116,16],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],0,[[],32],[[],32],[[],32],[[],32],[[],32],0,[[]],[[]],[[]],[[]],[[]],[[28,35,48],[[9,[30,17]]]],0,0,0,0,0,0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[146,146],[147,147],[148,148],[[]],[[]],[[]],[[[8,[11]],[8,[11]],3,16,52],[[9,[149,17]]]],[[146,[8,[11]],[8,[11]],3,16,52],[[9,[149,17]]]],[[147,[8,[11]],[8,[11]],3,16,52],[[9,[149,17]]]],[[148,[8,[11]],[8,[11]],3,16,52],[[9,[149,17]]]],[[16,3,52],150],[[],146],[[],147],[[],148],0,0,[[150,18],19],[[149,18],19],[[146,18],19],[[147,18],19],[[148,18],19],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[149,16],[16,148],0,[149,16],[[]],[[]],[[]],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,[[]],[[]],[151,[[28,[30]]]],[151,30],[[],[[9,[151]]]],[[117,33,15],[[9,[151,33]]]],[[151,18],19],[[]],[33,[[9,[151]]]],[[]],0,[151,9],[151,30],[[],9],[[],9],[[],32],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[55,152,118,[120,[119]]],[[28,[[120,[119]]]]]],0,0,[[55,48],153],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[153,34,48],55],[152,152],[24,24],[154,154],[[[156,[[0,[100,155,106,100]]]]],[[156,[[0,[100,155,106,100]]]]]],[118,118],[55,55],[133,133],[157,157],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[152,152],14],[[118,118],14],[[],118],[[],55],[[],133],[[],157],[[[156,[[0,[155,106,100]]]]]],[[],[[28,[108]]]],[[[156,[158]]],[[28,[108]]]],[[[156,[[44,[112]]]]],[[28,[108]]]],[[152,152],15],[[24,24],15],[[154,154],15],[[118,118],15],[[157,157],15],[[55,152],[[28,[120]]]],[[152,18],19],[[24,18],19],[[24,18],19],[[154,18],19],[[[156,[[0,[106,155,106,100]]]],18],19],[[118,18],19],[[55,18],19],[[133,18],19],[[157,18],19],[114,152],[159,152],[[]],[160,24],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[152],[48,152],[[[156,[158]],48],152],[[[156,[[44,[112]]]],48],152],[55,[[8,[152]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[[0,[155,106,100]],154],[[156,[[0,[155,106,100]]]]]],[[],55],[[152,152],[[28,[14]]]],[[118,118],[[28,[14]]]],[29],[[55,152,118],[[28,[[120,[119]]]]]],0,[[132,5,133,48],[[9,[24]]]],[[[156,[158]],132,5,133,48],[[9,[24]]]],[[[156,[[44,[112]]]],132,5,133,48],[[9,[24]]]],[[132,133,48],[[9,[24]]]],[[132,133,48],[[9,[24]]]],0,[55,[[8,[120]]]],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],30],0,0,[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,[[[128,[161,129]]],[[128,[161,129]]]],[[[128,[161,162]],27,137,5],[[9,[[128,[161,162]],17]]]],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,129]],52,16],[[128,[161,129]]]],[[[128,[161,162]],27],[[128,[161,162]]]],[[[128,[161,162]],27],[[9,[[128,[161,162]],17]]]],[[[128,[161,162]]],[[9,[[128,[161,162]],17]]]],[[[128,[161,162]],15],[[128,[161,162]]]],[[[128,[126,127]],52],[[9,[[128,[126,127]],17]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[[128,[161,162]],163],[[128,[161,162]]]],[129,129],[127,127],[[[128,[100]]],[[128,[100]]]],[164,164],[163,163],[[]],[[]],[[]],[[]],[[]],[[164,164],14],[[163,163],14],[[[128,[161,162]],161],[[128,[161,162]]]],[[[128,[161,162]],41],[[128,[161,162]]]],[[],129],[[],127],[[],164],[[],163],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,129]],52],[[128,[161,129]]]],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,162]],165],[[128,[161,162]]]],[[164,164],15],[[163,163],15],[[[128,[161,162]],16],[[128,[161,162]]]],[[[128,[161,162]],3],[[128,[161,162]]]],[[[128,[161,162]]],[[9,[17]]]],[[129,18],19],[[127,18],19],[[[128,[106,106,106]],18],19],[[164,18],19],[[163,18],19],[[]],[[]],[[]],[[]],[[]],[164],[163],[[[128,[161,162]]],[[128,[161,162]]]],[[]],[[]],[[]],[[]],[[]],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,162]],166],[[128,[161,162]]]],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,162]],164],[[128,[161,162]]]],[[164,164],[[28,[14]]]],[[163,163],[[28,[14]]]],[[[128,[161,162]],[86,[30,[8,[5]]]],1],[[128,[161,162]]]],[[[128,[161,129]],8],[[128,[161,129]]]],[[[128,[161,162]],136],[[128,[161,162]]]],[[164,130]],[[]],[[]],[[]],[[]],[[]],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[[128,[161,162]],[8,[27]]],[[128,[161,162]]]],[[[128,[161,162]],167],[[128,[161,162]]]],[[]],[[]],[[]],[[]],[[]]],"p":[[4,"KeychainKind"],[15,"u8"],[3,"FeeRate"],[15,"f32"],[15,"usize"],[3,"u5"],[3,"Global"],[3,"Vec"],[4,"Result"],[3,"LocalUtxo"],[3,"WeightedUtxo"],[4,"Utxo"],[3,"TransactionDetails"],[4,"Ordering"],[15,"bool"],[15,"u64"],[4,"Error"],[3,"Formatter"],[6,"Result"],[4,"Error"],[4,"Error"],[4,"Error"],[4,"PolicyError"],[4,"SignerError"],[4,"KeyError"],[4,"Error"],[3,"OutPoint"],[4,"Option"],[3,"Demand"],[3,"String"],[3,"TxOut"],[3,"TypeId"],[15,"str"],[4,"Descriptor"],[4,"Network"],[3,"Address"],[4,"ScriptContextEnum"],[3,"Miniscript"],[4,"Terminal"],[4,"DescriptorPublicKey"],[15,"u32"],[3,"DefiniteDescriptorKey"],[4,"ScriptContextError"],[3,"DescriptorXKey"],[4,"Wildcard"],[4,"Legacy"],[4,"Segwitv0"],[3,"Secp256k1"],[3,"PublicKey"],[4,"ConversionError"],[4,"DescriptorType"],[3,"Script"],[3,"ExtParams"],[4,"AnalysisError"],[3,"SignersContainer"],[4,"BuildSatisfaction"],[3,"Policy"],[8,"ScriptContext"],[3,"Range"],[3,"Error"],[3,"Sh"],[3,"Wsh"],[3,"Pkh"],[3,"Bare"],[3,"Tr"],[3,"Wpkh"],[3,"Tree"],[6,"ExtendedDescriptor"],[3,"Iter"],[3,"PkIter"],[4,"Policy"],[4,"LiftError"],[3,"DerivationPath"],[4,"BareCtx"],[4,"TapTree"],[3,"TxIn"],[4,"SigType"],[3,"HashMap"],[4,"Error"],[4,"Error"],[4,"Error"],[4,"PkOrF"],[4,"SatisfiableItem"],[4,"Satisfaction"],[3,"Condition"],[3,"BTreeMap"],[6,"DescriptorTemplateOut"],[8,"IntoDescriptorKey"],[3,"P2Pkh"],[3,"P2Wpkh_P2Sh"],[3,"P2Wpkh"],[8,"DerivableKey"],[3,"Bip44"],[3,"Bip44Public"],[3,"Bip49"],[3,"Bip49Public"],[3,"Bip84"],[3,"Bip84Public"],[6,"ValidNetworks"],[8,"Clone"],[3,"GeneratedKey"],[3,"PrivateKeyGenerateOptions"],[3,"SortedMultiVec"],[3,"SinglePub"],[4,"SinglePubKey"],[8,"Debug"],[4,"DescriptorKey"],[4,"DescriptorSecretKey"],[3,"SinglePriv"],[3,"ExtendedPubKey"],[4,"ExtendedKey"],[3,"ExtendedPrivKey"],[6,"KeySource"],[3,"Fingerprint"],[3,"DescriptorKeyParseError"],[3,"Balance"],[3,"Wallet"],[3,"SignerOrdering"],[8,"TransactionSigner"],[3,"Arc"],[6,"Update"],[6,"UpdateError"],[3,"ChainGraph"],[3,"TxGraph"],[3,"Txid"],[6,"DefaultCoinSelectionAlgorithm"],[3,"BumpFee"],[3,"TxBuilder"],[3,"CreateTx"],[3,"Transaction"],[3,"AddressInfo"],[3,"PartiallySignedTransaction"],[3,"SignOptions"],[4,"AddressIndex"],[4,"NewError"],[3,"PsbtSighashType"],[3,"Input"],[3,"BlockId"],[4,"InsertCheckpointError"],[4,"ConfirmationTime"],[4,"InsertTxError"],[8,"IntoWalletDescriptor"],[8,"Iterator"],[3,"KeychainChangeSet"],[8,"DoubleEndedIterator"],[3,"LargestFirstCoinSelection"],[3,"OldestFirstCoinSelection"],[3,"BranchAndBoundCoinSelection"],[3,"CoinSelectionResult"],[4,"Excess"],[3,"FullyNodedExport"],[4,"SignerId"],[6,"KeyMap"],[4,"SignerContext"],[8,"Sized"],[3,"SignerWrapper"],[4,"TapLeavesOptions"],[3,"PrivateKey"],[3,"Hash"],[4,"Error"],[8,"CoinSelectionAlgorithm"],[8,"TxBuilderContext"],[4,"ChangeSpendPolicy"],[4,"TxOrdering"],[3,"Sequence"],[4,"LockTime"],[15,"i32"],[8,"Vbytes"],[13,"InsufficientFunds"],[13,"FeeRateTooLow"],[13,"FeeTooLow"],[13,"Foreign"],[8,"ExtractPolicy"],[13,"PsbtTimelocks"],[13,"Complete"],[13,"Partial"],[13,"PartialComplete"],[13,"Sha256Preimage"],[13,"Hash256Preimage"],[13,"Ripemd160Preimage"],[13,"Hash160Preimage"],[13,"Thresh"],[13,"Multisig"],[13,"AbsoluteTimelock"],[13,"RelativeTimelock"],[8,"DescriptorTemplate"],[8,"GeneratableKey"],[8,"ExtScriptContext"],[8,"GeneratableDefaultOptions"],[8,"PsbtUtils"],[8,"IsDust"],[13,"Change"],[13,"NoChange"],[8,"SignerCommon"],[8,"InputSigner"],[13,"Tap"]]},\
-"bdk_chain":{"doc":"This crate is a collection of core structures for Bitcoin â¦","t":[3,17,4,13,13,8,8,3,3,4,13,13,11,2,11,11,11,11,11,11,11,11,11,11,0,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,12,11,11,12,11,11,11,11,11,11,11,11,11,11,12,11,11,11,0,11,11,11,11,11,2,11,12,11,11,11,11,11,11,11,11,11,11,0,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,13,13,3,3,13,6,4,13,4,3,13,13,4,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,12,12,17,3,3,3,3,3,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,12,11,12,11,11,11,11,11,11,16,3,8,16,10,11,11,11,11,11,11,10,11,11,11,11,11,11,11,8,3,13,4,4,13,3,13,13,13,4,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,3,3,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,12,11,11,11,11,11,11,11,11,11,11],"n":["BlockId","COINBASE_MATURITY","ConfirmationTime","Confirmed","Confirmed","DescriptorExt","ForEachTxOut","FullTxOut","SpkTxOutIndex","TxHeight","Unconfirmed","Unconfirmed","all_spks","bitcoin","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","chain_graph","chain_position","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","default","default","default","deserialize","deserialize","deserialize","dust_value","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","for_each_txout","from","from","from","from","from","from","from","from","hash","hash","hash","height","height","height","index_of_spk","insert_spk","into","into","into","into","into","is_confirmed","is_confirmed","is_mature","is_on_coinbase","is_relevant","is_spendable_at","is_used","keychain","mark_used","max_ord_of_height","max_ord_of_height","min_ord_of_height","min_ord_of_height","miniscript","net_value","outpoint","outputs_in_range","partial_cmp","partial_cmp","partial_cmp","scan","scan_txout","sent_and_received","serialize","serialize","serialize","sparse_chain","spent_by","spk_at_index","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","tx_graph","txout","txout","txouts","txouts_in_tx","type_id","type_id","type_id","type_id","type_id","unmark_used","unused_spks","vzip","vzip","vzip","vzip","vzip","height","time","Chain","Chain","ChainGraph","ChangeSet","Conflict","InsertCheckpointError","InsertTxError","Missing","NewError","UnresolvableConflict","UnresolvableConflict","UnresolvableConflict","UpdateError","already_confirmed_tx","append","apply_changeset","apply_update","as_ref","as_ref","as_ref","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","chain","chain","checkpoint_limit","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","contains_eviction","default","default","deserialize","determine_changeset","eq","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_txout","for_each_txout","from","from","from","from","from","from","from","from","from","from","full_txout","get_tx_in_chain","graph","graph","inflate_update","insert_checkpoint","insert_checkpoint_preview","insert_tx","insert_tx_preview","insert_txout","insert_txout_preview","into","into","into","into","into","into","invalidate_checkpoints","invalidate_checkpoints_preview","is_empty","is_empty","new","provide","provide","provide","provide","serialize","set_checkpoint_limit","spent_by","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","transactions_in_chain","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","tx_conflicts_in_chain","type_id","type_id","type_id","type_id","type_id","type_id","update_tx","vzip","vzip","vzip","vzip","vzip","vzip","a","b","BIP32_MAX_INDEX","Balance","DerivationAdditions","KeychainChangeSet","KeychainScan","KeychainTracker","KeychainTxOutIndex","add","add_keychain","add_keychain","append","append","apply_additions","apply_changeset","apply_update","as_inner","as_ref","as_ref","as_ref","as_ref","as_ref","balance","balance_at","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","chain","chain_graph","chain_graph","checkpoint_limit","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","confirmed","default","default","default","default","default","default","deref","derivation_indices","deserialize","deserialize","deserialize","determine_changeset","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_txout","from","from","from","from","from","from","from","from","from","full_txouts","full_utxos","graph","immature","inner","insert_checkpoint","insert_checkpoint_preview","insert_tx","insert_tx_preview","into","into","into","into","into","into","is_empty","is_empty","keychains","keychains","last_active_indices","last_revealed_index","last_revealed_indices","last_used_index","last_used_indices","lookahead_to_target","lookahead_to_target_multi","lookaheads","mark_used","next_index","next_unused_spk","persist","reveal_next_spk","reveal_to_target","reveal_to_target_multi","revealed_spks_of_all_keychains","revealed_spks_of_keychain","scan","scan_txout","serialize","serialize","serialize","set_checkpoint_limit","set_lookahead","set_lookahead_for_all","spks_of_all_keychains","spks_of_keychain","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","total","trusted_pending","trusted_spendable","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","txout_index","txouts_of_keychain","type_id","type_id","type_id","type_id","type_id","type_id","unmark_used","untrusted_pending","unused_spks_of_keychain","update","vzip","vzip","vzip","vzip","vzip","vzip","LoadError","Persist","PersistBackend","WriteError","append_changeset","borrow","borrow_mut","commit","fmt","from","into","load_into_keychain_tracker","new","stage","staged","try_from","try_into","type_id","vzip","ChainPosition","ChangeSet","HashNotMatching","InsertCheckpointError","InsertTxError","NotConnected","SparseChain","TxInconsistent","TxMovedUnexpectedly","TxTooHigh","UpdateError","append","apply_changeset","apply_update","as_ref","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","changeset_additions","checkpoint_at","checkpoint_limit","checkpoints","checkpoints","clear_mempool","clear_mempool_preview","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","default","default","deserialize","determine_changeset","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from_checkpoints","full_txout","height","initial_changeset","insert_checkpoint","insert_checkpoint_preview","insert_tx","insert_tx_preview","into","into","into","into","into","invalidate_checkpoints","invalidate_checkpoints_preview","is_empty","is_empty","latest_checkpoint","max_ord_of_height","min_ord_of_height","provide","provide","provide","range_checkpoints","range_txids","range_txids_by_height","range_txids_by_position","serialize","set_checkpoint_limit","spent_by","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","tx_position","txids","txids","type_id","type_id","type_id","type_id","type_id","unconfirmed","vzip","vzip","vzip","vzip","vzip","height","original_hash","update_hash","original_pos","tip_height","tx_height","txid","txid","update_pos","original_pos","txid","update_pos","Additions","TxDescendants","TxGraph","all_txouts","append","apply_additions","apply_update","as_ref","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","calculate_fee","checked_sum","checked_sum","clone","clone","clone_into","clone_into","default","default","deserialize","determine_additions","direct_conflicts_of_tx","eq","eq","fmt","fmt","for_each_txout","for_each_txout","from","from","from","full_transactions","get_tx","get_txout","insert_tx","insert_tx_preview","insert_txout","insert_txout_preview","into","into","into","into_iter","is_empty","is_empty","new","next","outspends","partial_transactions","serialize","to_owned","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","tx","tx_outspends","txout","txouts","txouts","type_id","type_id","type_id","vzip","vzip","vzip","walk_conflicts","walk_descendants"],"q":["bdk_chain","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::ConfirmationTime","","bdk_chain::chain_graph","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::chain_graph::NewError","","bdk_chain::keychain","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::keychain::persist","","","","","","","","","","","","","","","","","","","bdk_chain::sparse_chain","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::sparse_chain::InsertCheckpointError","","","bdk_chain::sparse_chain::InsertTxError","","","","","","bdk_chain::sparse_chain::UpdateError","","","bdk_chain::tx_graph","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"d":["A reference to a block in the canonical chain.","How many confirmations are needed f or a coinbase output â¦","Block height and timestamp at which a transaction is â¦","","","A trait to extend the functionality of a miniscript â¦","Trait to do something with every txout contained in a â¦","A TxOut with as much data as we can retrieve about it","An index storing TxOuts that have a script pubkey that â¦","Represents the height at which a transaction is confirmed.","","","The script pubkeys that are being tracked by the index.","","","","","","","","","","","","Module for structures that combine the features of â¦","The position of the transaction in outpoint in the overall â¦","","","","","","","","","","","","","","","","","","","","Returns the minimum value (in satoshis) at which an output â¦","","","","","","","","","","","The provided closure f will be called with each â¦","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","","","Returns the argument unchanged.","Returns the argument unchanged.","","","The hash of the block.","","","The height of the block.","Returns the index associated with the script pubkey.","Adds a script pubkey to scan for. Returns false and does â¦","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","Whether this output is on a coinbase transaction.","Whether any of the inputs of this transaction spend a â¦","Whether the utxo is/was/will be spendable at height.","Returns whether the script pubkey at index has been used â¦","Module for keychain related structures.","Marks the script pubkey at index as used even though it â¦","","","","","","Computes the net value that this transaction gives to the â¦","The location of the TxOut.","Iterates over all the outputs with script pubkeys in an â¦","","","","Scans an object containing many txouts.","Scan a single TxOut for a matching script pubkey and â¦","Computes total input value going from script pubkeys in â¦","","","","Module for structures that maintain sparse (purposely â¦","The txid and chain position of the transaction (if any) â¦","Returns the script that has been inserted at the index.","","","","","","","","","","","","","","","","","Module for structures that store and traverse transactions.","Returns the txout and script pubkey index of the TxOut at â¦","The TxOut.","Iterate over all known txouts that spend to tracked script â¦","Finds all txouts on a transaction that has previously been â¦","","","","","","Undoes the effect of mark_used. Returns whether the index â¦","Iterates over all unused script pubkeys in an index range.","","","","","","","","","The update chain was inconsistent with the existing chain","A consistent combination of a SparseChain<P> and a â¦","Represents changes to ChainGraph.","Two transactions within the sparse chain conflicted with â¦","A nice alias of sparse_chain::InsertCheckpointError.","Error that may occur when inserting a transaction.","One or more transactions in the chain were not in the graph","Error that may occur when calling ChainGraph::new.","Represents an unresolvable conflict between an updateâs â¦","","A transaction in the update spent the same input as an â¦","Represents an update failure.","","Appends the changes in other into self such that applying â¦","Applies changeset to self.","Applies the update chain graph. Note this is shorthand for â¦","","","","","","","","","","","","","","","","Returns a reference to the internal SparseChain.","","Gets the checkpoint limit.","","","","","","","","","","","","","Returns true if this ChangeSet contains transaction â¦","","","","Calculates the difference between self and update in the â¦","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Get the full transaction output at an outpoint if it â¦","Get a transaction currently in the underlying SparseChain.","Returns a reference to the internal TxGraph.","","Take an update in the form of a SparseChain<P> and attempt â¦","Inserts checkpoint into Self.","Determines the changes required to insert a block_id (a â¦","Inserts Transaction at the given chain position.","Determines the changes required to insert a transaction â¦","Inserts a TxOut into the internal TxGraph.","Determines the changes required to insert a TxOut into the â¦","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Invalidate checkpoints from_height (inclusive) and above. â¦","Determines the changes required to invalidate checkpoints â¦","Whether the chain graph contains any data whatsoever.","Returns true if this ChangeSet records no changes.","Create a new chain graph from a chain and a graph.","","","","","","Sets the checkpoint limit.","Find the transaction in the chain that spends outpoint.","","","","","","","","","","","Iterate over the full transactions and their position in â¦","","","","","","","","","","","","","Given a transaction, return an iterator of txids that â¦","","","","","","","","","","","","","","","","Maximum BIP32 derivation index.","Balance, differentiated into various categories.","Represents updates to the derivation index of a â¦","Represents changes to a KeychainTracker.","An update that includes the last active indexes of each â¦","A convenient combination of a KeychainTxOutIndex and a â¦","A convenient wrapper around SpkTxOutIndex that relates â¦","","Add a keychain to the trackerâs txout_index with a â¦","Add a keychain to the trackerâs txout_index with a â¦","Append another DerivationAdditions into self.","Appends the changes in other into self such that applying â¦","Applies the derivation additions to the KeychainTxOutIndexâ¦","Applies the changes in changeset to KeychainTracker.","Directly applies a KeychainScan on KeychainTracker.","Get the inner map of the keychain to its new derivation â¦","","","","","","Returns the balance of the keychain, i.e., the value of â¦","Returns the balance of all spendable confirmed unspent â¦","","","","","","","","","","","","","Returns a reference to the internal SparseChain (which is â¦","Returns a reference to the internal ChainGraph.","The changes that have occurred in the blockchain","Get the checkpoint limit of the internal SparseChain.","","","","","","","","","","","","","Confirmed and immediately spendable balance","","","","","","","","The changes in local keychain derivation indices","","","","Determines the resultant KeychainChangeSet if the given â¦","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","","","Returns the argument unchanged.","Iterates through FullTxOuts that are considered to exist â¦","Iterates through FullTxOuts that are unspent outputs.","Returns a reference to the internal TxGraph (which is part â¦","All coinbase outputs not yet matured","Return a reference to the internal SpkTxOutIndex.","Directly insert a block_id into the tracker.","Determines the changes as a result of inserting block_id â¦","Directly insert a transaction into the inner ChainGraph â¦","Determines the changes as a result of inserting a â¦","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Returns whether the additions are empty.","Returns whether the KeychainChangeSet is empty (no changes â¦","Get the internal map of keychains to their descriptors. â¦","Return a reference to the internal map of the keychain to â¦","The last active indexes of each keychain","Get the last derivation index revealed for keychain.","Get the last derivation index that is revealed for each â¦","Returns the highest derivation index of the keychain where â¦","Returns the highest derivation index of each keychain that â¦","Store lookahead scripts until target_index.","Convenience method to call lookahead_to_target for â¦","Return the lookahead setting for each keychain.","Marks the script pubkey at index as used even though the â¦","Get the next derivation index for keychain. The next index â¦","Gets the next unused script pubkey in the keychain. I.e., â¦","Persistence for changes made to a KeychainTracker.","Attempts to reveal the next script pubkey for keychain.","Reveals script pubkeys of the keychainâs descriptor up â¦","Convenience method to call Self::reveal_to_target on â¦","Convenience method to get revealed_spks_of_keychain of all â¦","Iterates over the script pubkeys revealed by this index â¦","Scans an object for relevant outpoints, which are stored â¦","Scan a single outpoint for a matching script pubkey.","","","","Set the checkpoint limit of the internal SparseChain.","Set the lookahead count for keychain.","Convenience method to call set_lookahead for all keychains.","Generates script pubkey iterators for every keychain. The â¦","Generates a script pubkey iterator for the given keychainâ¦","","","","","","","","Get the whole balance visible to the wallet.","Unconfirmed UTXOs generated by a wallet tx","Get sum of trusted_pending and confirmed coins.","","","","","","","","","","","","","Index between script pubkeys to transaction outputs","Iterates over all the OutPoint that have a TxOut with a â¦","","","","","","","Undoes the effect of mark_used. Returns whether the index â¦","Unconfirmed UTXOs received from an external wallet","Iterates over all unused script pubkeys for a keychain â¦","The update data in the form of a chain that could be â¦","","","","","","","The error the backend returns when it fails to load.","Persist wraps a PersistBackend to create a convenient â¦","A persistence backend for Persist.","The error the backend returns when it fails to write.","Appends a new changeset to the persistent backend.","","","Commit the staged changes to the underlying persistence â¦","","Returns the argument unchanged.","Calls U::from(self).","Applies all the changesets the backend has received to â¦","Create a new Persist from a PersistBackend.","Stage a changeset to later persistence with commit.","Get the changes that havenât been committed yet","","","","","Represents a position in which transactions are ordered in â¦","The return value of determine_changeset.","Occurs when a checkpoint of the same height already exists â¦","Represents a failure when trying to insert a checkpoint â¦","Represents a failure when trying to insert a Txid into â¦","The update cannot be applied to the chain because the â¦","This is a non-monotone structure that tracks relevant Txidâ¦","The update contains inconsistent tx states (e.g., it â¦","Occurs when the Txid is already in the SparseChain, and â¦","Occurs when the Txid is to be inserted at a height higher â¦","Represents an update failure of SparseChain.","Appends the changes of other into self such that applying â¦","","Updates SparseChain with another chain that connects to it.","","","","","","","","","","","","Return Txids that would be added to the sparse chain if â¦","Get the checkpoint at the given height if it exists.","Returns the value set as the checkpoint limit.","Return a BTreeMap of all checkpoints (block hashes by â¦","","Clears all transactions of height TxHeight::Unconfirmed.","Determines the ChangeSet when all transactions of height â¦","","","","","","","","","","","","","","Preview changes of updating Self with another chain that â¦","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Creates a new chain from a list of block hashes and â¦","Attempt to retrieve a FullTxOut of the given outpoint.","Get the transaction height of the position.","Derives a ChangeSet that assumes that there are no â¦","Insert a checkpoint (BlockId).","Determines the resultant ChangeSet if BlockId was inserted.","Inserts a given Txid at pos.","Determines the resultant ChangeSet if Txid was inserted at â¦","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Invalidate checkpoints from_height (inclusive) and above.","Determines the ChangeSet when checkpoints from_height â¦","Returns whether the sparse chain contains any checkpoints â¦","Whether this changeset contains no changes.","Get the checkpoint for the last known tip.","Get the positionâs upper bound of a given height.","Get the positionâs lower bound of a given height.","","","","Return an iterator over checkpoints in a height range, in â¦","Iterate over a sub-range of positioned Txids.","Iterate over a sub-range of positioned Txids, where the â¦","Iterate over a sub-range of positioned Txids, where the â¦","","Set the checkpoint limit.","Finds the transaction in the chain that spends outpoint.","","","","","","","","","","","","","","","","","","","Return the ChainPosition of a txid.","Iterate over all Txids ordered by their ChainPosition.","","","","","","","Get the unconfirmed position.","","","","","","","","","","","","","","","","","","A structure that represents changes to a TxGraph.","An iterator that traverses transaction descendants.","A graph of transactions and spends.","Iterate over all tx outputs known by TxGraph.","Appends the changes in other into self such that applying â¦","Applies Additions to TxGraph.","Extends this graph with another so that self becomes the â¦","","","","","","","","Calculates the fee of a given transaction. Returns 0 if tx â¦","","","","","","","","","","Previews the resultant Additions when Self is updated â¦","Given a transaction, return an iterator of txids that â¦","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Iterate over all full transactions in the graph.","Get a transaction by txid. This only returns Some for full â¦","Obtains a single tx output (if any) at the specified â¦","Inserts the given transaction into TxGraph.","Returns the resultant Additions if the given transaction â¦","Inserts the given TxOut at OutPoint.","Returns the resultant Additions if the given txout is â¦","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","Whether the graph has any transactions or outputs in it.","Returns true if the Additions is empty (no transactions or â¦","Construct a new TxGraph from a list of transactions.","","The transactions spending from this output.","Iterate over all partial transactions (outputs only) in â¦","","","","","","","","","","","Iterates over the transactions spending from txid.","","Returns a BTreeMap of vout to output of the provided txid.","Iterates over all outpoints contained within Additions.","","","","","","","Creates an iterator that both filters and maps conflicting â¦","Creates an iterator that filters and maps descendants from â¦"],"i":[0,0,0,5,6,0,0,0,0,0,5,6,3,0,3,5,6,7,8,3,5,6,7,8,0,8,3,5,6,7,8,3,5,6,7,8,5,6,7,3,5,7,5,6,7,64,5,6,7,8,3,5,5,6,7,8,65,3,5,5,6,7,7,7,8,5,6,7,5,6,7,3,3,3,5,6,7,8,5,6,8,8,3,8,3,0,3,5,6,5,6,0,3,8,3,5,6,7,3,3,3,5,6,7,0,8,3,3,5,6,7,8,5,3,5,6,7,8,3,5,6,7,8,0,3,8,3,3,3,5,6,7,8,3,3,3,5,6,7,8,66,66,40,35,0,0,39,0,0,39,0,0,40,35,0,41,33,34,34,34,34,34,34,33,39,40,35,41,34,33,39,40,35,41,34,33,34,34,33,39,40,35,41,34,33,39,40,35,41,33,34,33,33,34,34,33,39,40,35,41,34,33,39,39,40,40,35,35,41,41,34,33,34,33,39,40,40,40,35,35,35,41,34,34,34,33,34,34,34,34,34,34,34,34,33,39,40,35,41,34,34,34,33,34,39,40,35,41,33,34,34,34,33,39,40,35,41,39,40,35,41,34,34,33,39,40,35,41,34,33,39,40,35,41,34,34,33,39,40,35,41,41,34,33,39,40,35,41,67,67,0,0,0,0,0,0,0,48,49,52,53,54,52,49,49,53,49,49,49,53,55,49,49,49,52,53,55,54,48,49,52,53,55,54,48,49,49,54,49,49,52,53,55,54,48,49,52,53,55,54,48,48,49,52,53,55,54,48,52,54,53,54,48,49,53,55,48,49,52,53,55,54,48,48,54,49,52,53,55,55,54,54,54,48,49,49,49,48,52,49,49,49,49,49,52,53,55,54,48,53,54,49,52,55,52,52,52,52,52,52,52,52,52,52,0,52,52,52,52,52,52,52,53,54,48,49,52,52,52,52,49,52,53,55,54,48,48,48,48,48,49,52,53,55,54,48,49,52,53,55,54,48,49,52,49,52,53,55,54,48,52,48,52,55,49,52,53,55,54,48,68,0,0,68,68,56,56,56,56,56,56,68,56,56,56,56,56,56,56,0,0,58,0,0,43,0,43,42,42,0,57,37,37,37,37,42,58,43,57,37,42,58,43,57,37,37,37,37,57,37,37,37,42,58,43,57,37,42,58,43,57,37,57,57,37,37,42,58,43,57,37,42,42,58,58,43,43,57,37,42,58,43,57,37,37,21,37,37,37,37,37,37,42,58,43,57,37,37,37,57,37,21,21,42,58,43,37,37,37,37,57,37,37,37,42,58,43,57,42,58,43,37,42,58,43,57,37,42,58,43,57,37,37,57,37,42,58,43,57,21,37,42,58,43,57,69,69,69,70,71,71,71,70,70,72,72,72,0,0,0,36,59,36,36,36,62,36,59,62,36,59,36,62,62,36,59,36,59,36,59,59,36,36,36,59,36,59,36,59,62,36,59,36,36,36,36,36,36,36,62,36,59,62,36,59,36,62,36,36,59,36,59,62,36,59,62,36,59,59,36,59,36,59,62,36,59,62,36,59,36,36],"f":[0,0,0,0,0,0,0,0,0,0,0,0,[[[3,[[0,[1,2]]]]],4],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,[[[3,[1]]],[[3,[1]]]],[5,5],[6,6],[7,7],[[[8,[1]]],[[8,[1]]]],[[]],[[]],[[]],[[]],[[]],[[5,5],9],[[6,6],9],[[7,7],9],[[],3],[[],5],[[],7],[[],[[10,[5]]]],[[],[[10,[6]]]],[[],[[10,[7]]]],[[],11],[[5,5],12],[[6,6],12],[[7,7],12],[[[8,[13]],8],12],[[[3,[14]],15],16],[[5,15],16],[[5,15],16],[[6,15],16],[[7,15],16],[[[8,[14]],15],16],[17],[[]],[[[19,[18]]],5],[[]],[[]],[[],7],[[],7],[[]],[[]],[5],[6],0,[5,5],[6,5],0,[[[3,[[0,[1,2]]]],20],19],[[[3,[[0,[1,2]]]],[0,[1,2]],20],12],[[]],[[]],[[]],[[]],[[]],[5,12],[6,12],[[[8,[21]],18],12],0,[[[3,[[0,[1,2]]]],22],12],[[[8,[21]],18],12],[[[3,[[0,[1,2]]]]],12],0,[[[3,[[0,[1,2]]]]],12],[5,5],[5,6],[5,5],[5,6],0,[[[3,[[0,[1,2]]]],22],23],0,[[[3,[[0,[1,2]]]],[24,[[0,[1,2]]]]],25],[[5,5],[[19,[9]]]],[[6,6],[[19,[9]]]],[[7,7],[[19,[9]]]],[[[3,[[0,[1,2]]]]],[[26,[[0,[1,2]]]]]],[[[3,[[0,[1,2]]]],27,28],19],[[[3,[[0,[1,2]]]],22]],[5,10],[6,10],[7,10],0,0,[[[3,[[0,[1,2]]]]],[[19,[20]]]],[[]],[[]],[[]],[[]],[[]],[[],29],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],0,[[[3,[[0,[1,2]]]],27],19],0,[[[3,[[0,[1,2]]]]],[[0,[25,30]]]],[[[3,[[0,[1,2]]]],31],25],[[],32],[[],32],[[],32],[[],32],[[],32],[[[3,[[0,[1,2]]]]],12],[[[3,[[0,[1,2]]]]],25],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[33,33]],[[34,33]],[[34,34],[[10,[33,35]]]],[34,34],[34,36],[34,37],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[34,37],0,[34,[[19,[38]]]],[[[34,[1]]],[[34,[1]]]],[[[33,[1]]],[[33,[1]]]],[[[39,[1]]],[[39,[1]]]],[[[40,[1]]],[[40,[1]]]],[[[35,[1]]],[[35,[1]]]],[[[41,[1]]],[[41,[1]]]],[[]],[[]],[[]],[[]],[[]],[[]],[33,12],[[],34],[[],33],[[],[[10,[33]]]],[[34,34],[[10,[33,35]]]],[[[34,[13]],34],12],[[[33,[13]],33],12],[[[39,[13]],39],12],[[[40,[13]],40],12],[[[35,[13]],35],12],[[[41,[13]],41],12],[[[34,[14]],15],16],[[[33,[14]],15],16],[[[39,[14]],15],16],[[[39,[14]],15],16],[[[40,[14]],15],16],[[[40,[14]],15],16],[[[35,[14]],15],16],[[[35,[14]],15],16],[[[41,[14]],15],16],[[[41,[14]],15],16],[[34,17]],[[33,17]],[[]],[[]],[[]],[[]],[41,40],[42,40],[41,35],[43,35],[[]],[[]],[[34,27],[[19,[8]]]],[[34,31],19],[34,36],0,[[34,37,44],[[10,[34,39]]]],[[34,7],[[10,[33,45]]]],[[34,7],[[10,[33,45]]]],[[34,22],[[10,[33,40]]]],[[34,22],[[10,[33,40]]]],[[34,27,28],33],[[34,27,28],33],[[]],[[]],[[]],[[]],[[]],[[]],[[34,18],33],[[34,18],33],[34,12],[33,12],[[37,36],[[10,[34,39]]]],[46],[46],[46],[46],[33,10],[[34,[19,[38]]]],[[34,27],19],[[]],[[]],[[]],[[]],[[]],[[]],[[],29],[[],29],[[],29],[[],29],[34,25],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[34,22],47],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],0,[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,[[48,48],48],[[49,[51,[50]]]],[[[52,[[0,[1,2,14]]]],[0,[1,2,14]],[51,[50]]]],[[[53,[2]],[53,[2]]]],[[54,54]],[[[52,[[0,[1,2,14]]]],[53,[[0,[1,2,14]]]]]],[[49,54]],[[49,55],[[10,[54,35]]]],[53,4],[49,37],[49,34],[49,36],[53,4],[55,36],[[49,17],48],[[49,18],11],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[49,37],[49,34],0,[49,[[19,[38]]]],[[[49,[1,1]]],[[49,[1,1]]]],[[[52,[1]]],[[52,[1]]]],[[[53,[1]]],[[53,[1]]]],[[[55,[1,1]]],[[55,[1,1]]]],[[[54,[1,1]]],[[54,[1,1]]]],[48,48],[[]],[[]],[[]],[[]],[[]],[[]],0,[[],49],[[],52],[[],53],[[],55],[[],54],[[],48],[52],0,[[],[[10,[53]]]],[[],[[10,[54]]]],[[],[[10,[48]]]],[[49,55],[[10,[54,35]]]],[[[53,[13]],53],12],[[[55,[13,13]],55],12],[[48,48],12],[[[49,[14,14]],15],16],[[[52,[14]],15],16],[[[53,[14]],15],16],[[[55,[14,14]],15],16],[[[54,[14,14]],15],16],[[48,15],16],[[48,15],16],[[54,17]],[[]],[[]],[[]],[[]],[34,55],[[]],[53,54],[33,54],[[]],[49,47],[49,47],[49,36],0,[[[52,[[0,[1,2,14]]]]],3],[[49,7],[[10,[54,45]]]],[[49,7],[[10,[54,45]]]],[[49,22],[[10,[54,40]]]],[[49,22],[[10,[54,40]]]],[[]],[[]],[[]],[[]],[[]],[[]],[53,12],[54,12],[49,4],[[[52,[[0,[1,2,14]]]]],4],0,[[[52,[[0,[1,2,14]]]]],[[19,[18]]]],[[[52,[[0,[1,2,14]]]]],4],[[[52,[[0,[1,2,14]]]]],[[19,[18]]]],[[[52,[[0,[1,2,14]]]]],[[4,[[0,[1,2,14]],18]]]],[[[52,[[0,[1,2,14]]]],18]],[[[52,[[0,[1,2,14]]]],[4,[[0,[1,2,14]],18]]]],[[[52,[[0,[1,2,14]]]]],4],[[[52,[[0,[1,2,14]]]],18],12],[[[52,[[0,[1,2,14]]]]]],[[[52,[[0,[1,2,14]]]]]],0,[[[52,[[0,[1,2,14]]]]]],[[[52,[[0,[1,2,14]]]],18]],[[[52,[[0,[1,2,14]]]],4]],[[[52,[[0,[1,2,14]]]]],[[4,[[0,[1,2,14]],[0,[47,1]]]]]],[[[52,[[0,[1,2,14]]]]],[[0,[25,1]]]],[[[52,[[0,[1,2,14]]]]],[[53,[[0,[1,2,14]]]]]],[[[52,[[0,[1,2,14]]]],27,28],[[53,[[0,[1,2,14]]]]]],[53,10],[54,10],[48,10],[[49,[19,[38]]]],[[[52,[[0,[1,2,14]]]],18]],[[[52,[[0,[1,2,14]]]],18]],[[[52,[[0,[1,2,14]]]]],[[4,[[0,[1,2,14]],[0,[47,1]]]]]],[[[52,[[0,[1,2,14]]]]],[[0,[47,1]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[],29],[48,11],0,[48,11],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],0,[[[52,[[0,[1,2,14]]]]],25],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[[52,[[0,[1,2,14]]]],18],12],0,[[[52,[[0,[1,2,14]]]]],25],0,[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,[54,10],[[]],[[]],[56,10],[[[56,[14,14,14]],15],16],[[]],[[]],[49,10],[[],56],[[56,54]],[56,54],[[],10],[[],10],[[],32],[[]],0,0,0,0,0,0,0,0,0,0,0,[[57,57]],[[[37,[21]],[57,[21]]]],[[[37,[21]],[37,[21]]],[[10,[[57,[21]],[43,[21]]]]]],[37,37],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[[37,[21]],57],47],[[[37,[21]],18],[[19,[7]]]],[[[37,[21]]],[[19,[38]]]],[[[37,[21]]],4],0,[[[37,[21]]],[[57,[21]]]],[[[37,[21]]],[[57,[21]]]],[[[37,[1]]],[[37,[1]]]],[[[42,[1]]],[[42,[1]]]],[58,58],[[[43,[1]]],[[43,[1]]]],[[[57,[1]]],[[57,[1]]]],[[]],[[]],[[]],[[]],[[]],[[],37],[[],57],[[],[[10,[57]]]],[[[37,[21]],[37,[21]]],[[10,[[57,[21]],[43,[21]]]]]],[[[37,[13]],37],12],[[[42,[13]],42],12],[[58,58],12],[[[43,[13]],43],12],[[[57,[13]],57],12],[[[37,[14]],15],16],[[[42,[14]],15],16],[[[42,[14]],15],16],[[58,15],16],[[58,15],16],[[[43,[14]],15],16],[[[43,[14]],15],16],[[[57,[14]],15],16],[[]],[[]],[[]],[[]],[[]],[[],[[37,[21]]]],[[[37,[21]],36,27],[[19,[[8,[21]]]]]],[[],5],[[[37,[21]]],[[57,[21]]]],[[[37,[21]],7],[[10,[[57,[21]],58]]]],[[[37,[21]],7],[[10,[[57,[21]],58]]]],[[[37,[21]],31,21],[[10,[[57,[21]],[42,[21]]]]]],[[[37,[21]],31,21],[[10,[[57,[21]],[42,[21]]]]]],[[]],[[]],[[]],[[]],[[]],[[[37,[21]],18],[[57,[21]]]],[[[37,[21]],18],[[57,[21]]]],[[[37,[21]]],12],[57,12],[[[37,[21]]],[[19,[7]]]],[5],[5],[46],[46],[46],[[[37,[21]],[24,[18]]],25],[[[37,[21]]],25],[[[37,[21]]],25],[[[37,[21]]],25],[57,10],[[[37,[21]],[19,[38]]]],[[[37,[21]],36,27],19],[[]],[[]],[[]],[[]],[[]],[[],29],[[],29],[[],29],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],[[[37,[21]],31],19],[[[37,[21]]],[[0,[25,30]]]],0,[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[36,47],[[59,59]],[[36,59]],[[36,36],59],[36,36],[[]],[[]],[[]],[[]],[[]],[[]],[[36,22],[[19,[23]]]],[[],[[19,[60]]]],[[],[[19,[61]]]],[36,36],[59,59],[[]],[[]],[[],36],[[],59],[[],[[10,[59]]]],[[36,36],59],[[36,22],47],[[36,36],12],[[59,59],12],[[36,15],16],[[59,15],16],[[36,17]],[[59,17]],[[]],[[]],[[]],[36,47],[[36,31],[[19,[22]]]],[[36,27],[[19,[28]]]],[[36,22],59],[[36,22],59],[[36,27,28],59],[[36,27,28],59],[[]],[[]],[[]],[[]],[36,12],[59,12],[44,36],[62,19],[[36,27],63],[36,47],[59,10],[[]],[[]],[[],10],[[],10],[[],10],[[],10],[[],10],[[],10],0,[[36,31],25],0,[[36,31],[[19,[[4,[18,28]]]]]],[59,47],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[36,22],62],[[36,31],62]],"p":[[8,"Clone"],[8,"Ord"],[3,"SpkTxOutIndex"],[3,"BTreeMap"],[4,"TxHeight"],[4,"ConfirmationTime"],[3,"BlockId"],[3,"FullTxOut"],[4,"Ordering"],[4,"Result"],[15,"u64"],[15,"bool"],[8,"PartialEq"],[8,"Debug"],[3,"Formatter"],[6,"Result"],[8,"FnMut"],[15,"u32"],[4,"Option"],[3,"Script"],[8,"ChainPosition"],[3,"Transaction"],[15,"i64"],[8,"RangeBounds"],[8,"DoubleEndedIterator"],[3,"BTreeSet"],[3,"OutPoint"],[3,"TxOut"],[3,"String"],[8,"ExactSizeIterator"],[3,"Txid"],[3,"TypeId"],[3,"ChangeSet"],[3,"ChainGraph"],[4,"UpdateError"],[3,"TxGraph"],[3,"SparseChain"],[15,"usize"],[4,"NewError"],[4,"InsertTxError"],[3,"UnresolvableConflict"],[4,"InsertTxError"],[4,"UpdateError"],[8,"IntoIterator"],[6,"InsertCheckpointError"],[3,"Demand"],[8,"Iterator"],[3,"Balance"],[3,"KeychainTracker"],[4,"DescriptorPublicKey"],[4,"Descriptor"],[3,"KeychainTxOutIndex"],[3,"DerivationAdditions"],[3,"KeychainChangeSet"],[3,"KeychainScan"],[3,"Persist"],[3,"ChangeSet"],[4,"InsertCheckpointError"],[3,"Additions"],[3,"SignedAmount"],[3,"Amount"],[3,"TxDescendants"],[3,"HashSet"],[8,"DescriptorExt"],[8,"ForEachTxOut"],[13,"Confirmed"],[13,"Conflict"],[8,"PersistBackend"],[13,"HashNotMatching"],[13,"TxMovedUnexpectedly"],[13,"TxTooHigh"],[13,"TxInconsistent"]]},\
+"bdk":{"doc":"bdk","t":[13,13,13,13,13,4,13,3,13,13,13,13,13,2,13,13,13,13,13,13,4,13,3,13,13,13,13,13,13,13,2,13,13,13,3,13,2,13,4,8,2,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,12,0,14,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,14,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,0,11,12,11,11,11,11,0,12,12,12,11,11,11,2,11,2,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,12,11,11,11,11,11,11,11,12,10,5,11,11,11,11,11,11,11,0,11,12,12,12,12,12,12,13,6,4,2,4,3,6,8,13,6,8,16,6,4,3,13,13,2,8,4,13,13,6,13,13,4,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,12,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,10,11,11,0,11,11,11,11,11,11,11,11,11,11,11,10,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,12,5,5,5,5,13,13,4,13,13,13,13,13,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,13,13,4,13,3,6,13,13,6,13,13,13,13,13,13,13,13,13,13,13,4,3,4,13,13,13,13,13,4,4,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,12,11,11,11,12,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,3,3,3,3,3,3,8,6,3,3,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,8,4,4,4,16,16,8,4,13,8,8,3,8,13,13,13,16,4,6,13,13,13,16,13,3,13,8,4,13,13,13,3,3,4,3,13,6,13,13,13,5,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,11,5,11,10,11,11,5,10,11,12,12,11,11,11,11,11,11,10,12,11,11,11,11,10,11,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,8,10,10,10,4,3,3,13,8,13,13,4,13,13,6,6,3,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,12,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,10,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,12,11,11,11,11,11,5,3,13,8,3,6,4,3,13,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,5,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,3,6,12,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,13,13,13,13,13,13,8,13,13,13,13,13,13,13,13,13,13,13,13,13,13,3,8,4,4,4,3,3,3,13,4,8,13,11,12,12,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,10,11,11,10,11,12,11,12,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,13,3,13,13,4,3,13,13,3,8,4,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11],"n":["Bip32","BnBNoExactMatch","BnBTotalTriesExceeded","ChecksumMismatch","Descriptor","Error","External","FeeRate","FeeRateTooLow","FeeRateUnavailable","FeeTooLow","Foreign","Generic","HdKeyPaths","InsufficientFunds","Internal","InvalidOutpoint","InvalidPolicyPathError","IrreplaceableTransaction","Key","KeychainKind","Local","LocalUtxo","Miniscript","MiniscriptPsbt","MissingKeyOrigin","NoRecipients","NoUtxosSelected","OutputBelowDustLimit","Psbt","SignOptions","Signer","SpendingPolicyRequired","TransactionConfirmed","TransactionDetails","TransactionNotFound","TxBuilder","UnknownUtxo","Utxo","Vbytes","Wallet","WeightedUtxo","as_byte","as_ref","as_sat_per_vb","base32_len","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","chain","check_base32","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","confirmation_time","confirmation_time","default","default_min_relay_fee","derivation_index","descriptor","descriptor","deserialize","deserialize","deserialize","eq","eq","eq","eq","eq","eq","fee","fee_vb","fee_wu","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fragment","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_btc_per_kvb","from_sat_per_kvb","from_sat_per_kwu","from_sat_per_vb","from_vb","from_wu","hash","hash","into","into","into","into","into","into","into","is_spent","keychain","keys","outpoint","outpoint","partial_cmp","partial_cmp","partial_cmp","provide","psbt","received","satisfaction_weight","sent","serialize","serialize","serialize","signer","sub","template","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","transaction","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","txid","txout","txout","type_id","type_id","type_id","type_id","type_id","type_id","type_id","utxo","vbytes","version","vzip","vzip","vzip","vzip","vzip","vzip","vzip","wallet","write_base32","available","needed","required","required","outpoint","psbt_input","Bare","DerivedDescriptor","Descriptor","DescriptorError","DescriptorPublicKey","DescriptorXKey","ExtendedDescriptor","ExtractPolicy","Hardened","HdKeyPaths","IntoWalletDescriptor","Key","KeyMap","Legacy","Miniscript","None","Pkh","Policy","ScriptContext","Segwitv0","Sh","Single","TapKeyOrigins","Tr","Unhardened","Wildcard","Wpkh","Wsh","XPub","address","as_enum","as_enum","as_inner","at_derivation_index","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","branches","calc_checksum","check_global_consensus_validity","check_global_consensus_validity","check_global_consensus_validity","check_global_policy_validity","check_global_policy_validity","check_global_validity","check_local_consensus_validity","check_local_consensus_validity","check_local_consensus_validity","check_local_policy_validity","check_local_policy_validity","check_local_policy_validity","check_local_validity","check_terminal_non_malleable","check_terminal_non_malleable","check_terminal_non_malleable","check_witness","check_witness","check_witness","checksum","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","cmp","contains_raw_pkh","derivation_path","derive","derived_descriptor","derived_descriptor","desc_type","deserialize","deserialize","dust_value","encode","eq","eq","eq","eq","eq","eq","error","explicit_script","ext","ext_check","extract_policy","extract_policy","extract_policy","find_derivation_index_for_spk","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_key","for_each_key","from","from","from","from","from","from","from","from","from","from","from","from","from_ast","from_str","from_str","from_str_ext","from_str_insane","from_tree","from_tree","get_nth_child","get_nth_pk","get_satisfaction","get_satisfaction_mall","has_mixed_timelocks","has_repeated_keys","has_wildcard","hash","hash","hash","hash","hash","hash","into","into","into","into","into","into","into_inner","into_wallet_descriptor","into_wallet_descriptor","is_deriveable","is_non_malleable","iter","iter_pk","lift","lift","lift_check","matches","max_satisfaction_size","max_satisfaction_size","max_satisfaction_size","max_satisfaction_size","max_satisfaction_weight","max_satisfaction_witness_elements","name_str","name_str","name_str","new_bare","new_pk","new_pkh","new_sh","new_sh_sortedmulti","new_sh_with_wpkh","new_sh_with_wsh","new_sh_wpkh","new_sh_wsh","new_sh_wsh_sortedmulti","new_tr","new_wpkh","new_wsh","new_wsh_sortedmulti","node","origin","other_top_level_checks","parse","parse_descriptor","parse_insane","parse_with_ext","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","pk_len","pk_len","pk_len","policy","requires_sig","sanity_check","sanity_check","satisfy","satisfy","satisfy_malleable","script_code","script_pubkey","script_size","serialize","serialize","sig_type","sig_type","sig_type","template","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string_with_secret","top_level_checks","top_level_type_check","translate_pk","translate_pk","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","ty","type_id","type_id","type_id","type_id","type_id","type_id","unsigned_script_sig","vzip","vzip","vzip","vzip","vzip","vzip","wildcard","within_resource_limits","xkey","calc_checksum","calc_checksum_bytes","get_checksum","get_checksum_bytes","Base58","Bip32","Error","HardenedDerivationXpub","Hex","InvalidDescriptorCharacter","InvalidDescriptorChecksum","InvalidHdKeyPath","Key","Miniscript","Pk","Policy","borrow","borrow_mut","fmt","fmt","from","from","from","from","from","from","from","from","into","provide","to_string","try_from","try_into","type_id","vzip","AbsoluteTimelock","AddOnLeaf","AddOnPartialComplete","BuildSatisfaction","Complete","Condition","ConditionMap","EcdsaSignature","Fingerprint","FoldedConditionMap","Hash160Preimage","Hash256Preimage","IncompatibleConditions","IndexOutOfRange","MixedTimelockUnits","Multisig","None","None","NotEnoughItemsSelected","Partial","PartialComplete","PkOrF","Policy","PolicyError","Psbt","PsbtTimelocks","Pubkey","RelativeTimelock","Ripemd160Preimage","Satisfaction","SatisfiableItem","SchnorrSignature","Sha256Preimage","Thresh","XOnlyPubkey","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","contribution","csv","default","eq","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","get_condition","hash","hash","id","id","into","into","into","into","into","into","into","is_leaf","is_leaf","is_null","item","partial_cmp","provide","requires_path","satisfaction","serialize","serialize","serialize","serialize","serialize","timelock","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","current_height","input_max_height","psbt","condition","conditions","conditions","items","items","m","m","n","n","sorted","sorted","hash","hash","hash","hash","items","keys","threshold","threshold","value","value","Bip44","Bip44Public","Bip49","Bip49Public","Bip84","Bip84Public","DescriptorTemplate","DescriptorTemplateOut","P2Pkh","P2Wpkh","P2Wpkh_P2Sh","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build","build","build","build","build","build","build","build","build","build","from","from","from","from","from","from","from","from","from","into","into","into","into","into","into","into","into","into","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","Bip32","DerivableKey","DescriptorKey","DescriptorPublicKey","DescriptorSecretKey","Entropy","Error","ExtScriptContext","ExtendedKey","FullKey","GeneratableDefaultOptions","GeneratableKey","GeneratedKey","IntoDescriptorKey","InvalidChecksum","InvalidNetwork","InvalidScriptContext","Key","KeyError","KeyMap","Legacy","Message","Miniscript","Options","Private","PrivateKeyGenerateOptions","Public","ScriptContext","ScriptContextEnum","Segwitv0","Single","Single","SinglePriv","SinglePub","SinglePubKey","SortedMultiVec","Tap","ValidNetworks","XOnly","XPrv","XPub","any_network","as_enum","at_derivation_index","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","check_global_consensus_validity","check_global_policy_validity","check_global_validity","check_local_consensus_validity","check_local_policy_validity","check_local_validity","check_terminal_non_malleable","check_witness","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","compressed","default","deref","derive","encode","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_key","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_public","from_secret","from_str","from_str","from_tree","full_derivation_path","generate","generate_default","generate_with_entropy","generate_with_entropy_default","has_secret","has_wildcard","hash","hash","hash","hash","into","into","into","into","into","into","into","into","into","into","into","into","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_extended_key","into_extended_key","into_extended_key","into_key","into_xprv","into_xpub","is_deriveable","is_legacy","is_legacy","is_segwit_v0","is_segwit_v0","is_taproot","is_taproot","is_uncompressed","is_x_only_key","k","key","key","lift","mainnet_network","master_fingerprint","max_satisfaction_size","max_satisfaction_size","max_satisfaction_witness_elements","merge_networks","name_str","new","origin","origin","other_top_level_checks","override_valid_networks","partial_cmp","partial_cmp","partial_cmp","partial_cmp","pk_len","pks","provide","sanity_check","satisfy","script_size","sig_type","sorted_node","test_networks","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_public","to_string","to_string","to_string","to_string","top_level_checks","top_level_type_check","translate_pk","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","PsbtUtils","fee_amount","fee_rate","get_utxo_for","AddressIndex","AddressInfo","Balance","Descriptor","IsDust","LastUnused","New","NewError","Peek","Persist","Update","UpdateError","Wallet","add","add_signer","address","apply_update","as_chain_graph","as_graph","as_ref","as_ref","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build_fee_bump","build_tx","cancel_tx","checkpoints","clone","clone_into","coin_selection","commit","confirmed","default","deref","derivation_index","derivation_of_spk","descriptor_checksum","deserialize","eq","eq","export","finalize_psbt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","get_address","get_balance","get_descriptor_for_keychain","get_internal_address","get_psbt_input","get_signers","get_tx","get_utxo","immature","index","insert_checkpoint","insert_tx","into","into","into","into","into","is_dust","is_mine","keychain","keychanins","latest_checkpoint","list_transactions","list_unspent","network","new","new_no_persist","next_derivation_index","policies","provide","public_descriptor","secp_ctx","serialize","sign","signer","spks_of_all_keychains","spks_of_keychain","staged","to_owned","to_string","to_string","to_string","total","transactions","trusted_pending","trusted_spendable","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","tx_builder","type_id","type_id","type_id","type_id","type_id","untrusted_pending","vzip","vzip","vzip","vzip","vzip","wallet_name_from_descriptor","BranchAndBoundCoinSelection","Change","CoinSelectionAlgorithm","CoinSelectionResult","DefaultCoinSelectionAlgorithm","Excess","LargestFirstCoinSelection","NoChange","OldestFirstCoinSelection","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","coin_select","coin_select","coin_select","coin_select","decide_change","default","default","default","excess","fee_amount","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","into","into","into","into","into","local_selected_amount","new","selected","selected_amount","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","amount","change_fee","dust_threshold","fee","remaining_amount","FullyNodedExport","WalletExport","blockheight","borrow","borrow_mut","change_descriptor","descriptor","deserialize","export_wallet","fmt","from","from_str","into","label","serialize","to_string","try_from","try_into","type_id","vzip","All","Dummy","Exclude","Fingerprint","Include","InputIndexOutOfRange","InputSigner","InvalidKey","InvalidNonWitnessUtxo","InvalidSighash","Legacy","MissingHdKeypath","MissingKey","MissingNonWitnessUtxo","MissingWitnessScript","MissingWitnessUtxo","NonStandardSighash","None","PkHash","Segwitv0","SighashError","SignOptions","SignerCommon","SignerContext","SignerError","SignerId","SignerOrdering","SignerWrapper","SignersContainer","Tap","TapLeavesOptions","TransactionSigner","UserCanceled","add_external","allow_all_sighashes","allow_grinding","as_key_map","assume_height","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","default","default","default","default","deref","descriptor_secret_key","descriptor_secret_key","descriptor_secret_key","eq","eq","eq","eq","eq","find","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","hash","id","id","id","ids","into","into","into","into","into","into","into","into","new","new","partial_cmp","partial_cmp","provide","remove","remove_partial_sigs","sign_input","sign_input","sign_input","sign_transaction","sign_transaction","sign_with_tap_internal_key","signers","tap_leaves_options","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","trust_witness_utxo","try_finalize","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","is_internal_key","Bip69Lexicographic","BumpFee","ChangeAllowed","ChangeForbidden","ChangeSpendPolicy","CreateTx","OnlyChange","Shuffle","TxBuilder","TxBuilderContext","TxOrdering","Untouched","add_data","add_foreign_utxo","add_global_xpubs","add_recipient","add_unspendable","add_utxo","add_utxos","allow_dust","allow_shrinking","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","change_policy","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","coin_selection","current_height","default","default","default","default","do_not_spend_change","drain_to","drain_wallet","enable_rbf","enable_rbf_with_sequence","eq","eq","fee_absolute","fee_rate","finish","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","hash","hash","include_output_redeem_witness_script","into","into","into","into","into","manually_selected_only","nlocktime","only_spend_change","only_witness_utxo","ordering","partial_cmp","partial_cmp","policy_path","set_recipients","sighash","sort_tx","to_owned","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","unspendable","version","vzip","vzip","vzip","vzip","vzip"],"q":["bdk","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::Error","","","","bdk::Utxo","","bdk::descriptor","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor::checksum","","","","bdk::descriptor::error","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor::policy","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor::policy::BuildSatisfaction","","","bdk::descriptor::policy::Satisfaction","","","","","","","","","","","bdk::descriptor::policy::SatisfiableItem","","","","","","","","","","bdk::descriptor::template","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::keys","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::psbt","","","","bdk::wallet","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::coin_selection","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::coin_selection::Excess","","","","","bdk::wallet::export","","","","","","","","","","","","","","","","","","","","bdk::wallet::signer","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::signer::SignerContext","bdk::wallet::tx_builder","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"d":["BIP32 error","Branch and bound coin selection tries to avoid needing a â¦","Branch and bound coin selection possible attempts with â¦","Descriptor checksum mismatch","Error related to the parsing and usage of descriptors","Errors that can be thrown by the Wallet","External","Fee rate","When bumping a tx the fee rate requested is lower than â¦","Node doesnât have data to estimate a fee rate","When bumping a tx the absolute fee requested is lower than â¦","A UTXO owned by another wallet.","Generic error","","Walletâs UTXO set is not enough to cover recipientâs â¦","Internal, usually used for change outputs","Requested outpoint doesnât exist in the tx (vout greater â¦","Error while extracting and manipulating policies","Trying to replace a tx that has a sequence >= 0xFFFFFFFE","Error while working with keys","Types of keychains","A UTXO owned by the local wallet.","An unspent output owned by a Wallet.","Miniscript error","Miniscript PSBT error","In order to use the TxBuilder::add_global_xpubs option â¦","Cannot build a tx without recipients","manually_selected_only option is selected but no utxo has â¦","Output created is under the dust limit, 546 satoshis","Partially signed bitcoin transaction error","","Signing error","Spending policy is not compatible with this KeychainKind","Happens when trying to bump a transaction that is already â¦","A wallet transaction","Thrown when a tx is not found in the internal database","","Happens when trying to spend an UTXO that is not in the â¦","An unspent transaction output (UTXO).","Trait implemented by types that can be used to measure â¦","","A Utxo with its satisfaction_weight.","Return KeychainKind as a byte","","Return the value as satoshi/vbyte","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The confirmation time for transaction containing this utxo","If the transaction is confirmed, contains height and Unix â¦","","Create a new FeeRate with the default min relay fee value","The derivation index for the script pubkey in the wallet","Descriptors","Macro to write full descriptors with code","","","","","","","","","","Fee value in sats if it was available.","Calculate absolute fee in Satoshis using size in virtual â¦","Calculate absolute fee in Satoshis using size in weight â¦","","","","","","","","","Macro to write descriptor fragments with code","","","Returns the argument unchanged.","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Create a new instance of FeeRate given a float fee rate in â¦","Create a new instance of FeeRate given a float fee rate in â¦","Create a new instance of FeeRate given a float fee rate in â¦","Create a new instance of FeeRate given a float fee rate in â¦","Calculate fee rate from fee and vbytes.","Calculate fee rate from fee and weight units (wu).","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Whether this UTXO is spent or not","Type of keychain","Key formats","Get the location of the UTXO","Reference to a transaction output","","","","","Additional functions on the rust-bitcoin â¦","Received value (sats) Sum of owned outputs of this â¦","The weight of the witness data and scriptSig expressed in â¦","Sent value (sats) Sum of owned inputs of this transaction.","","","","","","","","","","","","","","Optional transaction","","","","","","","","","","","","","","","Transaction id","Get the TxOut of the UTXO","Transaction output","","","","","","","","The UTXO","Convert weight units to virtual bytes.","Get the version of BDK at runtime","","","","","","","","Wallet","","Sats available for spending","Sats needed for some transaction","Required fee rate (satoshi/vbyte)","Required fee absolute value (satoshi)","The location of the output.","The information about the input we require to add it to a â¦","A raw scriptpubkey (including pay-to-pubkey) under Legacy â¦","Alias for a Descriptor that contains extended derived keys","Script descriptor","","The descriptor pubkey, either a single pubkey or an xpub.","An extended key with origin, derivation path, and wildcard.","Alias for a Descriptor that can contain extended keys â¦","Trait implemented on Descriptors to add a method to â¦","Unhardened wildcard, e.g. *h","Alias for the type of maps that represent derivation paths â¦","Trait for types which can be converted into an â¦","The consensus key associated with the type. Must be a â¦","Alias type for a map of public key to secret key","Legacy ScriptContext To be used as P2SH scripts For â¦","Top-level script AST type","No wildcard","Pay-to-PubKey-Hash","","The ScriptContext for Miniscript. Additional type â¦","Segwitv0 ScriptContext","Pay-to-ScriptHash(includes nested wsh/wpkh/sorted multi)","Single public key.","Alias for the type of maps that represent taproot key â¦","Pay-to-Taproot","Unhardened wildcard, e.g. *","Whether a descriptor has a wildcard in it","Pay-to-Witness-PubKey-Hash","Pay-to-Witness-ScriptHash with Segwitv0 context","Extended public key (xpub).","Computes the Bitcoin address of the descriptor, if one â¦","","","Get a reference to the inner AstElem representing the root â¦","Replaces all wildcards (i.e. /*) in the descriptor with a â¦","","","","","","","","","","","","","Enumerates all child nodes of the current AST node (self) â¦","","Depending on script Context, some of the Terminals might â¦","","","Depending on script Context, some of the script resource â¦","","Check the consensus + policy(if not disabled) rules that â¦","Consensus rules at the Miniscript satisfaction time. It is â¦","","","Policy rules at the Miniscript satisfaction time. It is â¦","","","Check the consensus + policy(if not disabled) rules â¦","Depending on ScriptContext, fragments can be malleable. â¦","","","Check whether the given satisfaction is valid under the â¦","","","Descriptor checksum","","","","","","","","","","","","","","","","","","","Whether the given miniscript contains a raw pkh fragment","The derivation path","Deprecated name for [at_derivation_index].","Convert all the public keys in the descriptor to â¦","Convert all the public keys in the descriptor to â¦","Get the DescriptorType of Descriptor","","","","Encode as a Bitcoin script","","","","","","","Descriptor errors","Computes the the underlying script before any hashing is â¦","Additional information helpful for extra analysis.","Check whether the miniscript follows the given Extra â¦","Extract the spending policy","","","Utility method for deriving the descriptor at each index â¦","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","","Returns the argument unchanged.","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Add type information(Type and Extdata) to Miniscript based â¦","","Parse a Miniscript from string and perform sanity checks â¦","Attempt to parse an Miniscripts that donât follow the â¦","Attempt to parse an insane(scripts donât clear sanity â¦","Parse an expression tree into a descriptor.","Parse an expression tree into a Miniscript. As a general â¦","Returns child node with given index, if any","Returns Option::Some with cloned nâth public key from â¦","Returns satisfying non-malleable witness and scriptSig to â¦","Returns a possilbly mallable satisfying non-malleable â¦","Whether the miniscript contains a combination of timelocks","Whether the miniscript has repeated Pk or Pkh","Whether or not the descriptor has any wildcards i.e. /*.","","","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Extracts the AstElem representing the root of the â¦","Convert to wallet descriptor","","Whether or not the descriptor has any wildcards","Whether the miniscript is malleable","Creates a new Iter iterator that will iterate over all â¦","Creates a new PkIter iterator that will iterate over all â¦","","","Lifting corresponds conversion of miniscript into Policy [â¦","Compares this key with a keysource and returns the â¦","Depending on script context, the size of a satifaction â¦","","","Maximum size, in bytes, of a satisfying witness. For â¦","Computes an upper bound on the weight of a satisfying â¦","Maximum number of witness elements used to satisfy the â¦","Local helper function to display error messages with â¦","","","Create a new bare descriptor from witness script Errors â¦","Create a new pk descriptor","Create a new PkH descriptor","Create a new sh for a given redeem script Errors when â¦","Create a new sh sortedmulti descriptor with threshold k â¦","Create a new sh wrapper for the given wpkh descriptor","Create a new sh wrapper for the given wsh descriptor","Create a new sh wrapped wpkh from Pk. Errors when â¦","Create a new sh wrapped wsh descriptor with witness script â¦","Create a new sh wrapped wsh sortedmulti descriptor from â¦","Create new tr descriptor Errors when miniscript exceeds â¦","Create a new Wpkh descriptor Will return Err if â¦","Create a new wsh descriptor from witness script Errors â¦","Create a new wsh sorted multi descriptor Errors when â¦","A node in the Abstract Syntax Tree(","Origin information","Other top level checks that are context specific","Attempt to parse a Script into Miniscript representation.","Parse a descriptor that may contain secret keys","Attempt to parse an insane(scripts donât clear sanity â¦","Attempt to parse an miniscript with extra features that â¦","","","","","","","Get the len of public key when serialized based on context â¦","","","Descriptor policy","Whether all spend paths of miniscript require a signature","Checks whether the descriptor is safe.","Check whether the underlying Miniscript is safe under the â¦","Attempts to produce a non-malleable satisfying witness and â¦","Attempt to produce non-malleable satisfying witness for the","Attempt to produce a malleable satisfying witness for the â¦","Computes the scriptCode of a transaction output.","Computes the scriptpubkey of the descriptor.","Size, in bytes of the script-pubkey. If this Miniscript is â¦","","","The type of signature required for satisfaction","","","Descriptor templates","","","","","","","","","Serialize a descriptor to string with its secret keys","Check top level consensus rules.","Check whether the top-level is type B","Converts a descriptor using abstract keys to one using â¦","Translates a struct from one generic to another where the â¦","","","","","","","","","","","","","The correctness and malleability type information for the â¦","","","","","","","Computes the scriptSig that will be in place for an â¦","","","","","","","Whether the descriptor is wildcard","Whether the miniscript can exceed the resource â¦","The extended key","Compute the checksum of a descriptor, excludes any â¦","Compute the checksum bytes of a descriptor, excludes any â¦","Compute the checksum of a descriptor","Compute the checksum bytes of a descriptor","Error during base58 decoding","BIP32 error","Errors related to the parsing and usage of descriptors","The descriptor contains hardened derivation steps on â¦","Hex decoding error","Invalid byte found in the descriptor checksum","The provided descriptor doesnât match its checksum","Invalid HD Key path, such as having a wildcard but a â¦","Error thrown while working with keys","Miniscript error","Key-related error","Error while extracting and manipulating policies","","","","","","","","","Returns the argument unchanged.","","","","Calls U::from(self).","","","","","","","Absolute timeclock timestamp","Can not add to an item that is Satisfaction::None or â¦","Can not add to an item that is â¦","Options to build the satisfaction field in the policy","Can satisfy the policy item","An extra condition that must be satisfied but that is out â¦","Type for a map of sets of Condition items keyed by each setâ¦","ECDSA Signature for a raw public key","An extended key fingerprint","Type for a map of folded sets of Condition items keyed by â¦","SHA256 then RIPEMD160 preimage hash","Double SHA256 preimage hash","Incompatible conditions (not currently used)","Index out of range for an item to satisfy a â¦","Can not merge CSV or timelock values unless both are less â¦","Multi-signature public keys with threshold count","Cannot satisfy or contribute to the policy item","Donât generate satisfaction field","Not enough items are selected to satisfy a â¦","Only a partial satisfaction of some kind of threshold â¦","Can reach the threshold of some kind of threshold policy","A unique identifier for a key","Descriptor spending policy","Errors that can happen while extracting and manipulating â¦","Analyze the given PSBT to check for existing signatures","Like Psbt variant and also check for expired timelocks","A legacy public key","Relative timelock locktime","RIPEMD160 preimage hash","Represent if and how much a policy item is satisfied by â¦","An item that needs to be satisfied","Schnorr Signature for a raw public key","SHA256 preimage hash","Threshold items with threshold count","A x-only public key","","","","","","","","","","","","","","","","","","","","","","","","","","","How the walletâs descriptor can satisfy this policy node","Optional CheckSequenceVerify condition","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Return the conditions that are set by the spending policy â¦","","","Returns a unique id for the SatisfiableItem","Identifier for this policy node","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Returns whether the SatisfiableItem is a leaf item","Returns whether the Satisfaction is a leaf item","Returns true if there are no extra conditions to verify","Type of this policy node","","","Return whether or not a specific path in the policy tree â¦","How much a given PSBT already satisfies this policy node â¦","","","","","","Optional timelock condition","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Current blockchain height","The highest confirmation height between the inputs CSV â¦","Given PSBT","Extra conditions that also need to be satisfied","Extra conditions that also need to be satisfied","Extra conditions that also need to be satisfied","The items that can be satisfied by the descriptor or are â¦","The items that can be satisfied by the descriptor","Threshold","Threshold","Total number of items","Total number of items","Whether the items are sorted in lexicographic order (used â¦","Whether the items are sorted in lexicographic order (used â¦","The digest value","The digest value","The digest value","The digest value","The policy items","The raw public key or extended key fingerprint","The required threshold count","The required threshold count","The timelock value","The timelock value","BIP44 template. Expands to pkh(key/44'/{0,1}'/0'/{0,1}/*)","BIP44 public template. Expands to pkh(key/{0,1}/*)","BIP49 template. Expands to â¦","BIP49 public template. Expands to sh(wpkh(key/{0,1}/*))","BIP84 template. Expands to wpkh(key/84'/{0,1}'/0'/{0,1}/*)","BIP84 public template. Expands to wpkh(key/{0,1}/*)","Trait for descriptor templates that can be built into a â¦","Type alias for the return type of DescriptorTemplate, â¦","P2PKH template. Expands to a descriptor pkh(key)","P2WPKH template. Expands to a descriptor wpkh(key)","P2WPKH-P2SH template. Expands to a descriptor sh(wpkh(key))","","","","","","","","","","","","","","","","","","","Build the complete descriptor","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","BIP32 error","Trait for keys that can be derived.","Container for public or secret keys","The descriptor pubkey, either a single pubkey or an xpub.","The descriptor secret key, either a single private key or â¦","Type specifying the amount of entropy required e.g. [u8;32]","Returned error in case of failure","Trait that adds extra useful methods to ScriptContexts","Enum for extended keys that can be either xprv or xpub","A bitcoin public key (compressed or uncompressed).","Trait that allows generating a key with the default options","Trait for keys that can be generated","Output of a GeneratableKey key generation","Trait for objects that can be turned into a public or â¦","The key has an invalid checksum","The key is not valid for the given network","The key cannot exist in the given script context","The consensus key associated with the type. Must be a â¦","Errors thrown while working with keys","Alias type for a map of public key to secret key","Legacy scripts","Custom error message","Miniscript error","Extra options required by the generate_with_entropy","A private extended key, aka an xprv","Options for generating a PrivateKey","A public extended key, aka an xpub","The ScriptContext for Miniscript. Additional type â¦","Enum representation of the known valid ScriptContexts","Segwitv0 scripts","Single public key.","Single private key.","A descriptor bitcoin::PrivateKey with optional origin â¦","A descriptor SinglePubKey with optional origin information.","Single public key without any origin or range information.","Contents of a âsortedmultiâ descriptor","Taproot scripts","Set of valid networks for a key","An xonly public key.","Extended private key (xpriv).","Extended public key (xpub).","Create a set containing mainnet, testnet, signet, and â¦","Returns the ScriptContext as a ScriptContextEnum","Replaces any wildcard (i.e. /*) in the key with a â¦","","","","","","","","","","","","","","","","","","","","","","","","","Depending on script Context, some of the Terminals might â¦","Depending on script Context, some of the script resource â¦","Check the consensus + policy(if not disabled) rules that â¦","Consensus rules at the Miniscript satisfaction time. It is â¦","Policy rules at the Miniscript satisfaction time. It is â¦","Check the consensus + policy(if not disabled) rules â¦","Depending on ScriptContext, fragments can be malleable. â¦","Check whether the given satisfaction is valid under the â¦","","","","","","","","","","","","","","","","","","","Whether the generated key should be âcompressedâ or not","","","Deprecated name of [at_derivation_index].","Encode as a Bitcoin script","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Create an instance given a public key and a set of valid â¦","Create an instance given a secret key and a set of valid â¦","","","Parse an expression tree into a SortedMultiVec","Full path, from the master key","Generate a key given the options with a random entropy","Generate a key with the default options and a random â¦","Generate a key given the extra options and the entropy","Generate a key with the default options and a given entropy","Return whether or not the key contains the private data","Whether or not the key has a wildcard","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Turn the key into a DescriptorKey within the requested â¦","Consume self and turn it into a DescriptorKey by adding â¦","","","","","","Consume self and turn it into an ExtendedKey","","","Consumes self and returns the key","Transform the ExtendedKey into an ExtendedPrivKey for the â¦","Transform the ExtendedKey into an ExtendedPubKey for the â¦","Whether or not the key has a wildcard","Returns whether the script context is Legacy","Returns whether the script context is â¦","Returns whether the script context is Segwitv0","Returns whether the script context is â¦","Returns whether the script context is Tap, aka Taproot or â¦","Returns whether the script context is â¦","","","signatures required","The public key.","The private key.","","Create a set only containing mainnet","The fingerprint of the master key associated with this â¦","Depending on script context, the size of a satifaction â¦","Maximum size, in bytes, of a satisfying witness. In â¦","Maximum number of witness elements used to satisfy the â¦","Compute the intersection of two sets","Local helper function to display error messages with â¦","Create a new instance of SortedMultiVec given a list of â¦","Origin information (fingerprint and derivation path).","Origin information (fingerprint and derivation path).","Other top level checks that are context specific","Override the computed set of valid networks","","","","","Get the len of public key when serialized based on context â¦","public keys inside sorted Multi","","utility function to sanity a sorted multi vec","Attempt to produce a satisfying witness for the witness â¦","Size, in bytes of the script-pubkey. If this Miniscript is â¦","The type of signature required for satisfaction","Create Terminal::Multi containing sorted pubkeys","Create a set containing testnet and regtest","","","","","","","","Returns the public version of this key.","","","","","Check top level consensus rules.","Check whether the top-level is type B","This will panic if fpk returns an uncompressed key when â¦","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Trait to add functions to extract utxos and calculate fees.","The total transaction fee amount, sum of input amounts â¦","The transactionâs fee rate. This value will only be â¦","Get the TxOut for the specified input index, if it doesnââ¦","The address index selection strategy to use to derived an â¦","A derived address and the index it was found at. For â¦","Balance, differentiated into various categories.","There was problem with the descriptors passed in","Trait to check if a value is below the dust limit. We are â¦","Return the address for the current descriptor index if it â¦","Return a new address after incrementing the current â¦","Error returned from Wallet::new","Return the address for a specific descriptor index. Does â¦","We were unable to load the walletâs data from the â¦","The update to a Wallet used in Wallet::apply_update. This â¦","Error indicating that something was wrong with an Update<T>â¦","A Bitcoin wallet","","Add an external signer","Address","Applies an update to the wallet and stages the changes â¦","Get a reference to the inner ChainGraph.","Get a reference to the inner TxGraph.","","","","","","","","","","","","","Bump the fee of a transaction previously created with this â¦","Start building a transaction.","Informs the wallet that you no longer intend to broadcast â¦","Get all the checkpoints the wallet is currently storing â¦","","","Coin selection","Commits all curently staged changed to the persistence â¦","Confirmed and immediately spendable balance","","","The derivation index of this wallet. It will return None â¦","Finds how the wallet derived the script pubkey spk.","Return the checksum of the public descriptor associated to â¦","","","","Wallet export","Finalize a PSBT, i.e., for each input determine if â¦","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Return a derived address using the external descriptor, â¦","Return the balance, separated into available, â¦","Returns the descriptor used to create addresses for a â¦","Return a derived address using the internal (change) â¦","get the corresponding PSBT Input for a LocalUtxo","Get the signers","Return a single transactions made and received by the â¦","Returns the utxo owned by this wallet corresponding to â¦","All coinbase outputs not yet matured","Child index of this address","Add a new checkpoint to the walletâs internal view of â¦","Add a transaction to the walletâs internal view of the â¦","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Check whether or not a value is below dust limit","Return whether or not a script is part of this wallet â¦","Type of keychain","Iterator over all keychains in this wallet","Returns the latest checkpoint.","Deprecated. use Wallet::transactions instead.","Return the list of unspent outputs of this wallet","Get the Bitcoin network the wallet is using.","Create a wallet from a descriptor (and an optional â¦","Creates a wallet that does not persist data.","The index of the next address that you would get if you â¦","Return the spending policies for the walletâs descriptor","","Return the âpublicâ version of the walletâs â¦","Return the secp256k1 context used for all signing â¦","","Sign a transaction with all the walletâs signers, in the â¦","Generalized signers","Returns a iterators of all the script pubkeys for the â¦","Gets an iterator over all the script pubkeys in a single â¦","Returns the changes that will be staged with the next call â¦","","","","","Get the whole balance visible to the wallet.","Iterate over the transactions in the wallet in order of â¦","Unconfirmed UTXOs generated by a wallet tx","Get sum of trusted_pending and confirmed coins.","","","","","","","","","","","Transaction builder","","","","","","Unconfirmed UTXOs received from an external wallet","","","","","","Deterministically generate a unique name given the â¦","Branch and bound coin selection","Itâs possible to create spendable output from excess â¦","Trait for generalized coin selection algorithms","Result of a successful coin selection","Default coin selection algorithm used by TxBuilder if not â¦","Remaining amount after performing coin selection","Simple and dumb coin selection","Itâs not possible to create spendable output from excess â¦","OldestFirstCoinSelection always picks the utxo with the â¦","","","","","","","","","","","","","","","","","Perform the coin selection","","","","Decide if change can be created","","","","Remaining amount after deducing fees and outgoing outputs","Total fee amount for the selected utxos in satoshis","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","The total value of the inputs selected from the local â¦","Create new instance with target size for change output","List of outputs selected for use as inputs","The total value of the inputs selected.","","","","","","","","","","","","","","","","","","","","","","","","Effective amount available to create change after â¦","The calculated fee for the drain TxOut with the selected â¦","Threshold to consider amount as dust for this particular â¦","The deducted change output fee","Exceeding amount of current selection over outgoing value â¦","Structure that contains the export of a wallet","Alias for FullyNodedExport","Earliest block to rescan when looking for the walletâs â¦","","","Return the internal descriptor, if present","Return the external descriptor","","Export a wallet","","Returns the argument unchanged.","","Calls U::from(self).","Arbitrary label for the wallet","","","","","","","The signer will sign all the leaves it has a key for.","Dummy identifier","The signer wonât sign the specified leaves.","The fingerprint of a BIP32 extended key","The signer wonât sign leaves other than the ones â¦","Input index is out of range","PSBT Input signer","The private key in use has the right fingerprint but â¦","The non_witness_utxo specified is invalid","Invalid SIGHASH for the signing context in use","Legacy context","The fingerprint and derivation path are missing from the â¦","The private key is missing for the required public key","The non_witness_utxo field of the transaction is required â¦","The witness_script field of the transaction is required to â¦","The witness_utxo field of the transaction is required to â¦","The psbt contains a non-SIGHASH_ALL sighash in one of its â¦","The signer wonât sign any leaf.","Bitcoin HASH160 (RIPEMD160 after SHA256) hash of an ECDSA â¦","Segwit v0 context (BIP 143)","Error while computing the hash to sign","Options for a software signer","Common signer methods","Signing context","Signing error","Identifier of a signer in the SignersContainers. Used as a â¦","Defines the order in which signers are called","Wrapper structure to pair a signer with its context","Container for multiple signers","Taproot context (BIP 340)","Customize which taproot script-path leaves the signer â¦","PSBT signer","The user canceled the operation","Adds an external signer to the container for the specified â¦","Whether the signer should use the sighash_type set in the â¦","Whether we should grind ECDSA signature to ensure signing â¦","Create a map of public keys to secret keys","Whether the wallet should assume a specific height has â¦","","","","","","","","","","","","","","","","","Build a new signer container from a KeyMap","","","","","","","","","","","","","","","","","","","","","","","","Return the secret key for the signer","","","","","","","","Finds the signer with lowest ordering for a given id in â¦","","","","","","","","","","","","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Return the SignerId for this signer","","","Returns the list of identifiers of all the signers in the â¦","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Create a wrapped signer from a signer and a context","Default constructor","","","","Removes a signer from the container and returns it","Whether to remove partial signatures from the PSBT inputs â¦","Sign a single psbt input","","","Sign all the inputs of the psbt","","Whether we should try to sign a taproot transaction with â¦","Returns the list of signers in the container, sorted by â¦","Specifies which Taproot script-spend leaves we should sign â¦","","","","","","","","","","Whether the signer should trust the witness_utxo, if the â¦","Whether to try finalizing the PSBT after the inputs are â¦","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Whether the signer can sign for the internal key or not","BIP69 / Lexicographic","Marker type to indicate the TxBuilder is being used to â¦","Use both change and non-change outputs (default)","Only use non-change outputs (see â¦","Policy regarding the use of change outputs when creating a â¦","Marker type to indicate the TxBuilder is being used to â¦","Only use change outputs (see TxBuilder::only_spend_change)","Randomized (default)","A transaction builder","Context in which the TxBuilder is valid","Ordering of the transactionâs inputs and outputs","Unchanged","Add data as an output, using OP_RETURN","Add a foreign UTXO i.e. a UTXO not owned by this wallet.","Fill-in the PSBT_GLOBAL_XPUB field with the extended keys â¦","Add a recipient to the internal list","Add a utxo to the internal list of unspendable utxos","Add a utxo to the internal list of utxos that must be spent","Add the list of outpoints to the internal list of UTXOs â¦","Set whether or not the dust limit is checked.","Explicitly tells the wallet that it is allowed to reduce â¦","","","","","","","","","","","Set a specific ChangeSpendPolicy. See â¦","","","","","","","","","","","","","Choose the coin selection algorithm","Set the current blockchain height.","","","","","Do not spend change outputs","Sets the address to drain excess coins to.","Spend all the available inputs. This respects filters like â¦","Enable signaling RBF","Enable signaling RBF with a specific nSequence value","","","Set an absolute fee","Set a custom fee rate","Finish building the transaction.","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Fill-in the psbt::Output::redeem_script and â¦","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Only spend utxos added by add_utxo.","Use a specific nLockTime while creating the transaction","Only spend change outputs","Only Fill-in the psbt::Input::witness_utxo field when â¦","Choose the ordering for inputs and outputs of the â¦","","","Set the policy path to use while creating the transaction â¦","Replace the recipients already added with a new list","Sign with a specific sig hash","Sort transaction inputs and outputs by TxOrdering variant","","","","","","","","","","","","","","","","","","","","","Replace the internal list of unspendable utxos with a new â¦","Build a transaction with a specific version","","","","",""],"i":[17,17,17,17,17,0,1,0,17,17,17,12,17,0,17,1,17,17,17,17,0,12,0,17,17,17,17,17,17,17,0,17,17,17,0,17,0,17,0,0,0,0,1,1,3,1,17,1,3,10,11,12,13,17,1,3,10,11,12,13,0,1,1,3,10,11,12,13,1,3,10,11,12,13,1,13,10,13,3,3,10,0,0,1,10,13,1,3,10,11,12,13,13,3,3,17,17,1,3,10,11,12,13,0,17,17,17,17,17,17,17,17,1,3,10,11,12,13,3,3,3,3,3,3,1,10,17,1,3,10,11,12,13,10,10,0,12,10,1,3,13,17,0,13,11,13,1,10,13,0,3,0,1,3,10,11,12,13,17,13,17,1,3,10,11,12,13,17,1,3,10,11,12,13,13,12,10,17,1,3,10,11,12,13,11,168,0,17,1,3,10,11,12,13,0,1,169,169,170,171,172,172,34,0,0,0,0,0,0,0,45,0,0,58,0,0,0,45,34,0,0,0,34,40,0,34,45,0,34,34,40,34,46,47,38,34,44,45,34,46,47,38,44,45,34,46,47,38,38,0,58,46,47,58,47,58,58,46,47,58,46,47,58,58,46,47,58,46,47,0,44,45,34,46,47,38,44,45,34,46,47,38,44,45,34,46,47,38,38,44,34,34,34,34,34,38,34,38,44,45,34,46,47,38,0,34,38,38,173,34,38,34,44,45,34,34,46,47,38,38,34,38,44,45,34,34,34,34,34,34,34,46,47,38,38,34,38,38,38,34,38,38,38,34,34,38,38,34,44,45,34,46,47,38,44,45,34,46,47,38,38,142,68,34,38,38,38,34,38,38,44,58,46,47,38,34,38,58,46,47,34,34,34,34,34,34,34,34,34,34,34,34,34,34,38,44,58,38,34,38,38,44,45,34,46,47,38,58,46,47,0,38,34,38,34,38,38,34,34,38,34,38,58,46,47,0,44,45,34,46,47,38,34,38,34,58,58,34,38,44,45,34,46,47,38,44,45,34,46,47,38,38,44,45,34,46,47,38,34,44,45,34,46,47,38,44,38,44,0,0,0,0,22,22,0,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,83,23,23,0,84,0,0,83,82,0,83,83,23,23,23,83,84,56,23,84,84,0,0,0,56,56,82,83,83,0,0,83,83,83,82,82,83,84,57,85,23,56,82,83,84,57,85,23,56,82,83,84,57,85,56,82,83,84,57,85,56,57,85,85,82,83,84,57,85,23,82,83,84,57,85,23,23,56,82,83,84,84,57,57,85,23,56,57,82,85,83,57,82,83,84,57,85,23,56,83,84,85,57,85,23,57,57,82,83,84,57,85,85,82,83,84,57,85,56,23,82,83,84,57,85,23,56,82,83,84,57,85,23,56,82,83,84,57,85,23,56,82,83,84,57,85,23,56,174,174,174,175,176,177,176,177,176,177,176,177,176,177,178,179,180,181,182,183,183,182,184,185,0,0,0,0,0,0,0,0,0,0,0,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,186,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,87,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,25,0,0,0,0,187,187,0,0,105,0,0,0,0,25,25,25,58,0,0,37,25,25,187,111,0,111,0,0,37,40,108,0,0,0,0,37,0,105,108,40,0,188,40,111,101,107,37,102,25,103,40,108,104,109,105,111,101,107,37,102,25,103,40,108,104,109,105,58,58,58,58,58,58,58,58,101,37,102,103,40,104,105,101,37,102,103,40,104,105,103,40,104,105,102,102,101,40,103,37,103,40,104,105,107,37,102,25,25,103,103,40,40,108,108,104,109,105,103,111,111,111,101,107,37,102,25,25,25,103,40,40,108,104,109,105,107,107,40,108,103,40,187,189,187,189,111,40,103,40,104,105,111,101,107,37,102,25,103,40,108,104,109,105,88,92,101,101,107,40,108,92,111,101,101,111,111,40,188,37,188,37,188,37,40,40,103,104,109,103,0,40,58,103,103,0,58,103,104,109,58,107,103,40,104,105,58,103,25,103,103,103,58,103,0,101,37,102,103,40,104,105,108,25,103,40,108,58,58,103,111,101,107,37,102,25,103,40,108,104,109,105,111,101,107,37,102,25,103,40,108,104,109,105,111,101,107,37,102,25,103,40,108,104,109,105,111,101,107,37,102,25,103,40,108,104,109,105,0,190,190,190,0,0,0,135,0,134,134,0,134,135,0,0,0,116,117,131,117,117,117,117,117,116,117,134,131,135,116,117,134,131,135,117,117,117,117,116,116,0,117,116,116,131,117,117,117,116,116,131,0,117,116,116,117,134,131,131,135,135,116,117,134,131,135,117,117,117,117,117,117,117,117,116,131,117,117,116,117,134,131,135,191,117,131,117,117,117,117,117,117,117,117,117,135,117,117,116,117,0,117,117,117,116,116,131,135,116,117,116,116,116,117,134,131,135,116,117,134,131,135,0,116,117,134,131,135,116,116,117,134,131,135,0,0,150,0,0,0,0,0,150,0,150,149,146,147,148,150,149,146,147,148,146,147,148,146,147,148,161,146,147,148,0,146,147,148,149,149,150,149,146,147,148,150,149,146,147,148,150,149,146,147,148,149,148,149,149,146,147,148,150,149,146,147,148,150,149,146,147,148,150,149,146,147,148,150,149,146,147,148,192,193,193,192,193,0,0,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,157,152,157,152,157,24,0,24,24,24,154,24,24,24,24,24,24,157,152,154,24,0,0,0,0,0,0,0,0,154,0,0,24,55,133,133,55,133,152,24,154,156,118,55,133,157,152,24,154,156,118,55,133,157,55,152,24,154,156,118,55,133,157,152,24,154,156,118,55,133,157,152,118,118,55,133,157,156,194,156,156,152,24,154,118,157,55,152,24,24,154,156,118,55,133,157,152,152,152,24,24,154,156,118,55,133,157,152,194,156,156,55,152,24,154,156,118,55,133,157,156,55,152,118,24,55,133,195,156,156,119,156,133,55,133,152,24,154,156,118,55,133,157,24,133,133,152,24,154,156,118,55,133,157,152,24,154,156,118,55,133,157,152,24,154,156,118,55,133,157,152,24,154,156,118,55,133,157,196,164,0,163,163,0,0,163,164,0,0,0,164,128,128,128,128,128,128,128,128,128,129,127,128,164,163,129,127,128,164,163,128,129,127,128,164,163,129,127,128,164,163,164,163,128,128,129,127,164,163,128,128,128,128,128,164,163,128,128,128,129,127,128,164,163,129,127,128,164,163,164,163,128,129,127,128,164,163,128,128,128,128,128,164,163,128,128,128,164,129,127,128,164,163,129,127,128,164,163,129,127,128,164,163,129,127,128,164,163,128,128,129,127,128,164,163],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[1,2],[1],[3,4],[[],5],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,[[],[[9,[[8,[6,7]]]]]],[1,1],[3,3],[10,10],[11,11],[12,12],[13,13],[[]],[[]],[[]],[[]],[[]],[[]],[[1,1],14],[[13,13],14],0,0,[[],3],[[],3],0,0,0,[[],[[9,[1]]]],[[],[[9,[10]]]],[[],[[9,[13]]]],[[1,1],15],[[3,3],15],[[10,10],15],[[11,11],15],[[12,12],15],[[13,13],15],0,[[3,5],16],[[3,5],16],[[17,18],19],[[17,18],19],[[1,18],19],[[3,18],19],[[10,18],19],[[11,18],19],[[12,18],19],[[13,18],19],0,[20,17],[21,17],[[]],[22,17],[23,17],[24,17],[25,17],[26,17],[[]],[[]],[[]],[[]],[[]],[[]],[4,3],[4,3],[4,3],[4,3],[[16,5],3],[[16,5],3],[1],[10],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,[12,27],0,[[1,1],[[28,[14]]]],[[3,3],[[28,[14]]]],[[13,13],[[28,[14]]]],[29],0,0,0,0,[1,9],[10,9],[13,9],0,[[3,3]],0,[[]],[[]],[[]],[[]],[[]],[[]],[[],30],0,[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],0,[12,31],0,[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],0,[[],5],[[],33],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,[[],9],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[34,35],[[9,[36,26]]]],[[],37],[[],37],[38,39],[[[34,[40]],41],[[34,[42]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[38,[[8,[38,7]]]],0,[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[39,[[9,[43]]]],[39,[[9,[43]]]],[39,[[9,[43]]]],[[],[[9,[43]]]],[[],[[9,[43]]]],[[],[[9,[43]]]],0,[44,44],[45,45],[34,34],[46,46],[47,47],[38,38],[[]],[[]],[[]],[[]],[[]],[[]],[[44,44],14],[[45,45],14],[[34,34],14],[[46,46],14],[[47,47],14],[[38,38],14],[38,15],0,[[[34,[40]],41],[[34,[42]]]],[[[34,[42]],48],[[9,[[34,[49]],50]]]],[[[34,[40]],48,41],[[9,[[34,[49]],50]]]],[34,51],[[],[[9,[34]]]],[[],[[9,[38]]]],[[[34,[40]]],16],[38,52],[[44,44],15],[[45,45],15],[[34,34],15],[[46,46],15],[[47,47],15],[[38,38],15],0,[34,[[9,[52,26]]]],0,[[38,53],[[9,[54]]]],[[55,56,48],[[9,[[28,[57]],22]]]],[[[34,[40]],55,56,48],[[9,[[28,[57]],22]]]],[[[38,[40,58]],55,56,48],[[9,[[28,[57]],22]]]],[[[34,[40]],48,52,[59,[41]]],[[9,[28,50]]]],[[44,18],[[9,[60]]]],[[45,18],[[9,[60]]]],[[34,18],[[9,[60]]]],[[34,18],[[9,[60]]]],[[46,18],[[9,[60]]]],[[47,18],[[9,[60]]]],[[38,18],[[9,[60]]]],[[38,18],[[9,[60]]]],[34,15],[38,15],[[]],[[]],[61,34],[62,34],[[]],[63,34],[64,34],[65,34],[66,34],[[]],[[]],[[]],[39,[[9,[38,26]]]],[33,[[9,[34,26]]]],[33,[[9,[38,26]]]],[[33,53],[[9,[38,26]]]],[33,[[9,[38,26]]]],[67,[[9,[34,26]]]],[67,[[9,[38,26]]]],[[38,5],[[28,[38]]]],[[38,5],28],[34,[[9,[26]]]],[34,[[9,[26]]]],[38,15],[38,15],[[[34,[40]]],15],[44],[45],[34],[46],[47],[38],[[]],[[]],[[]],[[]],[[]],[[]],[38,39],[[48,35],[[9,[22]]]],[[68,48,35],[[9,[22]]]],[[[34,[40]]],15],[38,15],[38,69],[38,70],[34,[[9,[71,26]]]],[38,[[9,[71,26]]]],[38,[[9,[72]]]],[[44,48],[[28,[73]]]],[38,[[28,[5]]]],[38,[[28,[5]]]],[38,[[28,[5]]]],[38,[[9,[5,26]]]],[34,[[9,[5,26]]]],[38,[[9,[5,26]]]],[[],33],[[],33],[[],33],[[[38,[74]]],[[9,[34,26]]]],[[],34],[[],34],[[[38,[46]]],[[9,[34,26]]]],[[5,[8,[7]]],[[9,[34,26]]]],[65,34],[63,34],[[],[[9,[34,26]]]],[[[38,[47]]],[[9,[34,26]]]],[[5,[8,[7]]],[[9,[34,26]]]],[[[28,[75]]],[[9,[34,26]]]],[[],[[9,[34,26]]]],[[[38,[47]]],[[9,[34,26]]]],[[5,[8,[7]]],[[9,[34,26]]]],0,0,[38,[[9,[26]]]],[52,[[9,[38,26]]]],[[48,33],[[9,[26]]]],[52,[[9,[38,26]]]],[[52,53],[[9,[38,26]]]],[[44,44],[[28,[14]]]],[[45,45],[[28,[14]]]],[[34,34],[[28,[14]]]],[[46,46],[[28,[14]]]],[[47,47],[[28,[14]]]],[[38,38],[[28,[14]]]],[[],5],[[],5],[[],5],0,[38,15],[34,[[9,[26]]]],[38,[[9,[54]]]],[[34,76],[[9,[26]]]],[38,[[9,[[8,[[8,[2,7]],7]],26]]]],[38,[[9,[[8,[[8,[2,7]],7]],26]]]],[34,[[9,[52,26]]]],[34,52],[38,5],[34,9],[38,9],[[],77],[[],77],[[],77],0,[[]],[[]],[[]],[[]],[[]],[[]],[[],30],[[],30],[[[34,[40]],78],30],[38,[[9,[26]]]],[38,[[9,[26]]]],[34,9],[38,9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],0,[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[34,52],[[]],[[]],[[]],[[]],[[]],[[]],0,[38,15],0,[33,[[9,[30,22]]]],[33,[[9,[22]]]],[33,[[9,[30,22]]]],[33,[[9,[22]]]],0,0,0,0,0,0,0,0,0,0,0,0,[[]],[[]],[[22,18],19],[[22,18],19],[21,22],[79,22],[80,22],[81,22],[[]],[25,22],[23,22],[26,22],[[]],[29],[[],30],[[],9],[[],9],[[],32],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[82,82],[83,83],[84,84],[57,57],[85,85],[56,56],[[]],[[]],[[]],[[]],[[]],[[]],0,0,[[],85],[[82,82],15],[[83,83],15],[[84,84],15],[[57,57],15],[[85,85],15],[[23,23],15],[[82,18],19],[[83,18],19],[[84,18],19],[[57,18],19],[[85,18],19],[[23,18],19],[[23,18],19],[[56,18],19],[[]],[[]],[15,84],[[]],[[]],[83,57],[[]],[[]],[[]],[[57,86],[[9,[85,23]]]],[82],[85],[83,30],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[83,15],[84,15],[85,15],0,[[85,85],[[28,[14]]]],[29],[57,15],0,[82,9],[83,9],[84,9],[57,9],[85,9],0,[[]],[[]],[[]],[[]],[[]],[[]],[[],30],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[35,[[9,[87,22]]]],[[[89,[[88,[46]]]],35],[[9,[87,22]]]],[[[90,[[88,[47]]]],35],[[9,[87,22]]]],[[[91,[[88,[47]]]],35],[[9,[87,22]]]],[[[93,[[92,[46]]]],35],[[9,[87,22]]]],[[[94,[[92,[46]]]],35],[[9,[87,22]]]],[[[95,[[92,[47]]]],35],[[9,[87,22]]]],[[[96,[[92,[47]]]],35],[[9,[87,22]]]],[[[97,[[92,[47]]]],35],[[9,[87,22]]]],[[[98,[[92,[47]]]],35],[[9,[87,22]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[87,48,35],[[9,[22]]]],[[48,35],[[9,[22]]]],[[48,35],[[9,[22]]]],[[48,35],[[9,[22]]]],[[48,35],[[9,[22]]]],[[48,35],[[9,[22]]]],[[48,35],[[9,[22]]]],[[48,35],[[9,[22]]]],[[48,35],[[9,[22]]]],[[48,35],[[9,[22]]]],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[],99],[[],37],[[40,41],42],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[39,[[9,[43]]]],[[],[[9,[43]]]],[[[101,[100,58]]],[[101,[100,58]]]],[37,37],[102,102],[103,103],[40,40],[104,104],[105,105],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[103,103],14],[[40,40],14],[[104,104],14],[[105,105],14],0,[[],102],[[[101,[58]]]],[[40,41],42],[103,52],[[37,37],15],[[103,103],15],[[40,40],15],[[104,104],15],[[105,105],15],[[[107,[[0,[106,58]]]],18],19],[[37,18],19],[[102,18],19],[[25,18],19],[[25,18],19],[[103,18],[[9,[60]]]],[[103,18],[[9,[60]]]],[[40,18],[[9,[60]]]],[[40,18],[[9,[60]]]],[[108,18],[[9,[60]]]],[[108,18],[[9,[60]]]],[[104,18],[[9,[60]]]],[[109,18],[[9,[60]]]],[[105,18],[[9,[60]]]],[103,15],[110,[[111,[58]]]],[112,[[111,[58]]]],[[]],[[]],[[]],[[]],[[]],[[]],[21,25],[26,25],[[]],[42,40],[[]],[[]],[[]],[[]],[[]],[[40,99],[[107,[58]]]],[[108,99],[[107,[58]]]],[33,[[9,[40]]]],[33,[[9,[108]]]],[67,[[9,[103,26]]]],[40,73],[[],[[9,[101]]]],[[],[[9,[101]]]],[[],[[9,[101]]]],[[],[[9,[101]]]],[[[111,[58]]],15],[40,15],[103],[40],[104],[105],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],[[9,[107,25]]]],[[[28,[113]],73],[[9,[107,25]]]],[[101,[28,[113]],73],[[9,[107,25]]]],[101,[[9,[107,25]]]],[[[107,[58]]],[[9,[[107,[58]],25]]]],[40,[[9,[[107,[58]],25]]]],[108,[[9,[[107,[58]],25]]]],[[],[[9,[111,25]]]],[[[111,[58]]],[[9,[[111,[58]],25]]]],[101,[[9,[111,25]]]],[[[101,[58]]]],[[[111,[58]],35],[[28,[110]]]],[[[111,[58]],35,48],112],[40,15],[[],15],[37,15],[[],15],[37,15],[[],15],[37,15],[40,15],[40,15],0,0,0,[103,[[9,[71,26]]]],[[],99],[40,114],[38,[[28,[5]]]],[103,5],[103,5],[[99,99],99],[[],33],[[5,[8,[7]]],[[9,[103,26]]]],0,0,[38,[[9,[26]]]],[[[107,[58]],99],[[107,[58]]]],[[103,103],[[28,[14]]]],[[40,40],[[28,[14]]]],[[104,104],[[28,[14]]]],[[105,105],[[28,[14]]]],[[],5],0,[29],[103,[[9,[26]]]],[103,[[9,[[8,[[8,[2,7]],7]],26]]]],[103,5],[[],77],[103,39],[[],99],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[108,48],[[9,[40,115]]]],[[],30],[[],30],[[],30],[[],30],[38,[[9,[26]]]],[38,[[9,[26]]]],[103,[[9,[103]]]],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,[[],[[28,[16]]]],[[],[[28,[3]]]],[5,[[28,[31]]]],0,0,0,0,0,0,0,0,0,0,0,0,0,[[116,116],116],[[117,1,118,[120,[119]]]],0,[[117,121],[[9,[122]]]],[117,123],[117,124],[117,124],[117,123],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[117,125],[[9,[[128,[126,127]],17]]]],[117,[[128,[126,129]]]],[[117,130]],[117,86],[116,116],[[]],0,[117,9],0,[[],116],[131],[[117,1],[[28,[41]]]],[[117,52],28],[[117,1],30],[[],[[9,[116]]]],[[116,116],15],[[131,131],15],0,[[117,132,133],[[9,[15,17]]]],[[116,18],[[9,[60]]]],[[116,18],[[9,[60]]]],[[[117,[106]],18],19],[[134,18],19],[[131,18],19],[[131,18],19],[[[135,[106]],18],19],[[135,18],19],[[]],[[]],[[]],[[]],[[]],[[117,134],131],[117,116],[[117,1],68],[[117,134],131],[[117,10,[28,[136]],15],[[9,[137,17]]]],[[117,1],[[120,[55]]]],[[117,125,15],[[28,[13]]]],[[117,27],[[28,[10]]]],0,0,[[117,138],[[9,[15,139]]]],[[117,130,140],[[9,[15,[141,[140]]]]]],[[]],[[]],[[]],[[]],[[]],[52,15],[[117,52],15],0,[117,86],[117,[[28,[138]]]],[[117,15],[[8,[13]]]],[117,[[8,[10]]]],[117,35],[[142,[28,[142]],35],[[9,[117,135]]]],[[142,[28,[142]],35],[[9,[117,22]]]],[[117,1],41],[[117,1],[[9,[[28,[57]],17]]]],[29],[[117,1],[[28,[68]]]],[117,48],[116,9],[[117,132,133],[[9,[15,17]]]],0,[117,[[86,[1,[0,[143,100]]]]]],[[117,1],[[0,[143,100]]]],[117,144],[[]],[[],30],[[],30],[[],30],[116,16],[117,145],0,[116,16],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],0,[[],32],[[],32],[[],32],[[],32],[[],32],0,[[]],[[]],[[]],[[]],[[]],[[28,35,48],[[9,[30,17]]]],0,0,0,0,0,0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[146,146],[147,147],[148,148],[[]],[[]],[[]],[[[8,[11]],[8,[11]],3,16,52],[[9,[149,17]]]],[[146,[8,[11]],[8,[11]],3,16,52],[[9,[149,17]]]],[[147,[8,[11]],[8,[11]],3,16,52],[[9,[149,17]]]],[[148,[8,[11]],[8,[11]],3,16,52],[[9,[149,17]]]],[[16,3,52],150],[[],146],[[],147],[[],148],0,0,[[150,18],19],[[149,18],19],[[146,18],19],[[147,18],19],[[148,18],19],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[149,16],[16,148],0,[149,16],[[]],[[]],[[]],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,[[]],[[]],[151,[[28,[30]]]],[151,30],[[],[[9,[151]]]],[[117,33,15],[[9,[151,33]]]],[[151,18],19],[[]],[33,[[9,[151]]]],[[]],0,[151,9],[151,30],[[],9],[[],9],[[],32],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[55,152,118,[120,[119]]],[[28,[[120,[119]]]]]],0,0,[[55,48],153],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[153,34,48],55],[152,152],[24,24],[154,154],[[[156,[[0,[100,155,106,100]]]]],[[156,[[0,[100,155,106,100]]]]]],[118,118],[55,55],[133,133],[157,157],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[152,152],14],[[118,118],14],[[],118],[[],55],[[],133],[[],157],[[[156,[[0,[155,106,100]]]]]],[[],[[28,[108]]]],[[[156,[158]]],[[28,[108]]]],[[[156,[[44,[110]]]]],[[28,[108]]]],[[152,152],15],[[24,24],15],[[154,154],15],[[118,118],15],[[157,157],15],[[55,152],[[28,[120]]]],[[152,18],19],[[24,18],19],[[24,18],19],[[154,18],19],[[[156,[[0,[106,155,106,100]]]],18],19],[[118,18],19],[[55,18],19],[[133,18],19],[[157,18],19],[114,152],[159,152],[[]],[160,24],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[152],[48,152],[[[156,[158]],48],152],[[[156,[[44,[110]]]],48],152],[55,[[8,[152]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[[0,[155,106,100]],154],[[156,[[0,[155,106,100]]]]]],[[],55],[[152,152],[[28,[14]]]],[[118,118],[[28,[14]]]],[29],[[55,152,118],[[28,[[120,[119]]]]]],0,[[132,5,133,48],[[9,[24]]]],[[[156,[158]],132,5,133,48],[[9,[24]]]],[[[156,[[44,[110]]]],132,5,133,48],[[9,[24]]]],[[132,133,48],[[9,[24]]]],[[132,133,48],[[9,[24]]]],0,[55,[[8,[120]]]],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],30],0,0,[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,[[[128,[161,129]]],[[128,[161,129]]]],[[[128,[161,162]],27,137,5],[[9,[[128,[161,162]],17]]]],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,129]],52,16],[[128,[161,129]]]],[[[128,[161,162]],27],[[128,[161,162]]]],[[[128,[161,162]],27],[[9,[[128,[161,162]],17]]]],[[[128,[161,162]]],[[9,[[128,[161,162]],17]]]],[[[128,[161,162]],15],[[128,[161,162]]]],[[[128,[126,127]],52],[[9,[[128,[126,127]],17]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[[128,[161,162]],163],[[128,[161,162]]]],[129,129],[127,127],[[[128,[100]]],[[128,[100]]]],[164,164],[163,163],[[]],[[]],[[]],[[]],[[]],[[164,164],14],[[163,163],14],[[[128,[161,162]],161],[[128,[161,162]]]],[[[128,[161,162]],41],[[128,[161,162]]]],[[],129],[[],127],[[],164],[[],163],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,129]],52],[[128,[161,129]]]],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,162]],165],[[128,[161,162]]]],[[164,164],15],[[163,163],15],[[[128,[161,162]],16],[[128,[161,162]]]],[[[128,[161,162]],3],[[128,[161,162]]]],[[[128,[161,162]]],[[9,[17]]]],[[129,18],19],[[127,18],19],[[[128,[106,106,106]],18],19],[[164,18],19],[[163,18],19],[[]],[[]],[[]],[[]],[[]],[164],[163],[[[128,[161,162]]],[[128,[161,162]]]],[[]],[[]],[[]],[[]],[[]],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,162]],166],[[128,[161,162]]]],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,162]],164],[[128,[161,162]]]],[[164,164],[[28,[14]]]],[[163,163],[[28,[14]]]],[[[128,[161,162]],[86,[30,[8,[5]]]],1],[[128,[161,162]]]],[[[128,[161,129]],8],[[128,[161,129]]]],[[[128,[161,162]],136],[[128,[161,162]]]],[[164,130]],[[]],[[]],[[]],[[]],[[]],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[[128,[161,162]],[8,[27]]],[[128,[161,162]]]],[[[128,[161,162]],167],[[128,[161,162]]]],[[]],[[]],[[]],[[]],[[]]],"p":[[4,"KeychainKind"],[15,"u8"],[3,"FeeRate"],[15,"f32"],[15,"usize"],[3,"u5"],[3,"Global"],[3,"Vec"],[4,"Result"],[3,"LocalUtxo"],[3,"WeightedUtxo"],[4,"Utxo"],[3,"TransactionDetails"],[4,"Ordering"],[15,"bool"],[15,"u64"],[4,"Error"],[3,"Formatter"],[6,"Result"],[4,"Error"],[4,"Error"],[4,"Error"],[4,"PolicyError"],[4,"SignerError"],[4,"KeyError"],[4,"Error"],[3,"OutPoint"],[4,"Option"],[3,"Demand"],[3,"String"],[3,"TxOut"],[3,"TypeId"],[15,"str"],[4,"Descriptor"],[4,"Network"],[3,"Address"],[4,"ScriptContextEnum"],[3,"Miniscript"],[4,"Terminal"],[4,"DescriptorPublicKey"],[15,"u32"],[3,"DefiniteDescriptorKey"],[4,"ScriptContextError"],[3,"DescriptorXKey"],[4,"Wildcard"],[4,"Legacy"],[4,"Segwitv0"],[3,"Secp256k1"],[3,"PublicKey"],[4,"ConversionError"],[4,"DescriptorType"],[3,"Script"],[3,"ExtParams"],[4,"AnalysisError"],[3,"SignersContainer"],[4,"BuildSatisfaction"],[3,"Policy"],[8,"ScriptContext"],[3,"Range"],[3,"Error"],[3,"Pkh"],[3,"Tr"],[3,"Wsh"],[3,"Bare"],[3,"Wpkh"],[3,"Sh"],[3,"Tree"],[6,"ExtendedDescriptor"],[3,"Iter"],[3,"PkIter"],[4,"Policy"],[4,"LiftError"],[3,"DerivationPath"],[4,"BareCtx"],[4,"TapTree"],[3,"TxIn"],[4,"SigType"],[3,"HashMap"],[4,"Error"],[4,"Error"],[4,"Error"],[4,"PkOrF"],[4,"SatisfiableItem"],[4,"Satisfaction"],[3,"Condition"],[3,"BTreeMap"],[6,"DescriptorTemplateOut"],[8,"IntoDescriptorKey"],[3,"P2Pkh"],[3,"P2Wpkh_P2Sh"],[3,"P2Wpkh"],[8,"DerivableKey"],[3,"Bip44"],[3,"Bip44Public"],[3,"Bip49"],[3,"Bip49Public"],[3,"Bip84"],[3,"Bip84Public"],[6,"ValidNetworks"],[8,"Clone"],[3,"GeneratedKey"],[3,"PrivateKeyGenerateOptions"],[3,"SortedMultiVec"],[3,"SinglePub"],[4,"SinglePubKey"],[8,"Debug"],[4,"DescriptorKey"],[4,"DescriptorSecretKey"],[3,"SinglePriv"],[3,"ExtendedPrivKey"],[4,"ExtendedKey"],[3,"ExtendedPubKey"],[6,"KeySource"],[3,"Fingerprint"],[3,"DescriptorKeyParseError"],[3,"Balance"],[3,"Wallet"],[3,"SignerOrdering"],[8,"TransactionSigner"],[3,"Arc"],[6,"Update"],[6,"UpdateError"],[3,"ChainGraph"],[3,"TxGraph"],[3,"Txid"],[6,"DefaultCoinSelectionAlgorithm"],[3,"BumpFee"],[3,"TxBuilder"],[3,"CreateTx"],[3,"Transaction"],[3,"AddressInfo"],[3,"PartiallySignedTransaction"],[3,"SignOptions"],[4,"AddressIndex"],[4,"NewError"],[3,"PsbtSighashType"],[3,"Input"],[3,"BlockId"],[4,"InsertCheckpointError"],[4,"ConfirmationTime"],[4,"InsertTxError"],[8,"IntoWalletDescriptor"],[8,"Iterator"],[3,"KeychainChangeSet"],[8,"DoubleEndedIterator"],[3,"LargestFirstCoinSelection"],[3,"OldestFirstCoinSelection"],[3,"BranchAndBoundCoinSelection"],[3,"CoinSelectionResult"],[4,"Excess"],[3,"FullyNodedExport"],[4,"SignerId"],[6,"KeyMap"],[4,"SignerContext"],[8,"Sized"],[3,"SignerWrapper"],[4,"TapLeavesOptions"],[3,"PrivateKey"],[3,"Hash"],[4,"Error"],[8,"CoinSelectionAlgorithm"],[8,"TxBuilderContext"],[4,"ChangeSpendPolicy"],[4,"TxOrdering"],[3,"Sequence"],[4,"LockTime"],[15,"i32"],[8,"Vbytes"],[13,"InsufficientFunds"],[13,"FeeRateTooLow"],[13,"FeeTooLow"],[13,"Foreign"],[8,"ExtractPolicy"],[13,"PsbtTimelocks"],[13,"Complete"],[13,"Partial"],[13,"PartialComplete"],[13,"Sha256Preimage"],[13,"Hash256Preimage"],[13,"Ripemd160Preimage"],[13,"Hash160Preimage"],[13,"Thresh"],[13,"Multisig"],[13,"AbsoluteTimelock"],[13,"RelativeTimelock"],[8,"DescriptorTemplate"],[8,"GeneratableKey"],[8,"ExtScriptContext"],[8,"GeneratableDefaultOptions"],[8,"PsbtUtils"],[8,"IsDust"],[13,"Change"],[13,"NoChange"],[8,"SignerCommon"],[8,"InputSigner"],[13,"Tap"]]},\
+"bdk_chain":{"doc":"This crate is a collection of core structures for Bitcoin â¦","t":[8,8,3,17,8,4,13,13,13,8,16,8,3,4,3,4,13,13,13,11,10,11,10,11,2,11,11,11,11,11,11,11,11,11,11,11,11,0,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,12,11,11,11,0,11,11,11,11,11,11,11,10,11,11,11,11,11,12,11,11,11,11,11,0,0,11,11,11,11,11,2,11,12,11,11,11,11,11,11,11,11,11,11,11,11,0,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,13,13,3,3,13,6,4,13,4,3,13,13,4,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,12,12,16,3,3,8,8,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,10,10,11,11,11,11,11,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,17,3,3,3,3,3,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,12,11,12,11,11,11,11,11,11,16,3,8,16,10,11,11,11,11,11,11,10,11,11,11,11,11,11,11,6,3,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,8,3,13,4,4,13,3,13,13,13,4,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,3,3,3,3,3,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11],"n":["Anchor","Append","BlockId","COINBASE_MATURITY","ChainOracle","ConfirmationTime","Confirmed","Confirmed","Confirmed","DescriptorExt","Error","ForEachTxOut","FullTxOut","ObservedAs","SpkTxOutIndex","TxHeight","Unconfirmed","Unconfirmed","Unconfirmed","all_spks","anchor_block","anchor_block","append","apply_additions","bitcoin","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","chain_graph","chain_position","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cloned","cmp","cmp","cmp","cmp","cmp","confirmation_height_upper_bound","confirmation_height_upper_bound","default","default","default","deserialize","deserialize","deserialize","dust_value","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_txout","from","from","from","from","from","from","from","from","from","hash","hash","hash","hash","hash","height","height","height","index_of_spk","index_tx","index_txout","indexed_tx_graph","insert_spk","into","into","into","into","into","into","is_block_in_chain","is_confirmed","is_confirmed","is_confirmed_and_spendable","is_mature","is_mature","is_on_coinbase","is_relevant","is_spendable_at","is_spk_owned","is_tx_relevant","is_used","keychain","local_chain","mark_used","max_ord_of_height","max_ord_of_height","min_ord_of_height","min_ord_of_height","miniscript","net_value","outpoint","outputs_in_range","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","scan","scan_txout","sent_and_received","serialize","serialize","serialize","sparse_chain","spent_by","spk_at_index","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","tx_graph","txout","txout","txouts","txouts_in_tx","type_id","type_id","type_id","type_id","type_id","type_id","unmark_used","unused_spks","vzip","vzip","vzip","vzip","vzip","vzip","height","time","Chain","Chain","ChainGraph","ChangeSet","Conflict","InsertCheckpointError","InsertTxError","Missing","NewError","UnresolvableConflict","UnresolvableConflict","UnresolvableConflict","UpdateError","already_confirmed_tx","append","apply_changeset","apply_update","as_ref","as_ref","as_ref","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","chain","chain","checkpoint_limit","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","contains_eviction","default","default","deserialize","determine_changeset","eq","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_txout","for_each_txout","from","from","from","from","from","from","from","from","from","from","full_txout","get_tx_in_chain","graph","graph","inflate_update","insert_checkpoint","insert_checkpoint_preview","insert_tx","insert_tx_preview","insert_txout","insert_txout_preview","into","into","into","into","into","into","invalidate_checkpoints","invalidate_checkpoints_preview","is_empty","is_empty","new","provide","provide","provide","provide","serialize","set_checkpoint_limit","spent_by","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","transactions_in_chain","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","tx_conflicts_in_chain","type_id","type_id","type_id","type_id","type_id","type_id","update_tx","vzip","vzip","vzip","vzip","vzip","vzip","a","b","Additions","IndexedAdditions","IndexedTxGraph","Indexer","OwnedIndexer","append","apply_additions","apply_additions","apply_update","balance","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","default","default","deserialize","eq","fmt","from","from","graph","graph_additions","index","index_additions","index_tx","index_txout","insert_relevant_txs","insert_tx","insert_txout","into","into","is_spk_owned","is_tx_relevant","list_owned_txouts","list_owned_unspents","serialize","to_owned","try_balance","try_from","try_from","try_into","try_into","try_list_owned_txouts","try_list_owned_unspents","type_id","type_id","vzip","vzip","BIP32_MAX_INDEX","Balance","DerivationAdditions","KeychainChangeSet","KeychainScan","KeychainTracker","KeychainTxOutIndex","add","add_keychain","add_keychain","append","append","apply_additions","apply_additions","apply_changeset","apply_update","as_inner","as_ref","as_ref","as_ref","as_ref","as_ref","balance","balance_at","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","chain","chain_graph","chain_graph","checkpoint_limit","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","confirmed","default","default","default","default","default","default","deref","derivation_indices","deserialize","deserialize","deserialize","determine_changeset","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_txout","from","from","from","from","from","from","from","from","from","full_txouts","full_utxos","graph","immature","index_tx","index_txout","inner","insert_checkpoint","insert_checkpoint_preview","insert_tx","insert_tx_preview","into","into","into","into","into","into","is_empty","is_empty","is_spk_owned","is_tx_relevant","keychains","keychains","last_active_indices","last_revealed_index","last_revealed_indices","last_used_index","last_used_indices","lookahead_to_target","lookahead_to_target_multi","lookaheads","mark_used","next_index","next_unused_spk","persist","reveal_next_spk","reveal_to_target","reveal_to_target_multi","revealed_spks_of_all_keychains","revealed_spks_of_keychain","scan","scan_txout","serialize","serialize","serialize","set_checkpoint_limit","set_lookahead","set_lookahead_for_all","spks_of_all_keychains","spks_of_keychain","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","total","trusted_pending","trusted_spendable","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","txout_index","txouts_of_keychain","type_id","type_id","type_id","type_id","type_id","type_id","unmark_used","untrusted_pending","unused_spks_of_keychain","update","vzip","vzip","vzip","vzip","vzip","vzip","LoadError","Persist","PersistBackend","WriteError","append_changeset","borrow","borrow_mut","commit","fmt","from","into","load_into_keychain_tracker","new","stage","staged","try_from","try_into","type_id","vzip","ChangeSet","LocalChain","UpdateNotConnectedError","apply_changeset","apply_update","as_ref","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","cmp","default","determine_changeset","eq","eq","fmt","fmt","fmt","from","from","from","from_blocks","get_block","heights","initial_changeset","into","into","is_block_in_chain","partial_cmp","provide","tip","to_owned","to_owned","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","ChainPosition","ChangeSet","HashNotMatching","InsertCheckpointError","InsertTxError","NotConnected","SparseChain","TxInconsistent","TxMovedUnexpectedly","TxTooHigh","UpdateError","append","apply_changeset","apply_update","as_ref","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","changeset_additions","checkpoint_at","checkpoint_limit","checkpoints","checkpoints","clear_mempool","clear_mempool_preview","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","default","default","deserialize","determine_changeset","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from_checkpoints","full_txout","height","initial_changeset","insert_checkpoint","insert_checkpoint_preview","insert_tx","insert_tx_preview","into","into","into","into","into","invalidate_checkpoints","invalidate_checkpoints_preview","is_empty","is_empty","latest_checkpoint","max_ord_of_height","min_ord_of_height","provide","provide","provide","range_checkpoints","range_txids","range_txids_by_height","range_txids_by_position","serialize","set_checkpoint_limit","spent_by","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","tx_position","txids","txids","type_id","type_id","type_id","type_id","type_id","unconfirmed","vzip","vzip","vzip","vzip","vzip","height","original_hash","update_hash","original_pos","tip_height","tx_height","txid","txid","update_pos","original_pos","txid","update_pos","Additions","CanonicalTx","TxDescendants","TxGraph","TxNode","all_txouts","anchors","anchors","append","apply_additions","apply_update","as_ref","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","calculate_fee","checked_sum","checked_sum","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmp","cmp","default","default","deref","deserialize","determine_additions","direct_conflicts_of_tx","eq","eq","eq","eq","floating_txouts","fmt","fmt","fmt","fmt","for_each_txout","for_each_txout","from","from","from","from","from","full_txs","get_chain_position","get_chain_spend","get_tx","get_tx_node","get_txout","insert_anchor","insert_anchor_preview","insert_seen_at","insert_seen_at_preview","insert_tx","insert_tx_preview","insert_txout","insert_txout_preview","into","into","into","into","into","into_iter","is_empty","is_empty","last_seen","last_seen_unconfirmed","list_chain_txouts","list_chain_txs","list_chain_unspents","new","next","node","observed_as","outspends","partial_cmp","partial_cmp","relevant_heights","serialize","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_get_chain_position","try_get_chain_spend","try_into","try_into","try_into","try_into","try_into","try_list_chain_txouts","try_list_chain_txs","try_list_chain_unspents","tx","tx","tx_outputs","tx_spends","txid","txout","txouts","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","walk_conflicts","walk_descendants"],"q":["bdk_chain","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::ConfirmationTime","","bdk_chain::chain_graph","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::chain_graph::NewError","","bdk_chain::indexed_tx_graph","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::keychain","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::keychain::persist","","","","","","","","","","","","","","","","","","","bdk_chain::local_chain","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::sparse_chain","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::sparse_chain::InsertCheckpointError","","","bdk_chain::sparse_chain::InsertTxError","","","","","","bdk_chain::sparse_chain::UpdateError","","","bdk_chain::tx_graph","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"d":["Trait that âanchorsâ blockchain data to a specific â¦","Trait that makes an object appendable.","A reference to a block in the canonical chain.","How many confirmations are needed f or a coinbase output â¦","Represents a service that tracks the blockchain.","Block height and timestamp at which a transaction is â¦","The chain data is seen as confirmed, and in anchored by A.","","","A trait to extend the functionality of a miniscript â¦","Error type.","Trait to do something with every txout contained in a â¦","A TxOut with as much data as we can retrieve about it","Represents an observation of some chain data.","An index storing TxOuts that have a script pubkey that â¦","Represents the height at which a transaction is confirmed.","The chain data is seen in mempool at this given timestamp.","","","The script pubkeys that are being tracked by the index.","Returns the BlockId that the associated blockchain data is â¦","","Append another object of the same type onto self.","","","","","","","","","","","","","","","Module for structures that combine the features of â¦","The position of the transaction in outpoint in the overall â¦","","","","","","","","","","","","","","","","","","","Get the upper bound of the chain dataâs confirmation â¦","Get the upper bound of the chain dataâs confirmation â¦","","","","","","","Returns the minimum value (in satoshis) at which an output â¦","","","","","","","","","","","","","The provided closure f will be called with each â¦","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","","The hash of the block.","","","The height of the block.","Returns the index associated with the script pubkey.","","","","Adds a script pubkey to scan for. Returns false and does â¦","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Determines whether block of BlockId exists as an ancestor â¦","","","Whether the utxo is/was/will be spendable with chain tip.","","Whether the txout is considered mature.","Whether this output is on a coinbase transaction.","Whether any of the inputs of this transaction spend a â¦","Whether the utxo is/was/will be spendable at height.","","","Returns whether the script pubkey at index has been used â¦","Module for keychain related structures.","","Marks the script pubkey at index as used even though it â¦","","","","","","Computes the net value that this transaction gives to the â¦","The location of the TxOut.","Iterates over all the outputs with script pubkeys in an â¦","","","","","","Scans an object containing many txouts.","Scan a single TxOut for a matching script pubkey and â¦","Computes total input value going from script pubkeys in â¦","","","","Module for structures that maintain sparse (purposely â¦","The txid and chain position of the transaction (if any) â¦","Returns the script that has been inserted at the index.","","","","","","","","","","","","","","","","","","","","Module for structures that store and traverse transactions.","Returns the txout and script pubkey index of the TxOut at â¦","The TxOut.","Iterate over all known txouts that spend to tracked script â¦","Finds all txouts on a transaction that has previously been â¦","","","","","","","Undoes the effect of mark_used. Returns whether the index â¦","Iterates over all unused script pubkeys in an index range.","","","","","","","","","","The update chain was inconsistent with the existing chain","A consistent combination of a SparseChain<P> and a â¦","Represents changes to ChainGraph.","Two transactions within the sparse chain conflicted with â¦","A nice alias of sparse_chain::InsertCheckpointError.","Error that may occur when inserting a transaction.","One or more transactions in the chain were not in the graph","Error that may occur when calling ChainGraph::new.","Represents an unresolvable conflict between an updateâs â¦","","A transaction in the update spent the same input as an â¦","Represents an update failure.","","Appends the changes in other into self such that applying â¦","Applies changeset to self.","Applies the update chain graph. Note this is shorthand for â¦","","","","","","","","","","","","","","","","Returns a reference to the internal SparseChain.","","Gets the checkpoint limit.","","","","","","","","","","","","","Returns true if this ChangeSet contains transaction â¦","","","","Calculates the difference between self and update in the â¦","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Get the full transaction output at an outpoint if it â¦","Get a transaction currently in the underlying SparseChain.","Returns a reference to the internal TxGraph.","","Take an update in the form of a SparseChain<P> and attempt â¦","Inserts checkpoint into Self.","Determines the changes required to insert a block_id (a â¦","Inserts Transaction at the given chain position.","Determines the changes required to insert a transaction â¦","Inserts a TxOut into the internal TxGraph.","Determines the changes required to insert a TxOut into the â¦","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Invalidate checkpoints from_height (inclusive) and above. â¦","Determines the changes required to invalidate checkpoints â¦","Whether the chain graph contains any data whatsoever.","Returns true if this ChangeSet records no changes.","Create a new chain graph from a chain and a graph.","","","","","","Sets the checkpoint limit.","Find the transaction in the chain that spends outpoint.","","","","","","","","","","","Iterate over the full transactions and their position in â¦","","","","","","","","","","","","","Given a transaction, return an iterator of txids that â¦","","","","","","","","","","","","","","","","The resultant âadditionsâ when new transaction data is â¦","A structure that represents changes to an IndexedTxGraph.","A struct that combines TxGraph and an Indexer â¦","Represents a structure that can index transaction data.","A trait that extends Indexer to also index âownedâ â¦","","Apply additions to itself.","Applies the IndexedAdditions to the IndexedTxGraph.","Apply an update directly.","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Get a reference of the internal transaction graph.","TxGraph additions.","Transaction index.","Indexer additions.","Scan and index the given transaction.","Scan and index the given outpoint and txout.","Insert relevant transactions from the given txs iterator.","Insert and index a transaction into the graph.","Insert a floating txout of given outpoint.","Calls U::from(self).","Calls U::from(self).","Determines whether a given script pubkey (spk) is owned.","Determines whether the transaction should be included in â¦","","","","","","","","","","","","","","","","Maximum BIP32 derivation index.","Balance, differentiated into various categories.","Represents updates to the derivation index of a â¦","Represents changes to a KeychainTracker.","An update that includes the last active indexes of each â¦","A convenient combination of a KeychainTxOutIndex and a â¦","A convenient wrapper around SpkTxOutIndex that relates â¦","","Add a keychain to the trackerâs txout_index with a â¦","Add a keychain to the trackerâs txout_index with a â¦","Append another DerivationAdditions into self.","Appends the changes in other into self such that applying â¦","Applies the derivation additions to the KeychainTxOutIndexâ¦","","Applies the changes in changeset to KeychainTracker.","Directly applies a KeychainScan on KeychainTracker.","Get the inner map of the keychain to its new derivation â¦","","","","","","Returns the balance of the keychain, i.e., the value of â¦","Returns the balance of all spendable confirmed unspent â¦","","","","","","","","","","","","","Returns a reference to the internal SparseChain (which is â¦","Returns a reference to the internal ChainGraph.","The changes that have occurred in the blockchain","Get the checkpoint limit of the internal SparseChain.","","","","","","","","","","","","","Confirmed and immediately spendable balance","","","","","","","","The changes in local keychain derivation indices","","","","Determines the resultant KeychainChangeSet if the given â¦","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Returns the argument unchanged.","","Returns the argument unchanged.","Iterates through FullTxOuts that are considered to exist â¦","Iterates through FullTxOuts that are unspent outputs.","Returns a reference to the internal TxGraph (which is part â¦","All coinbase outputs not yet matured","","","Return a reference to the internal SpkTxOutIndex.","Directly insert a block_id into the tracker.","Determines the changes as a result of inserting block_id â¦","Directly insert a transaction into the inner ChainGraph â¦","Determines the changes as a result of inserting a â¦","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Returns whether the additions are empty.","Returns whether the KeychainChangeSet is empty (no changes â¦","","","Get the internal map of keychains to their descriptors. â¦","Return a reference to the internal map of the keychain to â¦","The last active indexes of each keychain","Get the last derivation index revealed for keychain.","Get the last derivation index that is revealed for each â¦","Returns the highest derivation index of the keychain where â¦","Returns the highest derivation index of each keychain that â¦","Store lookahead scripts until target_index.","Convenience method to call lookahead_to_target for â¦","Return the lookahead setting for each keychain.","Marks the script pubkey at index as used even though the â¦","Get the next derivation index for keychain. The next index â¦","Gets the next unused script pubkey in the keychain. I.e., â¦","Persistence for changes made to a KeychainTracker.","Attempts to reveal the next script pubkey for keychain.","Reveals script pubkeys of the keychainâs descriptor up â¦","Convenience method to call Self::reveal_to_target on â¦","Convenience method to get revealed_spks_of_keychain of all â¦","Iterates over the script pubkeys revealed by this index â¦","Scans an object for relevant outpoints, which are stored â¦","Scan a single outpoint for a matching script pubkey.","","","","Set the checkpoint limit of the internal SparseChain.","Set the lookahead count for keychain.","Convenience method to call set_lookahead for all keychains.","Generates script pubkey iterators for every keychain. The â¦","Generates a script pubkey iterator for the given keychainâ¦","","","","","","","","Get the whole balance visible to the wallet.","Unconfirmed UTXOs generated by a wallet tx","Get sum of trusted_pending and confirmed coins.","","","","","","","","","","","","","Index between script pubkeys to transaction outputs","Iterates over all the OutPoint that have a TxOut with a â¦","","","","","","","Undoes the effect of mark_used. Returns whether the index â¦","Unconfirmed UTXOs received from an external wallet","Iterates over all unused script pubkeys for a keychain â¦","The update data in the form of a chain that could be â¦","","","","","","","The error the backend returns when it fails to load.","Persist wraps a PersistBackend to create a convenient â¦","A persistence backend for Persist.","The error the backend returns when it fails to write.","Appends a new changeset to the persistent backend.","","","Commit the staged changes to the underlying persistence â¦","","Returns the argument unchanged.","Calls U::from(self).","Applies all the changesets the backend has received to â¦","Create a new Persist from a PersistBackend.","Stage a changeset to later persistence with commit.","Get the changes that havenât been committed yet","","","","","This is the return value of determine_changeset and â¦","This is a local implementation of ChainOracle.","Represents an update failure of LocalChain due to the â¦","Applies the given changeset.","Updates LocalChain with an update LocalChain.","","","","","","","","","","","","This is like the sparsechainâs logic, expect we must â¦","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","Get a block at the given height.","","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","Represents a position in which transactions are ordered in â¦","The return value of determine_changeset.","Occurs when a checkpoint of the same height already exists â¦","Represents a failure when trying to insert a checkpoint â¦","Represents a failure when trying to insert a Txid into â¦","The update cannot be applied to the chain because the â¦","This is a non-monotone structure that tracks relevant Txidâ¦","The update contains inconsistent tx states (e.g., it â¦","Occurs when the Txid is already in the SparseChain, and â¦","Occurs when the Txid is to be inserted at a height higher â¦","Represents an update failure of SparseChain.","Appends the changes of other into self such that applying â¦","","Updates SparseChain with another chain that connects to it.","","","","","","","","","","","","Return Txids that would be added to the sparse chain if â¦","Get the checkpoint at the given height if it exists.","Returns the value set as the checkpoint limit.","Return a BTreeMap of all checkpoints (block hashes by â¦","","Clears all transactions of height TxHeight::Unconfirmed.","Determines the ChangeSet when all transactions of height â¦","","","","","","","","","","","","","","Preview changes of updating Self with another chain that â¦","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Creates a new chain from a list of block hashes and â¦","Attempt to retrieve a FullTxOut of the given outpoint.","Get the transaction height of the position.","Derives a ChangeSet that assumes that there are no â¦","Insert a checkpoint (BlockId).","Determines the resultant ChangeSet if BlockId was inserted.","Inserts a given Txid at pos.","Determines the resultant ChangeSet if Txid was inserted at â¦","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Invalidate checkpoints from_height (inclusive) and above.","Determines the ChangeSet when checkpoints from_height â¦","Returns whether the sparse chain contains any checkpoints â¦","Whether this changeset contains no changes.","Get the checkpoint for the last known tip.","Get the positionâs upper bound of a given height.","Get the positionâs lower bound of a given height.","","","","Return an iterator over checkpoints in a height range, in â¦","Iterate over a sub-range of positioned Txids.","Iterate over a sub-range of positioned Txids, where the â¦","Iterate over a sub-range of positioned Txids, where the â¦","","Set the checkpoint limit.","Finds the transaction in the chain that spends outpoint.","","","","","","","","","","","","","","","","","","","Return the ChainPosition of a txid.","Iterate over all Txids ordered by their ChainPosition.","","","","","","","Get the unconfirmed position.","","","","","","","","","","","","","","","","","","A structure that represents changes to a TxGraph.","An outwards-facing view of a transaction that is part of â¦","An iterator that traverses transaction descendants.","A graph of transactions and spends.","An outward-facing view of a (transaction) node in the â¦","Iterate over all tx outputs known by TxGraph.","The blocks that the transaction is âanchoredâ in.","","","Applies Additions to TxGraph.","Extends this graph with another so that self becomes the â¦","","","","","","","","","","","","Calculates the fee of a given transaction. Returns 0 if tx â¦","","","","","","","","","","","","","","","","","Previews the resultant Additions when Self is updated â¦","Given a transaction, return an iterator of txids that â¦","","","","","Iterate over floating txouts known by TxGraph.","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Iterate over all full transactions in the graph.","Get the position of the transaction in chain with tip â¦","Get the txid of the spending transaction and where the â¦","Get a transaction by txid. This only returns Some for full â¦","Get a transaction node by txid. This only returns Some for â¦","Obtains a single tx output (if any) at the specified â¦","Inserts the given anchor into TxGraph.","Returns the resultant Additions if the txid is set in â¦","Inserts the given seen_at into TxGraph.","Returns the resultant Additions if the txid is set to â¦","Inserts the given transaction into TxGraph.","Returns the resultant Additions if the given transaction â¦","Inserts the given TxOut at OutPoint.","Returns the resultant Additions if the given txout is â¦","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","Whether the graph has any transactions or outputs in it.","Returns true if the Additions is empty (no transactions or â¦","","The last-seen unix timestamp of the transaction as â¦","List outputs that are in chain with chain_tip.","List graph transactions that are in chain with chain_tip.","List unspent outputs (UTXOs) that are in chain with â¦","Construct a new TxGraph from a list of transactions.","","The transaction node (as part of the graph).","How the transaction is observed as (confirmed or â¦","The transactions spending from this output.","","","Get all heights that are relevant to the graph.","","","","","","","","","","","Get the position of the transaction in chain with tip â¦","Get the txid of the spending transaction and where the â¦","","","","","","List outputs that are in chain with chain_tip.","List graph transactions that are in chain with chain_tip.","List unspent outputs (UTXOs) that are in chain with â¦","A partial or full representation of the transaction.","","Returns known outputs of a given txid.","Iterates over the transactions spending from txid.","Txid of the transaction.","","Iterates over all outpoints contained within Additions.","","","","","","","","","","","Creates an iterator that both filters and maps conflicting â¦","Creates an iterator that filters and maps descendants from â¦"],"i":[0,0,0,0,0,0,6,7,8,0,80,0,0,0,0,0,6,7,8,3,26,5,52,3,0,3,6,7,8,5,9,3,6,7,8,5,9,0,9,3,6,7,8,5,9,3,6,7,8,5,9,6,6,7,8,5,9,26,26,3,7,5,7,8,5,81,6,7,8,5,9,3,6,7,7,8,5,9,82,3,6,7,7,8,5,5,5,9,6,7,8,5,5,7,8,5,3,3,3,0,3,3,6,7,8,5,9,80,7,8,9,9,9,9,3,9,3,3,3,0,0,3,7,8,7,8,0,3,9,3,6,7,8,5,9,3,3,3,7,8,5,0,9,3,3,6,7,8,5,9,7,3,6,7,8,5,9,3,6,7,8,5,9,0,3,9,3,3,3,6,7,8,5,9,3,3,3,6,7,8,5,9,83,83,44,39,0,0,43,0,0,43,0,0,44,39,0,45,37,38,38,38,38,38,38,37,43,44,39,45,38,37,43,44,39,45,38,37,38,38,37,43,44,39,45,38,37,43,44,39,45,37,38,37,37,38,38,37,43,44,39,45,38,37,43,43,44,44,39,39,45,45,38,37,38,37,43,44,44,44,39,39,39,45,38,38,38,37,38,38,38,38,38,38,38,38,37,43,44,39,45,38,38,38,37,38,43,44,39,45,37,38,38,38,37,43,44,39,45,43,44,39,45,38,38,37,43,44,39,45,38,37,43,44,39,45,38,38,37,43,44,39,45,45,38,37,43,44,39,45,84,84,54,0,0,0,0,53,54,55,55,55,55,53,55,53,53,53,55,53,53,53,53,55,53,55,53,55,53,54,54,55,55,55,55,53,56,54,55,55,53,53,55,55,53,55,53,55,55,55,53,55,53,0,0,0,0,0,0,0,57,59,62,63,64,62,62,59,59,63,59,59,59,63,65,59,59,59,62,63,65,64,57,59,62,63,65,64,57,59,59,64,59,59,62,63,65,64,57,59,62,63,65,64,57,57,59,62,63,65,64,57,62,64,63,64,57,59,63,65,57,59,62,63,65,64,57,57,64,59,62,63,65,65,64,64,64,57,59,59,59,57,62,62,62,59,59,59,59,59,62,63,65,64,57,63,64,62,62,59,62,65,62,62,62,62,62,62,62,62,62,62,0,62,62,62,62,62,62,62,63,64,57,59,62,62,62,62,59,62,63,65,64,57,57,57,57,57,59,62,63,65,64,57,59,62,63,65,64,57,59,62,59,62,63,65,64,57,62,57,62,65,59,62,63,65,64,57,85,0,0,85,85,66,66,66,66,66,66,85,66,66,66,66,66,66,66,0,0,0,67,67,67,67,69,67,69,67,69,67,69,67,67,67,67,69,67,69,69,67,67,69,67,67,67,67,67,69,67,67,69,67,67,69,69,67,69,67,69,67,69,67,69,0,0,72,0,0,47,0,47,46,46,0,71,41,41,41,41,46,72,47,71,41,46,72,47,71,41,41,41,41,71,41,41,41,46,72,47,71,41,46,72,47,71,41,71,71,41,41,46,72,47,71,41,46,46,72,72,47,47,71,41,46,72,47,71,41,41,27,41,41,41,41,41,41,46,72,47,71,41,41,41,71,41,27,27,46,72,47,41,41,41,41,71,41,41,41,46,72,47,71,46,72,47,41,46,72,47,71,41,46,72,47,71,41,41,71,41,46,72,47,71,27,41,46,72,47,71,86,86,86,87,88,88,88,87,87,89,89,89,0,0,0,0,0,40,76,73,73,40,40,40,78,40,76,77,73,78,40,76,77,73,40,78,78,40,76,77,73,40,76,77,73,76,77,40,73,76,73,40,40,40,76,77,73,40,40,76,77,73,40,73,78,40,76,77,73,40,40,40,40,40,40,40,40,40,40,40,40,40,40,78,40,76,77,73,78,40,73,73,76,40,40,40,40,78,77,77,40,76,77,40,73,40,76,77,73,78,40,76,77,73,40,40,78,40,76,77,73,40,40,40,76,73,40,40,76,73,73,78,40,76,77,73,78,40,76,77,73,40,40],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[[3,[[0,[1,2]]]]],4],[[],5],[5,5],[[]],[[[3,[[0,[1,2]]]]]],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,[[[3,[1]]],[[3,[1]]]],[[[6,[1]]],[[6,[1]]]],[7,7],[8,8],[5,5],[[[9,[1]]],[[9,[1]]]],[[]],[[]],[[]],[[]],[[]],[[]],[6,[[6,[1]]]],[[[6,[2]],6],10],[[7,7],10],[[8,8],10],[[5,5],10],[[[9,[2]],9],10],[[],11],[[],11],[[],3],[[],7],[[],5],[[],[[12,[7]]]],[[],[[12,[8]]]],[[],[[12,[5]]]],[[],13],[[[6,[14]],6],15],[[7,7],15],[[8,8],15],[[5,5],15],[[[9,[14]],9],15],[[[3,[16]],17],18],[[[6,[16]],17],18],[[7,17],18],[[7,17],18],[[8,17],18],[[5,17],18],[[[9,[16]],17],18],[19],[[]],[[]],[[]],[[[20,[11]]],7],[[]],[[],5],[[],5],[[]],[[]],[[[6,[21]]]],[7],[8],[5],0,[7,7],[8,7],0,[[[3,[[0,[1,2]]]],22],20],[[[3,[[0,[1,2]]]],23]],[[[3,[[0,[1,2]]]],24,25]],0,[[[3,[[0,[1,2]]]],[0,[1,2]],22],15],[[]],[[]],[[]],[[]],[[]],[[]],[[5,5],[[12,[[20,[15]]]]]],[7,15],[8,15],[[[9,[[6,[26]]]],11],15],[[[9,[27]],11],15],[[[9,[[6,[26]]]],11],15],0,[[[3,[[0,[1,2]]]],23],15],[[[9,[27]],11],15],[[[3,[[0,[1,2]]]],22],15],[[[3,[[0,[1,2]]]],23],15],[[[3,[[0,[1,2]]]]],15],0,0,[[[3,[[0,[1,2]]]]],15],[7,7],[7,8],[7,7],[7,8],0,[[[3,[[0,[1,2]]]],23],28],0,[[[3,[[0,[1,2]]]],[29,[[0,[1,2]]]]],30],[[[6,[31]],6],[[20,[10]]]],[[7,7],[[20,[10]]]],[[8,8],[[20,[10]]]],[[5,5],[[20,[10]]]],[[[9,[31]],9],[[20,[10]]]],[[[3,[[0,[1,2]]]]],[[32,[[0,[1,2]]]]]],[[[3,[[0,[1,2]]]],24,25],20],[[[3,[[0,[1,2]]]],23]],[7,12],[8,12],[5,12],0,0,[[[3,[[0,[1,2]]]]],[[20,[22]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[],33],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],0,[[[3,[[0,[1,2]]]],24],20],0,[[[3,[[0,[1,2]]]]],[[0,[30,34]]]],[[[3,[[0,[1,2]]]],35],30],[[],36],[[],36],[[],36],[[],36],[[],36],[[],36],[[[3,[[0,[1,2]]]]],15],[[[3,[[0,[1,2]]]]],30],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[37,37]],[[38,37]],[[38,38],[[12,[37,39]]]],[38,40],[38,38],[38,41],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[38,41],0,[38,[[20,[42]]]],[[[38,[1]]],[[38,[1]]]],[[[37,[1]]],[[37,[1]]]],[[[43,[1]]],[[43,[1]]]],[[[44,[1]]],[[44,[1]]]],[[[39,[1]]],[[39,[1]]]],[[[45,[1]]],[[45,[1]]]],[[]],[[]],[[]],[[]],[[]],[[]],[37,15],[[],38],[[],37],[[],[[12,[37]]]],[[38,38],[[12,[37,39]]]],[[[38,[14]],38],15],[[[37,[14]],37],15],[[[43,[14]],43],15],[[[44,[14]],44],15],[[[39,[14]],39],15],[[[45,[14]],45],15],[[[38,[16]],17],18],[[[37,[16]],17],18],[[[43,[16]],17],18],[[[43,[16]],17],18],[[[44,[16]],17],18],[[[44,[16]],17],18],[[[39,[16]],17],18],[[[39,[16]],17],18],[[[45,[16]],17],18],[[[45,[16]],17],18],[[38,19]],[[37,19]],[[]],[[]],[[]],[[]],[45,44],[46,44],[45,39],[47,39],[[]],[[]],[[38,24],[[20,[9]]]],[[38,35],20],[38,40],0,[[38,41,48],[[12,[38,43]]]],[[38,5],[[12,[37,49]]]],[[38,5],[[12,[37,49]]]],[[38,23],[[12,[37,44]]]],[[38,23],[[12,[37,44]]]],[[38,24,25],37],[[38,24,25],37],[[]],[[]],[[]],[[]],[[]],[[]],[[38,11],37],[[38,11],37],[38,15],[37,15],[[41,40],[[12,[38,43]]]],[50],[50],[50],[50],[37,12],[[38,[20,[42]]]],[[38,24],20],[[]],[[]],[[]],[[]],[[]],[[]],[[],33],[[],33],[[],33],[[],33],[38,30],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[38,23],51],[[],36],[[],36],[[],36],[[],36],[[],36],[[],36],0,[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,[[[53,[26,52]],[53,[26,52]]]],[[]],[[[55,[26,54]],[53,[26]]]],[[[55,[26,54]],[40,[26]]],[[53,[26]]]],[[[55,[26,56]],5],57],[[]],[[]],[[]],[[]],[[[53,[1,1]]],[[53,[1,1]]]],[[]],[[],[[55,[58]]]],[[],[[53,[58]]]],[[],[[12,[53]]]],[[[53,[14,14]],53],15],[[[53,[16,16]],17],18],[[]],[[]],[[[55,[26,54]]],40],0,0,0,[23],[[24,25]],[[[55,[26,54]],48,[20,[13]]],[[53,[26]]]],[[[55,[26,54]],23,48,[20,[13]]],[[53,[26]]]],[[[55,[26,54]],24,25],[[53,[26]]]],[[]],[[]],[22,15],[23,15],[[[55,[26,56]],5],51],[[[55,[26,56]],5],51],[53,12],[[]],[[[55,[26,56]],5],[[12,[57]]]],[[],12],[[],12],[[],12],[[],12],[[[55,[26,56]],5],51],[[[55,[26,56]],5],51],[[],36],[[],36],[[]],[[]],0,0,0,0,0,0,0,[[57,57],57],[[59,[61,[60]]]],[[[62,[[0,[1,2,16]]]],[0,[1,2,16]],[61,[60]]]],[[[63,[2]],[63,[2]]]],[[64,64]],[[[62,[[0,[1,2,16]]]],[63,[[0,[1,2,16]]]]]],[[[62,[[0,[1,2,16]]]]]],[[59,64]],[[59,65],[[12,[64,39]]]],[63,4],[59,40],[59,38],[59,41],[63,4],[65,40],[[59,19],57],[[59,11],13],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[59,41],[59,38],0,[59,[[20,[42]]]],[[[59,[1,1]]],[[59,[1,1]]]],[[[62,[1]]],[[62,[1]]]],[[[63,[1]]],[[63,[1]]]],[[[65,[1,1]]],[[65,[1,1]]]],[[[64,[1,1]]],[[64,[1,1]]]],[57,57],[[]],[[]],[[]],[[]],[[]],[[]],0,[[],59],[[],62],[[],63],[[],65],[[],64],[[],57],[62],0,[[],[[12,[63]]]],[[],[[12,[64]]]],[[],[[12,[57]]]],[[59,65],[[12,[64,39]]]],[[[63,[14]],63],15],[[[65,[14,14]],65],15],[[57,57],15],[[[59,[16,16]],17],18],[[[62,[16]],17],18],[[[63,[16]],17],18],[[[65,[16,16]],17],18],[[[64,[16,16]],17],18],[[57,17],18],[[57,17],18],[[64,19]],[[]],[[]],[[]],[[]],[38,65],[63,64],[[]],[37,64],[[]],[59,51],[59,51],[59,40],0,[[[62,[[0,[1,2,16]]]],23]],[[[62,[[0,[1,2,16]]]],24,25]],[[[62,[[0,[1,2,16]]]]],3],[[59,5],[[12,[64,49]]]],[[59,5],[[12,[64,49]]]],[[59,23],[[12,[64,44]]]],[[59,23],[[12,[64,44]]]],[[]],[[]],[[]],[[]],[[]],[[]],[63,15],[64,15],[[[62,[[0,[1,2,16]]]],22],15],[[[62,[[0,[1,2,16]]]],23],15],[59,4],[[[62,[[0,[1,2,16]]]]],4],0,[[[62,[[0,[1,2,16]]]]],[[20,[11]]]],[[[62,[[0,[1,2,16]]]]],4],[[[62,[[0,[1,2,16]]]]],[[20,[11]]]],[[[62,[[0,[1,2,16]]]]],[[4,[[0,[1,2,16]],11]]]],[[[62,[[0,[1,2,16]]]],11]],[[[62,[[0,[1,2,16]]]],[4,[[0,[1,2,16]],11]]]],[[[62,[[0,[1,2,16]]]]],4],[[[62,[[0,[1,2,16]]]],11],15],[[[62,[[0,[1,2,16]]]]]],[[[62,[[0,[1,2,16]]]]]],0,[[[62,[[0,[1,2,16]]]]]],[[[62,[[0,[1,2,16]]]],11]],[[[62,[[0,[1,2,16]]]],4]],[[[62,[[0,[1,2,16]]]]],[[4,[[0,[1,2,16]],[0,[51,1]]]]]],[[[62,[[0,[1,2,16]]]]],[[0,[30,1]]]],[[[62,[[0,[1,2,16]]]]],[[63,[[0,[1,2,16]]]]]],[[[62,[[0,[1,2,16]]]],24,25],[[63,[[0,[1,2,16]]]]]],[63,12],[64,12],[57,12],[[59,[20,[42]]]],[[[62,[[0,[1,2,16]]]],11]],[[[62,[[0,[1,2,16]]]],11]],[[[62,[[0,[1,2,16]]]]],[[4,[[0,[1,2,16]],[0,[51,1]]]]]],[[[62,[[0,[1,2,16]]]]],[[0,[51,1]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[],33],[57,13],0,[57,13],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],0,[[[62,[[0,[1,2,16]]]]],30],[[],36],[[],36],[[],36],[[],36],[[],36],[[],36],[[[62,[[0,[1,2,16]]]],11],15],0,[[[62,[[0,[1,2,16]]]]],30],0,[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,[64,12],[[]],[[]],[66,12],[[[66,[16,16,16]],17],18],[[]],[[]],[59,12],[[],66],[[66,64]],[66,64],[[],12],[[],12],[[],36],[[]],0,0,0,[[67,68]],[[67,67],[[12,[68,69]]]],[67,4],[[]],[[]],[[]],[[]],[67,67],[69,69],[[]],[[]],[[67,67],10],[[],67],[[67,67],[[12,[68,69]]]],[[67,67],15],[[69,69],15],[[67,17],18],[[69,17],18],[[69,17],18],[[[4,[11,70]]],67],[[]],[[]],[[],67],[[67,11],[[20,[5]]]],[67,[[32,[11]]]],[67,68],[[]],[[]],[[67,5,5],[[12,[[20,[15]]]]]],[[67,67],[[20,[10]]]],[50],[67,[[20,[5]]]],[[]],[[]],[[],33],[[],12],[[],12],[[],12],[[],12],[[],36],[[],36],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,[[71,71]],[[[41,[27]],[71,[27]]]],[[[41,[27]],[41,[27]]],[[12,[[71,[27]],[47,[27]]]]]],[41,41],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[[41,[27]],71],51],[[[41,[27]],11],[[20,[5]]]],[[[41,[27]]],[[20,[42]]]],[[[41,[27]]],4],0,[[[41,[27]]],[[71,[27]]]],[[[41,[27]]],[[71,[27]]]],[[[41,[1]]],[[41,[1]]]],[[[46,[1]]],[[46,[1]]]],[72,72],[[[47,[1]]],[[47,[1]]]],[[[71,[1]]],[[71,[1]]]],[[]],[[]],[[]],[[]],[[]],[[],41],[[],71],[[],[[12,[71]]]],[[[41,[27]],[41,[27]]],[[12,[[71,[27]],[47,[27]]]]]],[[[41,[14]],41],15],[[[46,[14]],46],15],[[72,72],15],[[[47,[14]],47],15],[[[71,[14]],71],15],[[[41,[16]],17],18],[[[46,[16]],17],18],[[[46,[16]],17],18],[[72,17],18],[[72,17],18],[[[47,[16]],17],18],[[[47,[16]],17],18],[[[71,[16]],17],18],[[]],[[]],[[]],[[]],[[]],[[],[[41,[27]]]],[[[41,[27]],40,24],[[20,[[9,[27]]]]]],[[],7],[[[41,[27]]],[[71,[27]]]],[[[41,[27]],5],[[12,[[71,[27]],72]]]],[[[41,[27]],5],[[12,[[71,[27]],72]]]],[[[41,[27]],35,27],[[12,[[71,[27]],[46,[27]]]]]],[[[41,[27]],35,27],[[12,[[71,[27]],[46,[27]]]]]],[[]],[[]],[[]],[[]],[[]],[[[41,[27]],11],[[71,[27]]]],[[[41,[27]],11],[[71,[27]]]],[[[41,[27]]],15],[71,15],[[[41,[27]]],[[20,[5]]]],[7],[7],[50],[50],[50],[[[41,[27]],[29,[11]]],30],[[[41,[27]]],30],[[[41,[27]]],30],[[[41,[27]]],30],[71,12],[[[41,[27]],[20,[42]]]],[[[41,[27]],40,24],20],[[]],[[]],[[]],[[]],[[]],[[],33],[[],33],[[],33],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[[41,[27]],35],20],[[[41,[27]]],[[0,[30,34]]]],0,[[],36],[[],36],[[],36],[[],36],[[],36],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[40,51],0,0,[[[73,[2]],[73,[2]]]],[[[40,[[0,[1,2]]]],[73,[[0,[1,2]]]]]],[[[40,[[0,[1,2]]]],[40,[[0,[1,2]]]]],[[73,[[0,[1,2]]]]]],[40,40],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[40,23],[[20,[28]]]],[[],[[20,[74]]]],[[],[[20,[75]]]],[[[40,[1]]],[[40,[1]]]],[[[76,[1,1]]],[[76,[1,1]]]],[[[77,[1,1]]],[[77,[1,1]]]],[[[73,[1]]],[[73,[1]]]],[[]],[[]],[[]],[[]],[[[76,[2,2]],76],10],[[[77,[2,2]],77],10],[[],40],[[],73],[76],[[],[[12,[73]]]],[[[40,[[0,[1,2]]]],40],[[73,[[0,[1,2]]]]]],[[40,23],51],[[[40,[14]],40],15],[[[76,[14,14]],76],15],[[[77,[14,14]],77],15],[[[73,[14]],73],15],[40,51],[[[40,[16]],17],18],[[[76,[16,16]],17],18],[[[77,[16,16]],17],18],[[[73,[16]],17],18],[[40,19]],[[73,19]],[[]],[[]],[[]],[[]],[[]],[40,51],[[[40,[26]],5,35],[[20,[6]]]],[[[40,[26]],5,24],20],[[40,35],[[20,[23]]]],[[40,35],[[20,[[76,[23]]]]]],[[40,24],[[20,[25]]]],[[[40,[[0,[1,2]]]],35,[0,[1,2]]],[[73,[[0,[1,2]]]]]],[[[40,[[0,[1,2]]]],35,[0,[1,2]]],[[73,[[0,[1,2]]]]]],[[[40,[[0,[1,2]]]],35,13],[[73,[[0,[1,2]]]]]],[[[40,[[0,[1,2]]]],35,13],[[73,[[0,[1,2]]]]]],[[[40,[[0,[1,2]]]],23],[[73,[[0,[1,2]]]]]],[[[40,[[0,[1,2]]]],23],[[73,[[0,[1,2]]]]]],[[[40,[[0,[1,2]]]],24,25],[[73,[[0,[1,2]]]]]],[[[40,[[0,[1,2]]]],24,25],[[73,[[0,[1,2]]]]]],[[]],[[]],[[]],[[]],[[]],[[]],[40,15],[73,15],0,0,[[[40,[26]],5],51],[[[40,[26]],5],51],[[[40,[26]],5],51],[48,[[40,[[0,[1,2]]]]]],[78,20],0,0,[[40,24],79],[[[76,[31,31]],76],[[20,[10]]]],[[[77,[31,31]],77],[[20,[10]]]],[[[40,[26]]],51],[73,12],[[]],[[]],[[]],[[]],[[],12],[[],12],[[],12],[[],12],[[],12],[[[40,[26]],5,35],[[12,[[20,[6]]]]]],[[[40,[26]],5,24],[[12,[20]]]],[[],12],[[],12],[[],12],[[],12],[[],12],[[[40,[26]],5],51],[[[40,[26]],5],51],[[[40,[26]],5],51],0,0,[[40,35],[[20,[[4,[11,25]]]]]],[[40,35],30],0,0,[73,51],[[],36],[[],36],[[],36],[[],36],[[],36],[[]],[[]],[[]],[[]],[[]],[[40,23],78],[[40,35],78]],"p":[[8,"Clone"],[8,"Ord"],[3,"SpkTxOutIndex"],[3,"BTreeMap"],[3,"BlockId"],[4,"ObservedAs"],[4,"TxHeight"],[4,"ConfirmationTime"],[3,"FullTxOut"],[4,"Ordering"],[15,"u32"],[4,"Result"],[15,"u64"],[8,"PartialEq"],[15,"bool"],[8,"Debug"],[3,"Formatter"],[6,"Result"],[8,"FnMut"],[4,"Option"],[8,"Hash"],[3,"Script"],[3,"Transaction"],[3,"OutPoint"],[3,"TxOut"],[8,"Anchor"],[8,"ChainPosition"],[15,"i64"],[8,"RangeBounds"],[8,"DoubleEndedIterator"],[8,"PartialOrd"],[3,"BTreeSet"],[3,"String"],[8,"ExactSizeIterator"],[3,"Txid"],[3,"TypeId"],[3,"ChangeSet"],[3,"ChainGraph"],[4,"UpdateError"],[3,"TxGraph"],[3,"SparseChain"],[15,"usize"],[4,"NewError"],[4,"InsertTxError"],[3,"UnresolvableConflict"],[4,"InsertTxError"],[4,"UpdateError"],[8,"IntoIterator"],[6,"InsertCheckpointError"],[3,"Demand"],[8,"Iterator"],[8,"Append"],[3,"IndexedAdditions"],[8,"Indexer"],[3,"IndexedTxGraph"],[8,"OwnedIndexer"],[3,"Balance"],[8,"Default"],[3,"KeychainTracker"],[4,"DescriptorPublicKey"],[4,"Descriptor"],[3,"KeychainTxOutIndex"],[3,"DerivationAdditions"],[3,"KeychainChangeSet"],[3,"KeychainScan"],[3,"Persist"],[3,"LocalChain"],[6,"ChangeSet"],[3,"UpdateNotConnectedError"],[3,"BlockHash"],[3,"ChangeSet"],[4,"InsertCheckpointError"],[3,"Additions"],[3,"Amount"],[3,"SignedAmount"],[3,"TxNode"],[3,"CanonicalTx"],[3,"TxDescendants"],[3,"HashSet"],[8,"ChainOracle"],[8,"DescriptorExt"],[8,"ForEachTxOut"],[13,"Confirmed"],[13,"Conflict"],[8,"PersistBackend"],[13,"HashNotMatching"],[13,"TxMovedUnexpectedly"],[13,"TxTooHigh"],[13,"TxInconsistent"]]},\
"bdk_coin_select":{"doc":"","t":[3,3,4,4,3,3,13,6,13,3,4,13,13,13,3,4,3,13,13,17,13,13,13,13,13,3,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,11,11,11,12,11,12,11,11,11,11,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,12,12,12,12,11,11,11,11,12,11,12,12,11,12,12,12,11,11,11,11,12,11,11,11,11,11,11,12,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,11],"n":["Bnb","BnbIter","BnbLimit","BranchStrategy","CoinSelector","CoinSelectorOpt","Continue","DecideStrategy","Duration","ExcessStrategy","ExcessStrategyKind","MinAbsoluteFee","MinDrainValue","Rounds","Selection","SelectionConstraint","SelectionError","SkipBoth","SkipInclusion","TXIN_BASE_WEIGHT","TargetFee","TargetValue","ToDrain","ToFee","ToRecipient","WeightedValue","advertise_new_score","all_selected","apply_selection","backtrack","base_weight","best_score","best_strategy","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","candidate","candidates","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","coin_select_bnb","current_excess","current_weight","deselect","drain_value","drain_waste","drain_weight","effective_target","effective_value","eq","eq","excess","excess_strategies","fee","feerate","finish","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","forward","from","from","from","from","from","from","from","from","from","from","from","from","from","from","fund_outputs","hash","input_count","into","into","into","into","into","into","into","into","into","into","into","into","into_iter","into_iter","is_empty","is_segwit","is_selected","long_term_feerate","long_term_feerate","max_extra_target","min_absolute_fee","min_drain_value","new","new","new","next","opts","partial_cmp","pool","pool_pos","provide","recipient_value","rem_abs","rem_eff","select","select_all","select_until_finished","selected","selected","selected_absolute_value","selected_count","selected_effective_value","selected_indexes","selected_waste","selected_weight","selection","spend_drain_weight","target_feerate","target_value","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","unselected","unselected_indexes","value","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","waste","weight","weight","will_continue"],"q":["bdk_coin_select","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"d":["Bnb represents the current state of the BnB algorithm.","","Determines how we should limit rounds of branch and bound.","Strategy in which we should branch.","CoinSelector selects and deselects from a set of â¦","","We continue exploring subtrees of this node, starting with â¦","Closure to decide the branching strategy, alongside a â¦","","","","Min absolute fee is not met","Min drain value is not met","","","","","We skip both the inclusion and omission branches of this â¦","We continue exploring ONLY the omission branch of this â¦","Txin âbaseâ fields include outpoint (32+4) and â¦","The target fee (given the feerate) is not met","The target is not met","","","","A WeightedValue represents an input candidate for â¦","Compare the advertised score with the current best. The â¦","","","Attempt to backtrack to the previously selected nodeâs â¦","The weight of the template transaction, including fixed â¦","","Returns the ExcessStrategy that results in the least waste.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","This is a variation of the Branch and Bound Coin Selection â¦","Current excess.","Current weight of template tx + selected inputs.","","","","Additional weight if we include the drain (change) output.","This is the effective target value.","Effective value of this input candidate: â¦","","","","","","Returns feerate in sats/wu.","","","","","","","","","","","","","Continue down this branch and skip the inclusion branch if â¦","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","The total number of inputs; so we can calculate extra â¦","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Turns our Bnb state into an iterator.","","","Whether this WeightedValue contains at least one segwit â¦","","","The feerate","Additional leeway for the target value.","The minimum absolute fee. I.e., needed for RBF.","Minimum value allowed for a drain (change) output.","Creates a new Bnb.","Create a new WeightedValue that represents a single input.","","","","","","","","","","","","","","","","Absolute value sum of all selected inputs.","","Effective value sum of all selected inputs.","","Waste sum of all selected inputs.","Weight sum of all selected inputs.","","Weight of spending the drain (change) output in the future.","The feerate we should try and achieve in sats per weight â¦","The value we need to select. If the value is None, then â¦","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Total value of the UTXO(s) that this WeightedValue â¦","","","","","","","","","","","","","","Total weight of including this/these UTXO(s). txin fields: â¦","",""],"i":[0,0,0,0,0,0,34,0,22,0,0,11,11,22,0,0,0,34,34,0,11,11,12,12,12,0,2,4,5,2,9,2,5,34,2,26,22,8,9,4,10,11,5,12,13,34,2,26,22,8,9,4,10,11,5,12,13,4,4,8,9,4,10,11,5,12,13,8,9,4,10,11,5,12,13,12,0,4,4,4,13,9,9,4,8,11,12,5,5,13,13,4,8,9,4,10,10,11,11,5,12,12,13,2,34,2,26,22,22,22,8,9,4,10,11,5,12,13,9,12,8,34,2,26,22,8,9,4,10,11,5,12,13,2,26,4,8,4,9,9,9,9,9,2,8,4,26,4,12,2,2,10,13,2,2,4,4,4,4,5,4,4,4,4,4,4,2,9,9,9,8,9,4,10,11,5,12,13,10,11,12,34,2,26,22,8,9,4,10,11,5,12,13,34,2,26,22,8,9,4,10,11,5,12,13,34,2,26,22,8,9,4,10,11,5,12,13,4,4,8,34,2,26,22,8,9,4,10,11,5,12,13,13,8,13,34],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[[2,[1]],1],3],[4,3],[5,6],[[[2,[1]]],3],0,0,[5],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[4,7],8],0,[8,8],[9,9],[4,4],[10,10],[11,11],[5,5],[12,12],[13,13],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[12,12],14],[4,[[15,[4]]]],[4,16],[4,17],[[4,7],3],0,[9,16],0,[4,16],[[8,18],16],[[11,11],3],[[12,12],3],0,0,0,[13,18],[4,[[19,[5,10]]]],[[8,20],21],[[9,20],21],[[4,20],21],[[10,20],21],[[10,20],21],[[11,20],21],[[11,20],21],[[5,20],21],[[12,20],21],[[12,20],21],[[13,20],21],[[[2,[1]],3]],[[]],[[]],[[]],[[]],[7,22],[23,22],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[24,17],9],[12],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[[2,[1]],25],[[26,[1]]]],[[]],[4,3],0,[[4,7],3],[9,18],0,0,0,0,[[4,27,1],[[2,[1]]]],[[28,17,3],8],[[27,9],4],[[[26,[[0,[1,29,30]]]]],15],0,[[12,12],[[15,[14]]]],0,0,[31],0,0,0,[[4,7],3],[4],[4,[[19,[5,10]]]],[4,6],0,[4,28],[4,7],[4,16],[4,6],[4,16],[4,17],0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],32],[[],32],[[],32],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],33],[[],33],[[],33],[[],33],[[],33],[[],33],[[],33],[[],33],[[],33],[[],33],[[],33],[[],33],[4,6],[4,6],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,[34,3]],"p":[[8,"Ord"],[3,"Bnb"],[15,"bool"],[3,"CoinSelector"],[3,"Selection"],[8,"Iterator"],[15,"usize"],[3,"WeightedValue"],[3,"CoinSelectorOpt"],[3,"SelectionError"],[4,"SelectionConstraint"],[4,"ExcessStrategyKind"],[3,"ExcessStrategy"],[4,"Ordering"],[4,"Option"],[15,"i64"],[15,"u32"],[15,"f32"],[4,"Result"],[3,"Formatter"],[6,"Result"],[4,"BnbLimit"],[3,"Duration"],[3,"TxOut"],[6,"DecideStrategy"],[3,"BnbIter"],[3,"Vec"],[15,"u64"],[8,"Copy"],[8,"Display"],[3,"Demand"],[3,"String"],[3,"TypeId"],[4,"BranchStrategy"]]},\
"bdk_electrum":{"doc":"This crate is used for updating structures of the bdk_chainâ¦","t":[8,3,11,2,11,11,12,11,2,11,10,11,11,11,12,11,10,11,11,11,11,11],"n":["ElectrumExt","ElectrumUpdate","as_ref","bdk_chain","borrow","borrow_mut","chain_update","default","electrum_client","from","get_tip","into","into_confirmation_time_update","into_keychain_scan","last_active_indices","missing_full_txs","scan","scan_without_keychain","try_from","try_into","type_id","vzip"],"q":["bdk_electrum","","","","","","","","","","","","","","","","","","","","",""],"d":["Trait to extend electrum_client::Client functionality.","The result of ElectrumExt::scan.","","","","","The internal SparseChain update.","","","Returns the argument unchanged.","Fetch the latest block height.","Calls U::from(self).","Creates ElectrumUpdate<K, ConfirmationTime> from â¦","Transform the ElectrumUpdate into a KeychainScan, which â¦","The last keychain script pubkey indices, which had â¦","Return a list of missing full transactions that are â¦","Scan the blockchain (via electrum) for the data specified. â¦","Convenience method to call scan without requiring a â¦","","","",""],"i":[0,0,1,0,1,1,1,1,0,1,21,1,1,1,1,1,21,21,1,1,1,1],"f":[0,0,[1,2],0,[[]],[[]],0,[[],1],0,[[]],[[],[[4,[3]]]],[[]],[[[1,[[0,[5,6,7]],8]],9],[[4,[[1,[[0,[5,6,7]],10]],3]]]],[[[1,[[0,[5,6,7]],11]],[13,[12]]],[[4,[[14,[[0,[5,6,7]],11]],[15,[11]]]]]],0,[[[1,[[0,[5,6,7]],11]]],[[13,[16]]]],[[17,[17,[[0,[5,6]],18]],18,18,19,19],[[4,[[1,[[0,[5,6]],8]],3]]]],[[17,18,18,18,19],[[4,[2,3]]]],[[],4],[[],4],[[],20],[[]]],"p":[[3,"ElectrumUpdate"],[3,"SparseChain"],[4,"Error"],[4,"Result"],[8,"Ord"],[8,"Clone"],[8,"Debug"],[4,"TxHeight"],[3,"Client"],[4,"ConfirmationTime"],[8,"ChainPosition"],[3,"Transaction"],[3,"Vec"],[3,"KeychainScan"],[4,"NewError"],[3,"Txid"],[3,"BTreeMap"],[8,"IntoIterator"],[15,"usize"],[3,"TypeId"],[8,"ElectrumExt"]]},\
"bdk_esplora":{"doc":"BDK Esplora","t":[8,8,2,10,10,11,11,11,11],"n":["EsploraAsyncExt","EsploraExt","esplora_client","scan","scan","scan_without_keychain","scan_without_keychain","scan_without_keychain","scan_without_keychain"],"q":["bdk_esplora","","","","","","","",""],"d":["Trait to extend esplora_client::AsyncClient functionality.","Trait to extend esplora_client::BlockingClient â¦","","Scan the blockchain (via esplora) for the data specified â¦","Scan the blockchain (via esplora) for the data specified â¦","Convenience method to call scan without requiring a â¦","Convenience method to call scan without requiring a â¦","Convenience method to call scan without requiring a â¦","Convenience method to call scan without requiring a â¦"],"i":[0,0,0,15,16,15,15,16,16],"f":[0,0,0,[[1,[1,[[0,[2,3]],4]],4,4,5,5],[[9,[[7,[[0,[2,3]],6]],8]]]],[[1,[1,[[0,[4,10]]]],[0,[4,10]],[0,[4,10]],5,5],[[13,[[12,[11]]]]]],[[1,4,4,4,5],[[9,[[14,[6]],8]]]],[[1,4,4,4,5],[[9,[[14,[6]],8]]]],[[1,[0,[4,10]],[0,[4,10]],[0,[4,10]],5],[[13,[[12,[11]]]]]],[[1,[0,[4,10]],[0,[4,10]],[0,[4,10]],5],[[13,[[12,[11]]]]]]],"p":[[3,"BTreeMap"],[8,"Ord"],[8,"Clone"],[8,"IntoIterator"],[15,"usize"],[4,"ConfirmationTime"],[3,"KeychainScan"],[4,"Error"],[4,"Result"],[8,"Send"],[8,"Future"],[3,"Box"],[3,"Pin"],[3,"ChainGraph"],[8,"EsploraExt"],[8,"EsploraAsyncExt"]]},\
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/source-files.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/source-files.js
index 928ce88cc1..373ac6c7bf 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/source-files.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/source-files.js
@@ -1,6 +1,6 @@
var sourcesIndex = JSON.parse('{\
"bdk":["",[["descriptor",[],["checksum.rs","dsl.rs","error.rs","mod.rs","policy.rs","template.rs"]],["keys",[],["mod.rs"]],["psbt",[],["mod.rs"]],["wallet",[],["coin_selection.rs","export.rs","mod.rs","signer.rs","tx_builder.rs","utils.rs"]]],["error.rs","lib.rs","types.rs"]],\
-"bdk_chain":["",[["keychain",[],["persist.rs","tracker.rs","txout_index.rs"]]],["chain_data.rs","chain_graph.rs","descriptor_ext.rs","example_utils.rs","keychain.rs","lib.rs","sparse_chain.rs","spk_txout_index.rs","tx_data_traits.rs","tx_graph.rs"]],\
+"bdk_chain":["",[["keychain",[],["persist.rs","tracker.rs","txout_index.rs"]]],["chain_data.rs","chain_graph.rs","chain_oracle.rs","descriptor_ext.rs","example_utils.rs","indexed_tx_graph.rs","keychain.rs","lib.rs","local_chain.rs","sparse_chain.rs","spk_txout_index.rs","tx_data_traits.rs","tx_graph.rs"]],\
"bdk_coin_select":["",[],["bnb.rs","coin_selector.rs","lib.rs"]],\
"bdk_electrum":["",[],["lib.rs"]],\
"bdk_esplora":["",[],["async_ext.rs","blocking_ext.rs","lib.rs"]],\
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_data.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_data.rs.html
index 750c7f639e..f674c33bd3 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_data.rs.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_data.rs.html
@@ -216,13 +216,124 @@
216
217
218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
use bitcoin::{hashes::Hash, BlockHash, OutPoint, TxOut, Txid};
use crate::{
sparse_chain::{self, ChainPosition},
- COINBASE_MATURITY,
+ Anchor, COINBASE_MATURITY,
};
+/// Represents an observation of some chain data.
+///
+/// The generic `A` should be a [`Anchor`] implementation.
+#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, core::hash::Hash)]
+pub enum ObservedAs<A> {
+ /// The chain data is seen as confirmed, and in anchored by `A`.
+ Confirmed(A),
+ /// The chain data is seen in mempool at this given timestamp.
+ Unconfirmed(u64),
+}
+
+impl<A: Clone> ObservedAs<&A> {
+ pub fn cloned(self) -> ObservedAs<A> {
+ match self {
+ ObservedAs::Confirmed(a) => ObservedAs::Confirmed(a.clone()),
+ ObservedAs::Unconfirmed(last_seen) => ObservedAs::Unconfirmed(last_seen),
+ }
+ }
+}
+
/// Represents the height at which a transaction is confirmed.
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(
@@ -336,7 +447,7 @@
}
/// A reference to a block in the canonical chain.
-#[derive(Debug, Clone, PartialEq, Eq, Copy, PartialOrd, Ord)]
+#[derive(Debug, Clone, PartialEq, Eq, Copy, PartialOrd, Ord, core::hash::Hash)]
#[cfg_attr(
feature = "serde",
derive(serde::Deserialize, serde::Serialize),
@@ -358,6 +469,12 @@
}
}
+impl Anchor for BlockId {
+ fn anchor_block(&self) -> BlockId {
+ *self
+ }
+}
+
impl From<(u32, BlockHash)> for BlockId {
fn from((height, hash): (u32, BlockHash)) -> Self {
Self { height, hash }
@@ -380,21 +497,21 @@
}
/// A `TxOut` with as much data as we can retrieve about it
-#[derive(Debug, Clone, PartialEq)]
-pub struct FullTxOut<I> {
+#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
+pub struct FullTxOut<P> {
/// The location of the `TxOut`.
pub outpoint: OutPoint,
/// The `TxOut`.
pub txout: TxOut,
/// The position of the transaction in `outpoint` in the overall chain.
- pub chain_position: I,
+ pub chain_position: P,
/// The txid and chain position of the transaction (if any) that has spent this output.
- pub spent_by: Option<(I, Txid)>,
+ pub spent_by: Option<(P, Txid)>,
/// Whether this output is on a coinbase transaction.
pub is_on_coinbase: bool,
}
-impl<I: ChainPosition> FullTxOut<I> {
+impl<P: ChainPosition> FullTxOut<P> {
/// Whether the utxo is/was/will be spendable at `height`.
///
/// It is spendable if it is not an immature coinbase output and no spending tx has been
@@ -433,6 +550,71 @@
}
}
-// TODO: make test
-
+impl<A: Anchor> FullTxOut<ObservedAs<A>> {
+ /// Whether the `txout` is considered mature.
+ ///
+ /// This is the alternative version of [`is_mature`] which depends on `chain_position` being a
+ /// [`ObservedAs<A>`] where `A` implements [`Anchor`].
+ ///
+ /// Depending on the implementation of [`confirmation_height_upper_bound`] in [`Anchor`], this
+ /// method may return false-negatives. In other words, interpretted confirmation count may be
+ /// less than the actual value.
+ ///
+ /// [`is_mature`]: Self::is_mature
+ /// [`confirmation_height_upper_bound`]: Anchor::confirmation_height_upper_bound
+ pub fn is_mature(&self, tip: u32) -> bool {
+ if self.is_on_coinbase {
+ let tx_height = match &self.chain_position {
+ ObservedAs::Confirmed(anchor) => anchor.confirmation_height_upper_bound(),
+ ObservedAs::Unconfirmed(_) => {
+ debug_assert!(false, "coinbase tx can never be unconfirmed");
+ return false;
+ }
+ };
+ let age = tip.saturating_sub(tx_height);
+ if age + 1 < COINBASE_MATURITY {
+ return false;
+ }
+ }
+
+ true
+ }
+
+ /// Whether the utxo is/was/will be spendable with chain `tip`.
+ ///
+ /// This method does not take into account the locktime.
+ ///
+ /// This is the alternative version of [`is_spendable_at`] which depends on `chain_position`
+ /// being a [`ObservedAs<A>`] where `A` implements [`Anchor`].
+ ///
+ /// Depending on the implementation of [`confirmation_height_upper_bound`] in [`Anchor`], this
+ /// method may return false-negatives. In other words, interpretted confirmation count may be
+ /// less than the actual value.
+ ///
+ /// [`is_spendable_at`]: Self::is_spendable_at
+ /// [`confirmation_height_upper_bound`]: Anchor::confirmation_height_upper_bound
+ pub fn is_confirmed_and_spendable(&self, tip: u32) -> bool {
+ if !self.is_mature(tip) {
+ return false;
+ }
+
+ let confirmation_height = match &self.chain_position {
+ ObservedAs::Confirmed(anchor) => anchor.confirmation_height_upper_bound(),
+ ObservedAs::Unconfirmed(_) => return false,
+ };
+ if confirmation_height > tip {
+ return false;
+ }
+
+ // if the spending tx is confirmed within tip height, the txout is no longer spendable
+ if let Some((ObservedAs::Confirmed(spending_anchor), _)) = &self.spent_by {
+ if spending_anchor.anchor_block().height <= tip {
+ return false;
+ }
+ }
+
+ true
+ }
+}
+
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_graph.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_graph.rs.html
index e1facdd822..43bab99631 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_graph.rs.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_graph.rs.html
@@ -642,7 +642,7 @@
collections::HashSet,
sparse_chain::{self, ChainPosition, SparseChain},
tx_graph::{self, TxGraph},
- BlockId, ForEachTxOut, FullTxOut, TxHeight,
+ Append, BlockId, ForEachTxOut, FullTxOut, TxHeight,
};
use alloc::{string::ToString, vec::Vec};
use bitcoin::{OutPoint, Transaction, TxOut, Txid};
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_oracle.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_oracle.rs.html
new file mode 100644
index 0000000000..29415f95a8
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_oracle.rs.html
@@ -0,0 +1,44 @@
+chain_oracle.rs - source 1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+
use crate::BlockId;
+
+/// Represents a service that tracks the blockchain.
+///
+/// The main method is [`is_block_in_chain`] which determines whether a given block of [`BlockId`]
+/// is an ancestor of another "static block".
+///
+/// [`is_block_in_chain`]: Self::is_block_in_chain
+pub trait ChainOracle {
+ /// Error type.
+ type Error: core::fmt::Debug;
+
+ /// Determines whether `block` of [`BlockId`] exists as an ancestor of `static_block`.
+ ///
+ /// If `None` is returned, it means the implementation cannot determine whether `block` exists.
+ fn is_block_in_chain(
+ &self,
+ block: BlockId,
+ static_block: BlockId,
+ ) -> Result<Option<bool>, Self::Error>;
+}
+
+
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/indexed_tx_graph.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/indexed_tx_graph.rs.html
new file mode 100644
index 0000000000..2fe6bdc00d
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/indexed_tx_graph.rs.html
@@ -0,0 +1,652 @@
+indexed_tx_graph.rs - source 1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+
use core::convert::Infallible;
+
+use alloc::vec::Vec;
+use bitcoin::{OutPoint, Script, Transaction, TxOut};
+
+use crate::{
+ keychain::Balance,
+ tx_graph::{Additions, TxGraph},
+ Anchor, Append, BlockId, ChainOracle, FullTxOut, ObservedAs,
+};
+
+/// A struct that combines [`TxGraph`] and an [`Indexer`] implementation.
+///
+/// This structure ensures that [`TxGraph`] and [`Indexer`] are updated atomically.
+pub struct IndexedTxGraph<A, I> {
+ /// Transaction index.
+ pub index: I,
+ graph: TxGraph<A>,
+}
+
+impl<A, I: Default> Default for IndexedTxGraph<A, I> {
+ fn default() -> Self {
+ Self {
+ graph: Default::default(),
+ index: Default::default(),
+ }
+ }
+}
+
+impl<A: Anchor, I: Indexer> IndexedTxGraph<A, I> {
+ /// Get a reference of the internal transaction graph.
+ pub fn graph(&self) -> &TxGraph<A> {
+ &self.graph
+ }
+
+ /// Applies the [`IndexedAdditions`] to the [`IndexedTxGraph`].
+ pub fn apply_additions(&mut self, additions: IndexedAdditions<A, I::Additions>) {
+ let IndexedAdditions {
+ graph_additions,
+ index_additions,
+ } = additions;
+
+ self.index.apply_additions(index_additions);
+
+ for tx in &graph_additions.tx {
+ self.index.index_tx(tx);
+ }
+ for (&outpoint, txout) in &graph_additions.txout {
+ self.index.index_txout(outpoint, txout);
+ }
+
+ self.graph.apply_additions(graph_additions);
+ }
+}
+
+impl<A: Anchor, I: Indexer> IndexedTxGraph<A, I>
+where
+ I::Additions: Default + Append,
+{
+ /// Apply an `update` directly.
+ ///
+ /// `update` is a [`TxGraph<A>`] and the resultant changes is returned as [`IndexedAdditions`].
+ pub fn apply_update(&mut self, update: TxGraph<A>) -> IndexedAdditions<A, I::Additions> {
+ let graph_additions = self.graph.apply_update(update);
+
+ let mut index_additions = I::Additions::default();
+ for added_tx in &graph_additions.tx {
+ index_additions.append(self.index.index_tx(added_tx));
+ }
+ for (&added_outpoint, added_txout) in &graph_additions.txout {
+ index_additions.append(self.index.index_txout(added_outpoint, added_txout));
+ }
+
+ IndexedAdditions {
+ graph_additions,
+ index_additions,
+ }
+ }
+
+ /// Insert a floating `txout` of given `outpoint`.
+ pub fn insert_txout(
+ &mut self,
+ outpoint: OutPoint,
+ txout: &TxOut,
+ ) -> IndexedAdditions<A, I::Additions> {
+ let mut update = TxGraph::<A>::default();
+ let _ = update.insert_txout(outpoint, txout.clone());
+ self.apply_update(update)
+ }
+
+ /// Insert and index a transaction into the graph.
+ ///
+ /// `anchors` can be provided to anchor the transaction to various blocks. `seen_at` is a
+ /// unix timestamp of when the transaction is last seen.
+ pub fn insert_tx(
+ &mut self,
+ tx: &Transaction,
+ anchors: impl IntoIterator<Item = A>,
+ seen_at: Option<u64>,
+ ) -> IndexedAdditions<A, I::Additions> {
+ let txid = tx.txid();
+
+ let mut update = TxGraph::<A>::default();
+ if self.graph.get_tx(txid).is_none() {
+ let _ = update.insert_tx(tx.clone());
+ }
+ for anchor in anchors.into_iter() {
+ let _ = update.insert_anchor(txid, anchor);
+ }
+ if let Some(seen_at) = seen_at {
+ let _ = update.insert_seen_at(txid, seen_at);
+ }
+
+ self.apply_update(update)
+ }
+
+ /// Insert relevant transactions from the given `txs` iterator.
+ ///
+ /// Relevancy is determined by the [`Indexer::is_tx_relevant`] implementation of `I`. Irrelevant
+ /// transactions in `txs` will be ignored. `txs` do not need to be in topological order.
+ ///
+ /// `anchors` can be provided to anchor the transactions to blocks. `seen_at` is a unix
+ /// timestamp of when the transactions are last seen.
+ pub fn insert_relevant_txs<'t>(
+ &mut self,
+ txs: impl IntoIterator<Item = (&'t Transaction, impl IntoIterator<Item = A>)>,
+ seen_at: Option<u64>,
+ ) -> IndexedAdditions<A, I::Additions> {
+ // The algorithm below allows for non-topologically ordered transactions by using two loops.
+ // This is achieved by:
+ // 1. insert all txs into the index. If they are irrelevant then that's fine it will just
+ // not store anything about them.
+ // 2. decide whether to insert them into the graph depending on whether `is_tx_relevant`
+ // returns true or not. (in a second loop).
+ let mut additions = IndexedAdditions::<A, I::Additions>::default();
+ let mut transactions = Vec::new();
+ for (tx, anchors) in txs.into_iter() {
+ additions.index_additions.append(self.index.index_tx(tx));
+ transactions.push((tx, anchors));
+ }
+ additions.append(
+ transactions
+ .into_iter()
+ .filter_map(|(tx, anchors)| match self.index.is_tx_relevant(tx) {
+ true => Some(self.insert_tx(tx, anchors, seen_at)),
+ false => None,
+ })
+ .fold(Default::default(), |mut acc, other| {
+ acc.append(other);
+ acc
+ }),
+ );
+ additions
+ }
+}
+
+impl<A: Anchor, I: OwnedIndexer> IndexedTxGraph<A, I> {
+ pub fn try_list_owned_txouts<'a, C: ChainOracle + 'a>(
+ &'a self,
+ chain: &'a C,
+ chain_tip: BlockId,
+ ) -> impl Iterator<Item = Result<FullTxOut<ObservedAs<A>>, C::Error>> + 'a {
+ self.graph()
+ .try_list_chain_txouts(chain, chain_tip)
+ .filter(|r| {
+ if let Ok(full_txout) = r {
+ if !self.index.is_spk_owned(&full_txout.txout.script_pubkey) {
+ return false;
+ }
+ }
+ true
+ })
+ }
+
+ pub fn list_owned_txouts<'a, C: ChainOracle<Error = Infallible> + 'a>(
+ &'a self,
+ chain: &'a C,
+ chain_tip: BlockId,
+ ) -> impl Iterator<Item = FullTxOut<ObservedAs<A>>> + 'a {
+ self.try_list_owned_txouts(chain, chain_tip)
+ .map(|r| r.expect("oracle is infallible"))
+ }
+
+ pub fn try_list_owned_unspents<'a, C: ChainOracle + 'a>(
+ &'a self,
+ chain: &'a C,
+ chain_tip: BlockId,
+ ) -> impl Iterator<Item = Result<FullTxOut<ObservedAs<A>>, C::Error>> + 'a {
+ self.graph()
+ .try_list_chain_unspents(chain, chain_tip)
+ .filter(|r| {
+ if let Ok(full_txout) = r {
+ if !self.index.is_spk_owned(&full_txout.txout.script_pubkey) {
+ return false;
+ }
+ }
+ true
+ })
+ }
+
+ pub fn list_owned_unspents<'a, C: ChainOracle<Error = Infallible> + 'a>(
+ &'a self,
+ chain: &'a C,
+ chain_tip: BlockId,
+ ) -> impl Iterator<Item = FullTxOut<ObservedAs<A>>> + 'a {
+ self.try_list_owned_unspents(chain, chain_tip)
+ .map(|r| r.expect("oracle is infallible"))
+ }
+
+ pub fn try_balance<C, F>(
+ &self,
+ chain: &C,
+ chain_tip: BlockId,
+ mut should_trust: F,
+ ) -> Result<Balance, C::Error>
+ where
+ C: ChainOracle,
+ F: FnMut(&Script) -> bool,
+ {
+ let tip_height = chain_tip.anchor_block().height;
+
+ let mut immature = 0;
+ let mut trusted_pending = 0;
+ let mut untrusted_pending = 0;
+ let mut confirmed = 0;
+
+ for res in self.try_list_owned_unspents(chain, chain_tip) {
+ let txout = res?;
+
+ match &txout.chain_position {
+ ObservedAs::Confirmed(_) => {
+ if txout.is_confirmed_and_spendable(tip_height) {
+ confirmed += txout.txout.value;
+ } else if !txout.is_mature(tip_height) {
+ immature += txout.txout.value;
+ }
+ }
+ ObservedAs::Unconfirmed(_) => {
+ if should_trust(&txout.txout.script_pubkey) {
+ trusted_pending += txout.txout.value;
+ } else {
+ untrusted_pending += txout.txout.value;
+ }
+ }
+ }
+ }
+
+ Ok(Balance {
+ immature,
+ trusted_pending,
+ untrusted_pending,
+ confirmed,
+ })
+ }
+
+ pub fn balance<C, F>(&self, chain: &C, chain_tip: BlockId, should_trust: F) -> Balance
+ where
+ C: ChainOracle<Error = Infallible>,
+ F: FnMut(&Script) -> bool,
+ {
+ self.try_balance(chain, chain_tip, should_trust)
+ .expect("error is infallible")
+ }
+}
+
+/// A structure that represents changes to an [`IndexedTxGraph`].
+#[derive(Clone, Debug, PartialEq)]
+#[cfg_attr(
+ feature = "serde",
+ derive(serde::Deserialize, serde::Serialize),
+ serde(
+ crate = "serde_crate",
+ bound(
+ deserialize = "A: Ord + serde::Deserialize<'de>, IA: serde::Deserialize<'de>",
+ serialize = "A: Ord + serde::Serialize, IA: serde::Serialize"
+ )
+ )
+)]
+#[must_use]
+pub struct IndexedAdditions<A, IA> {
+ /// [`TxGraph`] additions.
+ pub graph_additions: Additions<A>,
+ /// [`Indexer`] additions.
+ pub index_additions: IA,
+}
+
+impl<A, IA: Default> Default for IndexedAdditions<A, IA> {
+ fn default() -> Self {
+ Self {
+ graph_additions: Default::default(),
+ index_additions: Default::default(),
+ }
+ }
+}
+
+impl<A: Anchor, IA: Append> Append for IndexedAdditions<A, IA> {
+ fn append(&mut self, other: Self) {
+ self.graph_additions.append(other.graph_additions);
+ self.index_additions.append(other.index_additions);
+ }
+}
+
+/// Represents a structure that can index transaction data.
+pub trait Indexer {
+ /// The resultant "additions" when new transaction data is indexed.
+ type Additions;
+
+ /// Scan and index the given `outpoint` and `txout`.
+ fn index_txout(&mut self, outpoint: OutPoint, txout: &TxOut) -> Self::Additions;
+
+ /// Scan and index the given transaction.
+ fn index_tx(&mut self, tx: &Transaction) -> Self::Additions;
+
+ /// Apply additions to itself.
+ fn apply_additions(&mut self, additions: Self::Additions);
+
+ /// Determines whether the transaction should be included in the index.
+ fn is_tx_relevant(&self, tx: &Transaction) -> bool;
+}
+
+/// A trait that extends [`Indexer`] to also index "owned" script pubkeys.
+pub trait OwnedIndexer: Indexer {
+ /// Determines whether a given script pubkey (`spk`) is owned.
+ fn is_spk_owned(&self, spk: &Script) -> bool;
+}
+
+
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain.rs.html
index 0c9cafc817..c23bddd1bc 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain.rs.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain.rs.html
@@ -307,6 +307,7 @@
307
308
309
+310
//! Module for keychain related structures.
//!
//! A keychain here is a set of application-defined indexes for a miniscript descriptor where we can
@@ -323,12 +324,13 @@
//! [`KeychainChangeSet`]s.
//!
//! [`SpkTxOutIndex`]: crate::SpkTxOutIndex
+
use crate::{
chain_graph::{self, ChainGraph},
collections::BTreeMap,
sparse_chain::ChainPosition,
tx_graph::TxGraph,
- ForEachTxOut,
+ Append, ForEachTxOut,
};
#[cfg(feature = "miniscript")]
@@ -378,12 +380,12 @@
}
}
-impl<K: Ord> DerivationAdditions<K> {
+impl<K: Ord> Append for DerivationAdditions<K> {
/// Append another [`DerivationAdditions`] into self.
///
/// If the keychain already exists, increase the index when the other's index > self's index.
/// If the keychain did not exist, append the new keychain.
- pub fn append(&mut self, mut other: Self) {
+ fn append(&mut self, mut other: Self) {
self.0.iter_mut().for_each(|(key, index)| {
if let Some(other_index) = other.0.remove(key) {
*index = other_index.max(*index);
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain/txout_index.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain/txout_index.rs.html
index 1ce6ef792e..928f3315e7 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain/txout_index.rs.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain/txout_index.rs.html
@@ -588,8 +588,38 @@
588
589
590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
use crate::{
collections::*,
+ indexed_tx_graph::{Indexer, OwnedIndexer},
miniscript::{Descriptor, DescriptorPublicKey},
ForEachTxOut, SpkTxOutIndex,
};
@@ -597,6 +627,8 @@
use bitcoin::{secp256k1::Secp256k1, OutPoint, Script, TxOut};
use core::{fmt::Debug, ops::Deref};
+use crate::Append;
+
use super::DerivationAdditions;
/// Maximum [BIP32](https://bips.xyz/32) derivation index.
@@ -678,6 +710,32 @@
}
}
+impl<K: Clone + Ord + Debug + 'static> Indexer for KeychainTxOutIndex<K> {
+ type Additions = DerivationAdditions<K>;
+
+ fn index_txout(&mut self, outpoint: OutPoint, txout: &TxOut) -> Self::Additions {
+ self.scan_txout(outpoint, txout)
+ }
+
+ fn index_tx(&mut self, tx: &bitcoin::Transaction) -> Self::Additions {
+ self.scan(tx)
+ }
+
+ fn apply_additions(&mut self, additions: Self::Additions) {
+ self.apply_additions(additions)
+ }
+
+ fn is_tx_relevant(&self, tx: &bitcoin::Transaction) -> bool {
+ self.is_relevant(tx)
+ }
+}
+
+impl<K: Clone + Ord + Debug + 'static> OwnedIndexer for KeychainTxOutIndex<K> {
+ fn is_spk_owned(&self, spk: &Script) -> bool {
+ self.inner().is_spk_owned(spk)
+ }
+}
+
impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
/// Scans an object for relevant outpoints, which are stored and indexed internally.
///
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/lib.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/lib.rs.html
index 26bc50fece..766dd29ebb 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/lib.rs.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/lib.rs.html
@@ -87,6 +87,10 @@
87
88
89
+90
+91
+92
+93
//! This crate is a collection of core structures for [Bitcoin Dev Kit] (alpha release).
//!
//! The goal of this crate is to give wallets the mechanisms needed to:
@@ -113,11 +117,15 @@
pub use spk_txout_index::*;
mod chain_data;
pub use chain_data::*;
+pub mod indexed_tx_graph;
pub mod keychain;
+pub mod local_chain;
pub mod sparse_chain;
mod tx_data_traits;
pub mod tx_graph;
pub use tx_data_traits::*;
+mod chain_oracle;
+pub use chain_oracle::*;
#[doc(hidden)]
pub mod example_utils;
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/local_chain.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/local_chain.rs.html
new file mode 100644
index 0000000000..f580ea7b75
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/local_chain.rs.html
@@ -0,0 +1,408 @@
+local_chain.rs - source 1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+
use core::convert::Infallible;
+
+use alloc::collections::{BTreeMap, BTreeSet};
+use bitcoin::BlockHash;
+
+use crate::{BlockId, ChainOracle};
+
+/// This is a local implementation of [`ChainOracle`].
+///
+/// TODO: We need a cache/snapshot thing for chain oracle.
+/// * Minimize calls to remotes.
+/// * Can we cache it forever? Should we drop stuff?
+/// * Assume anything deeper than (i.e. 10) blocks won't be reorged.
+/// * Is this a cache on txs or block? or both?
+/// TODO: Parents of children are confirmed if children are confirmed.
+#[derive(Debug, Default, Clone, PartialEq, Eq, PartialOrd, Ord)]
+pub struct LocalChain {
+ blocks: BTreeMap<u32, BlockHash>,
+}
+
+impl ChainOracle for LocalChain {
+ type Error = Infallible;
+
+ fn is_block_in_chain(
+ &self,
+ block: BlockId,
+ static_block: BlockId,
+ ) -> Result<Option<bool>, Self::Error> {
+ if block.height > static_block.height {
+ return Ok(None);
+ }
+ Ok(
+ match (
+ self.blocks.get(&block.height),
+ self.blocks.get(&static_block.height),
+ ) {
+ (Some(&hash), Some(&static_hash)) => {
+ Some(hash == block.hash && static_hash == static_block.hash)
+ }
+ _ => None,
+ },
+ )
+ }
+}
+
+impl AsRef<BTreeMap<u32, BlockHash>> for LocalChain {
+ fn as_ref(&self) -> &BTreeMap<u32, BlockHash> {
+ &self.blocks
+ }
+}
+
+impl From<LocalChain> for BTreeMap<u32, BlockHash> {
+ fn from(value: LocalChain) -> Self {
+ value.blocks
+ }
+}
+
+impl From<BTreeMap<u32, BlockHash>> for LocalChain {
+ fn from(value: BTreeMap<u32, BlockHash>) -> Self {
+ Self { blocks: value }
+ }
+}
+
+impl LocalChain {
+ pub fn from_blocks<B>(blocks: B) -> Self
+ where
+ B: IntoIterator<Item = BlockId>,
+ {
+ Self {
+ blocks: blocks.into_iter().map(|b| (b.height, b.hash)).collect(),
+ }
+ }
+
+ pub fn tip(&self) -> Option<BlockId> {
+ self.blocks
+ .iter()
+ .last()
+ .map(|(&height, &hash)| BlockId { height, hash })
+ }
+
+ /// Get a block at the given height.
+ pub fn get_block(&self, height: u32) -> Option<BlockId> {
+ self.blocks
+ .get(&height)
+ .map(|&hash| BlockId { height, hash })
+ }
+
+ /// This is like the sparsechain's logic, expect we must guarantee that all invalidated heights
+ /// are to be re-filled.
+ pub fn determine_changeset(&self, update: &Self) -> Result<ChangeSet, UpdateNotConnectedError> {
+ let update = update.as_ref();
+ let update_tip = match update.keys().last().cloned() {
+ Some(tip) => tip,
+ None => return Ok(ChangeSet::default()),
+ };
+
+ // this is the latest height where both the update and local chain has the same block hash
+ let agreement_height = update
+ .iter()
+ .rev()
+ .find(|&(u_height, u_hash)| self.blocks.get(u_height) == Some(u_hash))
+ .map(|(&height, _)| height);
+
+ // the lower bound of the range to invalidate
+ let invalidate_lb = match agreement_height {
+ Some(height) if height == update_tip => u32::MAX,
+ Some(height) => height + 1,
+ None => 0,
+ };
+
+ // the first block's height to invalidate in the local chain
+ let invalidate_from_height = self.blocks.range(invalidate_lb..).next().map(|(&h, _)| h);
+
+ // the first block of height to invalidate (if any) should be represented in the update
+ if let Some(first_invalid_height) = invalidate_from_height {
+ if !update.contains_key(&first_invalid_height) {
+ return Err(UpdateNotConnectedError(first_invalid_height));
+ }
+ }
+
+ let mut changeset: BTreeMap<u32, Option<BlockHash>> = match invalidate_from_height {
+ Some(first_invalid_height) => {
+ // the first block of height to invalidate should be represented in the update
+ if !update.contains_key(&first_invalid_height) {
+ return Err(UpdateNotConnectedError(first_invalid_height));
+ }
+ self.blocks
+ .range(first_invalid_height..)
+ .map(|(height, _)| (*height, None))
+ .collect()
+ }
+ None => BTreeMap::new(),
+ };
+ for (height, update_hash) in update {
+ let original_hash = self.blocks.get(height);
+ if Some(update_hash) != original_hash {
+ changeset.insert(*height, Some(*update_hash));
+ }
+ }
+
+ Ok(changeset)
+ }
+
+ /// Applies the given `changeset`.
+ pub fn apply_changeset(&mut self, changeset: ChangeSet) {
+ for (height, blockhash) in changeset {
+ match blockhash {
+ Some(blockhash) => self.blocks.insert(height, blockhash),
+ None => self.blocks.remove(&height),
+ };
+ }
+ }
+
+ /// Updates [`LocalChain`] with an update [`LocalChain`].
+ ///
+ /// This is equivalent to calling [`determine_changeset`] and [`apply_changeset`] in sequence.
+ ///
+ /// [`determine_changeset`]: Self::determine_changeset
+ /// [`apply_changeset`]: Self::apply_changeset
+ pub fn apply_update(&mut self, update: Self) -> Result<ChangeSet, UpdateNotConnectedError> {
+ let changeset = self.determine_changeset(&update)?;
+ self.apply_changeset(changeset.clone());
+ Ok(changeset)
+ }
+
+ pub fn initial_changeset(&self) -> ChangeSet {
+ self.blocks
+ .iter()
+ .map(|(&height, &hash)| (height, Some(hash)))
+ .collect()
+ }
+
+ pub fn heights(&self) -> BTreeSet<u32> {
+ self.blocks.keys().cloned().collect()
+ }
+}
+
+/// This is the return value of [`determine_changeset`] and represents changes to [`LocalChain`].
+///
+/// [`determine_changeset`]: LocalChain::determine_changeset
+pub type ChangeSet = BTreeMap<u32, Option<BlockHash>>;
+
+/// Represents an update failure of [`LocalChain`] due to the update not connecting to the original
+/// chain.
+///
+/// The update cannot be applied to the chain because the chain suffix it represents did not
+/// connect to the existing chain. This error case contains the checkpoint height to include so
+/// that the chains can connect.
+#[derive(Clone, Debug, PartialEq)]
+pub struct UpdateNotConnectedError(pub u32);
+
+impl core::fmt::Display for UpdateNotConnectedError {
+ fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
+ write!(
+ f,
+ "the update cannot connect with the chain, try include block at height {}",
+ self.0
+ )
+ }
+}
+
+#[cfg(feature = "std")]
+impl std::error::Error for UpdateNotConnectedError {}
+
+
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/spk_txout_index.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/spk_txout_index.rs.html
index cbc8526251..4807871b57 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/spk_txout_index.rs.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/spk_txout_index.rs.html
@@ -307,10 +307,40 @@
307
308
309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
use core::ops::RangeBounds;
use crate::{
collections::{hash_map::Entry, BTreeMap, BTreeSet, HashMap},
+ indexed_tx_graph::{Indexer, OwnedIndexer},
ForEachTxOut,
};
use bitcoin::{self, OutPoint, Script, Transaction, TxOut, Txid};
@@ -361,6 +391,34 @@
}
}
+impl<I: Clone + Ord + 'static> Indexer for SpkTxOutIndex<I> {
+ type Additions = ();
+
+ fn index_txout(&mut self, outpoint: OutPoint, txout: &TxOut) -> Self::Additions {
+ self.scan_txout(outpoint, txout);
+ Default::default()
+ }
+
+ fn index_tx(&mut self, tx: &Transaction) -> Self::Additions {
+ self.scan(tx);
+ Default::default()
+ }
+
+ fn apply_additions(&mut self, _additions: Self::Additions) {
+ // This applies nothing.
+ }
+
+ fn is_tx_relevant(&self, tx: &Transaction) -> bool {
+ self.is_relevant(tx)
+ }
+}
+
+impl<I: Clone + Ord + 'static> OwnedIndexer for SpkTxOutIndex<I> {
+ fn is_spk_owned(&self, spk: &Script) -> bool {
+ self.spk_indices.get(spk).is_some()
+ }
+}
+
/// This macro is used instead of a member function of `SpkTxOutIndex`, which would result in a
/// compiler error[E0521]: "borrowed data escapes out of closure" when we attempt to take a
/// reference out of the `ForEachTxOut` closure during scanning.
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/tx_data_traits.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/tx_data_traits.rs.html
index 260690eea3..e8afe96bc8 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/tx_data_traits.rs.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/tx_data_traits.rs.html
@@ -31,7 +31,60 @@
31
32
33
-
use bitcoin::{Block, OutPoint, Transaction, TxOut};
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+
use crate::collections::BTreeMap;
+use crate::collections::BTreeSet;
+use crate::BlockId;
+use bitcoin::{Block, OutPoint, Transaction, TxOut};
/// Trait to do something with every txout contained in a structure.
///
@@ -64,5 +117,52 @@
}
}
}
+
+/// Trait that "anchors" blockchain data to a specific block of height and hash.
+///
+/// I.e. If transaction A is anchored in block B, then if block B is in the best chain, we can
+/// assume that transaction A is also confirmed in the best chain. This does not necessarily mean
+/// that transaction A is confirmed in block B. It could also mean transaction A is confirmed in a
+/// parent block of B.
+pub trait Anchor: core::fmt::Debug + Clone + Eq + PartialOrd + Ord + core::hash::Hash {
+ /// Returns the [`BlockId`] that the associated blockchain data is "anchored" in.
+ fn anchor_block(&self) -> BlockId;
+
+ /// Get the upper bound of the chain data's confirmation height.
+ ///
+ /// The default definition gives a pessimistic answer. This can be overridden by the `Anchor`
+ /// implementation for a more accurate value.
+ fn confirmation_height_upper_bound(&self) -> u32 {
+ self.anchor_block().height
+ }
+}
+
+impl<A: Anchor> Anchor for &'static A {
+ fn anchor_block(&self) -> BlockId {
+ <A as Anchor>::anchor_block(self)
+ }
+}
+
+/// Trait that makes an object appendable.
+pub trait Append {
+ /// Append another object of the same type onto `self`.
+ fn append(&mut self, other: Self);
+}
+
+impl Append for () {
+ fn append(&mut self, _other: Self) {}
+}
+
+impl<K: Ord, V> Append for BTreeMap<K, V> {
+ fn append(&mut self, mut other: Self) {
+ BTreeMap::append(self, &mut other)
+ }
+}
+
+impl<T: Ord> Append for BTreeSet<T> {
+ fn append(&mut self, mut other: Self) {
+ BTreeSet::append(self, &mut other)
+ }
+}
\ No newline at end of file
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/tx_graph.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/tx_graph.rs.html
index f5f4933dce..488c230521 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/tx_graph.rs.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/tx_graph.rs.html
@@ -579,6 +579,516 @@
579
580
581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
+926
+927
+928
+929
+930
+931
+932
+933
+934
+935
+936
+937
+938
+939
+940
+941
+942
+943
+944
+945
+946
+947
+948
+949
+950
+951
+952
+953
+954
+955
+956
+957
+958
+959
+960
+961
+962
+963
+964
+965
+966
+967
+968
+969
+970
+971
+972
+973
+974
+975
+976
+977
+978
+979
+980
+981
+982
+983
+984
+985
+986
+987
+988
+989
+990
+991
+992
+993
+994
+995
+996
+997
+998
+999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
//! Module for structures that store and traverse transactions.
//!
//! [`TxGraph`] is a monotone structure that inserts transactions and indexes the spends. The
@@ -596,12 +1106,13 @@
//! of the changes to [`TxGraph`].
//!
//! ```
+//! # use bdk_chain::BlockId;
//! # use bdk_chain::tx_graph::TxGraph;
//! # use bdk_chain::example_utils::*;
//! # use bitcoin::Transaction;
//! # let tx_a = tx_from_hex(RAW_TX_1);
//! # let tx_b = tx_from_hex(RAW_TX_2);
-//! let mut graph = TxGraph::default();
+//! let mut graph: TxGraph = TxGraph::default();
//!
//! // preview a transaction insertion (not actually inserted)
//! let additions = graph.insert_tx_preview(tx_a);
@@ -615,12 +1126,13 @@
//! A [`TxGraph`] can also be updated with another [`TxGraph`].
//!
//! ```
+//! # use bdk_chain::BlockId;
//! # use bdk_chain::tx_graph::TxGraph;
//! # use bdk_chain::example_utils::*;
//! # use bitcoin::Transaction;
//! # let tx_a = tx_from_hex(RAW_TX_1);
//! # let tx_b = tx_from_hex(RAW_TX_2);
-//! let mut graph = TxGraph::default();
+//! let mut graph: TxGraph = TxGraph::default();
//! let update = TxGraph::new(vec![tx_a, tx_b]);
//!
//! // preview additions as the result of the update
@@ -633,63 +1145,141 @@
//! let additions = graph.apply_update(update);
//! assert!(additions.is_empty());
//! ```
-use crate::{collections::*, ForEachTxOut};
+
+use crate::{
+ collections::*, Anchor, Append, BlockId, ChainOracle, ForEachTxOut, FullTxOut, ObservedAs,
+};
use alloc::vec::Vec;
use bitcoin::{OutPoint, Transaction, TxOut, Txid};
-use core::ops::RangeInclusive;
+use core::{
+ convert::Infallible,
+ ops::{Deref, RangeInclusive},
+};
/// A graph of transactions and spends.
///
/// See the [module-level documentation] for more.
///
/// [module-level documentation]: crate::tx_graph
-#[derive(Clone, Debug, PartialEq, Default)]
-pub struct TxGraph {
- txs: HashMap<Txid, TxNode>,
+#[derive(Clone, Debug, PartialEq)]
+pub struct TxGraph<A = ()> {
+ // all transactions that the graph is aware of in format: `(tx_node, tx_anchors, tx_last_seen)`
+ txs: HashMap<Txid, (TxNodeInternal, BTreeSet<A>, u64)>,
spends: BTreeMap<OutPoint, HashSet<Txid>>,
+ anchors: BTreeSet<(A, Txid)>,
// This atrocity exists so that `TxGraph::outspends()` can return a reference.
// FIXME: This can be removed once `HashSet::new` is a const fn.
empty_outspends: HashSet<Txid>,
}
-/// Node of a [`TxGraph`]. This can either be a whole transaction, or a partial transaction (where
-/// we only have select outputs).
+impl<A> Default for TxGraph<A> {
+ fn default() -> Self {
+ Self {
+ txs: Default::default(),
+ spends: Default::default(),
+ anchors: Default::default(),
+ empty_outspends: Default::default(),
+ }
+ }
+}
+
+/// An outward-facing view of a (transaction) node in the [`TxGraph`].
+#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+pub struct TxNode<'a, T, A> {
+ /// Txid of the transaction.
+ pub txid: Txid,
+ /// A partial or full representation of the transaction.
+ pub tx: &'a T,
+ /// The blocks that the transaction is "anchored" in.
+ pub anchors: &'a BTreeSet<A>,
+ /// The last-seen unix timestamp of the transaction as unconfirmed.
+ pub last_seen_unconfirmed: u64,
+}
+
+impl<'a, T, A> Deref for TxNode<'a, T, A> {
+ type Target = T;
+
+ fn deref(&self) -> &Self::Target {
+ self.tx
+ }
+}
+
+/// Internal representation of a transaction node of a [`TxGraph`].
+///
+/// This can either be a whole transaction, or a partial transaction (where we only have select
+/// outputs).
#[derive(Clone, Debug, PartialEq)]
-enum TxNode {
+enum TxNodeInternal {
Whole(Transaction),
Partial(BTreeMap<u32, TxOut>),
}
-impl Default for TxNode {
+impl Default for TxNodeInternal {
fn default() -> Self {
Self::Partial(BTreeMap::new())
}
}
-impl TxGraph {
+/// An outwards-facing view of a transaction that is part of the *best chain*'s history.
+#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+pub struct CanonicalTx<'a, T, A> {
+ /// How the transaction is observed as (confirmed or unconfirmed).
+ pub observed_as: ObservedAs<&'a A>,
+ /// The transaction node (as part of the graph).
+ pub node: TxNode<'a, T, A>,
+}
+
+impl<A> TxGraph<A> {
/// Iterate over all tx outputs known by [`TxGraph`].
+ ///
+ /// This includes txouts of both full transactions as well as floating transactions.
pub fn all_txouts(&self) -> impl Iterator<Item = (OutPoint, &TxOut)> {
- self.txs.iter().flat_map(|(txid, tx)| match tx {
- TxNode::Whole(tx) => tx
+ self.txs.iter().flat_map(|(txid, (tx, _, _))| match tx {
+ TxNodeInternal::Whole(tx) => tx
.output
.iter()
.enumerate()
.map(|(vout, txout)| (OutPoint::new(*txid, vout as _), txout))
.collect::<Vec<_>>(),
- TxNode::Partial(txouts) => txouts
+ TxNodeInternal::Partial(txouts) => txouts
.iter()
.map(|(vout, txout)| (OutPoint::new(*txid, *vout as _), txout))
.collect::<Vec<_>>(),
})
}
+ /// Iterate over floating txouts known by [`TxGraph`].
+ ///
+ /// Floating txouts are txouts that do not have the residing full transaction contained in the
+ /// graph.
+ pub fn floating_txouts(&self) -> impl Iterator<Item = (OutPoint, &TxOut)> {
+ self.txs
+ .iter()
+ .filter_map(|(txid, (tx_node, _, _))| match tx_node {
+ TxNodeInternal::Whole(_) => None,
+ TxNodeInternal::Partial(txouts) => Some(
+ txouts
+ .iter()
+ .map(|(&vout, txout)| (OutPoint::new(*txid, vout), txout)),
+ ),
+ })
+ .flatten()
+ }
+
/// Iterate over all full transactions in the graph.
- pub fn full_transactions(&self) -> impl Iterator<Item = &Transaction> {
- self.txs.iter().filter_map(|(_, tx)| match tx {
- TxNode::Whole(tx) => Some(tx),
- TxNode::Partial(_) => None,
- })
+ pub fn full_txs(&self) -> impl Iterator<Item = TxNode<'_, Transaction, A>> {
+ self.txs
+ .iter()
+ .filter_map(|(&txid, (tx, anchors, last_seen))| match tx {
+ TxNodeInternal::Whole(tx) => Some(TxNode {
+ txid,
+ tx,
+ anchors,
+ last_seen_unconfirmed: *last_seen,
+ }),
+ TxNodeInternal::Partial(_) => None,
+ })
}
/// Get a transaction by txid. This only returns `Some` for full transactions.
@@ -698,30 +1288,42 @@
///
/// [`get_txout`]: Self::get_txout
pub fn get_tx(&self, txid: Txid) -> Option<&Transaction> {
- match self.txs.get(&txid)? {
- TxNode::Whole(tx) => Some(tx),
- TxNode::Partial(_) => None,
+ self.get_tx_node(txid).map(|n| n.tx)
+ }
+
+ /// Get a transaction node by txid. This only returns `Some` for full transactions.
+ pub fn get_tx_node(&self, txid: Txid) -> Option<TxNode<'_, Transaction, A>> {
+ match &self.txs.get(&txid)? {
+ (TxNodeInternal::Whole(tx), anchors, last_seen) => Some(TxNode {
+ txid,
+ tx,
+ anchors,
+ last_seen_unconfirmed: *last_seen,
+ }),
+ _ => None,
}
}
/// Obtains a single tx output (if any) at the specified outpoint.
pub fn get_txout(&self, outpoint: OutPoint) -> Option<&TxOut> {
- match self.txs.get(&outpoint.txid)? {
- TxNode::Whole(tx) => tx.output.get(outpoint.vout as usize),
- TxNode::Partial(txouts) => txouts.get(&outpoint.vout),
+ match &self.txs.get(&outpoint.txid)?.0 {
+ TxNodeInternal::Whole(tx) => tx.output.get(outpoint.vout as usize),
+ TxNodeInternal::Partial(txouts) => txouts.get(&outpoint.vout),
}
}
- /// Returns a [`BTreeMap`] of vout to output of the provided `txid`.
- pub fn txouts(&self, txid: Txid) -> Option<BTreeMap<u32, &TxOut>> {
- Some(match self.txs.get(&txid)? {
- TxNode::Whole(tx) => tx
+ /// Returns known outputs of a given `txid`.
+ ///
+ /// Returns a [`BTreeMap`] of vout to output of the provided `txid`.
+ pub fn tx_outputs(&self, txid: Txid) -> Option<BTreeMap<u32, &TxOut>> {
+ Some(match &self.txs.get(&txid)?.0 {
+ TxNodeInternal::Whole(tx) => tx
.output
.iter()
.enumerate()
.map(|(vout, txout)| (vout as u32, txout))
.collect::<BTreeMap<_, _>>(),
- TxNode::Partial(txouts) => txouts
+ TxNodeInternal::Partial(txouts) => txouts
.iter()
.map(|(vout, txout)| (*vout, txout))
.collect::<BTreeMap<_, _>>(),
@@ -757,9 +1359,94 @@
Some(inputs_sum - outputs_sum)
}
+
+ /// The transactions spending from this output.
+ ///
+ /// `TxGraph` allows conflicting transactions within the graph. Obviously the transactions in
+ /// the returned set will never be in the same active-chain.
+ pub fn outspends(&self, outpoint: OutPoint) -> &HashSet<Txid> {
+ self.spends.get(&outpoint).unwrap_or(&self.empty_outspends)
+ }
+
+ /// Iterates over the transactions spending from `txid`.
+ ///
+ /// The iterator item is a union of `(vout, txid-set)` where:
+ ///
+ /// - `vout` is the provided `txid`'s outpoint that is being spent
+ /// - `txid-set` is the set of txids spending the `vout`.
+ pub fn tx_spends(
+ &self,
+ txid: Txid,
+ ) -> impl DoubleEndedIterator<Item = (u32, &HashSet<Txid>)> + '_ {
+ let start = OutPoint { txid, vout: 0 };
+ let end = OutPoint {
+ txid,
+ vout: u32::MAX,
+ };
+ self.spends
+ .range(start..=end)
+ .map(|(outpoint, spends)| (outpoint.vout, spends))
+ }
+
+ /// Creates an iterator that filters and maps descendants from the starting `txid`.
+ ///
+ /// The supplied closure takes in two inputs `(depth, descendant_txid)`:
+ ///
+ /// * `depth` is the distance between the starting `txid` and the `descendant_txid`. I.e., if the
+ /// descendant is spending an output of the starting `txid`; the `depth` will be 1.
+ /// * `descendant_txid` is the descendant's txid which we are considering to walk.
+ ///
+ /// The supplied closure returns an `Option<T>`, allowing the caller to map each node it vists
+ /// and decide whether to visit descendants.
+ pub fn walk_descendants<'g, F, O>(&'g self, txid: Txid, walk_map: F) -> TxDescendants<A, F>
+ where
+ F: FnMut(usize, Txid) -> Option<O> + 'g,
+ {
+ TxDescendants::new_exclude_root(self, txid, walk_map)
+ }
+
+ /// Creates an iterator that both filters and maps conflicting transactions (this includes
+ /// descendants of directly-conflicting transactions, which are also considered conflicts).
+ ///
+ /// Refer to [`Self::walk_descendants`] for `walk_map` usage.
+ pub fn walk_conflicts<'g, F, O>(
+ &'g self,
+ tx: &'g Transaction,
+ walk_map: F,
+ ) -> TxDescendants<A, F>
+ where
+ F: FnMut(usize, Txid) -> Option<O> + 'g,
+ {
+ let txids = self.direct_conflicts_of_tx(tx).map(|(_, txid)| txid);
+ TxDescendants::from_multiple_include_root(self, txids, walk_map)
+ }
+
+ /// Given a transaction, return an iterator of txids that directly conflict with the given
+ /// transaction's inputs (spends). The conflicting txids are returned with the given
+ /// transaction's vin (in which it conflicts).
+ ///
+ /// Note that this only returns directly conflicting txids and does not include descendants of
+ /// those txids (which are technically also conflicting).
+ pub fn direct_conflicts_of_tx<'g>(
+ &'g self,
+ tx: &'g Transaction,
+ ) -> impl Iterator<Item = (usize, Txid)> + '_ {
+ let txid = tx.txid();
+ tx.input
+ .iter()
+ .enumerate()
+ .filter_map(move |(vin, txin)| self.spends.get(&txin.previous_output).zip(Some(vin)))
+ .flat_map(|(spends, vin)| core::iter::repeat(vin).zip(spends.iter().cloned()))
+ .filter(move |(_, conflicting_txid)| *conflicting_txid != txid)
+ }
+
+ /// Whether the graph has any transactions or outputs in it.
+ pub fn is_empty(&self) -> bool {
+ self.txs.is_empty()
+ }
}
-impl TxGraph {
+impl<A: Clone + Ord> TxGraph<A> {
/// Construct a new [`TxGraph`] from a list of transactions.
pub fn new(txs: impl IntoIterator<Item = Transaction>) -> Self {
let mut new = Self::default();
@@ -768,38 +1455,118 @@
}
new
}
+
+ /// Returns the resultant [`Additions`] if the given `txout` is inserted at `outpoint`. Does not
+ /// mutate `self`.
+ ///
+ /// Inserting floating txouts are useful for determining fee/feerate of transactions we care
+ /// about.
+ ///
+ /// The [`Additions`] result will be empty if the `outpoint` (or a full transaction containing
+ /// the `outpoint`) already existed in `self`.
+ pub fn insert_txout_preview(&self, outpoint: OutPoint, txout: TxOut) -> Additions<A> {
+ let mut update = Self::default();
+ update.txs.insert(
+ outpoint.txid,
+ (
+ TxNodeInternal::Partial([(outpoint.vout, txout)].into()),
+ BTreeSet::new(),
+ 0,
+ ),
+ );
+ self.determine_additions(&update)
+ }
+
/// Inserts the given [`TxOut`] at [`OutPoint`].
///
- /// Note this will ignore the action if we already have the full transaction that the txout is
- /// alleged to be on (even if it doesn't match it!).
- pub fn insert_txout(&mut self, outpoint: OutPoint, txout: TxOut) -> Additions {
+ /// This is equivalent to calling [`insert_txout_preview`] and [`apply_additions`] in sequence.
+ ///
+ /// [`insert_txout_preview`]: Self::insert_txout_preview
+ /// [`apply_additions`]: Self::apply_additions
+ pub fn insert_txout(&mut self, outpoint: OutPoint, txout: TxOut) -> Additions<A> {
let additions = self.insert_txout_preview(outpoint, txout);
self.apply_additions(additions.clone());
additions
}
+ /// Returns the resultant [`Additions`] if the given transaction is inserted. Does not actually
+ /// mutate [`Self`].
+ ///
+ /// The [`Additions`] result will be empty if `tx` already exists in `self`.
+ pub fn insert_tx_preview(&self, tx: Transaction) -> Additions<A> {
+ let mut update = Self::default();
+ update
+ .txs
+ .insert(tx.txid(), (TxNodeInternal::Whole(tx), BTreeSet::new(), 0));
+ self.determine_additions(&update)
+ }
+
/// Inserts the given transaction into [`TxGraph`].
///
/// The [`Additions`] returned will be empty if `tx` already exists.
- pub fn insert_tx(&mut self, tx: Transaction) -> Additions {
+ pub fn insert_tx(&mut self, tx: Transaction) -> Additions<A> {
let additions = self.insert_tx_preview(tx);
self.apply_additions(additions.clone());
additions
}
+ /// Returns the resultant [`Additions`] if the `txid` is set in `anchor`.
+ pub fn insert_anchor_preview(&self, txid: Txid, anchor: A) -> Additions<A> {
+ let mut update = Self::default();
+ update.anchors.insert((anchor, txid));
+ self.determine_additions(&update)
+ }
+
+ /// Inserts the given `anchor` into [`TxGraph`].
+ ///
+ /// This is equivalent to calling [`insert_anchor_preview`] and [`apply_additions`] in sequence.
+ /// The [`Additions`] returned will be empty if graph already knows that `txid` exists in
+ /// `anchor`.
+ ///
+ /// [`insert_anchor_preview`]: Self::insert_anchor_preview
+ /// [`apply_additions`]: Self::apply_additions
+ pub fn insert_anchor(&mut self, txid: Txid, anchor: A) -> Additions<A> {
+ let additions = self.insert_anchor_preview(txid, anchor);
+ self.apply_additions(additions.clone());
+ additions
+ }
+
+ /// Returns the resultant [`Additions`] if the `txid` is set to `seen_at`.
+ ///
+ /// Note that [`TxGraph`] only keeps track of the lastest `seen_at`.
+ pub fn insert_seen_at_preview(&self, txid: Txid, seen_at: u64) -> Additions<A> {
+ let mut update = Self::default();
+ let (_, _, update_last_seen) = update.txs.entry(txid).or_default();
+ *update_last_seen = seen_at;
+ self.determine_additions(&update)
+ }
+
+ /// Inserts the given `seen_at` into [`TxGraph`].
+ ///
+ /// This is equivalent to calling [`insert_seen_at_preview`] and [`apply_additions`] in
+ /// sequence.
+ ///
+ /// [`insert_seen_at_preview`]: Self::insert_seen_at_preview
+ /// [`apply_additions`]: Self::apply_additions
+ pub fn insert_seen_at(&mut self, txid: Txid, seen_at: u64) -> Additions<A> {
+ let additions = self.insert_seen_at_preview(txid, seen_at);
+ self.apply_additions(additions.clone());
+ additions
+ }
+
/// Extends this graph with another so that `self` becomes the union of the two sets of
/// transactions.
///
/// The returned [`Additions`] is the set difference between `update` and `self` (transactions that
/// exist in `update` but not in `self`).
- pub fn apply_update(&mut self, update: TxGraph) -> Additions {
+ pub fn apply_update(&mut self, update: TxGraph<A>) -> Additions<A> {
let additions = self.determine_additions(&update);
self.apply_additions(additions.clone());
additions
}
/// Applies [`Additions`] to [`TxGraph`].
- pub fn apply_additions(&mut self, additions: Additions) {
+ pub fn apply_additions(&mut self, additions: Additions<A>) {
for tx in additions.tx {
let txid = tx.txid();
@@ -813,12 +1580,21 @@
self.spends.entry(outpoint).or_default().insert(txid);
});
- if let Some(TxNode::Whole(old_tx)) = self.txs.insert(txid, TxNode::Whole(tx)) {
- debug_assert_eq!(
- old_tx.txid(),
- txid,
- "old tx of the same txid should not be different."
- );
+ match self.txs.get_mut(&txid) {
+ Some((tx_node @ TxNodeInternal::Partial(_), _, _)) => {
+ *tx_node = TxNodeInternal::Whole(tx);
+ }
+ Some((TxNodeInternal::Whole(tx), _, _)) => {
+ debug_assert_eq!(
+ tx.txid(),
+ txid,
+ "tx should produce txid that is same as key"
+ );
+ }
+ None => {
+ self.txs
+ .insert(txid, (TxNodeInternal::Whole(tx), BTreeSet::new(), 0));
+ }
}
}
@@ -826,163 +1602,370 @@
let tx_entry = self
.txs
.entry(outpoint.txid)
- .or_insert_with(TxNode::default);
+ .or_insert_with(Default::default);
match tx_entry {
- TxNode::Whole(_) => { /* do nothing since we already have full tx */ }
- TxNode::Partial(txouts) => {
+ (TxNodeInternal::Whole(_), _, _) => { /* do nothing since we already have full tx */
+ }
+ (TxNodeInternal::Partial(txouts), _, _) => {
txouts.insert(outpoint.vout, txout);
}
}
}
+
+ for (anchor, txid) in additions.anchors {
+ if self.anchors.insert((anchor.clone(), txid)) {
+ let (_, anchors, _) = self.txs.entry(txid).or_insert_with(Default::default);
+ anchors.insert(anchor);
+ }
+ }
+
+ for (txid, new_last_seen) in additions.last_seen {
+ let (_, _, last_seen) = self.txs.entry(txid).or_insert_with(Default::default);
+ if new_last_seen > *last_seen {
+ *last_seen = new_last_seen;
+ }
+ }
}
/// Previews the resultant [`Additions`] when [`Self`] is updated against the `update` graph.
///
/// The [`Additions`] would be the set difference between `update` and `self` (transactions that
/// exist in `update` but not in `self`).
- pub fn determine_additions(&self, update: &TxGraph) -> Additions {
+ pub fn determine_additions(&self, update: &TxGraph<A>) -> Additions<A> {
let mut additions = Additions::default();
- for (&txid, update_tx) in &update.txs {
- if self.get_tx(txid).is_some() {
- continue;
- }
-
- match update_tx {
- TxNode::Whole(tx) => {
- if matches!(self.txs.get(&txid), None | Some(TxNode::Partial(_))) {
- additions.tx.insert(tx.clone());
- }
+ for (&txid, (update_tx_node, _, update_last_seen)) in &update.txs {
+ let prev_last_seen: u64 = match (self.txs.get(&txid), update_tx_node) {
+ (None, TxNodeInternal::Whole(update_tx)) => {
+ additions.tx.insert(update_tx.clone());
+ 0
+ }
+ (None, TxNodeInternal::Partial(update_txos)) => {
+ additions.txout.extend(
+ update_txos
+ .iter()
+ .map(|(&vout, txo)| (OutPoint::new(txid, vout), txo.clone())),
+ );
+ 0
+ }
+ (Some((TxNodeInternal::Whole(_), _, last_seen)), _) => *last_seen,
+ (
+ Some((TxNodeInternal::Partial(_), _, last_seen)),
+ TxNodeInternal::Whole(update_tx),
+ ) => {
+ additions.tx.insert(update_tx.clone());
+ *last_seen
}
- TxNode::Partial(partial) => {
- for (&vout, update_txout) in partial {
- let outpoint = OutPoint::new(txid, vout);
-
- if self.get_txout(outpoint) != Some(update_txout) {
- additions.txout.insert(outpoint, update_txout.clone());
- }
- }
+ (
+ Some((TxNodeInternal::Partial(txos), _, last_seen)),
+ TxNodeInternal::Partial(update_txos),
+ ) => {
+ additions.txout.extend(
+ update_txos
+ .iter()
+ .filter(|(vout, _)| !txos.contains_key(*vout))
+ .map(|(&vout, txo)| (OutPoint::new(txid, vout), txo.clone())),
+ );
+ *last_seen
}
+ };
+
+ if *update_last_seen > prev_last_seen {
+ additions.last_seen.insert(txid, *update_last_seen);
}
}
+ additions.anchors = update.anchors.difference(&self.anchors).cloned().collect();
+
additions
}
+}
- /// Returns the resultant [`Additions`] if the given transaction is inserted. Does not actually
- /// mutate [`Self`].
+impl<A: Anchor> TxGraph<A> {
+ /// Get all heights that are relevant to the graph.
+ pub fn relevant_heights(&self) -> impl Iterator<Item = u32> + '_ {
+ let mut last_height = Option::<u32>::None;
+ self.anchors
+ .iter()
+ .map(|(a, _)| a.anchor_block().height)
+ .filter(move |&height| {
+ let is_unique = Some(height) != last_height;
+ if is_unique {
+ last_height = Some(height);
+ }
+ is_unique
+ })
+ }
+
+ /// Get the position of the transaction in `chain` with tip `chain_tip`.
///
- /// The [`Additions`] result will be empty if `tx` already exists in `self`.
- pub fn insert_tx_preview(&self, tx: Transaction) -> Additions {
- let mut update = Self::default();
- update.txs.insert(tx.txid(), TxNode::Whole(tx));
- self.determine_additions(&update)
+ /// If the given transaction of `txid` does not exist in the chain of `chain_tip`, `None` is
+ /// returned.
+ ///
+ /// # Error
+ ///
+ /// An error will occur if the [`ChainOracle`] implementation (`chain`) fails. If the
+ /// [`ChainOracle`] is infallible, [`get_chain_position`] can be used instead.
+ ///
+ /// [`get_chain_position`]: Self::get_chain_position
+ pub fn try_get_chain_position<C: ChainOracle>(
+ &self,
+ chain: &C,
+ chain_tip: BlockId,
+ txid: Txid,
+ ) -> Result<Option<ObservedAs<&A>>, C::Error> {
+ let (tx_node, anchors, &last_seen) = match self.txs.get(&txid) {
+ Some((tx, anchors, last_seen)) if !(anchors.is_empty() && *last_seen == 0) => {
+ (tx, anchors, last_seen)
+ }
+ _ => return Ok(None),
+ };
+
+ for anchor in anchors {
+ match chain.is_block_in_chain(anchor.anchor_block(), chain_tip)? {
+ Some(true) => return Ok(Some(ObservedAs::Confirmed(anchor))),
+ _ => continue,
+ }
+ }
+
+ // The tx is not anchored to a block which is in the best chain, let's check whether we can
+ // ignore it by checking conflicts!
+ let tx = match tx_node {
+ TxNodeInternal::Whole(tx) => tx,
+ TxNodeInternal::Partial(_) => {
+ // Partial transactions (outputs only) cannot have conflicts.
+ return Ok(None);
+ }
+ };
+
+ // If a conflicting tx is in the best chain, or has `last_seen` higher than this tx, then
+ // this tx cannot exist in the best chain
+ for conflicting_tx in self.walk_conflicts(tx, |_, txid| self.get_tx_node(txid)) {
+ for block in conflicting_tx.anchors.iter().map(A::anchor_block) {
+ if chain.is_block_in_chain(block, chain_tip)? == Some(true) {
+ // conflicting tx is in best chain, so the current tx cannot be in best chain!
+ return Ok(None);
+ }
+ }
+ if conflicting_tx.last_seen_unconfirmed > last_seen {
+ return Ok(None);
+ }
+ }
+
+ Ok(Some(ObservedAs::Unconfirmed(last_seen)))
}
- /// Returns the resultant [`Additions`] if the given `txout` is inserted at `outpoint`. Does not
- /// mutate `self`.
+ /// Get the position of the transaction in `chain` with tip `chain_tip`.
///
- /// The [`Additions`] result will be empty if the `outpoint` (or a full transaction containing
- /// the `outpoint`) already existed in `self`.
- pub fn insert_txout_preview(&self, outpoint: OutPoint, txout: TxOut) -> Additions {
- let mut update = Self::default();
- update.txs.insert(
- outpoint.txid,
- TxNode::Partial([(outpoint.vout, txout)].into()),
- );
- self.determine_additions(&update)
+ /// This is the infallible version of [`try_get_chain_position`].
+ ///
+ /// [`try_get_chain_position`]: Self::try_get_chain_position
+ pub fn get_chain_position<C: ChainOracle<Error = Infallible>>(
+ &self,
+ chain: &C,
+ chain_tip: BlockId,
+ txid: Txid,
+ ) -> Option<ObservedAs<&A>> {
+ self.try_get_chain_position(chain, chain_tip, txid)
+ .expect("error is infallible")
}
-}
-impl TxGraph {
- /// The transactions spending from this output.
+ /// Get the txid of the spending transaction and where the spending transaction is observed in
+ /// the `chain` of `chain_tip`.
///
- /// `TxGraph` allows conflicting transactions within the graph. Obviously the transactions in
- /// the returned set will never be in the same active-chain.
- pub fn outspends(&self, outpoint: OutPoint) -> &HashSet<Txid> {
- self.spends.get(&outpoint).unwrap_or(&self.empty_outspends)
+ /// If no in-chain transaction spends `outpoint`, `None` will be returned.
+ ///
+ /// # Error
+ ///
+ /// An error will occur only if the [`ChainOracle`] implementation (`chain`) fails.
+ ///
+ /// If the [`ChainOracle`] is infallible, [`get_chain_spend`] can be used instead.
+ ///
+ /// [`get_chain_spend`]: Self::get_chain_spend
+ pub fn try_get_chain_spend<C: ChainOracle>(
+ &self,
+ chain: &C,
+ chain_tip: BlockId,
+ outpoint: OutPoint,
+ ) -> Result<Option<(ObservedAs<&A>, Txid)>, C::Error> {
+ if self
+ .try_get_chain_position(chain, chain_tip, outpoint.txid)?
+ .is_none()
+ {
+ return Ok(None);
+ }
+ if let Some(spends) = self.spends.get(&outpoint) {
+ for &txid in spends {
+ if let Some(observed_at) = self.try_get_chain_position(chain, chain_tip, txid)? {
+ return Ok(Some((observed_at, txid)));
+ }
+ }
+ }
+ Ok(None)
}
- /// Iterates over the transactions spending from `txid`.
+ /// Get the txid of the spending transaction and where the spending transaction is observed in
+ /// the `chain` of `chain_tip`.
///
- /// The iterator item is a union of `(vout, txid-set)` where:
+ /// This is the infallible version of [`try_get_chain_spend`]
///
- /// - `vout` is the provided `txid`'s outpoint that is being spent
- /// - `txid-set` is the set of txids spending the `vout`.
- pub fn tx_outspends(
+ /// [`try_get_chain_spend`]: Self::try_get_chain_spend
+ pub fn get_chain_spend<C: ChainOracle<Error = Infallible>>(
&self,
- txid: Txid,
- ) -> impl DoubleEndedIterator<Item = (u32, &HashSet<Txid>)> + '_ {
- let start = OutPoint { txid, vout: 0 };
- let end = OutPoint {
- txid,
- vout: u32::MAX,
- };
- self.spends
- .range(start..=end)
- .map(|(outpoint, spends)| (outpoint.vout, spends))
+ chain: &C,
+ static_block: BlockId,
+ outpoint: OutPoint,
+ ) -> Option<(ObservedAs<&A>, Txid)> {
+ self.try_get_chain_spend(chain, static_block, outpoint)
+ .expect("error is infallible")
}
- /// Iterate over all partial transactions (outputs only) in the graph.
- pub fn partial_transactions(&self) -> impl Iterator<Item = (Txid, &BTreeMap<u32, TxOut>)> {
- self.txs.iter().filter_map(|(txid, tx)| match tx {
- TxNode::Whole(_) => None,
- TxNode::Partial(partial) => Some((*txid, partial)),
+ /// List graph transactions that are in `chain` with `chain_tip`.
+ ///
+ /// Each transaction is represented as a [`CanonicalTx`] that contains where the transaction is
+ /// observed in-chain, and the [`TxNode`].
+ ///
+ /// # Error
+ ///
+ /// If the [`ChainOracle`] implementation (`chain`) fails, an error will be returned with the
+ /// returned item.
+ ///
+ /// If the [`ChainOracle`] is infallible, [`list_chain_txs`] can be used instead.
+ ///
+ /// [`list_chain_txs`]: Self::list_chain_txs
+ pub fn try_list_chain_txs<'a, C: ChainOracle + 'a>(
+ &'a self,
+ chain: &'a C,
+ chain_tip: BlockId,
+ ) -> impl Iterator<Item = Result<CanonicalTx<'a, Transaction, A>, C::Error>> {
+ self.full_txs().filter_map(move |tx| {
+ self.try_get_chain_position(chain, chain_tip, tx.txid)
+ .map(|v| {
+ v.map(|observed_in| CanonicalTx {
+ observed_as: observed_in,
+ node: tx,
+ })
+ })
+ .transpose()
})
}
- /// Creates an iterator that filters and maps descendants from the starting `txid`.
+ /// List graph transactions that are in `chain` with `chain_tip`.
///
- /// The supplied closure takes in two inputs `(depth, descendant_txid)`:
+ /// This is the infallible version of [`try_list_chain_txs`].
///
- /// * `depth` is the distance between the starting `txid` and the `descendant_txid`. I.e., if the
- /// descendant is spending an output of the starting `txid`; the `depth` will be 1.
- /// * `descendant_txid` is the descendant's txid which we are considering to walk.
+ /// [`try_list_chain_txs`]: Self::try_list_chain_txs
+ pub fn list_chain_txs<'a, C: ChainOracle + 'a>(
+ &'a self,
+ chain: &'a C,
+ chain_tip: BlockId,
+ ) -> impl Iterator<Item = CanonicalTx<'a, Transaction, A>> {
+ self.try_list_chain_txs(chain, chain_tip)
+ .map(|r| r.expect("oracle is infallible"))
+ }
+
+ /// List outputs that are in `chain` with `chain_tip`.
///
- /// The supplied closure returns an `Option<T>`, allowing the caller to map each node it vists
- /// and decide whether to visit descendants.
- pub fn walk_descendants<'g, F, O>(&'g self, txid: Txid, walk_map: F) -> TxDescendants<F>
- where
- F: FnMut(usize, Txid) -> Option<O> + 'g,
- {
- TxDescendants::new_exclude_root(self, txid, walk_map)
+ /// Floating ouputs are not iterated over.
+ ///
+ /// The `filter_predicate` should return true for outputs that we wish to iterate over.
+ ///
+ /// # Error
+ ///
+ /// A returned item can error if the [`ChainOracle`] implementation (`chain`) fails.
+ ///
+ /// If the [`ChainOracle`] is infallible, [`list_chain_txouts`] can be used instead.
+ ///
+ /// [`list_chain_txouts`]: Self::list_chain_txouts
+ pub fn try_list_chain_txouts<'a, C: ChainOracle + 'a>(
+ &'a self,
+ chain: &'a C,
+ chain_tip: BlockId,
+ ) -> impl Iterator<Item = Result<FullTxOut<ObservedAs<A>>, C::Error>> + 'a {
+ self.try_list_chain_txs(chain, chain_tip)
+ .flat_map(move |tx_res| match tx_res {
+ Ok(canonical_tx) => canonical_tx
+ .node
+ .output
+ .iter()
+ .enumerate()
+ .map(|(vout, txout)| {
+ let outpoint = OutPoint::new(canonical_tx.node.txid, vout as _);
+ Ok((outpoint, txout.clone(), canonical_tx.clone()))
+ })
+ .collect::<Vec<_>>(),
+ Err(err) => vec![Err(err)],
+ })
+ .map(move |res| -> Result<_, C::Error> {
+ let (
+ outpoint,
+ txout,
+ CanonicalTx {
+ observed_as,
+ node: tx_node,
+ },
+ ) = res?;
+ let chain_position = observed_as.cloned();
+ let spent_by = self
+ .try_get_chain_spend(chain, chain_tip, outpoint)?
+ .map(|(obs_as, txid)| (obs_as.cloned(), txid));
+ let is_on_coinbase = tx_node.tx.is_coin_base();
+ Ok(FullTxOut {
+ outpoint,
+ txout,
+ chain_position,
+ spent_by,
+ is_on_coinbase,
+ })
+ })
}
- /// Creates an iterator that both filters and maps conflicting transactions (this includes
- /// descendants of directly-conflicting transactions, which are also considered conflicts).
+ /// List outputs that are in `chain` with `chain_tip`.
///
- /// Refer to [`Self::walk_descendants`] for `walk_map` usage.
- pub fn walk_conflicts<'g, F, O>(&'g self, tx: &'g Transaction, walk_map: F) -> TxDescendants<F>
- where
- F: FnMut(usize, Txid) -> Option<O> + 'g,
- {
- let txids = self.direct_conflicts_of_tx(tx).map(|(_, txid)| txid);
- TxDescendants::from_multiple_include_root(self, txids, walk_map)
+ /// This is the infallible version of [`try_list_chain_txouts`].
+ ///
+ /// [`try_list_chain_txouts`]: Self::try_list_chain_txouts
+ pub fn list_chain_txouts<'a, C: ChainOracle<Error = Infallible> + 'a>(
+ &'a self,
+ chain: &'a C,
+ chain_tip: BlockId,
+ ) -> impl Iterator<Item = FullTxOut<ObservedAs<A>>> + 'a {
+ self.try_list_chain_txouts(chain, chain_tip)
+ .map(|r| r.expect("error in infallible"))
}
- /// Given a transaction, return an iterator of txids that directly conflict with the given
- /// transaction's inputs (spends). The conflicting txids are returned with the given
- /// transaction's vin (in which it conflicts).
+ /// List unspent outputs (UTXOs) that are in `chain` with `chain_tip`.
///
- /// Note that this only returns directly conflicting txids and does not include descendants of
- /// those txids (which are technically also conflicting).
- pub fn direct_conflicts_of_tx<'g>(
- &'g self,
- tx: &'g Transaction,
- ) -> impl Iterator<Item = (usize, Txid)> + '_ {
- let txid = tx.txid();
- tx.input
- .iter()
- .enumerate()
- .filter_map(move |(vin, txin)| self.spends.get(&txin.previous_output).zip(Some(vin)))
- .flat_map(|(spends, vin)| core::iter::repeat(vin).zip(spends.iter().cloned()))
- .filter(move |(_, conflicting_txid)| *conflicting_txid != txid)
+ /// Floating outputs are not iterated over.
+ ///
+ /// # Error
+ ///
+ /// An item can be an error if the [`ChainOracle`] implementation fails. If the oracle is
+ /// infallible, [`list_chain_unspents`] can be used instead.
+ ///
+ /// [`list_chain_unspents`]: Self::list_chain_unspents
+ pub fn try_list_chain_unspents<'a, C: ChainOracle + 'a>(
+ &'a self,
+ chain: &'a C,
+ chain_tip: BlockId,
+ ) -> impl Iterator<Item = Result<FullTxOut<ObservedAs<A>>, C::Error>> + 'a {
+ self.try_list_chain_txouts(chain, chain_tip)
+ .filter(|r| matches!(r, Ok(txo) if txo.spent_by.is_none()))
}
- /// Whether the graph has any transactions or outputs in it.
- pub fn is_empty(&self) -> bool {
- self.txs.is_empty()
+ /// List unspent outputs (UTXOs) that are in `chain` with `chain_tip`.
+ ///
+ /// This is the infallible version of [`try_list_chain_unspents`].
+ ///
+ /// [`try_list_chain_unspents`]: Self::try_list_chain_unspents
+ pub fn list_chain_unspents<'a, C: ChainOracle<Error = Infallible> + 'a>(
+ &'a self,
+ chain: &'a C,
+ static_block: BlockId,
+ ) -> impl Iterator<Item = FullTxOut<ObservedAs<A>>> + 'a {
+ self.try_list_chain_unspents(chain, static_block)
+ .map(|r| r.expect("error is infallible"))
}
}
@@ -994,19 +1977,38 @@
/// Refer to [module-level documentation] for more.
///
/// [module-level documentation]: crate::tx_graph
-#[derive(Debug, Clone, PartialEq, Default)]
+#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(
feature = "serde",
derive(serde::Deserialize, serde::Serialize),
- serde(crate = "serde_crate")
+ serde(
+ crate = "serde_crate",
+ bound(
+ deserialize = "A: Ord + serde::Deserialize<'de>",
+ serialize = "A: Ord + serde::Serialize",
+ )
+ )
)]
#[must_use]
-pub struct Additions {
+pub struct Additions<A = ()> {
pub tx: BTreeSet<Transaction>,
pub txout: BTreeMap<OutPoint, TxOut>,
+ pub anchors: BTreeSet<(A, Txid)>,
+ pub last_seen: BTreeMap<Txid, u64>,
}
-impl Additions {
+impl<A> Default for Additions<A> {
+ fn default() -> Self {
+ Self {
+ tx: Default::default(),
+ txout: Default::default(),
+ anchors: Default::default(),
+ last_seen: Default::default(),
+ }
+ }
+}
+
+impl<A> Additions<A> {
/// Returns true if the [`Additions`] is empty (no transactions or txouts).
pub fn is_empty(&self) -> bool {
self.tx.is_empty() && self.txout.is_empty()
@@ -1024,28 +2026,38 @@
})
.chain(self.txout.iter().map(|(op, txout)| (*op, txout)))
}
+}
- /// Appends the changes in `other` into self such that applying `self` afterward has the same
- /// effect as sequentially applying the original `self` and `other`.
- pub fn append(&mut self, mut other: Additions) {
+impl<A: Ord> Append for Additions<A> {
+ fn append(&mut self, mut other: Self) {
self.tx.append(&mut other.tx);
self.txout.append(&mut other.txout);
+ self.anchors.append(&mut other.anchors);
+
+ // last_seen timestamps should only increase
+ self.last_seen.extend(
+ other
+ .last_seen
+ .into_iter()
+ .filter(|(txid, update_ls)| self.last_seen.get(txid) < Some(update_ls))
+ .collect::<Vec<_>>(),
+ );
}
}
-impl AsRef<TxGraph> for TxGraph {
- fn as_ref(&self) -> &TxGraph {
+impl<A> AsRef<TxGraph<A>> for TxGraph<A> {
+ fn as_ref(&self) -> &TxGraph<A> {
self
}
}
-impl ForEachTxOut for Additions {
+impl<A> ForEachTxOut for Additions<A> {
fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut))) {
self.txouts().for_each(f)
}
}
-impl ForEachTxOut for TxGraph {
+impl<A> ForEachTxOut for TxGraph<A> {
fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut))) {
self.all_txouts().for_each(f)
}
@@ -1056,17 +2068,17 @@
/// This `struct` is created by the [`walk_descendants`] method of [`TxGraph`].
///
/// [`walk_descendants`]: TxGraph::walk_descendants
-pub struct TxDescendants<'g, F> {
- graph: &'g TxGraph,
+pub struct TxDescendants<'g, A, F> {
+ graph: &'g TxGraph<A>,
visited: HashSet<Txid>,
stack: Vec<(usize, Txid)>,
filter_map: F,
}
-impl<'g, F> TxDescendants<'g, F> {
+impl<'g, A, F> TxDescendants<'g, A, F> {
/// Creates a `TxDescendants` that includes the starting `txid` when iterating.
#[allow(unused)]
- pub(crate) fn new_include_root(graph: &'g TxGraph, txid: Txid, filter_map: F) -> Self {
+ pub(crate) fn new_include_root(graph: &'g TxGraph<A>, txid: Txid, filter_map: F) -> Self {
Self {
graph,
visited: Default::default(),
@@ -1076,7 +2088,7 @@
}
/// Creates a `TxDescendants` that excludes the starting `txid` when iterating.
- pub(crate) fn new_exclude_root(graph: &'g TxGraph, txid: Txid, filter_map: F) -> Self {
+ pub(crate) fn new_exclude_root(graph: &'g TxGraph<A>, txid: Txid, filter_map: F) -> Self {
let mut descendants = Self {
graph,
visited: Default::default(),
@@ -1089,7 +2101,11 @@
/// Creates a `TxDescendants` from multiple starting transactions that include the starting
/// `txid`s when iterating.
- pub(crate) fn from_multiple_include_root<I>(graph: &'g TxGraph, txids: I, filter_map: F) -> Self
+ pub(crate) fn from_multiple_include_root<I>(
+ graph: &'g TxGraph<A>,
+ txids: I,
+ filter_map: F,
+ ) -> Self
where
I: IntoIterator<Item = Txid>,
{
@@ -1104,7 +2120,11 @@
/// Creates a `TxDescendants` from multiple starting transactions that excludes the starting
/// `txid`s when iterating.
#[allow(unused)]
- pub(crate) fn from_multiple_exclude_root<I>(graph: &'g TxGraph, txids: I, filter_map: F) -> Self
+ pub(crate) fn from_multiple_exclude_root<I>(
+ graph: &'g TxGraph<A>,
+ txids: I,
+ filter_map: F,
+ ) -> Self
where
I: IntoIterator<Item = Txid>,
{
@@ -1121,7 +2141,7 @@
}
}
-impl<'g, F> TxDescendants<'g, F> {
+impl<'g, A, F> TxDescendants<'g, A, F> {
fn populate_stack(&mut self, depth: usize, txid: Txid) {
let spend_paths = self
.graph
@@ -1133,7 +2153,7 @@
}
}
-impl<'g, F, O> Iterator for TxDescendants<'g, F>
+impl<'g, A, F, O> Iterator for TxDescendants<'g, A, F>
where
F: FnMut(usize, Txid) -> Option<O>,
{
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/keychain_tracker_example_cli/lib.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/keychain_tracker_example_cli/lib.rs.html
index e4ed16e664..4feac7bbd4 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/keychain_tracker_example_cli/lib.rs.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/keychain_tracker_example_cli/lib.rs.html
@@ -705,7 +705,7 @@
Descriptor, DescriptorPublicKey,
},
sparse_chain::{self, ChainPosition},
- DescriptorExt, FullTxOut,
+ Append, DescriptorExt, FullTxOut,
};
use bdk_coin_select::{coin_select_bnb, CoinSelector, CoinSelectorOpt, WeightedValue};
use bdk_file_store::KeychainStore;
--
2.49.0