From: github-actions Date: Wed, 5 Jun 2024 02:21:26 +0000 (+0000) Subject: Publish autogenerated nightly docs X-Git-Url: http://internal-gitweb-vhost/script/%22https:/database/scripts/block/static/gitweb.css?a=commitdiff_plain;h=5ac744a49d97dad8b3462ebe6d58bd750fbabcc2;p=bitcoindevkit.org Publish autogenerated nightly docs --- diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/all.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/all.html index 884c95991b..39aaa3c2ae 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/all.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/all.html @@ -1 +1 @@ -List of all items in this crate
\ No newline at end of file +List of all items in this crate
\ 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 index 8b602141cb..3ecf18ea62 100644 --- 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 @@ -1,3 +1,3 @@ -bdk_chain::indexed_tx_graph - Rust

Module bdk_chain::indexed_tx_graph

source ·
Expand description

Contains the IndexedTxGraph and associated types. Refer to the +bdk_chain::indexed_tx_graph - Rust

Module bdk_chain::indexed_tx_graph

source ·
Expand description

Contains the IndexedTxGraph and associated types. Refer to the IndexedTxGraph documentation for more.

Structs§

Traits§

  • Utilities for indexing transaction data.
\ 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 index 690933bcee..d2d42096da 100644 --- 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 @@ -1,4 +1,4 @@ -IndexedTxGraph in bdk_chain::indexed_tx_graph - Rust

Struct bdk_chain::indexed_tx_graph::IndexedTxGraph

source ·
pub struct IndexedTxGraph<A, I> {
+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

The IndexedTxGraph combines a TxGraph and an Indexer implementation.

@@ -73,7 +73,7 @@ Irrelevant transactions in txs will be ignored.

Each inserted transaction’s anchor will be constructed from AnchorFromBlockPosition::from_block_position.

To only insert relevant transactions, use apply_block_relevant instead.

-

Trait Implementations§

source§

impl<A: Debug, I: Debug> Debug for IndexedTxGraph<A, I>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<A, I: Default> Default for IndexedTxGraph<A, I>

source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<A, I> Freeze for IndexedTxGraph<A, I>
where +

Trait Implementations§

source§

impl<A, I> AsRef<TxGraph<A>> for IndexedTxGraph<A, I>

source§

fn as_ref(&self) -> &TxGraph<A>

Converts this type into a shared reference of the (usually inferred) input type.
source§

impl<A: Debug, I: Debug> Debug for IndexedTxGraph<A, I>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<A, I: Default> Default for IndexedTxGraph<A, I>

source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<A, I> Freeze for IndexedTxGraph<A, I>
where I: Freeze,

§

impl<A, I> RefUnwindSafe for IndexedTxGraph<A, I>

§

impl<A, I> Send for IndexedTxGraph<A, I>
where diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/index.html index 2d1d06a80c..eafd573b9f 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/index.html @@ -1,2 +1,2 @@ -bdk_chain::spk_client - Rust

Module bdk_chain::spk_client

source ·
Expand description

Helper types for spk-based blockchain clients.

-

Structs§

  • Data required to perform a spk-based blockchain client full scan.
  • Data returned from a spk-based blockchain client full scan.
  • Data required to perform a spk-based blockchain client sync.
  • Data returned from a spk-based blockchain client sync.

Type Aliases§

  • A cache of Arc-wrapped full transactions, identified by their [Txid]s.
\ No newline at end of file +bdk_chain::spk_client - Rust

Module bdk_chain::spk_client

source ·
Expand description

Helper types for spk-based blockchain clients.

+

Structs§

  • Data required to perform a spk-based blockchain client full scan.
  • Data returned from a spk-based blockchain client full scan.
  • Data required to perform a spk-based blockchain client sync.
  • Data returned from a spk-based blockchain client sync.
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/sidebar-items.js index d9de5da8e1..71829127fb 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/sidebar-items.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/sidebar-items.js @@ -1 +1 @@ -window.SIDEBAR_ITEMS = {"struct":["FullScanRequest","FullScanResult","SyncRequest","SyncResult"],"type":["TxCache"]}; \ No newline at end of file +window.SIDEBAR_ITEMS = {"struct":["FullScanRequest","FullScanResult","SyncRequest","SyncResult"]}; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/struct.FullScanRequest.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/struct.FullScanRequest.html index efb3f3b51e..84c3e1bc4a 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/struct.FullScanRequest.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/struct.FullScanRequest.html @@ -1,6 +1,5 @@ -FullScanRequest in bdk_chain::spk_client - Rust

Struct bdk_chain::spk_client::FullScanRequest

source ·
pub struct FullScanRequest<K> {
+FullScanRequest in bdk_chain::spk_client - Rust

Struct bdk_chain::spk_client::FullScanRequest

source ·
pub struct FullScanRequest<K> {
     pub chain_tip: CheckPoint,
-    pub tx_cache: TxCache,
     pub spks_by_keychain: BTreeMap<K, Box<dyn Iterator<Item = (u32, ScriptBuf)> + Send>>,
 }
Expand description

Data required to perform a spk-based blockchain client full scan.

A client full scan iterates through all the scripts for the given keychains, fetching relevant @@ -9,15 +8,9 @@ generally only used when importing or restoring previously used keychains in whi used scripts is not known. The full scan process also updates the chain from the given CheckPoint.

Fields§

§chain_tip: CheckPoint

A checkpoint for the current LocalChain::tip. The full scan process will return a new chain update that extends this tip.

-
§tx_cache: TxCache

Cache of full transactions, so the chain-source can avoid re-fetching.

§spks_by_keychain: BTreeMap<K, Box<dyn Iterator<Item = (u32, ScriptBuf)> + Send>>

Iterators of script pubkeys indexed by the keychain index.

-

Implementations§

source§

impl<K: Ord + Clone> FullScanRequest<K>

source

pub fn from_chain_tip(chain_tip: CheckPoint) -> Self

Construct a new FullScanRequest from a given chain_tip.

-
source

pub fn cache_txs<T>(self, full_txs: impl IntoIterator<Item = (Txid, T)>) -> Self
where - T: Into<Arc<Transaction>>,

Add to the TxCache held by the request.

-

This consumes the SyncRequest and returns the updated one.

-
source

pub fn cache_graph_txs<A>(self, graph: &TxGraph<A>) -> Self

Add all transactions from TxGraph into the TxCache.

-

This consumes the SyncRequest and returns the updated one.

-
source

pub fn from_keychain_txout_index( +

Implementations§

source§

impl<K: Ord + Clone> FullScanRequest<K>

source

pub fn from_chain_tip(chain_tip: CheckPoint) -> Self

Construct a new FullScanRequest from a given chain_tip.

+
source

pub fn from_keychain_txout_index( chain_tip: CheckPoint, index: &KeychainTxOutIndex<K> ) -> Self
where @@ -25,26 +18,26 @@ The full scan process will return a new chain update that extends this tip.

Unbounded script pubkey iterators for each keychain (K) are extracted using KeychainTxOutIndex::all_unbounded_spk_iters and is used to populate the FullScanRequest.

-

source

pub fn set_spks_for_keychain( +

source

pub fn set_spks_for_keychain( self, keychain: K, spks: impl IntoIterator<IntoIter = impl Iterator<Item = (u32, ScriptBuf)> + Send + 'static> ) -> Self

Set the [Script]s for a given keychain.

This consumes the FullScanRequest and returns the updated one.

-
source

pub fn chain_spks_for_keychain( +

source

pub fn chain_spks_for_keychain( self, keychain: K, spks: impl IntoIterator<IntoIter = impl Iterator<Item = (u32, ScriptBuf)> + Send + 'static> ) -> Self

Chain on additional [Script]s that will be synced against.

This consumes the FullScanRequest and returns the updated one.

-
source

pub fn inspect_spks_for_all_keychains( +

source

pub fn inspect_spks_for_all_keychains( self, inspect: impl FnMut(K, u32, &Script) + Send + Sync + Clone + 'static ) -> Self
where K: Send + 'static,

Add a closure that will be called for every [Script] previously added to any keychain in this request.

This consumes the SyncRequest and returns the updated one.

-
source

pub fn inspect_spks_for_keychain( +

source

pub fn inspect_spks_for_keychain( self, keychain: K, inspect: impl FnMut(u32, &Script) + Send + Sync + 'static diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/struct.FullScanResult.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/struct.FullScanResult.html index 85f716c819..5d736d9069 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/struct.FullScanResult.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/struct.FullScanResult.html @@ -1,4 +1,4 @@ -FullScanResult in bdk_chain::spk_client - Rust

Struct bdk_chain::spk_client::FullScanResult

source ·
pub struct FullScanResult<K, A = ConfirmationTimeHeightAnchor> {
+FullScanResult in bdk_chain::spk_client - Rust

Struct bdk_chain::spk_client::FullScanResult

source ·
pub struct FullScanResult<K, A = ConfirmationTimeHeightAnchor> {
     pub graph_update: TxGraph<A>,
     pub chain_update: CheckPoint,
     pub last_active_indices: BTreeMap<K, u32>,
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/struct.SyncRequest.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/struct.SyncRequest.html
index eac1a5d639..3dfb9db580 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/struct.SyncRequest.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/struct.SyncRequest.html
@@ -1,6 +1,5 @@
-SyncRequest in bdk_chain::spk_client - Rust

Struct bdk_chain::spk_client::SyncRequest

source ·
pub struct SyncRequest {
+SyncRequest in bdk_chain::spk_client - Rust

Struct bdk_chain::spk_client::SyncRequest

source ·
pub struct SyncRequest {
     pub chain_tip: CheckPoint,
-    pub tx_cache: TxCache,
     pub spks: Box<dyn ExactSizeIterator<Item = ScriptBuf> + Send>,
     pub txids: Box<dyn ExactSizeIterator<Item = Txid> + Send>,
     pub outpoints: Box<dyn ExactSizeIterator<Item = OutPoint> + Send>,
@@ -9,62 +8,56 @@
 outpoints. The sync process also updates the chain from the given CheckPoint.

Fields§

§chain_tip: CheckPoint

A checkpoint for the current chain LocalChain::tip. The sync process will return a new chain update that extends this tip.

-
§tx_cache: TxCache

Cache of full transactions, so the chain-source can avoid re-fetching.

§spks: Box<dyn ExactSizeIterator<Item = ScriptBuf> + Send>

Transactions that spend from or to these indexed script pubkeys.

§txids: Box<dyn ExactSizeIterator<Item = Txid> + Send>

Transactions with these txids.

§outpoints: Box<dyn ExactSizeIterator<Item = OutPoint> + Send>

Transactions with these outpoints or spent from these outpoints.

-

Implementations§

source§

impl SyncRequest

source

pub fn from_chain_tip(cp: CheckPoint) -> Self

Construct a new SyncRequest from a given cp tip.

-
source

pub fn cache_txs<T>(self, full_txs: impl IntoIterator<Item = (Txid, T)>) -> Self
where - T: Into<Arc<Transaction>>,

Add to the TxCache held by the request.

-

This consumes the SyncRequest and returns the updated one.

-
source

pub fn cache_graph_txs<A>(self, graph: &TxGraph<A>) -> Self

Add all transactions from TxGraph into the TxCache.

-

This consumes the SyncRequest and returns the updated one.

-
source

pub fn set_spks( +

Implementations§

source§

impl SyncRequest

source

pub fn from_chain_tip(cp: CheckPoint) -> Self

Construct a new SyncRequest from a given cp tip.

+
source

pub fn set_spks( self, spks: impl IntoIterator<IntoIter = impl ExactSizeIterator<Item = ScriptBuf> + Send + 'static> ) -> Self

Set the [Script]s that will be synced against.

This consumes the SyncRequest and returns the updated one.

-
source

pub fn set_txids( +

source

pub fn set_txids( self, txids: impl IntoIterator<IntoIter = impl ExactSizeIterator<Item = Txid> + Send + 'static> ) -> Self

Set the [Txid]s that will be synced against.

This consumes the SyncRequest and returns the updated one.

-
source

pub fn set_outpoints( +

source

pub fn set_outpoints( self, outpoints: impl IntoIterator<IntoIter = impl ExactSizeIterator<Item = OutPoint> + Send + 'static> ) -> Self

Set the [OutPoint]s that will be synced against.

This consumes the SyncRequest and returns the updated one.

-
source

pub fn chain_spks( +

source

pub fn chain_spks( self, spks: impl IntoIterator<IntoIter = impl ExactSizeIterator<Item = ScriptBuf> + Send + 'static, Item = ScriptBuf> ) -> Self

Chain on additional [Script]s that will be synced against.

This consumes the SyncRequest and returns the updated one.

-
source

pub fn chain_txids( +

source

pub fn chain_txids( self, txids: impl IntoIterator<IntoIter = impl ExactSizeIterator<Item = Txid> + Send + 'static, Item = Txid> ) -> Self

Chain on additional [Txid]s that will be synced against.

This consumes the SyncRequest and returns the updated one.

-
source

pub fn chain_outpoints( +

source

pub fn chain_outpoints( self, outpoints: impl IntoIterator<IntoIter = impl ExactSizeIterator<Item = OutPoint> + Send + 'static, Item = OutPoint> ) -> Self

Chain on additional [OutPoint]s that will be synced against.

This consumes the SyncRequest and returns the updated one.

-
source

pub fn inspect_spks( +

source

pub fn inspect_spks( self, inspect: impl FnMut(&Script) + Send + Sync + 'static ) -> Self

Add a closure that will be called for [Script]s previously added to this request.

This consumes the SyncRequest and returns the updated one.

-
source

pub fn inspect_txids( +

source

pub fn inspect_txids( self, inspect: impl FnMut(&Txid) + Send + Sync + 'static ) -> Self

Add a closure that will be called for [Txid]s previously added to this request.

This consumes the SyncRequest and returns the updated one.

-
source

pub fn inspect_outpoints( +

source

pub fn inspect_outpoints( self, inspect: impl FnMut(&OutPoint) + Send + Sync + 'static ) -> Self

Add a closure that will be called for [OutPoint]s previously added to this request.

This consumes the SyncRequest and returns the updated one.

-
source

pub fn populate_with_revealed_spks<K: Clone + Ord + Debug + Send + Sync>( +

source

pub fn populate_with_revealed_spks<K: Clone + Ord + Debug + Send + Sync>( self, index: &KeychainTxOutIndex<K>, spk_range: impl RangeBounds<K> diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/struct.SyncResult.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/struct.SyncResult.html index 450b6b1da6..09d1a71604 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/struct.SyncResult.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/struct.SyncResult.html @@ -1,4 +1,4 @@ -SyncResult in bdk_chain::spk_client - Rust

Struct bdk_chain::spk_client::SyncResult

source ·
pub struct SyncResult<A = ConfirmationTimeHeightAnchor> {
+SyncResult in bdk_chain::spk_client - Rust

Struct bdk_chain::spk_client::SyncResult

source ·
pub struct SyncResult<A = ConfirmationTimeHeightAnchor> {
     pub graph_update: TxGraph<A>,
     pub chain_update: CheckPoint,
 }
Expand description

Data returned from a spk-based blockchain client sync.

diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/type.TxCache.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/type.TxCache.html deleted file mode 100644 index c02106a77d..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/spk_client/type.TxCache.html +++ /dev/null @@ -1,3 +0,0 @@ -TxCache in bdk_chain::spk_client - Rust

Type Alias bdk_chain::spk_client::TxCache

source ·
pub type TxCache = HashMap<Txid, Arc<Transaction>>;
Expand description

A cache of Arc-wrapped full transactions, identified by their [Txid]s.

-

This is used by the chain-source to avoid re-fetching full transactions.

-

Aliased Type§

struct TxCache { /* private fields */ }
\ 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 70d94cdc47..78b72bb01b 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,4 +1,4 @@ -TxGraph in bdk_chain::tx_graph - Rust

Struct bdk_chain::tx_graph::TxGraph

source ·
pub struct TxGraph<A = ()> { /* private fields */ }
Expand description

A graph of transactions and spends.

+TxGraph in bdk_chain::tx_graph - Rust

Struct bdk_chain::tx_graph::TxGraph

source ·
pub struct TxGraph<A = ()> { /* private fields */ }
Expand description

A graph of transactions and spends.

See the module-level documentation for more.

Implementations§

source§

impl<A> TxGraph<A>

source

pub 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.

@@ -276,7 +276,7 @@ used instead.

trust_predicate: impl FnMut(&OI, &Script) -> bool ) -> Balance

Get the total balance of outpoints that are in chain of chain_tip.

This is the infallible version of try_balance.

-

Trait Implementations§

source§

impl<A> AsRef<TxGraph<A>> for TxGraph<A>

source§

fn as_ref(&self) -> &TxGraph<A>

Converts this type into a shared reference of the (usually inferred) input type.
source§

impl<A: Clone> Clone for TxGraph<A>

source§

fn clone(&self) -> TxGraph<A>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<A: Debug> Debug for TxGraph<A>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<A> Default for TxGraph<A>

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<A: PartialEq> PartialEq for TxGraph<A>

source§

fn eq(&self, other: &TxGraph<A>) -> bool

This method tests for self and other values to be equal, and is used +

Trait Implementations§

source§

impl<A, I> AsRef<TxGraph<A>> for IndexedTxGraph<A, I>

source§

fn as_ref(&self) -> &TxGraph<A>

Converts this type into a shared reference of the (usually inferred) input type.
source§

impl<A> AsRef<TxGraph<A>> for TxGraph<A>

source§

fn as_ref(&self) -> &TxGraph<A>

Converts this type into a shared reference of the (usually inferred) input type.
source§

impl<A: Clone> Clone for TxGraph<A>

source§

fn clone(&self) -> TxGraph<A>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<A: Debug> Debug for TxGraph<A>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<A> Default for TxGraph<A>

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<A: PartialEq> PartialEq for TxGraph<A>

source§

fn eq(&self, other: &TxGraph<A>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<A> StructuralPartialEq for TxGraph<A>

Auto Trait Implementations§

§

impl<A> Freeze for TxGraph<A>

§

impl<A> RefUnwindSafe for TxGraph<A>
where A: RefUnwindSafe,

§

impl<A> Send for TxGraph<A>
where diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/all.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/all.html index df72b82fd6..1137197c92 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/all.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/all.html @@ -1 +1 @@ -List of all items in this crate
\ No newline at end of file +List of all items in this crate
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/bdk_electrum_client/struct.BdkElectrumClient.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/bdk_electrum_client/struct.BdkElectrumClient.html new file mode 100644 index 0000000000..b71a4377ff --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/bdk_electrum_client/struct.BdkElectrumClient.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../bdk_electrum/struct.BdkElectrumClient.html...

+ + + \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/bdk_electrum_client/struct.ElectrumFullScanResult.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/bdk_electrum_client/struct.ElectrumFullScanResult.html new file mode 100644 index 0000000000..b2554da080 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/bdk_electrum_client/struct.ElectrumFullScanResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../bdk_electrum/struct.ElectrumFullScanResult.html...

+ + + \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/bdk_electrum_client/struct.ElectrumSyncResult.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/bdk_electrum_client/struct.ElectrumSyncResult.html new file mode 100644 index 0000000000..23bae6b959 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/bdk_electrum_client/struct.ElectrumSyncResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../bdk_electrum/struct.ElectrumSyncResult.html...

+ + + \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/electrum_ext/struct.ElectrumFullScanResult.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/electrum_ext/struct.ElectrumFullScanResult.html deleted file mode 100644 index b2554da080..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/electrum_ext/struct.ElectrumFullScanResult.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Redirection - - -

Redirecting to ../../bdk_electrum/struct.ElectrumFullScanResult.html...

- - - \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/electrum_ext/struct.ElectrumSyncResult.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/electrum_ext/struct.ElectrumSyncResult.html deleted file mode 100644 index 23bae6b959..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/electrum_ext/struct.ElectrumSyncResult.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Redirection - - -

Redirecting to ../../bdk_electrum/struct.ElectrumSyncResult.html...

- - - \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/electrum_ext/trait.ElectrumExt.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/electrum_ext/trait.ElectrumExt.html deleted file mode 100644 index ba0451aac7..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/electrum_ext/trait.ElectrumExt.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Redirection - - -

Redirecting to ../../bdk_electrum/trait.ElectrumExt.html...

- - - \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/index.html index d4b0afba73..08d8a29824 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/index.html @@ -1,11 +1,12 @@ -bdk_electrum - Rust

Crate bdk_electrum

source ·
Expand description

This crate is used for updating structures of bdk_chain with data from an Electrum server.

-

The two primary methods are ElectrumExt::sync and ElectrumExt::full_scan. In most cases -ElectrumExt::sync is used to sync the transaction histories of scripts that the application +bdk_electrum - Rust

Crate bdk_electrum

source ·
Expand description

This crate is used for updating structures of bdk_chain with data from an Electrum server.

+

The two primary methods are BdkElectrumClient::sync and BdkElectrumClient::full_scan. In most cases +BdkElectrumClient::sync is used to sync the transaction histories of scripts that the application cares about, for example the scripts for all the receive addresses of a Wallet’s keychain that it -has shown a user. ElectrumExt::full_scan is meant to be used when importing or restoring a +has shown a user. BdkElectrumClient::full_scan is meant to be used when importing or restoring a keychain where the range of possibly used scripts is not known. In this case it is necessary to scan all keychain scripts until a number (the “stop gap”) of unused scripts is discovered. For a sync or full scan the user receives relevant blockchain data and output updates for bdk_chain.

Refer to example_electrum for a complete example.

-

Re-exports§

Structs§

Traits§

  • Trait to extend [electrum_client::Client] functionality.
\ No newline at end of file +

Re-exports§

Structs§

\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/sidebar-items.js index 77a99e21c4..7497493a32 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/sidebar-items.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/sidebar-items.js @@ -1 +1 @@ -window.SIDEBAR_ITEMS = {"struct":["ElectrumFullScanResult","ElectrumSyncResult"],"trait":["ElectrumExt"]}; \ No newline at end of file +window.SIDEBAR_ITEMS = {"struct":["BdkElectrumClient","ElectrumFullScanResult","ElectrumSyncResult"]}; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/struct.BdkElectrumClient.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/struct.BdkElectrumClient.html new file mode 100644 index 0000000000..0c6ffa1a46 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/struct.BdkElectrumClient.html @@ -0,0 +1,64 @@ +BdkElectrumClient in bdk_electrum - Rust

Struct bdk_electrum::BdkElectrumClient

source ·
pub struct BdkElectrumClient<E> {
+    pub inner: E,
+    /* private fields */
+}
Expand description

Wrapper around an [electrum_client::ElectrumApi] which includes an internal in-memory +transaction cache to avoid re-fetching already downloaded transactions.

+

Fields§

§inner: E

The internal [electrum_client::ElectrumApi]

+

Implementations§

source§

impl<E: ElectrumApi> BdkElectrumClient<E>

source

pub fn new(client: E) -> Self

Creates a new bdk client from a [electrum_client::ElectrumApi]

+
source

pub fn populate_tx_cache<A>(&self, tx_graph: impl AsRef<TxGraph<A>>)

Inserts transactions into the transaction cache so that the client will not fetch these +transactions.

+
source

pub fn fetch_tx(&self, txid: Txid) -> Result<Arc<Transaction>, Error>

Fetch transaction of given txid.

+

If it hits the cache it will return the cached version and avoid making the request.

+
source

pub fn transaction_broadcast(&self, tx: &Transaction) -> Result<Txid, Error>

Broadcasts a transaction to the network.

+

This is a re-export of [ElectrumApi::transaction_broadcast].

+
source

pub fn full_scan<K: Ord + Clone>( + &self, + request: FullScanRequest<K>, + stop_gap: usize, + batch_size: usize, + fetch_prev_txouts: bool +) -> Result<ElectrumFullScanResult<K>, Error>

Full scan the keychain scripts specified with the blockchain (via an Electrum client) and +returns updates for bdk_chain data structures.

+
    +
  • request: struct with data required to perform a spk-based blockchain client full scan, +see FullScanRequest
  • +
  • stop_gap: the full scan for each keychain stops after a gap of script pubkeys with no +associated transactions
  • +
  • batch_size: specifies the max number of script pubkeys to request for in a single batch +request
  • +
  • fetch_prev_txouts: specifies whether or not we want previous TxOuts for fee
  • +
+
source

pub fn sync( + &self, + request: SyncRequest, + batch_size: usize, + fetch_prev_txouts: bool +) -> Result<ElectrumSyncResult, Error>

Sync a set of scripts with the blockchain (via an Electrum client) for the data specified +and returns updates for bdk_chain data structures.

+
    +
  • request: struct with data required to perform a spk-based blockchain client sync, +see SyncRequest
  • +
  • batch_size: specifies the max number of script pubkeys to request for in a single batch +request
  • +
  • fetch_prev_txouts: specifies whether or not we want previous TxOuts for fee +calculation
  • +
+

If the scripts to sync are unknown, such as when restoring or importing a keychain that +may include scripts that have been used, use full_scan with the keychain.

+

Trait Implementations§

source§

impl<E: Debug> Debug for BdkElectrumClient<E>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<E> !Freeze for BdkElectrumClient<E>

§

impl<E> RefUnwindSafe for BdkElectrumClient<E>
where + E: RefUnwindSafe,

§

impl<E> Send for BdkElectrumClient<E>
where + E: Send,

§

impl<E> Sync for BdkElectrumClient<E>
where + E: Sync,

§

impl<E> Unpin for BdkElectrumClient<E>
where + E: Unpin,

§

impl<E> UnwindSafe for BdkElectrumClient<E>
where + E: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for T
where + U: From<T>,

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.

+
source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/struct.ElectrumFullScanResult.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/struct.ElectrumFullScanResult.html index 7fdceb3ad4..af7641afbe 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/struct.ElectrumFullScanResult.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/struct.ElectrumFullScanResult.html @@ -1,12 +1,12 @@ -ElectrumFullScanResult in bdk_electrum - Rust

Struct bdk_electrum::ElectrumFullScanResult

source ·
pub struct ElectrumFullScanResult<K>(/* private fields */);
Expand description

The result of ElectrumExt::full_scan.

+ElectrumFullScanResult in bdk_electrum - Rust

Struct bdk_electrum::ElectrumFullScanResult

source ·
pub struct ElectrumFullScanResult<K>(/* private fields */);
Expand description

The result of BdkElectrumClient::full_scan.

This can be transformed into a FullScanResult with either ConfirmationHeightAnchor or ConfirmationTimeHeightAnchor anchor types.

-

Implementations§

Auto Trait Implementations§

§

impl<K> Freeze for ElectrumFullScanResult<K>

§

impl<K> RefUnwindSafe for ElectrumFullScanResult<K>
where diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/struct.ElectrumSyncResult.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/struct.ElectrumSyncResult.html index e9179b3f00..473e7642e0 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/struct.ElectrumSyncResult.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/struct.ElectrumSyncResult.html @@ -1,12 +1,12 @@ -ElectrumSyncResult in bdk_electrum - Rust

Struct bdk_electrum::ElectrumSyncResult

source ·
pub struct ElectrumSyncResult(/* private fields */);
Expand description

The result of ElectrumExt::sync.

+ElectrumSyncResult in bdk_electrum - Rust

Struct bdk_electrum::ElectrumSyncResult

source ·
pub struct ElectrumSyncResult(/* private fields */);
Expand description

The result of BdkElectrumClient::sync.

This can be transformed into a SyncResult with either ConfirmationHeightAnchor or ConfirmationTimeHeightAnchor anchor types.

-

Implementations§

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/trait.ElectrumExt.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/trait.ElectrumExt.html deleted file mode 100644 index e173937b5b..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/trait.ElectrumExt.html +++ /dev/null @@ -1,52 +0,0 @@ -ElectrumExt in bdk_electrum - Rust

Trait bdk_electrum::ElectrumExt

source ·
pub trait ElectrumExt {
-    // Required methods
-    fn full_scan<K: Ord + Clone>(
-        &self,
-        request: FullScanRequest<K>,
-        stop_gap: usize,
-        batch_size: usize,
-        fetch_prev_txouts: bool
-    ) -> Result<ElectrumFullScanResult<K>, Error>;
-    fn sync(
-        &self,
-        request: SyncRequest,
-        batch_size: usize,
-        fetch_prev_txouts: bool
-    ) -> Result<ElectrumSyncResult, Error>;
-}
Expand description

Trait to extend [electrum_client::Client] functionality.

-

Required Methods§

source

fn full_scan<K: Ord + Clone>( - &self, - request: FullScanRequest<K>, - stop_gap: usize, - batch_size: usize, - fetch_prev_txouts: bool -) -> Result<ElectrumFullScanResult<K>, Error>

Full scan the keychain scripts specified with the blockchain (via an Electrum client) and -returns updates for bdk_chain data structures.

-
    -
  • request: struct with data required to perform a spk-based blockchain client full scan, -see FullScanRequest
  • -
  • stop_gap: the full scan for each keychain stops after a gap of script pubkeys with no -associated transactions
  • -
  • batch_size: specifies the max number of script pubkeys to request for in a single batch -request
  • -
  • fetch_prev_txouts: specifies whether or not we want previous TxOuts for fee -calculation
  • -
-
source

fn sync( - &self, - request: SyncRequest, - batch_size: usize, - fetch_prev_txouts: bool -) -> Result<ElectrumSyncResult, Error>

Sync a set of scripts with the blockchain (via an Electrum client) for the data specified -and returns updates for bdk_chain data structures.

-
    -
  • request: struct with data required to perform a spk-based blockchain client sync, -see SyncRequest
  • -
  • batch_size: specifies the max number of script pubkeys to request for in a single batch -request
  • -
  • fetch_prev_txouts: specifies whether or not we want previous TxOuts for fee -calculation
  • -
-

If the scripts to sync are unknown, such as when restoring or importing a keychain that -may include scripts that have been used, use full_scan with the keychain.

-

Object Safety§

This trait is not object safe.

Implementors§

source§

impl<E: ElectrumApi> ElectrumExt for E

\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_wallet/wallet/fn.wallet_name_from_descriptor.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_wallet/wallet/fn.wallet_name_from_descriptor.html index 77958946e3..dc8dccd17f 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_wallet/wallet/fn.wallet_name_from_descriptor.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_wallet/wallet/fn.wallet_name_from_descriptor.html @@ -1,4 +1,4 @@ -wallet_name_from_descriptor in bdk_wallet::wallet - Rust

Function bdk_wallet::wallet::wallet_name_from_descriptor

source ·
pub fn wallet_name_from_descriptor<T>(
+wallet_name_from_descriptor in bdk_wallet::wallet - Rust

Function bdk_wallet::wallet::wallet_name_from_descriptor

source ·
pub fn wallet_name_from_descriptor<T>(
     descriptor: T,
     change_descriptor: Option<T>,
     network: Network,
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_wallet/wallet/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_wallet/wallet/index.html
index 59d29fd813..11cab42e76 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_wallet/wallet/index.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_wallet/wallet/index.html
@@ -1,4 +1,4 @@
-bdk_wallet::wallet - Rust

Module bdk_wallet::wallet

source ·
Expand description

Wallet

+bdk_wallet::wallet - Rust

Module bdk_wallet::wallet

source ·
Expand description

Wallet

This module defines the Wallet.

Modules§

Structs§

  • A derived address and the index it was found at. For convenience this automatically derefs to Address
  • Balance, differentiated into various categories.
  • An update to Wallet.
  • A Bitcoin wallet

Enums§

Traits§

  • Trait to check if a value is below the dust limit. diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_wallet/wallet/struct.Wallet.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_wallet/wallet/struct.Wallet.html index b0c5cef78c..a72e268a05 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_wallet/wallet/struct.Wallet.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_wallet/wallet/struct.Wallet.html @@ -411,18 +411,18 @@ internal
    source§

    impl Wallet

    Methods to construct sync/full-scan requests for spk-based chain sources.

    -
    source

    pub fn start_sync_with_revealed_spks(&self) -> SyncRequest

    Create a partial SyncRequest for this wallet for all revealed spks.

    +
source§

impl Wallet

Methods to construct sync/full-scan requests for spk-based chain sources.

+
source

pub fn start_sync_with_revealed_spks(&self) -> SyncRequest

Create a partial SyncRequest for this wallet for all revealed spks.

This is the first step when performing a spk-based wallet partial sync, the returned SyncRequest collects all revealed script pubkeys from the wallet keychain needed to start a blockchain sync with a spk based blockchain client.

-
source

pub fn start_full_scan(&self) -> FullScanRequest<KeychainKind>

Create a `FullScanRequest for this wallet.

+
source

pub fn start_full_scan(&self) -> FullScanRequest<KeychainKind>

Create a `FullScanRequest for this wallet.

This is the first step when performing a spk-based wallet full scan, the returned `FullScanRequest collects iterators for the wallet’s keychain script pub keys needed to start a blockchain full scan with a spk based blockchain client.

This operation is generally only used when importing or restoring a previously used wallet in which the list of used scripts is not known.

-

Trait Implementations§

source§

impl AsRef<TxGraph<ConfirmationTimeHeightAnchor>> for Wallet

source§

fn as_ref(&self) -> &TxGraph<ConfirmationTimeHeightAnchor>

Converts this type into a shared reference of the (usually inferred) input type.
source§

impl Debug for Wallet

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where +

Trait Implementations§

source§

impl AsRef<TxGraph<ConfirmationTimeHeightAnchor>> for Wallet

source§

fn as_ref(&self) -> &TxGraph<ConfirmationTimeHeightAnchor>

Converts this type into a shared reference of the (usually inferred) input type.
source§

impl Debug for Wallet

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/index.html index f3a1e90733..fc27e23af3 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/index.html @@ -1,2 +1,2 @@ -example_cli - Rust

Crate example_cli

source ·

Re-exports§

  • pub use anyhow;
  • pub use bdk_file_store;
  • pub use clap;

Structs§

Enums§

Functions§

  • Parses command line arguments and initializes all components, creating +example_cli - Rust

    Crate example_cli

    source ·

    Re-exports§

    Structs§

    Enums§

    Functions§

    Type Aliases§

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/fn.main.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/fn.main.html index a0e96a282f..d61dd2103e 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/fn.main.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/fn.main.html @@ -1 +1 @@ -main in example_electrum - Rust

    Function example_electrum::main

    source ·
    pub(crate) fn main() -> Result<()>
    \ No newline at end of file +main in example_electrum - Rust

    Function example_electrum::main

    source ·
    pub(crate) fn main() -> Result<()>
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/index.html index 39d9ba5f12..3695de6e4d 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/index.html @@ -1 +1 @@ -example_electrum - Rust

    Crate example_electrum

    source ·

    Structs§

    Enums§

    Constants§

    Functions§

    Type Aliases§

    \ No newline at end of file +example_electrum - Rust

    Crate example_electrum

    source ·

    Structs§

    Enums§

    Constants§

    Functions§

    Type Aliases§

    \ 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 dcf43ac7b2..e5738923c8 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,8 +1,8 @@ var searchIndex = new Map(JSON.parse('[\ ["bdk_bitcoind_rpc",{"t":"KFFEONNNNNNONNNNNNMNNNNNNNNNNNN","n":["BitcoindRpcErrorExt","BlockEvent","Emitter","bitcoincore_rpc","block","block_hash","block_height","borrow","borrow","borrow_mut","borrow_mut","checkpoint","connected_to","fmt","from","from","into","into","is_not_found_error","mempool","new","next_block","next_header","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip"],"q":[[0,"bdk_bitcoind_rpc"],[31,"bitcoin::hash_types::newtypes"],[32,"bdk_chain::chain_data"],[33,"core::fmt"],[34,"bitcoin::blockdata::transaction"],[35,"alloc::vec"],[36,"bitcoincore_rpc::error"],[37,"core::result"],[38,"bitcoincore_rpc::client"],[39,"bdk_chain::local_chain"],[40,"bitcoin::blockdata::block"],[41,"core::option"],[42,"core::any"]],"i":[0,0,0,0,1,1,1,12,1,12,1,1,1,1,12,1,12,1,10,12,12,12,12,12,1,12,1,12,1,12,1],"f":"`````{{{d{{b{c}}}}}f{}}{{{d{{b{c}}}}}h{}}{{{d{c}}}{{d{e}}}{}{}}0{{{d{jc}}}{{d{je}}}{}{}}0`{{{d{{b{c}}}}}l{}}{{{d{{b{c}}}}{d{jn}}}A`Ab}{cc{}}0{ce{}{}}0{{{d{Ad}}}Af}{{{d{j{Ah{c}}}}}{{Bd{{B`{{An{AjAl}}}}Bb}}}Bf}{{{d{c}}Bhh}{{Ah{c}}}Bf}{{{d{j{Ah{c}}}}}{{Bd{{Bl{{b{Bj}}}}Bb}}}Bf}{{{d{j{Ah{c}}}}}{{Bd{{Bl{{b{Bn}}}}Bb}}}Bf}{c{{Bd{e}}}{}{}}000{{{d{c}}}C`{}}077","D":"Bd","p":[[5,"BlockEvent",0],[1,"reference"],[5,"BlockHash",31],[1,"u32"],[0,"mut"],[5,"BlockId",32],[5,"Formatter",33],[8,"Result",33],[10,"Debug",33],[10,"BitcoindRpcErrorExt",0],[1,"bool"],[5,"Emitter",0],[5,"Transaction",34],[1,"u64"],[1,"tuple"],[5,"Vec",35],[6,"Error",36],[6,"Result",37],[10,"RpcApi",38],[5,"CheckPoint",39],[5,"Block",40],[6,"Option",41],[5,"Header",40],[5,"TypeId",42]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAA0ABAAEAAAACAADAA4AAAAYAAcA"}],\ -["bdk_chain",{"t":"KKKSFSKGFGFPPKFRFEFFEPPNNMNNNOOMNNNNNENNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNONNNNNMNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNMNNNNNNOONNNNCNNNNNNNNNNNNMNNNMNONNNCCNENNNNNONNNNNNNNNNNNDNNNNNONCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNONNNNNNNNNNNNNNNNNNNNNNNOOOFRFKNNNMNNNNNNNNNNNNNNNNNNNNNNOOMMOMNNNNNNNNMNNNNNNNNNNNFFFNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNONNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNONNNNNFGPFIFFPFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNONNNNNNNFFFFINNNNNNNNNNNNNNNOONOONNNNNNNOONNNNNNNNNOONNNNNOONNNNNNNNOOONNNNNNNNGFFPPFFFFNNNOONNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNONOONNNNNNNNNNNNNNNNNN","n":["Anchor","AnchorFromBlockPosition","Append","BIP32_MAX_INDEX","BlockId","COINBASE_MATURITY","ChainOracle","ChainPosition","ConfirmationHeightAnchor","ConfirmationTime","ConfirmationTimeHeightAnchor","Confirmed","Confirmed","DescriptorExt","DescriptorId","Error","FullTxOut","IndexedTxGraph","SpkIterator","SpkTxOutIndex","TxGraph","Unconfirmed","Unconfirmed","all_spks","all_zeros","anchor_block","anchor_block","anchor_block","anchor_block","anchor_block","anchor_block","append","apply_changeset","as_byte_array","as_raw_hash","as_ref","as_ref","bitcoin","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","chain_position","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cloned","cmp","cmp","cmp","cmp","cmp","cmp","cmp","confirmation_height","confirmation_height","confirmation_height_upper_bound","confirmation_height_upper_bound","confirmation_height_upper_bound","confirmation_height_upper_bound","confirmation_height_upper_bound","confirmation_time","default","default","default","default","descriptor","descriptor_id","deserialize","deserialize","deserialize","deserialize","deserialize","dust_value","engine","eq","eq","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from_block_position","from_block_position","from_block_position","from_block_position","from_byte_array","from_engine","from_raw_hash","from_slice","from_slice_delegated","from_str","get_chain_tip","hash","hash","hash","hash","hash","hash","hash","height","index","index_of_spk","index_tx","index_txout","indexed_tx_graph","initial_changeset","insert_spk","into","into","into","into","into","into","into","into","into","into_iter","is_block_in_chain","is_confirmed","is_confirmed","is_confirmed_and_spendable","is_empty","is_mature","is_on_coinbase","is_relevant","is_tx_relevant","is_used","keychain","local_chain","mark_used","miniscript","net_value","new","new_with_range","next","nth","outpoint","outpoints","outputs_in_range","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","scan","scan_txout","sent_and_received","serde","serialize","serialize","serialize","serialize","serialize","spent_by","spk_at_index","spk_client","to_byte_array","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_raw_hash","to_string","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","tx_graph","txout","txout","txouts","txouts_in_tx","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","unconfirmed","unmark_used","unused_spks","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","height","last_seen","time","ChangeSet","ChangeSet","IndexedTxGraph","Indexer","append","apply_block","apply_block_relevant","apply_changeset","apply_changeset","apply_update","batch_insert_relevant","batch_insert_relevant_unconfirmed","batch_insert_unconfirmed","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","default","default","deserialize","eq","fmt","fmt","from","from","from","from","graph","graph","index","index_tx","index_txout","indexer","initial_changeset","initial_changeset","insert_anchor","insert_seen_at","insert_tx","insert_txout","into","into","is_empty","is_tx_relevant","new","serialize","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Balance","ChangeSet","KeychainTxOutIndex","add","all_unbounded_spk_iters","append","apply_changeset","apply_changeset","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","confirmed","default","default","default","deserialize","deserialize","eq","eq","fmt","fmt","fmt","fmt","from","from","from","get_descriptor","immature","index_of_spk","index_tx","index_txout","initial_changeset","inner","insert_descriptor","into","into","into","is_empty","is_tx_relevant","is_used","keychain_outpoints","keychain_outpoints_in_range","keychains","keychains_added","last_revealed","last_revealed_index","last_revealed_indices","last_used_index","last_used_indices","lookahead","lookahead_to_target","mark_used","net_value","new","next_index","next_unused_spk","outpoints","reveal_next_spk","reveal_to_target","reveal_to_target_multi","revealed_keychain_spks","revealed_spks","sent_and_received","serialize","serialize","spk_at_index","to_owned","to_owned","to_owned","to_string","total","trusted_pending","trusted_spendable","try_from","try_from","try_from","try_into","try_into","try_into","txout","txouts","txouts_in_tx","type_id","type_id","type_id","unbounded_spk_iter","unmark_used","untrusted_pending","unused_keychain_spks","unused_spks","vzip","vzip","vzip","AlterCheckPointError","ApplyHeaderError","CannotConnect","CannotConnectError","ChangeSet","CheckPoint","CheckPointIter","InconsistentBlocks","LocalChain","MissingGenesisError","apply_changeset","apply_header","apply_header_connected_to","apply_update","block_id","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","disconnect_from","eq","eq","eq","eq","eq","eq","extend","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from_block_ids","from_blocks","from_changeset","from_genesis_hash","from_header","from_tip","genesis_hash","get","get","get_chain_tip","hash","height","height","initial_changeset","insert","insert_block","into","into","into","into","into","into","into","into_iter","into_iter","is_block_in_chain","iter","iter_checkpoints","new","next","original_hash","prev","push","range","range","tip","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_include_height","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","update_hash","vzip","vzip","vzip","vzip","vzip","vzip","vzip","FullScanRequest","FullScanResult","SyncRequest","SyncResult","TxCache","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","cache_graph_txs","cache_graph_txs","cache_txs","cache_txs","chain_outpoints","chain_spks","chain_spks_for_keychain","chain_tip","chain_tip","chain_txids","chain_update","chain_update","from","from","from","from","from_chain_tip","from_chain_tip","from_keychain_txout_index","graph_update","graph_update","inspect_outpoints","inspect_spks","inspect_spks_for_all_keychains","inspect_spks_for_keychain","inspect_txids","into","into","into","into","last_active_indices","outpoints","populate_with_revealed_spks","set_outpoints","set_spks","set_spks_for_keychain","set_txids","spks","spks_by_keychain","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","tx_cache","tx_cache","txids","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","CalculateFeeError","CanonicalTx","ChangeSet","MissingTxOut","NegativeFee","TxAncestors","TxDescendants","TxGraph","TxNode","all_anchors","all_txouts","anchor_heights","anchors","anchors","append","apply_changeset","apply_update","as_ref","balance","batch_insert_unconfirmed","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","calculate_fee","chain_position","checked_sum","checked_sum","checked_sum","checked_sum","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmp","cmp","default","default","deref","deserialize","direct_conflicts","eq","eq","eq","eq","eq","filter_chain_txouts","filter_chain_unspents","floating_txouts","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","full_txs","get_chain_position","get_chain_spend","get_tx","get_tx_node","get_txout","initial_changeset","insert_anchor","insert_seen_at","insert_tx","insert_txout","into","into","into","into","into","into","into","into_iter","into_iter","is_empty","is_empty","last_seen","last_seen_unconfirmed","list_chain_txs","map_anchors","map_anchors","new","next","next","outspends","partial_cmp","partial_cmp","serialize","to_owned","to_owned","to_owned","to_owned","to_string","try_balance","try_filter_chain_txouts","try_filter_chain_unspents","try_from","try_from","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_into","try_into","try_list_chain_txs","tx","tx_node","tx_outputs","tx_spends","txid","txouts","txouts","txs","type_id","type_id","type_id","type_id","type_id","type_id","type_id","update_last_seen_unconfirmed","vzip","vzip","vzip","vzip","vzip","vzip","vzip","walk_ancestors","walk_conflicts","walk_descendants"],"q":[[0,"bdk_chain"],[269,"bdk_chain::ConfirmationTime"],[272,"bdk_chain::indexed_tx_graph"],[328,"bdk_chain::keychain"],[430,"bdk_chain::local_chain"],[572,"bdk_chain::spk_client"],[643,"bdk_chain::tx_graph"],[804,"bdk_chain::spk_txout_index"],[805,"bitcoin::blockdata::script::owned"],[806,"alloc::collections::btree::map"],[807,"core::clone"],[808,"core::cmp"],[809,"bdk_chain::descriptor_ext"],[810,"bdk_chain::tx_data_traits"],[811,"bdk_chain::chain_data"],[812,"bitcoin_hashes::sha256"],[813,"bdk_chain::spk_iter"],[814,"core::option"],[815,"miniscript::descriptor::key"],[816,"miniscript::descriptor"],[817,"core::borrow"],[818,"core::result"],[819,"serde::de"],[820,"core::fmt"],[821,"bitcoin::hash_types::newtypes"],[822,"bitcoin::blockdata::block"],[823,"bitcoin_hashes"],[824,"bdk_chain::chain_oracle"],[825,"core::hash"],[826,"core::slice::index"],[827,"bitcoin::blockdata::script::borrowed"],[828,"bitcoin::blockdata::transaction"],[829,"bitcoin::amount"],[830,"core::ops::range"],[831,"alloc::collections::btree::set"],[832,"core::iter::traits::double_ended"],[833,"serde::ser"],[834,"alloc::string"],[835,"core::iter::traits::exact_size"],[836,"core::any"],[837,"core::iter::traits::collect"],[838,"core::default"],[839,"bdk_chain::keychain::txout_index"],[840,"core::iter::traits::iterator"],[841,"alloc::sync"],[842,"core::convert"],[843,"core::marker"],[844,"core::ops::function"],[845,"std::collections::hash::set"]],"i":[0,0,0,0,0,0,0,0,0,0,0,19,20,0,0,46,0,0,0,0,0,19,20,1,7,8,9,10,11,10,11,13,1,7,7,7,7,0,1,19,20,9,10,11,21,7,7,22,1,19,20,9,10,11,21,7,22,21,1,19,20,9,10,11,21,7,22,1,19,20,9,10,11,21,7,22,19,19,20,9,10,11,21,7,10,11,8,8,19,10,11,11,1,9,10,11,22,29,20,9,10,11,7,29,7,19,20,9,10,11,21,7,1,19,20,9,10,11,21,7,7,7,7,1,19,20,20,9,9,9,10,11,21,7,7,22,42,9,10,11,7,7,7,7,7,7,46,19,20,9,10,11,7,9,9,7,1,1,1,0,1,1,1,19,20,9,10,11,21,7,22,22,46,19,20,21,13,21,21,1,1,1,0,0,1,0,1,22,22,22,22,21,1,1,19,20,9,10,11,21,7,1,1,1,0,20,9,10,11,7,21,1,0,7,1,19,20,9,10,11,21,7,22,7,7,1,19,20,9,10,11,21,7,22,1,19,20,9,10,11,21,7,22,0,1,21,1,1,1,19,20,9,10,11,21,7,22,20,1,1,1,19,20,9,10,11,21,7,22,105,106,105,0,68,0,0,66,67,67,68,67,67,67,67,67,67,66,67,66,66,66,67,66,66,66,67,66,67,66,66,66,67,66,67,68,68,66,68,67,67,67,67,67,67,66,66,68,67,66,66,67,66,67,66,67,66,67,66,0,0,0,77,78,75,78,78,75,78,77,75,78,77,75,78,77,75,78,77,77,75,78,77,75,77,75,77,75,78,77,77,75,78,77,78,77,78,78,78,78,78,78,75,78,77,75,78,78,78,78,78,75,75,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,75,77,78,75,78,77,77,77,77,77,75,78,77,75,78,77,78,78,78,75,78,77,78,78,77,78,78,75,78,77,0,0,84,0,0,0,0,84,0,0,79,79,79,79,85,87,85,79,81,86,83,84,87,85,79,81,86,83,84,85,79,81,86,83,84,85,79,81,86,83,84,79,85,79,81,86,83,84,85,85,79,81,81,86,86,83,83,84,84,87,85,79,81,86,83,84,85,79,79,79,85,79,79,85,79,79,85,85,86,79,85,79,87,85,79,81,86,83,84,87,85,79,85,79,85,87,86,85,85,85,79,79,85,79,81,86,83,84,81,86,83,84,87,85,79,81,86,83,84,83,87,85,79,81,86,83,84,87,85,79,81,86,83,84,86,87,85,79,81,86,83,84,0,0,0,0,0,89,107,90,108,89,107,90,108,89,90,89,90,89,89,90,89,90,89,107,108,89,107,90,108,89,90,90,107,108,89,89,90,90,89,89,107,90,108,108,89,89,89,89,90,89,89,90,89,107,90,108,89,107,90,108,89,90,89,89,107,90,108,89,107,90,108,0,0,0,99,99,0,0,0,0,70,70,74,100,74,74,70,70,70,70,70,102,103,70,100,101,99,74,102,103,70,100,101,99,74,70,101,102,102,103,103,70,100,101,74,70,100,101,74,100,101,70,74,100,74,70,70,100,101,99,74,70,70,70,70,100,101,99,99,74,102,103,70,100,101,99,74,70,70,70,70,70,70,70,70,70,70,70,102,103,70,100,101,99,74,102,103,70,74,74,100,70,70,74,70,102,103,70,100,101,74,70,100,101,74,99,70,70,70,102,103,70,100,101,99,74,70,70,102,103,70,100,101,99,74,70,100,101,70,70,100,74,74,74,102,103,70,100,101,99,74,70,102,103,70,100,101,99,74,70,70,70],"f":"```````````````````````{{{d{{b{c}}}}}{{d{{h{cf}}}}}{jl}}{{}n}{{{d{A`}}}Ab}{{{d{Ab}}}Ab}{{{d{Ad}}}Ab}{{{d{Af}}}Ab}``{{{d{AhAj}}Aj}Al}{{{d{Ah{b{c}}}}e}Al{jl}{}}{{{d{n}}}{{d{c}}}{}}{{{d{n}}}{{d{An}}}}{{{d{n}}}{{d{{Bb{B`}}}}}}{{{d{n}}}{{d{{Bd{B`}}}}}}`{{{d{c}}}{{d{e}}}{}{}}000000020{{{d{Ahc}}}{{d{Ahe}}}{}{}}00000000`{{{d{{b{c}}}}}{{b{c}}}j}{{{d{{Bf{c}}}}}{{Bf{c}}}j}{{{d{Bh}}}Bh}={{{d{Ad}}}Ad}{{{d{Af}}}Af}{{{d{{Bj{c}}}}}{{Bj{c}}}j}{{{d{n}}}n}{{{d{{Bl{c}}}}}{{Bl{c}}}j}{{{d{c}}{d{Ahe}}}Al{}{}}00000000{{{Bf{{d{c}}}}}{{Bf{c}}}j}{{{d{{Bf{c}}}}{d{{Bf{c}}}}}Bnl}{{{d{Bh}}{d{Bh}}}Bn}{{{d{Ab}}{d{Ab}}}Bn}{{{d{Ad}}{d{Ad}}}Bn}{{{d{Af}}{d{Af}}}Bn}{{{d{{Bj{c}}}}{d{{Bj{c}}}}}Bnl}{{{d{n}}{d{n}}}Bn}``{{{d{A`}}}C`}0{{{d{{Bf{c}}}}}{{Cb{C`}}}A`}{{{d{Ad}}}C`}{{{d{Af}}}C`}`{{}{{b{c}}}{}}{{}Ab}{{}Ad}{{}Af}{{{d{{Bl{c}}}}}{{d{c}}}{{Ch{{Cf{Cd}}}}}}{{{d{Cj}}}n}{c{{Cl{Bh}}}Cn}{c{{Cl{Ab}}}Cn}{c{{Cl{Ad}}}Cn}{c{{Cl{Af}}}Cn}{c{{Cl{n}}}Cn}{{{d{Cj}}}D`}{{}c{}}{{{d{{Bf{c}}}}{d{{Bf{c}}}}}DbDd}{{{d{Bh}}{d{Bh}}}Db}{{{d{Ab}}{d{Ab}}}Db}{{{d{Ad}}{d{Ad}}}Db}{{{d{Af}}{d{Af}}}Db}{{{d{{Bj{c}}}}{d{{Bj{c}}}}}DbDd}{{{d{n}}{d{n}}}Db}{{{d{{b{c}}}}{d{AhDf}}}DhDj}{{{d{{Bf{c}}}}{d{AhDf}}}DhDj}{{{d{Bh}}{d{AhDf}}}Dh}{{{d{Ab}}{d{AhDf}}}Dh}{{{d{Ad}}{d{AhDf}}}Dh}{{{d{Af}}{d{AhDf}}}Dh}{{{d{{Bj{c}}}}{d{AhDf}}}DhDj}{{{d{n}}{d{AhDf}}}Dh}000{cc{}}00{{{Bf{Af}}}Bh}{{{Dn{C`Dl}}}Ab}{{{Dn{{d{C`}}{d{Dl}}}}}Ab}33333{Ann}4{{{d{E`}}AbEb}Ed}{{{d{E`}}AbEb}Ab}{{{d{E`}}AbEb}Ad}{{{d{E`}}AbEb}Af}{cn{}}05{{{d{{Bb{B`}}}}}{{Cl{nEf}}}}0{{{d{Eh}}}{{Cl{nc}}}{}}{{{d{{El{}{{Ej{c}}}}}}}{{Cl{Abc}}}Dj}{{{d{{Bf{c}}}}{d{Ahe}}}AlEnF`}{{{d{Bh}}{d{Ahc}}}AlF`}{{{d{Ab}}{d{Ahc}}}AlF`}{{{d{Ad}}{d{Ahc}}}AlF`}{{{d{Af}}{d{Ahc}}}AlF`}{{{d{n}}{d{Ahc}}}AlF`}``{{{d{n}}c}{{d{e}}}{{Fb{{Bb{B`}}}}}{}}{{{d{{b{c}}}}{d{Fd}}}{{Cb{{d{c}}}}}{jl}}{{{d{Ah{b{c}}}}{d{Ff}}}e{jl}{}}{{{d{Ah{b{c}}}}Fh{d{Fj}}}e{jl}{}}`{{{d{{b{c}}}}}e{jl}{}}{{{d{Ah{b{c}}}}cf}Db{jl}}{ce{}{}}000000000{{{d{{El{}{{Ej{c}}}}}}AbAb}{{Cl{{Cb{Db}}c}}}Dj}{{{d{{Bf{c}}}}}Db{}}{{{d{Bh}}}Db}{{{d{{Bj{c}}}}C`}DbA`}{{{d{Aj}}}Db}1`{{{d{{b{c}}}}{d{Ff}}}Db{jl}}0{{{d{{b{c}}}}{d{c}}}Db{jl}}``{{{d{Ah{b{c}}}}{d{c}}}Db{jl}}`{{{d{{b{c}}}}{d{Ff}}e}Fl{jl}{{Fn{c}}}}{c{{Bl{c}}}{{Ch{{Cf{Cd}}}}}}{{ce}{{Bl{c}}}{{Ch{{Cf{Cd}}}}}{{Fn{C`}}}}{{{d{Ah{Bl{c}}}}}{{Cb{e}}}{{Ch{{Cf{Cd}}}}}{}}{{{d{Ah{Bl{c}}}}Eb}{{Cb{e}}}{{Ch{{Cf{Cd}}}}}{}}`{{{d{{b{c}}}}}{{d{{G`{{Dn{cFh}}}}}}}{jl}}{{{d{{b{c}}}}e}{{`{{Gd{}{{Gb{{Dn{{d{c}}Fh}}}}}}}}}{jl}{{Fn{c}}}}{{{d{{Bf{c}}}}{d{{Bf{c}}}}}{{Cb{Bn}}}Gf}{{{d{Bh}}{d{Bh}}}{{Cb{Bn}}}}{{{d{Ab}}{d{Ab}}}{{Cb{Bn}}}}{{{d{Ad}}{d{Ad}}}{{Cb{Bn}}}}{{{d{Af}}{d{Af}}}{{Cb{Bn}}}}{{{d{{Bj{c}}}}{d{{Bj{c}}}}}{{Cb{Bn}}}Gf}{{{d{n}}{d{n}}}{{Cb{Bn}}}}{{{d{Ah{b{c}}}}{d{Ff}}}{{G`{c}}}{jl}}{{{d{Ah{b{c}}}}Fh{d{Fj}}}{{Cb{{d{c}}}}}{jl}}{{{d{{b{c}}}}{d{Ff}}e}{{Dn{GhGh}}}{jl}{{Fn{c}}}}`{{{d{Bh}}c}ClGj}{{{d{Ab}}c}ClGj}{{{d{Ad}}c}ClGj}{{{d{Af}}c}ClGj}{{{d{n}}c}ClGj}`{{{d{{b{c}}}}{d{c}}}{{Cb{{d{Fd}}}}}{jl}}`{nc{}}{{{d{c}}}e{}{}}00000000{nAn}{{{d{c}}}Gl{}}{c{{Cl{e}}}{}{}}00000000000000000`{{{d{{b{c}}}}Fh}{{Cb{{Dn{{d{c}}{d{Fj}}}}}}}{jl}}`{{{d{{b{c}}}}}{{`{{Gd{}{{Gb{{Dn{{d{c}}Fh{d{Fj}}}}}}}}Gn}}}{jl}}{{{d{{b{c}}}}H`}{{`{{Gd{}{{Gb{{Dn{{d{c}}Fh{d{Fj}}}}}}}}}}}{jl}}{{{d{c}}}Hb{}}00000000{D`Bh}{{{d{Ah{b{c}}}}{d{c}}}Db{jl}}{{{d{{b{c}}}}e}{{`{{Gd{}{{Gb{{Dn{{d{c}}{d{Fd}}}}}}}}j}}}{jl}{{Fn{c}}}}{ce{}{}}00000000```````{{{d{Ah{Hd{ce}}}}{Hd{ce}}}AlA`Aj}{{{d{Ah{Hf{ce}}}}E`C`}{{Hd{c}}}{EdA`}Hh}{{{d{Ah{Hf{ce}}}}{d{E`}}C`}{{Hd{c}}}{EdA`}Hh}{{{d{Ah{Hh{}{{Hj{c}}}}}}c}Al{}}{{{d{Ah{Hf{ce}}}}{Hd{c}}}AlA`Hh}{{{d{Ah{Hf{ce}}}}{Hl{c}}}{{Hd{c}}}A`Hh}{{{d{Ah{Hf{ce}}}}i}{{Hd{c}}}A`Hh{{Hn{}{{Gb{c}}}}}{{Hn{}{{Gb{{Dn{{d{Ff}}g}}}}}}}}{{{d{Ah{Hf{ce}}}}g}{{Hd{c}}}A`Hh{{Hn{}{{Gb{{Dn{{d{Ff}}D`}}}}}}}}{{{d{Ah{Hf{ce}}}}g}{{Hd{c}}}A`Hh{{Hn{}{{Gb{{Dn{FfD`}}}}}}}}{{{d{c}}}{{d{e}}}{}{}}0{{{d{Ahc}}}{{d{Ahe}}}{}{}}0{{{d{{Hd{ce}}}}}{{Hd{ce}}}jj}{{{d{c}}{d{Ahe}}}Al{}{}}{{}{{Hf{ce}}}{}I`}{{}{{Hd{ce}}}{}I`}{c{{Cl{{Hd{eg}}}}}Cn{lIb}Ib}{{{d{{Hd{ce}}}}{d{{Hd{ce}}}}}DbDdDd}{{{d{{Hf{ce}}}}{d{AhDf}}}DhDjDj}{{{d{{Hd{ce}}}}{d{AhDf}}}DhDjDj}{cc{}}{{{Id{c}}}{{Hd{ce}}}{}I`}1{{{If{c}}}{{Hd{e{If{c}}}}}{}{}}{{{d{{Hf{ce}}}}}{{d{{Hl{c}}}}}{}{}}``{{{d{Ah{Hh{}{{Hj{c}}}}}}{d{Ff}}}c{}}{{{d{Ah{Hh{}{{Hj{c}}}}}}Fh{d{Fj}}}c{}}`{{{d{{Hh{}{{Hj{c}}}}}}}c{}}{{{d{{Hf{ce}}}}}{{Hd{c}}}A`Hh}{{{d{Ah{Hf{ce}}}}H`c}{{Hd{c}}}A`Hh}{{{d{Ah{Hf{ce}}}}H`D`}{{Hd{c}}}A`Hh}{{{d{Ah{Hf{ce}}}}Ff}{{Hd{c}}}A`Hh}{{{d{Ah{Hf{ce}}}}FhFj}{{Hd{c}}}A`Hh}{ce{}{}}0{{{d{{Hd{ce}}}}}DbA`Aj}{{{d{{Hh{}{{Hj{c}}}}}}{d{Ff}}}Db{}}{c{{Hf{ec}}}{}{}}{{{d{{Hd{ce}}}}g}Cl{lIh}IhGj}{{{d{c}}}e{}{}}{c{{Cl{e}}}{}{}}000{{{d{c}}}Hb{}}077```{{IjIj}Ij}{{{d{{Il{c}}}}}{{h{c{Bl{{Cf{Cd}}}}}}}{jlDj}}{{{d{Ah{If{c}}}}{If{c}}}All}{{{d{Ah{Il{c}}}}{If{c}}}Al{jlDj}}{{{d{Ah{Il{c}}}}e}Al{jlDj}{}}{{{d{c}}}{{d{e}}}{}{}}00{{{d{Ahc}}}{{d{Ahe}}}{}{}}00{{{d{{If{c}}}}}{{If{c}}}j}{{{d{{Il{c}}}}}{{Il{c}}}j}{{{d{Ij}}}Ij}{{{d{c}}{d{Ahe}}}Al{}{}}00`{{}{{If{c}}}{}}{{}{{Il{c}}}{}}{{}Ij}{c{{Cl{{If{e}}}}}Cn{lIb}}{c{{Cl{Ij}}}Cn}{{{d{{If{c}}}}{d{{If{c}}}}}DbDd}{{{d{Ij}}{d{Ij}}}Db}{{{d{{If{c}}}}{d{AhDf}}}DhDj}{{{d{{Il{c}}}}{d{AhDf}}}DhDj}{{{d{Ij}}{d{AhDf}}}Dh}0{cc{}}00{{{d{{Il{c}}}}{d{c}}}{{Cb{{d{{Cf{Cd}}}}}}}{jlDj}}`{{{d{{Il{c}}}}{d{Fd}}}{{Cb{{Dn{cC`}}}}}{jlDj}}{{{d{Ah{Il{c}}}}{d{Ff}}}e{jlDj}{}}{{{d{Ah{Il{c}}}}Fh{d{Fj}}}e{jlDj}{}}{{{d{{Il{c}}}}}e{jlDj}{}}{{{d{{Il{c}}}}}{{d{{b{{Dn{nC`}}}}}}}{jlDj}}{{{d{Ah{Il{c}}}}c{Cf{Cd}}}{{If{c}}}{jlDj}}{ce{}{}}00{{{d{{If{c}}}}}Dbl}{{{d{{Il{c}}}}{d{Ff}}}Db{jlDj}}{{{d{{Il{c}}}}cC`}Db{jlDj}}{{{d{{Il{c}}}}{d{c}}}{{`{{Gd{}{{Gb{{Dn{C`Fh}}}}}}}}}{jlDj}}{{{d{{Il{c}}}}e}{{`{{Gd{}{{Gb{{Dn{{d{c}}C`Fh}}}}}}}}}{jlDj}{{Fn{c}}}}{{{d{{Il{c}}}}}{{`{{Gd{}{{Gb{{Dn{{d{c}}{d{{Cf{Cd}}}}}}}}}}Gn}}}{jlDj}}``{{{d{{Il{c}}}}{d{c}}}{{Cb{C`}}}{jlDj}}{{{d{{Il{c}}}}}{{h{cC`}}}{jlDj}}10{{{d{{Il{c}}}}}C`{jlDj}}{{{d{Ah{Il{c}}}}{d{c}}C`}Al{jlDj}}{{{d{Ah{Il{c}}}}cC`}Db{jlDj}}{{{d{{Il{c}}}}{d{Ff}}e}Fl{jlDj}{{Fn{c}}}}{C`{{Il{c}}}{}}{{{d{{Il{c}}}}{d{c}}}{{Cb{{Dn{C`Db}}}}}{jlDj}}{{{d{Ah{Il{c}}}}{d{c}}}{{Cb{{Dn{{Dn{C`{d{Fd}}}}{If{c}}}}}}}{jlDj}}{{{d{{Il{c}}}}}{{`{{Gd{}{{Gb{{Dn{{Dn{cC`}}Fh}}}}}}}}}{jlDj}}1{{{d{Ah{Il{c}}}}{d{c}}C`}{{Cb{{Dn{{Bl{{Cf{Cd}}}}{If{c}}}}}}}{jlDj}}{{{d{Ah{Il{c}}}}{d{{h{cC`}}}}}{{Dn{{h{c{Bl{{Cf{Cd}}}}}}{If{c}}}}}{jlDj}}{{{d{{Il{c}}}}{d{c}}}{{`{{Gd{}{{Gb{{Dn{C`{d{Fd}}}}}}}}}}}{jlDj}}{{{d{{Il{c}}}}e}{{`{{Gd{}{{Gb{{Dn{{d{c}}C`{d{Fd}}}}}}}}j}}}{jlDj}{{Fn{c}}}}{{{d{{Il{c}}}}{d{Ff}}e}{{Dn{GhGh}}}{jlDj}{{Fn{c}}}}{{{d{{If{c}}}}e}Cl{lIh}Gj}{{{d{Ij}}c}ClGj}{{{d{{Il{c}}}}cC`}{{Cb{{d{Fd}}}}}{jlDj}}{{{d{c}}}e{}{}}00{{{d{c}}}Gl{}}{{{d{Ij}}}Gh}`0{c{{Cl{e}}}{}{}}00000{{{d{{Il{c}}}}Fh}{{Cb{{Dn{cC`{d{Fj}}}}}}}{jlDj}}{{{d{{Il{c}}}}}{{`{{Gd{}{{Gb{{Dn{cC`Fh{d{Fj}}}}}}}}}}}{jlDj}}{{{d{{Il{c}}}}H`}{{`{{Gd{}{{Gb{{Dn{cC`Fh{d{Fj}}}}}}}}}}}{jlDj}}{{{d{c}}}Hb{}}00{{{d{{Il{c}}}}{d{c}}}{{Cb{{Bl{{Cf{Cd}}}}}}}{jlDj}}{{{d{Ah{Il{c}}}}cC`}Db{jlDj}}`{{{d{{Il{c}}}}{d{c}}}{{`{{Gd{}{{Gb{{Dn{C`{d{Fd}}}}}}}}j}}}{jlDj}}{{{d{{Il{c}}}}}{{`{{Gd{}{{Gb{{Dn{cC`{d{Fd}}}}}}}}j}}}{jlDj}}{ce{}{}}00``````````{{{d{AhIn}}{d{J`}}}{{Cl{AlJb}}}}{{{d{AhIn}}{d{Jd}}C`}{{Cl{J`Jf}}}}{{{d{AhIn}}{d{Jd}}C`Ab}{{Cl{J`Jh}}}}{{{d{AhIn}}Jj}{{Cl{J`Jf}}}}{{{d{Jj}}}Ab}{{{d{c}}}{{d{e}}}{}{}}000000{{{d{Ahc}}}{{d{Ahe}}}{}{}}000000{{{d{Jj}}}Jj}{{{d{In}}}In}{{{d{Jb}}}Jb}{{{d{Jl}}}Jl}{{{d{Jf}}}Jf}{{{d{Jh}}}Jh}{{{d{c}}{d{Ahe}}}Al{}{}}00000{{{d{AhIn}}Ab}{{Cl{J`Jb}}}}{{{d{Jj}}{d{Jj}}}Db}{{{d{In}}{d{In}}}Db}{{{d{Jb}}{d{Jb}}}Db}{{{d{Jl}}{d{Jl}}}Db}{{{d{Jf}}{d{Jf}}}Db}{{{d{Jh}}{d{Jh}}}Db}{{Jjc}{{Cl{JjJj}}}{{Hn{}{{Gb{Ab}}}}}}{{{d{Jj}}{d{AhDf}}}Dh}{{{d{In}}{d{AhDf}}}Dh}{{{d{Jb}}{d{AhDf}}}Dh}0{{{d{Jl}}{d{AhDf}}}Dh}0{{{d{Jf}}{d{AhDf}}}Dh}0{{{d{Jh}}{d{AhDf}}}Dh}0{cc{}}000000{c{{Cl{Jj{Cb{Jj}}}}}{{Hn{}{{Gb{Ab}}}}}}{{{h{C`Dl}}}{{Cl{InJb}}}}{J`{{Cl{InJb}}}}{Dl{{Dn{InJ`}}}}{{{d{Jd}}C`}Jj}{Jj{{Cl{InJb}}}}{{{d{In}}}Dl}{{{d{Jj}}C`}{{Cb{Jj}}}}{{{d{In}}C`}{{Cb{Jj}}}}{{{d{In}}}{{Cl{Abc}}}{}}{{{d{Jj}}}Dl}{{{d{Jj}}}C`}`{{{d{In}}}J`}{{JjAb}Jj}{{{d{AhIn}}Ab}{{Cl{J`Jl}}}}{ce{}{}}0000000{Jjc{}}{{{d{In}}AbAb}{{Cl{{Cb{Db}}c}}}{}}{{{d{Jj}}}Jn}{{{d{In}}}Jn}{AbJj}{{{d{AhJn}}}{{Cb{c}}}{}}`{{{d{Jj}}}{{Cb{Jj}}}}{{JjAb}{{Cl{JjJj}}}}{{{d{Jj}}c}{{`{{K`{}{{Gb{Jj}}}}}}}{{Fn{C`}}}}{{{d{In}}c}{{`{{K`{}{{Gb{Jj}}}}}}}{{Fn{C`}}}}{{{d{In}}}Jj}{{{d{c}}}e{}{}}00000{{{d{c}}}Gl{}}000{c{{Cl{e}}}{}{}}000000`0000000{{{d{c}}}Hb{}}000000`???????`````{{{d{c}}}{{d{e}}}{}{}}000{{{d{Ahc}}}{{d{Ahe}}}{}{}}000{{Kb{d{{Hl{c}}}}}Kb{}}{{{Kd{c}}{d{{Hl{e}}}}}{{Kd{c}}}{lj}{}}{{Kbe}Kb{{Kh{{Kf{Ff}}}}}{{Hn{}{{Gb{{Dn{H`c}}}}}}}}{{{Kd{c}}g}{{Kd{c}}}{lj}{{Kh{{Kf{Ff}}}}}{{Hn{}{{Gb{{Dn{H`e}}}}}}}}{{Kbe}Kb{{Gn{}{{Gb{Fh}}}}Kj}{{Hn{}{{Kl{c}}{Gb{Fh}}}}}}{{Kbe}Kb{{Gn{}{{Gb{f}}}}Kj}{{Hn{}{{Kl{c}}{Gb{f}}}}}}{{{Kd{c}}cg}{{Kd{c}}}{lj}{{K`{}{{Gb{{Dn{C`f}}}}}}Kj}{{Hn{}{{Kl{e}}}}}}``{{Kbe}Kb{{Gn{}{{Gb{H`}}}}Kj}{{Hn{}{{Kl{c}}{Gb{H`}}}}}}``{cc{}}000{JjKb}{Jj{{Kd{c}}}{lj}}{{Jj{d{{Il{c}}}}}{{Kd{c}}}{Djlj}}``{{Kbc}Kb{{Kn{{d{Fh}}}}KjL`}}{{Kbc}Kb{{Kn{{d{Fd}}}}KjL`}}{{{Kd{c}}e}{{Kd{c}}}{Kjlj}{{Kn{cC`{d{Fd}}}}KjL`j}}{{{Kd{c}}ce}{{Kd{c}}}{Kjlj}{{Kn{C`{d{Fd}}}}KjL`}}{{Kbc}Kb{{Kn{{d{H`}}}}KjL`}}{ce{}{}}000``{{Kb{d{{Il{c}}}}e}Kb{jlDjKjL`}{{Fn{c}}}}{{Kbe}Kb{{Gn{}{{Gb{Fh}}}}Kj}{{Hn{}{{Kl{c}}}}}}{{Kbe}Kb{{Gn{}{{Gb{f}}}}Kj}{{Hn{}{{Kl{c}}}}}}>{{Kbe}Kb{{Gn{}{{Gb{H`}}}}Kj}{{Hn{}{{Kl{c}}}}}}``{c{{Cl{e}}}{}{}}0000000```{{{d{c}}}Hb{}}0006666`````````{{{d{{Hl{c}}}}}{{d{{G`{{Dn{cH`}}}}}}}{}}{{{d{{Hl{c}}}}}{{`{{K`{}{{Gb{{Dn{Fh{d{Fj}}}}}}}}}}}{}}{{{d{{Id{c}}}}}{{`{{K`{}{{Gb{C`}}}}}}}A`}``{{{d{Ah{Id{c}}}}{Id{c}}}All}{{{d{Ah{Hl{c}}}}{Id{c}}}Al{jl}}{{{d{Ah{Hl{c}}}}{Hl{c}}}{{Id{c}}}{jl}}{{{d{{Hl{c}}}}}{{d{{Hl{c}}}}}{}}{{{d{{Hl{c}}}}{d{e}}Abik}IjA`{{El{}{{Ej{Lb}}}}}j{{Hn{}{{Gb{{Dn{gFh}}}}}}}{{Kn{{d{g}}{d{Fd}}}{{Ld{Db}}}}}}{{{d{Ah{Hl{c}}}}e}{{Id{c}}}{jl}{{Hn{}{{Gb{{Dn{FfD`}}}}}}}}{{{d{c}}}{{d{e}}}{}{}}000000{{{d{Ahc}}}{{d{Ahe}}}{}{}}000000{{{d{{Hl{c}}}}{d{Ff}}}{{Cl{GhLf}}}{}}`{c{{Cb{Fl}}}{}}{c{{Cb{Gh}}}{}}01{{{d{{Hl{c}}}}}{{Hl{c}}}j}{{{d{{Lh{ce}}}}}{{Lh{ce}}}jj}{{{d{{Lj{ce}}}}}{{Lj{ce}}}jj}{{{d{{Id{c}}}}}{{Id{c}}}j}{{{d{c}}{d{Ahe}}}Al{}{}}000{{{d{{Lh{ce}}}}{d{{Lh{ce}}}}}Bnll}{{{d{{Lj{ce}}}}{d{{Lj{ce}}}}}Bnll}{{}{{Hl{c}}}{}}{{}{{Id{c}}}{}}{{{d{{Lh{ce}}}}}{{d{g}}}{}{}{}}{c{{Cl{{Id{e}}}}}Cn{lIb}}{{{d{{Hl{c}}}}{d{Ff}}}{{`{{K`{}{{Gb{{Dn{EbH`}}}}}}}}}{}}{{{d{{Hl{c}}}}{d{{Hl{c}}}}}DbDd}{{{d{{Lh{ce}}}}{d{{Lh{ce}}}}}DbDdDd}{{{d{{Lj{ce}}}}{d{{Lj{ce}}}}}DbDdDd}{{{d{Lf}}{d{Lf}}}Db}{{{d{{Id{c}}}}{d{{Id{c}}}}}DbDd}{{{d{{Hl{c}}}}{d{e}}Abi}{{`{{K`{}{{Gb{{Dn{g{Bj{c}}}}}}}}}}}A`{{El{}{{Ej{Lb}}}}}j{{Hn{}{{Gb{{Dn{gFh}}}}}}}}0{{{d{{Hl{c}}}}}{{`{{K`{}{{Gb{{Dn{Fh{d{Fj}}}}}}}}}}}{}}{{{d{{Hl{c}}}}{d{AhDf}}}DhDj}{{{d{{Lh{ce}}}}{d{AhDf}}}DhDjDj}{{{d{{Lj{ce}}}}{d{AhDf}}}DhDjDj}{{{d{Lf}}{d{AhDf}}}Dh}0{{{d{{Id{c}}}}{d{AhDf}}}DhDj}{cc{}}000000{{{d{{Hl{c}}}}}{{`{{K`{}{{Gb{{Lh{{Kf{Ff}}c}}}}}}}}}{}}{{{d{{Hl{c}}}}{d{e}}AbH`}{{Cb{{Bf{{d{c}}}}}}}A`{{El{}{{Ej{Lb}}}}}}{{{d{{Hl{c}}}}{d{e}}AbFh}{{Cb{{Dn{{Bf{{d{c}}}}H`}}}}}A`{{El{}{{Ej{Lb}}}}}}{{{d{{Hl{c}}}}H`}{{Cb{{Kf{Ff}}}}}{}}{{{d{{Hl{c}}}}H`}{{Cb{{Lh{{Kf{Ff}}c}}}}}{}}{{{d{{Hl{c}}}}Fh}{{Cb{{d{Fj}}}}}{}}{{{d{{Hl{c}}}}}{{Id{c}}}{jl}}{{{d{Ah{Hl{c}}}}H`c}{{Id{c}}}{jl}}{{{d{Ah{Hl{c}}}}H`D`}{{Id{c}}}{jl}}{{{d{Ah{Hl{c}}}}e}{{Id{c}}}{jl}{{Kh{{Kf{Ff}}}}}}{{{d{Ah{Hl{c}}}}FhFj}{{Id{c}}}{jl}}{ce{}{}}00000000{{{d{{Hl{c}}}}}Db{}}{{{d{{Id{c}}}}}Dbl}``{{{d{{Hl{c}}}}{d{e}}Ab}{{`{{K`{}{{Gb{{Lj{{Kf{Ff}}c}}}}}}}}}A`El}{{{Hl{c}}g}{{Hl{e}}}{jl}{jl}{{Kn{c}{{Ld{e}}}}}}{{{Id{c}}g}{{Id{e}}}ll{{Kn{c}{{Ld{e}}}}}}{c{{Hl{e}}}{{Hn{}{{Gb{Ff}}}}}{jl}}{{{d{Ah{Ll{cg}}}}}{{Cb{i}}}{}{}{{Kn{Eb{Kf{Ff}}}{{Ld{{Cb{e}}}}}}}{}}{{{d{Ah{Ln{cg}}}}}{{Cb{i}}}{}{}{{Kn{EbH`}{{Ld{{Cb{e}}}}}}}{}}{{{d{{Hl{c}}}}Fh}{{d{{M`{H`}}}}}{}}{{{d{{Lh{ce}}}}{d{{Lh{ce}}}}}{{Cb{Bn}}}GfGf}{{{d{{Lj{ce}}}}{d{{Lj{ce}}}}}{{Cb{Bn}}}GfGf}{{{d{{Id{c}}}}e}Cl{lIh}Gj}{{{d{c}}}e{}{}}000{{{d{c}}}Gl{}}{{{d{{Hl{c}}}}{d{e}}Abik}{{Cl{Ij}}}A`Elj{{Hn{}{{Gb{{Dn{gFh}}}}}}}{{Kn{{d{g}}{d{Fd}}}{{Ld{Db}}}}}}{{{d{{Hl{c}}}}{d{e}}Abi}{{`{{K`{}{{Gb{{Cl{{Dn{g{Bj{c}}}}}}}}}}}}}A`Elj{{Hn{}{{Gb{{Dn{gFh}}}}}}}}0{c{{Cl{e}}}{}{}}000000{{{d{{Hl{c}}}}{d{e}}AbH`}{{Cl{{Cb{{Bf{{d{c}}}}}}}}}A`El}{{{d{{Hl{c}}}}{d{e}}AbFh}{{Cl{{Cb{{Dn{{Bf{{d{c}}}}H`}}}}}}}A`El}2222222{{{d{{Hl{c}}}}{d{e}}Ab}{{`{{K`{}{{Gb{{Cl{{Lj{{Kf{Ff}}c}}}}}}}}}}}A`El}``{{{d{{Hl{c}}}}H`}{{Cb{{h{C`{d{Fj}}}}}}}{}}{{{d{{Hl{c}}}}H`}{{`{{Gd{}{{Gb{{Dn{C`{d{{M`{H`}}}}}}}}}}}}}{}}`{{{d{{Id{c}}}}}{{`{{K`{}{{Gb{{Dn{Fh{d{Fj}}}}}}}}}}}{}}``{{{d{c}}}Hb{}}000000{{{d{Ah{Hl{c}}}}D`}{{Id{c}}}{jl}}{ce{}{}}000000{{{d{{Hl{c}}}}ei}{{Ll{ci}}}{jl}{{Kh{{Kf{Ff}}}}}{}{{Kn{Eb{Kf{Ff}}}{{Ld{{Cb{g}}}}}}}}{{{d{{Hl{c}}}}{d{Ff}}g}{{Ln{cg}}}{}{}{{Kn{EbH`}{{Ld{{Cb{e}}}}}}}}{{{d{{Hl{c}}}}H`g}{{Ln{cg}}}{jl}{}{{Kn{EbH`}{{Ld{{Cb{e}}}}}}}}","D":"BMj","p":[[5,"SpkTxOutIndex",0,804],[1,"reference"],[5,"ScriptBuf",805],[5,"BTreeMap",806],[10,"Clone",807],[10,"Ord",808],[5,"DescriptorId",0,809],[10,"Anchor",0,810],[5,"BlockId",0,811],[5,"ConfirmationHeightAnchor",0,811],[5,"ConfirmationTimeHeightAnchor",0,811],[0,"mut"],[10,"Append",0,810],[1,"unit"],[5,"Hash",812],[1,"u8"],[1,"slice"],[1,"array"],[6,"ChainPosition",0,811],[6,"ConfirmationTime",0,811],[5,"FullTxOut",0,811],[5,"SpkIterator",0,813],[6,"Ordering",808],[1,"u32"],[6,"Option",814],[6,"DescriptorPublicKey",815],[6,"Descriptor",816],[10,"Borrow",817],[10,"DescriptorExt",0,809],[6,"Result",818],[10,"Deserializer",819],[1,"u64"],[1,"bool"],[10,"PartialEq",808],[5,"Formatter",820],[8,"Result",820],[10,"Debug",820],[5,"BlockHash",821],[1,"tuple"],[5,"Block",822],[1,"usize"],[10,"AnchorFromBlockPosition",0,810],[5,"FromSliceError",823],[1,"str"],[17,"Error"],[10,"ChainOracle",0,824],[10,"Hash",825],[10,"Hasher",825],[10,"SliceIndex",826],[5,"Script",827],[5,"Transaction",828],[5,"OutPoint",828],[5,"TxOut",828],[5,"SignedAmount",829],[10,"RangeBounds",830],[5,"BTreeSet",831],[17,"Item"],[10,"DoubleEndedIterator",832],[10,"PartialOrd",808],[5,"Amount",829],[10,"Serializer",833],[5,"String",834],[10,"ExactSizeIterator",835],[5,"Txid",821],[5,"TypeId",836],[5,"ChangeSet",272],[5,"IndexedTxGraph",272],[10,"Indexer",272],[17,"ChangeSet"],[5,"TxGraph",643],[10,"IntoIterator",837],[10,"Default",838],[10,"Deserialize",819],[5,"ChangeSet",643],[5,"ChangeSet",328,839],[10,"Serialize",833],[5,"Balance",328],[5,"KeychainTxOutIndex",328,839],[5,"LocalChain",430],[8,"ChangeSet",430],[5,"MissingGenesisError",430],[5,"Header",822],[5,"CannotConnectError",430],[6,"ApplyHeaderError",430],[5,"CheckPoint",430],[5,"AlterCheckPointError",430],[5,"CheckPointIter",430],[10,"Iterator",840],[5,"SyncRequest",572],[5,"FullScanRequest",572],[5,"Arc",841],[10,"Into",842],[10,"Send",843],[17,"IntoIter"],[10,"FnMut",844],[10,"Sync",843],[6,"Infallible",842],[17,"Output"],[6,"CalculateFeeError",643],[5,"TxNode",643],[5,"CanonicalTx",643],[5,"TxAncestors",643],[5,"TxDescendants",643],[5,"HashSet",845],[15,"Confirmed",269],[15,"Unconfirmed",269],[5,"SyncResult",572],[5,"FullScanResult",572]],"r":[[0,810],[1,810],[2,810],[3,813],[4,811],[6,824],[7,811],[8,811],[9,811],[10,811],[13,809],[14,809],[16,811],[17,272],[18,813],[19,804],[20,643],[329,839],[330,839]],"b":[[35,"impl-AsRef%3C%5Bu8%5D%3E-for-DescriptorId"],[36,"impl-AsRef%3C%5Bu8;+%3C%24hash+as+%24crate::Hash%3E::LEN%5D%3E-for-DescriptorId"],[119,"impl-Debug-for-DescriptorId"],[120,"impl-UpperHex-for-DescriptorId"],[121,"impl-LowerHex-for-DescriptorId"],[122,"impl-Display-for-DescriptorId"],[127,"impl-From%3C(u32,+BlockHash)%3E-for-BlockId"],[128,"impl-From%3C(%26u32,+%26BlockHash)%3E-for-BlockId"],[298,"impl-From%3CChangeSet%3CA%3E%3E-for-ChangeSet%3CA,+IA%3E"],[300,"impl-From%3CChangeSet%3CK%3E%3E-for-ChangeSet%3CA,+ChangeSet%3CK%3E%3E"],[334,"impl-KeychainTxOutIndex%3CK%3E"],[335,"impl-Indexer-for-KeychainTxOutIndex%3CK%3E"],[358,"impl-Display-for-Balance"],[359,"impl-Debug-for-Balance"],[481,"impl-Display-for-MissingGenesisError"],[482,"impl-Debug-for-MissingGenesisError"],[483,"impl-Display-for-AlterCheckPointError"],[484,"impl-Debug-for-AlterCheckPointError"],[485,"impl-Debug-for-CannotConnectError"],[486,"impl-Display-for-CannotConnectError"],[487,"impl-Debug-for-ApplyHeaderError"],[488,"impl-Display-for-ApplyHeaderError"],[709,"impl-Display-for-CalculateFeeError"],[710,"impl-Debug-for-CalculateFeeError"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAALcBSAASAAAAFQAAABkAAAAbAAIAIQABACQAFQA7ABEATgAGAFoAAQBdAAMAYwAEAGkAEgB/AAIAhwAAAIoABACQAAIAlAAFAJwAAACeAAEAoQAAAKwAAAC1AAAAugAAAL4AAQDDAAYAzQAFANYACQDhABIA+QAIAAUBCAAVAQAAHgELACsBAAAtAQAAPAEAAD8BCQBMAQAAUAEMAF4BCgBvAQIAeAEAAJEBAQCUAQMAmwEFAKQBAgCsAQIAvgEZANkBBQDgAQkA+gEAAAgCAgAOAgAAFQIQACcCDQA2AgYAQgIHAHECBwB8AgcAkgIAAJUCAACYAg0AqAIRALsCBADDAgUA4gIBAOUCAADsAgEA7wIHAPoCBgADAwYAEwMGABsDBgA="}],\ +["bdk_chain",{"t":"KKKSFSKGFGFPPKFRFEFFEPPNNMNNNOOMNNNNNENNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNONNNNNMNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNMNNNNNNOONNNNCNNNNNNNNNNNNMNNNMNONNNCCNENNNNNONNNNNNNNNNNNDNNNNNONCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNONNNNNNNNNNNNNNNNNNNNNNNOOOFRFKNNNMNNNNNNNNNNNNNNNNNNNNNNNOOMMOMNNNNNNNNMNNNNNNNNNNNFFFNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNONNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNONNNNNFGPFIFFPFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNONNNNNNNFFFFNNNNNNNNNNNOONOONNNNNNNOONNNNNNNNNOONNNNNOONNNNNNNNONNNNNNNNGFFPPFFFFNNNOONNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNONOONNNNNNNNNNNNNNNNNN","n":["Anchor","AnchorFromBlockPosition","Append","BIP32_MAX_INDEX","BlockId","COINBASE_MATURITY","ChainOracle","ChainPosition","ConfirmationHeightAnchor","ConfirmationTime","ConfirmationTimeHeightAnchor","Confirmed","Confirmed","DescriptorExt","DescriptorId","Error","FullTxOut","IndexedTxGraph","SpkIterator","SpkTxOutIndex","TxGraph","Unconfirmed","Unconfirmed","all_spks","all_zeros","anchor_block","anchor_block","anchor_block","anchor_block","anchor_block","anchor_block","append","apply_changeset","as_byte_array","as_raw_hash","as_ref","as_ref","bitcoin","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","chain_position","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cloned","cmp","cmp","cmp","cmp","cmp","cmp","cmp","confirmation_height","confirmation_height","confirmation_height_upper_bound","confirmation_height_upper_bound","confirmation_height_upper_bound","confirmation_height_upper_bound","confirmation_height_upper_bound","confirmation_time","default","default","default","default","descriptor","descriptor_id","deserialize","deserialize","deserialize","deserialize","deserialize","dust_value","engine","eq","eq","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from_block_position","from_block_position","from_block_position","from_block_position","from_byte_array","from_engine","from_raw_hash","from_slice","from_slice_delegated","from_str","get_chain_tip","hash","hash","hash","hash","hash","hash","hash","height","index","index_of_spk","index_tx","index_txout","indexed_tx_graph","initial_changeset","insert_spk","into","into","into","into","into","into","into","into","into","into_iter","is_block_in_chain","is_confirmed","is_confirmed","is_confirmed_and_spendable","is_empty","is_mature","is_on_coinbase","is_relevant","is_tx_relevant","is_used","keychain","local_chain","mark_used","miniscript","net_value","new","new_with_range","next","nth","outpoint","outpoints","outputs_in_range","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","scan","scan_txout","sent_and_received","serde","serialize","serialize","serialize","serialize","serialize","spent_by","spk_at_index","spk_client","to_byte_array","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_raw_hash","to_string","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","tx_graph","txout","txout","txouts","txouts_in_tx","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","unconfirmed","unmark_used","unused_spks","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","height","last_seen","time","ChangeSet","ChangeSet","IndexedTxGraph","Indexer","append","apply_block","apply_block_relevant","apply_changeset","apply_changeset","apply_update","as_ref","batch_insert_relevant","batch_insert_relevant_unconfirmed","batch_insert_unconfirmed","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","default","default","deserialize","eq","fmt","fmt","from","from","from","from","graph","graph","index","index_tx","index_txout","indexer","initial_changeset","initial_changeset","insert_anchor","insert_seen_at","insert_tx","insert_txout","into","into","is_empty","is_tx_relevant","new","serialize","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Balance","ChangeSet","KeychainTxOutIndex","add","all_unbounded_spk_iters","append","apply_changeset","apply_changeset","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","confirmed","default","default","default","deserialize","deserialize","eq","eq","fmt","fmt","fmt","fmt","from","from","from","get_descriptor","immature","index_of_spk","index_tx","index_txout","initial_changeset","inner","insert_descriptor","into","into","into","is_empty","is_tx_relevant","is_used","keychain_outpoints","keychain_outpoints_in_range","keychains","keychains_added","last_revealed","last_revealed_index","last_revealed_indices","last_used_index","last_used_indices","lookahead","lookahead_to_target","mark_used","net_value","new","next_index","next_unused_spk","outpoints","reveal_next_spk","reveal_to_target","reveal_to_target_multi","revealed_keychain_spks","revealed_spks","sent_and_received","serialize","serialize","spk_at_index","to_owned","to_owned","to_owned","to_string","total","trusted_pending","trusted_spendable","try_from","try_from","try_from","try_into","try_into","try_into","txout","txouts","txouts_in_tx","type_id","type_id","type_id","unbounded_spk_iter","unmark_used","untrusted_pending","unused_keychain_spks","unused_spks","vzip","vzip","vzip","AlterCheckPointError","ApplyHeaderError","CannotConnect","CannotConnectError","ChangeSet","CheckPoint","CheckPointIter","InconsistentBlocks","LocalChain","MissingGenesisError","apply_changeset","apply_header","apply_header_connected_to","apply_update","block_id","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","disconnect_from","eq","eq","eq","eq","eq","eq","extend","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from_block_ids","from_blocks","from_changeset","from_genesis_hash","from_header","from_tip","genesis_hash","get","get","get_chain_tip","hash","height","height","initial_changeset","insert","insert_block","into","into","into","into","into","into","into","into_iter","into_iter","is_block_in_chain","iter","iter_checkpoints","new","next","original_hash","prev","push","range","range","tip","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_include_height","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","update_hash","vzip","vzip","vzip","vzip","vzip","vzip","vzip","FullScanRequest","FullScanResult","SyncRequest","SyncResult","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","chain_outpoints","chain_spks","chain_spks_for_keychain","chain_tip","chain_tip","chain_txids","chain_update","chain_update","from","from","from","from","from_chain_tip","from_chain_tip","from_keychain_txout_index","graph_update","graph_update","inspect_outpoints","inspect_spks","inspect_spks_for_all_keychains","inspect_spks_for_keychain","inspect_txids","into","into","into","into","last_active_indices","outpoints","populate_with_revealed_spks","set_outpoints","set_spks","set_spks_for_keychain","set_txids","spks","spks_by_keychain","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","txids","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","CalculateFeeError","CanonicalTx","ChangeSet","MissingTxOut","NegativeFee","TxAncestors","TxDescendants","TxGraph","TxNode","all_anchors","all_txouts","anchor_heights","anchors","anchors","append","apply_changeset","apply_update","as_ref","balance","batch_insert_unconfirmed","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","calculate_fee","chain_position","checked_sum","checked_sum","checked_sum","checked_sum","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmp","cmp","default","default","deref","deserialize","direct_conflicts","eq","eq","eq","eq","eq","filter_chain_txouts","filter_chain_unspents","floating_txouts","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","full_txs","get_chain_position","get_chain_spend","get_tx","get_tx_node","get_txout","initial_changeset","insert_anchor","insert_seen_at","insert_tx","insert_txout","into","into","into","into","into","into","into","into_iter","into_iter","is_empty","is_empty","last_seen","last_seen_unconfirmed","list_chain_txs","map_anchors","map_anchors","new","next","next","outspends","partial_cmp","partial_cmp","serialize","to_owned","to_owned","to_owned","to_owned","to_string","try_balance","try_filter_chain_txouts","try_filter_chain_unspents","try_from","try_from","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_into","try_into","try_list_chain_txs","tx","tx_node","tx_outputs","tx_spends","txid","txouts","txouts","txs","type_id","type_id","type_id","type_id","type_id","type_id","type_id","update_last_seen_unconfirmed","vzip","vzip","vzip","vzip","vzip","vzip","vzip","walk_ancestors","walk_conflicts","walk_descendants"],"q":[[0,"bdk_chain"],[269,"bdk_chain::ConfirmationTime"],[272,"bdk_chain::indexed_tx_graph"],[329,"bdk_chain::keychain"],[431,"bdk_chain::local_chain"],[573,"bdk_chain::spk_client"],[637,"bdk_chain::tx_graph"],[798,"bdk_chain::spk_txout_index"],[799,"bitcoin::blockdata::script::owned"],[800,"alloc::collections::btree::map"],[801,"core::clone"],[802,"core::cmp"],[803,"bdk_chain::descriptor_ext"],[804,"bdk_chain::tx_data_traits"],[805,"bdk_chain::chain_data"],[806,"bitcoin_hashes::sha256"],[807,"bdk_chain::spk_iter"],[808,"core::option"],[809,"miniscript::descriptor::key"],[810,"miniscript::descriptor"],[811,"core::borrow"],[812,"core::result"],[813,"serde::de"],[814,"core::fmt"],[815,"bitcoin::hash_types::newtypes"],[816,"bitcoin::blockdata::block"],[817,"bitcoin_hashes"],[818,"bdk_chain::chain_oracle"],[819,"core::hash"],[820,"core::slice::index"],[821,"bitcoin::blockdata::script::borrowed"],[822,"bitcoin::blockdata::transaction"],[823,"bitcoin::amount"],[824,"core::ops::range"],[825,"alloc::collections::btree::set"],[826,"core::iter::traits::double_ended"],[827,"serde::ser"],[828,"alloc::string"],[829,"core::iter::traits::exact_size"],[830,"core::any"],[831,"core::iter::traits::collect"],[832,"core::default"],[833,"bdk_chain::keychain::txout_index"],[834,"core::iter::traits::iterator"],[835,"core::marker"],[836,"core::ops::function"],[837,"core::convert"],[838,"alloc::sync"],[839,"std::collections::hash::set"]],"i":[0,0,0,0,0,0,0,0,0,0,0,19,20,0,0,46,0,0,0,0,0,19,20,1,7,8,9,10,11,10,11,13,1,7,7,7,7,0,1,19,20,9,10,11,21,7,7,22,1,19,20,9,10,11,21,7,22,21,1,19,20,9,10,11,21,7,22,1,19,20,9,10,11,21,7,22,19,19,20,9,10,11,21,7,10,11,8,8,19,10,11,11,1,9,10,11,22,29,20,9,10,11,7,29,7,19,20,9,10,11,21,7,1,19,20,9,10,11,21,7,7,7,7,1,19,20,20,9,9,9,10,11,21,7,7,22,42,9,10,11,7,7,7,7,7,7,46,19,20,9,10,11,7,9,9,7,1,1,1,0,1,1,1,19,20,9,10,11,21,7,22,22,46,19,20,21,13,21,21,1,1,1,0,0,1,0,1,22,22,22,22,21,1,1,19,20,9,10,11,21,7,1,1,1,0,20,9,10,11,7,21,1,0,7,1,19,20,9,10,11,21,7,22,7,7,1,19,20,9,10,11,21,7,22,1,19,20,9,10,11,21,7,22,0,1,21,1,1,1,19,20,9,10,11,21,7,22,20,1,1,1,19,20,9,10,11,21,7,22,105,106,105,0,68,0,0,66,67,67,68,67,67,67,67,67,67,67,66,67,66,66,66,67,66,66,66,67,66,67,66,66,66,67,66,67,68,68,66,68,67,67,67,67,67,67,66,66,68,67,66,66,67,66,67,66,67,66,67,66,0,0,0,77,78,75,78,78,75,78,77,75,78,77,75,78,77,75,78,77,77,75,78,77,75,77,75,77,75,78,77,77,75,78,77,78,77,78,78,78,78,78,78,75,78,77,75,78,78,78,78,78,75,75,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,75,77,78,75,78,77,77,77,77,77,75,78,77,75,78,77,78,78,78,75,78,77,78,78,77,78,78,75,78,77,0,0,84,0,0,0,0,84,0,0,79,79,79,79,85,87,85,79,81,86,83,84,87,85,79,81,86,83,84,85,79,81,86,83,84,85,79,81,86,83,84,79,85,79,81,86,83,84,85,85,79,81,81,86,86,83,83,84,84,87,85,79,81,86,83,84,85,79,79,79,85,79,79,85,79,79,85,85,86,79,85,79,87,85,79,81,86,83,84,87,85,79,85,79,85,87,86,85,85,85,79,79,85,79,81,86,83,84,81,86,83,84,87,85,79,81,86,83,84,83,87,85,79,81,86,83,84,87,85,79,81,86,83,84,86,87,85,79,81,86,83,84,0,0,0,0,89,107,92,108,89,107,92,108,89,89,92,89,92,89,107,108,89,107,92,108,89,92,92,107,108,89,89,92,92,89,89,107,92,108,108,89,89,89,89,92,89,89,92,89,107,92,108,89,107,92,108,89,89,107,92,108,89,107,92,108,0,0,0,97,97,0,0,0,0,70,70,74,98,74,74,70,70,70,70,70,102,103,70,98,99,97,74,102,103,70,98,99,97,74,70,99,102,102,103,103,70,98,99,74,70,98,99,74,98,99,70,74,98,74,70,70,98,99,97,74,70,70,70,70,98,99,97,97,74,102,103,70,98,99,97,74,70,70,70,70,70,70,70,70,70,70,70,102,103,70,98,99,97,74,102,103,70,74,74,98,70,70,74,70,102,103,70,98,99,74,70,98,99,74,97,70,70,70,102,103,70,98,99,97,74,70,70,102,103,70,98,99,97,74,70,98,99,70,70,98,74,74,74,102,103,70,98,99,97,74,70,102,103,70,98,99,97,74,70,70,70],"f":"```````````````````````{{{d{{b{c}}}}}{{d{{h{cf}}}}}{jl}}{{}n}{{{d{A`}}}Ab}{{{d{Ab}}}Ab}{{{d{Ad}}}Ab}{{{d{Af}}}Ab}``{{{d{AhAj}}Aj}Al}{{{d{Ah{b{c}}}}e}Al{jl}{}}{{{d{n}}}{{d{c}}}{}}{{{d{n}}}{{d{An}}}}{{{d{n}}}{{d{{Bb{B`}}}}}}{{{d{n}}}{{d{{Bd{B`}}}}}}`{{{d{c}}}{{d{e}}}{}{}}000000020{{{d{Ahc}}}{{d{Ahe}}}{}{}}00000000`{{{d{{b{c}}}}}{{b{c}}}j}{{{d{{Bf{c}}}}}{{Bf{c}}}j}{{{d{Bh}}}Bh}={{{d{Ad}}}Ad}{{{d{Af}}}Af}{{{d{{Bj{c}}}}}{{Bj{c}}}j}{{{d{n}}}n}{{{d{{Bl{c}}}}}{{Bl{c}}}j}{{{d{c}}{d{Ahe}}}Al{}{}}00000000{{{Bf{{d{c}}}}}{{Bf{c}}}j}{{{d{{Bf{c}}}}{d{{Bf{c}}}}}Bnl}{{{d{Bh}}{d{Bh}}}Bn}{{{d{Ab}}{d{Ab}}}Bn}{{{d{Ad}}{d{Ad}}}Bn}{{{d{Af}}{d{Af}}}Bn}{{{d{{Bj{c}}}}{d{{Bj{c}}}}}Bnl}{{{d{n}}{d{n}}}Bn}``{{{d{A`}}}C`}0{{{d{{Bf{c}}}}}{{Cb{C`}}}A`}{{{d{Ad}}}C`}{{{d{Af}}}C`}`{{}{{b{c}}}{}}{{}Ab}{{}Ad}{{}Af}{{{d{{Bl{c}}}}}{{d{c}}}{{Ch{{Cf{Cd}}}}}}{{{d{Cj}}}n}{c{{Cl{Bh}}}Cn}{c{{Cl{Ab}}}Cn}{c{{Cl{Ad}}}Cn}{c{{Cl{Af}}}Cn}{c{{Cl{n}}}Cn}{{{d{Cj}}}D`}{{}c{}}{{{d{{Bf{c}}}}{d{{Bf{c}}}}}DbDd}{{{d{Bh}}{d{Bh}}}Db}{{{d{Ab}}{d{Ab}}}Db}{{{d{Ad}}{d{Ad}}}Db}{{{d{Af}}{d{Af}}}Db}{{{d{{Bj{c}}}}{d{{Bj{c}}}}}DbDd}{{{d{n}}{d{n}}}Db}{{{d{{b{c}}}}{d{AhDf}}}DhDj}{{{d{{Bf{c}}}}{d{AhDf}}}DhDj}{{{d{Bh}}{d{AhDf}}}Dh}{{{d{Ab}}{d{AhDf}}}Dh}{{{d{Ad}}{d{AhDf}}}Dh}{{{d{Af}}{d{AhDf}}}Dh}{{{d{{Bj{c}}}}{d{AhDf}}}DhDj}{{{d{n}}{d{AhDf}}}Dh}000{cc{}}0{{{Bf{Af}}}Bh}1{{{Dn{{d{C`}}{d{Dl}}}}}Ab}{{{Dn{C`Dl}}}Ab}33333{Ann}4{{{d{E`}}AbEb}Ed}{{{d{E`}}AbEb}Ab}{{{d{E`}}AbEb}Ad}{{{d{E`}}AbEb}Af}{cn{}}05{{{d{{Bb{B`}}}}}{{Cl{nEf}}}}0{{{d{Eh}}}{{Cl{nc}}}{}}{{{d{{El{}{{Ej{c}}}}}}}{{Cl{Abc}}}Dj}{{{d{{Bf{c}}}}{d{Ahe}}}AlEnF`}{{{d{Bh}}{d{Ahc}}}AlF`}{{{d{Ab}}{d{Ahc}}}AlF`}{{{d{Ad}}{d{Ahc}}}AlF`}{{{d{Af}}{d{Ahc}}}AlF`}{{{d{n}}{d{Ahc}}}AlF`}``{{{d{n}}c}{{d{e}}}{{Fb{{Bb{B`}}}}}{}}{{{d{{b{c}}}}{d{Fd}}}{{Cb{{d{c}}}}}{jl}}{{{d{Ah{b{c}}}}{d{Ff}}}e{jl}{}}{{{d{Ah{b{c}}}}Fh{d{Fj}}}e{jl}{}}`{{{d{{b{c}}}}}e{jl}{}}{{{d{Ah{b{c}}}}cf}Db{jl}}{ce{}{}}000000000{{{d{{El{}{{Ej{c}}}}}}AbAb}{{Cl{{Cb{Db}}c}}}Dj}{{{d{{Bf{c}}}}}Db{}}{{{d{Bh}}}Db}{{{d{{Bj{c}}}}C`}DbA`}{{{d{Aj}}}Db}1`{{{d{{b{c}}}}{d{Ff}}}Db{jl}}0{{{d{{b{c}}}}{d{c}}}Db{jl}}``{{{d{Ah{b{c}}}}{d{c}}}Db{jl}}`{{{d{{b{c}}}}{d{Ff}}e}Fl{jl}{{Fn{c}}}}{c{{Bl{c}}}{{Ch{{Cf{Cd}}}}}}{{ce}{{Bl{c}}}{{Ch{{Cf{Cd}}}}}{{Fn{C`}}}}{{{d{Ah{Bl{c}}}}}{{Cb{e}}}{{Ch{{Cf{Cd}}}}}{}}{{{d{Ah{Bl{c}}}}Eb}{{Cb{e}}}{{Ch{{Cf{Cd}}}}}{}}`{{{d{{b{c}}}}}{{d{{G`{{Dn{cFh}}}}}}}{jl}}{{{d{{b{c}}}}e}{{`{{Gd{}{{Gb{{Dn{{d{c}}Fh}}}}}}}}}{jl}{{Fn{c}}}}{{{d{{Bf{c}}}}{d{{Bf{c}}}}}{{Cb{Bn}}}Gf}{{{d{Bh}}{d{Bh}}}{{Cb{Bn}}}}{{{d{Ab}}{d{Ab}}}{{Cb{Bn}}}}{{{d{Ad}}{d{Ad}}}{{Cb{Bn}}}}{{{d{Af}}{d{Af}}}{{Cb{Bn}}}}{{{d{{Bj{c}}}}{d{{Bj{c}}}}}{{Cb{Bn}}}Gf}{{{d{n}}{d{n}}}{{Cb{Bn}}}}{{{d{Ah{b{c}}}}{d{Ff}}}{{G`{c}}}{jl}}{{{d{Ah{b{c}}}}Fh{d{Fj}}}{{Cb{{d{c}}}}}{jl}}{{{d{{b{c}}}}{d{Ff}}e}{{Dn{GhGh}}}{jl}{{Fn{c}}}}`{{{d{Bh}}c}ClGj}{{{d{Ab}}c}ClGj}{{{d{Ad}}c}ClGj}{{{d{Af}}c}ClGj}{{{d{n}}c}ClGj}`{{{d{{b{c}}}}{d{c}}}{{Cb{{d{Fd}}}}}{jl}}`{nc{}}{{{d{c}}}e{}{}}00000000{nAn}{{{d{c}}}Gl{}}{c{{Cl{e}}}{}{}}00000000000000000`{{{d{{b{c}}}}Fh}{{Cb{{Dn{{d{c}}{d{Fj}}}}}}}{jl}}`{{{d{{b{c}}}}}{{`{{Gd{}{{Gb{{Dn{{d{c}}Fh{d{Fj}}}}}}}}Gn}}}{jl}}{{{d{{b{c}}}}H`}{{`{{Gd{}{{Gb{{Dn{{d{c}}Fh{d{Fj}}}}}}}}}}}{jl}}{{{d{c}}}Hb{}}00000000{D`Bh}{{{d{Ah{b{c}}}}{d{c}}}Db{jl}}{{{d{{b{c}}}}e}{{`{{Gd{}{{Gb{{Dn{{d{c}}{d{Fd}}}}}}}}j}}}{jl}{{Fn{c}}}}{ce{}{}}00000000```````{{{d{Ah{Hd{ce}}}}{Hd{ce}}}AlA`Aj}{{{d{Ah{Hf{ce}}}}E`C`}{{Hd{c}}}{EdA`}Hh}{{{d{Ah{Hf{ce}}}}{d{E`}}C`}{{Hd{c}}}{EdA`}Hh}{{{d{Ah{Hh{}{{Hj{c}}}}}}c}Al{}}{{{d{Ah{Hf{ce}}}}{Hd{c}}}AlA`Hh}{{{d{Ah{Hf{ce}}}}{Hl{c}}}{{Hd{c}}}A`Hh}{{{d{{Hf{ce}}}}}{{d{{Hl{c}}}}}{}{}}{{{d{Ah{Hf{ce}}}}i}{{Hd{c}}}A`Hh{{Hn{}{{Gb{c}}}}}{{Hn{}{{Gb{{Dn{{d{Ff}}g}}}}}}}}{{{d{Ah{Hf{ce}}}}g}{{Hd{c}}}A`Hh{{Hn{}{{Gb{{Dn{{d{Ff}}D`}}}}}}}}{{{d{Ah{Hf{ce}}}}g}{{Hd{c}}}A`Hh{{Hn{}{{Gb{{Dn{FfD`}}}}}}}}{{{d{c}}}{{d{e}}}{}{}}0{{{d{Ahc}}}{{d{Ahe}}}{}{}}0{{{d{{Hd{ce}}}}}{{Hd{ce}}}jj}{{{d{c}}{d{Ahe}}}Al{}{}}{{}{{Hf{ce}}}{}I`}{{}{{Hd{ce}}}{}I`}{c{{Cl{{Hd{eg}}}}}Cn{lIb}Ib}{{{d{{Hd{ce}}}}{d{{Hd{ce}}}}}DbDdDd}{{{d{{Hf{ce}}}}{d{AhDf}}}DhDjDj}{{{d{{Hd{ce}}}}{d{AhDf}}}DhDjDj}{cc{}}{{{Id{c}}}{{Hd{ce}}}{}I`}1{{{If{c}}}{{Hd{e{If{c}}}}}{}{}}{{{d{{Hf{ce}}}}}{{d{{Hl{c}}}}}{}{}}``{{{d{Ah{Hh{}{{Hj{c}}}}}}{d{Ff}}}c{}}{{{d{Ah{Hh{}{{Hj{c}}}}}}Fh{d{Fj}}}c{}}`{{{d{{Hh{}{{Hj{c}}}}}}}c{}}{{{d{{Hf{ce}}}}}{{Hd{c}}}A`Hh}{{{d{Ah{Hf{ce}}}}H`c}{{Hd{c}}}A`Hh}{{{d{Ah{Hf{ce}}}}H`D`}{{Hd{c}}}A`Hh}{{{d{Ah{Hf{ce}}}}Ff}{{Hd{c}}}A`Hh}{{{d{Ah{Hf{ce}}}}FhFj}{{Hd{c}}}A`Hh}{ce{}{}}0{{{d{{Hd{ce}}}}}DbA`Aj}{{{d{{Hh{}{{Hj{c}}}}}}{d{Ff}}}Db{}}{c{{Hf{ec}}}{}{}}{{{d{{Hd{ce}}}}g}Cl{lIh}IhGj}{{{d{c}}}e{}{}}{c{{Cl{e}}}{}{}}000{{{d{c}}}Hb{}}077```{{IjIj}Ij}{{{d{{Il{c}}}}}{{h{c{Bl{{Cf{Cd}}}}}}}{jlDj}}{{{d{Ah{If{c}}}}{If{c}}}All}{{{d{Ah{Il{c}}}}{If{c}}}Al{jlDj}}{{{d{Ah{Il{c}}}}e}Al{jlDj}{}}{{{d{c}}}{{d{e}}}{}{}}00{{{d{Ahc}}}{{d{Ahe}}}{}{}}00{{{d{{If{c}}}}}{{If{c}}}j}{{{d{{Il{c}}}}}{{Il{c}}}j}{{{d{Ij}}}Ij}{{{d{c}}{d{Ahe}}}Al{}{}}00`{{}{{If{c}}}{}}{{}{{Il{c}}}{}}{{}Ij}{c{{Cl{{If{e}}}}}Cn{lIb}}{c{{Cl{Ij}}}Cn}{{{d{{If{c}}}}{d{{If{c}}}}}DbDd}{{{d{Ij}}{d{Ij}}}Db}{{{d{{If{c}}}}{d{AhDf}}}DhDj}{{{d{{Il{c}}}}{d{AhDf}}}DhDj}{{{d{Ij}}{d{AhDf}}}Dh}0{cc{}}00{{{d{{Il{c}}}}{d{c}}}{{Cb{{d{{Cf{Cd}}}}}}}{jlDj}}`{{{d{{Il{c}}}}{d{Fd}}}{{Cb{{Dn{cC`}}}}}{jlDj}}{{{d{Ah{Il{c}}}}{d{Ff}}}e{jlDj}{}}{{{d{Ah{Il{c}}}}Fh{d{Fj}}}e{jlDj}{}}{{{d{{Il{c}}}}}e{jlDj}{}}{{{d{{Il{c}}}}}{{d{{b{{Dn{nC`}}}}}}}{jlDj}}{{{d{Ah{Il{c}}}}c{Cf{Cd}}}{{If{c}}}{jlDj}}{ce{}{}}00{{{d{{If{c}}}}}Dbl}{{{d{{Il{c}}}}{d{Ff}}}Db{jlDj}}{{{d{{Il{c}}}}cC`}Db{jlDj}}{{{d{{Il{c}}}}{d{c}}}{{`{{Gd{}{{Gb{{Dn{C`Fh}}}}}}}}}{jlDj}}{{{d{{Il{c}}}}e}{{`{{Gd{}{{Gb{{Dn{{d{c}}C`Fh}}}}}}}}}{jlDj}{{Fn{c}}}}{{{d{{Il{c}}}}}{{`{{Gd{}{{Gb{{Dn{{d{c}}{d{{Cf{Cd}}}}}}}}}}Gn}}}{jlDj}}``{{{d{{Il{c}}}}{d{c}}}{{Cb{C`}}}{jlDj}}{{{d{{Il{c}}}}}{{h{cC`}}}{jlDj}}10{{{d{{Il{c}}}}}C`{jlDj}}{{{d{Ah{Il{c}}}}{d{c}}C`}Al{jlDj}}{{{d{Ah{Il{c}}}}cC`}Db{jlDj}}{{{d{{Il{c}}}}{d{Ff}}e}Fl{jlDj}{{Fn{c}}}}{C`{{Il{c}}}{}}{{{d{{Il{c}}}}{d{c}}}{{Cb{{Dn{C`Db}}}}}{jlDj}}{{{d{Ah{Il{c}}}}{d{c}}}{{Cb{{Dn{{Dn{C`{d{Fd}}}}{If{c}}}}}}}{jlDj}}{{{d{{Il{c}}}}}{{`{{Gd{}{{Gb{{Dn{{Dn{cC`}}Fh}}}}}}}}}{jlDj}}1{{{d{Ah{Il{c}}}}{d{c}}C`}{{Cb{{Dn{{Bl{{Cf{Cd}}}}{If{c}}}}}}}{jlDj}}{{{d{Ah{Il{c}}}}{d{{h{cC`}}}}}{{Dn{{h{c{Bl{{Cf{Cd}}}}}}{If{c}}}}}{jlDj}}{{{d{{Il{c}}}}{d{c}}}{{`{{Gd{}{{Gb{{Dn{C`{d{Fd}}}}}}}}}}}{jlDj}}{{{d{{Il{c}}}}e}{{`{{Gd{}{{Gb{{Dn{{d{c}}C`{d{Fd}}}}}}}}j}}}{jlDj}{{Fn{c}}}}{{{d{{Il{c}}}}{d{Ff}}e}{{Dn{GhGh}}}{jlDj}{{Fn{c}}}}{{{d{{If{c}}}}e}Cl{lIh}Gj}{{{d{Ij}}c}ClGj}{{{d{{Il{c}}}}cC`}{{Cb{{d{Fd}}}}}{jlDj}}{{{d{c}}}e{}{}}00{{{d{c}}}Gl{}}{{{d{Ij}}}Gh}`0{c{{Cl{e}}}{}{}}00000{{{d{{Il{c}}}}Fh}{{Cb{{Dn{cC`{d{Fj}}}}}}}{jlDj}}{{{d{{Il{c}}}}}{{`{{Gd{}{{Gb{{Dn{cC`Fh{d{Fj}}}}}}}}}}}{jlDj}}{{{d{{Il{c}}}}H`}{{`{{Gd{}{{Gb{{Dn{cC`Fh{d{Fj}}}}}}}}}}}{jlDj}}{{{d{c}}}Hb{}}00{{{d{{Il{c}}}}{d{c}}}{{Cb{{Bl{{Cf{Cd}}}}}}}{jlDj}}{{{d{Ah{Il{c}}}}cC`}Db{jlDj}}`{{{d{{Il{c}}}}{d{c}}}{{`{{Gd{}{{Gb{{Dn{C`{d{Fd}}}}}}}}j}}}{jlDj}}{{{d{{Il{c}}}}}{{`{{Gd{}{{Gb{{Dn{cC`{d{Fd}}}}}}}}j}}}{jlDj}}{ce{}{}}00``````````{{{d{AhIn}}{d{J`}}}{{Cl{AlJb}}}}{{{d{AhIn}}{d{Jd}}C`}{{Cl{J`Jf}}}}{{{d{AhIn}}{d{Jd}}C`Ab}{{Cl{J`Jh}}}}{{{d{AhIn}}Jj}{{Cl{J`Jf}}}}{{{d{Jj}}}Ab}{{{d{c}}}{{d{e}}}{}{}}000000{{{d{Ahc}}}{{d{Ahe}}}{}{}}000000{{{d{Jj}}}Jj}{{{d{In}}}In}{{{d{Jb}}}Jb}{{{d{Jl}}}Jl}{{{d{Jf}}}Jf}{{{d{Jh}}}Jh}{{{d{c}}{d{Ahe}}}Al{}{}}00000{{{d{AhIn}}Ab}{{Cl{J`Jb}}}}{{{d{Jj}}{d{Jj}}}Db}{{{d{In}}{d{In}}}Db}{{{d{Jb}}{d{Jb}}}Db}{{{d{Jl}}{d{Jl}}}Db}{{{d{Jf}}{d{Jf}}}Db}{{{d{Jh}}{d{Jh}}}Db}{{Jjc}{{Cl{JjJj}}}{{Hn{}{{Gb{Ab}}}}}}{{{d{Jj}}{d{AhDf}}}Dh}{{{d{In}}{d{AhDf}}}Dh}{{{d{Jb}}{d{AhDf}}}Dh}0{{{d{Jl}}{d{AhDf}}}Dh}0{{{d{Jf}}{d{AhDf}}}Dh}0{{{d{Jh}}{d{AhDf}}}Dh}0{cc{}}000000{c{{Cl{Jj{Cb{Jj}}}}}{{Hn{}{{Gb{Ab}}}}}}{{{h{C`Dl}}}{{Cl{InJb}}}}{J`{{Cl{InJb}}}}{Dl{{Dn{InJ`}}}}{{{d{Jd}}C`}Jj}{Jj{{Cl{InJb}}}}{{{d{In}}}Dl}{{{d{Jj}}C`}{{Cb{Jj}}}}{{{d{In}}C`}{{Cb{Jj}}}}{{{d{In}}}{{Cl{Abc}}}{}}{{{d{Jj}}}Dl}{{{d{Jj}}}C`}`{{{d{In}}}J`}{{JjAb}Jj}{{{d{AhIn}}Ab}{{Cl{J`Jl}}}}{ce{}{}}0000000{Jjc{}}{{{d{In}}AbAb}{{Cl{{Cb{Db}}c}}}{}}{{{d{Jj}}}Jn}{{{d{In}}}Jn}{AbJj}{{{d{AhJn}}}{{Cb{c}}}{}}`{{{d{Jj}}}{{Cb{Jj}}}}{{JjAb}{{Cl{JjJj}}}}{{{d{Jj}}c}{{`{{K`{}{{Gb{Jj}}}}}}}{{Fn{C`}}}}{{{d{In}}c}{{`{{K`{}{{Gb{Jj}}}}}}}{{Fn{C`}}}}{{{d{In}}}Jj}{{{d{c}}}e{}{}}00000{{{d{c}}}Gl{}}000{c{{Cl{e}}}{}{}}000000`0000000{{{d{c}}}Hb{}}000000`???????````{{{d{c}}}{{d{e}}}{}{}}000{{{d{Ahc}}}{{d{Ahe}}}{}{}}000{{Kbe}Kb{{Gn{}{{Gb{Fh}}}}Kd}{{Hn{}{{Kf{c}}{Gb{Fh}}}}}}{{Kbe}Kb{{Gn{}{{Gb{f}}}}Kd}{{Hn{}{{Kf{c}}{Gb{f}}}}}}{{{Kh{c}}cg}{{Kh{c}}}{lj}{{K`{}{{Gb{{Dn{C`f}}}}}}Kd}{{Hn{}{{Kf{e}}}}}}``{{Kbe}Kb{{Gn{}{{Gb{H`}}}}Kd}{{Hn{}{{Kf{c}}{Gb{H`}}}}}}``{cc{}}000{JjKb}{Jj{{Kh{c}}}{lj}}{{Jj{d{{Il{c}}}}}{{Kh{c}}}{Djlj}}``{{Kbc}Kb{{Kj{{d{Fh}}}}KdKl}}{{Kbc}Kb{{Kj{{d{Fd}}}}KdKl}}{{{Kh{c}}e}{{Kh{c}}}{Kdlj}{{Kj{cC`{d{Fd}}}}KdKlj}}{{{Kh{c}}ce}{{Kh{c}}}{Kdlj}{{Kj{C`{d{Fd}}}}KdKl}}{{Kbc}Kb{{Kj{{d{H`}}}}KdKl}}{ce{}{}}000``{{Kb{d{{Il{c}}}}e}Kb{jlDjKdKl}{{Fn{c}}}}{{Kbe}Kb{{Gn{}{{Gb{Fh}}}}Kd}{{Hn{}{{Kf{c}}}}}}{{Kbe}Kb{{Gn{}{{Gb{f}}}}Kd}{{Hn{}{{Kf{c}}}}}}>{{Kbe}Kb{{Gn{}{{Gb{H`}}}}Kd}{{Hn{}{{Kf{c}}}}}}``{c{{Cl{e}}}{}{}}0000000`{{{d{c}}}Hb{}}0006666`````````{{{d{{Hl{c}}}}}{{d{{G`{{Dn{cH`}}}}}}}{}}{{{d{{Hl{c}}}}}{{`{{K`{}{{Gb{{Dn{Fh{d{Fj}}}}}}}}}}}{}}{{{d{{Id{c}}}}}{{`{{K`{}{{Gb{C`}}}}}}}A`}``{{{d{Ah{Id{c}}}}{Id{c}}}All}{{{d{Ah{Hl{c}}}}{Id{c}}}Al{jl}}{{{d{Ah{Hl{c}}}}{Hl{c}}}{{Id{c}}}{jl}}{{{d{{Hl{c}}}}}{{d{{Hl{c}}}}}{}}{{{d{{Hl{c}}}}{d{e}}Abik}IjA`{{El{}{{Ej{Kn}}}}}j{{Hn{}{{Gb{{Dn{gFh}}}}}}}{{Kj{{d{g}}{d{Fd}}}{{L`{Db}}}}}}{{{d{Ah{Hl{c}}}}e}{{Id{c}}}{jl}{{Hn{}{{Gb{{Dn{FfD`}}}}}}}}{{{d{c}}}{{d{e}}}{}{}}000000{{{d{Ahc}}}{{d{Ahe}}}{}{}}000000{{{d{{Hl{c}}}}{d{Ff}}}{{Cl{GhLb}}}{}}`{c{{Cb{Gh}}}{}}{c{{Cb{Fl}}}{}}01{{{d{{Hl{c}}}}}{{Hl{c}}}j}{{{d{{Ld{ce}}}}}{{Ld{ce}}}jj}{{{d{{Lf{ce}}}}}{{Lf{ce}}}jj}{{{d{{Id{c}}}}}{{Id{c}}}j}{{{d{c}}{d{Ahe}}}Al{}{}}000{{{d{{Ld{ce}}}}{d{{Ld{ce}}}}}Bnll}{{{d{{Lf{ce}}}}{d{{Lf{ce}}}}}Bnll}{{}{{Hl{c}}}{}}{{}{{Id{c}}}{}}{{{d{{Ld{ce}}}}}{{d{g}}}{}{}{}}{c{{Cl{{Id{e}}}}}Cn{lIb}}{{{d{{Hl{c}}}}{d{Ff}}}{{`{{K`{}{{Gb{{Dn{EbH`}}}}}}}}}{}}{{{d{{Hl{c}}}}{d{{Hl{c}}}}}DbDd}{{{d{{Ld{ce}}}}{d{{Ld{ce}}}}}DbDdDd}{{{d{{Lf{ce}}}}{d{{Lf{ce}}}}}DbDdDd}{{{d{Lb}}{d{Lb}}}Db}{{{d{{Id{c}}}}{d{{Id{c}}}}}DbDd}{{{d{{Hl{c}}}}{d{e}}Abi}{{`{{K`{}{{Gb{{Dn{g{Bj{c}}}}}}}}}}}A`{{El{}{{Ej{Kn}}}}}j{{Hn{}{{Gb{{Dn{gFh}}}}}}}}0{{{d{{Hl{c}}}}}{{`{{K`{}{{Gb{{Dn{Fh{d{Fj}}}}}}}}}}}{}}{{{d{{Hl{c}}}}{d{AhDf}}}DhDj}{{{d{{Ld{ce}}}}{d{AhDf}}}DhDjDj}{{{d{{Lf{ce}}}}{d{AhDf}}}DhDjDj}{{{d{Lb}}{d{AhDf}}}Dh}0{{{d{{Id{c}}}}{d{AhDf}}}DhDj}{cc{}}000000{{{d{{Hl{c}}}}}{{`{{K`{}{{Gb{{Ld{{Lh{Ff}}c}}}}}}}}}{}}{{{d{{Hl{c}}}}{d{e}}AbH`}{{Cb{{Bf{{d{c}}}}}}}A`{{El{}{{Ej{Kn}}}}}}{{{d{{Hl{c}}}}{d{e}}AbFh}{{Cb{{Dn{{Bf{{d{c}}}}H`}}}}}A`{{El{}{{Ej{Kn}}}}}}{{{d{{Hl{c}}}}H`}{{Cb{{Lh{Ff}}}}}{}}{{{d{{Hl{c}}}}H`}{{Cb{{Ld{{Lh{Ff}}c}}}}}{}}{{{d{{Hl{c}}}}Fh}{{Cb{{d{Fj}}}}}{}}{{{d{{Hl{c}}}}}{{Id{c}}}{jl}}{{{d{Ah{Hl{c}}}}H`c}{{Id{c}}}{jl}}{{{d{Ah{Hl{c}}}}H`D`}{{Id{c}}}{jl}}{{{d{Ah{Hl{c}}}}e}{{Id{c}}}{jl}{{Lj{{Lh{Ff}}}}}}{{{d{Ah{Hl{c}}}}FhFj}{{Id{c}}}{jl}}{ce{}{}}00000000{{{d{{Hl{c}}}}}Db{}}{{{d{{Id{c}}}}}Dbl}``{{{d{{Hl{c}}}}{d{e}}Ab}{{`{{K`{}{{Gb{{Lf{{Lh{Ff}}c}}}}}}}}}A`El}{{{Hl{c}}g}{{Hl{e}}}{jl}{jl}{{Kj{c}{{L`{e}}}}}}{{{Id{c}}g}{{Id{e}}}ll{{Kj{c}{{L`{e}}}}}}{c{{Hl{e}}}{{Hn{}{{Gb{Ff}}}}}{jl}}{{{d{Ah{Ll{cg}}}}}{{Cb{i}}}{}{}{{Kj{Eb{Lh{Ff}}}{{L`{{Cb{e}}}}}}}{}}{{{d{Ah{Ln{cg}}}}}{{Cb{i}}}{}{}{{Kj{EbH`}{{L`{{Cb{e}}}}}}}{}}{{{d{{Hl{c}}}}Fh}{{d{{M`{H`}}}}}{}}{{{d{{Ld{ce}}}}{d{{Ld{ce}}}}}{{Cb{Bn}}}GfGf}{{{d{{Lf{ce}}}}{d{{Lf{ce}}}}}{{Cb{Bn}}}GfGf}{{{d{{Id{c}}}}e}Cl{lIh}Gj}{{{d{c}}}e{}{}}000{{{d{c}}}Gl{}}{{{d{{Hl{c}}}}{d{e}}Abik}{{Cl{Ij}}}A`Elj{{Hn{}{{Gb{{Dn{gFh}}}}}}}{{Kj{{d{g}}{d{Fd}}}{{L`{Db}}}}}}{{{d{{Hl{c}}}}{d{e}}Abi}{{`{{K`{}{{Gb{{Cl{{Dn{g{Bj{c}}}}}}}}}}}}}A`Elj{{Hn{}{{Gb{{Dn{gFh}}}}}}}}0{c{{Cl{e}}}{}{}}000000{{{d{{Hl{c}}}}{d{e}}AbH`}{{Cl{{Cb{{Bf{{d{c}}}}}}}}}A`El}{{{d{{Hl{c}}}}{d{e}}AbFh}{{Cl{{Cb{{Dn{{Bf{{d{c}}}}H`}}}}}}}A`El}2222222{{{d{{Hl{c}}}}{d{e}}Ab}{{`{{K`{}{{Gb{{Cl{{Lf{{Lh{Ff}}c}}}}}}}}}}}A`El}``{{{d{{Hl{c}}}}H`}{{Cb{{h{C`{d{Fj}}}}}}}{}}{{{d{{Hl{c}}}}H`}{{`{{Gd{}{{Gb{{Dn{C`{d{{M`{H`}}}}}}}}}}}}}{}}`{{{d{{Id{c}}}}}{{`{{K`{}{{Gb{{Dn{Fh{d{Fj}}}}}}}}}}}{}}``{{{d{c}}}Hb{}}000000{{{d{Ah{Hl{c}}}}D`}{{Id{c}}}{jl}}{ce{}{}}000000{{{d{{Hl{c}}}}ei}{{Ll{ci}}}{jl}{{Lj{{Lh{Ff}}}}}{}{{Kj{Eb{Lh{Ff}}}{{L`{{Cb{g}}}}}}}}{{{d{{Hl{c}}}}{d{Ff}}g}{{Ln{cg}}}{}{}{{Kj{EbH`}{{L`{{Cb{e}}}}}}}}{{{d{{Hl{c}}}}H`g}{{Ln{cg}}}{jl}{}{{Kj{EbH`}{{L`{{Cb{e}}}}}}}}","D":"BLl","p":[[5,"SpkTxOutIndex",0,798],[1,"reference"],[5,"ScriptBuf",799],[5,"BTreeMap",800],[10,"Clone",801],[10,"Ord",802],[5,"DescriptorId",0,803],[10,"Anchor",0,804],[5,"BlockId",0,805],[5,"ConfirmationHeightAnchor",0,805],[5,"ConfirmationTimeHeightAnchor",0,805],[0,"mut"],[10,"Append",0,804],[1,"unit"],[5,"Hash",806],[1,"u8"],[1,"slice"],[1,"array"],[6,"ChainPosition",0,805],[6,"ConfirmationTime",0,805],[5,"FullTxOut",0,805],[5,"SpkIterator",0,807],[6,"Ordering",802],[1,"u32"],[6,"Option",808],[6,"DescriptorPublicKey",809],[6,"Descriptor",810],[10,"Borrow",811],[10,"DescriptorExt",0,803],[6,"Result",812],[10,"Deserializer",813],[1,"u64"],[1,"bool"],[10,"PartialEq",802],[5,"Formatter",814],[8,"Result",814],[10,"Debug",814],[5,"BlockHash",815],[1,"tuple"],[5,"Block",816],[1,"usize"],[10,"AnchorFromBlockPosition",0,804],[5,"FromSliceError",817],[1,"str"],[17,"Error"],[10,"ChainOracle",0,818],[10,"Hash",819],[10,"Hasher",819],[10,"SliceIndex",820],[5,"Script",821],[5,"Transaction",822],[5,"OutPoint",822],[5,"TxOut",822],[5,"SignedAmount",823],[10,"RangeBounds",824],[5,"BTreeSet",825],[17,"Item"],[10,"DoubleEndedIterator",826],[10,"PartialOrd",802],[5,"Amount",823],[10,"Serializer",827],[5,"String",828],[10,"ExactSizeIterator",829],[5,"Txid",815],[5,"TypeId",830],[5,"ChangeSet",272],[5,"IndexedTxGraph",272],[10,"Indexer",272],[17,"ChangeSet"],[5,"TxGraph",637],[10,"IntoIterator",831],[10,"Default",832],[10,"Deserialize",813],[5,"ChangeSet",637],[5,"ChangeSet",329,833],[10,"Serialize",827],[5,"Balance",329],[5,"KeychainTxOutIndex",329,833],[5,"LocalChain",431],[8,"ChangeSet",431],[5,"MissingGenesisError",431],[5,"Header",816],[5,"CannotConnectError",431],[6,"ApplyHeaderError",431],[5,"CheckPoint",431],[5,"AlterCheckPointError",431],[5,"CheckPointIter",431],[10,"Iterator",834],[5,"SyncRequest",573],[10,"Send",835],[17,"IntoIter"],[5,"FullScanRequest",573],[10,"FnMut",836],[10,"Sync",835],[6,"Infallible",837],[17,"Output"],[6,"CalculateFeeError",637],[5,"TxNode",637],[5,"CanonicalTx",637],[5,"Arc",838],[10,"Into",837],[5,"TxAncestors",637],[5,"TxDescendants",637],[5,"HashSet",839],[15,"Confirmed",269],[15,"Unconfirmed",269],[5,"SyncResult",573],[5,"FullScanResult",573]],"r":[[0,804],[1,804],[2,804],[3,807],[4,805],[6,818],[7,805],[8,805],[9,805],[10,805],[13,803],[14,803],[16,805],[17,272],[18,807],[19,798],[20,637],[330,833],[331,833]],"b":[[35,"impl-AsRef%3C%5Bu8%5D%3E-for-DescriptorId"],[36,"impl-AsRef%3C%5Bu8;+%3C%24hash+as+%24crate::Hash%3E::LEN%5D%3E-for-DescriptorId"],[119,"impl-Debug-for-DescriptorId"],[120,"impl-Display-for-DescriptorId"],[121,"impl-LowerHex-for-DescriptorId"],[122,"impl-UpperHex-for-DescriptorId"],[127,"impl-From%3C(%26u32,+%26BlockHash)%3E-for-BlockId"],[128,"impl-From%3C(u32,+BlockHash)%3E-for-BlockId"],[299,"impl-From%3CChangeSet%3CA%3E%3E-for-ChangeSet%3CA,+IA%3E"],[301,"impl-From%3CChangeSet%3CK%3E%3E-for-ChangeSet%3CA,+ChangeSet%3CK%3E%3E"],[335,"impl-KeychainTxOutIndex%3CK%3E"],[336,"impl-Indexer-for-KeychainTxOutIndex%3CK%3E"],[359,"impl-Debug-for-Balance"],[360,"impl-Display-for-Balance"],[482,"impl-Display-for-MissingGenesisError"],[483,"impl-Debug-for-MissingGenesisError"],[484,"impl-Display-for-AlterCheckPointError"],[485,"impl-Debug-for-AlterCheckPointError"],[486,"impl-Display-for-CannotConnectError"],[487,"impl-Debug-for-CannotConnectError"],[488,"impl-Display-for-ApplyHeaderError"],[489,"impl-Debug-for-ApplyHeaderError"],[703,"impl-Debug-for-CalculateFeeError"],[704,"impl-Display-for-CalculateFeeError"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAALgBSgASAAAAFQAAABkAAAAbAAIAIQABACQAFQA7ABEATgAGAFoAAQBdAAMAYwAEAGkAEgB+AAAAgAABAIcAAACKAAQAkAACAJQABQCcAAAAngABAKEAAACsAAAAtQAAALoAAAC+AAEAwwAGAM0ABQDWAAkA4QASAPkACAAFAQgAFQEAABsBAAAfAQsALAEAAC4BAAA9AQAAQAEJAE0BAABRAQwAXwEKAHABAgB5AQAAkgEBAJUBAwCcAQUApQECAK0BAgC/ARkA2gEFAOEBCQD7AQAACQICAA8CAAAWAhAAKAINADcCBgBCAgcAbQIHAHYCBwCMAgAAjwIAAJICDQCiAhEAtQIEAL0CBQDcAgEA3wIAAOYCAQDpAgcA9AIGAP0CBgANAwYAFQMGAA=="}],\ ["bdk_coin_select",{"t":"FFGGFFPIPFGPPPFGFPPSPPPPPFNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNHNNNONONNNNOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNONNOOOONNNNONOOOOONNNNONNNNNNOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNOOON","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","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":[[0,"bdk_coin_select"],[235,"bdk_coin_select::bnb"],[236,"core::cmp"],[237,"bdk_coin_select::coin_selector"],[238,"core::iter::traits::iterator"],[239,"core::option"],[240,"core::convert"],[241,"core::result"],[242,"core::fmt"],[243,"core::time"],[244,"bitcoin::blockdata::transaction"],[245,"core::hash"],[246,"alloc::vec"],[247,"core::marker"],[248,"alloc::string"],[249,"core::any"]],"i":[0,0,0,0,0,0,41,0,22,0,0,18,18,22,0,0,0,41,41,0,18,18,11,11,11,0,2,6,7,2,16,2,7,41,2,34,22,15,16,6,17,18,7,11,12,41,2,34,22,15,16,6,17,18,7,11,12,6,6,15,16,6,17,18,7,11,12,15,16,6,17,18,7,11,12,11,0,6,6,6,12,16,16,6,15,18,11,7,7,12,12,6,15,16,6,17,17,18,18,7,11,11,12,2,41,2,34,22,22,22,15,16,6,17,18,7,11,12,16,11,15,41,2,34,22,15,16,6,17,18,7,11,12,2,34,6,15,6,16,16,16,16,16,2,15,6,34,6,11,2,2,12,2,2,6,6,6,6,7,6,6,6,6,6,6,2,16,16,16,15,16,6,17,18,7,11,12,17,18,11,41,2,34,22,15,16,6,17,18,7,11,12,41,2,34,22,15,16,6,17,18,7,11,12,41,2,34,22,15,16,6,17,18,7,11,12,6,6,15,41,2,34,22,15,16,6,17,18,7,11,12,12,15,12,41],"f":"``````````````````````````{{{f{b{d{c}}}}c}hj}{{{f{l}}}h}{{{f{n}}{f{{A`{c}}}}}{{`{{Ad{}{{Ab{{f{c}}}}}}}}}{}}{{{f{b{d{c}}}}}hj}``{{{f{n}}}{{Aj{{f{Af}}{f{Ah}}}}}}{{{f{c}}}{{f{e}}}{}{}}00000000000{{{f{bc}}}{{f{be}}}{}{}}00000000000{{{f{l}}Al}{{f{An}}}}`{{{f{An}}}An}{{{f{B`}}}B`}{{{f{l}}}l}{{{f{Bb}}}Bb}{{{f{Bd}}}Bd}{{{f{n}}}n}{{{f{Af}}}Af}{{{f{Ah}}}Ah}{{{f{c}}{f{be}}}Bf{}{}}0000000{{{f{Af}}{f{Af}}}Bh}{{cl}{{Bj{l}}}{{Bn{Bl}}}}{{{f{l}}}C`}{{{f{l}}}Cb}{{{f{bl}}Al}h}`{{{f{B`}}}C`}`3{{{f{An}}Cd}C`}{{{f{Bd}}{f{Bd}}}h}{{{f{Af}}{f{Af}}}h}```{{{f{Ah}}}Cd}{{{f{l}}}{{Cf{nBb}}}}{{{f{An}}{f{bCh}}}Cj}{{{f{B`}}{f{bCh}}}Cj}{{{f{l}}{f{bCh}}}Cj}{{{f{Bb}}{f{bCh}}}Cj}0{{{f{Bd}}{f{bCh}}}Cj}0{{{f{n}}{f{bCh}}}Cj}{{{f{Af}}{f{bCh}}}Cj}0{{{f{Ah}}{f{bCh}}}Cj}{{{f{b{d{c}}}}h}Bfj}{cc{}}00{AlBl}{ClBl}222222222{{{f{{A`{Cn}}}}{f{Cn}}Cb}B`}{{{f{Af}}{f{bc}}}BfD`}`{ce{}{}}00000000000{{{d{c}}{f{{Db{c}}}}}{{Dd{c}}}j}1{{{f{l}}}h}`{{{f{l}}Al}h}{{{f{B`}}}Cd}````{{l{Df{{Aj{Al{f{An}}}}}}c}{{d{c}}}j}{{DhCbh}An}{{{f{{Df{An}}}}{f{B`}}}l}{{{f{b{Dd{c}}}}}{{Bj{e}}}{jDjDl}{}}`{{{f{Af}}{f{Af}}}{{Bj{Bh}}}}`````{{{f{bl}}Al}h}{{{f{bl}}}Bf}{{{f{bl}}}{{Cf{nBb}}}}{{{f{l}}}{{`{{Ad{}{{Ab{{Aj{Al{f{An}}}}}}}}}}}}`{{{f{l}}}Dh}{{{f{l}}}Al}{{{f{l}}}C`}{{{f{l}}}{{`{{Ad{}{{Ab{Al}}}}}}}}1{{{f{l}}}Cb}````{{{f{c}}}e{}{}}0000000{{{f{c}}}Dn{}}00{c{{Cf{e}}}{}{}}00000000000000000000000{{{f{c}}}E`{}}0000000000095`{ce{}{}}00000000000```{{{f{Eb}}}h}","D":"Hh","p":[[0,"mut"],[5,"Bnb",0,235],[1,"reference"],[1,"bool"],[10,"Ord",236],[5,"CoinSelector",0,237],[5,"Selection",0,237],[1,"slice"],[17,"Item"],[10,"Iterator",238],[6,"ExcessStrategyKind",0,237],[5,"ExcessStrategy",0,237],[1,"tuple"],[1,"usize"],[5,"WeightedValue",0,237],[5,"CoinSelectorOpt",0,237],[5,"SelectionError",0,237],[6,"SelectionConstraint",0,237],[1,"unit"],[6,"Ordering",236],[6,"Option",239],[6,"BnbLimit",0,235],[10,"Into",240],[1,"i64"],[1,"u32"],[1,"f32"],[6,"Result",241],[5,"Formatter",242],[8,"Result",242],[5,"Duration",243],[5,"TxOut",244],[10,"Hasher",245],[8,"DecideStrategy",0,235],[5,"BnbIter",0,235],[5,"Vec",246],[1,"u64"],[10,"Copy",247],[10,"Display",242],[5,"String",248],[5,"TypeId",249],[6,"BranchStrategy",0,235]],"r":[[0,235],[1,235],[2,235],[3,235],[4,237],[5,237],[7,235],[9,237],[10,237],[14,237],[15,237],[16,237],[25,237],[76,235]],"b":[[95,"impl-Debug-for-SelectionError"],[96,"impl-Display-for-SelectionError"],[97,"impl-Debug-for-SelectionConstraint"],[98,"impl-Display-for-SelectionConstraint"],[100,"impl-Display-for-ExcessStrategyKind"],[101,"impl-Debug-for-ExcessStrategyKind"],[107,"impl-From%3Cusize%3E-for-BnbLimit"],[108,"impl-From%3CDuration%3E-for-BnbLimit"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAKcAFwAAAAAAAgAAAAYAAAAJAAIADgADABcAAgAcAAEAIAAAACIAKgBQAAIAVgAEAFwACwBsAAEAdwABAIcAAQCKAAEAkgANAKEAAACjAAAApgAAAKoAMADcAAwA6gABAA=="}],\ -["bdk_electrum",{"t":"KFFENNNNENNMNNMNNNNNNNNNNNN","n":["ElectrumExt","ElectrumFullScanResult","ElectrumSyncResult","bdk_chain","borrow","borrow","borrow_mut","borrow_mut","electrum_client","from","from","full_scan","into","into","sync","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","with_confirmation_height_anchor","with_confirmation_height_anchor","with_confirmation_time_height_anchor","with_confirmation_time_height_anchor"],"q":[[0,"bdk_electrum"],[27,"bdk_electrum::electrum_ext"],[28,"bdk_chain::spk_client"],[29,"electrum_client::types"],[30,"core::result"],[31,"core::cmp"],[32,"core::clone"],[33,"core::any"],[34,"bdk_chain::chain_data"],[35,"electrum_client::api"]],"i":[0,0,0,0,7,13,7,13,0,7,13,3,7,13,3,7,13,7,13,7,13,7,13,7,13,7,13],"f":"````{{{b{c}}}{{b{e}}}{}{}}0{{{b{dc}}}{{b{de}}}{}{}}0`{cc{}}0{{{b{f}}{h{c}}jjl}{{Ab{{n{c}}A`}}}{AdAf}}{ce{}{}}0{{{b{f}}Ahjl}{{Ab{AjA`}}}}{c{{Ab{e}}}{}{}}000{{{b{c}}}Al{}}033{{{n{c}}}{{B`{cAn}}}{}}{Aj{{Bb{An}}}}{{{n{c}}{b{e}}}{{Ab{{B`{cBd}}A`}}}{}Bf}{{Aj{b{c}}}{{Ab{{Bb{Bd}}A`}}}Bf}","D":"Al","p":[[1,"reference"],[0,"mut"],[10,"ElectrumExt",0,27],[5,"FullScanRequest",28],[1,"usize"],[1,"bool"],[5,"ElectrumFullScanResult",0,27],[6,"Error",29],[6,"Result",30],[10,"Ord",31],[10,"Clone",32],[5,"SyncRequest",28],[5,"ElectrumSyncResult",0,27],[5,"TypeId",33],[5,"ConfirmationHeightAnchor",34],[5,"FullScanResult",28],[5,"SyncResult",28],[5,"ConfirmationTimeHeightAnchor",34],[10,"ElectrumApi",35]],"r":[[0,27],[1,27],[2,27]],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAA0AAgAEAAUAEAAHAA=="}],\ +["bdk_electrum",{"t":"FFFENNNNNNENNNNNNONNNNNNNNNNNNNNNNNNNNNNN","n":["BdkElectrumClient","ElectrumFullScanResult","ElectrumSyncResult","bdk_chain","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","electrum_client","fetch_tx","fmt","from","from","from","full_scan","inner","into","into","into","new","populate_tx_cache","sync","transaction_broadcast","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","with_confirmation_height_anchor","with_confirmation_height_anchor","with_confirmation_time_height_anchor","with_confirmation_time_height_anchor"],"q":[[0,"bdk_electrum"],[41,"bdk_electrum::bdk_electrum_client"],[42,"bitcoin::hash_types::newtypes"],[43,"bitcoin::blockdata::transaction"],[44,"alloc::sync"],[45,"electrum_client::types"],[46,"core::result"],[47,"electrum_client::api"],[48,"core::fmt"],[49,"bdk_chain::spk_client"],[50,"core::cmp"],[51,"core::clone"],[52,"bdk_chain::tx_graph"],[53,"core::convert"],[54,"core::any"],[55,"bdk_chain::chain_data"]],"i":[0,0,0,0,16,23,3,16,23,3,0,3,3,16,23,3,3,3,16,23,3,3,3,3,3,16,23,3,16,23,3,16,23,3,16,23,3,16,23,16,23],"f":"````{{{b{c}}}{{b{e}}}{}{}}00{{{b{dc}}}{{b{de}}}{}{}}00`{{{b{{f{c}}}}h}{{A`{{l{j}}n}}}Ab}{{{b{{f{c}}}}{b{dAd}}}AfAh}{cc{}}00{{{b{{f{c}}}}{Aj{e}}AlAlAn}{{A`{{B`{e}}n}}}Ab{BbBd}}`{ce{}{}}00{c{{f{c}}}Ab}{{{b{{f{c}}}}g}BfAb{}{{Bj{{Bh{e}}}}}}{{{b{{f{c}}}}BlAlAn}{{A`{Bnn}}}Ab}{{{b{{f{c}}}}{b{j}}}{{A`{hn}}}Ab}{c{{A`{e}}}{}{}}00000{{{b{c}}}C`{}}00666{{{B`{c}}}{{Cd{cCb}}}{}}{Bn{{Cf{Cb}}}}{{{B`{c}}{b{{f{e}}}}}{{A`{{Cd{cCh}}n}}}{}Ab}{{Bn{b{{f{c}}}}}{{A`{{Cf{Ch}}n}}}Ab}","D":"Bj","p":[[1,"reference"],[0,"mut"],[5,"BdkElectrumClient",0,41],[5,"Txid",42],[5,"Transaction",43],[5,"Arc",44],[6,"Error",45],[6,"Result",46],[10,"ElectrumApi",47],[5,"Formatter",48],[8,"Result",48],[10,"Debug",48],[5,"FullScanRequest",49],[1,"usize"],[1,"bool"],[5,"ElectrumFullScanResult",0,41],[10,"Ord",50],[10,"Clone",51],[1,"unit"],[5,"TxGraph",52],[10,"AsRef",53],[5,"SyncRequest",49],[5,"ElectrumSyncResult",0,41],[5,"TypeId",54],[5,"ConfirmationHeightAnchor",55],[5,"FullScanResult",49],[5,"SyncResult",49],[5,"ConfirmationTimeHeightAnchor",55]],"r":[[0,41],[1,41],[2,41]],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAABQAAwAEAAcADQAAABoACwA="}],\ ["bdk_esplora",{"t":"IKKEMMMM","n":["Error","EsploraAsyncExt","EsploraExt","esplora_client","full_scan","full_scan","sync","sync"],"q":[[0,"bdk_esplora"],[8,"bdk_esplora::blocking_ext"],[9,"bdk_chain::spk_client"],[10,"core::result"],[11,"core::cmp"],[12,"core::clone"],[13,"bdk_esplora::async_ext"],[14,"core::future::future"],[15,"alloc::boxed"],[16,"core::pin"],[17,"core::marker"]],"i":[0,0,0,0,1,10,1,10],"f":"````{{{d{b}}{f{c}}hh}{{n{{j{c}}l}}}{A`Ab}}{{{d{Ad}}{f{c}}hh}{{Aj{{Ah{Af}}}}}{A`AbAl}}{{{d{b}}Anh}{{n{B`l}}}}{{{d{Ad}}Anh}{{Aj{{Ah{Af}}}}}}","D":"A`","p":[[10,"EsploraExt",0,8],[1,"reference"],[5,"FullScanRequest",9],[1,"usize"],[5,"FullScanResult",9],[8,"Error",0,8],[6,"Result",10],[10,"Ord",11],[10,"Clone",12],[10,"EsploraAsyncExt",0,13],[10,"Future",14],[5,"Box",15],[5,"Pin",16],[10,"Send",17],[5,"SyncRequest",9],[5,"SyncResult",9]],"r":[[0,8],[1,13],[2,8]],"b":[],"c":"OjAAAAAAAAA=","e":"OjAAAAEAAAAAAAAAEAAAAAQA"}],\ ["bdk_file_store",{"t":"FPFGPPPGFNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNOO","n":["AggregateChangesetsError","Bincode","EntryIter","FileError","InvalidMagicBytes","Io","Io","IterError","Store","aggregate_changesets","append_changeset","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","changeset","create_new","drop","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","into","into","into","into","into","into_iter","iter_changesets","iter_error","load_from_persistence","new","next","open","open_or_create_new","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","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","write_changes","expected","got"],"q":[[0,"bdk_file_store"],[75,"bdk_file_store::FileError"],[77,"bdk_file_store::store"],[78,"core::option"],[79,"core::result"],[80,"bdk_chain::tx_data_traits"],[81,"serde::ser"],[82,"serde::de"],[83,"core::marker"],[84,"std::io::error"],[85,"std::path"],[86,"core::convert"],[87,"bdk_file_store::entry_iter"],[88,"core::fmt"],[89,"anyhow"],[90,"std::fs"],[91,"alloc::string"],[92,"core::any"]],"i":[0,20,0,0,16,20,16,0,0,2,2,19,20,2,5,16,19,20,2,5,16,5,2,19,20,20,2,5,5,16,16,19,20,20,2,5,16,16,19,20,2,5,16,19,2,5,2,19,19,2,2,20,5,16,19,20,2,5,16,19,20,2,5,16,19,20,2,5,16,19,20,2,5,16,2,29,29],"f":"`````````{{{f{b{d{c}}}}}{{l{{h{c}}{j{c}}}}}{nA`AbAdAf}}{{{f{b{d{c}}}}{f{c}}}{{l{AhAj}}}{nA`AbAdAf}}{{{f{c}}}{{f{e}}}{}{}}0000{{{f{bc}}}{{f{be}}}{}{}}0000`{{{f{{An{Al}}}}c}{{l{{d{e}}B`}}}{{Bd{Bb}}}{nA`AbAdAf}}{{{f{b{Bf{c}}}}}Ah{}}{{{f{Bh}}{f{bBj}}}Bl}0{{{f{{d{c}}}}{f{bBj}}}Bl{AfAdBn}}{{{f{{j{c}}}}{f{bBj}}}Bl{}}{{{f{{j{c}}}}{f{bBj}}}BlBn}{{{f{B`}}{f{bBj}}}Bl}0{cc{}}0{AjBh}11{AjB`}2{ce{}{}}00000{{{f{b{d{c}}}}}{{Bf{c}}}{nA`AbAdAf}}`{{{f{b{d{c}}}}}{{C`{{h{c}}}}}{nA`AbAdAf}}{{Cb{f{bCd}}}{{Bf{c}}}{}}{{{f{b{Bf{c}}}}}{{h{e}}}Ab{}}>>{{{f{c}}}Cf{}}00{c{{l{e}}}{}{}}000000000{{{f{c}}}Ch{}}000077777{{{f{b{d{c}}}}{f{c}}}{{C`{Ah}}}{nA`AbAdAf}}``","D":"Ch","p":[[0,"mut"],[5,"Store",0,77],[1,"reference"],[6,"Option",78],[5,"AggregateChangesetsError",0,77],[6,"Result",79],[10,"Append",80],[10,"Serialize",81],[10,"DeserializeOwned",82],[10,"Send",83],[10,"Sync",83],[1,"unit"],[5,"Error",84],[1,"u8"],[1,"slice"],[6,"FileError",0],[5,"Path",85],[10,"AsRef",86],[5,"EntryIter",0,87],[6,"IterError",0,87],[5,"Formatter",88],[8,"Result",88],[10,"Debug",88],[8,"Result",89],[1,"u64"],[5,"File",90],[5,"String",91],[5,"TypeId",92],[15,"InvalidMagicBytes",75]],"r":[[0,77],[2,87],[7,87],[8,77]],"b":[[24,"impl-Display-for-IterError"],[25,"impl-Debug-for-IterError"],[27,"impl-Display-for-AggregateChangesetsError%3CC%3E"],[28,"impl-Debug-for-AggregateChangesetsError%3CC%3E"],[29,"impl-Debug-for-FileError"],[30,"impl-Display-for-FileError"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAADEABwAMAAkAGAAHACIAAAAlAAAALAAAAC8AAgA0ABkA"}],\ ["bdk_hwi",{"t":"FNNNNNNNNNNNN","n":["HWISigner","borrow","borrow_mut","fmt","from","from_device","id","into","sign_transaction","try_from","try_into","type_id","vzip"],"q":[[0,"bdk_hwi"],[13,"bdk_hwi::signer"],[14,"core::fmt"],[15,"hwi::types"],[16,"hwi::error"],[17,"core::result"],[18,"secp256k1::context::alloc_only"],[19,"secp256k1"],[20,"bdk_wallet::wallet::signer"],[21,"bitcoin::psbt"],[22,"core::any"]],"i":[0,3,3,3,3,3,3,3,3,3,3,3,3],"f":"`{{{b{c}}}{{b{e}}}{}{}}{{{b{dc}}}{{b{de}}}{}{}}{{{b{f}}{b{dh}}}j}{cc{}}{{{b{l}}n}{{Ab{fA`}}}}{{{b{f}}{b{{Af{Ad}}}}}Ah}{ce{}{}}{{{b{f}}{b{dAj}}{b{Al}}{b{{Af{Ad}}}}}{{Ab{AnB`}}}}{c{{Ab{e}}}{}{}}0{{{b{c}}}Bb{}}3","D":"j","p":[[1,"reference"],[0,"mut"],[5,"HWISigner",0,13],[5,"Formatter",14],[8,"Result",14],[5,"HWIDevice",15],[5,"HWIChain",15],[6,"Error",16],[6,"Result",17],[6,"All",18],[5,"Secp256k1",19],[6,"SignerId",20],[5,"Psbt",21],[5,"SignOptions",20],[1,"unit"],[6,"SignerError",20],[5,"TypeId",22]],"r":[[0,13]],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAAgAAwACAAIABwAAAAkABAA="}],\ diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search.desc/bdk_chain/bdk_chain-desc-0-.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search.desc/bdk_chain/bdk_chain-desc-0-.js index bb52b1fac7..cf0ce0c1be 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search.desc/bdk_chain/bdk_chain-desc-0-.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search.desc/bdk_chain/bdk_chain-desc-0-.js @@ -1 +1 @@ -searchState.loadedDescShard("bdk_chain", 0, "This crate is a collection of core structures for Bitcoin …\nTrait that “anchors” blockchain data to a specific …\nAn Anchor that can be constructed from a given block, …\nTrait that makes an object appendable.\nMaximum BIP32 derivation index.\nA reference to a block in the canonical chain.\nHow many confirmations are needed f or a coinbase output …\nRepresents a service that tracks the blockchain.\nRepresents the observed position of some chain data.\nAn Anchor implementation that also records the exact …\nBlock height and timestamp at which a transaction is …\nAn Anchor implementation that also records the exact …\nThe chain data is seen as confirmed, and in anchored by A.\nThe transaction is confirmed\nA trait to extend the functionality of a miniscript …\nRepresents the ID of a descriptor, defined as the sha256 …\nError type.\nA TxOut with as much data as we can retrieve about it\nAn iterator for derived script pubkeys.\nAn index storing TxOuts that have a script pubkey that …\nThe chain data is not confirmed and last seen in the …\nThe transaction is unconfirmed\nThe script pubkeys that are being tracked by the index.\nReturns the BlockId that the associated blockchain data is …\nThe anchor block.\nThe anchor block.\nAppend another object of the same type onto self.\nReturns a reference to the inner hash (sha256, sh256d …\nThe position of the transaction in outpoint in the overall …\nMaps a ChainPosition<&A> into a ChainPosition<A> by …\nThe exact confirmation height of the transaction.\nThe confirmation height of the transaction being anchored.\nGet the upper bound of the chain data’s confirmation …\nGet the upper bound of the chain data’s confirmation …\nDetermines the upper bound of the confirmation height.\nThe confirmation time of the transaction being anchored.\nGet a reference to the internal descriptor.\nReturns the descriptor id, calculated as the sha256 of the …\nReturns the minimum value (in satoshis) at which an output …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstruct the anchor from a given block, block height and …\nCreates this wrapper type from the inner hash type.\nGet the best chain’s chain tip.\nThe hash of the block.\nThe height of the block.\nReturns the index associated with the script pubkey.\nContains the IndexedTxGraph and associated types. Refer to …\nAdds a script pubkey to scan for. Returns false and does …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nDetermines whether block of BlockId exists as an ancestor …\nReturns whether ChainPosition is confirmed or not.\nReturns whether ConfirmationTime is the confirmed variant.\nWhether the utxo is/was/will be spendable with chain tip.\nReturns whether the structure is considered empty.\nWhether the txout is considered mature.\nWhether this output is on a coinbase transaction.\nWhether any of the inputs of this transaction spend a …\nReturns whether the script pubkey at index has been used …\nModule for keychain related structures.\nThe LocalChain is a local implementation of ChainOracle.\nMarks the script pubkey at index as used even though it …\nComputes the net value transfer effect of tx on the script …\nCreate a new script pubkey iterator from descriptor.\nCreate a new script pubkey iterator from descriptor and a …\nThe location of the TxOut.\nGet a reference to the set of indexed outpoints.\nIterates over all the outputs with script pubkeys in an …\nScans a transaction’s outputs for matching script …\nScan a single TxOut for a matching script pubkey and …\nComputes the total value transfer effect tx has on the …\nThe txid and chain position of the transaction (if any) …\nReturns the script that has been inserted at the index.\nHelper types for spk-based blockchain clients.\nReturns the inner hash (sha256, sh256d etc.).\nModule for structures that store and traverse transactions.\nReturns the txout and script pubkey index of the TxOut at …\nThe TxOut.\nIterate over all known txouts that spend to tracked script …\nFinds all txouts on a transaction that has previously been …\nConstruct an unconfirmed variant using the given last_seen …\nUndoes the effect of mark_used. Returns whether the index …\nIterates over all unused script pubkeys in an index range.\nConfirmation height.\nThe last-seen timestamp in unix seconds.\nConfirmation time in unix seconds.\nRepresents changes to an IndexedTxGraph.\nThe resultant “changeset” when new transaction data is …\nThe IndexedTxGraph combines a TxGraph and an Indexer …\nUtilities for indexing transaction data.\nBatch insert all transactions of the given block of height.\nBatch insert all transactions of the given block of height…\nApply changeset to itself.\nApplies the ChangeSet to the IndexedTxGraph.\nApply an update directly.\nBatch insert transactions, filtering out those that are …\nBatch insert unconfirmed transactions, filtering out those …\nBatch insert unconfirmed transactions.\nReturns the argument unchanged.\nReturns the argument unchanged.\nGet a reference of the internal transaction graph.\nTxGraph changeset.\nTransaction index.\nScans a transaction for relevant outpoints, which are …\nScan and index the given outpoint and txout.\nIndexer changeset.\nDetermines the ChangeSet between self and an empty Indexer.\nDetermines the ChangeSet between self and an empty …\nInsert an anchor for a given transaction.\nInsert a unix timestamp of when a transaction is seen in …\nInsert and index a transaction into the graph.\nInsert a floating txout of given outpoint.\nCalls U::from(self).\nCalls U::from(self).\nDetermines whether the transaction should be included in …\nConstruct a new IndexedTxGraph with a given index.\nBalance, differentiated into various categories.\nRepresents updates to the derivation index of a …\nKeychainTxOutIndex controls how script pubkeys are …\nGet unbounded spk iterators for all keychains.\nAppend another ChangeSet into self.\nApplies the derivation changeset to the KeychainTxOutIndex…\nConfirmed and immediately spendable balance\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nGets the descriptor associated with the keychain. Returns …\nAll coinbase outputs not yet matured\nReturns the keychain and keychain index associated with …\nReturn a reference to the internal SpkTxOutIndex.\nInsert a descriptor with a keychain associated to it.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns whether the changeset are empty.\nReturns whether the spk under the keychain’s index has …\nIterate over all OutPoints that have TxOuts with script …\nIterate over OutPoints that have script pubkeys derived …\nReturn the map of the keychain to descriptors.\nContains the keychains that have been added and their …\nContains for each descriptor_id the last revealed index of …\nGet the last derivation index revealed for keychain. …\nGet the last derivation index that is revealed for each …\nReturns the highest derivation index of the keychain where …\nReturns the highest derivation index of each keychain that …\nGet the lookahead setting.\nStore lookahead scripts until target_index (inclusive).\nMarks the script pubkey at index as used even though the …\nComputes the net value that this transaction gives to the …\nConstruct a KeychainTxOutIndex with the given lookahead.\nGet the next derivation index for keychain. The next index …\nGets the next unused script pubkey in the keychain. I.e., …\nGet the set of indexed outpoints, corresponding to tracked …\nAttempts to reveal the next script pubkey for keychain.\nReveals script pubkeys of the keychain’s descriptor up …\nConvenience method to call Self::reveal_to_target on …\nIterate over revealed spks of the given keychain.\nIterate over revealed spks of keychains in range\nComputes the total value transfer effect tx has on the …\nReturn the script that exists under the given keychain’s …\nGet the whole balance visible to the wallet.\nUnconfirmed UTXOs generated by a wallet tx\nGet sum of trusted_pending and confirmed coins.\nReturn the TxOut of outpoint if it has been indexed, and …\nIterate over known txouts that spend to tracked script …\nFinds all txouts on a transaction that has previously been …\nGet an unbounded spk iterator over a given keychain. …\nUndoes the effect of mark_used. Returns whether the index …\nUnconfirmed UTXOs received from an external wallet\nIterate over revealed, but unused, spks of the given …\nIterate over revealed, but unused, spks of all keychains.\nRepresents a failure when trying to insert/remove a …\nThe error type for LocalChain::apply_header_connected_to.\nOccurs when the update cannot connect with the original …\nOccurs when an update does not have a common checkpoint …\nThe ChangeSet represents changes to LocalChain.\nA LocalChain checkpoint is used to find the agreement …\nIterates over checkpoints backwards.\nOccurs when connected_to block conflicts with either the …\nThis is a local implementation of ChainOracle.\nAn error which occurs when a LocalChain is constructed …\nApply the given changeset.\nUpdate the chain with a given Header connecting it with …\nUpdate the chain with a given Header at height which you …\nApplies the given update to the chain.\nGet the BlockId of the checkpoint.\nRemoves blocks from (and inclusive of) the given block_id.\nExtends the checkpoint linked list by a iterator of block …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstruct a checkpoint from a list of BlockIds in …\nConstructs a LocalChain from a BTreeMap of height to …\nConstruct a LocalChain from an initial changeset.\nConstruct LocalChain from genesis hash.\nConstruct a checkpoint from the given header and block …\nConstruct a LocalChain from a given checkpoint tip.\nGet the genesis hash.\nGet checkpoint at height.\nGet checkpoint at given height (if it exists).\nGet the block hash of the checkpoint.\nGet the height of the checkpoint.\nThe checkpoint’s height.\nDerives an initial ChangeSet, meaning that it can be …\nInserts block_id at its height within the chain.\nInsert a BlockId.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nIterate from this checkpoint in descending height.\nIterate over checkpoints in descending height order.\nConstruct a new base block at the front of a linked list.\nThe original checkpoint’s block hash which cannot be …\nGet the previous checkpoint in the chain\nPuts another checkpoint onto the linked list representing …\nIterate checkpoints over a height range.\nIterate checkpoints over a height range.\nGet the highest checkpoint.\nThe suggested checkpoint to include to connect the two …\nThe attempted update to the original_block hash.\nData required to perform a spk-based blockchain client …\nData returned from a spk-based blockchain client full scan.\nData required to perform a spk-based blockchain client …\nData returned from a spk-based blockchain client sync.\nA cache of Arc-wrapped full transactions, identified by …\nAdd all transactions from TxGraph into the TxCache.\nAdd all transactions from TxGraph into the TxCache.\nAdd to the TxCache held by the request.\nAdd to the TxCache held by the request.\nChain on additional OutPoints that will be synced against.\nChain on additional Scripts that will be synced against.\nChain on additional Scripts that will be synced against.\nA checkpoint for the current chain LocalChain::tip. The …\nA checkpoint for the current LocalChain::tip. The full …\nChain on additional Txids that will be synced against.\nThe update to apply to the receiving LocalChain.\nThe update to apply to the receiving TxGraph.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstruct a new SyncRequest from a given cp tip.\nConstruct a new FullScanRequest from a given chain_tip.\nConstruct a new FullScanRequest from a given chain_tip and …\nThe update to apply to the receiving TxGraph.\nThe update to apply to the receiving LocalChain.\nAdd a closure that will be called for OutPoints previously …\nAdd a closure that will be called for Scripts previously …\nAdd a closure that will be called for every Script …\nAdd a closure that will be called for every Script …\nAdd a closure that will be called for Txids previously …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nLast active indices for the corresponding keychains (K).\nTransactions with these outpoints or spent from these …\nPopulate the request with revealed script pubkeys from …\nSet the OutPoints that will be synced against.\nSet the Scripts that will be synced against.\nSet the Scripts for a given keychain.\nSet the Txids that will be synced against.\nTransactions that spend from or to these indexed script …\nIterators of script pubkeys indexed by the keychain index.\nCache of full transactions, so the chain-source can avoid …\nCache of full transactions, so the chain-source can avoid …\nTransactions with these txids.\nErrors returned by TxGraph::calculate_fee.\nA transaction that is included in the chain, or is still …\nThe ChangeSet represents changes to a TxGraph.\nMissing TxOut for one or more of the inputs of the tx\nWhen the transaction is invalid according to the graph it …\nAn iterator that traverses ancestors of a given root …\nAn iterator that traverses transaction descendants.\nA graph of transactions and spends.\nA transaction node in the TxGraph.\nGet all transaction anchors known by TxGraph.\nIterate over all tx outputs known by TxGraph.\nIterates over the heights of that the new transaction …\nThe blocks that the transaction is “anchored” in.\nAdded anchors.\nApplies ChangeSet to TxGraph.\nExtends this graph with another so that self becomes the …\nGet the total balance of outpoints that are in chain of …\nBatch insert unconfirmed transactions.\nCalculates the fee of a given transaction. Returns …\nHow the transaction is observed as (confirmed or …\nGiven a transaction, return an iterator of txids that …\nGet a filtered list of outputs from the given outpoints …\nGet a filtered list of unspent outputs (UTXOs) from the …\nIterate over floating txouts known by TxGraph.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nIterate over all full transactions in the graph.\nGet the position of the transaction in chain with tip …\nGet the txid of the spending transaction and where the …\nGet a transaction by txid. This only returns Some for full …\nGet a transaction node by txid. This only returns Some for …\nObtains a single tx output (if any) at the specified …\nDetermines the ChangeSet between self and an empty TxGraph.\nInserts the given anchor into TxGraph.\nInserts the given seen_at for txid into TxGraph.\nInserts the given transaction into TxGraph.\nInserts the given TxOut at OutPoint.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nWhether the graph has any transactions or outputs in it.\nAdded last-seen unix timestamps of transactions.\nThe last-seen unix timestamp of the transaction as …\nList graph transactions that are in chain with chain_tip.\nTransform the TxGraph to have Anchors of another type.\nTransform the ChangeSet to have Anchors of another type.\nConstruct a new TxGraph from a list of transactions.\nThe transactions spending from this output.\nGet the total balance of outpoints that are in chain of …\nGet a filtered list of outputs from the given outpoints …\nGet a filtered list of unspent outputs (UTXOs) from the …\nGet the position of the transaction in chain with tip …\nGet the txid of the spending transaction and where the …\nList graph transactions that are in chain with chain_tip.\nA partial or full representation of the transaction.\nThe transaction node (as part of the graph).\nReturns known outputs of a given txid.\nIterates over the transactions spending from txid.\nTxid of the transaction.\nIterates over all outpoints contained within ChangeSet.\nAdded txouts.\nAdded transactions.\nUpdate the last seen time for all unconfirmed transactions.\nCreates an iterator that filters and maps ancestor …\nCreates an iterator that both filters and maps conflicting …\nCreates an iterator that filters and maps descendants from …") \ No newline at end of file +searchState.loadedDescShard("bdk_chain", 0, "This crate is a collection of core structures for Bitcoin …\nTrait that “anchors” blockchain data to a specific …\nAn Anchor that can be constructed from a given block, …\nTrait that makes an object appendable.\nMaximum BIP32 derivation index.\nA reference to a block in the canonical chain.\nHow many confirmations are needed f or a coinbase output …\nRepresents a service that tracks the blockchain.\nRepresents the observed position of some chain data.\nAn Anchor implementation that also records the exact …\nBlock height and timestamp at which a transaction is …\nAn Anchor implementation that also records the exact …\nThe chain data is seen as confirmed, and in anchored by A.\nThe transaction is confirmed\nA trait to extend the functionality of a miniscript …\nRepresents the ID of a descriptor, defined as the sha256 …\nError type.\nA TxOut with as much data as we can retrieve about it\nAn iterator for derived script pubkeys.\nAn index storing TxOuts that have a script pubkey that …\nThe chain data is not confirmed and last seen in the …\nThe transaction is unconfirmed\nThe script pubkeys that are being tracked by the index.\nReturns the BlockId that the associated blockchain data is …\nThe anchor block.\nThe anchor block.\nAppend another object of the same type onto self.\nReturns a reference to the inner hash (sha256, sh256d …\nThe position of the transaction in outpoint in the overall …\nMaps a ChainPosition<&A> into a ChainPosition<A> by …\nThe exact confirmation height of the transaction.\nThe confirmation height of the transaction being anchored.\nGet the upper bound of the chain data’s confirmation …\nGet the upper bound of the chain data’s confirmation …\nDetermines the upper bound of the confirmation height.\nThe confirmation time of the transaction being anchored.\nGet a reference to the internal descriptor.\nReturns the descriptor id, calculated as the sha256 of the …\nReturns the minimum value (in satoshis) at which an output …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstruct the anchor from a given block, block height and …\nCreates this wrapper type from the inner hash type.\nGet the best chain’s chain tip.\nThe hash of the block.\nThe height of the block.\nReturns the index associated with the script pubkey.\nContains the IndexedTxGraph and associated types. Refer to …\nAdds a script pubkey to scan for. Returns false and does …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nDetermines whether block of BlockId exists as an ancestor …\nReturns whether ChainPosition is confirmed or not.\nReturns whether ConfirmationTime is the confirmed variant.\nWhether the utxo is/was/will be spendable with chain tip.\nReturns whether the structure is considered empty.\nWhether the txout is considered mature.\nWhether this output is on a coinbase transaction.\nWhether any of the inputs of this transaction spend a …\nReturns whether the script pubkey at index has been used …\nModule for keychain related structures.\nThe LocalChain is a local implementation of ChainOracle.\nMarks the script pubkey at index as used even though it …\nComputes the net value transfer effect of tx on the script …\nCreate a new script pubkey iterator from descriptor.\nCreate a new script pubkey iterator from descriptor and a …\nThe location of the TxOut.\nGet a reference to the set of indexed outpoints.\nIterates over all the outputs with script pubkeys in an …\nScans a transaction’s outputs for matching script …\nScan a single TxOut for a matching script pubkey and …\nComputes the total value transfer effect tx has on the …\nThe txid and chain position of the transaction (if any) …\nReturns the script that has been inserted at the index.\nHelper types for spk-based blockchain clients.\nReturns the inner hash (sha256, sh256d etc.).\nModule for structures that store and traverse transactions.\nReturns the txout and script pubkey index of the TxOut at …\nThe TxOut.\nIterate over all known txouts that spend to tracked script …\nFinds all txouts on a transaction that has previously been …\nConstruct an unconfirmed variant using the given last_seen …\nUndoes the effect of mark_used. Returns whether the index …\nIterates over all unused script pubkeys in an index range.\nConfirmation height.\nThe last-seen timestamp in unix seconds.\nConfirmation time in unix seconds.\nRepresents changes to an IndexedTxGraph.\nThe resultant “changeset” when new transaction data is …\nThe IndexedTxGraph combines a TxGraph and an Indexer …\nUtilities for indexing transaction data.\nBatch insert all transactions of the given block of height.\nBatch insert all transactions of the given block of height…\nApply changeset to itself.\nApplies the ChangeSet to the IndexedTxGraph.\nApply an update directly.\nBatch insert transactions, filtering out those that are …\nBatch insert unconfirmed transactions, filtering out those …\nBatch insert unconfirmed transactions.\nReturns the argument unchanged.\nReturns the argument unchanged.\nGet a reference of the internal transaction graph.\nTxGraph changeset.\nTransaction index.\nScans a transaction for relevant outpoints, which are …\nScan and index the given outpoint and txout.\nIndexer changeset.\nDetermines the ChangeSet between self and an empty Indexer.\nDetermines the ChangeSet between self and an empty …\nInsert an anchor for a given transaction.\nInsert a unix timestamp of when a transaction is seen in …\nInsert and index a transaction into the graph.\nInsert a floating txout of given outpoint.\nCalls U::from(self).\nCalls U::from(self).\nDetermines whether the transaction should be included in …\nConstruct a new IndexedTxGraph with a given index.\nBalance, differentiated into various categories.\nRepresents updates to the derivation index of a …\nKeychainTxOutIndex controls how script pubkeys are …\nGet unbounded spk iterators for all keychains.\nAppend another ChangeSet into self.\nApplies the derivation changeset to the KeychainTxOutIndex…\nConfirmed and immediately spendable balance\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nGets the descriptor associated with the keychain. Returns …\nAll coinbase outputs not yet matured\nReturns the keychain and keychain index associated with …\nReturn a reference to the internal SpkTxOutIndex.\nInsert a descriptor with a keychain associated to it.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns whether the changeset are empty.\nReturns whether the spk under the keychain’s index has …\nIterate over all OutPoints that have TxOuts with script …\nIterate over OutPoints that have script pubkeys derived …\nReturn the map of the keychain to descriptors.\nContains the keychains that have been added and their …\nContains for each descriptor_id the last revealed index of …\nGet the last derivation index revealed for keychain. …\nGet the last derivation index that is revealed for each …\nReturns the highest derivation index of the keychain where …\nReturns the highest derivation index of each keychain that …\nGet the lookahead setting.\nStore lookahead scripts until target_index (inclusive).\nMarks the script pubkey at index as used even though the …\nComputes the net value that this transaction gives to the …\nConstruct a KeychainTxOutIndex with the given lookahead.\nGet the next derivation index for keychain. The next index …\nGets the next unused script pubkey in the keychain. I.e., …\nGet the set of indexed outpoints, corresponding to tracked …\nAttempts to reveal the next script pubkey for keychain.\nReveals script pubkeys of the keychain’s descriptor up …\nConvenience method to call Self::reveal_to_target on …\nIterate over revealed spks of the given keychain.\nIterate over revealed spks of keychains in range\nComputes the total value transfer effect tx has on the …\nReturn the script that exists under the given keychain’s …\nGet the whole balance visible to the wallet.\nUnconfirmed UTXOs generated by a wallet tx\nGet sum of trusted_pending and confirmed coins.\nReturn the TxOut of outpoint if it has been indexed, and …\nIterate over known txouts that spend to tracked script …\nFinds all txouts on a transaction that has previously been …\nGet an unbounded spk iterator over a given keychain. …\nUndoes the effect of mark_used. Returns whether the index …\nUnconfirmed UTXOs received from an external wallet\nIterate over revealed, but unused, spks of the given …\nIterate over revealed, but unused, spks of all keychains.\nRepresents a failure when trying to insert/remove a …\nThe error type for LocalChain::apply_header_connected_to.\nOccurs when the update cannot connect with the original …\nOccurs when an update does not have a common checkpoint …\nThe ChangeSet represents changes to LocalChain.\nA LocalChain checkpoint is used to find the agreement …\nIterates over checkpoints backwards.\nOccurs when connected_to block conflicts with either the …\nThis is a local implementation of ChainOracle.\nAn error which occurs when a LocalChain is constructed …\nApply the given changeset.\nUpdate the chain with a given Header connecting it with …\nUpdate the chain with a given Header at height which you …\nApplies the given update to the chain.\nGet the BlockId of the checkpoint.\nRemoves blocks from (and inclusive of) the given block_id.\nExtends the checkpoint linked list by a iterator of block …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstruct a checkpoint from a list of BlockIds in …\nConstructs a LocalChain from a BTreeMap of height to …\nConstruct a LocalChain from an initial changeset.\nConstruct LocalChain from genesis hash.\nConstruct a checkpoint from the given header and block …\nConstruct a LocalChain from a given checkpoint tip.\nGet the genesis hash.\nGet checkpoint at height.\nGet checkpoint at given height (if it exists).\nGet the block hash of the checkpoint.\nGet the height of the checkpoint.\nThe checkpoint’s height.\nDerives an initial ChangeSet, meaning that it can be …\nInserts block_id at its height within the chain.\nInsert a BlockId.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nIterate from this checkpoint in descending height.\nIterate over checkpoints in descending height order.\nConstruct a new base block at the front of a linked list.\nThe original checkpoint’s block hash which cannot be …\nGet the previous checkpoint in the chain\nPuts another checkpoint onto the linked list representing …\nIterate checkpoints over a height range.\nIterate checkpoints over a height range.\nGet the highest checkpoint.\nThe suggested checkpoint to include to connect the two …\nThe attempted update to the original_block hash.\nData required to perform a spk-based blockchain client …\nData returned from a spk-based blockchain client full scan.\nData required to perform a spk-based blockchain client …\nData returned from a spk-based blockchain client sync.\nChain on additional OutPoints that will be synced against.\nChain on additional Scripts that will be synced against.\nChain on additional Scripts that will be synced against.\nA checkpoint for the current chain LocalChain::tip. The …\nA checkpoint for the current LocalChain::tip. The full …\nChain on additional Txids that will be synced against.\nThe update to apply to the receiving LocalChain.\nThe update to apply to the receiving TxGraph.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstruct a new SyncRequest from a given cp tip.\nConstruct a new FullScanRequest from a given chain_tip.\nConstruct a new FullScanRequest from a given chain_tip and …\nThe update to apply to the receiving TxGraph.\nThe update to apply to the receiving LocalChain.\nAdd a closure that will be called for OutPoints previously …\nAdd a closure that will be called for Scripts previously …\nAdd a closure that will be called for every Script …\nAdd a closure that will be called for every Script …\nAdd a closure that will be called for Txids previously …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nLast active indices for the corresponding keychains (K).\nTransactions with these outpoints or spent from these …\nPopulate the request with revealed script pubkeys from …\nSet the OutPoints that will be synced against.\nSet the Scripts that will be synced against.\nSet the Scripts for a given keychain.\nSet the Txids that will be synced against.\nTransactions that spend from or to these indexed script …\nIterators of script pubkeys indexed by the keychain index.\nTransactions with these txids.\nErrors returned by TxGraph::calculate_fee.\nA transaction that is included in the chain, or is still …\nThe ChangeSet represents changes to a TxGraph.\nMissing TxOut for one or more of the inputs of the tx\nWhen the transaction is invalid according to the graph it …\nAn iterator that traverses ancestors of a given root …\nAn iterator that traverses transaction descendants.\nA graph of transactions and spends.\nA transaction node in the TxGraph.\nGet all transaction anchors known by TxGraph.\nIterate over all tx outputs known by TxGraph.\nIterates over the heights of that the new transaction …\nThe blocks that the transaction is “anchored” in.\nAdded anchors.\nApplies ChangeSet to TxGraph.\nExtends this graph with another so that self becomes the …\nGet the total balance of outpoints that are in chain of …\nBatch insert unconfirmed transactions.\nCalculates the fee of a given transaction. Returns …\nHow the transaction is observed as (confirmed or …\nGiven a transaction, return an iterator of txids that …\nGet a filtered list of outputs from the given outpoints …\nGet a filtered list of unspent outputs (UTXOs) from the …\nIterate over floating txouts known by TxGraph.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nIterate over all full transactions in the graph.\nGet the position of the transaction in chain with tip …\nGet the txid of the spending transaction and where the …\nGet a transaction by txid. This only returns Some for full …\nGet a transaction node by txid. This only returns Some for …\nObtains a single tx output (if any) at the specified …\nDetermines the ChangeSet between self and an empty TxGraph.\nInserts the given anchor into TxGraph.\nInserts the given seen_at for txid into TxGraph.\nInserts the given transaction into TxGraph.\nInserts the given TxOut at OutPoint.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nWhether the graph has any transactions or outputs in it.\nAdded last-seen unix timestamps of transactions.\nThe last-seen unix timestamp of the transaction as …\nList graph transactions that are in chain with chain_tip.\nTransform the TxGraph to have Anchors of another type.\nTransform the ChangeSet to have Anchors of another type.\nConstruct a new TxGraph from a list of transactions.\nThe transactions spending from this output.\nGet the total balance of outpoints that are in chain of …\nGet a filtered list of outputs from the given outpoints …\nGet a filtered list of unspent outputs (UTXOs) from the …\nGet the position of the transaction in chain with tip …\nGet the txid of the spending transaction and where the …\nList graph transactions that are in chain with chain_tip.\nA partial or full representation of the transaction.\nThe transaction node (as part of the graph).\nReturns known outputs of a given txid.\nIterates over the transactions spending from txid.\nTxid of the transaction.\nIterates over all outpoints contained within ChangeSet.\nAdded txouts.\nAdded transactions.\nUpdate the last seen time for all unconfirmed transactions.\nCreates an iterator that filters and maps ancestor …\nCreates an iterator that both filters and maps conflicting …\nCreates an iterator that filters and maps descendants from …") \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search.desc/bdk_electrum/bdk_electrum-desc-0-.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search.desc/bdk_electrum/bdk_electrum-desc-0-.js index 1e38bb74a7..014b565309 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search.desc/bdk_electrum/bdk_electrum-desc-0-.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/search.desc/bdk_electrum/bdk_electrum-desc-0-.js @@ -1 +1 @@ -searchState.loadedDescShard("bdk_electrum", 0, "This crate is used for updating structures of bdk_chain …\nTrait to extend electrum_client::Client functionality.\nThe result of ElectrumExt::full_scan.\nThe result of ElectrumExt::sync.\nReturns the argument unchanged.\nReturns the argument unchanged.\nFull scan the keychain scripts specified with the …\nCalls U::from(self).\nCalls U::from(self).\nSync a set of scripts with the blockchain (via an Electrum …\nReturn FullScanResult with ConfirmationHeightAnchor.\nReturn SyncResult with ConfirmationHeightAnchor.\nReturn FullScanResult with ConfirmationTimeHeightAnchor.\nReturn SyncResult with ConfirmationTimeHeightAnchor.") \ No newline at end of file +searchState.loadedDescShard("bdk_electrum", 0, "This crate is used for updating structures of bdk_chain …\nWrapper around an electrum_client::ElectrumApi which …\nThe result of BdkElectrumClient::full_scan.\nThe result of BdkElectrumClient::sync.\nFetch transaction of given txid.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nFull scan the keychain scripts specified with the …\nThe internal electrum_client::ElectrumApi\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCreates a new bdk client from a …\nInserts transactions into the transaction cache so that …\nSync a set of scripts with the blockchain (via an Electrum …\nBroadcasts a transaction to the network.\nReturn FullScanResult with ConfirmationHeightAnchor.\nReturn SyncResult with ConfirmationHeightAnchor.\nReturn FullScanResult with ConfirmationTimeHeightAnchor.\nReturn SyncResult with ConfirmationTimeHeightAnchor.") \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src-files.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src-files.js index 56d02409dd..b17fe655c5 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src-files.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src-files.js @@ -2,7 +2,7 @@ var srcIndex = new Map(JSON.parse('[\ ["bdk_bitcoind_rpc",["",[],["lib.rs"]]],\ ["bdk_chain",["",[["keychain",[],["txout_index.rs"]]],["chain_data.rs","chain_oracle.rs","descriptor_ext.rs","example_utils.rs","indexed_tx_graph.rs","keychain.rs","lib.rs","local_chain.rs","spk_client.rs","spk_iter.rs","spk_txout_index.rs","tx_data_traits.rs","tx_graph.rs"]]],\ ["bdk_coin_select",["",[],["bnb.rs","coin_selector.rs","lib.rs"]]],\ -["bdk_electrum",["",[],["electrum_ext.rs","lib.rs"]]],\ +["bdk_electrum",["",[],["bdk_electrum_client.rs","lib.rs"]]],\ ["bdk_esplora",["",[],["async_ext.rs","blocking_ext.rs","lib.rs"]]],\ ["bdk_file_store",["",[],["entry_iter.rs","lib.rs","store.rs"]]],\ ["bdk_hwi",["",[],["lib.rs","signer.rs"]]],\ 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 index 05297f2d48..8630069cb2 100644 --- 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 @@ -352,6 +352,12 @@ 352 353 354 +355 +356 +357 +358 +359 +360
    //! Contains the [`IndexedTxGraph`] and associated types. Refer to the
     //! [`IndexedTxGraph`] documentation for more.
     use alloc::vec::Vec;
    @@ -706,4 +712,10 @@
         /// Determines whether the transaction should be included in the index.
         fn is_tx_relevant(&self, tx: &Transaction) -> bool;
     }
    +
    +impl<A, I> AsRef<TxGraph<A>> for IndexedTxGraph<A, I> {
    +    fn as_ref(&self) -> &TxGraph<A> {
    +        &self.graph
    +    }
    +}
     

\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/spk_client.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/spk_client.rs.html index b5674f7ead..754934a2d9 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/spk_client.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/spk_client.rs.html @@ -385,81 +385,15 @@ 385 386 387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446
//! Helper types for spk-based blockchain clients.
 
 use crate::{
-    collections::{BTreeMap, HashMap},
-    local_chain::CheckPoint,
-    ConfirmationTimeHeightAnchor, TxGraph,
+    collections::BTreeMap, local_chain::CheckPoint, ConfirmationTimeHeightAnchor, TxGraph,
 };
-use alloc::{boxed::Box, sync::Arc, vec::Vec};
-use bitcoin::{OutPoint, Script, ScriptBuf, Transaction, Txid};
+use alloc::{boxed::Box, vec::Vec};
+use bitcoin::{OutPoint, Script, ScriptBuf, Txid};
 use core::{fmt::Debug, marker::PhantomData, ops::RangeBounds};
 
-/// A cache of [`Arc`]-wrapped full transactions, identified by their [`Txid`]s.
-///
-/// This is used by the chain-source to avoid re-fetching full transactions.
-pub type TxCache = HashMap<Txid, Arc<Transaction>>;
-
 /// Data required to perform a spk-based blockchain client sync.
 ///
 /// A client sync fetches relevant chain data for a known list of scripts, transaction ids and
@@ -470,8 +404,6 @@
     ///
     /// [`LocalChain::tip`]: crate::local_chain::LocalChain::tip
     pub chain_tip: CheckPoint,
-    /// Cache of full transactions, so the chain-source can avoid re-fetching.
-    pub tx_cache: TxCache,
     /// Transactions that spend from or to these indexed script pubkeys.
     pub spks: Box<dyn ExactSizeIterator<Item = ScriptBuf> + Send>,
     /// Transactions with these txids.
@@ -485,36 +417,12 @@
     pub fn from_chain_tip(cp: CheckPoint) -> Self {
         Self {
             chain_tip: cp,
-            tx_cache: TxCache::new(),
             spks: Box::new(core::iter::empty()),
             txids: Box::new(core::iter::empty()),
             outpoints: Box::new(core::iter::empty()),
         }
     }
 
-    /// Add to the [`TxCache`] held by the request.
-    ///
-    /// This consumes the [`SyncRequest`] and returns the updated one.
-    #[must_use]
-    pub fn cache_txs<T>(mut self, full_txs: impl IntoIterator<Item = (Txid, T)>) -> Self
-    where
-        T: Into<Arc<Transaction>>,
-    {
-        self.tx_cache = full_txs
-            .into_iter()
-            .map(|(txid, tx)| (txid, tx.into()))
-            .collect();
-        self
-    }
-
-    /// Add all transactions from [`TxGraph`] into the [`TxCache`].
-    ///
-    /// This consumes the [`SyncRequest`] and returns the updated one.
-    #[must_use]
-    pub fn cache_graph_txs<A>(self, graph: &TxGraph<A>) -> Self {
-        self.cache_txs(graph.full_txs().map(|tx_node| (tx_node.txid, tx_node.tx)))
-    }
-
     /// Set the [`Script`]s that will be synced against.
     ///
     /// This consumes the [`SyncRequest`] and returns the updated one.
@@ -673,8 +581,6 @@
     ///
     /// [`LocalChain::tip`]: crate::local_chain::LocalChain::tip
     pub chain_tip: CheckPoint,
-    /// Cache of full transactions, so the chain-source can avoid re-fetching.
-    pub tx_cache: TxCache,
     /// Iterators of script pubkeys indexed by the keychain index.
     pub spks_by_keychain: BTreeMap<K, Box<dyn Iterator<Item = (u32, ScriptBuf)> + Send>>,
 }
@@ -685,34 +591,10 @@
     pub fn from_chain_tip(chain_tip: CheckPoint) -> Self {
         Self {
             chain_tip,
-            tx_cache: TxCache::new(),
             spks_by_keychain: BTreeMap::new(),
         }
     }
 
-    /// Add to the [`TxCache`] held by the request.
-    ///
-    /// This consumes the [`SyncRequest`] and returns the updated one.
-    #[must_use]
-    pub fn cache_txs<T>(mut self, full_txs: impl IntoIterator<Item = (Txid, T)>) -> Self
-    where
-        T: Into<Arc<Transaction>>,
-    {
-        self.tx_cache = full_txs
-            .into_iter()
-            .map(|(txid, tx)| (txid, tx.into()))
-            .collect();
-        self
-    }
-
-    /// Add all transactions from [`TxGraph`] into the [`TxCache`].
-    ///
-    /// This consumes the [`SyncRequest`] and returns the updated one.
-    #[must_use]
-    pub fn cache_graph_txs<A>(self, graph: &TxGraph<A>) -> Self {
-        self.cache_txs(graph.full_txs().map(|tx_node| (tx_node.txid, tx_node.tx)))
-    }
-
     /// Construct a new [`FullScanRequest`] from a given `chain_tip` and `index`.
     ///
     /// Unbounded script pubkey iterators for each keychain (`K`) are extracted using
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_electrum/bdk_electrum_client.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_electrum/bdk_electrum_client.rs.html
new file mode 100644
index 0000000000..5193fe2b37
--- /dev/null
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_electrum/bdk_electrum_client.rs.html
@@ -0,0 +1,1179 @@
+bdk_electrum_client.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
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+
use bdk_chain::{
+    bitcoin::{OutPoint, ScriptBuf, Transaction, Txid},
+    collections::{BTreeMap, HashMap, HashSet},
+    local_chain::CheckPoint,
+    spk_client::{FullScanRequest, FullScanResult, SyncRequest, SyncResult},
+    tx_graph::TxGraph,
+    BlockId, ConfirmationHeightAnchor, ConfirmationTimeHeightAnchor,
+};
+use core::str::FromStr;
+use electrum_client::{ElectrumApi, Error, HeaderNotification};
+use std::sync::{Arc, Mutex};
+
+/// We include a chain suffix of a certain length for the purpose of robustness.
+const CHAIN_SUFFIX_LENGTH: u32 = 8;
+
+/// Wrapper around an [`electrum_client::ElectrumApi`] which includes an internal in-memory
+/// transaction cache to avoid re-fetching already downloaded transactions.
+#[derive(Debug)]
+pub struct BdkElectrumClient<E> {
+    /// The internal [`electrum_client::ElectrumApi`]
+    pub inner: E,
+    /// The transaction cache
+    tx_cache: Mutex<HashMap<Txid, Arc<Transaction>>>,
+}
+
+impl<E: ElectrumApi> BdkElectrumClient<E> {
+    /// Creates a new bdk client from a [`electrum_client::ElectrumApi`]
+    pub fn new(client: E) -> Self {
+        Self {
+            inner: client,
+            tx_cache: Default::default(),
+        }
+    }
+
+    /// Inserts transactions into the transaction cache so that the client will not fetch these
+    /// transactions.
+    pub fn populate_tx_cache<A>(&self, tx_graph: impl AsRef<TxGraph<A>>) {
+        let txs = tx_graph
+            .as_ref()
+            .full_txs()
+            .map(|tx_node| (tx_node.txid, tx_node.tx));
+
+        let mut tx_cache = self.tx_cache.lock().unwrap();
+        for (txid, tx) in txs {
+            tx_cache.insert(txid, tx);
+        }
+    }
+
+    /// Fetch transaction of given `txid`.
+    ///
+    /// If it hits the cache it will return the cached version and avoid making the request.
+    pub fn fetch_tx(&self, txid: Txid) -> Result<Arc<Transaction>, Error> {
+        let tx_cache = self.tx_cache.lock().unwrap();
+
+        if let Some(tx) = tx_cache.get(&txid) {
+            return Ok(Arc::clone(tx));
+        }
+
+        drop(tx_cache);
+
+        let tx = Arc::new(self.inner.transaction_get(&txid)?);
+
+        self.tx_cache.lock().unwrap().insert(txid, Arc::clone(&tx));
+
+        Ok(tx)
+    }
+
+    /// Broadcasts a transaction to the network.
+    ///
+    /// This is a re-export of [`ElectrumApi::transaction_broadcast`].
+    pub fn transaction_broadcast(&self, tx: &Transaction) -> Result<Txid, Error> {
+        self.inner.transaction_broadcast(tx)
+    }
+
+    /// Full scan the keychain scripts specified with the blockchain (via an Electrum client) and
+    /// returns updates for [`bdk_chain`] data structures.
+    ///
+    /// - `request`: struct with data required to perform a spk-based blockchain client full scan,
+    ///              see [`FullScanRequest`]
+    /// - `stop_gap`: the full scan for each keychain stops after a gap of script pubkeys with no
+    ///              associated transactions
+    /// - `batch_size`: specifies the max number of script pubkeys to request for in a single batch
+    ///              request
+    /// - `fetch_prev_txouts`: specifies whether or not we want previous `TxOut`s for fee
+    pub fn full_scan<K: Ord + Clone>(
+        &self,
+        request: FullScanRequest<K>,
+        stop_gap: usize,
+        batch_size: usize,
+        fetch_prev_txouts: bool,
+    ) -> Result<ElectrumFullScanResult<K>, Error> {
+        let mut request_spks = request.spks_by_keychain;
+
+        // We keep track of already-scanned spks just in case a reorg happens and we need to do a
+        // rescan. We need to keep track of this as iterators in `keychain_spks` are "unbounded" so
+        // cannot be collected. In addition, we keep track of whether an spk has an active tx
+        // history for determining the `last_active_index`.
+        // * key: (keychain, spk_index) that identifies the spk.
+        // * val: (script_pubkey, has_tx_history).
+        let mut scanned_spks = BTreeMap::<(K, u32), (ScriptBuf, bool)>::new();
+
+        let update = loop {
+            let (tip, _) = construct_update_tip(&self.inner, request.chain_tip.clone())?;
+            let mut graph_update = TxGraph::<ConfirmationHeightAnchor>::default();
+            let cps = tip
+                .iter()
+                .take(10)
+                .map(|cp| (cp.height(), cp))
+                .collect::<BTreeMap<u32, CheckPoint>>();
+
+            if !request_spks.is_empty() {
+                if !scanned_spks.is_empty() {
+                    scanned_spks.append(
+                        &mut self.populate_with_spks(
+                            &cps,
+                            &mut graph_update,
+                            &mut scanned_spks
+                                .iter()
+                                .map(|(i, (spk, _))| (i.clone(), spk.clone())),
+                            stop_gap,
+                            batch_size,
+                        )?,
+                    );
+                }
+                for (keychain, keychain_spks) in &mut request_spks {
+                    scanned_spks.extend(
+                        self.populate_with_spks(
+                            &cps,
+                            &mut graph_update,
+                            keychain_spks,
+                            stop_gap,
+                            batch_size,
+                        )?
+                        .into_iter()
+                        .map(|(spk_i, spk)| ((keychain.clone(), spk_i), spk)),
+                    );
+                }
+            }
+
+            // check for reorgs during scan process
+            let server_blockhash = self.inner.block_header(tip.height() as usize)?.block_hash();
+            if tip.hash() != server_blockhash {
+                continue; // reorg
+            }
+
+            // Fetch previous `TxOut`s for fee calculation if flag is enabled.
+            if fetch_prev_txouts {
+                self.fetch_prev_txout(&mut graph_update)?;
+            }
+
+            let chain_update = tip;
+
+            let keychain_update = request_spks
+                .into_keys()
+                .filter_map(|k| {
+                    scanned_spks
+                        .range((k.clone(), u32::MIN)..=(k.clone(), u32::MAX))
+                        .rev()
+                        .find(|(_, (_, active))| *active)
+                        .map(|((_, i), _)| (k, *i))
+                })
+                .collect::<BTreeMap<_, _>>();
+
+            break FullScanResult {
+                graph_update,
+                chain_update,
+                last_active_indices: keychain_update,
+            };
+        };
+
+        Ok(ElectrumFullScanResult(update))
+    }
+
+    /// Sync a set of scripts with the blockchain (via an Electrum client) for the data specified
+    /// and returns updates for [`bdk_chain`] data structures.
+    ///
+    /// - `request`: struct with data required to perform a spk-based blockchain client sync,
+    ///              see [`SyncRequest`]
+    /// - `batch_size`: specifies the max number of script pubkeys to request for in a single batch
+    ///              request
+    /// - `fetch_prev_txouts`: specifies whether or not we want previous `TxOut`s for fee
+    ///              calculation
+    ///
+    /// If the scripts to sync are unknown, such as when restoring or importing a keychain that
+    /// may include scripts that have been used, use [`full_scan`] with the keychain.
+    ///
+    /// [`full_scan`]: Self::full_scan
+    pub fn sync(
+        &self,
+        request: SyncRequest,
+        batch_size: usize,
+        fetch_prev_txouts: bool,
+    ) -> Result<ElectrumSyncResult, Error> {
+        let full_scan_req = FullScanRequest::from_chain_tip(request.chain_tip.clone())
+            .set_spks_for_keychain((), request.spks.enumerate().map(|(i, spk)| (i as u32, spk)));
+        let mut full_scan_res = self
+            .full_scan(full_scan_req, usize::MAX, batch_size, false)?
+            .with_confirmation_height_anchor();
+
+        let (tip, _) = construct_update_tip(&self.inner, request.chain_tip)?;
+        let cps = tip
+            .iter()
+            .take(10)
+            .map(|cp| (cp.height(), cp))
+            .collect::<BTreeMap<u32, CheckPoint>>();
+
+        self.populate_with_txids(&cps, &mut full_scan_res.graph_update, request.txids)?;
+        self.populate_with_outpoints(&cps, &mut full_scan_res.graph_update, request.outpoints)?;
+
+        // Fetch previous `TxOut`s for fee calculation if flag is enabled.
+        if fetch_prev_txouts {
+            self.fetch_prev_txout(&mut full_scan_res.graph_update)?;
+        }
+
+        Ok(ElectrumSyncResult(SyncResult {
+            chain_update: full_scan_res.chain_update,
+            graph_update: full_scan_res.graph_update,
+        }))
+    }
+
+    /// Populate the `graph_update` with transactions/anchors associated with the given `spks`.
+    ///
+    /// Transactions that contains an output with requested spk, or spends form an output with
+    /// requested spk will be added to `graph_update`. Anchors of the aforementioned transactions are
+    /// also included.
+    ///
+    /// Checkpoints (in `cps`) are used to create anchors. The `tx_cache` is self-explanatory.
+    fn populate_with_spks<I: Ord + Clone>(
+        &self,
+        cps: &BTreeMap<u32, CheckPoint>,
+        graph_update: &mut TxGraph<ConfirmationHeightAnchor>,
+        spks: &mut impl Iterator<Item = (I, ScriptBuf)>,
+        stop_gap: usize,
+        batch_size: usize,
+    ) -> Result<BTreeMap<I, (ScriptBuf, bool)>, Error> {
+        let mut unused_spk_count = 0_usize;
+        let mut scanned_spks = BTreeMap::new();
+
+        loop {
+            let spks = (0..batch_size)
+                .map_while(|_| spks.next())
+                .collect::<Vec<_>>();
+            if spks.is_empty() {
+                return Ok(scanned_spks);
+            }
+
+            let spk_histories = self
+                .inner
+                .batch_script_get_history(spks.iter().map(|(_, s)| s.as_script()))?;
+
+            for ((spk_index, spk), spk_history) in spks.into_iter().zip(spk_histories) {
+                if spk_history.is_empty() {
+                    scanned_spks.insert(spk_index, (spk, false));
+                    unused_spk_count += 1;
+                    if unused_spk_count > stop_gap {
+                        return Ok(scanned_spks);
+                    }
+                    continue;
+                } else {
+                    scanned_spks.insert(spk_index, (spk, true));
+                    unused_spk_count = 0;
+                }
+
+                for tx_res in spk_history {
+                    let _ = graph_update.insert_tx(self.fetch_tx(tx_res.tx_hash)?);
+                    if let Some(anchor) = determine_tx_anchor(cps, tx_res.height, tx_res.tx_hash) {
+                        let _ = graph_update.insert_anchor(tx_res.tx_hash, anchor);
+                    }
+                }
+            }
+        }
+    }
+
+    // Helper function which fetches the `TxOut`s of our relevant transactions' previous transactions,
+    // which we do not have by default. This data is needed to calculate the transaction fee.
+    fn fetch_prev_txout(
+        &self,
+        graph_update: &mut TxGraph<ConfirmationHeightAnchor>,
+    ) -> Result<(), Error> {
+        let full_txs: Vec<Arc<Transaction>> =
+            graph_update.full_txs().map(|tx_node| tx_node.tx).collect();
+        for tx in full_txs {
+            for vin in &tx.input {
+                let outpoint = vin.previous_output;
+                let vout = outpoint.vout;
+                let prev_tx = self.fetch_tx(outpoint.txid)?;
+                let txout = prev_tx.output[vout as usize].clone();
+                let _ = graph_update.insert_txout(outpoint, txout);
+            }
+        }
+        Ok(())
+    }
+
+    /// Populate the `graph_update` with associated transactions/anchors of `outpoints`.
+    ///
+    /// Transactions in which the outpoint resides, and transactions that spend from the outpoint are
+    /// included. Anchors of the aforementioned transactions are included.
+    ///
+    /// Checkpoints (in `cps`) are used to create anchors. The `tx_cache` is self-explanatory.
+    fn populate_with_outpoints(
+        &self,
+        cps: &BTreeMap<u32, CheckPoint>,
+        graph_update: &mut TxGraph<ConfirmationHeightAnchor>,
+        outpoints: impl IntoIterator<Item = OutPoint>,
+    ) -> Result<(), Error> {
+        for outpoint in outpoints {
+            let op_txid = outpoint.txid;
+            let op_tx = self.fetch_tx(op_txid)?;
+            let op_txout = match op_tx.output.get(outpoint.vout as usize) {
+                Some(txout) => txout,
+                None => continue,
+            };
+            debug_assert_eq!(op_tx.txid(), op_txid);
+
+            // attempt to find the following transactions (alongside their chain positions), and
+            // add to our sparsechain `update`:
+            let mut has_residing = false; // tx in which the outpoint resides
+            let mut has_spending = false; // tx that spends the outpoint
+            for res in self.inner.script_get_history(&op_txout.script_pubkey)? {
+                if has_residing && has_spending {
+                    break;
+                }
+
+                if !has_residing && res.tx_hash == op_txid {
+                    has_residing = true;
+                    let _ = graph_update.insert_tx(Arc::clone(&op_tx));
+                    if let Some(anchor) = determine_tx_anchor(cps, res.height, res.tx_hash) {
+                        let _ = graph_update.insert_anchor(res.tx_hash, anchor);
+                    }
+                }
+
+                if !has_spending && res.tx_hash != op_txid {
+                    let res_tx = self.fetch_tx(res.tx_hash)?;
+                    // we exclude txs/anchors that do not spend our specified outpoint(s)
+                    has_spending = res_tx
+                        .input
+                        .iter()
+                        .any(|txin| txin.previous_output == outpoint);
+                    if !has_spending {
+                        continue;
+                    }
+                    let _ = graph_update.insert_tx(Arc::clone(&res_tx));
+                    if let Some(anchor) = determine_tx_anchor(cps, res.height, res.tx_hash) {
+                        let _ = graph_update.insert_anchor(res.tx_hash, anchor);
+                    }
+                }
+            }
+        }
+        Ok(())
+    }
+
+    /// Populate the `graph_update` with transactions/anchors of the provided `txids`.
+    fn populate_with_txids(
+        &self,
+        cps: &BTreeMap<u32, CheckPoint>,
+        graph_update: &mut TxGraph<ConfirmationHeightAnchor>,
+        txids: impl IntoIterator<Item = Txid>,
+    ) -> Result<(), Error> {
+        for txid in txids {
+            let tx = match self.fetch_tx(txid) {
+                Ok(tx) => tx,
+                Err(electrum_client::Error::Protocol(_)) => continue,
+                Err(other_err) => return Err(other_err),
+            };
+
+            let spk = tx
+                .output
+                .first()
+                .map(|txo| &txo.script_pubkey)
+                .expect("tx must have an output");
+
+            // because of restrictions of the Electrum API, we have to use the `script_get_history`
+            // call to get confirmation status of our transaction
+            let anchor = match self
+                .inner
+                .script_get_history(spk)?
+                .into_iter()
+                .find(|r| r.tx_hash == txid)
+            {
+                Some(r) => determine_tx_anchor(cps, r.height, txid),
+                None => continue,
+            };
+
+            let _ = graph_update.insert_tx(tx);
+            if let Some(anchor) = anchor {
+                let _ = graph_update.insert_anchor(txid, anchor);
+            }
+        }
+        Ok(())
+    }
+}
+
+/// The result of [`BdkElectrumClient::full_scan`].
+///
+/// This can be transformed into a [`FullScanResult`] with either [`ConfirmationHeightAnchor`] or
+/// [`ConfirmationTimeHeightAnchor`] anchor types.
+pub struct ElectrumFullScanResult<K>(FullScanResult<K, ConfirmationHeightAnchor>);
+
+impl<K> ElectrumFullScanResult<K> {
+    /// Return [`FullScanResult`] with [`ConfirmationHeightAnchor`].
+    pub fn with_confirmation_height_anchor(self) -> FullScanResult<K, ConfirmationHeightAnchor> {
+        self.0
+    }
+
+    /// Return [`FullScanResult`] with [`ConfirmationTimeHeightAnchor`].
+    ///
+    /// This requires additional calls to the Electrum server.
+    pub fn with_confirmation_time_height_anchor(
+        self,
+        client: &BdkElectrumClient<impl ElectrumApi>,
+    ) -> Result<FullScanResult<K, ConfirmationTimeHeightAnchor>, Error> {
+        let res = self.0;
+        Ok(FullScanResult {
+            graph_update: try_into_confirmation_time_result(res.graph_update, &client.inner)?,
+            chain_update: res.chain_update,
+            last_active_indices: res.last_active_indices,
+        })
+    }
+}
+
+/// The result of [`BdkElectrumClient::sync`].
+///
+/// This can be transformed into a [`SyncResult`] with either [`ConfirmationHeightAnchor`] or
+/// [`ConfirmationTimeHeightAnchor`] anchor types.
+pub struct ElectrumSyncResult(SyncResult<ConfirmationHeightAnchor>);
+
+impl ElectrumSyncResult {
+    /// Return [`SyncResult`] with [`ConfirmationHeightAnchor`].
+    pub fn with_confirmation_height_anchor(self) -> SyncResult<ConfirmationHeightAnchor> {
+        self.0
+    }
+
+    /// Return [`SyncResult`] with [`ConfirmationTimeHeightAnchor`].
+    ///
+    /// This requires additional calls to the Electrum server.
+    pub fn with_confirmation_time_height_anchor(
+        self,
+        client: &BdkElectrumClient<impl ElectrumApi>,
+    ) -> Result<SyncResult<ConfirmationTimeHeightAnchor>, Error> {
+        let res = self.0;
+        Ok(SyncResult {
+            graph_update: try_into_confirmation_time_result(res.graph_update, &client.inner)?,
+            chain_update: res.chain_update,
+        })
+    }
+}
+
+fn try_into_confirmation_time_result(
+    graph_update: TxGraph<ConfirmationHeightAnchor>,
+    client: &impl ElectrumApi,
+) -> Result<TxGraph<ConfirmationTimeHeightAnchor>, Error> {
+    let relevant_heights = graph_update
+        .all_anchors()
+        .iter()
+        .map(|(a, _)| a.confirmation_height)
+        .collect::<HashSet<_>>();
+
+    let height_to_time = relevant_heights
+        .clone()
+        .into_iter()
+        .zip(
+            client
+                .batch_block_header(relevant_heights)?
+                .into_iter()
+                .map(|bh| bh.time as u64),
+        )
+        .collect::<HashMap<u32, u64>>();
+
+    Ok(graph_update.map_anchors(|a| ConfirmationTimeHeightAnchor {
+        anchor_block: a.anchor_block,
+        confirmation_height: a.confirmation_height,
+        confirmation_time: height_to_time[&a.confirmation_height],
+    }))
+}
+
+/// Return a [`CheckPoint`] of the latest tip, that connects with `prev_tip`.
+fn construct_update_tip(
+    client: &impl ElectrumApi,
+    prev_tip: CheckPoint,
+) -> Result<(CheckPoint, Option<u32>), Error> {
+    let HeaderNotification { height, .. } = client.block_headers_subscribe()?;
+    let new_tip_height = height as u32;
+
+    // If electrum returns a tip height that is lower than our previous tip, then checkpoints do
+    // not need updating. We just return the previous tip and use that as the point of agreement.
+    if new_tip_height < prev_tip.height() {
+        return Ok((prev_tip.clone(), Some(prev_tip.height())));
+    }
+
+    // Atomically fetch the latest `CHAIN_SUFFIX_LENGTH` count of blocks from Electrum. We use this
+    // to construct our checkpoint update.
+    let mut new_blocks = {
+        let start_height = new_tip_height.saturating_sub(CHAIN_SUFFIX_LENGTH - 1);
+        let hashes = client
+            .block_headers(start_height as _, CHAIN_SUFFIX_LENGTH as _)?
+            .headers
+            .into_iter()
+            .map(|h| h.block_hash());
+        (start_height..).zip(hashes).collect::<BTreeMap<u32, _>>()
+    };
+
+    // Find the "point of agreement" (if any).
+    let agreement_cp = {
+        let mut agreement_cp = Option::<CheckPoint>::None;
+        for cp in prev_tip.iter() {
+            let cp_block = cp.block_id();
+            let hash = match new_blocks.get(&cp_block.height) {
+                Some(&hash) => hash,
+                None => {
+                    assert!(
+                        new_tip_height >= cp_block.height,
+                        "already checked that electrum's tip cannot be smaller"
+                    );
+                    let hash = client.block_header(cp_block.height as _)?.block_hash();
+                    new_blocks.insert(cp_block.height, hash);
+                    hash
+                }
+            };
+            if hash == cp_block.hash {
+                agreement_cp = Some(cp);
+                break;
+            }
+        }
+        agreement_cp
+    };
+
+    let agreement_height = agreement_cp.as_ref().map(CheckPoint::height);
+
+    let new_tip = new_blocks
+        .into_iter()
+        // Prune `new_blocks` to only include blocks that are actually new.
+        .filter(|(height, _)| Some(*height) > agreement_height)
+        .map(|(height, hash)| BlockId { height, hash })
+        .fold(agreement_cp, |prev_cp, block| {
+            Some(match prev_cp {
+                Some(cp) => cp.push(block).expect("must extend checkpoint"),
+                None => CheckPoint::new(block),
+            })
+        })
+        .expect("must have at least one checkpoint");
+
+    Ok((new_tip, agreement_height))
+}
+
+/// A [tx status] comprises of a concatenation of `tx_hash:height:`s. We transform a single one of
+/// these concatenations into a [`ConfirmationHeightAnchor`] if possible.
+///
+/// We use the lowest possible checkpoint as the anchor block (from `cps`). If an anchor block
+/// cannot be found, or the transaction is unconfirmed, [`None`] is returned.
+///
+/// [tx status](https://electrumx-spesmilo.readthedocs.io/en/latest/protocol-basics.html#status)
+fn determine_tx_anchor(
+    cps: &BTreeMap<u32, CheckPoint>,
+    raw_height: i32,
+    txid: Txid,
+) -> Option<ConfirmationHeightAnchor> {
+    // The electrum API has a weird quirk where an unconfirmed transaction is presented with a
+    // height of 0. To avoid invalid representation in our data structures, we manually set
+    // transactions residing in the genesis block to have height 0, then interpret a height of 0 as
+    // unconfirmed for all other transactions.
+    if txid
+        == Txid::from_str("4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b")
+            .expect("must deserialize genesis coinbase txid")
+    {
+        let anchor_block = cps.values().next()?.block_id();
+        return Some(ConfirmationHeightAnchor {
+            anchor_block,
+            confirmation_height: 0,
+        });
+    }
+    match raw_height {
+        h if h <= 0 => {
+            debug_assert!(h == 0 || h == -1, "unexpected height ({}) from electrum", h);
+            None
+        }
+        h => {
+            let h = h as u32;
+            let anchor_block = cps.range(h..).next().map(|(_, cp)| cp.block_id())?;
+            if h > anchor_block.height {
+                None
+            } else {
+                Some(ConfirmationHeightAnchor {
+                    anchor_block,
+                    confirmation_height: h,
+                })
+            }
+        }
+    }
+}
+
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_electrum/electrum_ext.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_electrum/electrum_ext.rs.html deleted file mode 100644 index a919f05ad4..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_electrum/electrum_ext.rs.html +++ /dev/null @@ -1,1173 +0,0 @@ -electrum_ext.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
-326
-327
-328
-329
-330
-331
-332
-333
-334
-335
-336
-337
-338
-339
-340
-341
-342
-343
-344
-345
-346
-347
-348
-349
-350
-351
-352
-353
-354
-355
-356
-357
-358
-359
-360
-361
-362
-363
-364
-365
-366
-367
-368
-369
-370
-371
-372
-373
-374
-375
-376
-377
-378
-379
-380
-381
-382
-383
-384
-385
-386
-387
-388
-389
-390
-391
-392
-393
-394
-395
-396
-397
-398
-399
-400
-401
-402
-403
-404
-405
-406
-407
-408
-409
-410
-411
-412
-413
-414
-415
-416
-417
-418
-419
-420
-421
-422
-423
-424
-425
-426
-427
-428
-429
-430
-431
-432
-433
-434
-435
-436
-437
-438
-439
-440
-441
-442
-443
-444
-445
-446
-447
-448
-449
-450
-451
-452
-453
-454
-455
-456
-457
-458
-459
-460
-461
-462
-463
-464
-465
-466
-467
-468
-469
-470
-471
-472
-473
-474
-475
-476
-477
-478
-479
-480
-481
-482
-483
-484
-485
-486
-487
-488
-489
-490
-491
-492
-493
-494
-495
-496
-497
-498
-499
-500
-501
-502
-503
-504
-505
-506
-507
-508
-509
-510
-511
-512
-513
-514
-515
-516
-517
-518
-519
-520
-521
-522
-523
-524
-525
-526
-527
-528
-529
-530
-531
-532
-533
-534
-535
-536
-537
-538
-539
-540
-541
-542
-543
-544
-545
-546
-547
-548
-549
-550
-551
-552
-553
-554
-555
-556
-557
-558
-559
-560
-561
-562
-563
-564
-565
-566
-567
-568
-569
-570
-571
-572
-573
-574
-575
-576
-577
-578
-579
-580
-581
-582
-583
-584
-585
-586
-
use bdk_chain::{
-    bitcoin::{OutPoint, ScriptBuf, Transaction, Txid},
-    collections::{BTreeMap, HashMap, HashSet},
-    local_chain::CheckPoint,
-    spk_client::{FullScanRequest, FullScanResult, SyncRequest, SyncResult, TxCache},
-    tx_graph::TxGraph,
-    BlockId, ConfirmationHeightAnchor, ConfirmationTimeHeightAnchor,
-};
-use core::str::FromStr;
-use electrum_client::{ElectrumApi, Error, HeaderNotification};
-use std::sync::Arc;
-
-/// We include a chain suffix of a certain length for the purpose of robustness.
-const CHAIN_SUFFIX_LENGTH: u32 = 8;
-
-/// Trait to extend [`electrum_client::Client`] functionality.
-pub trait ElectrumExt {
-    /// Full scan the keychain scripts specified with the blockchain (via an Electrum client) and
-    /// returns updates for [`bdk_chain`] data structures.
-    ///
-    /// - `request`: struct with data required to perform a spk-based blockchain client full scan,
-    ///              see [`FullScanRequest`]
-    /// - `stop_gap`: the full scan for each keychain stops after a gap of script pubkeys with no
-    ///              associated transactions
-    /// - `batch_size`: specifies the max number of script pubkeys to request for in a single batch
-    ///              request
-    /// - `fetch_prev_txouts`: specifies whether or not we want previous `TxOut`s for fee
-    ///              calculation
-    fn full_scan<K: Ord + Clone>(
-        &self,
-        request: FullScanRequest<K>,
-        stop_gap: usize,
-        batch_size: usize,
-        fetch_prev_txouts: bool,
-    ) -> Result<ElectrumFullScanResult<K>, Error>;
-
-    /// Sync a set of scripts with the blockchain (via an Electrum client) for the data specified
-    /// and returns updates for [`bdk_chain`] data structures.
-    ///
-    /// - `request`: struct with data required to perform a spk-based blockchain client sync,
-    ///              see [`SyncRequest`]
-    /// - `batch_size`: specifies the max number of script pubkeys to request for in a single batch
-    ///              request
-    /// - `fetch_prev_txouts`: specifies whether or not we want previous `TxOut`s for fee
-    ///              calculation
-    ///
-    /// If the scripts to sync are unknown, such as when restoring or importing a keychain that
-    /// may include scripts that have been used, use [`full_scan`] with the keychain.
-    ///
-    /// [`full_scan`]: ElectrumExt::full_scan
-    fn sync(
-        &self,
-        request: SyncRequest,
-        batch_size: usize,
-        fetch_prev_txouts: bool,
-    ) -> Result<ElectrumSyncResult, Error>;
-}
-
-impl<E: ElectrumApi> ElectrumExt for E {
-    fn full_scan<K: Ord + Clone>(
-        &self,
-        mut request: FullScanRequest<K>,
-        stop_gap: usize,
-        batch_size: usize,
-        fetch_prev_txouts: bool,
-    ) -> Result<ElectrumFullScanResult<K>, Error> {
-        let mut request_spks = request.spks_by_keychain;
-
-        // We keep track of already-scanned spks just in case a reorg happens and we need to do a
-        // rescan. We need to keep track of this as iterators in `keychain_spks` are "unbounded" so
-        // cannot be collected. In addition, we keep track of whether an spk has an active tx
-        // history for determining the `last_active_index`.
-        // * key: (keychain, spk_index) that identifies the spk.
-        // * val: (script_pubkey, has_tx_history).
-        let mut scanned_spks = BTreeMap::<(K, u32), (ScriptBuf, bool)>::new();
-
-        let update = loop {
-            let (tip, _) = construct_update_tip(self, request.chain_tip.clone())?;
-            let mut graph_update = TxGraph::<ConfirmationHeightAnchor>::default();
-            let cps = tip
-                .iter()
-                .take(10)
-                .map(|cp| (cp.height(), cp))
-                .collect::<BTreeMap<u32, CheckPoint>>();
-
-            if !request_spks.is_empty() {
-                if !scanned_spks.is_empty() {
-                    scanned_spks.append(&mut populate_with_spks(
-                        self,
-                        &cps,
-                        &mut request.tx_cache,
-                        &mut graph_update,
-                        &mut scanned_spks
-                            .iter()
-                            .map(|(i, (spk, _))| (i.clone(), spk.clone())),
-                        stop_gap,
-                        batch_size,
-                    )?);
-                }
-                for (keychain, keychain_spks) in &mut request_spks {
-                    scanned_spks.extend(
-                        populate_with_spks(
-                            self,
-                            &cps,
-                            &mut request.tx_cache,
-                            &mut graph_update,
-                            keychain_spks,
-                            stop_gap,
-                            batch_size,
-                        )?
-                        .into_iter()
-                        .map(|(spk_i, spk)| ((keychain.clone(), spk_i), spk)),
-                    );
-                }
-            }
-
-            // check for reorgs during scan process
-            let server_blockhash = self.block_header(tip.height() as usize)?.block_hash();
-            if tip.hash() != server_blockhash {
-                continue; // reorg
-            }
-
-            // Fetch previous `TxOut`s for fee calculation if flag is enabled.
-            if fetch_prev_txouts {
-                fetch_prev_txout(self, &mut request.tx_cache, &mut graph_update)?;
-            }
-
-            let chain_update = tip;
-
-            let keychain_update = request_spks
-                .into_keys()
-                .filter_map(|k| {
-                    scanned_spks
-                        .range((k.clone(), u32::MIN)..=(k.clone(), u32::MAX))
-                        .rev()
-                        .find(|(_, (_, active))| *active)
-                        .map(|((_, i), _)| (k, *i))
-                })
-                .collect::<BTreeMap<_, _>>();
-
-            break FullScanResult {
-                graph_update,
-                chain_update,
-                last_active_indices: keychain_update,
-            };
-        };
-
-        Ok(ElectrumFullScanResult(update))
-    }
-
-    fn sync(
-        &self,
-        request: SyncRequest,
-        batch_size: usize,
-        fetch_prev_txouts: bool,
-    ) -> Result<ElectrumSyncResult, Error> {
-        let mut tx_cache = request.tx_cache.clone();
-
-        let full_scan_req = FullScanRequest::from_chain_tip(request.chain_tip.clone())
-            .cache_txs(request.tx_cache)
-            .set_spks_for_keychain((), request.spks.enumerate().map(|(i, spk)| (i as u32, spk)));
-        let mut full_scan_res = self
-            .full_scan(full_scan_req, usize::MAX, batch_size, false)?
-            .with_confirmation_height_anchor();
-
-        let (tip, _) = construct_update_tip(self, request.chain_tip)?;
-        let cps = tip
-            .iter()
-            .take(10)
-            .map(|cp| (cp.height(), cp))
-            .collect::<BTreeMap<u32, CheckPoint>>();
-
-        populate_with_txids(
-            self,
-            &cps,
-            &mut tx_cache,
-            &mut full_scan_res.graph_update,
-            request.txids,
-        )?;
-        populate_with_outpoints(
-            self,
-            &cps,
-            &mut tx_cache,
-            &mut full_scan_res.graph_update,
-            request.outpoints,
-        )?;
-
-        // Fetch previous `TxOut`s for fee calculation if flag is enabled.
-        if fetch_prev_txouts {
-            fetch_prev_txout(self, &mut tx_cache, &mut full_scan_res.graph_update)?;
-        }
-
-        Ok(ElectrumSyncResult(SyncResult {
-            chain_update: full_scan_res.chain_update,
-            graph_update: full_scan_res.graph_update,
-        }))
-    }
-}
-
-/// The result of [`ElectrumExt::full_scan`].
-///
-/// This can be transformed into a [`FullScanResult`] with either [`ConfirmationHeightAnchor`] or
-/// [`ConfirmationTimeHeightAnchor`] anchor types.
-pub struct ElectrumFullScanResult<K>(FullScanResult<K, ConfirmationHeightAnchor>);
-
-impl<K> ElectrumFullScanResult<K> {
-    /// Return [`FullScanResult`] with [`ConfirmationHeightAnchor`].
-    pub fn with_confirmation_height_anchor(self) -> FullScanResult<K, ConfirmationHeightAnchor> {
-        self.0
-    }
-
-    /// Return [`FullScanResult`] with [`ConfirmationTimeHeightAnchor`].
-    ///
-    /// This requires additional calls to the Electrum server.
-    pub fn with_confirmation_time_height_anchor(
-        self,
-        client: &impl ElectrumApi,
-    ) -> Result<FullScanResult<K, ConfirmationTimeHeightAnchor>, Error> {
-        let res = self.0;
-        Ok(FullScanResult {
-            graph_update: try_into_confirmation_time_result(res.graph_update, client)?,
-            chain_update: res.chain_update,
-            last_active_indices: res.last_active_indices,
-        })
-    }
-}
-
-/// The result of [`ElectrumExt::sync`].
-///
-/// This can be transformed into a [`SyncResult`] with either [`ConfirmationHeightAnchor`] or
-/// [`ConfirmationTimeHeightAnchor`] anchor types.
-pub struct ElectrumSyncResult(SyncResult<ConfirmationHeightAnchor>);
-
-impl ElectrumSyncResult {
-    /// Return [`SyncResult`] with [`ConfirmationHeightAnchor`].
-    pub fn with_confirmation_height_anchor(self) -> SyncResult<ConfirmationHeightAnchor> {
-        self.0
-    }
-
-    /// Return [`SyncResult`] with [`ConfirmationTimeHeightAnchor`].
-    ///
-    /// This requires additional calls to the Electrum server.
-    pub fn with_confirmation_time_height_anchor(
-        self,
-        client: &impl ElectrumApi,
-    ) -> Result<SyncResult<ConfirmationTimeHeightAnchor>, Error> {
-        let res = self.0;
-        Ok(SyncResult {
-            graph_update: try_into_confirmation_time_result(res.graph_update, client)?,
-            chain_update: res.chain_update,
-        })
-    }
-}
-
-fn try_into_confirmation_time_result(
-    graph_update: TxGraph<ConfirmationHeightAnchor>,
-    client: &impl ElectrumApi,
-) -> Result<TxGraph<ConfirmationTimeHeightAnchor>, Error> {
-    let relevant_heights = graph_update
-        .all_anchors()
-        .iter()
-        .map(|(a, _)| a.confirmation_height)
-        .collect::<HashSet<_>>();
-
-    let height_to_time = relevant_heights
-        .clone()
-        .into_iter()
-        .zip(
-            client
-                .batch_block_header(relevant_heights)?
-                .into_iter()
-                .map(|bh| bh.time as u64),
-        )
-        .collect::<HashMap<u32, u64>>();
-
-    Ok(graph_update.map_anchors(|a| ConfirmationTimeHeightAnchor {
-        anchor_block: a.anchor_block,
-        confirmation_height: a.confirmation_height,
-        confirmation_time: height_to_time[&a.confirmation_height],
-    }))
-}
-
-/// Return a [`CheckPoint`] of the latest tip, that connects with `prev_tip`.
-fn construct_update_tip(
-    client: &impl ElectrumApi,
-    prev_tip: CheckPoint,
-) -> Result<(CheckPoint, Option<u32>), Error> {
-    let HeaderNotification { height, .. } = client.block_headers_subscribe()?;
-    let new_tip_height = height as u32;
-
-    // If electrum returns a tip height that is lower than our previous tip, then checkpoints do
-    // not need updating. We just return the previous tip and use that as the point of agreement.
-    if new_tip_height < prev_tip.height() {
-        return Ok((prev_tip.clone(), Some(prev_tip.height())));
-    }
-
-    // Atomically fetch the latest `CHAIN_SUFFIX_LENGTH` count of blocks from Electrum. We use this
-    // to construct our checkpoint update.
-    let mut new_blocks = {
-        let start_height = new_tip_height.saturating_sub(CHAIN_SUFFIX_LENGTH - 1);
-        let hashes = client
-            .block_headers(start_height as _, CHAIN_SUFFIX_LENGTH as _)?
-            .headers
-            .into_iter()
-            .map(|h| h.block_hash());
-        (start_height..).zip(hashes).collect::<BTreeMap<u32, _>>()
-    };
-
-    // Find the "point of agreement" (if any).
-    let agreement_cp = {
-        let mut agreement_cp = Option::<CheckPoint>::None;
-        for cp in prev_tip.iter() {
-            let cp_block = cp.block_id();
-            let hash = match new_blocks.get(&cp_block.height) {
-                Some(&hash) => hash,
-                None => {
-                    assert!(
-                        new_tip_height >= cp_block.height,
-                        "already checked that electrum's tip cannot be smaller"
-                    );
-                    let hash = client.block_header(cp_block.height as _)?.block_hash();
-                    new_blocks.insert(cp_block.height, hash);
-                    hash
-                }
-            };
-            if hash == cp_block.hash {
-                agreement_cp = Some(cp);
-                break;
-            }
-        }
-        agreement_cp
-    };
-
-    let agreement_height = agreement_cp.as_ref().map(CheckPoint::height);
-
-    let new_tip = new_blocks
-        .into_iter()
-        // Prune `new_blocks` to only include blocks that are actually new.
-        .filter(|(height, _)| Some(*height) > agreement_height)
-        .map(|(height, hash)| BlockId { height, hash })
-        .fold(agreement_cp, |prev_cp, block| {
-            Some(match prev_cp {
-                Some(cp) => cp.push(block).expect("must extend checkpoint"),
-                None => CheckPoint::new(block),
-            })
-        })
-        .expect("must have at least one checkpoint");
-
-    Ok((new_tip, agreement_height))
-}
-
-/// A [tx status] comprises of a concatenation of `tx_hash:height:`s. We transform a single one of
-/// these concatenations into a [`ConfirmationHeightAnchor`] if possible.
-///
-/// We use the lowest possible checkpoint as the anchor block (from `cps`). If an anchor block
-/// cannot be found, or the transaction is unconfirmed, [`None`] is returned.
-///
-/// [tx status](https://electrumx-spesmilo.readthedocs.io/en/latest/protocol-basics.html#status)
-fn determine_tx_anchor(
-    cps: &BTreeMap<u32, CheckPoint>,
-    raw_height: i32,
-    txid: Txid,
-) -> Option<ConfirmationHeightAnchor> {
-    // The electrum API has a weird quirk where an unconfirmed transaction is presented with a
-    // height of 0. To avoid invalid representation in our data structures, we manually set
-    // transactions residing in the genesis block to have height 0, then interpret a height of 0 as
-    // unconfirmed for all other transactions.
-    if txid
-        == Txid::from_str("4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b")
-            .expect("must deserialize genesis coinbase txid")
-    {
-        let anchor_block = cps.values().next()?.block_id();
-        return Some(ConfirmationHeightAnchor {
-            anchor_block,
-            confirmation_height: 0,
-        });
-    }
-    match raw_height {
-        h if h <= 0 => {
-            debug_assert!(h == 0 || h == -1, "unexpected height ({}) from electrum", h);
-            None
-        }
-        h => {
-            let h = h as u32;
-            let anchor_block = cps.range(h..).next().map(|(_, cp)| cp.block_id())?;
-            if h > anchor_block.height {
-                None
-            } else {
-                Some(ConfirmationHeightAnchor {
-                    anchor_block,
-                    confirmation_height: h,
-                })
-            }
-        }
-    }
-}
-
-/// Populate the `graph_update` with associated transactions/anchors of `outpoints`.
-///
-/// Transactions in which the outpoint resides, and transactions that spend from the outpoint are
-/// included. Anchors of the aforementioned transactions are included.
-///
-/// Checkpoints (in `cps`) are used to create anchors. The `tx_cache` is self-explanatory.
-fn populate_with_outpoints(
-    client: &impl ElectrumApi,
-    cps: &BTreeMap<u32, CheckPoint>,
-    tx_cache: &mut TxCache,
-    graph_update: &mut TxGraph<ConfirmationHeightAnchor>,
-    outpoints: impl IntoIterator<Item = OutPoint>,
-) -> Result<(), Error> {
-    for outpoint in outpoints {
-        let op_txid = outpoint.txid;
-        let op_tx = fetch_tx(client, tx_cache, op_txid)?;
-        let op_txout = match op_tx.output.get(outpoint.vout as usize) {
-            Some(txout) => txout,
-            None => continue,
-        };
-        debug_assert_eq!(op_tx.txid(), op_txid);
-
-        // attempt to find the following transactions (alongside their chain positions), and
-        // add to our sparsechain `update`:
-        let mut has_residing = false; // tx in which the outpoint resides
-        let mut has_spending = false; // tx that spends the outpoint
-        for res in client.script_get_history(&op_txout.script_pubkey)? {
-            if has_residing && has_spending {
-                break;
-            }
-
-            if !has_residing && res.tx_hash == op_txid {
-                has_residing = true;
-                let _ = graph_update.insert_tx(Arc::clone(&op_tx));
-                if let Some(anchor) = determine_tx_anchor(cps, res.height, res.tx_hash) {
-                    let _ = graph_update.insert_anchor(res.tx_hash, anchor);
-                }
-            }
-
-            if !has_spending && res.tx_hash != op_txid {
-                let res_tx = fetch_tx(client, tx_cache, res.tx_hash)?;
-                // we exclude txs/anchors that do not spend our specified outpoint(s)
-                has_spending = res_tx
-                    .input
-                    .iter()
-                    .any(|txin| txin.previous_output == outpoint);
-                if !has_spending {
-                    continue;
-                }
-                let _ = graph_update.insert_tx(Arc::clone(&res_tx));
-                if let Some(anchor) = determine_tx_anchor(cps, res.height, res.tx_hash) {
-                    let _ = graph_update.insert_anchor(res.tx_hash, anchor);
-                }
-            }
-        }
-    }
-    Ok(())
-}
-
-/// Populate the `graph_update` with transactions/anchors of the provided `txids`.
-fn populate_with_txids(
-    client: &impl ElectrumApi,
-    cps: &BTreeMap<u32, CheckPoint>,
-    tx_cache: &mut TxCache,
-    graph_update: &mut TxGraph<ConfirmationHeightAnchor>,
-    txids: impl IntoIterator<Item = Txid>,
-) -> Result<(), Error> {
-    for txid in txids {
-        let tx = match fetch_tx(client, tx_cache, txid) {
-            Ok(tx) => tx,
-            Err(electrum_client::Error::Protocol(_)) => continue,
-            Err(other_err) => return Err(other_err),
-        };
-
-        let spk = tx
-            .output
-            .first()
-            .map(|txo| &txo.script_pubkey)
-            .expect("tx must have an output");
-
-        // because of restrictions of the Electrum API, we have to use the `script_get_history`
-        // call to get confirmation status of our transaction
-        let anchor = match client
-            .script_get_history(spk)?
-            .into_iter()
-            .find(|r| r.tx_hash == txid)
-        {
-            Some(r) => determine_tx_anchor(cps, r.height, txid),
-            None => continue,
-        };
-
-        let _ = graph_update.insert_tx(tx);
-        if let Some(anchor) = anchor {
-            let _ = graph_update.insert_anchor(txid, anchor);
-        }
-    }
-    Ok(())
-}
-
-/// Fetch transaction of given `txid`.
-///
-/// We maintain a `tx_cache` so that we won't need to fetch from Electrum with every call.
-fn fetch_tx<C: ElectrumApi>(
-    client: &C,
-    tx_cache: &mut TxCache,
-    txid: Txid,
-) -> Result<Arc<Transaction>, Error> {
-    use bdk_chain::collections::hash_map::Entry;
-    Ok(match tx_cache.entry(txid) {
-        Entry::Occupied(entry) => entry.get().clone(),
-        Entry::Vacant(entry) => entry
-            .insert(Arc::new(client.transaction_get(&txid)?))
-            .clone(),
-    })
-}
-
-// Helper function which fetches the `TxOut`s of our relevant transactions' previous transactions,
-// which we do not have by default. This data is needed to calculate the transaction fee.
-fn fetch_prev_txout<C: ElectrumApi>(
-    client: &C,
-    tx_cache: &mut TxCache,
-    graph_update: &mut TxGraph<ConfirmationHeightAnchor>,
-) -> Result<(), Error> {
-    let full_txs: Vec<Arc<Transaction>> =
-        graph_update.full_txs().map(|tx_node| tx_node.tx).collect();
-    for tx in full_txs {
-        for vin in &tx.input {
-            let outpoint = vin.previous_output;
-            let vout = outpoint.vout;
-            let prev_tx = fetch_tx(client, tx_cache, outpoint.txid)?;
-            let txout = prev_tx.output[vout as usize].clone();
-            let _ = graph_update.insert_txout(outpoint, txout);
-        }
-    }
-    Ok(())
-}
-
-/// Populate the `graph_update` with transactions/anchors associated with the given `spks`.
-///
-/// Transactions that contains an output with requested spk, or spends form an output with
-/// requested spk will be added to `graph_update`. Anchors of the aforementioned transactions are
-/// also included.
-///
-/// Checkpoints (in `cps`) are used to create anchors. The `tx_cache` is self-explanatory.
-fn populate_with_spks<I: Ord + Clone>(
-    client: &impl ElectrumApi,
-    cps: &BTreeMap<u32, CheckPoint>,
-    tx_cache: &mut TxCache,
-    graph_update: &mut TxGraph<ConfirmationHeightAnchor>,
-    spks: &mut impl Iterator<Item = (I, ScriptBuf)>,
-    stop_gap: usize,
-    batch_size: usize,
-) -> Result<BTreeMap<I, (ScriptBuf, bool)>, Error> {
-    let mut unused_spk_count = 0_usize;
-    let mut scanned_spks = BTreeMap::new();
-
-    loop {
-        let spks = (0..batch_size)
-            .map_while(|_| spks.next())
-            .collect::<Vec<_>>();
-        if spks.is_empty() {
-            return Ok(scanned_spks);
-        }
-
-        let spk_histories =
-            client.batch_script_get_history(spks.iter().map(|(_, s)| s.as_script()))?;
-
-        for ((spk_index, spk), spk_history) in spks.into_iter().zip(spk_histories) {
-            if spk_history.is_empty() {
-                scanned_spks.insert(spk_index, (spk, false));
-                unused_spk_count += 1;
-                if unused_spk_count > stop_gap {
-                    return Ok(scanned_spks);
-                }
-                continue;
-            } else {
-                scanned_spks.insert(spk_index, (spk, true));
-                unused_spk_count = 0;
-            }
-
-            for tx_res in spk_history {
-                let _ = graph_update.insert_tx(fetch_tx(client, tx_cache, tx_res.tx_hash)?);
-                if let Some(anchor) = determine_tx_anchor(cps, tx_res.height, tx_res.tx_hash) {
-                    let _ = graph_update.insert_anchor(tx_res.tx_hash, anchor);
-                }
-            }
-        }
-    }
-}
-
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_electrum/lib.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_electrum/lib.rs.html index 831153d750..e35ccf65fc 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_electrum/lib.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_electrum/lib.rs.html @@ -19,12 +19,13 @@ 19 20 21 +22

//! This crate is used for updating structures of [`bdk_chain`] with data from an Electrum server.
 //!
-//! The two primary methods are [`ElectrumExt::sync`] and [`ElectrumExt::full_scan`]. In most cases
-//! [`ElectrumExt::sync`] is used to sync the transaction histories of scripts that the application
+//! The two primary methods are [`BdkElectrumClient::sync`] and [`BdkElectrumClient::full_scan`]. In most cases
+//! [`BdkElectrumClient::sync`] is used to sync the transaction histories of scripts that the application
 //! cares about, for example the scripts for all the receive addresses of a Wallet's keychain that it
-//! has shown a user. [`ElectrumExt::full_scan`] is meant to be used when importing or restoring a
+//! has shown a user. [`BdkElectrumClient::full_scan`] is meant to be used when importing or restoring a
 //! keychain where the range of possibly used scripts is not known. In this case it is necessary to
 //! scan all keychain scripts until a number (the "stop gap") of unused scripts is discovered. For a
 //! sync or full scan the user receives relevant blockchain data and output updates for
@@ -36,8 +37,9 @@
 
 #![warn(missing_docs)]
 
-mod electrum_ext;
+mod bdk_electrum_client;
+pub use bdk_electrum_client::*;
+
 pub use bdk_chain;
 pub use electrum_client;
-pub use electrum_ext::*;
 
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_wallet/wallet/mod.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_wallet/wallet/mod.rs.html index 8f8bb4ba15..d5c3617ddb 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_wallet/wallet/mod.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_wallet/wallet/mod.rs.html @@ -2636,8 +2636,6 @@ 2636 2637 2638 -2639 -2640
// Bitcoin Dev Kit
 // Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
 //
@@ -5137,7 +5135,6 @@
     /// start a blockchain sync with a spk based blockchain client.
     pub fn start_sync_with_revealed_spks(&self) -> SyncRequest {
         SyncRequest::from_chain_tip(self.chain.tip())
-            .cache_graph_txs(self.tx_graph())
             .populate_with_revealed_spks(&self.indexed_graph.index, ..)
     }
 
@@ -5151,7 +5148,6 @@
     /// in which the list of used scripts is not known.
     pub fn start_full_scan(&self) -> FullScanRequest<KeychainKind> {
         FullScanRequest::from_keychain_txout_index(self.chain.tip(), &self.indexed_graph.index)
-            .cache_graph_txs(self.tx_graph())
     }
 }
 
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/example_electrum/main.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/example_electrum/main.rs.html
index ba93c208c3..2c9fbba4f0 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/example_electrum/main.rs.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/example_electrum/main.rs.html
@@ -350,6 +350,7 @@
 350
 351
 352
+353
 
use std::{
     io::{self, Write},
     sync::Mutex,
@@ -366,7 +367,7 @@
 };
 use bdk_electrum::{
     electrum_client::{self, Client, ElectrumApi},
-    ElectrumExt,
+    BdkElectrumClient,
 };
 use example_cli::{
     anyhow::{self, Context},
@@ -498,7 +499,10 @@
         }
     };
 
-    let client = electrum_cmd.electrum_args().client(args.network)?;
+    let client = BdkElectrumClient::new(electrum_cmd.electrum_args().client(args.network)?);
+
+    // Tell the electrum client about the txs we've already got locally so it doesn't re-download them
+    client.populate_tx_cache(&*graph.lock().unwrap());
 
     let (chain_update, mut graph_update, keychain_update) = match electrum_cmd.clone() {
         ElectrumCommands::Scan {
@@ -511,7 +515,6 @@
                 let chain = &*chain.lock().unwrap();
 
                 FullScanRequest::from_chain_tip(chain.tip())
-                    .cache_graph_txs(graph.graph())
                     .set_spks_for_keychain(
                         Keychain::External,
                         graph
@@ -572,8 +575,7 @@
             }
 
             let chain_tip = chain.tip();
-            let mut request =
-                SyncRequest::from_chain_tip(chain_tip.clone()).cache_graph_txs(graph.graph());
+            let mut request = SyncRequest::from_chain_tip(chain_tip.clone());
 
             if all_spks {
                 let all_spks = graph
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/wallet_electrum_example/main.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/wallet_electrum_example/main.rs.html
index db3de56469..6e0dd9f12d 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/wallet_electrum_example/main.rs.html
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/wallet_electrum_example/main.rs.html
@@ -94,6 +94,10 @@
 94
 95
 96
+97
+98
+99
+100
 
const DB_MAGIC: &str = "bdk_wallet_electrum_example";
 const SEND_AMOUNT: Amount = Amount::from_sat(5000);
 const STOP_GAP: usize = 50;
@@ -102,10 +106,8 @@
 use std::io::Write;
 use std::str::FromStr;
 
-use bdk_electrum::{
-    electrum_client::{self, ElectrumApi},
-    ElectrumExt,
-};
+use bdk_electrum::electrum_client;
+use bdk_electrum::BdkElectrumClient;
 use bdk_file_store::Store;
 use bdk_wallet::bitcoin::{Address, Amount};
 use bdk_wallet::chain::collections::HashSet;
@@ -133,7 +135,13 @@
     println!("Wallet balance before syncing: {} sats", balance.total());
 
     print!("Syncing...");
-    let client = electrum_client::Client::new("ssl://electrum.blockstream.info:60002")?;
+    let client = BdkElectrumClient::new(electrum_client::Client::new(
+        "ssl://electrum.blockstream.info:60002",
+    )?);
+
+    // Populate the electrum client's transaction cache so it doesn't redownload transaction we
+    // already have.
+    client.populate_tx_cache(&wallet);
 
     let request = wallet
         .start_full_scan()
diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/bdk_electrum/electrum_ext/trait.ElectrumExt.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/bdk_electrum/electrum_ext/trait.ElectrumExt.js
deleted file mode 100644
index 11e040008a..0000000000
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/bdk_electrum/electrum_ext/trait.ElectrumExt.js
+++ /dev/null
@@ -1,3 +0,0 @@
-(function() {var implementors = {
-"bdk_electrum":[]
-};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/trait.impl/core/convert/trait.AsRef.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/convert/trait.AsRef.js
index a8b6b47c60..dbd166d78e 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/convert/trait.AsRef.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/convert/trait.AsRef.js
@@ -1,4 +1,4 @@
 (function() {var implementors = {
-"bdk_chain":[["impl AsRef<[u8; 32]> for DescriptorId"],["impl AsRef<[u8]> for DescriptorId"],["impl<A> AsRef<TxGraph<A>> for TxGraph<A>"]],
+"bdk_chain":[["impl AsRef<[u8; 32]> for DescriptorId"],["impl AsRef<[u8]> for DescriptorId"],["impl<A> AsRef<TxGraph<A>> for TxGraph<A>"],["impl<A, I> AsRef<TxGraph<A>> for IndexedTxGraph<A, I>"]],
 "bdk_wallet":[["impl AsRef<TxGraph<ConfirmationTimeHeightAnchor>> for Wallet"],["impl AsRef<[u8]> for KeychainKind"]]
 };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/trait.impl/core/fmt/trait.Debug.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/fmt/trait.Debug.js
index 98c6210c72..4b3d2287c1 100644
--- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/fmt/trait.Debug.js
+++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/fmt/trait.Debug.js
@@ -2,6 +2,7 @@
 "bdk_bitcoind_rpc":[["impl<B: Debug> Debug for BlockEvent<B>"]],
 "bdk_chain":[["impl Debug for ConfirmationTime"],["impl Debug for ApplyHeaderError"],["impl Debug for CalculateFeeError"],["impl Debug for Balance"],["impl Debug for AlterCheckPointError"],["impl Debug for CannotConnectError"],["impl Debug for CheckPoint"],["impl Debug for LocalChain"],["impl Debug for MissingGenesisError"],["impl Debug for BlockId"],["impl Debug for ConfirmationHeightAnchor"],["impl Debug for ConfirmationTimeHeightAnchor"],["impl Debug for DescriptorId"],["impl<'a, T: Debug, A: Debug> Debug for CanonicalTx<'a, T, A>"],["impl<'a, T: Debug, A: Debug> Debug for TxNode<'a, T, A>"],["impl<A: Debug> Debug for ChainPosition<A>"],["impl<A: Debug> Debug for FullTxOut<A>"],["impl<A: Debug> Debug for ChangeSet<A>"],["impl<A: Debug> Debug for TxGraph<A>"],["impl<A: Debug, I: Debug> Debug for IndexedTxGraph<A, I>"],["impl<A: Debug, IA: Debug> Debug for ChangeSet<A, IA>"],["impl<I: Debug> Debug for SpkTxOutIndex<I>"],["impl<K: Debug> Debug for ChangeSet<K>"],["impl<K: Debug> Debug for KeychainTxOutIndex<K>"]],
 "bdk_coin_select":[["impl Debug for ExcessStrategyKind"],["impl Debug for SelectionConstraint"],["impl Debug for CoinSelectorOpt"],["impl Debug for ExcessStrategy"],["impl Debug for Selection"],["impl Debug for SelectionError"],["impl Debug for WeightedValue"],["impl<'a> Debug for CoinSelector<'a>"]],
+"bdk_electrum":[["impl<E: Debug> Debug for BdkElectrumClient<E>"]],
 "bdk_file_store":[["impl Debug for FileError"],["impl Debug for IterError"],["impl<C> Debug for Store<C>
where\n C: Sync + Send + Debug,
"],["impl<C: Debug> Debug for AggregateChangesetsError<C>"]], "bdk_hwi":[["impl Debug for HWISigner"]], "bdk_persist":[["impl<C: Debug> Debug for Persist<C>"],["impl<K: Debug, A: Debug> Debug for CombinedChangeSet<K, A>"]], diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/marker/trait.Freeze.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/marker/trait.Freeze.js index 175a99c462..1e469f9a03 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/marker/trait.Freeze.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/marker/trait.Freeze.js @@ -2,7 +2,7 @@ "bdk_bitcoind_rpc":[["impl<'c, C> Freeze for Emitter<'c, C>",1,["bdk_bitcoind_rpc::Emitter"]],["impl<B> Freeze for BlockEvent<B>
where\n B: Freeze,
",1,["bdk_bitcoind_rpc::BlockEvent"]]], "bdk_chain":[["impl Freeze for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Freeze for ApplyHeaderError",1,["bdk_chain::local_chain::ApplyHeaderError"]],["impl Freeze for CalculateFeeError",1,["bdk_chain::tx_graph::CalculateFeeError"]],["impl Freeze for Balance",1,["bdk_chain::keychain::Balance"]],["impl Freeze for AlterCheckPointError",1,["bdk_chain::local_chain::AlterCheckPointError"]],["impl Freeze for CannotConnectError",1,["bdk_chain::local_chain::CannotConnectError"]],["impl Freeze for CheckPoint",1,["bdk_chain::local_chain::CheckPoint"]],["impl Freeze for CheckPointIter",1,["bdk_chain::local_chain::CheckPointIter"]],["impl Freeze for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl Freeze for MissingGenesisError",1,["bdk_chain::local_chain::MissingGenesisError"]],["impl Freeze for SyncRequest",1,["bdk_chain::spk_client::SyncRequest"]],["impl Freeze for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl Freeze for ConfirmationHeightAnchor",1,["bdk_chain::chain_data::ConfirmationHeightAnchor"]],["impl Freeze for ConfirmationTimeHeightAnchor",1,["bdk_chain::chain_data::ConfirmationTimeHeightAnchor"]],["impl Freeze for DescriptorId",1,["bdk_chain::descriptor_ext::DescriptorId"]],["impl<'a, T, A> Freeze for CanonicalTx<'a, T, A>
where\n T: Freeze,
",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<'a, T, A> Freeze for TxNode<'a, T, A>
where\n T: Freeze,
",1,["bdk_chain::tx_graph::TxNode"]],["impl<'g, A, F> Freeze for TxAncestors<'g, A, F>
where\n F: Freeze,
",1,["bdk_chain::tx_graph::TxAncestors"]],["impl<'g, A, F> Freeze for TxDescendants<'g, A, F>
where\n F: Freeze,
",1,["bdk_chain::tx_graph::TxDescendants"]],["impl<A> Freeze for ChainPosition<A>
where\n A: Freeze,
",1,["bdk_chain::chain_data::ChainPosition"]],["impl<A> Freeze for SyncResult<A>",1,["bdk_chain::spk_client::SyncResult"]],["impl<A> Freeze for FullTxOut<A>
where\n A: Freeze,
",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A> Freeze for ChangeSet<A>",1,["bdk_chain::tx_graph::ChangeSet"]],["impl<A> Freeze for TxGraph<A>",1,["bdk_chain::tx_graph::TxGraph"]],["impl<A, I> Freeze for IndexedTxGraph<A, I>
where\n I: Freeze,
",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> Freeze for ChangeSet<A, IA>
where\n IA: Freeze,
",1,["bdk_chain::indexed_tx_graph::ChangeSet"]],["impl<D> Freeze for SpkIterator<D>
where\n D: Freeze,
",1,["bdk_chain::spk_iter::SpkIterator"]],["impl<I> Freeze for SpkTxOutIndex<I>",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<K> Freeze for ChangeSet<K>",1,["bdk_chain::keychain::txout_index::ChangeSet"]],["impl<K> Freeze for KeychainTxOutIndex<K>",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> Freeze for FullScanRequest<K>",1,["bdk_chain::spk_client::FullScanRequest"]],["impl<K, A> Freeze for FullScanResult<K, A>",1,["bdk_chain::spk_client::FullScanResult"]]], "bdk_coin_select":[["impl Freeze for BnbLimit",1,["bdk_coin_select::bnb::BnbLimit"]],["impl Freeze for BranchStrategy",1,["bdk_coin_select::bnb::BranchStrategy"]],["impl Freeze for ExcessStrategyKind",1,["bdk_coin_select::coin_selector::ExcessStrategyKind"]],["impl Freeze for SelectionConstraint",1,["bdk_coin_select::coin_selector::SelectionConstraint"]],["impl Freeze for CoinSelectorOpt",1,["bdk_coin_select::coin_selector::CoinSelectorOpt"]],["impl Freeze for ExcessStrategy",1,["bdk_coin_select::coin_selector::ExcessStrategy"]],["impl Freeze for Selection",1,["bdk_coin_select::coin_selector::Selection"]],["impl Freeze for SelectionError",1,["bdk_coin_select::coin_selector::SelectionError"]],["impl Freeze for WeightedValue",1,["bdk_coin_select::coin_selector::WeightedValue"]],["impl<'a> Freeze for CoinSelector<'a>",1,["bdk_coin_select::coin_selector::CoinSelector"]],["impl<'c, 'f, S> Freeze for BnbIter<'c, 'f, S>
where\n S: Freeze,
",1,["bdk_coin_select::bnb::BnbIter"]],["impl<'c, S> Freeze for Bnb<'c, S>
where\n S: Freeze,
",1,["bdk_coin_select::bnb::Bnb"]]], -"bdk_electrum":[["impl Freeze for ElectrumSyncResult",1,["bdk_electrum::electrum_ext::ElectrumSyncResult"]],["impl<K> Freeze for ElectrumFullScanResult<K>",1,["bdk_electrum::electrum_ext::ElectrumFullScanResult"]]], +"bdk_electrum":[["impl Freeze for ElectrumSyncResult",1,["bdk_electrum::bdk_electrum_client::ElectrumSyncResult"]],["impl<E> !Freeze for BdkElectrumClient<E>",1,["bdk_electrum::bdk_electrum_client::BdkElectrumClient"]],["impl<K> Freeze for ElectrumFullScanResult<K>",1,["bdk_electrum::bdk_electrum_client::ElectrumFullScanResult"]]], "bdk_file_store":[["impl Freeze for FileError",1,["bdk_file_store::FileError"]],["impl Freeze for IterError",1,["bdk_file_store::entry_iter::IterError"]],["impl<'t, T> Freeze for EntryIter<'t, T>",1,["bdk_file_store::entry_iter::EntryIter"]],["impl<C> Freeze for AggregateChangesetsError<C>
where\n C: Freeze,
",1,["bdk_file_store::store::AggregateChangesetsError"]],["impl<C> Freeze for Store<C>",1,["bdk_file_store::store::Store"]]], "bdk_hwi":[["impl Freeze for HWISigner",1,["bdk_hwi::signer::HWISigner"]]], "bdk_persist":[["impl<C> Freeze for Persist<C>
where\n C: Freeze,
",1,["bdk_persist::persist::Persist"]],["impl<K, A> Freeze for CombinedChangeSet<K, A>",1,["bdk_persist::changeset::CombinedChangeSet"]]], diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/marker/trait.Send.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/marker/trait.Send.js index 972493b3f6..8ce2dc9c7c 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/marker/trait.Send.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/marker/trait.Send.js @@ -2,7 +2,7 @@ "bdk_bitcoind_rpc":[["impl<'c, C> Send for Emitter<'c, C>
where\n C: Sync,
",1,["bdk_bitcoind_rpc::Emitter"]],["impl<B> Send for BlockEvent<B>
where\n B: Send,
",1,["bdk_bitcoind_rpc::BlockEvent"]]], "bdk_chain":[["impl Send for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Send for ApplyHeaderError",1,["bdk_chain::local_chain::ApplyHeaderError"]],["impl Send for CalculateFeeError",1,["bdk_chain::tx_graph::CalculateFeeError"]],["impl Send for Balance",1,["bdk_chain::keychain::Balance"]],["impl Send for AlterCheckPointError",1,["bdk_chain::local_chain::AlterCheckPointError"]],["impl Send for CannotConnectError",1,["bdk_chain::local_chain::CannotConnectError"]],["impl Send for CheckPoint",1,["bdk_chain::local_chain::CheckPoint"]],["impl Send for CheckPointIter",1,["bdk_chain::local_chain::CheckPointIter"]],["impl Send for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl Send for MissingGenesisError",1,["bdk_chain::local_chain::MissingGenesisError"]],["impl Send for SyncRequest",1,["bdk_chain::spk_client::SyncRequest"]],["impl Send for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl Send for ConfirmationHeightAnchor",1,["bdk_chain::chain_data::ConfirmationHeightAnchor"]],["impl Send for ConfirmationTimeHeightAnchor",1,["bdk_chain::chain_data::ConfirmationTimeHeightAnchor"]],["impl Send for DescriptorId",1,["bdk_chain::descriptor_ext::DescriptorId"]],["impl<'a, T, A> Send for CanonicalTx<'a, T, A>
where\n T: Send,\n A: Sync,
",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<'a, T, A> Send for TxNode<'a, T, A>
where\n T: Send,\n A: Sync,
",1,["bdk_chain::tx_graph::TxNode"]],["impl<'g, A, F> Send for TxAncestors<'g, A, F>
where\n F: Send,\n A: Sync,
",1,["bdk_chain::tx_graph::TxAncestors"]],["impl<'g, A, F> Send for TxDescendants<'g, A, F>
where\n F: Send,\n A: Sync,
",1,["bdk_chain::tx_graph::TxDescendants"]],["impl<A> Send for ChainPosition<A>
where\n A: Send,
",1,["bdk_chain::chain_data::ChainPosition"]],["impl<A> Send for SyncResult<A>
where\n A: Send,
",1,["bdk_chain::spk_client::SyncResult"]],["impl<A> Send for FullTxOut<A>
where\n A: Send,
",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A> Send for ChangeSet<A>
where\n A: Send,
",1,["bdk_chain::tx_graph::ChangeSet"]],["impl<A> Send for TxGraph<A>
where\n A: Send,
",1,["bdk_chain::tx_graph::TxGraph"]],["impl<A, I> Send for IndexedTxGraph<A, I>
where\n I: Send,\n A: Send,
",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> Send for ChangeSet<A, IA>
where\n IA: Send,\n A: Send,
",1,["bdk_chain::indexed_tx_graph::ChangeSet"]],["impl<D> Send for SpkIterator<D>
where\n D: Send,
",1,["bdk_chain::spk_iter::SpkIterator"]],["impl<I> Send for SpkTxOutIndex<I>
where\n I: Send,
",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<K> Send for ChangeSet<K>
where\n K: Send,
",1,["bdk_chain::keychain::txout_index::ChangeSet"]],["impl<K> Send for KeychainTxOutIndex<K>
where\n K: Send,
",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> Send for FullScanRequest<K>
where\n K: Send,
",1,["bdk_chain::spk_client::FullScanRequest"]],["impl<K, A> Send for FullScanResult<K, A>
where\n K: Send,\n A: Send,
",1,["bdk_chain::spk_client::FullScanResult"]]], "bdk_coin_select":[["impl Send for BnbLimit",1,["bdk_coin_select::bnb::BnbLimit"]],["impl Send for BranchStrategy",1,["bdk_coin_select::bnb::BranchStrategy"]],["impl Send for ExcessStrategyKind",1,["bdk_coin_select::coin_selector::ExcessStrategyKind"]],["impl Send for SelectionConstraint",1,["bdk_coin_select::coin_selector::SelectionConstraint"]],["impl Send for CoinSelectorOpt",1,["bdk_coin_select::coin_selector::CoinSelectorOpt"]],["impl Send for ExcessStrategy",1,["bdk_coin_select::coin_selector::ExcessStrategy"]],["impl Send for Selection",1,["bdk_coin_select::coin_selector::Selection"]],["impl Send for SelectionError",1,["bdk_coin_select::coin_selector::SelectionError"]],["impl Send for WeightedValue",1,["bdk_coin_select::coin_selector::WeightedValue"]],["impl<'a> Send for CoinSelector<'a>",1,["bdk_coin_select::coin_selector::CoinSelector"]],["impl<'c, 'f, S> !Send for BnbIter<'c, 'f, S>",1,["bdk_coin_select::bnb::BnbIter"]],["impl<'c, S> Send for Bnb<'c, S>
where\n S: Send,
",1,["bdk_coin_select::bnb::Bnb"]]], -"bdk_electrum":[["impl Send for ElectrumSyncResult",1,["bdk_electrum::electrum_ext::ElectrumSyncResult"]],["impl<K> Send for ElectrumFullScanResult<K>
where\n K: Send,
",1,["bdk_electrum::electrum_ext::ElectrumFullScanResult"]]], +"bdk_electrum":[["impl Send for ElectrumSyncResult",1,["bdk_electrum::bdk_electrum_client::ElectrumSyncResult"]],["impl<E> Send for BdkElectrumClient<E>
where\n E: Send,
",1,["bdk_electrum::bdk_electrum_client::BdkElectrumClient"]],["impl<K> Send for ElectrumFullScanResult<K>
where\n K: Send,
",1,["bdk_electrum::bdk_electrum_client::ElectrumFullScanResult"]]], "bdk_file_store":[["impl Send for FileError",1,["bdk_file_store::FileError"]],["impl Send for IterError",1,["bdk_file_store::entry_iter::IterError"]],["impl<'t, T> Send for EntryIter<'t, T>
where\n T: Send,
",1,["bdk_file_store::entry_iter::EntryIter"]],["impl<C> Send for AggregateChangesetsError<C>
where\n C: Send,
",1,["bdk_file_store::store::AggregateChangesetsError"]],["impl<C> Send for Store<C>",1,["bdk_file_store::store::Store"]]], "bdk_hwi":[["impl Send for HWISigner",1,["bdk_hwi::signer::HWISigner"]]], "bdk_persist":[["impl<C> Send for Persist<C>
where\n C: Send,
",1,["bdk_persist::persist::Persist"]],["impl<K, A> Send for CombinedChangeSet<K, A>
where\n K: Send,\n A: Send,
",1,["bdk_persist::changeset::CombinedChangeSet"]]], diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/marker/trait.Sync.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/marker/trait.Sync.js index 9f49575ffc..c9f6219943 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/marker/trait.Sync.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/marker/trait.Sync.js @@ -2,7 +2,7 @@ "bdk_bitcoind_rpc":[["impl<'c, C> Sync for Emitter<'c, C>
where\n C: Sync,
",1,["bdk_bitcoind_rpc::Emitter"]],["impl<B> Sync for BlockEvent<B>
where\n B: Sync,
",1,["bdk_bitcoind_rpc::BlockEvent"]]], "bdk_chain":[["impl !Sync for SyncRequest",1,["bdk_chain::spk_client::SyncRequest"]],["impl Sync for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Sync for ApplyHeaderError",1,["bdk_chain::local_chain::ApplyHeaderError"]],["impl Sync for CalculateFeeError",1,["bdk_chain::tx_graph::CalculateFeeError"]],["impl Sync for Balance",1,["bdk_chain::keychain::Balance"]],["impl Sync for AlterCheckPointError",1,["bdk_chain::local_chain::AlterCheckPointError"]],["impl Sync for CannotConnectError",1,["bdk_chain::local_chain::CannotConnectError"]],["impl Sync for CheckPoint",1,["bdk_chain::local_chain::CheckPoint"]],["impl Sync for CheckPointIter",1,["bdk_chain::local_chain::CheckPointIter"]],["impl Sync for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl Sync for MissingGenesisError",1,["bdk_chain::local_chain::MissingGenesisError"]],["impl Sync for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl Sync for ConfirmationHeightAnchor",1,["bdk_chain::chain_data::ConfirmationHeightAnchor"]],["impl Sync for ConfirmationTimeHeightAnchor",1,["bdk_chain::chain_data::ConfirmationTimeHeightAnchor"]],["impl Sync for DescriptorId",1,["bdk_chain::descriptor_ext::DescriptorId"]],["impl<'a, T, A> Sync for CanonicalTx<'a, T, A>
where\n T: Sync,\n A: Sync,
",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<'a, T, A> Sync for TxNode<'a, T, A>
where\n T: Sync,\n A: Sync,
",1,["bdk_chain::tx_graph::TxNode"]],["impl<'g, A, F> Sync for TxAncestors<'g, A, F>
where\n F: Sync,\n A: Sync,
",1,["bdk_chain::tx_graph::TxAncestors"]],["impl<'g, A, F> Sync for TxDescendants<'g, A, F>
where\n F: Sync,\n A: Sync,
",1,["bdk_chain::tx_graph::TxDescendants"]],["impl<A> Sync for ChainPosition<A>
where\n A: Sync,
",1,["bdk_chain::chain_data::ChainPosition"]],["impl<A> Sync for SyncResult<A>
where\n A: Sync,
",1,["bdk_chain::spk_client::SyncResult"]],["impl<A> Sync for FullTxOut<A>
where\n A: Sync,
",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A> Sync for ChangeSet<A>
where\n A: Sync,
",1,["bdk_chain::tx_graph::ChangeSet"]],["impl<A> Sync for TxGraph<A>
where\n A: Sync,
",1,["bdk_chain::tx_graph::TxGraph"]],["impl<A, I> Sync for IndexedTxGraph<A, I>
where\n I: Sync,\n A: Sync,
",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> Sync for ChangeSet<A, IA>
where\n IA: Sync,\n A: Sync,
",1,["bdk_chain::indexed_tx_graph::ChangeSet"]],["impl<D> Sync for SpkIterator<D>
where\n D: Sync,
",1,["bdk_chain::spk_iter::SpkIterator"]],["impl<I> Sync for SpkTxOutIndex<I>
where\n I: Sync,
",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<K> !Sync for FullScanRequest<K>",1,["bdk_chain::spk_client::FullScanRequest"]],["impl<K> Sync for ChangeSet<K>
where\n K: Sync,
",1,["bdk_chain::keychain::txout_index::ChangeSet"]],["impl<K> Sync for KeychainTxOutIndex<K>
where\n K: Sync,
",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K, A> Sync for FullScanResult<K, A>
where\n K: Sync,\n A: Sync,
",1,["bdk_chain::spk_client::FullScanResult"]]], "bdk_coin_select":[["impl Sync for BnbLimit",1,["bdk_coin_select::bnb::BnbLimit"]],["impl Sync for BranchStrategy",1,["bdk_coin_select::bnb::BranchStrategy"]],["impl Sync for ExcessStrategyKind",1,["bdk_coin_select::coin_selector::ExcessStrategyKind"]],["impl Sync for SelectionConstraint",1,["bdk_coin_select::coin_selector::SelectionConstraint"]],["impl Sync for CoinSelectorOpt",1,["bdk_coin_select::coin_selector::CoinSelectorOpt"]],["impl Sync for ExcessStrategy",1,["bdk_coin_select::coin_selector::ExcessStrategy"]],["impl Sync for Selection",1,["bdk_coin_select::coin_selector::Selection"]],["impl Sync for SelectionError",1,["bdk_coin_select::coin_selector::SelectionError"]],["impl Sync for WeightedValue",1,["bdk_coin_select::coin_selector::WeightedValue"]],["impl<'a> Sync for CoinSelector<'a>",1,["bdk_coin_select::coin_selector::CoinSelector"]],["impl<'c, 'f, S> !Sync for BnbIter<'c, 'f, S>",1,["bdk_coin_select::bnb::BnbIter"]],["impl<'c, S> Sync for Bnb<'c, S>
where\n S: Sync,
",1,["bdk_coin_select::bnb::Bnb"]]], -"bdk_electrum":[["impl Sync for ElectrumSyncResult",1,["bdk_electrum::electrum_ext::ElectrumSyncResult"]],["impl<K> Sync for ElectrumFullScanResult<K>
where\n K: Sync,
",1,["bdk_electrum::electrum_ext::ElectrumFullScanResult"]]], +"bdk_electrum":[["impl Sync for ElectrumSyncResult",1,["bdk_electrum::bdk_electrum_client::ElectrumSyncResult"]],["impl<E> Sync for BdkElectrumClient<E>
where\n E: Sync,
",1,["bdk_electrum::bdk_electrum_client::BdkElectrumClient"]],["impl<K> Sync for ElectrumFullScanResult<K>
where\n K: Sync,
",1,["bdk_electrum::bdk_electrum_client::ElectrumFullScanResult"]]], "bdk_file_store":[["impl Sync for FileError",1,["bdk_file_store::FileError"]],["impl Sync for IterError",1,["bdk_file_store::entry_iter::IterError"]],["impl<'t, T> Sync for EntryIter<'t, T>
where\n T: Sync,
",1,["bdk_file_store::entry_iter::EntryIter"]],["impl<C> Sync for AggregateChangesetsError<C>
where\n C: Sync,
",1,["bdk_file_store::store::AggregateChangesetsError"]],["impl<C> Sync for Store<C>",1,["bdk_file_store::store::Store"]]], "bdk_hwi":[["impl Sync for HWISigner",1,["bdk_hwi::signer::HWISigner"]]], "bdk_persist":[["impl<C> Sync for Persist<C>
where\n C: Sync,
",1,["bdk_persist::persist::Persist"]],["impl<K, A> Sync for CombinedChangeSet<K, A>
where\n K: Sync,\n A: Sync,
",1,["bdk_persist::changeset::CombinedChangeSet"]]], diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/marker/trait.Unpin.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/marker/trait.Unpin.js index 27c8957560..a8fd731794 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/marker/trait.Unpin.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/marker/trait.Unpin.js @@ -2,7 +2,7 @@ "bdk_bitcoind_rpc":[["impl<'c, C> Unpin for Emitter<'c, C>",1,["bdk_bitcoind_rpc::Emitter"]],["impl<B> Unpin for BlockEvent<B>
where\n B: Unpin,
",1,["bdk_bitcoind_rpc::BlockEvent"]]], "bdk_chain":[["impl Unpin for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Unpin for ApplyHeaderError",1,["bdk_chain::local_chain::ApplyHeaderError"]],["impl Unpin for CalculateFeeError",1,["bdk_chain::tx_graph::CalculateFeeError"]],["impl Unpin for Balance",1,["bdk_chain::keychain::Balance"]],["impl Unpin for AlterCheckPointError",1,["bdk_chain::local_chain::AlterCheckPointError"]],["impl Unpin for CannotConnectError",1,["bdk_chain::local_chain::CannotConnectError"]],["impl Unpin for CheckPoint",1,["bdk_chain::local_chain::CheckPoint"]],["impl Unpin for CheckPointIter",1,["bdk_chain::local_chain::CheckPointIter"]],["impl Unpin for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl Unpin for MissingGenesisError",1,["bdk_chain::local_chain::MissingGenesisError"]],["impl Unpin for SyncRequest",1,["bdk_chain::spk_client::SyncRequest"]],["impl Unpin for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl Unpin for ConfirmationHeightAnchor",1,["bdk_chain::chain_data::ConfirmationHeightAnchor"]],["impl Unpin for ConfirmationTimeHeightAnchor",1,["bdk_chain::chain_data::ConfirmationTimeHeightAnchor"]],["impl Unpin for DescriptorId",1,["bdk_chain::descriptor_ext::DescriptorId"]],["impl<'a, T, A> Unpin for CanonicalTx<'a, T, A>
where\n T: Unpin,
",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<'a, T, A> Unpin for TxNode<'a, T, A>
where\n T: Unpin,
",1,["bdk_chain::tx_graph::TxNode"]],["impl<'g, A, F> Unpin for TxAncestors<'g, A, F>
where\n F: Unpin,
",1,["bdk_chain::tx_graph::TxAncestors"]],["impl<'g, A, F> Unpin for TxDescendants<'g, A, F>
where\n F: Unpin,
",1,["bdk_chain::tx_graph::TxDescendants"]],["impl<A> Unpin for ChainPosition<A>
where\n A: Unpin,
",1,["bdk_chain::chain_data::ChainPosition"]],["impl<A> Unpin for SyncResult<A>",1,["bdk_chain::spk_client::SyncResult"]],["impl<A> Unpin for FullTxOut<A>
where\n A: Unpin,
",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A> Unpin for ChangeSet<A>",1,["bdk_chain::tx_graph::ChangeSet"]],["impl<A> Unpin for TxGraph<A>",1,["bdk_chain::tx_graph::TxGraph"]],["impl<A, I> Unpin for IndexedTxGraph<A, I>
where\n I: Unpin,
",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> Unpin for ChangeSet<A, IA>
where\n IA: Unpin,
",1,["bdk_chain::indexed_tx_graph::ChangeSet"]],["impl<D> Unpin for SpkIterator<D>
where\n D: Unpin,
",1,["bdk_chain::spk_iter::SpkIterator"]],["impl<I> Unpin for SpkTxOutIndex<I>
where\n I: Unpin,
",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<K> Unpin for ChangeSet<K>",1,["bdk_chain::keychain::txout_index::ChangeSet"]],["impl<K> Unpin for KeychainTxOutIndex<K>",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> Unpin for FullScanRequest<K>",1,["bdk_chain::spk_client::FullScanRequest"]],["impl<K, A> Unpin for FullScanResult<K, A>",1,["bdk_chain::spk_client::FullScanResult"]]], "bdk_coin_select":[["impl Unpin for BnbLimit",1,["bdk_coin_select::bnb::BnbLimit"]],["impl Unpin for BranchStrategy",1,["bdk_coin_select::bnb::BranchStrategy"]],["impl Unpin for ExcessStrategyKind",1,["bdk_coin_select::coin_selector::ExcessStrategyKind"]],["impl Unpin for SelectionConstraint",1,["bdk_coin_select::coin_selector::SelectionConstraint"]],["impl Unpin for CoinSelectorOpt",1,["bdk_coin_select::coin_selector::CoinSelectorOpt"]],["impl Unpin for ExcessStrategy",1,["bdk_coin_select::coin_selector::ExcessStrategy"]],["impl Unpin for Selection",1,["bdk_coin_select::coin_selector::Selection"]],["impl Unpin for SelectionError",1,["bdk_coin_select::coin_selector::SelectionError"]],["impl Unpin for WeightedValue",1,["bdk_coin_select::coin_selector::WeightedValue"]],["impl<'a> Unpin for CoinSelector<'a>",1,["bdk_coin_select::coin_selector::CoinSelector"]],["impl<'c, 'f, S> Unpin for BnbIter<'c, 'f, S>
where\n S: Unpin,
",1,["bdk_coin_select::bnb::BnbIter"]],["impl<'c, S> Unpin for Bnb<'c, S>
where\n S: Unpin,
",1,["bdk_coin_select::bnb::Bnb"]]], -"bdk_electrum":[["impl Unpin for ElectrumSyncResult",1,["bdk_electrum::electrum_ext::ElectrumSyncResult"]],["impl<K> Unpin for ElectrumFullScanResult<K>",1,["bdk_electrum::electrum_ext::ElectrumFullScanResult"]]], +"bdk_electrum":[["impl Unpin for ElectrumSyncResult",1,["bdk_electrum::bdk_electrum_client::ElectrumSyncResult"]],["impl<E> Unpin for BdkElectrumClient<E>
where\n E: Unpin,
",1,["bdk_electrum::bdk_electrum_client::BdkElectrumClient"]],["impl<K> Unpin for ElectrumFullScanResult<K>",1,["bdk_electrum::bdk_electrum_client::ElectrumFullScanResult"]]], "bdk_file_store":[["impl Unpin for FileError",1,["bdk_file_store::FileError"]],["impl Unpin for IterError",1,["bdk_file_store::entry_iter::IterError"]],["impl<'t, T> Unpin for EntryIter<'t, T>
where\n T: Unpin,
",1,["bdk_file_store::entry_iter::EntryIter"]],["impl<C> Unpin for AggregateChangesetsError<C>
where\n C: Unpin,
",1,["bdk_file_store::store::AggregateChangesetsError"]],["impl<C> Unpin for Store<C>
where\n C: Unpin,
",1,["bdk_file_store::store::Store"]]], "bdk_hwi":[["impl Unpin for HWISigner",1,["bdk_hwi::signer::HWISigner"]]], "bdk_persist":[["impl<C> Unpin for Persist<C>
where\n C: Unpin,
",1,["bdk_persist::persist::Persist"]],["impl<K, A> Unpin for CombinedChangeSet<K, A>",1,["bdk_persist::changeset::CombinedChangeSet"]]], diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js index bd39b4849b..4587f9ffa8 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js @@ -2,7 +2,7 @@ "bdk_bitcoind_rpc":[["impl<'c, C> RefUnwindSafe for Emitter<'c, C>
where\n C: RefUnwindSafe,
",1,["bdk_bitcoind_rpc::Emitter"]],["impl<B> RefUnwindSafe for BlockEvent<B>
where\n B: RefUnwindSafe,
",1,["bdk_bitcoind_rpc::BlockEvent"]]], "bdk_chain":[["impl !RefUnwindSafe for SyncRequest",1,["bdk_chain::spk_client::SyncRequest"]],["impl RefUnwindSafe for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl RefUnwindSafe for ApplyHeaderError",1,["bdk_chain::local_chain::ApplyHeaderError"]],["impl RefUnwindSafe for CalculateFeeError",1,["bdk_chain::tx_graph::CalculateFeeError"]],["impl RefUnwindSafe for Balance",1,["bdk_chain::keychain::Balance"]],["impl RefUnwindSafe for AlterCheckPointError",1,["bdk_chain::local_chain::AlterCheckPointError"]],["impl RefUnwindSafe for CannotConnectError",1,["bdk_chain::local_chain::CannotConnectError"]],["impl RefUnwindSafe for CheckPoint",1,["bdk_chain::local_chain::CheckPoint"]],["impl RefUnwindSafe for CheckPointIter",1,["bdk_chain::local_chain::CheckPointIter"]],["impl RefUnwindSafe for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl RefUnwindSafe for MissingGenesisError",1,["bdk_chain::local_chain::MissingGenesisError"]],["impl RefUnwindSafe for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl RefUnwindSafe for ConfirmationHeightAnchor",1,["bdk_chain::chain_data::ConfirmationHeightAnchor"]],["impl RefUnwindSafe for ConfirmationTimeHeightAnchor",1,["bdk_chain::chain_data::ConfirmationTimeHeightAnchor"]],["impl RefUnwindSafe for DescriptorId",1,["bdk_chain::descriptor_ext::DescriptorId"]],["impl<'a, T, A> RefUnwindSafe for CanonicalTx<'a, T, A>
where\n T: RefUnwindSafe,\n A: RefUnwindSafe,
",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<'a, T, A> RefUnwindSafe for TxNode<'a, T, A>
where\n T: RefUnwindSafe,\n A: RefUnwindSafe,
",1,["bdk_chain::tx_graph::TxNode"]],["impl<'g, A, F> RefUnwindSafe for TxAncestors<'g, A, F>
where\n F: RefUnwindSafe,\n A: RefUnwindSafe,
",1,["bdk_chain::tx_graph::TxAncestors"]],["impl<'g, A, F> RefUnwindSafe for TxDescendants<'g, A, F>
where\n F: RefUnwindSafe,\n A: RefUnwindSafe,
",1,["bdk_chain::tx_graph::TxDescendants"]],["impl<A> RefUnwindSafe for ChainPosition<A>
where\n A: RefUnwindSafe,
",1,["bdk_chain::chain_data::ChainPosition"]],["impl<A> RefUnwindSafe for SyncResult<A>
where\n A: RefUnwindSafe,
",1,["bdk_chain::spk_client::SyncResult"]],["impl<A> RefUnwindSafe for FullTxOut<A>
where\n A: RefUnwindSafe,
",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A> RefUnwindSafe for ChangeSet<A>
where\n A: RefUnwindSafe,
",1,["bdk_chain::tx_graph::ChangeSet"]],["impl<A> RefUnwindSafe for TxGraph<A>
where\n A: RefUnwindSafe,
",1,["bdk_chain::tx_graph::TxGraph"]],["impl<A, I> RefUnwindSafe for IndexedTxGraph<A, I>
where\n I: RefUnwindSafe,\n A: RefUnwindSafe,
",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> RefUnwindSafe for ChangeSet<A, IA>
where\n IA: RefUnwindSafe,\n A: RefUnwindSafe,
",1,["bdk_chain::indexed_tx_graph::ChangeSet"]],["impl<D> RefUnwindSafe for SpkIterator<D>
where\n D: RefUnwindSafe,
",1,["bdk_chain::spk_iter::SpkIterator"]],["impl<I> RefUnwindSafe for SpkTxOutIndex<I>
where\n I: RefUnwindSafe,
",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<K> !RefUnwindSafe for FullScanRequest<K>",1,["bdk_chain::spk_client::FullScanRequest"]],["impl<K> RefUnwindSafe for ChangeSet<K>
where\n K: RefUnwindSafe,
",1,["bdk_chain::keychain::txout_index::ChangeSet"]],["impl<K> RefUnwindSafe for KeychainTxOutIndex<K>
where\n K: RefUnwindSafe,
",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K, A> RefUnwindSafe for FullScanResult<K, A>
where\n K: RefUnwindSafe,\n A: RefUnwindSafe,
",1,["bdk_chain::spk_client::FullScanResult"]]], "bdk_coin_select":[["impl RefUnwindSafe for BnbLimit",1,["bdk_coin_select::bnb::BnbLimit"]],["impl RefUnwindSafe for BranchStrategy",1,["bdk_coin_select::bnb::BranchStrategy"]],["impl RefUnwindSafe for ExcessStrategyKind",1,["bdk_coin_select::coin_selector::ExcessStrategyKind"]],["impl RefUnwindSafe for SelectionConstraint",1,["bdk_coin_select::coin_selector::SelectionConstraint"]],["impl RefUnwindSafe for CoinSelectorOpt",1,["bdk_coin_select::coin_selector::CoinSelectorOpt"]],["impl RefUnwindSafe for ExcessStrategy",1,["bdk_coin_select::coin_selector::ExcessStrategy"]],["impl RefUnwindSafe for Selection",1,["bdk_coin_select::coin_selector::Selection"]],["impl RefUnwindSafe for SelectionError",1,["bdk_coin_select::coin_selector::SelectionError"]],["impl RefUnwindSafe for WeightedValue",1,["bdk_coin_select::coin_selector::WeightedValue"]],["impl<'a> RefUnwindSafe for CoinSelector<'a>",1,["bdk_coin_select::coin_selector::CoinSelector"]],["impl<'c, 'f, S> !RefUnwindSafe for BnbIter<'c, 'f, S>",1,["bdk_coin_select::bnb::BnbIter"]],["impl<'c, S> RefUnwindSafe for Bnb<'c, S>
where\n S: RefUnwindSafe,
",1,["bdk_coin_select::bnb::Bnb"]]], -"bdk_electrum":[["impl RefUnwindSafe for ElectrumSyncResult",1,["bdk_electrum::electrum_ext::ElectrumSyncResult"]],["impl<K> RefUnwindSafe for ElectrumFullScanResult<K>
where\n K: RefUnwindSafe,
",1,["bdk_electrum::electrum_ext::ElectrumFullScanResult"]]], +"bdk_electrum":[["impl RefUnwindSafe for ElectrumSyncResult",1,["bdk_electrum::bdk_electrum_client::ElectrumSyncResult"]],["impl<E> RefUnwindSafe for BdkElectrumClient<E>
where\n E: RefUnwindSafe,
",1,["bdk_electrum::bdk_electrum_client::BdkElectrumClient"]],["impl<K> RefUnwindSafe for ElectrumFullScanResult<K>
where\n K: RefUnwindSafe,
",1,["bdk_electrum::bdk_electrum_client::ElectrumFullScanResult"]]], "bdk_file_store":[["impl !RefUnwindSafe for FileError",1,["bdk_file_store::FileError"]],["impl !RefUnwindSafe for IterError",1,["bdk_file_store::entry_iter::IterError"]],["impl<'t, T> RefUnwindSafe for EntryIter<'t, T>
where\n T: RefUnwindSafe,
",1,["bdk_file_store::entry_iter::EntryIter"]],["impl<C> !RefUnwindSafe for AggregateChangesetsError<C>",1,["bdk_file_store::store::AggregateChangesetsError"]],["impl<C> RefUnwindSafe for Store<C>
where\n C: RefUnwindSafe,
",1,["bdk_file_store::store::Store"]]], "bdk_hwi":[["impl !RefUnwindSafe for HWISigner",1,["bdk_hwi::signer::HWISigner"]]], "bdk_persist":[["impl<C> !RefUnwindSafe for Persist<C>",1,["bdk_persist::persist::Persist"]],["impl<K, A> RefUnwindSafe for CombinedChangeSet<K, A>
where\n K: RefUnwindSafe,\n A: RefUnwindSafe,
",1,["bdk_persist::changeset::CombinedChangeSet"]]], diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js index 2b50b3b86e..44202e5958 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js @@ -2,7 +2,7 @@ "bdk_bitcoind_rpc":[["impl<'c, C> UnwindSafe for Emitter<'c, C>
where\n C: RefUnwindSafe,
",1,["bdk_bitcoind_rpc::Emitter"]],["impl<B> UnwindSafe for BlockEvent<B>
where\n B: UnwindSafe,
",1,["bdk_bitcoind_rpc::BlockEvent"]]], "bdk_chain":[["impl !UnwindSafe for SyncRequest",1,["bdk_chain::spk_client::SyncRequest"]],["impl UnwindSafe for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl UnwindSafe for ApplyHeaderError",1,["bdk_chain::local_chain::ApplyHeaderError"]],["impl UnwindSafe for CalculateFeeError",1,["bdk_chain::tx_graph::CalculateFeeError"]],["impl UnwindSafe for Balance",1,["bdk_chain::keychain::Balance"]],["impl UnwindSafe for AlterCheckPointError",1,["bdk_chain::local_chain::AlterCheckPointError"]],["impl UnwindSafe for CannotConnectError",1,["bdk_chain::local_chain::CannotConnectError"]],["impl UnwindSafe for CheckPoint",1,["bdk_chain::local_chain::CheckPoint"]],["impl UnwindSafe for CheckPointIter",1,["bdk_chain::local_chain::CheckPointIter"]],["impl UnwindSafe for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl UnwindSafe for MissingGenesisError",1,["bdk_chain::local_chain::MissingGenesisError"]],["impl UnwindSafe for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl UnwindSafe for ConfirmationHeightAnchor",1,["bdk_chain::chain_data::ConfirmationHeightAnchor"]],["impl UnwindSafe for ConfirmationTimeHeightAnchor",1,["bdk_chain::chain_data::ConfirmationTimeHeightAnchor"]],["impl UnwindSafe for DescriptorId",1,["bdk_chain::descriptor_ext::DescriptorId"]],["impl<'a, T, A> UnwindSafe for CanonicalTx<'a, T, A>
where\n T: UnwindSafe,\n A: RefUnwindSafe,
",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<'a, T, A> UnwindSafe for TxNode<'a, T, A>
where\n T: UnwindSafe,\n A: RefUnwindSafe,
",1,["bdk_chain::tx_graph::TxNode"]],["impl<'g, A, F> UnwindSafe for TxAncestors<'g, A, F>
where\n F: UnwindSafe,\n A: RefUnwindSafe,
",1,["bdk_chain::tx_graph::TxAncestors"]],["impl<'g, A, F> UnwindSafe for TxDescendants<'g, A, F>
where\n F: UnwindSafe,\n A: RefUnwindSafe,
",1,["bdk_chain::tx_graph::TxDescendants"]],["impl<A> UnwindSafe for ChainPosition<A>
where\n A: UnwindSafe,
",1,["bdk_chain::chain_data::ChainPosition"]],["impl<A> UnwindSafe for SyncResult<A>
where\n A: RefUnwindSafe,
",1,["bdk_chain::spk_client::SyncResult"]],["impl<A> UnwindSafe for FullTxOut<A>
where\n A: UnwindSafe,
",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A> UnwindSafe for ChangeSet<A>
where\n A: RefUnwindSafe,
",1,["bdk_chain::tx_graph::ChangeSet"]],["impl<A> UnwindSafe for TxGraph<A>
where\n A: RefUnwindSafe,
",1,["bdk_chain::tx_graph::TxGraph"]],["impl<A, I> UnwindSafe for IndexedTxGraph<A, I>
where\n I: UnwindSafe,\n A: RefUnwindSafe,
",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> UnwindSafe for ChangeSet<A, IA>
where\n IA: UnwindSafe,\n A: RefUnwindSafe,
",1,["bdk_chain::indexed_tx_graph::ChangeSet"]],["impl<D> UnwindSafe for SpkIterator<D>
where\n D: UnwindSafe,
",1,["bdk_chain::spk_iter::SpkIterator"]],["impl<I> UnwindSafe for SpkTxOutIndex<I>",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<K> !UnwindSafe for FullScanRequest<K>",1,["bdk_chain::spk_client::FullScanRequest"]],["impl<K> UnwindSafe for ChangeSet<K>
where\n K: RefUnwindSafe,
",1,["bdk_chain::keychain::txout_index::ChangeSet"]],["impl<K> UnwindSafe for KeychainTxOutIndex<K>
where\n K: RefUnwindSafe,
",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K, A> UnwindSafe for FullScanResult<K, A>
where\n K: RefUnwindSafe,\n A: RefUnwindSafe,
",1,["bdk_chain::spk_client::FullScanResult"]]], "bdk_coin_select":[["impl UnwindSafe for BnbLimit",1,["bdk_coin_select::bnb::BnbLimit"]],["impl UnwindSafe for BranchStrategy",1,["bdk_coin_select::bnb::BranchStrategy"]],["impl UnwindSafe for ExcessStrategyKind",1,["bdk_coin_select::coin_selector::ExcessStrategyKind"]],["impl UnwindSafe for SelectionConstraint",1,["bdk_coin_select::coin_selector::SelectionConstraint"]],["impl UnwindSafe for CoinSelectorOpt",1,["bdk_coin_select::coin_selector::CoinSelectorOpt"]],["impl UnwindSafe for ExcessStrategy",1,["bdk_coin_select::coin_selector::ExcessStrategy"]],["impl UnwindSafe for Selection",1,["bdk_coin_select::coin_selector::Selection"]],["impl UnwindSafe for SelectionError",1,["bdk_coin_select::coin_selector::SelectionError"]],["impl UnwindSafe for WeightedValue",1,["bdk_coin_select::coin_selector::WeightedValue"]],["impl<'a> UnwindSafe for CoinSelector<'a>",1,["bdk_coin_select::coin_selector::CoinSelector"]],["impl<'c, 'f, S> !UnwindSafe for BnbIter<'c, 'f, S>",1,["bdk_coin_select::bnb::BnbIter"]],["impl<'c, S> UnwindSafe for Bnb<'c, S>
where\n S: UnwindSafe,
",1,["bdk_coin_select::bnb::Bnb"]]], -"bdk_electrum":[["impl UnwindSafe for ElectrumSyncResult",1,["bdk_electrum::electrum_ext::ElectrumSyncResult"]],["impl<K> UnwindSafe for ElectrumFullScanResult<K>
where\n K: RefUnwindSafe,
",1,["bdk_electrum::electrum_ext::ElectrumFullScanResult"]]], +"bdk_electrum":[["impl UnwindSafe for ElectrumSyncResult",1,["bdk_electrum::bdk_electrum_client::ElectrumSyncResult"]],["impl<E> UnwindSafe for BdkElectrumClient<E>
where\n E: UnwindSafe,
",1,["bdk_electrum::bdk_electrum_client::BdkElectrumClient"]],["impl<K> UnwindSafe for ElectrumFullScanResult<K>
where\n K: RefUnwindSafe,
",1,["bdk_electrum::bdk_electrum_client::ElectrumFullScanResult"]]], "bdk_file_store":[["impl !UnwindSafe for FileError",1,["bdk_file_store::FileError"]],["impl !UnwindSafe for IterError",1,["bdk_file_store::entry_iter::IterError"]],["impl<'t, T> !UnwindSafe for EntryIter<'t, T>",1,["bdk_file_store::entry_iter::EntryIter"]],["impl<C> !UnwindSafe for AggregateChangesetsError<C>",1,["bdk_file_store::store::AggregateChangesetsError"]],["impl<C> UnwindSafe for Store<C>
where\n C: UnwindSafe,
",1,["bdk_file_store::store::Store"]]], "bdk_hwi":[["impl UnwindSafe for HWISigner",1,["bdk_hwi::signer::HWISigner"]]], "bdk_persist":[["impl<C> !UnwindSafe for Persist<C>",1,["bdk_persist::persist::Persist"]],["impl<K, A> UnwindSafe for CombinedChangeSet<K, A>
where\n K: RefUnwindSafe,\n A: RefUnwindSafe,
",1,["bdk_persist::changeset::CombinedChangeSet"]]], diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/type.impl/bdk_chain/indexed_tx_graph/struct.IndexedTxGraph.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/type.impl/bdk_chain/indexed_tx_graph/struct.IndexedTxGraph.js index 73a7857ad9..1f89605c1b 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/type.impl/bdk_chain/indexed_tx_graph/struct.IndexedTxGraph.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/type.impl/bdk_chain/indexed_tx_graph/struct.IndexedTxGraph.js @@ -1,3 +1,3 @@ (function() {var type_impls = { -"example_cli":[["
source§

impl<A, I> Debug for IndexedTxGraph<A, I>
where\n A: Debug,\n I: Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","example_cli::KeychainTxGraph"],["
source§

impl<A, I> Default for IndexedTxGraph<A, I>
where\n I: Default,

source§

fn default() -> IndexedTxGraph<A, I>

Returns the “default value” for a type. Read more
","Default","example_cli::KeychainTxGraph"],["
source§

impl<A, I> IndexedTxGraph<A, I>

Methods are available if the anchor (A) implements AnchorFromBlockPosition.

\n
source

pub fn apply_block_relevant(\n &mut self,\n block: &Block,\n height: u32\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Batch insert all transactions of the given block of height, filtering out those that are\nirrelevant.

\n

Each inserted transaction’s anchor will be constructed from\nAnchorFromBlockPosition::from_block_position.

\n

Relevancy is determined by the internal Indexer::is_tx_relevant implementation of I.\nIrrelevant transactions in txs will be ignored.

\n
source

pub fn apply_block(\n &mut self,\n block: Block,\n height: u32\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Batch insert all transactions of the given block of height.

\n

Each inserted transaction’s anchor will be constructed from\nAnchorFromBlockPosition::from_block_position.

\n

To only insert relevant transactions, use apply_block_relevant instead.

\n
",0,"example_cli::KeychainTxGraph"],["
source§

impl<A, I> IndexedTxGraph<A, I>

source

pub fn new(index: I) -> IndexedTxGraph<A, I>

Construct a new IndexedTxGraph with a given index.

\n
source

pub fn graph(&self) -> &TxGraph<A>

Get a reference of the internal transaction graph.

\n
",0,"example_cli::KeychainTxGraph"],["
source§

impl<A, I> IndexedTxGraph<A, I>
where\n A: Anchor,\n I: Indexer,

source

pub fn apply_changeset(\n &mut self,\n changeset: ChangeSet<A, <I as Indexer>::ChangeSet>\n)

Applies the ChangeSet to the IndexedTxGraph.

\n
source

pub fn initial_changeset(&self) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Determines the ChangeSet between self and an empty IndexedTxGraph.

\n
",0,"example_cli::KeychainTxGraph"],["
source§

impl<A, I> IndexedTxGraph<A, I>
where\n A: Anchor,\n I: Indexer,\n <I as Indexer>::ChangeSet: Default + Append,

source

pub fn apply_update(\n &mut self,\n update: TxGraph<A>\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Apply an update directly.

\n

update is a TxGraph<A> and the resultant changes is returned as ChangeSet.

\n
source

pub fn insert_txout(\n &mut self,\n outpoint: OutPoint,\n txout: TxOut\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Insert a floating txout of given outpoint.

\n
source

pub fn insert_tx(\n &mut self,\n tx: Transaction\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Insert and index a transaction into the graph.

\n
source

pub fn insert_anchor(\n &mut self,\n txid: Txid,\n anchor: A\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Insert an anchor for a given transaction.

\n
source

pub fn insert_seen_at(\n &mut self,\n txid: Txid,\n seen_at: u64\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Insert a unix timestamp of when a transaction is seen in the mempool.

\n

This is used for transaction conflict resolution in TxGraph where the transaction with\nthe later last-seen is prioritized.

\n
source

pub fn batch_insert_relevant<'t>(\n &mut self,\n txs: impl IntoIterator<Item = (&'t Transaction, impl IntoIterator<Item = A>)>\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Batch insert transactions, filtering out those that are irrelevant.

\n

Relevancy is determined by the Indexer::is_tx_relevant implementation of I. Irrelevant\ntransactions in txs will be ignored. txs do not need to be in topological order.

\n
source

pub fn batch_insert_relevant_unconfirmed<'t>(\n &mut self,\n unconfirmed_txs: impl IntoIterator<Item = (&'t Transaction, u64)>\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Batch insert unconfirmed transactions, filtering out those that are irrelevant.

\n

Relevancy is determined by the internal Indexer::is_tx_relevant implementation of I.\nIrrelevant transactions in txs will be ignored.

\n

Items of txs are tuples containing the transaction and a last seen timestamp. The\nlast seen communicates when the transaction is last seen in the mempool which is used for\nconflict-resolution in TxGraph (refer to TxGraph::insert_seen_at for details).

\n
source

pub fn batch_insert_unconfirmed(\n &mut self,\n txs: impl IntoIterator<Item = (Transaction, u64)>\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Batch insert unconfirmed transactions.

\n

Items of txs are tuples containing the transaction and a last seen timestamp. The\nlast seen communicates when the transaction is last seen in the mempool which is used for\nconflict-resolution in TxGraph (refer to TxGraph::insert_seen_at for details).

\n

To filter out irrelevant transactions, use batch_insert_relevant_unconfirmed instead.

\n
",0,"example_cli::KeychainTxGraph"]] +"example_cli":[["
source§

impl<A, I> AsRef<TxGraph<A>> for IndexedTxGraph<A, I>

source§

fn as_ref(&self) -> &TxGraph<A>

Converts this type into a shared reference of the (usually inferred) input type.
","AsRef>","example_cli::KeychainTxGraph"],["
source§

impl<A, I> Debug for IndexedTxGraph<A, I>
where\n A: Debug,\n I: Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","example_cli::KeychainTxGraph"],["
source§

impl<A, I> Default for IndexedTxGraph<A, I>
where\n I: Default,

source§

fn default() -> IndexedTxGraph<A, I>

Returns the “default value” for a type. Read more
","Default","example_cli::KeychainTxGraph"],["
source§

impl<A, I> IndexedTxGraph<A, I>

Methods are available if the anchor (A) implements AnchorFromBlockPosition.

\n
source

pub fn apply_block_relevant(\n &mut self,\n block: &Block,\n height: u32\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Batch insert all transactions of the given block of height, filtering out those that are\nirrelevant.

\n

Each inserted transaction’s anchor will be constructed from\nAnchorFromBlockPosition::from_block_position.

\n

Relevancy is determined by the internal Indexer::is_tx_relevant implementation of I.\nIrrelevant transactions in txs will be ignored.

\n
source

pub fn apply_block(\n &mut self,\n block: Block,\n height: u32\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Batch insert all transactions of the given block of height.

\n

Each inserted transaction’s anchor will be constructed from\nAnchorFromBlockPosition::from_block_position.

\n

To only insert relevant transactions, use apply_block_relevant instead.

\n
",0,"example_cli::KeychainTxGraph"],["
source§

impl<A, I> IndexedTxGraph<A, I>

source

pub fn new(index: I) -> IndexedTxGraph<A, I>

Construct a new IndexedTxGraph with a given index.

\n
source

pub fn graph(&self) -> &TxGraph<A>

Get a reference of the internal transaction graph.

\n
",0,"example_cli::KeychainTxGraph"],["
source§

impl<A, I> IndexedTxGraph<A, I>
where\n A: Anchor,\n I: Indexer,

source

pub fn apply_changeset(\n &mut self,\n changeset: ChangeSet<A, <I as Indexer>::ChangeSet>\n)

Applies the ChangeSet to the IndexedTxGraph.

\n
source

pub fn initial_changeset(&self) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Determines the ChangeSet between self and an empty IndexedTxGraph.

\n
",0,"example_cli::KeychainTxGraph"],["
source§

impl<A, I> IndexedTxGraph<A, I>
where\n A: Anchor,\n I: Indexer,\n <I as Indexer>::ChangeSet: Default + Append,

source

pub fn apply_update(\n &mut self,\n update: TxGraph<A>\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Apply an update directly.

\n

update is a TxGraph<A> and the resultant changes is returned as ChangeSet.

\n
source

pub fn insert_txout(\n &mut self,\n outpoint: OutPoint,\n txout: TxOut\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Insert a floating txout of given outpoint.

\n
source

pub fn insert_tx(\n &mut self,\n tx: Transaction\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Insert and index a transaction into the graph.

\n
source

pub fn insert_anchor(\n &mut self,\n txid: Txid,\n anchor: A\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Insert an anchor for a given transaction.

\n
source

pub fn insert_seen_at(\n &mut self,\n txid: Txid,\n seen_at: u64\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Insert a unix timestamp of when a transaction is seen in the mempool.

\n

This is used for transaction conflict resolution in TxGraph where the transaction with\nthe later last-seen is prioritized.

\n
source

pub fn batch_insert_relevant<'t>(\n &mut self,\n txs: impl IntoIterator<Item = (&'t Transaction, impl IntoIterator<Item = A>)>\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Batch insert transactions, filtering out those that are irrelevant.

\n

Relevancy is determined by the Indexer::is_tx_relevant implementation of I. Irrelevant\ntransactions in txs will be ignored. txs do not need to be in topological order.

\n
source

pub fn batch_insert_relevant_unconfirmed<'t>(\n &mut self,\n unconfirmed_txs: impl IntoIterator<Item = (&'t Transaction, u64)>\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Batch insert unconfirmed transactions, filtering out those that are irrelevant.

\n

Relevancy is determined by the internal Indexer::is_tx_relevant implementation of I.\nIrrelevant transactions in txs will be ignored.

\n

Items of txs are tuples containing the transaction and a last seen timestamp. The\nlast seen communicates when the transaction is last seen in the mempool which is used for\nconflict-resolution in TxGraph (refer to TxGraph::insert_seen_at for details).

\n
source

pub fn batch_insert_unconfirmed(\n &mut self,\n txs: impl IntoIterator<Item = (Transaction, u64)>\n) -> ChangeSet<A, <I as Indexer>::ChangeSet>

Batch insert unconfirmed transactions.

\n

Items of txs are tuples containing the transaction and a last seen timestamp. The\nlast seen communicates when the transaction is last seen in the mempool which is used for\nconflict-resolution in TxGraph (refer to TxGraph::insert_seen_at for details).

\n

To filter out irrelevant transactions, use batch_insert_relevant_unconfirmed instead.

\n
",0,"example_cli::KeychainTxGraph"]] };if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/type.impl/std/collections/hash/map/struct.HashMap.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/type.impl/std/collections/hash/map/struct.HashMap.js deleted file mode 100644 index ef14b87769..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/type.impl/std/collections/hash/map/struct.HashMap.js +++ /dev/null @@ -1,3 +0,0 @@ -(function() {var type_impls = { -"bdk_chain":[["
1.0.0 · source§

impl<K, V, S> Clone for HashMap<K, V, S>
where\n K: Clone,\n V: Clone,\n S: Clone,

source§

fn clone(&self) -> HashMap<K, V, S>

Returns a copy of the value. Read more
source§

fn clone_from(&mut self, source: &HashMap<K, V, S>)

Performs copy-assignment from source. Read more
","Clone","bdk_chain::spk_client::TxCache"],["
1.0.0 · source§

impl<K, V, S> Debug for HashMap<K, V, S>
where\n K: Debug,\n V: Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","bdk_chain::spk_client::TxCache"],["
1.0.0 · source§

impl<K, V, S> Default for HashMap<K, V, S>
where\n S: Default,

source§

fn default() -> HashMap<K, V, S>

Creates an empty HashMap<K, V, S>, with the Default value for the hasher.

\n
","Default","bdk_chain::spk_client::TxCache"],["
source§

impl<'de, K, V, S> Deserialize<'de> for HashMap<K, V, S>
where\n K: Deserialize<'de> + Eq + Hash,\n V: Deserialize<'de>,\n S: BuildHasher + Default,

source§

fn deserialize<D>(\n deserializer: D\n) -> Result<HashMap<K, V, S>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","bdk_chain::spk_client::TxCache"],["
1.4.0 · source§

impl<'a, K, V, S> Extend<(&'a K, &'a V)> for HashMap<K, V, S>
where\n K: Eq + Hash + Copy,\n V: Copy,\n S: BuildHasher,

source§

fn extend<T>(&mut self, iter: T)
where\n T: IntoIterator<Item = (&'a K, &'a V)>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, _: (&'a K, &'a V))

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend<(&'a K, &'a V)>","bdk_chain::spk_client::TxCache"],["
1.0.0 · source§

impl<K, V, S> Extend<(K, V)> for HashMap<K, V, S>
where\n K: Eq + Hash,\n S: BuildHasher,

Inserts all new key-values from the iterator and replaces values with existing\nkeys with new values returned from the iterator.

\n
source§

fn extend<T>(&mut self, iter: T)
where\n T: IntoIterator<Item = (K, V)>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, _: (K, V))

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
","Extend<(K, V)>","bdk_chain::spk_client::TxCache"],["
1.56.0 · source§

impl<K, V, const N: usize> From<[(K, V); N]> for HashMap<K, V>
where\n K: Eq + Hash,

source§

fn from(arr: [(K, V); N]) -> HashMap<K, V>

§Examples
\n
use std::collections::HashMap;\n\nlet map1 = HashMap::from([(1, 2), (3, 4)]);\nlet map2: HashMap<_, _> = [(1, 2), (3, 4)].into();\nassert_eq!(map1, map2);
\n
","From<[(K, V); N]>","bdk_chain::spk_client::TxCache"],["
1.0.0 · source§

impl<K, V, S> FromIterator<(K, V)> for HashMap<K, V, S>
where\n K: Eq + Hash,\n S: BuildHasher + Default,

source§

fn from_iter<T>(iter: T) -> HashMap<K, V, S>
where\n T: IntoIterator<Item = (K, V)>,

Creates a value from an iterator. Read more
","FromIterator<(K, V)>","bdk_chain::spk_client::TxCache"],["
source§

impl<K, V> HashMap<K, V>

1.0.0 · source

pub fn new() -> HashMap<K, V>

Creates an empty HashMap.

\n

The hash map is initially created with a capacity of 0, so it will not allocate until it\nis first inserted into.

\n
§Examples
\n
use std::collections::HashMap;\nlet mut map: HashMap<&str, i32> = HashMap::new();
\n
1.0.0 · source

pub fn with_capacity(capacity: usize) -> HashMap<K, V>

Creates an empty HashMap with at least the specified capacity.

\n

The hash map will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the hash map will not allocate.

\n
§Examples
\n
use std::collections::HashMap;\nlet mut map: HashMap<&str, i32> = HashMap::with_capacity(10);
\n
",0,"bdk_chain::spk_client::TxCache"],["
source§

impl<K, V, S> HashMap<K, V, S>
where\n S: BuildHasher,

source

pub fn raw_entry_mut(&mut self) -> RawEntryBuilderMut<'_, K, V, S>

🔬This is a nightly-only experimental API. (hash_raw_entry)

Creates a raw entry builder for the HashMap.

\n

Raw entries provide the lowest level of control for searching and\nmanipulating a map. They must be manually initialized with a hash and\nthen manually searched. After this, insertions into a vacant entry\nstill require an owned key to be provided.

\n

Raw entries are useful for such exotic situations as:

\n
    \n
  • Hash memoization
  • \n
  • Deferring the creation of an owned key until it is known to be required
  • \n
  • Using a search key that doesn’t work with the Borrow trait
  • \n
  • Using custom comparison logic without newtype wrappers
  • \n
\n

Because raw entries provide much more low-level control, it’s much easier\nto put the HashMap into an inconsistent state which, while memory-safe,\nwill cause the map to produce seemingly random results. Higher-level and\nmore foolproof APIs like entry should be preferred when possible.

\n

In particular, the hash used to initialized the raw entry must still be\nconsistent with the hash of the key that is ultimately stored in the entry.\nThis is because implementations of HashMap may need to recompute hashes\nwhen resizing, at which point only the keys are available.

\n

Raw entries give mutable access to the keys. This must not be used\nto modify how the key would compare or hash, as the map will not re-evaluate\nwhere the key should go, meaning the keys may become “lost” if their\nlocation does not reflect their state. For instance, if you change a key\nso that the map now contains keys which compare equal, search may start\nacting erratically, with two keys randomly masking each other. Implementations\nare free to assume this doesn’t happen (within the limits of memory-safety).

\n
source

pub fn raw_entry(&self) -> RawEntryBuilder<'_, K, V, S>

🔬This is a nightly-only experimental API. (hash_raw_entry)

Creates a raw immutable entry builder for the HashMap.

\n

Raw entries provide the lowest level of control for searching and\nmanipulating a map. They must be manually initialized with a hash and\nthen manually searched.

\n

This is useful for

\n
    \n
  • Hash memoization
  • \n
  • Using a search key that doesn’t work with the Borrow trait
  • \n
  • Using custom comparison logic without newtype wrappers
  • \n
\n

Unless you are in such a situation, higher-level and more foolproof APIs like\nget should be preferred.

\n

Immutable raw entries have very limited use; you might instead want raw_entry_mut.

\n
",0,"bdk_chain::spk_client::TxCache"],["
source§

impl<K, V, S> HashMap<K, V, S>

1.7.0 (const: unstable) · source

pub fn with_hasher(hash_builder: S) -> HashMap<K, V, S>

Creates an empty HashMap which will use the given hash builder to hash\nkeys.

\n

The created map has the default initial capacity.

\n

Warning: hash_builder is normally randomly generated, and\nis designed to allow HashMaps to be resistant to attacks that\ncause many collisions and very poor performance. Setting it\nmanually using this function can expose a DoS attack vector.

\n

The hash_builder passed should implement the BuildHasher trait for\nthe HashMap to be useful, see its documentation for details.

\n
§Examples
\n
use std::collections::HashMap;\nuse std::hash::RandomState;\n\nlet s = RandomState::new();\nlet mut map = HashMap::with_hasher(s);\nmap.insert(1, 2);
\n
1.7.0 · source

pub fn with_capacity_and_hasher(capacity: usize, hasher: S) -> HashMap<K, V, S>

Creates an empty HashMap with at least the specified capacity, using\nhasher to hash the keys.

\n

The hash map will be able to hold at least capacity elements without\nreallocating. This method is allowed to allocate for more elements than\ncapacity. If capacity is 0, the hash map will not allocate.

\n

Warning: hasher is normally randomly generated, and\nis designed to allow HashMaps to be resistant to attacks that\ncause many collisions and very poor performance. Setting it\nmanually using this function can expose a DoS attack vector.

\n

The hasher passed should implement the BuildHasher trait for\nthe HashMap to be useful, see its documentation for details.

\n
§Examples
\n
use std::collections::HashMap;\nuse std::hash::RandomState;\n\nlet s = RandomState::new();\nlet mut map = HashMap::with_capacity_and_hasher(10, s);\nmap.insert(1, 2);
\n
1.0.0 · source

pub fn capacity(&self) -> usize

Returns the number of elements the map can hold without reallocating.

\n

This number is a lower bound; the HashMap<K, V> might be able to hold\nmore, but is guaranteed to be able to hold at least this many.

\n
§Examples
\n
use std::collections::HashMap;\nlet map: HashMap<i32, i32> = HashMap::with_capacity(100);\nassert!(map.capacity() >= 100);
\n
1.0.0 · source

pub fn keys(&self) -> Keys<'_, K, V> ⓘ

An iterator visiting all keys in arbitrary order.\nThe iterator element type is &'a K.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor key in map.keys() {\n    println!(\"{key}\");\n}
\n
§Performance
\n

In the current implementation, iterating over keys takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.54.0 · source

pub fn into_keys(self) -> IntoKeys<K, V> ⓘ

Creates a consuming iterator visiting all the keys in arbitrary order.\nThe map cannot be used after calling this.\nThe iterator element type is K.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nlet mut vec: Vec<&str> = map.into_keys().collect();\n// The `IntoKeys` iterator produces keys in arbitrary order, so the\n// keys must be sorted to test them against a sorted array.\nvec.sort_unstable();\nassert_eq!(vec, [\"a\", \"b\", \"c\"]);
\n
§Performance
\n

In the current implementation, iterating over keys takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn values(&self) -> Values<'_, K, V> ⓘ

An iterator visiting all values in arbitrary order.\nThe iterator element type is &'a V.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor val in map.values() {\n    println!(\"{val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over values takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.10.0 · source

pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> ⓘ

An iterator visiting all values mutably in arbitrary order.\nThe iterator element type is &'a mut V.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor val in map.values_mut() {\n    *val = *val + 10;\n}\n\nfor val in map.values() {\n    println!(\"{val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over values takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.54.0 · source

pub fn into_values(self) -> IntoValues<K, V> ⓘ

Creates a consuming iterator visiting all the values in arbitrary order.\nThe map cannot be used after calling this.\nThe iterator element type is V.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nlet mut vec: Vec<i32> = map.into_values().collect();\n// The `IntoValues` iterator produces values in arbitrary order, so\n// the values must be sorted to test them against a sorted array.\nvec.sort_unstable();\nassert_eq!(vec, [1, 2, 3]);
\n
§Performance
\n

In the current implementation, iterating over values takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn iter(&self) -> Iter<'_, K, V> ⓘ

An iterator visiting all key-value pairs in arbitrary order.\nThe iterator element type is (&'a K, &'a V).

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\nfor (key, val) in map.iter() {\n    println!(\"key: {key} val: {val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over map takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn iter_mut(&mut self) -> IterMut<'_, K, V> ⓘ

An iterator visiting all key-value pairs in arbitrary order,\nwith mutable references to the values.\nThe iterator element type is (&'a K, &'a mut V).

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\n// Update all values\nfor (_, val) in map.iter_mut() {\n    *val *= 2;\n}\n\nfor (key, val) in &map {\n    println!(\"key: {key} val: {val}\");\n}
\n
§Performance
\n

In the current implementation, iterating over map takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn len(&self) -> usize

Returns the number of elements in the map.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\nassert_eq!(a.len(), 0);\na.insert(1, \"a\");\nassert_eq!(a.len(), 1);
\n
1.0.0 · source

pub fn is_empty(&self) -> bool

Returns true if the map contains no elements.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\nassert!(a.is_empty());\na.insert(1, \"a\");\nassert!(!a.is_empty());
\n
1.6.0 · source

pub fn drain(&mut self) -> Drain<'_, K, V> ⓘ

Clears the map, returning all key-value pairs as an iterator. Keeps the\nallocated memory for reuse.

\n

If the returned iterator is dropped before being fully consumed, it\ndrops the remaining key-value pairs. The returned iterator keeps a\nmutable borrow on the map to optimize its implementation.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\na.insert(1, \"a\");\na.insert(2, \"b\");\n\nfor (k, v) in a.drain().take(1) {\n    assert!(k == 1 || k == 2);\n    assert!(v == \"a\" || v == \"b\");\n}\n\nassert!(a.is_empty());
\n
source

pub fn extract_if<F>(&mut self, pred: F) -> ExtractIf<'_, K, V, F> ⓘ
where\n F: FnMut(&K, &mut V) -> bool,

🔬This is a nightly-only experimental API. (hash_extract_if)

Creates an iterator which uses a closure to determine if an element should be removed.

\n

If the closure returns true, the element is removed from the map and yielded.\nIf the closure returns false, or panics, the element remains in the map and will not be\nyielded.

\n

Note that extract_if lets you mutate every value in the filter closure, regardless of\nwhether you choose to keep or remove it.

\n

If the returned ExtractIf is not exhausted, e.g. because it is dropped without iterating\nor the iteration short-circuits, then the remaining elements will be retained.\nUse retain with a negated predicate if you do not need the returned iterator.

\n
§Examples
\n

Splitting a map into even and odd keys, reusing the original map:

\n\n
#![feature(hash_extract_if)]\nuse std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = (0..8).map(|x| (x, x)).collect();\nlet extracted: HashMap<i32, i32> = map.extract_if(|k, _v| k % 2 == 0).collect();\n\nlet mut evens = extracted.keys().copied().collect::<Vec<_>>();\nlet mut odds = map.keys().copied().collect::<Vec<_>>();\nevens.sort();\nodds.sort();\n\nassert_eq!(evens, vec![0, 2, 4, 6]);\nassert_eq!(odds, vec![1, 3, 5, 7]);
\n
1.18.0 · source

pub fn retain<F>(&mut self, f: F)
where\n F: FnMut(&K, &mut V) -> bool,

Retains only the elements specified by the predicate.

\n

In other words, remove all pairs (k, v) for which f(&k, &mut v) returns false.\nThe elements are visited in unsorted (and unspecified) order.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = (0..8).map(|x| (x, x*10)).collect();\nmap.retain(|&k, _| k % 2 == 0);\nassert_eq!(map.len(), 4);
\n
§Performance
\n

In the current implementation, this operation takes O(capacity) time\ninstead of O(len) because it internally visits empty buckets too.

\n
1.0.0 · source

pub fn clear(&mut self)

Clears the map, removing all key-value pairs. Keeps the allocated memory\nfor reuse.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut a = HashMap::new();\na.insert(1, \"a\");\na.clear();\nassert!(a.is_empty());
\n
1.9.0 · source

pub fn hasher(&self) -> &S

Returns a reference to the map’s BuildHasher.

\n
§Examples
\n
use std::collections::HashMap;\nuse std::hash::RandomState;\n\nlet hasher = RandomState::new();\nlet map: HashMap<i32, i32> = HashMap::with_hasher(hasher);\nlet hasher: &RandomState = map.hasher();
\n
",0,"bdk_chain::spk_client::TxCache"],["
source§

impl<K, V, S> HashMap<K, V, S>
where\n K: Eq + Hash,\n S: BuildHasher,

1.0.0 · source

pub fn reserve(&mut self, additional: usize)

Reserves capacity for at least additional more elements to be inserted\nin the HashMap. The collection may reserve more space to speculatively\navoid frequent reallocations. After calling reserve,\ncapacity will be greater than or equal to self.len() + additional.\nDoes nothing if capacity is already sufficient.

\n
§Panics
\n

Panics if the new allocation size overflows usize.

\n
§Examples
\n
use std::collections::HashMap;\nlet mut map: HashMap<&str, i32> = HashMap::new();\nmap.reserve(10);
\n
1.57.0 · source

pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>

Tries to reserve capacity for at least additional more elements to be inserted\nin the HashMap. The collection may reserve more space to speculatively\navoid frequent reallocations. After calling try_reserve,\ncapacity will be greater than or equal to self.len() + additional if\nit returns Ok(()).\nDoes nothing if capacity is already sufficient.

\n
§Errors
\n

If the capacity overflows, or the allocator reports a failure, then an error\nis returned.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<&str, isize> = HashMap::new();\nmap.try_reserve(10).expect(\"why is the test harness OOMing on a handful of bytes?\");
\n
1.0.0 · source

pub fn shrink_to_fit(&mut self)

Shrinks the capacity of the map as much as possible. It will drop\ndown as much as possible while maintaining the internal rules\nand possibly leaving some space in accordance with the resize policy.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = HashMap::with_capacity(100);\nmap.insert(1, 2);\nmap.insert(3, 4);\nassert!(map.capacity() >= 100);\nmap.shrink_to_fit();\nassert!(map.capacity() >= 2);
\n
1.56.0 · source

pub fn shrink_to(&mut self, min_capacity: usize)

Shrinks the capacity of the map with a lower limit. It will drop\ndown no lower than the supplied limit while maintaining the internal rules\nand possibly leaving some space in accordance with the resize policy.

\n

If the current capacity is less than the lower limit, this is a no-op.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map: HashMap<i32, i32> = HashMap::with_capacity(100);\nmap.insert(1, 2);\nmap.insert(3, 4);\nassert!(map.capacity() >= 100);\nmap.shrink_to(10);\nassert!(map.capacity() >= 10);\nmap.shrink_to(0);\nassert!(map.capacity() >= 2);
\n
1.0.0 · source

pub fn entry(&mut self, key: K) -> Entry<'_, K, V>

Gets the given key’s corresponding entry in the map for in-place manipulation.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut letters = HashMap::new();\n\nfor ch in \"a short treatise on fungi\".chars() {\n    letters.entry(ch).and_modify(|counter| *counter += 1).or_insert(1);\n}\n\nassert_eq!(letters[&'s'], 2);\nassert_eq!(letters[&'t'], 3);\nassert_eq!(letters[&'u'], 1);\nassert_eq!(letters.get(&'y'), None);
\n
1.0.0 · source

pub fn get<Q>(&self, k: &Q) -> Option<&V>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns a reference to the value corresponding to the key.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.get(&1), Some(&\"a\"));\nassert_eq!(map.get(&2), None);
\n
1.40.0 · source

pub fn get_key_value<Q>(&self, k: &Q) -> Option<(&K, &V)>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns the key-value pair corresponding to the supplied key.

\n

The supplied key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.get_key_value(&1), Some((&1, &\"a\")));\nassert_eq!(map.get_key_value(&2), None);
\n
source

pub fn get_many_mut<Q, const N: usize>(\n &mut self,\n ks: [&Q; N]\n) -> Option<[&mut V; N]>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

🔬This is a nightly-only experimental API. (map_many_mut)

Attempts to get mutable references to N values in the map at once.

\n

Returns an array of length N with the results of each query. For soundness, at most one\nmutable reference will be returned to any value. None will be returned if any of the\nkeys are duplicates or missing.

\n
§Examples
\n
#![feature(map_many_mut)]\nuse std::collections::HashMap;\n\nlet mut libraries = HashMap::new();\nlibraries.insert(\"Bodleian Library\".to_string(), 1602);\nlibraries.insert(\"Athenæum\".to_string(), 1807);\nlibraries.insert(\"Herzogin-Anna-Amalia-Bibliothek\".to_string(), 1691);\nlibraries.insert(\"Library of Congress\".to_string(), 1800);\n\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"Library of Congress\",\n]);\nassert_eq!(\n    got,\n    Some([\n        &mut 1807,\n        &mut 1800,\n    ]),\n);\n\n// Missing keys result in None\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"New York Public Library\",\n]);\nassert_eq!(got, None);\n\n// Duplicate keys result in None\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"Athenæum\",\n]);\nassert_eq!(got, None);
\n
source

pub unsafe fn get_many_unchecked_mut<Q, const N: usize>(\n &mut self,\n ks: [&Q; N]\n) -> Option<[&mut V; N]>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

🔬This is a nightly-only experimental API. (map_many_mut)

Attempts to get mutable references to N values in the map at once, without validating that\nthe values are unique.

\n

Returns an array of length N with the results of each query. None will be returned if\nany of the keys are missing.

\n

For a safe alternative see get_many_mut.

\n
§Safety
\n

Calling this method with overlapping keys is undefined behavior even if the resulting\nreferences are not used.

\n
§Examples
\n
#![feature(map_many_mut)]\nuse std::collections::HashMap;\n\nlet mut libraries = HashMap::new();\nlibraries.insert(\"Bodleian Library\".to_string(), 1602);\nlibraries.insert(\"Athenæum\".to_string(), 1807);\nlibraries.insert(\"Herzogin-Anna-Amalia-Bibliothek\".to_string(), 1691);\nlibraries.insert(\"Library of Congress\".to_string(), 1800);\n\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"Library of Congress\",\n]);\nassert_eq!(\n    got,\n    Some([\n        &mut 1807,\n        &mut 1800,\n    ]),\n);\n\n// Missing keys result in None\nlet got = libraries.get_many_mut([\n    \"Athenæum\",\n    \"New York Public Library\",\n]);\nassert_eq!(got, None);
\n
1.0.0 · source

pub fn contains_key<Q>(&self, k: &Q) -> bool
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns true if the map contains a value for the specified key.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.contains_key(&1), true);\nassert_eq!(map.contains_key(&2), false);
\n
1.0.0 · source

pub fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut V>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Returns a mutable reference to the value corresponding to the key.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nif let Some(x) = map.get_mut(&1) {\n    *x = \"b\";\n}\nassert_eq!(map[&1], \"b\");
\n
1.0.0 · source

pub fn insert(&mut self, k: K, v: V) -> Option<V>

Inserts a key-value pair into the map.

\n

If the map did not have this key present, None is returned.

\n

If the map did have this key present, the value is updated, and the old\nvalue is returned. The key is not updated, though; this matters for\ntypes that can be == without being identical. See the module-level\ndocumentation for more.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nassert_eq!(map.insert(37, \"a\"), None);\nassert_eq!(map.is_empty(), false);\n\nmap.insert(37, \"b\");\nassert_eq!(map.insert(37, \"c\"), Some(\"b\"));\nassert_eq!(map[&37], \"c\");
\n
source

pub fn try_insert(\n &mut self,\n key: K,\n value: V\n) -> Result<&mut V, OccupiedError<'_, K, V>>

🔬This is a nightly-only experimental API. (map_try_insert)

Tries to insert a key-value pair into the map, and returns\na mutable reference to the value in the entry.

\n

If the map already had this key present, nothing is updated, and\nan error containing the occupied entry and the value is returned.

\n
§Examples
\n

Basic usage:

\n\n
#![feature(map_try_insert)]\n\nuse std::collections::HashMap;\n\nlet mut map = HashMap::new();\nassert_eq!(map.try_insert(37, \"a\").unwrap(), &\"a\");\n\nlet err = map.try_insert(37, \"b\").unwrap_err();\nassert_eq!(err.entry.key(), &37);\nassert_eq!(err.entry.get(), &\"a\");\nassert_eq!(err.value, \"b\");
\n
1.0.0 · source

pub fn remove<Q>(&mut self, k: &Q) -> Option<V>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Removes a key from the map, returning the value at the key if the key\nwas previously in the map.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.remove(&1), Some(\"a\"));\nassert_eq!(map.remove(&1), None);
\n
1.27.0 · source

pub fn remove_entry<Q>(&mut self, k: &Q) -> Option<(K, V)>
where\n K: Borrow<Q>,\n Q: Hash + Eq + ?Sized,

Removes a key from the map, returning the stored key and value if the\nkey was previously in the map.

\n

The key may be any borrowed form of the map’s key type, but\nHash and Eq on the borrowed form must match those for\nthe key type.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet mut map = HashMap::new();\nmap.insert(1, \"a\");\nassert_eq!(map.remove_entry(&1), Some((1, \"a\")));\nassert_eq!(map.remove(&1), None);
\n
",0,"bdk_chain::spk_client::TxCache"],["
1.0.0 · source§

impl<K, Q, V, S> Index<&Q> for HashMap<K, V, S>
where\n K: Eq + Hash + Borrow<Q>,\n Q: Eq + Hash + ?Sized,\n S: BuildHasher,

source§

fn index(&self, key: &Q) -> &V

Returns a reference to the value corresponding to the supplied key.

\n
§Panics
\n

Panics if the key is not present in the HashMap.

\n
§

type Output = V

The returned type after indexing.
","Index<&Q>","bdk_chain::spk_client::TxCache"],["
source§

impl<'de, K, V, S, E> IntoDeserializer<'de, E> for HashMap<K, V, S>
where\n K: IntoDeserializer<'de, E> + Eq + Hash,\n V: IntoDeserializer<'de, E>,\n S: BuildHasher,\n E: Error,

§

type Deserializer = MapDeserializer<'de, <HashMap<K, V, S> as IntoIterator>::IntoIter, E>

The type of the deserializer being converted into.
source§

fn into_deserializer(\n self\n) -> <HashMap<K, V, S> as IntoDeserializer<'de, E>>::Deserializer

Convert this value into a deserializer.
","IntoDeserializer<'de, E>","bdk_chain::spk_client::TxCache"],["
1.0.0 · source§

impl<K, V, S> IntoIterator for HashMap<K, V, S>

source§

fn into_iter(self) -> IntoIter<K, V> ⓘ

Creates a consuming iterator, that is, one that moves each key-value\npair out of the map in arbitrary order. The map cannot be used after\ncalling this.

\n
§Examples
\n
use std::collections::HashMap;\n\nlet map = HashMap::from([\n    (\"a\", 1),\n    (\"b\", 2),\n    (\"c\", 3),\n]);\n\n// Not possible with .iter()\nlet vec: Vec<(&str, i32)> = map.into_iter().collect();
\n
§

type Item = (K, V)

The type of the elements being iterated over.
§

type IntoIter = IntoIter<K, V>

Which kind of iterator are we turning this into?
","IntoIterator","bdk_chain::spk_client::TxCache"],["
1.0.0 · source§

impl<K, V, S> PartialEq for HashMap<K, V, S>
where\n K: Eq + Hash,\n V: PartialEq,\n S: BuildHasher,

source§

fn eq(&self, other: &HashMap<K, V, S>) -> bool

This method tests for self and other values to be equal, and is used\nby ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always\nsufficient, and should not be overridden without very good reason.
","PartialEq","bdk_chain::spk_client::TxCache"],["
source§

impl<K, V, H> Serialize for HashMap<K, V, H>
where\n K: Serialize,\n V: Serialize,

source§

fn serialize<S>(\n &self,\n serializer: S\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","bdk_chain::spk_client::TxCache"],["
1.0.0 · source§

impl<K, V, S> Eq for HashMap<K, V, S>
where\n K: Eq + Hash,\n V: Eq,\n S: BuildHasher,

","Eq","bdk_chain::spk_client::TxCache"],["
1.36.0 · source§

impl<K, V, S> UnwindSafe for HashMap<K, V, S>
where\n K: UnwindSafe,\n V: UnwindSafe,\n S: UnwindSafe,

","UnwindSafe","bdk_chain::spk_client::TxCache"]] -};if (window.register_type_impls) {window.register_type_impls(type_impls);} else {window.pending_type_impls = type_impls;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/fn.main.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/fn.main.html index 227c07dbea..42ee1f922c 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/fn.main.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/fn.main.html @@ -1 +1 @@ -main in wallet_electrum_example - Rust

Function wallet_electrum_example::main

source ·
pub(crate) fn main() -> Result<(), Error>
\ No newline at end of file +main in wallet_electrum_example - Rust

Function wallet_electrum_example::main

source ·
pub(crate) fn main() -> Result<(), Error>
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/index.html index e5b471f663..bd7a48c8a0 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/index.html @@ -1 +1 @@ -wallet_electrum_example - Rust

Crate wallet_electrum_example

source ·

Constants§

Functions§

\ No newline at end of file +wallet_electrum_example - Rust

Crate wallet_electrum_example

source ·

Constants§

Functions§

\ No newline at end of file