From c8234cdd799132fd4a0349242d02866a0f315667 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 19 Jun 2023 11:43:25 +0000 Subject: [PATCH] Publish autogenerated nightly docs --- .../docs-rs/bdk/nightly/latest/bdk/all.html | 2 +- .../bdk/descriptor/enum.Descriptor.html | 8 +- .../bdk/descriptor/policy/enum.PkOrF.html | 2 +- .../descriptor/policy/enum.Satisfaction.html | 2 +- .../policy/enum.SatisfiableItem.html | 2 +- .../descriptor/policy/struct.Condition.html | 2 +- .../bdk/descriptor/policy/struct.Policy.html | 2 +- .../bdk/descriptor/struct.Miniscript.html | 6 +- .../nightly/latest/bdk/enum.KeychainKind.html | 10 +- .../bdk/nightly/latest/bdk/fn.version.html | 2 +- .../docs-rs/bdk/nightly/latest/bdk/index.html | 2 +- .../nightly/latest/bdk/struct.LocalUtxo.html | 6 +- .../latest/bdk/struct.TransactionDetails.html | 6 +- .../bdk/wallet/coin_selection/index.html | 2 +- .../latest/bdk/wallet/enum.AddressIndex.html | 4 +- .../latest/bdk/wallet/enum.InsertTxError.html | 15 + .../latest/bdk/wallet/enum.NewError.html | 4 +- .../latest/bdk/wallet/export/index.html | 2 +- .../export/struct.FullyNodedExport.html | 12 +- .../bdk/wallet/export/type.WalletExport.html | 2 +- .../fn.wallet_name_from_descriptor.html | 2 +- .../bdk/nightly/latest/bdk/wallet/index.html | 7 +- .../latest/bdk/wallet/sidebar-items.js | 2 +- .../latest/bdk/wallet/struct.AddressInfo.html | 6 +- .../latest/bdk/wallet/struct.Balance.html | 6 +- .../latest/bdk/wallet/struct.Wallet.html | 100 +- .../wallet/tx_builder/struct.TxBuilder.html | 2 +- .../latest/bdk/wallet/type.ChangeSet.html | 2 + .../latest/bdk/wallet/type.Update.html | 3 +- .../latest/bdk/wallet/type.UpdateError.html | 2 - .../bdk/nightly/latest/bdk_chain/all.html | 2 +- .../chain_data/enum.ChainPosition.html | 11 + .../bdk_chain/chain_data/enum.ObservedAs.html | 11 - .../bdk_chain/chain_data/enum.TxHeight.html | 11 - .../chain_graph/enum.InsertTxError.html | 13 - .../bdk_chain/chain_graph/enum.NewError.html | 17 - .../chain_graph/enum.UpdateError.html | 14 - .../latest/bdk_chain/chain_graph/index.html | 3 - .../bdk_chain/chain_graph/sidebar-items.js | 1 - .../chain_graph/struct.ChainGraph.html | 89 - .../chain_graph/struct.ChangeSet.html | 16 - .../struct.UnresolvableConflict.html | 13 - .../type.InsertCheckpointError.html | 2 - .../bdk_chain/constant.COINBASE_MATURITY.html | 2 +- .../latest/bdk_chain/enum.ChainPosition.html | 19 + .../bdk_chain/enum.ConfirmationTime.html | 21 +- .../latest/bdk_chain/enum.ObservedAs.html | 16 - .../latest/bdk_chain/enum.TxHeight.html | 13 - .../bdk/nightly/latest/bdk_chain/index.html | 6 +- .../bdk_chain/indexed_tx_graph/index.html | 4 +- .../struct.IndexedAdditions.html | 8 +- .../struct.IndexedTxGraph.html | 18 +- .../indexed_tx_graph/trait.Indexer.html | 12 +- .../latest/bdk_chain/keychain/index.html | 11 +- .../bdk_chain/keychain/persist/index.html | 10 - .../keychain/persist/sidebar-items.js | 1 - .../keychain/persist/struct.Persist.html | 14 - .../persist/trait.PersistBackend.html | 16 - .../bdk_chain/keychain/sidebar-items.js | 2 +- .../bdk_chain/keychain/struct.Balance.html | 12 +- .../keychain/struct.DerivationAdditions.html | 14 +- .../keychain/struct.KeychainChangeSet.html | 17 - .../keychain/struct.KeychainScan.html | 13 - .../keychain/struct.KeychainTracker.html | 72 - .../keychain/struct.KeychainTxOutIndex.html | 50 +- .../keychain/struct.LocalChangeSet.html | 13 + .../keychain/struct.LocalUpdate.html | 16 + .../tracker/struct.KeychainTracker.html | 11 - .../latest/bdk_chain/local_chain/index.html | 3 +- .../struct.InsertBlockNotMatchingError.html | 9 +- .../local_chain/struct.LocalChain.html | 22 +- .../struct.UpdateNotConnectedError.html | 6 +- .../bdk_chain/local_chain/type.ChangeSet.html | 2 +- .../nightly/latest/bdk_chain/sidebar-items.js | 2 +- .../enum.InsertCheckpointError.html | 16 - .../sparse_chain/enum.InsertTxError.html | 23 - .../sparse_chain/enum.UpdateError.html | 21 - .../latest/bdk_chain/sparse_chain/index.html | 266 -- .../bdk_chain/sparse_chain/sidebar-items.js | 1 - .../sparse_chain/struct.ChangeSet.html | 14 - .../sparse_chain/struct.SparseChain.html | 76 - .../sparse_chain/trait.ChainPosition.html | 13 - .../latest/bdk_chain/struct.BlockId.html | 10 +- .../struct.ConfirmationHeightAnchor.html | 10 +- .../struct.ConfirmationTimeAnchor.html | 12 +- .../latest/bdk_chain/struct.FullTxOut.html | 31 +- .../bdk_chain/struct.SpkTxOutIndex.html | 2 +- .../latest/bdk_chain/trait.Anchor.html | 2 +- .../latest/bdk_chain/trait.Append.html | 2 +- .../latest/bdk_chain/trait.ChainOracle.html | 6 +- .../latest/bdk_chain/trait.ForEachTxOut.html | 2 +- .../latest/bdk_chain/tx_graph/index.html | 2 +- .../bdk_chain/tx_graph/struct.Additions.html | 20 +- .../tx_graph/struct.CanonicalTx.html | 4 +- .../tx_graph/struct.TxDescendants.html | 8 +- .../bdk_chain/tx_graph/struct.TxGraph.html | 20 +- .../electrum_ext/struct.ElectrumUpdate.html | 11 + .../electrum_ext/trait.ElectrumExt.html | 11 + .../nightly/latest/bdk_electrum/index.html | 4 +- .../latest/bdk_electrum/sidebar-items.js | 2 +- .../bdk_electrum/struct.ElectrumUpdate.html | 26 +- .../bdk_electrum/trait.ElectrumExt.html | 22 +- .../bdk/nightly/latest/bdk_esplora/index.html | 4 +- .../bdk_esplora/trait.EsploraAsyncExt.html | 15 +- .../latest/bdk_esplora/trait.EsploraExt.html | 15 +- .../bdk_esplora_wallet_example/all.html | 1 - .../constant.PARALLEL_REQUESTS.html | 1 - .../constant.SEND_AMOUNT.html | 1 - .../constant.STOP_GAP.html | 1 - .../bdk_esplora_wallet_example/fn.main.html | 1 - .../bdk_esplora_wallet_example/index.html | 1 - .../sidebar-items.js | 1 - .../nightly/latest/bdk_file_store/all.html | 2 +- .../latest/bdk_file_store/enum.FileError.html | 4 +- .../nightly/latest/bdk_file_store/index.html | 9 +- .../keychain_store/struct.KeychainStore.html | 11 - .../latest/bdk_file_store/sidebar-items.js | 2 +- .../bdk_file_store/struct.EntryIter.html | 2 +- .../bdk_file_store/struct.KeychainStore.html | 33 - .../latest/bdk_file_store/struct.Store.html | 6 +- .../docs-rs/bdk/nightly/latest/crates.js | 2 +- .../bdk/nightly/latest/example_cli/all.html | 1 + .../latest/example_cli/enum.AddressCmd.html | 15 + .../example_cli/enum.CoinSelectionAlgo.html | 11 + .../latest/example_cli/enum.Commands.html | 23 + .../latest/example_cli/enum.Keychain.html | 12 + .../latest/example_cli/enum.TxOutCmd.html | 16 + .../latest/example_cli/fn.create_tx.html | 1 + .../example_cli/fn.handle_commands.html | 1 + .../nightly/latest/example_cli/fn.init.html | 1 + .../latest/example_cli/fn.planned_utxos.html | 1 + .../example_cli/fn.run_address_cmd.html | 1 + .../example_cli/fn.run_balance_cmd.html | 1 + .../latest/example_cli/fn.run_send_cmd.html | 1 + .../latest/example_cli/fn.run_txo_cmd.html | 1 + .../bdk/nightly/latest/example_cli/index.html | 1 + .../latest/example_cli/sidebar-items.js | 1 + .../latest/example_cli/struct.Args.html | 12 + .../latest/example_cli/type.Database.html | 1 + .../example_cli/type.KeychainAdditions.html | 1 + .../example_cli/type.KeychainTxGraph.html | 1 + .../nightly/latest/example_electrum/all.html | 1 + .../constant.ASSUME_FINAL_DEPTH.html | 1 + .../example_electrum/constant.DB_MAGIC.html | 1 + .../example_electrum/constant.DB_PATH.html | 1 + .../enum.ElectrumCommands.html | 24 + .../latest/example_electrum/fn.main.html | 1 + .../latest/example_electrum/index.html | 1 + .../latest/example_electrum/sidebar-items.js | 1 + .../example_electrum/struct.ScanOptions.html | 10 + .../example_electrum/type.ChangeSet.html | 1 + .../keychain/persist/trait.PersistBackend.js | 4 - .../bdk_chain/persist/trait.PersistBackend.js | 2 +- .../sparse_chain/trait.ChainPosition.js | 3 - .../{ => electrum_ext}/trait.ElectrumExt.js | 0 .../implementors/clap/derive/trait.Args.js | 5 +- .../clap/derive/trait.CommandFactory.js | 5 +- .../clap/derive/trait.FromArgMatches.js | 5 +- .../implementors/clap/derive/trait.Parser.js | 5 +- .../clap/derive/trait.Subcommand.js | 5 +- .../implementors/core/clone/trait.Clone.js | 8 +- .../latest/implementors/core/cmp/trait.Eq.js | 4 +- .../latest/implementors/core/cmp/trait.Ord.js | 4 +- .../implementors/core/cmp/trait.PartialEq.js | 7 +- .../implementors/core/cmp/trait.PartialOrd.js | 4 +- .../implementors/core/convert/trait.AsRef.js | 5 +- .../implementors/core/convert/trait.From.js | 2 +- .../core/default/trait.Default.js | 6 +- .../implementors/core/error/trait.Error.js | 2 +- .../implementors/core/fmt/trait.Debug.js | 12 +- .../implementors/core/fmt/trait.Display.js | 4 +- .../implementors/core/hash/trait.Hash.js | 2 +- .../iter/traits/iterator/trait.Iterator.js | 2 +- .../implementors/core/marker/trait.Copy.js | 4 +- .../implementors/core/marker/trait.Freeze.js | 13 +- .../implementors/core/marker/trait.Send.js | 13 +- .../core/marker/trait.StructuralEq.js | 4 +- .../core/marker/trait.StructuralPartialEq.js | 7 +- .../implementors/core/marker/trait.Sync.js | 13 +- .../implementors/core/marker/trait.Unpin.js | 13 +- .../panic/unwind_safe/trait.RefUnwindSafe.js | 13 +- .../panic/unwind_safe/trait.UnwindSafe.js | 13 +- .../core/str/traits/trait.FromStr.js | 2 +- .../serde/de/trait.Deserialize.js | 6 +- .../implementors/serde/ser/trait.Serialize.js | 6 +- .../enum.ElectrumCommands.html | 24 - .../fn.main.html | 1 - .../index.html | 1 - .../sidebar-items.js | 1 - .../struct.ScanOptions.html | 10 - .../keychain_tracker_esplora_example/all.html | 1 - .../enum.EsploraCommands.html | 28 - .../fn.main.html | 1 - .../index.html | 1 - .../sidebar-items.js | 1 - .../struct.ScanOptions.html | 13 - .../keychain_tracker_example_cli/all.html | 1 - .../enum.AddressCmd.html | 15 - .../enum.CoinSelectionAlgo.html | 11 - .../enum.Commands.html | 23 - .../enum.Keychain.html | 12 - .../enum.TxOutCmd.html | 16 - .../fn.create_tx.html | 1 - .../fn.handle_commands.html | 1 - .../keychain_tracker_example_cli/fn.init.html | 1 - .../fn.planned_utxos.html | 1 - .../fn.run_address_cmd.html | 1 - .../fn.run_balance_cmd.html | 1 - .../fn.run_txo_cmd.html | 1 - .../keychain_tracker_example_cli/index.html | 1 - .../sidebar-items.js | 1 - .../struct.AddrsOutput.html | 6 - .../struct.Args.html | 12 - .../bdk/nightly/latest/search-index.js | 21 +- .../bdk/nightly/latest/source-files.js | 13 +- .../bdk/nightly/latest/src/bdk/lib.rs.html | 4 + .../bdk/nightly/latest/src/bdk/types.rs.html | 4 +- .../src/bdk/wallet/coin_selection.rs.html | 28 +- .../latest/src/bdk/wallet/export.rs.html | 8 +- .../nightly/latest/src/bdk/wallet/mod.rs.html | 776 +++--- .../latest/src/bdk/wallet/tx_builder.rs.html | 8 +- .../latest/src/bdk_chain/chain_data.rs.html | 310 +-- .../latest/src/bdk_chain/chain_graph.rs.html | 1280 ---------- .../latest/src/bdk_chain/chain_oracle.rs.html | 6 + .../src/bdk_chain/indexed_tx_graph.rs.html | 56 +- .../latest/src/bdk_chain/keychain.rs.html | 200 +- .../src/bdk_chain/keychain/persist.rs.html | 218 -- .../src/bdk_chain/keychain/tracker.rs.html | 618 ----- .../bdk_chain/keychain/txout_index.rs.html | 8 +- .../nightly/latest/src/bdk_chain/lib.rs.html | 10 +- .../latest/src/bdk_chain/local_chain.rs.html | 46 +- .../latest/src/bdk_chain/sparse_chain.rs.html | 2206 ----------------- .../src/bdk_chain/spk_txout_index.rs.html | 4 +- .../latest/src/bdk_chain/tx_graph.rs.html | 76 +- .../src/bdk_electrum/electrum_ext.rs.html | 974 ++++++++ .../latest/src/bdk_electrum/lib.rs.html | 1114 +-------- .../latest/src/bdk_esplora/async_ext.rs.html | 292 +-- .../src/bdk_esplora/blocking_ext.rs.html | 234 +- .../latest/src/bdk_esplora/lib.rs.html | 20 +- .../src/bdk_file_store/keychain_store.rs.html | 628 ----- .../latest/src/bdk_file_store/lib.rs.html | 62 - .../lib.rs.html | 658 ++--- .../main.rs.html | 318 ++- .../main.rs.html | 484 ---- .../src/wallet_electrum_example/main.rs.html | 88 +- .../main.rs.html | 68 +- .../src/wallet_esplora_async/main.rs.html | 50 +- .../latest/wallet_electrum_example/all.html | 2 +- .../constant.BATCH_SIZE.html | 2 +- .../constant.DB_MAGIC.html | 1 + .../constant.SEND_AMOUNT.html | 2 +- .../constant.STOP_GAP.html | 2 +- .../wallet_electrum_example/fn.main.html | 2 +- .../latest/wallet_electrum_example/index.html | 2 +- .../wallet_electrum_example/sidebar-items.js | 2 +- .../all.html | 2 +- .../wallet_esplora/constant.DB_MAGIC.html | 1 + .../constant.PARALLEL_REQUESTS.html | 1 + .../wallet_esplora/constant.SEND_AMOUNT.html | 1 + .../wallet_esplora/constant.STOP_GAP.html | 1 + .../latest/wallet_esplora/fn.main.html | 1 + .../nightly/latest/wallet_esplora/index.html | 1 + .../latest/wallet_esplora/sidebar-items.js | 1 + .../latest/wallet_esplora_async/all.html | 2 +- .../constant.DB_MAGIC.html | 1 + .../constant.PARALLEL_REQUESTS.html | 2 +- .../constant.SEND_AMOUNT.html | 2 +- .../constant.STOP_GAP.html | 2 +- .../latest/wallet_esplora_async/fn.main.html | 2 +- .../latest/wallet_esplora_async/index.html | 2 +- .../wallet_esplora_async/sidebar-items.js | 2 +- 271 files changed, 3351 insertions(+), 9725 deletions(-) create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/enum.InsertTxError.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/type.ChangeSet.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/type.UpdateError.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_data/enum.ChainPosition.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_data/enum.ObservedAs.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_data/enum.TxHeight.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/enum.InsertTxError.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/enum.NewError.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/enum.UpdateError.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/index.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/sidebar-items.js delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/struct.ChainGraph.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/struct.ChangeSet.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/struct.UnresolvableConflict.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/type.InsertCheckpointError.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.ChainPosition.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.ObservedAs.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.TxHeight.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/persist/index.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/persist/sidebar-items.js delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/persist/struct.Persist.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/persist/trait.PersistBackend.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainChangeSet.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainScan.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainTracker.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.LocalChangeSet.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.LocalUpdate.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/tracker/struct.KeychainTracker.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/enum.InsertCheckpointError.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/enum.InsertTxError.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/enum.UpdateError.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/index.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/sidebar-items.js delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/struct.ChangeSet.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/struct.SparseChain.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/trait.ChainPosition.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/electrum_ext/struct.ElectrumUpdate.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/electrum_ext/trait.ElectrumExt.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/all.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/constant.PARALLEL_REQUESTS.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/constant.SEND_AMOUNT.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/constant.STOP_GAP.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/fn.main.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/index.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/sidebar-items.js delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/keychain_store/struct.KeychainStore.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/struct.KeychainStore.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/all.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.AddressCmd.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.CoinSelectionAlgo.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.Commands.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.Keychain.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.TxOutCmd.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.create_tx.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.handle_commands.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.init.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.planned_utxos.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.run_address_cmd.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.run_balance_cmd.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.run_send_cmd.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.run_txo_cmd.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/index.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/sidebar-items.js create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/struct.Args.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/type.Database.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/type.KeychainAdditions.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/type.KeychainTxGraph.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/all.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/constant.ASSUME_FINAL_DEPTH.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/constant.DB_MAGIC.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/constant.DB_PATH.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/enum.ElectrumCommands.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/fn.main.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/index.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/sidebar-items.js create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/struct.ScanOptions.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/type.ChangeSet.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/keychain/persist/trait.PersistBackend.js delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/sparse_chain/trait.ChainPosition.js rename docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_electrum/{ => electrum_ext}/trait.ElectrumExt.js (100%) delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/enum.ElectrumCommands.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/fn.main.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/index.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/sidebar-items.js delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/struct.ScanOptions.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/all.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/enum.EsploraCommands.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/fn.main.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/index.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/sidebar-items.js delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/struct.ScanOptions.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/all.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.AddressCmd.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.CoinSelectionAlgo.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.Commands.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.Keychain.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.TxOutCmd.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.create_tx.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.handle_commands.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.init.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.planned_utxos.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.run_address_cmd.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.run_balance_cmd.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.run_txo_cmd.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/index.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/sidebar-items.js delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/struct.AddrsOutput.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/struct.Args.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_graph.rs.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain/persist.rs.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain/tracker.rs.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/sparse_chain.rs.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_electrum/electrum_ext.rs.html delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_file_store/keychain_store.rs.html rename docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/{keychain_tracker_example_cli => example_cli}/lib.rs.html (62%) rename docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/{keychain_tracker_electrum_example => example_electrum}/main.rs.html (55%) delete mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/keychain_tracker_esplora_example/main.rs.html rename docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/{bdk_esplora_wallet_example => wallet_esplora}/main.rs.html (75%) create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/constant.DB_MAGIC.html rename docs/.vuepress/public/docs-rs/bdk/nightly/latest/{keychain_tracker_electrum_example => wallet_esplora}/all.html (54%) create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/constant.DB_MAGIC.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/constant.PARALLEL_REQUESTS.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/constant.SEND_AMOUNT.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/constant.STOP_GAP.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/fn.main.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/index.html create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/sidebar-items.js create mode 100644 docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/constant.DB_MAGIC.html diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/all.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/all.html index 98d156cd13..ad3bc8c5a0 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/all.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/all.html @@ -1 +1 @@ -List of all items in this crate

List of all items

Structs

Enums

Traits

Macros

Functions

Type Definitions

\ No newline at end of file +List of all items in this crate

List of all items

Structs

Enums

Traits

Macros

Functions

Type Definitions

\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/enum.Descriptor.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/enum.Descriptor.html index af22750688..3254d96d46 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/enum.Descriptor.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/enum.Descriptor.html @@ -131,16 +131,16 @@ default(0x02) y-coordinate.

assert_eq!(result.to_string(), "tr(03cc8a4bc64d897bddc5fbc2f670f7a8ba0b386779106cf1223c6fc5d7cd6fc115)#6qm9h8ym");
Errors

This function will return an error if hardened derivation is attempted.

-

Trait Implementations§

Returns a copy of the value. Read more
Performs copy-assignment from source. Read more
Formats the value using the given formatter. Read more
Returns the minimum value (in satoshis) at which an output is broadcastable.
Deserialize this value from the given Serde deserializer. Read more
Formats the value using the given formatter. Read more
Extract the spending policy
Run a predicate on every key in the descriptor, returning whether +

Trait Implementations§

Returns a copy of the value. Read more
Performs copy-assignment from source. Read more
Formats the value using the given formatter. Read more
Returns the minimum value (in satoshis) at which an output is broadcastable.
Deserialize this value from the given Serde deserializer. Read more
Formats the value using the given formatter. Read more
Extract the spending policy
Run a predicate on every key in the descriptor, returning whether the predicate returned true for every key Read more
Run a predicate on every key in the descriptor, returning whether -the predicate returned true for any key Read more
Converts to this type from the input type.
Converts to this type from the input type.
Converts to this type from the input type.
Converts to this type from the input type.
Converts to this type from the input type.
Converts to this type from the input type.
The associated error which can be returned from parsing.
Parses a string s to return a value of this type. Read more

Parse an expression tree into a descriptor.

+the predicate returned true for any key Read more
Converts to this type from the input type.
Converts to this type from the input type.
Converts to this type from the input type.
Converts to this type from the input type.
Converts to this type from the input type.
Converts to this type from the input type.
The associated error which can be returned from parsing.
Parses a string s to return a value of this type. Read more

Parse an expression tree into a descriptor.

Feeds this value into the given Hasher. Read more
Feeds a slice of this type into the given Hasher. Read more
Convert the object into an abstract policy
This method returns an Ordering between self and other. Read more
Compares and returns the maximum of two values. Read more
Compares and returns the minimum of two values. Read more
Restrict a value to a certain interval. Read more
This method tests for self and other values to be equal, and is used by ==. Read more
This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason. Read more
This method returns an ordering between self and other values if one exists. Read more
This method tests less than (for self and other) and is used by the < operator. Read more
This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
This method tests greater than (for self and other) and is used by the > operator. Read more
This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
Serialize this value into the given Serde serializer. Read more

Converts a descriptor using abstract keys to one using specific keys.

+operator. Read more
Serialize this value into the given Serde serializer. Read more

Converts a descriptor using abstract keys to one using specific keys.

The associated output type. This must be Self<Q>.

Auto Trait Implementations§

Blanket Implementations§

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

-
The resulting type after obtaining ownership.
Creates owned data from borrowed data, usually by cloning. Read more
Uses borrowed data to replace owned data, usually by cloning. Read more
Converts the given value to a String. Read more
The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion error.
Performs the conversion.
\ No newline at end of file +
The resulting type after obtaining ownership.
Creates owned data from borrowed data, usually by cloning. Read more
Uses borrowed data to replace owned data, usually by cloning. Read more
Converts the given value to a String. Read more
The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion error.
Performs the conversion.
\ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.PkOrF.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.PkOrF.html index 369aea4e4c..04b17fdfb4 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.PkOrF.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.PkOrF.html @@ -8,7 +8,7 @@
§

Fingerprint(Fingerprint)

An extended key fingerprint

Trait Implementations§

Returns a copy of the value. Read more
Performs copy-assignment from source. Read more
Formats the value using the given formatter. Read more
Feeds this value into the given Hasher. Read more
Feeds a slice of this type into the given Hasher. Read more
This method tests for self and other values to be equal, and is used by ==. Read more
This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

+sufficient, and should not be overridden without very good reason. Read more
Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.Satisfaction.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.Satisfaction.html index 4106fc084f..7e048d1ce1 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.Satisfaction.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.Satisfaction.html @@ -36,7 +36,7 @@

Implementations§

Returns whether the Satisfaction is a leaf item

Trait Implementations§

Returns a copy of the value. Read more
Performs copy-assignment from source. Read more
Formats the value using the given formatter. Read more
Converts to this type from the input type.
This method tests for self and other values to be equal, and is used by ==. Read more
This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

+sufficient, and should not be overridden without very good reason. Read more
Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.SatisfiableItem.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.SatisfiableItem.html index 34bf332e08..c5faa3227d 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.SatisfiableItem.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/enum.SatisfiableItem.html @@ -52,7 +52,7 @@

Returns a unique id for the SatisfiableItem

Trait Implementations§

Returns a copy of the value. Read more
Performs copy-assignment from source. Read more
Formats the value using the given formatter. Read more
Converts to this type from the input type.
This method tests for self and other values to be equal, and is used by ==. Read more
This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

+sufficient, and should not be overridden without very good reason. Read more
Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.Condition.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.Condition.html index 02f1207485..a203e663b5 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.Condition.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.Condition.html @@ -10,7 +10,7 @@ TODO: use bitcoin::LockTime and bitcoin::Sequence

by ==. Read more
This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason. Read more
This method returns an ordering between self and other values if one exists. Read more
This method tests less than (for self and other) and is used by the < operator. Read more
This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
This method tests greater than (for self and other) and is used by the > operator. Read more
This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

+operator. Read more
Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.Policy.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.Policy.html index b780bb34d7..8c6cdd1f97 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.Policy.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/policy/struct.Policy.html @@ -17,7 +17,7 @@ on that.

policy tree

Trait Implementations§

Returns a copy of the value. Read more
Performs copy-assignment from source. Read more
Formats the value using the given formatter. Read more
Converts to this type from the input type.
This method tests for self and other values to be equal, and is used by ==. Read more
This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

+sufficient, and should not be overridden without very good reason. Read more
Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/struct.Miniscript.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/struct.Miniscript.html index 451d778ab4..d1b705ac52 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/struct.Miniscript.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/descriptor/struct.Miniscript.html @@ -129,7 +129,7 @@ This can occur if the miniscript contains a

  • Timelock combination
  • Contains a spend that exceeds resource limits
  • -

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Formats the value using the given formatter. Read more
    Extract the spending policy
    Run a predicate on every key in the descriptor, returning whether +

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Formats the value using the given formatter. Read more
    Extract the spending policy
    Run a predicate on every key in the descriptor, returning whether the predicate returned true for every key Read more
    Run a predicate on every key in the descriptor, returning whether the predicate returned true for any key Read more

    Parse a Miniscript from string and perform sanity checks See Miniscript::from_str_insane to parse scripts from string that @@ -149,7 +149,7 @@ The type information and extra_properties can be deterministically determined by the ast.

    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    This method tests greater than (for self and other) and is used by the > operator. Read more
    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    Serialize this value into the given Serde serializer. Read more

    Translates a struct from one generic to another where the translation +operator. Read more

    Serialize this value into the given Serde serializer. Read more

    Translates a struct from one generic to another where the translation for Pk is provided by [Translator]

    The associated output type. This must be Self<Q>.

    Eq of Miniscript must depend only on node and not the type information. The type information and extra_properties can be deterministically determined @@ -158,4 +158,4 @@ by the ast.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    Converts the given value to a String. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    Converts the given value to a String. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/enum.KeychainKind.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/enum.KeychainKind.html index cb83bfef0b..47f0dbf738 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/enum.KeychainKind.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/enum.KeychainKind.html @@ -2,16 +2,16 @@ External, Internal, }
    Expand description

    Types of keychains

    -

    Variants§

    §

    External

    External

    -
    §

    Internal

    Internal, usually used for change outputs

    +

    Variants§

    §

    External

    External keychain, used for deriving recipient addresses.

    +
    §

    Internal

    Internal keychain, used for deriving change addresses.

    Implementations§

    Return KeychainKind as a byte

    -

    Trait Implementations§

    Converts this type into a shared reference of the (usually inferred) input type.
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Feeds this value into the given Hasher. Read more
    Feeds a slice of this type into the given Hasher. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    Converts this type into a shared reference of the (usually inferred) input type.
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Feeds this value into the given Hasher. Read more
    Feeds a slice of this type into the given Hasher. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used by ==. Read more
    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason. Read more
    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    This method tests greater than (for self and other) and is used by the > operator. Read more
    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Calculate the base32 serialized length
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more
    Error type if conversion fails
    Check if all values are in range and return array-like struct of u5 values

    Returns the argument unchanged.

    +operator. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Calculate the base32 serialized length
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more
    Error type if conversion fails
    Check if all values are in range and return array-like struct of u5 values

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    Encode as base32 and write it to the supplied writer -Implementations shouldn’t allocate. Read more
    Convert Self to base32 vector
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file +Implementations shouldn’t allocate. Read more
    Convert Self to base32 vector
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/fn.version.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/fn.version.html index a608f65d6d..9cd601f159 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/fn.version.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/fn.version.html @@ -1,2 +1,2 @@ -version in bdk - Rust

    Function bdk::version

    source ·
    pub fn version() -> &'static str
    Expand description

    Get the version of BDK at runtime

    +version in bdk - Rust

    Function bdk::version

    source ·
    pub fn version() -> &'static str
    Expand description

    Get the version of BDK at runtime

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/index.html index 10afaa98ac..822c309bbe 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/index.html @@ -1,4 +1,4 @@ -bdk - Rust

    Crate bdk

    source ·
    Expand description
    +bdk - Rust

    Crate bdk

    source ·
    Expand description

    BDK

    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.LocalUtxo.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.LocalUtxo.html index 5039d6b64e..af860d57d2 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.LocalUtxo.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.LocalUtxo.html @@ -12,10 +12,10 @@

    §is_spent: bool

    Whether this UTXO is spent or not

    §derivation_index: u32

    The derivation index for the script pubkey in the wallet

    §confirmation_time: ConfirmationTime

    The confirmation time for transaction containing this utxo

    -

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Feeds this value into the given Hasher. Read more
    Feeds a slice of this type into the given Hasher. Read more
    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Feeds this value into the given Hasher. Read more
    Feeds a slice of this type into the given Hasher. Read more
    This method tests for self and other values to be equal, and is used by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +sufficient, and should not be overridden without very good reason. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.TransactionDetails.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.TransactionDetails.html index 53ede8663b..95ce3cf71c 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.TransactionDetails.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/struct.TransactionDetails.html @@ -15,12 +15,12 @@ Sum of owned inputs of this transaction.

    §fee: Option<u64>

    Fee value in sats if it was available.

    §confirmation_time: ConfirmationTime

    If the transaction is confirmed, contains height and Unix timestamp of the block containing the transaction, unconfirmed transaction contains None.

    -

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Deserialize this value from the given Serde deserializer. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Deserialize this value from the given Serde deserializer. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used by ==. Read more
    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason. Read more
    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    This method tests greater than (for self and other) and is used by the > operator. Read more
    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +operator. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/index.html index bcc85ecd12..d16a15b874 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/coin_selection/index.html @@ -1,4 +1,4 @@ -bdk::wallet::coin_selection - Rust

    Module bdk::wallet::coin_selection

    source ·
    Expand description

    Coin selection

    +bdk::wallet::coin_selection - Rust

    Module bdk::wallet::coin_selection

    source ·
    Expand description

    Coin selection

    This module provides the trait CoinSelectionAlgorithm that can be implemented to define custom coin selection algorithms.

    You can specify a custom coin selection algorithm through the coin_selection method on diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/enum.AddressIndex.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/enum.AddressIndex.html index 34189eed4e..3b5f20d513 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/enum.AddressIndex.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/enum.AddressIndex.html @@ -1,4 +1,4 @@ -AddressIndex in bdk::wallet - Rust

    Enum bdk::wallet::AddressIndex

    source ·
    pub enum AddressIndex {
    +AddressIndex in bdk::wallet - Rust

    Enum bdk::wallet::AddressIndex

    source ·
    pub enum AddressIndex {
         New,
         LastUnused,
         Peek(u32),
    @@ -15,7 +15,7 @@ web page.

    index used by AddressIndex::New and AddressIndex::LastUsed.

    Use with caution, if an index is given that is less than the current descriptor index then the returned address may have already been used.

    -

    Trait Implementations§

    Formats the value using the given formatter. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Trait Implementations§

    Formats the value using the given formatter. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/enum.InsertTxError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/enum.InsertTxError.html new file mode 100644 index 0000000000..00f3cd2bcd --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/enum.InsertTxError.html @@ -0,0 +1,15 @@ +InsertTxError in bdk::wallet - Rust

    Enum bdk::wallet::InsertTxError

    source ·
    pub enum InsertTxError {
    +    ConfirmationHeightCannotBeGreaterThanTip {
    +        tip_height: Option<u32>,
    +        tx_height: u32,
    +    },
    +}
    Expand description

    An error that may occur when inserting a transaction into Wallet.

    +

    Variants§

    §

    ConfirmationHeightCannotBeGreaterThanTip

    Fields

    §tip_height: Option<u32>

    The internal chain’s tip height.

    +
    §tx_height: u32

    The introduced transaction’s confirmation height.

    +

    The error variant that occurs when the caller attempts to insert a transaction with a +confirmation height that is greater than the internal chain tip.

    +

    Trait Implementations§

    Formats the value using the given formatter. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Calls U::from(self).

    +

    That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

    +
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/enum.NewError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/enum.NewError.html index 191e7c7432..95a4b5f480 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/enum.NewError.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/enum.NewError.html @@ -1,10 +1,10 @@ -NewError in bdk::wallet - Rust

    Enum bdk::wallet::NewError

    source ·
    pub enum NewError<P> {
    +NewError in bdk::wallet - Rust

    Enum bdk::wallet::NewError

    source ·
    pub enum NewError<P> {
         Descriptor(DescriptorError),
         Persist(P),
     }
    Expand description

    Error returned from Wallet::new

    Variants§

    §

    Descriptor(DescriptorError)

    There was problem with the descriptors passed in

    §

    Persist(P)

    We were unable to load the wallet’s data from the persistance backend

    -

    Trait Implementations§

    Formats the value using the given formatter. Read more
    Formats the value using the given formatter. Read more
    The lower-level source of this error, if any. Read more
    👎Deprecated since 1.42.0: use the Display impl or to_string()
    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Trait Implementations§

    Formats the value using the given formatter. Read more
    Formats the value using the given formatter. Read more
    The lower-level source of this error, if any. Read more
    👎Deprecated since 1.42.0: use the Display impl or to_string()
    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/index.html index 9e940f7be4..2be8ff9952 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/index.html @@ -1,4 +1,4 @@ -bdk::wallet::export - Rust

    Module bdk::wallet::export

    source ·
    Expand description

    Wallet export

    +bdk::wallet::export - Rust

    Module bdk::wallet::export

    source ·
    Expand description

    Wallet export

    This modules implements the wallet export format used by FullyNoded.

    Examples

    Import from JSON

    let import = r#"{
    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/struct.FullyNodedExport.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/struct.FullyNodedExport.html
    index 6b55702777..13e8bdedf6 100644
    --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/struct.FullyNodedExport.html
    +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/struct.FullyNodedExport.html
    @@ -1,4 +1,4 @@
    -FullyNodedExport in bdk::wallet::export - Rust

    Fields§

    §blockheight: u32

    Earliest block to rescan when looking for the wallet’s transactions

    §label: String

    Arbitrary label for the wallet

    -

    Implementations§

    Export a wallet

    +

    Implementations§

    Export a wallet

    This function returns an error if it determines that the wallet’s descriptor(s) are not supported by Bitcoin Core or don’t follow the standard derivation paths defined by BIP44 and others.

    @@ -14,10 +14,10 @@ and others.

    for the oldest transaction it knows and use that as the earliest block to rescan.

    If the database is empty or include_blockheight is false, the blockheight field returned will be 0.

    -

    Return the external descriptor

    -

    Return the internal descriptor, if present

    -

    Trait Implementations§

    Formats the value using the given formatter. Read more
    Deserialize this value from the given Serde deserializer. Read more
    The associated error which can be returned from parsing.
    Parses a string s to return a value of this type. Read more
    Serialize this value into the given Serde serializer. Read more
    Converts the given value to a String. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Return the external descriptor

    +

    Return the internal descriptor, if present

    +

    Trait Implementations§

    Formats the value using the given formatter. Read more
    Deserialize this value from the given Serde deserializer. Read more
    The associated error which can be returned from parsing.
    Parses a string s to return a value of this type. Read more
    Serialize this value into the given Serde serializer. Read more
    Converts the given value to a String. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    -
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file +
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/type.WalletExport.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/type.WalletExport.html index 8c6ef7d9d7..a9b1e94443 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/type.WalletExport.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/export/type.WalletExport.html @@ -1,2 +1,2 @@ -WalletExport in bdk::wallet::export - Rust

    Type Definition bdk::wallet::export::WalletExport

    source ·
    pub type WalletExport = FullyNodedExport;
    👎Deprecated since 0.18.0: Please use [FullyNodedExport] instead
    Expand description

    Alias for FullyNodedExport

    +WalletExport in bdk::wallet::export - Rust

    Type Definition bdk::wallet::export::WalletExport

    source ·
    pub type WalletExport = FullyNodedExport;
    👎Deprecated since 0.18.0: Please use [FullyNodedExport] instead
    Expand description

    Alias for FullyNodedExport

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/fn.wallet_name_from_descriptor.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/fn.wallet_name_from_descriptor.html index ed6903b2ec..73ada0308f 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/fn.wallet_name_from_descriptor.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/fn.wallet_name_from_descriptor.html @@ -1,3 +1,3 @@ -wallet_name_from_descriptor in bdk::wallet - Rust
    pub fn wallet_name_from_descriptor<T>(
        descriptor: T,
        change_descriptor: Option<T>,
        network: Network,
        secp: &Secp256k1<All>
    ) -> Result<String, Error>where
        T: IntoWalletDescriptor,
    Expand description

    Deterministically generate a unique name given the descriptors defining the wallet

    +wallet_name_from_descriptor in bdk::wallet - Rust
    pub fn wallet_name_from_descriptor<T>(
        descriptor: T,
        change_descriptor: Option<T>,
        network: Network,
        secp: &Secp256k1<All>
    ) -> Result<String, Error>where
        T: IntoWalletDescriptor,
    Expand description

    Deterministically generate a unique name given the descriptors defining the wallet

    Compatible with wallet_name_from_descriptor

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/index.html index 10bca743b0..030431d820 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/index.html @@ -1,8 +1,7 @@ -bdk::wallet - Rust

    Module bdk::wallet

    source ·
    Expand description

    Wallet

    +bdk::wallet - Rust

    Module bdk::wallet

    source ·
    Expand description

    Wallet

    This module defines the Wallet structure.

    Modules

    Coin selection
    Wallet export
    Generalized signers
    Transaction builder

    Structs

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

    Enums

    The address index selection strategy to use to derived an address from the wallet’s external -descriptor. See Wallet::get_address. If you’re unsure which one to use use WalletIndex::New.
    Error returned from Wallet::new

    Traits

    Trait to check if a value is below the dust limit. +descriptor. See Wallet::get_address. If you’re unsure which one to use use WalletIndex::New.
    An error that may occur when inserting a transaction into Wallet.
    Error returned from Wallet::new

    Traits

    Trait to check if a value is below the dust limit. We are performing dust value calculation for a given script public key using rust-bitcoin to -keep it compatible with network dust rate

    Functions

    Deterministically generate a unique name given the descriptors defining the wallet

    Type Definitions

    The update to a Wallet used in Wallet::apply_update. This is usually returned from blockchain data sources. -The type parameter T indicates the kind of transaction contained in the update. It’s usually a [bitcoin::Transaction].
    Error indicating that something was wrong with an Update<T>.
    \ No newline at end of file +keep it compatible with network dust rate

    Functions

    Deterministically generate a unique name given the descriptors defining the wallet

    Type Definitions

    The changeset produced internally by Wallet when mutated.
    The update to a Wallet used in Wallet::apply_update. This is usually returned from blockchain data sources.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/sidebar-items.js index e3291d243a..d8ca00c1b6 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/sidebar-items.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/sidebar-items.js @@ -1 +1 @@ -window.SIDEBAR_ITEMS = {"enum":[["AddressIndex","The address index selection strategy to use to derived an address from the wallet’s external descriptor. See [`Wallet::get_address`]. If you’re unsure which one to use use `WalletIndex::New`."],["NewError","Error returned from [`Wallet::new`]"]],"fn":[["wallet_name_from_descriptor","Deterministically generate a unique name given the descriptors defining the wallet"]],"mod":[["coin_selection","Coin selection"],["export","Wallet export"],["signer","Generalized signers"],["tx_builder","Transaction builder"]],"struct":[["AddressInfo","A derived address and the index it was found at. For convenience this automatically derefs to `Address`"],["Balance","Balance, differentiated into various categories."],["Wallet","A Bitcoin wallet"]],"trait":[["IsDust","Trait to check if a value is below the dust limit. We are performing dust value calculation for a given script public key using rust-bitcoin to keep it compatible with network dust rate"]],"type":[["Update","The update to a [`Wallet`] used in [`Wallet::apply_update`]. This is usually returned from blockchain data sources. The type parameter `T` indicates the kind of transaction contained in the update. It’s usually a [`bitcoin::Transaction`]."],["UpdateError","Error indicating that something was wrong with an [`Update`]."]]}; \ No newline at end of file +window.SIDEBAR_ITEMS = {"enum":[["AddressIndex","The address index selection strategy to use to derived an address from the wallet’s external descriptor. See [`Wallet::get_address`]. If you’re unsure which one to use use `WalletIndex::New`."],["InsertTxError","An error that may occur when inserting a transaction into [`Wallet`]."],["NewError","Error returned from [`Wallet::new`]"]],"fn":[["wallet_name_from_descriptor","Deterministically generate a unique name given the descriptors defining the wallet"]],"mod":[["coin_selection","Coin selection"],["export","Wallet export"],["signer","Generalized signers"],["tx_builder","Transaction builder"]],"struct":[["AddressInfo","A derived address and the index it was found at. For convenience this automatically derefs to `Address`"],["Balance","Balance, differentiated into various categories."],["Wallet","A Bitcoin wallet"]],"trait":[["IsDust","Trait to check if a value is below the dust limit. We are performing dust value calculation for a given script public key using rust-bitcoin to keep it compatible with network dust rate"]],"type":[["ChangeSet","The changeset produced internally by [`Wallet`] when mutated."],["Update","The update to a [`Wallet`] used in [`Wallet::apply_update`]. This is usually returned from blockchain data sources."]]}; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.AddressInfo.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.AddressInfo.html index b15da7211a..40772e2f0d 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.AddressInfo.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.AddressInfo.html @@ -1,4 +1,4 @@ -AddressInfo in bdk::wallet - Rust

    Returns true if the supplied xonly public key can be used to derive the address.

    This will only work for Taproot addresses. The Public Key is assumed to have already been tweaked.

    -

    Trait Implementations§

    Formats the value using the given formatter. Read more
    The resulting type after dereferencing.
    Dereferences the value.
    Formats the value using the given formatter. Read more
    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    Formats the value using the given formatter. Read more
    The resulting type after dereferencing.
    Dereferences the value.
    Formats the value using the given formatter. Read more
    This method tests for self and other values to be equal, and is used by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.Balance.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.Balance.html index a079667de3..492b87f68d 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.Balance.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.Balance.html @@ -12,10 +12,10 @@

    This is the balance you can spend right now that shouldn’t get cancelled via another party double spending it.

    Get the whole balance visible to the wallet.

    -

    Trait Implementations§

    The resulting type after applying the + operator.
    Performs the + operation. Read more
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Formats the value using the given formatter. Read more
    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    The resulting type after applying the + operator.
    Performs the + operation. Read more
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Formats the value using the given formatter. Read more
    This method tests for self and other values to be equal, and is used by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +sufficient, and should not be overridden without very good reason. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    Converts the given value to a String. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    Converts the given value to a String. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.Wallet.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.Wallet.html index 6d6c4cdcce..a46f3035a2 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.Wallet.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/struct.Wallet.html @@ -1,62 +1,62 @@ -Wallet in bdk::wallet - Rust

    Struct bdk::wallet::Wallet

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

    A Bitcoin wallet

    +Wallet in bdk::wallet - Rust

    Struct bdk::wallet::Wallet

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

    A Bitcoin wallet

    The Wallet struct acts as a way of coherently interfacing with output descriptors and related transactions. Its main components are:

    1. output descriptors from which it can derive addresses.
    2. signers that can contribute signatures to addresses instantiated from the descriptors.
    -

    Implementations§

    Creates a wallet that does not persist data.

    -

    Create a wallet from a descriptor (and an optional change_descriptor) and load related +

    Implementations§

    Creates a wallet that does not persist data.

    +

    Create a wallet from a descriptor (and an optional change_descriptor) and load related transaction data from db.

    -

    Get the Bitcoin network the wallet is using.

    -

    Iterator over all keychains in this wallet

    -

    Return a derived address using the external descriptor, see AddressIndex for +

    Get the Bitcoin network the wallet is using.

    +

    Iterator over all keychains in this wallet

    +

    Return a derived address using the external descriptor, see AddressIndex for available address index selection strategies. If none of the keys in the descriptor are derivable (i.e. does not end with /*) then the same address will always be returned for any AddressIndex.

    -

    Return a derived address using the internal (change) descriptor.

    +

    Return a derived address using the internal (change) descriptor.

    If the wallet doesn’t have an internal descriptor it will use the external descriptor.

    see AddressIndex for available address index selection strategies. If none of the keys in the descriptor are derivable (i.e. does not end with /*) then the same address will always be returned for any AddressIndex.

    -

    Return whether or not a script is part of this wallet (either internal or external)

    -

    Finds how the wallet derived the script pubkey spk.

    +

    Return whether or not a script is part of this wallet (either internal or external)

    +

    Finds how the wallet derived the script pubkey spk.

    Will only return Some(_) if the wallet has given out the spk.

    -

    Return the list of unspent outputs of this wallet

    -

    Get all the checkpoints the wallet is currently storing indexed by height.

    -

    Returns the latest checkpoint.

    -

    Returns a iterators of all the script pubkeys for the Internal and Externalvariants inKeychainKind`.

    +

    Return the list of unspent outputs of this wallet

    +

    Get all the checkpoints the wallet is currently storing indexed by height.

    +

    Returns the latest checkpoint.

    +

    Returns a iterators of all the script pubkeys for the Internal and Externalvariants inKeychainKind`.

    This is inteded to be used when doing a full scan of your addresses (e.g. after restoring from seed words). You pass the BTreeMap of iterators to a blockchain data source (e.g. electrum server) which will go through each address until it reaches a stop grap.

    Note carefully that iterators go over all script pubkeys on the keychains (not what script pubkeys the wallet is storing internally).

    -

    Gets an iterator over all the script pubkeys in a single keychain.

    +

    Gets an iterator over all the script pubkeys in a single keychain.

    See spks_of_all_keychains for more documentation

    -

    Returns the utxo owned by this wallet corresponding to outpoint if it exists in the +

    Returns the utxo owned by this wallet corresponding to outpoint if it exists in the wallet’s database.

    -

    Return a single transactions made and received by the wallet

    +

    Return a single transactions made and received by the wallet

    Optionally fill the TransactionDetails::transaction field with the raw transaction if include_raw is true.

    -

    Add a new checkpoint to the wallet’s internal view of the chain. +

    Add a new checkpoint to the wallet’s internal view of the chain. This stages but does not commit the change.

    Returns whether anything changed with the insertion (e.g. false if checkpoint was already there).

    -

    Add a transaction to the wallet’s internal view of the chain. -This stages but does not commit the change.

    -

    There are a number reasons tx could be rejected with an Err(_). The most important one -is that the transaction is at a height that is greater than latest_checkpoint. Therefore -you should use insert_checkpoint to insert new checkpoints before manually inserting new -transactions.

    +

    Add a transaction to the wallet’s internal view of the chain. This stages but does not +commit the change.

    Returns whether anything changed with the transaction insertion (e.g. false if the transaction was already inserted at the same position).

    -
    👎Deprecated: use Wallet::transactions instead

    Deprecated. use Wallet::transactions instead.

    -

    Iterate over the transactions in the wallet in order of ascending confirmation time with -unconfirmed transactions last.

    -

    Return the balance, separated into available, trusted-pending, untrusted-pending and immature +

    A tx can be rejected if position has a height greater than the latest_checkpoint. +Therefore you should use insert_checkpoint to insert new checkpoints before manually +inserting new transactions.

    +

    WARNING: If position is confirmed, we anchor the tx to a the lowest checkpoint that +is >= the position’s height. The caller is responsible for ensuring the tx exists in our +local view of the best chain’s history.

    +

    Iterate over the transactions in the wallet.

    +

    Return the balance, separated into available, trusted-pending, untrusted-pending and immature values.

    -

    Add an external signer

    +

    Add an external signer

    See the signer module for an example.

    -

    Get the signers

    +

    Get the signers

    Example
    let wallet = Wallet::new_no_persist("wpkh(tprv8ZgxMBicQKsPe73PBRSmNbTfbcsZnwWhz5eVmhHpi31HW29Z7mc9B4cWGRQzopNUzZUT391DeDJxL2PefNunWyLgqCKRMDkU1s2s8bAfoSk/84'/0'/0'/0/*)", None, Network::Testnet)?;
     for secret_key in wallet.get_signers(KeychainKind::External).signers().iter().filter_map(|s| s.descriptor_secret_key()) {
    @@ -65,7 +65,7 @@ values.

    } Ok::<(), Box<dyn std::error::Error>>(())
    -

    Start building a transaction.

    +

    Start building a transaction.

    This returns a blank TxBuilder from which you can specify the parameters for the transaction.

    Example
    let (psbt, details) = {
    @@ -76,7 +76,7 @@ values.

    }; // sign and broadcast ...
    -

    Bump the fee of a transaction previously created with this wallet.

    +

    Bump the fee of a transaction previously created with this wallet.

    Returns an error if the transaction is already confirmed or doesn’t explicitly signal replace by fee (RBF). If the transaction can be fee bumped then it returns a TxBuilder pre-populated with the inputs and outputs of the original transaction.

    @@ -101,7 +101,7 @@ pre-populated with the inputs and outputs of the original transaction.

    let _ = wallet.sign(&mut psbt, SignOptions::default())?; let fee_bumped_tx = psbt.extract_tx(); // broadcast fee_bumped_tx to replace original
    -

    Sign a transaction with all the wallet’s signers, in the order specified by every signer’s +

    Sign a transaction with all the wallet’s signers, in the order specified by every signer’s SignerOrdering. This function returns the Result type with an encapsulated bool that has the value true if the PSBT was finalized, or false otherwise.

    The SignOptions can be used to tweak the behavior of the software signers, and the way the transaction is finalized at the end. Note that it can’t be guaranteed that every @@ -115,34 +115,38 @@ in this library will.

    }; let finalized = wallet.sign(&mut psbt, SignOptions::default())?; assert!(finalized, "we should have signed all the inputs");
    -

    Return the spending policies for the wallet’s descriptor

    -

    Return the “public” version of the wallet’s descriptor, meaning a new descriptor that has +

    Return the spending policies for the wallet’s descriptor

    +

    Return the “public” version of the wallet’s descriptor, meaning a new descriptor that has the same structure but with every secret key removed

    This can be used to build a watch-only version of a wallet

    -

    Finalize a PSBT, i.e., for each input determine if sufficient data is available to pass +

    Finalize a PSBT, i.e., for each input determine if sufficient data is available to pass validation and construct the respective scriptSig or scriptWitness. Please refer to BIP174 for further information.

    Returns true if the PSBT could be finalized, and false otherwise.

    The SignOptions can be used to tweak the behavior of the finalizer.

    -

    Return the secp256k1 context used for all signing operations

    -

    Returns the descriptor used to create addresses for a particular keychain.

    -

    The derivation index of this wallet. It will return None if it has not derived any addresses. +

    Return the secp256k1 context used for all signing operations

    +

    Returns the descriptor used to create addresses for a particular keychain.

    +

    The derivation index of this wallet. It will return None if it has not derived any addresses. Otherwise, it will return the index of the highest address it has derived.

    -

    The index of the next address that you would get if you were to ask the wallet for a new address

    -

    Informs the wallet that you no longer intend to broadcast a tx that was built from it.

    +

    The index of the next address that you would get if you were to ask the wallet for a new address

    +

    Informs the wallet that you no longer intend to broadcast a tx that was built from it.

    This frees up the change address used when creating the tx for use in future transactions.

    -

    get the corresponding PSBT Input for a LocalUtxo

    -

    Return the checksum of the public descriptor associated to keychain

    +

    get the corresponding PSBT Input for a LocalUtxo

    +

    Return the checksum of the public descriptor associated to keychain

    Internally calls Self::get_descriptor_for_keychain to fetch the right descriptor

    -

    Applies an update to the wallet and stages the changes (but does not commit them).

    +

    Applies an update to the wallet and stages the changes (but does not commit them).

    +

    This returns whether the update resulted in any changes.

    Usually you create an update by interacting with some blockchain data source and inserting transactions related to your wallet into it.

    -

    Commits all curently staged changed to the persistence backend returning and error when this fails.

    -

    Returns the changes that will be staged with the next call to commit.

    -

    Get a reference to the inner TxGraph.

    -

    Get a reference to the inner ChainGraph.

    -

    Trait Implementations§

    Converts this type into a shared reference of the (usually inferred) input type.
    Converts this type into a shared reference of the (usually inferred) input type.
    Formats the value using the given formatter. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Commits all curently staged changed to the persistence backend returning and error when +this fails.

    +

    This returns whether the update resulted in any changes.

    +

    Returns the changes that will be staged with the next call to commit.

    +

    Get a reference to the inner [TxGraph].

    +

    Get a reference to the inner [KeychainTxOutIndex].

    +

    Get a reference to the inner [LocalChain].

    +

    Trait Implementations§

    Converts this type into a shared reference of the (usually inferred) input type.
    Formats the value using the given formatter. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/struct.TxBuilder.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/struct.TxBuilder.html index aa3b43693b..53c34e3082 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/struct.TxBuilder.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/tx_builder/struct.TxBuilder.html @@ -157,7 +157,7 @@ BitBox and ColdCard are known to require this.

    Choose the coin selection algorithm

    Overrides the DefaultCoinSelectionAlgorithm.

    Note that this function consumes the builder and returns it so it is usually best to put this as the first call on the builder.

    -

    Finish building the transaction.

    +

    Finish building the transaction.

    Returns the BIP174 “PSBT” and summary details about the transaction.

    Enable signaling RBF

    This will use the default nSequence value of 0xFFFFFFFD.

    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/type.ChangeSet.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/type.ChangeSet.html new file mode 100644 index 0000000000..775a4f942c --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/type.ChangeSet.html @@ -0,0 +1,2 @@ +ChangeSet in bdk::wallet - Rust

    Type Definition bdk::wallet::ChangeSet

    source ·
    pub type ChangeSet = LocalChangeSet<KeychainKind, ConfirmationTimeAnchor>;
    Expand description

    The changeset produced internally by Wallet when mutated.

    +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/type.Update.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/type.Update.html index 74b83165d6..2aac3164ec 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/type.Update.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/type.Update.html @@ -1,3 +1,2 @@ -Update in bdk::wallet - Rust

    Type Definition bdk::wallet::Update

    source ·
    pub type Update = KeychainScan<KeychainKind, ConfirmationTime>;
    Expand description

    The update to a Wallet used in Wallet::apply_update. This is usually returned from blockchain data sources. -The type parameter T indicates the kind of transaction contained in the update. It’s usually a [bitcoin::Transaction].

    +Update in bdk::wallet - Rust

    Type Definition bdk::wallet::Update

    source ·
    pub type Update = LocalUpdate<KeychainKind, ConfirmationTimeAnchor>;
    Expand description

    The update to a Wallet used in Wallet::apply_update. This is usually returned from blockchain data sources.

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/type.UpdateError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/type.UpdateError.html deleted file mode 100644 index 207646011b..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk/wallet/type.UpdateError.html +++ /dev/null @@ -1,2 +0,0 @@ -UpdateError in bdk::wallet - Rust

    Type Definition bdk::wallet::UpdateError

    source ·
    pub type UpdateError = UpdateError<ConfirmationTime>;
    Expand description

    Error indicating that something was wrong with an Update<T>.

    -
    \ No newline at end of file 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 c240e0c020..f131b01936 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/chain_data/enum.ChainPosition.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_data/enum.ChainPosition.html new file mode 100644 index 0000000000..f1bb262133 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_data/enum.ChainPosition.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

    Redirecting to ../../bdk_chain/enum.ChainPosition.html...

    + + + \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_data/enum.ObservedAs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_data/enum.ObservedAs.html deleted file mode 100644 index 2c9732b811..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_data/enum.ObservedAs.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Redirection - - -

    Redirecting to ../../bdk_chain/enum.ObservedAs.html...

    - - - \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_data/enum.TxHeight.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_data/enum.TxHeight.html deleted file mode 100644 index a396dca13c..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_data/enum.TxHeight.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Redirection - - -

    Redirecting to ../../bdk_chain/enum.TxHeight.html...

    - - - \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/enum.InsertTxError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/enum.InsertTxError.html deleted file mode 100644 index 1f7e3a1763..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/enum.InsertTxError.html +++ /dev/null @@ -1,13 +0,0 @@ -InsertTxError in bdk_chain::chain_graph - Rust
    pub enum InsertTxError<P> {
    -    Chain(InsertTxError<P>),
    -    UnresolvableConflict(UnresolvableConflict<P>),
    -}
    Expand description

    Error that may occur when inserting a transaction.

    -

    Refer to ChainGraph::insert_tx_preview and ChainGraph::insert_tx.

    -

    Variants§

    §

    Chain(InsertTxError<P>)

    §

    UnresolvableConflict(UnresolvableConflict<P>)

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Formats the value using the given formatter. Read more
    The lower-level source of this error, if any. Read more
    👎Deprecated since 1.42.0: use the Display impl or to_string()
    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    Converts to this type from the input type.
    Converts to this type from the input type.
    This method tests for self and other values to be equal, and is used -by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    🔬This is a nightly-only experimental API. (provide_any)
    Data providers should implement this method to provide all values they are able to -provide by using demand. Read more
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    Converts the given value to a String. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/enum.NewError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/enum.NewError.html deleted file mode 100644 index e8401e3565..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/enum.NewError.html +++ /dev/null @@ -1,17 +0,0 @@ -NewError in bdk_chain::chain_graph - Rust
    pub enum NewError<P> {
    -    Conflict {
    -        a: (P, Txid),
    -        b: (P, Txid),
    -    },
    -    Missing(HashSet<Txid>),
    -}
    Expand description

    Error that may occur when calling ChainGraph::new.

    -

    Variants§

    §

    Conflict

    Fields

    §a: (P, Txid)
    §b: (P, Txid)

    Two transactions within the sparse chain conflicted with each other

    -
    §

    Missing(HashSet<Txid>)

    One or more transactions in the chain were not in the graph

    -

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Formats the value using the given formatter. Read more
    The lower-level source of this error, if any. Read more
    👎Deprecated since 1.42.0: use the Display impl or to_string()
    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    This method tests for self and other values to be equal, and is used -by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    🔬This is a nightly-only experimental API. (provide_any)
    Data providers should implement this method to provide all values they are able to -provide by using demand. Read more
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    Converts the given value to a String. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/enum.UpdateError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/enum.UpdateError.html deleted file mode 100644 index abd7c30a18..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/enum.UpdateError.html +++ /dev/null @@ -1,14 +0,0 @@ -UpdateError in bdk_chain::chain_graph - Rust
    pub enum UpdateError<P> {
    -    Chain(UpdateError<P>),
    -    UnresolvableConflict(UnresolvableConflict<P>),
    -}
    Expand description

    Represents an update failure.

    -

    Variants§

    §

    Chain(UpdateError<P>)

    The update chain was inconsistent with the existing chain

    -
    §

    UnresolvableConflict(UnresolvableConflict<P>)

    A transaction in the update spent the same input as an already confirmed transaction

    -

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Formats the value using the given formatter. Read more
    The lower-level source of this error, if any. Read more
    👎Deprecated since 1.42.0: use the Display impl or to_string()
    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    Converts to this type from the input type.
    Converts to this type from the input type.
    This method tests for self and other values to be equal, and is used -by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    🔬This is a nightly-only experimental API. (provide_any)
    Data providers should implement this method to provide all values they are able to -provide by using demand. Read more
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    Converts the given value to a String. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/index.html deleted file mode 100644 index a8344573c3..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/index.html +++ /dev/null @@ -1,3 +0,0 @@ -bdk_chain::chain_graph - Rust

    Module bdk_chain::chain_graph

    source ·
    Expand description

    Module for structures that combine the features of sparse_chain and tx_graph.

    -

    Structs

    A consistent combination of a SparseChain<P> and a TxGraph<T>.
    Represents changes to ChainGraph.
    Represents an unresolvable conflict between an update’s transaction and an -already-confirmed transaction.

    Enums

    Error that may occur when inserting a transaction.
    Error that may occur when calling ChainGraph::new.
    Represents an update failure.

    Type Definitions

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/sidebar-items.js deleted file mode 100644 index 5d5f13a12a..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/sidebar-items.js +++ /dev/null @@ -1 +0,0 @@ -window.SIDEBAR_ITEMS = {"enum":[["InsertTxError","Error that may occur when inserting a transaction."],["NewError","Error that may occur when calling [`ChainGraph::new`]."],["UpdateError","Represents an update failure."]],"struct":[["ChainGraph","A consistent combination of a [`SparseChain

    `] and a [`TxGraph`]."],["ChangeSet","Represents changes to [`ChainGraph`]."],["UnresolvableConflict","Represents an unresolvable conflict between an update’s transaction and an already-confirmed transaction."]],"type":[["InsertCheckpointError","A nice alias of [`sparse_chain::InsertCheckpointError`]."]]}; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/struct.ChainGraph.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/struct.ChainGraph.html deleted file mode 100644 index 7062a684d6..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/struct.ChainGraph.html +++ /dev/null @@ -1,89 +0,0 @@ -ChainGraph in bdk_chain::chain_graph - Rust

    pub struct ChainGraph<P = TxHeight> { /* private fields */ }
    Expand description

    A consistent combination of a SparseChain<P> and a TxGraph<T>.

    -

    SparseChain only keeps track of transaction ids and their position in the chain, but you often -want to store the full transactions as well. Additionally, you want to make sure that everything -in the chain is consistent with the full transaction data. ChainGraph enforces these two -invariants:

    -
      -
    1. Every transaction that is in the chain is also in the graph (you always have the full -transaction).
    2. -
    3. No transactions in the chain conflict with each other, i.e., they don’t double spend each -other or have ancestors that double spend each other.
    4. -
    -

    Note that the ChainGraph guarantees a 1:1 mapping between transactions in the chain and -graph but not the other way around. Transactions may fall out of the chain (via re-org or -mempool eviction) but will remain in the graph.

    -

    Implementations§

    Returns a reference to the internal SparseChain.

    -

    Returns a reference to the internal TxGraph.

    -

    Create a new chain graph from a chain and a graph.

    -

    There are two reasons this can return an Err:

    -
      -
    1. There is a transaction in the chain that does not have its corresponding full -transaction in graph.
    2. -
    3. The chain has two transactions that are allegedly in it, but they conflict in the graph -(so could not possibly be in the same chain).
    4. -
    -

    Take an update in the form of a SparseChain<P> and attempt to turn it -into a chain graph by filling in full transactions from self and from new_txs. This -returns a ChainGraph<P, Cow<T>> where the Cow<'a, T> will borrow the transaction if it -got it from self.

    -

    This is useful when interacting with services like an electrum server which returns a list -of txids and heights when calling script_get_history, which can easily be inserted into a -SparseChain<TxHeight>. From there, you need to figure out which full -transactions you are missing in your chain graph and form new_txs. You then use -inflate_update to turn this into an update ChainGraph<P, Cow<Transaction>> and finally -use determine_changeset to generate the changeset from it.

    -

    Gets the checkpoint limit.

    -

    Refer to SparseChain::checkpoint_limit for more.

    -

    Sets the checkpoint limit.

    -

    Refer to SparseChain::set_checkpoint_limit for more.

    -

    Determines the changes required to invalidate checkpoints from_height (inclusive) and -above. Displaced transactions will have their positions moved to TxHeight::Unconfirmed.

    -

    Invalidate checkpoints from_height (inclusive) and above. Displaced transactions will be -re-positioned to TxHeight::Unconfirmed.

    -

    This is equivalent to calling Self::invalidate_checkpoints_preview and -Self::apply_changeset in sequence.

    -

    Get a transaction currently in the underlying SparseChain.

    -

    This does not necessarily mean that it is confirmed in the blockchain; it might just be in -the unconfirmed transaction list within the SparseChain.

    -

    Determines the changes required to insert a transaction into the inner ChainGraph and -SparseChain at the given position.

    -

    If inserting it into the chain position will result in conflicts, the returned -ChangeSet should evict conflicting transactions.

    -

    Inserts [Transaction] at the given chain position.

    -

    This is equivalent to calling Self::insert_tx_preview and Self::apply_changeset in -sequence.

    -

    Determines the changes required to insert a [TxOut] into the internal TxGraph.

    -

    Inserts a [TxOut] into the internal TxGraph.

    -

    This is equivalent to calling Self::insert_txout_preview and Self::apply_changeset -in sequence.

    -

    Determines the changes required to insert a block_id (a height and block hash) into the -chain.

    -

    If a checkpoint with a different hash already exists at that height, this will return an error.

    -

    Inserts checkpoint into Self.

    -

    This is equivalent to calling Self::insert_checkpoint_preview and -Self::apply_changeset in sequence.

    -

    Calculates the difference between self and update in the form of a ChangeSet.

    -

    Given a transaction, return an iterator of txids that conflict with it (spends at least -one of the same inputs). This iterator includes all descendants of conflicting transactions.

    -

    This method only returns conflicts that exist in the SparseChain as transactions that -are not included in SparseChain are already considered as evicted.

    -

    Applies changeset to self.

    -

    Warning this method assumes that the changeset is correctly formed. If it is not, the -chain graph may behave incorrectly in the future and panic unexpectedly.

    -

    Applies the update chain graph. Note this is shorthand for calling -Self::determine_changeset() and Self::apply_changeset() in sequence.

    -

    Get the full transaction output at an outpoint if it exists in the chain and the graph.

    -

    Iterate over the full transactions and their position in the chain ordered by their position -in ascending order.

    -

    Find the transaction in the chain that spends outpoint.

    -

    This uses the input/output relationships in the internal graph. Note that the transaction -which includes outpoint does not need to be in the graph or the chain for this to -return Some(_).

    -

    Whether the chain graph contains any data whatsoever.

    -

    Trait Implementations§

    Converts this type into a shared reference of the (usually inferred) input type.
    Converts this type into a shared reference of the (usually inferred) input type.
    Converts this type into a shared reference of the (usually inferred) input type.
    Converts this type into a shared reference of the (usually inferred) input type.
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    The provided closure f will be called with each outpoint/txout pair.
    Converts to this type from the input type.
    This method tests for self and other values to be equal, and is used -by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/struct.ChangeSet.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/struct.ChangeSet.html deleted file mode 100644 index 2d47c61e23..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/struct.ChangeSet.html +++ /dev/null @@ -1,16 +0,0 @@ -ChangeSet in bdk_chain::chain_graph - Rust
    pub struct ChangeSet<P> {
    -    pub chain: ChangeSet<P>,
    -    pub graph: Additions,
    -}
    Expand description

    Represents changes to ChainGraph.

    -

    This is essentially a combination of sparse_chain::ChangeSet and tx_graph::Additions.

    -

    Fields§

    §chain: ChangeSet<P>§graph: Additions

    Implementations§

    Returns true if this ChangeSet records no changes.

    -

    Returns true if this ChangeSet contains transaction evictions.

    -

    Appends the changes in other into self such that applying self afterward has the same -effect as sequentially applying the original self and other.

    -

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    The provided closure f will be called with each outpoint/txout pair.
    Converts to this type from the input type.
    This method tests for self and other values to be equal, and is used -by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/struct.UnresolvableConflict.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/struct.UnresolvableConflict.html deleted file mode 100644 index 4be9cc6c02..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/struct.UnresolvableConflict.html +++ /dev/null @@ -1,13 +0,0 @@ -UnresolvableConflict in bdk_chain::chain_graph - Rust
    pub struct UnresolvableConflict<P> {
    -    pub already_confirmed_tx: (P, Txid),
    -    pub update_tx: (P, Txid),
    -}
    Expand description

    Represents an unresolvable conflict between an update’s transaction and an -already-confirmed transaction.

    -

    Fields§

    §already_confirmed_tx: (P, Txid)§update_tx: (P, Txid)

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Formats the value using the given formatter. Read more
    The lower-level source of this error, if any. Read more
    👎Deprecated since 1.42.0: use the Display impl or to_string()
    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    Converts to this type from the input type.
    Converts to this type from the input type.
    This method tests for self and other values to be equal, and is used -by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    🔬This is a nightly-only experimental API. (provide_any)
    Data providers should implement this method to provide all values they are able to -provide by using demand. Read more
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    Converts the given value to a String. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/type.InsertCheckpointError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/type.InsertCheckpointError.html deleted file mode 100644 index 69be1d4d6a..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/chain_graph/type.InsertCheckpointError.html +++ /dev/null @@ -1,2 +0,0 @@ -InsertCheckpointError in bdk_chain::chain_graph - Rust
    pub type InsertCheckpointError = InsertCheckpointError;
    Expand description
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/constant.COINBASE_MATURITY.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/constant.COINBASE_MATURITY.html index 655bca0e35..e025fed035 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/constant.COINBASE_MATURITY.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/constant.COINBASE_MATURITY.html @@ -1,2 +1,2 @@ -COINBASE_MATURITY in bdk_chain - Rust

    Constant bdk_chain::COINBASE_MATURITY

    source ·
    pub const COINBASE_MATURITY: u32 = 100;
    Expand description

    How many confirmations are needed f or a coinbase output to be spent.

    +COINBASE_MATURITY in bdk_chain - Rust

    Constant bdk_chain::COINBASE_MATURITY

    source ·
    pub const COINBASE_MATURITY: u32 = 100;
    Expand description

    How many confirmations are needed f or a coinbase output to be spent.

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.ChainPosition.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.ChainPosition.html new file mode 100644 index 0000000000..b304fd0cec --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.ChainPosition.html @@ -0,0 +1,19 @@ +ChainPosition in bdk_chain - Rust
    pub enum ChainPosition<A> {
    +    Confirmed(A),
    +    Unconfirmed(u64),
    +}
    Expand description

    Represents the observed position of some chain data.

    +

    The generic A should be a Anchor implementation.

    +

    Variants§

    §

    Confirmed(A)

    The chain data is seen as confirmed, and in anchored by A.

    +
    §

    Unconfirmed(u64)

    The chain data is seen in mempool at this given timestamp.

    +

    Implementations§

    Returns whether ChainPosition is confirmed or not.

    +

    Maps a ChainPosition<&A> into a ChainPosition<A> by cloning the contents.

    +

    Determines the upper bound of the confirmation height.

    +

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Converts to this type from the input type.
    Feeds this value into the given Hasher. Read more
    Feeds a slice of this type into the given Hasher. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used +by ==. Read more
    This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason. Read more
    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
    This method tests greater than (for self and other) and is used by the > operator. Read more
    This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Calls U::from(self).

    +

    That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

    +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.ConfirmationTime.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.ConfirmationTime.html index 9b36a28a19..d2958c2a7e 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.ConfirmationTime.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.ConfirmationTime.html @@ -1,16 +1,25 @@ -ConfirmationTime in bdk_chain - Rust
    pub enum ConfirmationTime {
    +ConfirmationTime in bdk_chain - Rust
    pub enum ConfirmationTime {
         Confirmed {
             height: u32,
             time: u64,
         },
    -    Unconfirmed,
    +    Unconfirmed {
    +        last_seen: u64,
    +    },
     }
    Expand description

    Block height and timestamp at which a transaction is confirmed.

    -

    Variants§

    §

    Confirmed

    Fields

    §height: u32
    §time: u64
    §

    Unconfirmed

    Implementations§

    Trait Implementations§

    Get the transaction height of the position.
    Get the position’s upper bound of a given height.
    Get the position’s lower bound of a given height.
    Get the unconfirmed position.
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Feeds this value into the given Hasher. Read more
    Feeds a slice of this type into the given Hasher. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used +

    Variants§

    §

    Confirmed

    Fields

    §height: u32

    Confirmation height.

    +
    §time: u64

    Confirmation time in unix seconds.

    +

    The confirmed variant.

    +
    §

    Unconfirmed

    Fields

    §last_seen: u64

    The last-seen timestamp in unix seconds.

    +

    The unconfirmed variant.

    +

    Implementations§

    Construct an unconfirmed variant using the given last_seen time in unix seconds.

    +

    Returns whether ConfirmationTime is the confirmed variant.

    +

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Converts to this type from the input type.
    Feeds this value into the given Hasher. Read more
    Feeds a slice of this type into the given Hasher. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= +sufficient, and should not be overridden without very good reason. Read more
    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    This method tests greater than (for self and other) and is used by the > operator. Read more
    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +operator. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.ObservedAs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.ObservedAs.html deleted file mode 100644 index 92a02eac13..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.ObservedAs.html +++ /dev/null @@ -1,16 +0,0 @@ -ObservedAs in bdk_chain - Rust

    Enum bdk_chain::ObservedAs

    source ·
    pub enum ObservedAs<A> {
    -    Confirmed(A),
    -    Unconfirmed(u64),
    -}
    Expand description

    Represents an observation of some chain data.

    -

    The generic A should be a Anchor implementation.

    -

    Variants§

    §

    Confirmed(A)

    The chain data is seen as confirmed, and in anchored by A.

    -
    §

    Unconfirmed(u64)

    The chain data is seen in mempool at this given timestamp.

    -

    Implementations§

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Feeds this value into the given Hasher. Read more
    Feeds a slice of this type into the given Hasher. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used -by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= -operator. Read more
    This method tests greater than (for self and other) and is used by the > operator. Read more
    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.TxHeight.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.TxHeight.html deleted file mode 100644 index 3f97a717b6..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/enum.TxHeight.html +++ /dev/null @@ -1,13 +0,0 @@ -TxHeight in bdk_chain - Rust

    Enum bdk_chain::TxHeight

    source ·
    pub enum TxHeight {
    -    Confirmed(u32),
    -    Unconfirmed,
    -}
    Expand description

    Represents the height at which a transaction is confirmed.

    -

    Variants§

    §

    Confirmed(u32)

    §

    Unconfirmed

    Implementations§

    Trait Implementations§

    Get the transaction height of the position.
    Get the position’s upper bound of a given height.
    Get the position’s lower bound of a given height.
    Get the unconfirmed position.
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Formats the value using the given formatter. Read more
    Converts to this type from the input type.
    Converts to this type from the input type.
    Feeds this value into the given Hasher. Read more
    Feeds a slice of this type into the given Hasher. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used -by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= -operator. Read more
    This method tests greater than (for self and other) and is used by the > operator. Read more
    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    Converts the given value to a String. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/index.html index 8050970234..01f1425720 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/index.html @@ -1,4 +1,4 @@ -bdk_chain - Rust

    Crate bdk_chain

    source ·
    Expand description

    This crate is a collection of core structures for Bitcoin Dev Kit (alpha release).

    +bdk_chain - Rust

    Crate bdk_chain

    source ·
    Expand description

    This crate is a collection of core structures for Bitcoin Dev Kit (alpha release).

    The goal of this crate is to give wallets the mechanisms needed to:

    1. Figure out what data they need to fetch.
    2. @@ -15,6 +15,6 @@ consistently.
    3. Data persistence agnostic – bdk_chain does not care where you cache on-chain data, what you cache or how you fetch it.
    -

    Re-exports

    pub extern crate serde_crate as serde;
    pub use bitcoin;
    pub use miniscript;

    Modules

    Module for structures that combine the features of sparse_chain and tx_graph.
    Module for keychain related structures.
    Module for structures that maintain sparse (purposely incomplete) snapshots of blockchain data.
    Module for structures that store and traverse transactions.

    Structs

    A reference to a block in the canonical chain.
    An Anchor implementation that also records the exact confirmation height of the transaction.
    An Anchor implementation that also records the exact confirmation time and height of the +

    Re-exports

    pub extern crate serde_crate as serde;
    pub use bitcoin;
    pub use indexed_tx_graph::IndexedTxGraph;
    pub use tx_graph::TxGraph;
    pub use miniscript;

    Modules

    Contains the IndexedTxGraph structure and associated types.
    Module for keychain related structures.
    The LocalChain is a local implementation of ChainOracle.
    Module for structures that store and traverse transactions.

    Structs

    A reference to a block in the canonical chain.
    An Anchor implementation that also records the exact confirmation height of the transaction.
    An Anchor implementation that also records the exact confirmation time and height of the transaction.
    A TxOut with as much data as we can retrieve about it
    Persist wraps a PersistBackend (B) to create a convenient staging area for changes (C) -before they are persisted.
    An iterator for derived script pubkeys.
    An index storing TxOuts that have a script pubkey that matches those in a list.

    Enums

    Block height and timestamp at which a transaction is confirmed.
    Represents an observation of some chain data.
    Represents the height at which a transaction is confirmed.

    Constants

    Maximum BIP32 derivation index.
    How many confirmations are needed f or a coinbase output to be spent.

    Traits

    Trait that “anchors” blockchain data to a specific block of height and hash.
    Trait that makes an object appendable.
    Represents a service that tracks the blockchain.
    A trait to extend the functionality of a miniscript descriptor.
    Trait to do something with every txout contained in a structure.
    A persistence backend for Persist.
    \ No newline at end of file +before they are persisted.
    An iterator for derived script pubkeys.
    An index storing TxOuts that have a script pubkey that matches those in a list.

    Enums

    Represents the observed position of some chain data.
    Block height and timestamp at which a transaction is confirmed.

    Constants

    Maximum BIP32 derivation index.
    How many confirmations are needed f or a coinbase output to be spent.

    Traits

    Trait that “anchors” blockchain data to a specific block of height and hash.
    Trait that makes an object appendable.
    Represents a service that tracks the blockchain.
    A trait to extend the functionality of a miniscript descriptor.
    Trait to do something with every txout contained in a structure.
    A persistence backend for Persist.
    \ 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 d03d3ae900..6e8b020dba 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 +1,3 @@ -bdk_chain::indexed_tx_graph - Rust

    Structs

    A structure that represents changes to an IndexedTxGraph.
    A struct that combines TxGraph and an Indexer implementation.

    Traits

    Represents a structure that can index transaction data.
    \ No newline at end of file +bdk_chain::indexed_tx_graph - Rust
    Expand description

    Contains the IndexedTxGraph structure and associated types.

    +

    This is essentially a TxGraph combined with an indexer.

    +

    Structs

    A structure that represents changes to an IndexedTxGraph.
    A struct that combines TxGraph and an Indexer implementation.

    Traits

    Represents a structure that can index 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.IndexedAdditions.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/struct.IndexedAdditions.html index 24ed46c45a..3f52a39ac1 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/struct.IndexedAdditions.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/struct.IndexedAdditions.html @@ -1,13 +1,13 @@ -IndexedAdditions in bdk_chain::indexed_tx_graph - Rust
    pub struct IndexedAdditions<A, IA> {
    +IndexedAdditions in bdk_chain::indexed_tx_graph - Rust
    pub struct IndexedAdditions<A, IA> {
         pub graph_additions: Additions<A>,
         pub index_additions: IA,
     }
    Expand description

    A structure that represents changes to an IndexedTxGraph.

    Fields§

    §graph_additions: Additions<A>

    TxGraph additions.

    §index_additions: IA

    Indexer additions.

    -

    Trait Implementations§

    Append another object of the same type onto self.
    Returns whether the structure is considered empty.
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    Append another object of the same type onto self.
    Returns whether the structure is considered empty.
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Converts to this type from the input type.
    Converts to this type from the input type.
    Converts to this type from the input type.
    This method tests for self and other values to be equal, and is used by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +sufficient, and should not be overridden without very good reason. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ 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 70c1d1f1c8..1485ca2569 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,24 +1,24 @@ -IndexedTxGraph in bdk_chain::indexed_tx_graph - Rust
    pub struct IndexedTxGraph<A, I> {
    +IndexedTxGraph in bdk_chain::indexed_tx_graph - Rust
    pub struct IndexedTxGraph<A, I> {
         pub index: I,
         /* private fields */
     }
    Expand description

    A struct that combines TxGraph and an Indexer implementation.

    This structure ensures that TxGraph and Indexer are updated atomically.

    Fields§

    §index: I

    Transaction index.

    -

    Implementations§

    Construct a new IndexedTxGraph with a given index.

    -

    Get a reference of the internal transaction graph.

    -

    Applies the IndexedAdditions to the IndexedTxGraph.

    -

    Apply an update directly.

    +

    Implementations§

    Construct a new IndexedTxGraph with a given index.

    +

    Get a reference of the internal transaction graph.

    +

    Applies the IndexedAdditions to the IndexedTxGraph.

    +

    Apply an update directly.

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

    -

    Insert a floating txout of given outpoint.

    -

    Insert and index a transaction into the graph.

    +

    Insert a floating txout of given outpoint.

    +

    Insert and index a transaction into the graph.

    anchors can be provided to anchor the transaction to various blocks. seen_at is a unix timestamp of when the transaction is last seen.

    -

    Insert relevant transactions from the given txs iterator.

    +

    Insert relevant transactions from the given txs iterator.

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

    anchors can be provided to anchor the transactions to blocks. seen_at is a unix timestamp of when the transactions are last seen.

    -

    Trait Implementations§

    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Trait Implementations§

    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/trait.Indexer.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/trait.Indexer.html index 06e6b1d885..85939fc4d7 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/trait.Indexer.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/indexed_tx_graph/trait.Indexer.html @@ -1,4 +1,4 @@ -Indexer in bdk_chain::indexed_tx_graph - Rust
    pub trait Indexer {
    +Indexer in bdk_chain::indexed_tx_graph - Rust
    pub trait Indexer {
         type Additions;
     
         fn index_txout(
            &mut self,
            outpoint: OutPoint,
            txout: &TxOut
        ) -> Self::Additions; @@ -6,9 +6,9 @@ fn apply_additions(&mut self, additions: Self::Additions); fn is_tx_relevant(&self, tx: &Transaction) -> bool; }
    Expand description

    Represents a structure that can index transaction data.

    -

    Required Associated Types§

    The resultant “additions” when new transaction data is indexed.

    -

    Required Methods§

    Scan and index the given outpoint and txout.

    -

    Scan and index the given transaction.

    -

    Apply additions to itself.

    -

    Determines whether the transaction should be included in the index.

    +

    Required Associated Types§

    The resultant “additions” when new transaction data is indexed.

    +

    Required Methods§

    Scan and index the given outpoint and txout.

    +

    Scan and index the given transaction.

    +

    Apply additions to itself.

    +

    Determines whether the transaction should be included in the index.

    Implementors§

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/index.html index f33eeaf811..3a12276ea5 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/index.html @@ -1,13 +1,10 @@ -bdk_chain::keychain - Rust

    Module bdk_chain::keychain

    source ·
    Expand description

    Module for keychain related structures.

    +bdk_chain::keychain - Rust

    Module bdk_chain::keychain

    source ·
    Expand description

    Module for keychain related structures.

    A keychain here is a set of application-defined indexes for a miniscript descriptor where we can derive script pubkeys at a particular derivation index. The application’s index is simply anything that implements Ord.

    KeychainTxOutIndex indexes script pubkeys of keychains and scans in relevant outpoints (that has a txout containing an indexed script pubkey). Internally, this uses SpkTxOutIndex, but also maintains “revealed” and “lookahead” index counts per keychain.

    -

    KeychainTracker combines ChainGraph and KeychainTxOutIndex and enforces atomic -changes between both these structures. KeychainScan is a structure used to update to -KeychainTracker and changes made on a KeychainTracker are reported by -KeychainChangeSets.

    -

    Re-exports

    pub use persist::*;

    Modules

    Persistence for changes made to a KeychainTracker.

    Structs

    Balance, differentiated into various categories.
    Represents updates to the derivation index of a KeychainTxOutIndex.
    Represents changes to a KeychainTracker.
    An update that includes the last active indexes of each keychain.
    A convenient combination of a KeychainTxOutIndex and a ChainGraph.
    A convenient wrapper around SpkTxOutIndex that relates script pubkeys to miniscript public -Descriptors.
    \ No newline at end of file +

    Structs

    Balance, differentiated into various categories.
    Represents updates to the derivation index of a KeychainTxOutIndex.
    A convenient wrapper around SpkTxOutIndex that relates script pubkeys to miniscript public +Descriptors.
    A structure that records the corresponding changes as result of applying an LocalUpdate.
    A structure to update KeychainTxOutIndex, TxGraph and LocalChain +atomically.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/persist/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/persist/index.html deleted file mode 100644 index e9a10baf56..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/persist/index.html +++ /dev/null @@ -1,10 +0,0 @@ -bdk_chain::keychain::persist - Rust

    Module bdk_chain::keychain::persist

    source ·
    Expand description

    Persistence for changes made to a KeychainTracker.

    -

    BDK’s KeychainTracker needs somewhere to persist changes it makes during operation. -Operations like giving out a new address are crucial to persist so that next time the -application is loaded, it can find transactions related to that address.

    -

    Note that the KeychainTracker does not read this persisted data during operation since it -always has a copy in memory.

    -

    Structs

    Persist wraps a PersistBackend to create a convenient staging area for changes before they -are persisted. Not all changes made to the KeychainTracker need to be written to disk right -away so you can use Persist::stage to stage it first and then Persist::commit to -finally, write it to disk.

    Traits

    A persistence backend for Persist.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/persist/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/persist/sidebar-items.js deleted file mode 100644 index 59a9f5d7d5..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/persist/sidebar-items.js +++ /dev/null @@ -1 +0,0 @@ -window.SIDEBAR_ITEMS = {"struct":[["Persist","`Persist` wraps a [`PersistBackend`] to create a convenient staging area for changes before they are persisted. Not all changes made to the `KeychainTracker` need to be written to disk right away so you can use [`Persist::stage`] to stage it first and then [`Persist::commit`] to finally, write it to disk."]],"trait":[["PersistBackend","A persistence backend for [`Persist`]."]]}; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/persist/struct.Persist.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/persist/struct.Persist.html deleted file mode 100644 index 421992ce58..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/persist/struct.Persist.html +++ /dev/null @@ -1,14 +0,0 @@ -Persist in bdk_chain::keychain::persist - Rust
    pub struct Persist<K, P, B> { /* private fields */ }
    Expand description

    Persist wraps a PersistBackend to create a convenient staging area for changes before they -are persisted. Not all changes made to the KeychainTracker need to be written to disk right -away so you can use Persist::stage to stage it first and then Persist::commit to -finally, write it to disk.

    -

    Implementations§

    Create a new Persist from a PersistBackend.

    -

    Stage a changeset to later persistence with commit.

    -

    Get the changes that haven’t been committed yet

    -

    Commit the staged changes to the underlying persistence backend.

    -

    Returns a backend-defined error if this fails.

    -

    Trait Implementations§

    Formats the value using the given formatter. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/persist/trait.PersistBackend.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/persist/trait.PersistBackend.html deleted file mode 100644 index 350f5945c7..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/persist/trait.PersistBackend.html +++ /dev/null @@ -1,16 +0,0 @@ -PersistBackend in bdk_chain::keychain::persist - Rust
    pub trait PersistBackend<K, P> {
    -    type WriteError: Debug;
    -    type LoadError: Debug;
    -
    -    fn append_changeset(
            &mut self,
            changeset: &KeychainChangeSet<K, P>
        ) -> Result<(), Self::WriteError>; - fn load_into_keychain_tracker(
            &mut self,
            tracker: &mut KeychainTracker<K, P>
        ) -> Result<(), Self::LoadError>; -}
    Expand description

    A persistence backend for Persist.

    -

    Required Associated Types§

    The error the backend returns when it fails to write.

    -

    The error the backend returns when it fails to load.

    -

    Required Methods§

    Appends a new changeset to the persistent backend.

    -

    It is up to the backend what it does with this. It could store every changeset in a list or -it inserts the actual changes into a more structured database. All it needs to guarantee is -that load_into_keychain_tracker restores a keychain tracker to what it should be if all -changesets had been applied sequentially.

    -

    Applies all the changesets the backend has received to tracker.

    -

    Implementations on Foreign Types§

    Implementors§

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/sidebar-items.js index 056dc0db98..8d9a54623c 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/sidebar-items.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/sidebar-items.js @@ -1 +1 @@ -window.SIDEBAR_ITEMS = {"mod":[["persist","Persistence for changes made to a `KeychainTracker`."]],"struct":[["Balance","Balance, differentiated into various categories."],["DerivationAdditions","Represents updates to the derivation index of a `KeychainTxOutIndex`."],["KeychainChangeSet","Represents changes to a [`KeychainTracker`]."],["KeychainScan","An update that includes the last active indexes of each keychain."],["KeychainTracker","A convenient combination of a [`KeychainTxOutIndex`] and a [`ChainGraph`]."],["KeychainTxOutIndex","A convenient wrapper around `SpkTxOutIndex` that relates script pubkeys to miniscript public `Descriptor`s."]]}; \ No newline at end of file +window.SIDEBAR_ITEMS = {"struct":[["Balance","Balance, differentiated into various categories."],["DerivationAdditions","Represents updates to the derivation index of a `KeychainTxOutIndex`."],["KeychainTxOutIndex","A convenient wrapper around `SpkTxOutIndex` that relates script pubkeys to miniscript public `Descriptor`s."],["LocalChangeSet","A structure that records the corresponding changes as result of applying an [`LocalUpdate`]."],["LocalUpdate","A structure to update [`KeychainTxOutIndex`], [`TxGraph`] and [`LocalChain`] atomically."]]}; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.Balance.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.Balance.html index 7ff9fc12ea..2c57a382e7 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.Balance.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.Balance.html @@ -1,4 +1,4 @@ -Balance in bdk_chain::keychain - Rust

    Struct bdk_chain::keychain::Balance

    source ·
    pub struct Balance {
    +Balance in bdk_chain::keychain - Rust

    Struct bdk_chain::keychain::Balance

    source ·
    pub struct Balance {
         pub immature: u64,
         pub trusted_pending: u64,
         pub untrusted_pending: u64,
    @@ -8,14 +8,14 @@
     
    §trusted_pending: u64

    Unconfirmed UTXOs generated by a wallet tx

    §untrusted_pending: u64

    Unconfirmed UTXOs received from an external wallet

    §confirmed: u64

    Confirmed and immediately spendable balance

    -

    Implementations§

    Get sum of trusted_pending and confirmed coins.

    +

    Implementations§

    Get sum of trusted_pending and confirmed coins.

    This is the balance you can spend right now that shouldn’t get cancelled via another party double spending it.

    -

    Get the whole balance visible to the wallet.

    -

    Trait Implementations§

    The resulting type after applying the + operator.
    Performs the + operation. Read more
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Formats the value using the given formatter. Read more
    This method tests for self and other values to be equal, and is used +

    Get the whole balance visible to the wallet.

    +

    Trait Implementations§

    The resulting type after applying the + operator.
    Performs the + operation. Read more
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Formats the value using the given formatter. Read more
    This method tests for self and other values to be equal, and is used by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +sufficient, and should not be overridden without very good reason. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    Converts the given value to a String. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    Converts the given value to a String. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.DerivationAdditions.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.DerivationAdditions.html index 09a6786d34..c90774e749 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.DerivationAdditions.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.DerivationAdditions.html @@ -1,15 +1,15 @@ -DerivationAdditions in bdk_chain::keychain - Rust
    pub struct DerivationAdditions<K>(pub BTreeMap<K, u32>);
    Expand description

    Represents updates to the derivation index of a KeychainTxOutIndex.

    +DerivationAdditions in bdk_chain::keychain - Rust
    pub struct DerivationAdditions<K>(pub BTreeMap<K, u32>);
    Expand description

    Represents updates to the derivation index of a KeychainTxOutIndex.

    It can be applied to KeychainTxOutIndex with apply_additions. `DerivationAdditions are monotone in that they will never decrease the revealed derivation index.

    -

    Tuple Fields§

    §0: BTreeMap<K, u32>

    Implementations§

    Returns whether the additions are empty.

    -

    Get the inner map of the keychain to its new derivation index.

    -

    Trait Implementations§

    Append another DerivationAdditions into self.

    +

    Tuple Fields§

    §0: BTreeMap<K, u32>

    Implementations§

    Returns whether the additions are empty.

    +

    Get the inner map of the keychain to its new derivation index.

    +

    Trait Implementations§

    Append another DerivationAdditions into self.

    If the keychain already exists, increase the index when the other’s index > self’s index. If the keychain did not exist, append the new keychain.

    -
    Returns whether the structure is considered empty.
    Converts this type into a shared reference of the (usually inferred) input type.
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Converts to this type from the input type.
    This method tests for self and other values to be equal, and is used +
    Returns whether the structure is considered empty.
    Converts this type into a shared reference of the (usually inferred) input type.
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Converts to this type from the input type.
    This method tests for self and other values to be equal, and is used by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +sufficient, and should not be overridden without very good reason. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainChangeSet.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainChangeSet.html deleted file mode 100644 index f38e42485d..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainChangeSet.html +++ /dev/null @@ -1,17 +0,0 @@ -KeychainChangeSet in bdk_chain::keychain - Rust
    pub struct KeychainChangeSet<K, P> {
    -    pub derivation_indices: DerivationAdditions<K>,
    -    pub chain_graph: ChangeSet<P>,
    -}
    Expand description

    Represents changes to a KeychainTracker.

    -

    This is essentially a combination of DerivationAdditions and chain_graph::ChangeSet.

    -

    Fields§

    §derivation_indices: DerivationAdditions<K>

    The changes in local keychain derivation indices

    -
    §chain_graph: ChangeSet<P>

    The changes that have occurred in the blockchain

    -

    Implementations§

    Returns whether the KeychainChangeSet is empty (no changes recorded).

    -

    Appends the changes in other into self such that applying self afterward has the same -effect as sequentially applying the original self and other.

    -

    Note the derivation indices cannot be decreased, so other will only change the derivation -index for a keychain, if it’s value is higher than the one in self.

    -

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    The provided closure f will be called with each outpoint/txout pair.
    Converts to this type from the input type.
    Converts to this type from the input type.
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainScan.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainScan.html deleted file mode 100644 index 33b9889c1c..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainScan.html +++ /dev/null @@ -1,13 +0,0 @@ -KeychainScan in bdk_chain::keychain - Rust
    pub struct KeychainScan<K, P> {
    -    pub update: ChainGraph<P>,
    -    pub last_active_indices: BTreeMap<K, u32>,
    -}
    Expand description

    An update that includes the last active indexes of each keychain.

    -

    Fields§

    §update: ChainGraph<P>

    The update data in the form of a chain that could be applied

    -
    §last_active_indices: BTreeMap<K, u32>

    The last active indexes of each keychain

    -

    Trait Implementations§

    Converts this type into a shared reference of the (usually inferred) input type.
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Converts to this type from the input type.
    This method tests for self and other values to be equal, and is used -by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainTracker.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainTracker.html deleted file mode 100644 index a5bb940441..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainTracker.html +++ /dev/null @@ -1,72 +0,0 @@ -KeychainTracker in bdk_chain::keychain - Rust
    pub struct KeychainTracker<K, P> {
    -    pub txout_index: KeychainTxOutIndex<K>,
    -    /* private fields */
    -}
    Expand description

    A convenient combination of a KeychainTxOutIndex and a ChainGraph.

    -

    The KeychainTracker atomically updates its KeychainTxOutIndex whenever new chain data is -incorporated into its internal ChainGraph.

    -

    Fields§

    §txout_index: KeychainTxOutIndex<K>

    Index between script pubkeys to transaction outputs

    -

    Implementations§

    Add a keychain to the tracker’s txout_index with a descriptor to derive addresses. -This is just shorthand for calling KeychainTxOutIndex::add_keychain on the internal -txout_index.

    -

    Adding a keychain means you will be able to derive new script pubkeys under that keychain -and the tracker will discover transaction outputs with those script pubkeys.

    -

    Get the internal map of keychains to their descriptors. This is just shorthand for calling -KeychainTxOutIndex::keychains on the internal txout_index.

    -

    Get the checkpoint limit of the internal SparseChain.

    -

    Refer to SparseChain::checkpoint_limit for more.

    -

    Set the checkpoint limit of the internal SparseChain.

    -

    Refer to SparseChain::set_checkpoint_limit for more.

    -

    Determines the resultant KeychainChangeSet if the given KeychainScan is applied.

    -

    Internally, we call ChainGraph::determine_changeset and also determine the additions of -KeychainTxOutIndex.

    -

    Directly applies a KeychainScan on KeychainTracker.

    -

    This is equivalent to calling determine_changeset and apply_changeset in sequence.

    -

    Applies the changes in changeset to KeychainTracker.

    -

    Internally, this calls KeychainTxOutIndex::apply_additions and -ChainGraph::apply_changeset in sequence.

    -

    Iterates through FullTxOuts that are considered to exist in our representation of the -blockchain/mempool.

    -

    In other words, these are txouts of confirmed and in-mempool transactions, based on our -view of the blockchain/mempool.

    -

    Iterates through FullTxOuts that are unspent outputs.

    -

    Refer to full_txouts for more.

    -

    Returns a reference to the internal ChainGraph.

    -

    Returns a reference to the internal TxGraph (which is part of the ChainGraph).

    -

    Returns a reference to the internal SparseChain (which is part of the ChainGraph).

    -

    Determines the changes as a result of inserting block_id (a height and block hash) into the -tracker.

    -

    The caller is responsible for guaranteeing that a block exists at that height. If a -checkpoint already exists at that height with a different hash; this will return an error. -Otherwise it will return Ok(true) if the checkpoint didn’t already exist or Ok(false) -if it did.

    -

    Warning: This function modifies the internal state of the tracker. You are responsible -for persisting these changes to disk if you need to restore them.

    -

    Directly insert a block_id into the tracker.

    -

    This is equivalent of calling insert_checkpoint_preview and apply_changeset in -sequence.

    -

    Determines the changes as a result of inserting a transaction into the inner ChainGraph -and optionally into the inner chain at position.

    -

    Warning: This function modifies the internal state of the chain graph. You are -responsible for persisting these changes to disk if you need to restore them.

    -

    Directly insert a transaction into the inner ChainGraph and optionally into the inner -chain at position.

    -

    This is equivalent of calling insert_tx_preview and apply_changeset in sequence.

    -

    Returns the balance of the keychain, i.e., the value of unspent transaction outputs tracked.

    -

    The caller provides a should_trust predicate which must decide whether the value of -unconfirmed outputs on this keychain are guaranteed to be realized or not. For example:

    -
      -
    • For an internal (change) keychain, should_trust should generally be true since even if -you lose an internal output due to eviction, you will always gain back the value from whatever output the -unconfirmed transaction was spending (since that output is presumably from your wallet).
    • -
    • For an external keychain, you might want should_trust to return false since someone may cancel (by double spending) -a payment made to addresses on that keychain.
    • -
    -

    When in doubt set should_trust to return false. This doesn’t do anything other than change -where the unconfirmed output’s value is accounted for in Balance.

    -

    Returns the balance of all spendable confirmed unspent outputs of this tracker at a -particular height.

    -

    Trait Implementations§

    Converts this type into a shared reference of the (usually inferred) input type.
    Converts this type into a shared reference of the (usually inferred) input type.
    Converts this type into a shared reference of the (usually inferred) input type.
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainTxOutIndex.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainTxOutIndex.html index 1ba8db75c8..38d89793fd 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainTxOutIndex.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.KeychainTxOutIndex.html @@ -27,7 +27,7 @@ txout_index.add_keychain(MyKeychain::Internal, internal_descriptor); txout_index.add_keychain(MyKeychain::MyAppUser { user_id: 42 }, descriptor_for_user_42); let new_spk_for_user = txout_index.reveal_next_spk(&MyKeychain::MyAppUser{ user_id: 42 });
    -

    Implementations§

    Scans an object for relevant outpoints, which are stored and indexed internally.

    +

    Implementations§

    Scans an object for relevant outpoints, which are stored and indexed internally.

    If the matched script pubkey is part of the lookahead, the last stored index is updated for the script pubkey’s keychain and the DerivationAdditions returned will reflect the change.

    @@ -44,31 +44,31 @@ your chain state (i.e., SparseChain, ChainGraph).

    Return a reference to the internal SpkTxOutIndex.

    Get a reference to the set of indexed outpoints.

    Return a reference to the internal map of the keychain to descriptors.

    -

    Add a keychain to the tracker’s txout_index with a descriptor to derive addresses.

    +

    Add a keychain to the tracker’s txout_index with a descriptor to derive addresses.

    Adding a keychain means you will be able to derive new script pubkeys under that keychain and the txout index will discover transaction outputs with those script pubkeys.

    Panics

    This will panic if a different descriptor is introduced to the same keychain.

    -

    Return the lookahead setting for each keychain.

    +

    Return the lookahead setting for each keychain.

    Refer to set_lookahead for a deeper explanation of the lookahead.

    -

    Convenience method to call set_lookahead for all keychains.

    -

    Set the lookahead count for keychain.

    +

    Convenience method to call set_lookahead for all keychains.

    +

    Set the lookahead count for keychain.

    The lookahead is the number of scripts to cache ahead of the last stored script index. This is useful during a scan via scan or scan_txout.

    Panics

    This will panic if the keychain does not exist.

    -

    Convenience method to call lookahead_to_target for multiple keychains.

    -

    Store lookahead scripts until target_index.

    +

    Convenience method to call lookahead_to_target for multiple keychains.

    +

    Store lookahead scripts until target_index.

    This does not change the lookahead setting.

    -

    Generates script pubkey iterators for every keychain. The iterators iterate over all +

    Generates script pubkey iterators for every keychain. The iterators iterate over all derivable script pubkeys.

    -

    Generates a script pubkey iterator for the given keychain’s descriptor (if it exists). The +

    Generates a script pubkey iterator for the given keychain’s descriptor (if it exists). The iterator iterates over all derivable scripts of the keychain’s descriptor.

    Panics

    This will panic if the keychain does not exist.

    -

    Convenience method to get revealed_spks_of_keychain of all keychains.

    -

    Iterates over the script pubkeys revealed by this index under keychain.

    -

    Get the next derivation index for keychain. The next index is the index after the last revealed +

    Convenience method to get revealed_spks_of_keychain of all keychains.

    +

    Iterates over the script pubkeys revealed by this index under keychain.

    +

    Get the next derivation index for keychain. The next index is the index after the last revealed derivation index.

    The second field in the returned tuple represents whether the next derivation index is new. There are two scenarios where the next derivation index is reused (not new):

    @@ -79,11 +79,11 @@ There are two scenarios where the next derivation index is reused (not new):

    Not checking the second field of the tuple may result in address reuse.

    Panics

    Panics if the keychain does not exist.

    -

    Get the last derivation index that is revealed for each keychain.

    +

    Get the last derivation index that is revealed for each keychain.

    Keychains with no revealed indices will not be included in the returned BTreeMap.

    -

    Get the last derivation index revealed for keychain.

    -

    Convenience method to call Self::reveal_to_target on multiple keychains.

    -

    Reveals script pubkeys of the keychain’s descriptor up to and including the +

    Get the last derivation index revealed for keychain.

    +

    Convenience method to call Self::reveal_to_target on multiple keychains.

    +

    Reveals script pubkeys of the keychain’s descriptor up to and including the target_index.

    If the target_index cannot be reached (due to the descriptor having no wildcard and/or the target_index is in the hardened index range), this method will make a best-effort and @@ -93,7 +93,7 @@ reveal up to the last possible index.

    pubkeys are revealed, then both of these will be empty.

    Panics

    Panics if keychain does not exist.

    -

    Attempts to reveal the next script pubkey for keychain.

    +

    Attempts to reveal the next script pubkey for keychain.

    Returns the derivation index of the revealed script pubkey, the revealed script pubkey and a DerivationAdditions which represents changes in the last revealed index (if any).

    When a new script cannot be revealed, we return the last revealed script and an empty @@ -104,7 +104,7 @@ pubkeys are revealed, then both of these will be empty.

    Panics

    Panics if the keychain does not exist.

    -

    Gets the next unused script pubkey in the keychain. I.e., the script pubkey with the lowest +

    Gets the next unused script pubkey in the keychain. I.e., the script pubkey with the lowest index that has not been used yet.

    This will derive and reveal a new script pubkey if no more unused script pubkeys exist.

    If the descriptor has no wildcard and already has a used script pubkey or if a descriptor @@ -112,24 +112,24 @@ has used all scripts up to the derivation bounds, then the last derived script p returned.

    Panics

    Panics if keychain has never been added to the index

    -

    Marks the script pubkey at index as used even though the tracker hasn’t seen an output with it. +

    Marks the script pubkey at index as used even though the tracker hasn’t seen an output with it. This only has an effect when the index had been added to self already and was unused.

    Returns whether the index was initially present as unused.

    This is useful when you want to reserve a script pubkey for something but don’t want to add the transaction output using it to the index yet. Other callers will consider index on keychain used until you call unmark_used.

    -

    Undoes the effect of mark_used. Returns whether the index is inserted back into +

    Undoes the effect of mark_used. Returns whether the index is inserted back into unused.

    Note that if self has scanned an output with this script pubkey, then this will have no effect.

    -

    Iterates over all unused script pubkeys for a keychain stored in the index.

    -

    Iterates over all the [OutPoint] that have a TxOut with a script pubkey derived from +

    Iterates over all unused script pubkeys for a keychain stored in the index.

    +

    Iterates over all the [OutPoint] that have a TxOut with a script pubkey derived from keychain.

    -

    Returns the highest derivation index of the keychain where KeychainTxOutIndex has +

    Returns the highest derivation index of the keychain where KeychainTxOutIndex has found a [TxOut] with it’s script pubkey.

    -

    Returns the highest derivation index of each keychain that KeychainTxOutIndex has found +

    Returns the highest derivation index of each keychain that KeychainTxOutIndex has found a [TxOut] with it’s script pubkey.

    -

    Applies the derivation additions to the KeychainTxOutIndex, extending the number of +

    Applies the derivation additions to the KeychainTxOutIndex, extending the number of derived scripts per keychain, as specified in the additions.

    Methods from Deref<Target = SpkTxOutIndex<(K, u32)>>§

    Get a reference to the set of indexed outpoints.

    Iterate over all known txouts that spend to tracked script pubkeys.

    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.LocalChangeSet.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.LocalChangeSet.html new file mode 100644 index 0000000000..62bbff7f05 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.LocalChangeSet.html @@ -0,0 +1,13 @@ +LocalChangeSet in bdk_chain::keychain - Rust
    pub struct LocalChangeSet<K, A> {
    +    pub chain_changeset: ChangeSet,
    +    pub indexed_additions: IndexedAdditions<A, DerivationAdditions<K>>,
    +}
    Expand description

    A structure that records the corresponding changes as result of applying an LocalUpdate.

    +

    Fields§

    §chain_changeset: ChangeSet

    Changes to the LocalChain.

    +
    §indexed_additions: IndexedAdditions<A, DerivationAdditions<K>>

    Additions to IndexedTxGraph.

    +

    Trait Implementations§

    Append another object of the same type onto self.
    Returns whether the structure is considered empty.
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Converts to this type from the input type.
    Converts to this type from the input type.
    This method tests for self and other values to be equal, and is used +by ==. Read more
    This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Calls U::from(self).

    +

    That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

    +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.LocalUpdate.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.LocalUpdate.html new file mode 100644 index 0000000000..ad5ce7496d --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/struct.LocalUpdate.html @@ -0,0 +1,16 @@ +LocalUpdate in bdk_chain::keychain - Rust
    pub struct LocalUpdate<K, A> {
    +    pub keychain: BTreeMap<K, u32>,
    +    pub graph: TxGraph<A>,
    +    pub chain: LocalChain,
    +}
    Expand description

    A structure to update KeychainTxOutIndex, TxGraph and LocalChain +atomically.

    +

    Fields§

    §keychain: BTreeMap<K, u32>

    Last active derivation index per keychain (K).

    +
    §graph: TxGraph<A>

    Update for the TxGraph.

    +
    §chain: LocalChain

    Update for the LocalChain.

    +

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    This method tests for self and other values to be equal, and is used +by ==. Read more
    This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Calls U::from(self).

    +

    That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

    +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/tracker/struct.KeychainTracker.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/tracker/struct.KeychainTracker.html deleted file mode 100644 index 01e1089f7e..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/keychain/tracker/struct.KeychainTracker.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Redirection - - -

    Redirecting to ../../../bdk_chain/keychain/struct.KeychainTracker.html...

    - - - \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/index.html index e5e50c1a6f..fb0c3e8d75 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/index.html @@ -1,2 +1,3 @@ -bdk_chain::local_chain - Rust

    Module bdk_chain::local_chain

    source ·

    Structs

    Represents a failure when trying to insert a checkpoint into LocalChain.
    This is a local implementation of ChainOracle.
    Represents an update failure of LocalChain due to the update not connecting to the original +bdk_chain::local_chain - Rust

    Module bdk_chain::local_chain

    source ·
    Expand description

    The LocalChain is a local implementation of ChainOracle.

    +

    Structs

    Represents a failure when trying to insert a checkpoint into LocalChain.
    This is a local implementation of ChainOracle.
    Represents an update failure of LocalChain due to the update not connecting to the original chain.

    Type Definitions

    This is the return value of determine_changeset and represents changes to LocalChain.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.InsertBlockNotMatchingError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.InsertBlockNotMatchingError.html index 5541d9a543..d46ad32e38 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.InsertBlockNotMatchingError.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.InsertBlockNotMatchingError.html @@ -1,11 +1,14 @@ -InsertBlockNotMatchingError in bdk_chain::local_chain - Rust
    pub struct InsertBlockNotMatchingError {
    +InsertBlockNotMatchingError in bdk_chain::local_chain - Rust
    pub struct InsertBlockNotMatchingError {
         pub height: u32,
         pub original_hash: BlockHash,
         pub update_hash: BlockHash,
     }
    Expand description

    Represents a failure when trying to insert a checkpoint into LocalChain.

    -

    Fields§

    §height: u32§original_hash: BlockHash§update_hash: BlockHash

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Formats the value using the given formatter. Read more
    The lower-level source of this error, if any. Read more
    👎Deprecated since 1.42.0: use the Display impl or to_string()
    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    This method tests for self and other values to be equal, and is used +

    Fields§

    §height: u32

    The checkpoints’ height.

    +
    §original_hash: BlockHash

    Original checkpoint’s block hash.

    +
    §update_hash: BlockHash

    Update checkpoint’s block hash.

    +

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Formats the value using the given formatter. Read more
    The lower-level source of this error, if any. Read more
    👎Deprecated since 1.42.0: use the Display impl or to_string()
    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    This method tests for self and other values to be equal, and is used by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.LocalChain.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.LocalChain.html index 4702b92eea..d20e279246 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.LocalChain.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.LocalChain.html @@ -1,19 +1,23 @@ -LocalChain in bdk_chain::local_chain - Rust
    pub struct LocalChain { /* private fields */ }
    Expand description

    This is a local implementation of ChainOracle.

    -

    Implementations§

    Get a reference to a map of block height to hash.

    -

    This is like the sparsechain’s logic, expect we must guarantee that all invalidated heights +LocalChain in bdk_chain::local_chain - Rust

    pub struct LocalChain { /* private fields */ }
    Expand description

    This is a local implementation of ChainOracle.

    +

    Implementations§

    Contruct a LocalChain from a list of BlockIds.

    +

    Get a reference to a map of block height to hash.

    +

    Get the chain tip.

    +

    This is like the sparsechain’s logic, expect we must guarantee that all invalidated heights are to be re-filled.

    -

    Applies the given changeset.

    -

    Updates LocalChain with an update LocalChain.

    +

    Applies the given changeset.

    +

    Updates LocalChain with an update LocalChain.

    This is equivalent to calling determine_changeset and apply_changeset in sequence.

    -

    Insert a block of BlockId into the LocalChain.

    +

    Derives a ChangeSet that assumes that there are no preceding changesets.

    +

    The changeset returned will record additions of all blocks included in Self.

    +

    Insert a block of BlockId into the LocalChain.

    Error

    If the insertion height already contains a block, and the block has a different blockhash, this will result in an InsertBlockNotMatchingError.

    -

    Trait Implementations§

    Converts this type into a shared reference of the (usually inferred) input type.
    Error type.
    Determines whether block of BlockId exists as an ancestor of chain_tip. Read more
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Converts to this type from the input type.
    Converts to this type from the input type.
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    Converts this type into a shared reference of the (usually inferred) input type.
    Error type.
    Determines whether block of BlockId exists as an ancestor of chain_tip. Read more
    Get the best chain’s chain tip.
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Converts to this type from the input type.
    Converts to this type from the input type.
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= +sufficient, and should not be overridden without very good reason. Read more
    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    This method tests greater than (for self and other) and is used by the > operator. Read more
    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +operator. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.UpdateNotConnectedError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.UpdateNotConnectedError.html index 9776e0b7a6..d30c8a431b 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.UpdateNotConnectedError.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.UpdateNotConnectedError.html @@ -1,11 +1,11 @@ -UpdateNotConnectedError in bdk_chain::local_chain - Rust
    pub struct UpdateNotConnectedError(pub u32);
    Expand description

    Represents an update failure of LocalChain due to the update not connecting to the original +UpdateNotConnectedError in bdk_chain::local_chain - Rust

    pub struct UpdateNotConnectedError(pub u32);
    Expand description

    Represents an update failure of LocalChain due to the update not connecting to the original chain.

    The update cannot be applied to the chain because the chain suffix it represents did not connect to the existing chain. This error case contains the checkpoint height to include so that the chains can connect.

    -

    Tuple Fields§

    §0: u32

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Formats the value using the given formatter. Read more
    The lower-level source of this error, if any. Read more
    👎Deprecated since 1.42.0: use the Display impl or to_string()
    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    This method tests for self and other values to be equal, and is used +

    Tuple Fields§

    §0: u32

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Formats the value using the given formatter. Read more
    The lower-level source of this error, if any. Read more
    👎Deprecated since 1.42.0: use the Display impl or to_string()
    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    This method tests for self and other values to be equal, and is used by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/type.ChangeSet.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/type.ChangeSet.html index 357cdfd1fc..03a069dfab 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/type.ChangeSet.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/type.ChangeSet.html @@ -1,2 +1,2 @@ -ChangeSet in bdk_chain::local_chain - Rust

    Type Definition bdk_chain::local_chain::ChangeSet

    source ·
    pub type ChangeSet = BTreeMap<u32, Option<BlockHash>>;
    Expand description

    This is the return value of determine_changeset and represents changes to LocalChain.

    +ChangeSet in bdk_chain::local_chain - Rust

    Type Definition bdk_chain::local_chain::ChangeSet

    source ·
    pub type ChangeSet = BTreeMap<u32, Option<BlockHash>>;
    Expand description

    This is the return value of determine_changeset and represents changes to LocalChain.

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sidebar-items.js index ba863c1f45..e41a43755a 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sidebar-items.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sidebar-items.js @@ -1 +1 @@ -window.SIDEBAR_ITEMS = {"constant":[["BIP32_MAX_INDEX","Maximum BIP32 derivation index."],["COINBASE_MATURITY","How many confirmations are needed f or a coinbase output to be spent."]],"enum":[["ConfirmationTime","Block height and timestamp at which a transaction is confirmed."],["ObservedAs","Represents an observation of some chain data."],["TxHeight","Represents the height at which a transaction is confirmed."]],"externcrate":[["serde",""]],"mod":[["chain_graph","Module for structures that combine the features of [`sparse_chain`] and [`tx_graph`]."],["indexed_tx_graph",""],["keychain","Module for keychain related structures."],["local_chain",""],["sparse_chain","Module for structures that maintain sparse (purposely incomplete) snapshots of blockchain data."],["tx_graph","Module for structures that store and traverse transactions."]],"struct":[["BlockId","A reference to a block in the canonical chain."],["ConfirmationHeightAnchor","An [`Anchor`] implementation that also records the exact confirmation height of the transaction."],["ConfirmationTimeAnchor","An [`Anchor`] implementation that also records the exact confirmation time and height of the transaction."],["FullTxOut","A `TxOut` with as much data as we can retrieve about it"],["Persist","`Persist` wraps a [`PersistBackend`] (`B`) to create a convenient staging area for changes (`C`) before they are persisted."],["SpkIterator","An iterator for derived script pubkeys."],["SpkTxOutIndex","An index storing `TxOut`s that have a script pubkey that matches those in a list."]],"trait":[["Anchor","Trait that “anchors” blockchain data to a specific block of height and hash."],["Append","Trait that makes an object appendable."],["ChainOracle","Represents a service that tracks the blockchain."],["DescriptorExt","A trait to extend the functionality of a miniscript descriptor."],["ForEachTxOut","Trait to do something with every txout contained in a structure."],["PersistBackend","A persistence backend for [`Persist`]."]]}; \ No newline at end of file +window.SIDEBAR_ITEMS = {"constant":[["BIP32_MAX_INDEX","Maximum BIP32 derivation index."],["COINBASE_MATURITY","How many confirmations are needed f or a coinbase output to be spent."]],"enum":[["ChainPosition","Represents the observed position of some chain data."],["ConfirmationTime","Block height and timestamp at which a transaction is confirmed."]],"externcrate":[["serde",""]],"mod":[["indexed_tx_graph","Contains the [`IndexedTxGraph`] structure and associated types."],["keychain","Module for keychain related structures."],["local_chain","The [`LocalChain`] is a local implementation of [`ChainOracle`]."],["tx_graph","Module for structures that store and traverse transactions."]],"struct":[["BlockId","A reference to a block in the canonical chain."],["ConfirmationHeightAnchor","An [`Anchor`] implementation that also records the exact confirmation height of the transaction."],["ConfirmationTimeAnchor","An [`Anchor`] implementation that also records the exact confirmation time and height of the transaction."],["FullTxOut","A `TxOut` with as much data as we can retrieve about it"],["Persist","`Persist` wraps a [`PersistBackend`] (`B`) to create a convenient staging area for changes (`C`) before they are persisted."],["SpkIterator","An iterator for derived script pubkeys."],["SpkTxOutIndex","An index storing `TxOut`s that have a script pubkey that matches those in a list."]],"trait":[["Anchor","Trait that “anchors” blockchain data to a specific block of height and hash."],["Append","Trait that makes an object appendable."],["ChainOracle","Represents a service that tracks the blockchain."],["DescriptorExt","A trait to extend the functionality of a miniscript descriptor."],["ForEachTxOut","Trait to do something with every txout contained in a structure."],["PersistBackend","A persistence backend for [`Persist`]."]]}; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/enum.InsertCheckpointError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/enum.InsertCheckpointError.html deleted file mode 100644 index 66e87b52ea..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/enum.InsertCheckpointError.html +++ /dev/null @@ -1,16 +0,0 @@ -InsertCheckpointError in bdk_chain::sparse_chain - Rust
    pub enum InsertCheckpointError {
    -    HashNotMatching {
    -        height: u32,
    -        original_hash: BlockHash,
    -        update_hash: BlockHash,
    -    },
    -}
    Expand description

    Represents a failure when trying to insert a checkpoint into SparseChain.

    -

    Variants§

    §

    HashNotMatching

    Fields

    §height: u32
    §original_hash: BlockHash
    §update_hash: BlockHash

    Occurs when a checkpoint of the same height already exists with a different [BlockHash].

    -

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Formats the value using the given formatter. Read more
    The lower-level source of this error, if any. Read more
    👎Deprecated since 1.42.0: use the Display impl or to_string()
    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    This method tests for self and other values to be equal, and is used -by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    🔬This is a nightly-only experimental API. (provide_any)
    Data providers should implement this method to provide all values they are able to -provide by using demand. Read more
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    Converts the given value to a String. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/enum.InsertTxError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/enum.InsertTxError.html deleted file mode 100644 index 9ee5454298..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/enum.InsertTxError.html +++ /dev/null @@ -1,23 +0,0 @@ -InsertTxError in bdk_chain::sparse_chain - Rust
    pub enum InsertTxError<P> {
    -    TxTooHigh {
    -        txid: Txid,
    -        tx_height: u32,
    -        tip_height: Option<u32>,
    -    },
    -    TxMovedUnexpectedly {
    -        txid: Txid,
    -        original_pos: P,
    -        update_pos: P,
    -    },
    -}
    Expand description

    Represents a failure when trying to insert a [Txid] into SparseChain.

    -

    Variants§

    §

    TxTooHigh

    Fields

    §txid: Txid
    §tx_height: u32
    §tip_height: Option<u32>

    Occurs when the [Txid] is to be inserted at a height higher than the SparseChain’s tip.

    -
    §

    TxMovedUnexpectedly

    Fields

    §txid: Txid
    §original_pos: P
    §update_pos: P

    Occurs when the [Txid] is already in the SparseChain, and the insertion would result in -an unexpected move in ChainPosition.

    -

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Formats the value using the given formatter. Read more
    The lower-level source of this error, if any. Read more
    👎Deprecated since 1.42.0: use the Display impl or to_string()
    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    Converts to this type from the input type.
    This method tests for self and other values to be equal, and is used -by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    🔬This is a nightly-only experimental API. (provide_any)
    Data providers should implement this method to provide all values they are able to -provide by using demand. Read more
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    Converts the given value to a String. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/enum.UpdateError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/enum.UpdateError.html deleted file mode 100644 index e6c913632f..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/enum.UpdateError.html +++ /dev/null @@ -1,21 +0,0 @@ -UpdateError in bdk_chain::sparse_chain - Rust
    pub enum UpdateError<P = TxHeight> {
    -    NotConnected(u32),
    -    TxInconsistent {
    -        txid: Txid,
    -        original_pos: P,
    -        update_pos: P,
    -    },
    -}
    Expand description

    Represents an update failure of SparseChain.

    -

    Variants§

    §

    NotConnected(u32)

    The update cannot be applied to the chain because the chain suffix it represents did not -connect to the existing chain. This error case contains the checkpoint height to include so -that the chains can connect.

    -
    §

    TxInconsistent

    Fields

    §txid: Txid
    §original_pos: P
    §update_pos: P

    The update contains inconsistent tx states (e.g., it changed the transaction’s height). This -error is usually the inconsistency found.

    -

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Formats the value using the given formatter. Read more
    The lower-level source of this error, if any. Read more
    👎Deprecated since 1.42.0: use the Display impl or to_string()
    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    Converts to this type from the input type.
    This method tests for self and other values to be equal, and is used -by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    🔬This is a nightly-only experimental API. (provide_any)
    Data providers should implement this method to provide all values they are able to -provide by using demand. Read more
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    Converts the given value to a String. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/index.html deleted file mode 100644 index 85121b1ac1..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/index.html +++ /dev/null @@ -1,266 +0,0 @@ -bdk_chain::sparse_chain - Rust

    Module bdk_chain::sparse_chain

    source ·
    Expand description

    Module for structures that maintain sparse (purposely incomplete) snapshots of blockchain data.

    -

    SparseChain stores [Txid]s ordered by an index that implements ChainPosition (this -represents the transaction’s position in the blockchain; by default, TxHeight is used). -SparseChain also contains “checkpoints” which relate block height to block hash. Changes to -a SparseChain is reported by returning ChangeSets.

    -

    Updating SparseChain

    -

    A sparsechain can be thought of as a consistent snapshot of history. A SparseChain can be -updated by applying an update SparseChain on top, but only if they “connect” via their -checkpoints and don’t result in unexpected movements of transactions.

    - -
    // create empty sparsechain
    -let mut chain = SparseChain::<TxHeight>::default();
    -
    -/* Updating an empty sparsechain will always succeed */
    -
    -let update = SparseChain::from_checkpoints(vec![
    -    BlockId {
    -        height: 1,
    -        hash: hash_a,
    -    },
    -    BlockId {
    -        height: 2,
    -        hash: hash_b,
    -    },
    -]);
    -let _ = chain
    -    .apply_update(update)
    -    .expect("updating an empty sparsechain will always succeed");
    -
    -/* To update a non-empty sparsechain, the update must connect */
    -
    -let update = SparseChain::from_checkpoints(vec![
    -    BlockId {
    -        height: 2,
    -        hash: hash_b,
    -    },
    -    BlockId {
    -        height: 3,
    -        hash: hash_c,
    -    },
    -]);
    -let _ = chain
    -    .apply_update(update)
    -    .expect("we have connected at block height 2, so this must succeed");
    -

    Invalid updates

    -

    As shown above, sparsechains can be “connected” by comparing their checkpoints. However, there -are situations where two sparsechains cannot connect in a way that guarantees consistency.

    - -
    // our sparsechain has two checkpoints
    -let chain = SparseChain::<TxHeight>::from_checkpoints(vec![
    -    BlockId {
    -        height: 1,
    -        hash: hash_a,
    -    },
    -    BlockId {
    -        height: 2,
    -        hash: hash_b,
    -    },
    -]);
    -
    -/* Example of an ambiguous update that does not fully connect */
    -
    -let ambiguous_update = SparseChain::from_checkpoints(vec![
    -    // the update sort of "connects" at checkpoint 1, but...
    -    BlockId {
    -        height: 1,
    -        hash: hash_a,
    -    },
    -    // we cannot determine whether checkpoint 3 connects with checkpoint 2
    -    BlockId {
    -        height: 3,
    -        hash: hash_c,
    -    },
    -]);
    -let _ = chain
    -    .determine_changeset(&ambiguous_update)
    -    .expect_err("cannot apply ambiguous update");
    -
    -/* Example of an update that completely misses the point */
    -
    -let disconnected_update = SparseChain::from_checkpoints(vec![
    -    // the last checkpoint in the chain is 2, so 3 and 4 do not connect
    -    BlockId {
    -        height: 3,
    -        hash: hash_c,
    -    },
    -    BlockId {
    -        height: 4,
    -        hash: hash_d,
    -    },
    -]);
    -let _ = chain
    -    .determine_changeset(&disconnected_update)
    -    .expect_err("cannot apply a totally-disconnected update");
    -

    Handling reorgs

    -

    Updates can be formed to evict data from the original sparsechain. This is useful for handling -blockchain reorgs.

    - -
    // our chain has a single checkpoint at height 11.
    -let mut chain = SparseChain::<TxHeight>::from_checkpoints(vec![BlockId {
    -    height: 11,
    -    hash: hash_a,
    -}]);
    -
    -// we detect a reorg at height 11, and we introduce a new checkpoint at height 12
    -let update = SparseChain::from_checkpoints(vec![
    -    BlockId {
    -        height: 11,
    -        hash: hash_b,
    -    },
    -    BlockId {
    -        height: 12,
    -        hash: hash_c,
    -    },
    -]);
    -let _ = chain
    -    .apply_update(update)
    -    .expect("we can evict/replace checkpoint 11 since it is the only checkpoint");
    -
    -// now our `chain` has two checkpoints (11:hash_b & 12:hash_c)
    -// we detect another reorg, this time at height 12.
    -let update = SparseChain::from_checkpoints(vec![
    -    // we connect at checkpoint 11 as this is our "point of agreement".
    -    BlockId {
    -        height: 11,
    -        hash: hash_b,
    -    },
    -    BlockId {
    -        height: 12,
    -        hash: hash_d,
    -    },
    -]);
    -let _ = chain
    -    .apply_update(update)
    -    .expect("we have provided a valid point of agreement, so our reorg update will succeed");
    -

    Movement of transactions during update

    -

    If the original sparsechain and update sparsechain contain the same transaction at different -ChainPositions, the transaction is considered as “moved”. There are various movements of a -transaction that are invalid and update will fail.

    -

    Valid movements:

    -
      -
    • When the transaction moved from unconfirmed (in original) to confirmed (in update). In other -words, confirming transactions are allowed!
    • -
    • If there has been a reorg at height x, an originally confirmed transaction at height x or -above, may move to another height (that is at x or above, including becoming unconfirmed).
    • -
    -

    Invalid movements:

    -
      -
    • A confirmed transaction cannot move without a reorg.
    • -
    • Even with a reorg, an originally confirmed transaction cannot be moved below the height of the -reorg.
    • -
    -

    Custom ChainPosition

    -

    SparseChain maintains a list of txids ordered by ChainPosition. By default, TxHeight -is used; however, additional data can be incorporated into the implementation.

    -

    For example, we can have “perfect ordering” of transactions if our positional index is a -combination of block height and transaction position in a block.

    - -
    #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
    -pub enum TxPosition {
    -    Confirmed {
    -        height: u32,   // height of block
    -        position: u32, // position of transaction in the block
    -    },
    -    Unconfirmed,
    -}
    -
    -impl Default for TxPosition {
    -    fn default() -> Self {
    -        Self::Unconfirmed
    -    }
    -}
    -
    -impl ChainPosition for TxPosition {
    -    fn height(&self) -> TxHeight {
    -        match self {
    -            Self::Confirmed { height, .. } => TxHeight::Confirmed(*height),
    -            Self::Unconfirmed => TxHeight::Unconfirmed,
    -        }
    -    }
    -
    -    fn max_ord_of_height(height: TxHeight) -> Self {
    -        match height {
    -            TxHeight::Confirmed(height) => Self::Confirmed {
    -                height,
    -                position: u32::MAX,
    -            },
    -            TxHeight::Unconfirmed => Self::Unconfirmed,
    -        }
    -    }
    -
    -    fn min_ord_of_height(height: TxHeight) -> Self {
    -        match height {
    -            TxHeight::Confirmed(height) => Self::Confirmed {
    -                height,
    -                position: u32::MIN,
    -            },
    -            TxHeight::Unconfirmed => Self::Unconfirmed,
    -        }
    -    }
    -}
    -
    -let mut chain = SparseChain::<TxPosition>::default();
    -let _ = chain
    -    .insert_checkpoint(BlockId {
    -        height: 10,
    -        hash: hash_a,
    -    })
    -    .unwrap();
    -let _ = chain
    -    .insert_tx(
    -        txid_1,
    -        TxPosition::Confirmed {
    -            height: 9,
    -            position: 4321,
    -        },
    -    )
    -    .unwrap();
    -let _ = chain
    -    .insert_tx(
    -        txid_2,
    -        TxPosition::Confirmed {
    -            height: 9,
    -            position: 1234,
    -        },
    -    )
    -    .unwrap();
    -let _ = chain
    -    .insert_tx(
    -        txid_3,
    -        TxPosition::Confirmed {
    -            height: 10,
    -            position: 321,
    -        },
    -    )
    -    .unwrap();
    -
    -// transactions are ordered correctly
    -assert_eq!(
    -    chain.txids().collect::<Vec<_>>(),
    -    vec![
    -        &(
    -            TxPosition::Confirmed {
    -                height: 9,
    -                position: 1234
    -            },
    -            txid_2
    -        ),
    -        &(
    -            TxPosition::Confirmed {
    -                height: 9,
    -                position: 4321
    -            },
    -            txid_1
    -        ),
    -        &(
    -            TxPosition::Confirmed {
    -                height: 10,
    -                position: 321
    -            },
    -            txid_3
    -        ),
    -    ],
    -);
    -

    Structs

    The return value of determine_changeset.
    This is a non-monotone structure that tracks relevant [Txid]s that are ordered by chain -position P.

    Enums

    Represents a failure when trying to insert a checkpoint into SparseChain.
    Represents a failure when trying to insert a [Txid] into SparseChain.
    Represents an update failure of SparseChain.

    Traits

    Represents a position in which transactions are ordered in SparseChain.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/sidebar-items.js deleted file mode 100644 index 5b8fd9d27f..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/sidebar-items.js +++ /dev/null @@ -1 +0,0 @@ -window.SIDEBAR_ITEMS = {"enum":[["InsertCheckpointError","Represents a failure when trying to insert a checkpoint into [`SparseChain`]."],["InsertTxError","Represents a failure when trying to insert a [`Txid`] into [`SparseChain`]."],["UpdateError","Represents an update failure of [`SparseChain`]."]],"struct":[["ChangeSet","The return value of `determine_changeset`."],["SparseChain","This is a non-monotone structure that tracks relevant [`Txid`]s that are ordered by chain position `P`."]],"trait":[["ChainPosition","Represents a position in which transactions are ordered in [`SparseChain`]."]]}; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/struct.ChangeSet.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/struct.ChangeSet.html deleted file mode 100644 index 7aebeaf488..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/struct.ChangeSet.html +++ /dev/null @@ -1,14 +0,0 @@ -ChangeSet in bdk_chain::sparse_chain - Rust
    pub struct ChangeSet<P = TxHeight> {
    -    pub checkpoints: BTreeMap<u32, Option<BlockHash>>,
    -    pub txids: BTreeMap<Txid, Option<P>>,
    -}
    Expand description

    The return value of determine_changeset.

    -

    Fields§

    §checkpoints: BTreeMap<u32, Option<BlockHash>>§txids: BTreeMap<Txid, Option<P>>

    Implementations§

    Appends the changes of other into self such that applying self afterward has the same -effect as sequentially applying the original self and other.

    -

    Whether this changeset contains no changes.

    -

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    This method tests for self and other values to be equal, and is used -by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/struct.SparseChain.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/struct.SparseChain.html deleted file mode 100644 index 9ca9d71b55..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/struct.SparseChain.html +++ /dev/null @@ -1,76 +0,0 @@ -SparseChain in bdk_chain::sparse_chain - Rust
    pub struct SparseChain<P = TxHeight> { /* private fields */ }
    Expand description

    This is a non-monotone structure that tracks relevant [Txid]s that are ordered by chain -position P.

    -

    We use [BlockHash]s alongside their chain height as “checkpoints” to enforce consistency.

    -

    To “merge” two SparseChains, the ChangeSet can be calculated by calling -determine_changeset and applying the ChangeSet via apply_changeset. For convenience, -apply_update does the above two steps in one call.

    -

    Refer to module-level documentation for more.

    -

    Implementations§

    Creates a new chain from a list of block hashes and heights. The caller must guarantee they -are in the same chain.

    -

    Get the checkpoint for the last known tip.

    -

    Get the checkpoint at the given height if it exists.

    -

    Return the ChainPosition of a txid.

    -

    This returns None if the transaction does not exist.

    -

    Return a BTreeMap of all checkpoints (block hashes by height).

    -

    Return an iterator over checkpoints in a height range, in ascending height order.

    -

    Preview changes of updating Self with another chain that connects to it.

    -

    If the update wishes to introduce confirmed transactions, it must contain a checkpoint -that is exactly the same height as one of self’s checkpoints.

    -

    To invalidate from a given checkpoint, update must contain a checkpoint of the same height -but different hash. Invalidated checkpoints result in invalidated transactions becoming -“unconfirmed”.

    -

    An error will be returned if an update results in inconsistencies or if the update does -not correctly connect with self.

    -

    Refer to module-level documentation for more.

    -

    Updates SparseChain with another chain that connects to it.

    -

    This is equivilant to calling determine_changeset and apply_changeset in sequence.

    -

    Derives a ChangeSet that assumes that there are no preceding changesets.

    -

    The changeset returned will record additions of all [Txid]s and checkpoints included in -Self.

    -

    Determines the ChangeSet when checkpoints from_height (inclusive) and above are -invalidated. Displaced [Txid]s will be repositioned to TxHeight::Unconfirmed.

    -

    Invalidate checkpoints from_height (inclusive) and above.

    -

    This is equivalent to calling invalidate_checkpoints_preview and apply_changeset in -sequence.

    -

    Determines the ChangeSet when all transactions of height TxHeight::Unconfirmed are -removed completely.

    -

    Clears all transactions of height TxHeight::Unconfirmed.

    -

    This is equivalent to calling clear_mempool_preview and apply_changeset in sequence.

    -

    ChangeSet.

    -

    Determines the resultant ChangeSet if [Txid] was inserted at position pos.

    -

    Changes to the [Txid]’s position are allowed (under the rules noted in -module-level documentation) and will be reflected in the ChangeSet.

    -

    Inserts a given [Txid] at pos.

    -

    This is equivilant to calling insert_tx_preview and apply_changeset in sequence.

    -

    Determines the resultant ChangeSet if BlockId was inserted.

    -

    If the change would result in a change in block hash of a certain height, insertion would -fail.

    -

    Insert a checkpoint (BlockId).

    -

    This is equivalent to calling insert_checkpoint_preview and apply_changeset in -sequence.

    -

    Iterate over all [Txid]s ordered by their ChainPosition.

    -

    Iterate over a sub-range of positioned [Txid]s.

    -

    Iterate over a sub-range of positioned [Txid]s, where the range is defined by -ChainPosition only.

    -

    Iterate over a sub-range of positioned [Txid]s, where the range is defined by TxHeight -only.

    -

    Attempt to retrieve a FullTxOut of the given outpoint.

    -

    This will return Some only if the output’s transaction is in both self and graph.

    -

    Returns the value set as the checkpoint limit.

    -

    Refer to set_checkpoint_limit.

    -

    Set the checkpoint limit.

    -

    The checkpoint limit restricts the number of checkpoints that can be stored in Self. -Oldest checkpoints are pruned first.

    -

    Return [Txid]s that would be added to the sparse chain if this changeset was applied.

    -

    Finds the transaction in the chain that spends outpoint.

    -

    TxGraph is used to provide the spend relationships.

    -

    Note that the transaction including outpoint does not need to be in the graph or the -chain for this to return Some.

    -

    Returns whether the sparse chain contains any checkpoints or transactions.

    -

    Trait Implementations§

    Converts this type into a shared reference of the (usually inferred) input type.
    Converts this type into a shared reference of the (usually inferred) input type.
    Converts this type into a shared reference of the (usually inferred) input type.
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    This method tests for self and other values to be equal, and is used -by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/trait.ChainPosition.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/trait.ChainPosition.html deleted file mode 100644 index 407cf40c88..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/sparse_chain/trait.ChainPosition.html +++ /dev/null @@ -1,13 +0,0 @@ -ChainPosition in bdk_chain::sparse_chain - Rust
    pub trait ChainPosition: Debug + Clone + Eq + PartialOrd + Ord + Hash + Send + Sync + 'static {
    -    fn height(&self) -> TxHeight;
    -    fn max_ord_of_height(height: TxHeight) -> Self;
    -    fn min_ord_of_height(height: TxHeight) -> Self;
    -
    -    fn unconfirmed() -> Self { ... }
    -}
    Expand description

    Represents a position in which transactions are ordered in SparseChain.

    -

    ChainPosition implementations must be Ord by TxHeight first.

    -

    Required Methods§

    Get the transaction height of the position.

    -

    Get the position’s upper bound of a given height.

    -

    Get the position’s lower bound of a given height.

    -

    Provided Methods§

    Get the unconfirmed position.

    -

    Implementors§

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.BlockId.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.BlockId.html index 99eaed1326..4c500ed0fc 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.BlockId.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.BlockId.html @@ -1,15 +1,15 @@ -BlockId in bdk_chain - Rust

    Struct bdk_chain::BlockId

    source ·
    pub struct BlockId {
    +BlockId in bdk_chain - Rust

    Struct bdk_chain::BlockId

    source ·
    pub struct BlockId {
         pub height: u32,
         pub hash: BlockHash,
     }
    Expand description

    A reference to a block in the canonical chain.

    Fields§

    §height: u32

    The height of the block.

    §hash: BlockHash

    The hash of the block.

    -

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Converts to this type from the input type.
    Converts to this type from the input type.
    Converts to this type from the input type.
    Feeds this value into the given Hasher. Read more
    Feeds a slice of this type into the given Hasher. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Converts to this type from the input type.
    Converts to this type from the input type.
    Converts to this type from the input type.
    Feeds this value into the given Hasher. Read more
    Feeds a slice of this type into the given Hasher. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= +sufficient, and should not be overridden without very good reason. Read more
    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    This method tests greater than (for self and other) and is used by the > operator. Read more
    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +operator. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.ConfirmationHeightAnchor.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.ConfirmationHeightAnchor.html index 325adc1b26..3ede584ef8 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.ConfirmationHeightAnchor.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.ConfirmationHeightAnchor.html @@ -1,16 +1,16 @@ -ConfirmationHeightAnchor in bdk_chain - Rust
    pub struct ConfirmationHeightAnchor {
    +ConfirmationHeightAnchor in bdk_chain - Rust
    pub struct ConfirmationHeightAnchor {
         pub anchor_block: BlockId,
         pub confirmation_height: u32,
     }
    Expand description

    An Anchor implementation that also records the exact confirmation height of the transaction.

    Fields§

    §anchor_block: BlockId

    The anchor block.

    §confirmation_height: u32

    The exact confirmation height of the transaction.

    It is assumed that this value is never larger than the height of the anchor block.

    -

    Trait Implementations§

    Returns the BlockId that the associated blockchain data is “anchored” in.
    Get the upper bound of the chain data’s confirmation height. Read more
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Feeds this value into the given Hasher. Read more
    Feeds a slice of this type into the given Hasher. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    Returns the BlockId that the associated blockchain data is “anchored” in.
    Get the upper bound of the chain data’s confirmation height. Read more
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Feeds this value into the given Hasher. Read more
    Feeds a slice of this type into the given Hasher. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= +sufficient, and should not be overridden without very good reason. Read more
    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    This method tests greater than (for self and other) and is used by the > operator. Read more
    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +operator. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.ConfirmationTimeAnchor.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.ConfirmationTimeAnchor.html index 1cb538dc5c..e9c14f611a 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.ConfirmationTimeAnchor.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.ConfirmationTimeAnchor.html @@ -1,16 +1,18 @@ -ConfirmationTimeAnchor in bdk_chain - Rust
    pub struct ConfirmationTimeAnchor {
    +ConfirmationTimeAnchor in bdk_chain - Rust
    pub struct ConfirmationTimeAnchor {
         pub anchor_block: BlockId,
         pub confirmation_height: u32,
         pub confirmation_time: u64,
     }
    Expand description

    An Anchor implementation that also records the exact confirmation time and height of the transaction.

    Fields§

    §anchor_block: BlockId

    The anchor block.

    -
    §confirmation_height: u32§confirmation_time: u64

    Trait Implementations§

    Returns the BlockId that the associated blockchain data is “anchored” in.
    Get the upper bound of the chain data’s confirmation height. Read more
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Feeds this value into the given Hasher. Read more
    Feeds a slice of this type into the given Hasher. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used +
    §confirmation_height: u32

    The confirmation height of the chain data being anchored.

    +
    §confirmation_time: u64

    The confirmation time of the chain data being anchored.

    +

    Trait Implementations§

    Returns the BlockId that the associated blockchain data is “anchored” in.
    Get the upper bound of the chain data’s confirmation height. Read more
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Feeds this value into the given Hasher. Read more
    Feeds a slice of this type into the given Hasher. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= +sufficient, and should not be overridden without very good reason. Read more
    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    This method tests greater than (for self and other) and is used by the > operator. Read more
    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +operator. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.FullTxOut.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.FullTxOut.html index 73ec905afa..abc86f55ce 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.FullTxOut.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.FullTxOut.html @@ -1,37 +1,30 @@ -FullTxOut in bdk_chain - Rust

    Struct bdk_chain::FullTxOut

    source ·
    pub struct FullTxOut<P> {
    +FullTxOut in bdk_chain - Rust

    Struct bdk_chain::FullTxOut

    source ·
    pub struct FullTxOut<A> {
         pub outpoint: OutPoint,
         pub txout: TxOut,
    -    pub chain_position: P,
    -    pub spent_by: Option<(P, Txid)>,
    +    pub chain_position: ChainPosition<A>,
    +    pub spent_by: Option<(ChainPosition<A>, Txid)>,
         pub is_on_coinbase: bool,
     }
    Expand description

    A TxOut with as much data as we can retrieve about it

    Fields§

    §outpoint: OutPoint

    The location of the TxOut.

    §txout: TxOut

    The TxOut.

    -
    §chain_position: P

    The position of the transaction in outpoint in the overall chain.

    -
    §spent_by: Option<(P, Txid)>

    The txid and chain position of the transaction (if any) that has spent this output.

    +
    §chain_position: ChainPosition<A>

    The position of the transaction in outpoint in the overall chain.

    +
    §spent_by: Option<(ChainPosition<A>, Txid)>

    The txid and chain position of the transaction (if any) that has spent this output.

    §is_on_coinbase: bool

    Whether this output is on a coinbase transaction.

    -

    Implementations§

    Whether the utxo is/was/will be spendable at height.

    -

    It is spendable if it is not an immature coinbase output and no spending tx has been -confirmed by that height.

    -

    Whether the txout is considered mature.

    -

    This is the alternative version of is_mature which depends on chain_position being a -ObservedAs<A> where A implements Anchor.

    +

    Implementations§

    Whether the txout is considered mature.

    Depending on the implementation of confirmation_height_upper_bound in Anchor, this method may return false-negatives. In other words, interpretted confirmation count may be less than the actual value.

    -

    Whether the utxo is/was/will be spendable with chain tip.

    +

    Whether the utxo is/was/will be spendable with chain tip.

    This method does not take into account the locktime.

    -

    This is the alternative version of is_spendable_at which depends on chain_position -being a ObservedAs<A> where A implements Anchor.

    Depending on the implementation of confirmation_height_upper_bound in Anchor, this method may return false-negatives. In other words, interpretted confirmation count may be less than the actual value.

    -

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= +sufficient, and should not be overridden without very good reason. Read more
    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    This method tests greater than (for self and other) and is used by the > operator. Read more
    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    +operator. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.SpkTxOutIndex.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.SpkTxOutIndex.html index 5b5465f3ff..38d23976a8 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.SpkTxOutIndex.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/struct.SpkTxOutIndex.html @@ -8,7 +8,7 @@ combination of (keychain, derivation_index).

    Note there is no harm in scanning transactions that disappear from the blockchain or were never in there in the first place. SpkTxOutIndex is intentionally monotone – you cannot delete or modify txouts that have been indexed. To find out which txouts from the index are actually in the -chain or unspent, you must use other sources of information like a SparseChain.

    +chain or unspent, you must use other sources of information like a TxGraph.

    Implementations§

    Scans an object containing many txouts.

    Typically, this is used in two situations:

      diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.Anchor.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.Anchor.html index 45081c40ec..17bc592159 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.Anchor.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.Anchor.html @@ -11,4 +11,4 @@ parent block of B.

    Provided Methods§

    Get the upper bound of the chain data’s confirmation height.

    The default definition gives a pessimistic answer. This can be overridden by the Anchor implementation for a more accurate value.

    -

    Implementations on Foreign Types§

    Implementors§

    \ No newline at end of file +

    Implementations on Foreign Types§

    Implementors§

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.Append.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.Append.html index 780b6be364..2a8ec196b8 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.Append.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.Append.html @@ -4,4 +4,4 @@ }
    Expand description

    Trait that makes an object appendable.

    Required Methods§

    Append another object of the same type onto self.

    Returns whether the structure is considered empty.

    -

    Implementations on Foreign Types§

    Implementors§

    \ No newline at end of file +

    Implementations on Foreign Types§

    Implementors§

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.ChainOracle.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.ChainOracle.html index be2d6b150d..0340ab8b59 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.ChainOracle.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.ChainOracle.html @@ -1,7 +1,8 @@ -ChainOracle in bdk_chain - Rust

    Trait bdk_chain::ChainOracle

    source ·
    pub trait ChainOracle {
    +ChainOracle in bdk_chain - Rust

    Trait bdk_chain::ChainOracle

    source ·
    pub trait ChainOracle {
         type Error: Debug;
     
         fn is_block_in_chain(
            &self,
            block: BlockId,
            chain_tip: BlockId
        ) -> Result<Option<bool>, Self::Error>; + fn get_chain_tip(&self) -> Result<Option<BlockId>, Self::Error>; }
    Expand description

    Represents a service that tracks the blockchain.

    The main method is is_block_in_chain which determines whether a given block of BlockId is an ancestor of another “static block”.

    @@ -9,4 +10,5 @@ is an ancestor of another “static block”.

    Required Methods§

    Determines whether block of BlockId exists as an ancestor of chain_tip.

    If None is returned, it means the implementation cannot determine whether block exists under chain_tip.

    -

    Implementors§

    \ No newline at end of file +

    Get the best chain’s chain tip.

    +

    Implementors§

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.ForEachTxOut.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.ForEachTxOut.html index b105aedc5b..ab41fa0aad 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.ForEachTxOut.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/trait.ForEachTxOut.html @@ -4,4 +4,4 @@

    We would prefer to just work with things that can give us an Iterator<Item=(OutPoint, &TxOut)> here, but rust’s type system makes it extremely hard to do this (without trait objects).

    Required Methods§

    The provided closure f will be called with each outpoint/txout pair.

    -

    Implementations on Foreign Types§

    Implementors§

    \ No newline at end of file +

    Implementations on Foreign Types§

    Implementors§

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/index.html index c8d9b3e817..fbcc813d12 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/index.html @@ -1,4 +1,4 @@ -bdk_chain::tx_graph - Rust

    Module bdk_chain::tx_graph

    source ·
    Expand description

    Module for structures that store and traverse transactions.

    +bdk_chain::tx_graph - Rust

    Module bdk_chain::tx_graph

    source ·
    Expand description

    Module for structures that store and traverse transactions.

    TxGraph is a monotone structure that inserts transactions and indexes the spends. The Additions structure reports changes of TxGraph but can also be applied to a TxGraph as well. Lastly, TxDescendants is an Iterator that traverses descendants of diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.Additions.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.Additions.html index 3a07d4c911..d5ca5d9cbd 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.Additions.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.Additions.html @@ -1,18 +1,22 @@ -Additions in bdk_chain::tx_graph - Rust

    Struct bdk_chain::tx_graph::Additions

    source ·
    pub struct Additions<A = ()> {
    -    pub tx: BTreeSet<Transaction>,
    -    pub txout: BTreeMap<OutPoint, TxOut>,
    +Additions in bdk_chain::tx_graph - Rust

    Struct bdk_chain::tx_graph::Additions

    source ·
    pub struct Additions<A = ()> {
    +    pub txs: BTreeSet<Transaction>,
    +    pub txouts: BTreeMap<OutPoint, TxOut>,
         pub anchors: BTreeSet<(A, Txid)>,
         pub last_seen: BTreeMap<Txid, u64>,
     }
    Expand description

    A structure that represents changes to a TxGraph.

    It is named “additions” because TxGraph is monotone, so transactions can only be added and not removed.

    Refer to module-level documentation for more.

    -

    Fields§

    §tx: BTreeSet<Transaction>§txout: BTreeMap<OutPoint, TxOut>§anchors: BTreeSet<(A, Txid)>§last_seen: BTreeMap<Txid, u64>

    Implementations§

    Returns true if the Additions is empty (no transactions or txouts).

    -

    Iterates over all outpoints contained within Additions.

    -

    Trait Implementations§

    Append another object of the same type onto self.
    Returns whether the structure is considered empty.
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    The provided closure f will be called with each outpoint/txout pair.
    This method tests for self and other values to be equal, and is used +

    Fields§

    §txs: BTreeSet<Transaction>

    Added transactions.

    +
    §txouts: BTreeMap<OutPoint, TxOut>

    Added txouts.

    +
    §anchors: BTreeSet<(A, Txid)>

    Added anchors.

    +
    §last_seen: BTreeMap<Txid, u64>

    Added last-seen unix timestamps of transactions.

    +

    Implementations§

    Returns true if the Additions is empty (no transactions or txouts).

    +

    Iterates over all outpoints contained within Additions.

    +

    Trait Implementations§

    Append another object of the same type onto self.
    Returns whether the structure is considered empty.
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Deserialize this value from the given Serde deserializer. Read more
    The provided closure f will be called with each outpoint/txout pair.
    Converts to this type from the input type.
    This method tests for self and other values to be equal, and is used by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +sufficient, and should not be overridden without very good reason. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.CanonicalTx.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.CanonicalTx.html index 20cc1b2325..81251c6885 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.CanonicalTx.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.CanonicalTx.html @@ -1,8 +1,8 @@ CanonicalTx in bdk_chain::tx_graph - Rust
    pub struct CanonicalTx<'a, T, A> {
    -    pub observed_as: ObservedAs<&'a A>,
    +    pub observed_as: ChainPosition<&'a A>,
         pub node: TxNode<'a, T, A>,
     }
    Expand description

    An outwards-facing view of a transaction that is part of the best chain’s history.

    -

    Fields§

    §observed_as: ObservedAs<&'a A>

    How the transaction is observed as (confirmed or unconfirmed).

    +

    Fields§

    §observed_as: ChainPosition<&'a A>

    How the transaction is observed as (confirmed or unconfirmed).

    §node: TxNode<'a, T, A>

    The transaction node (as part of the graph).

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used by ==. Read more
    This method tests for !=. The default implementation is almost always diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxDescendants.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxDescendants.html index e7494c6565..a3d70562a8 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxDescendants.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxDescendants.html @@ -1,6 +1,6 @@ -TxDescendants in bdk_chain::tx_graph - Rust
    pub struct TxDescendants<'g, A, F> { /* private fields */ }
    Expand description

    An iterator that traverses transaction descendants.

    +TxDescendants in bdk_chain::tx_graph - Rust
    pub struct TxDescendants<'g, A, F> { /* private fields */ }
    Expand description

    An iterator that traverses transaction descendants.

    This struct is created by the walk_descendants method of TxGraph.

    -

    Trait Implementations§

    The type of the elements being iterated over.
    Advances the iterator and returns the next value. Read more
    🔬This is a nightly-only experimental API. (iter_next_chunk)
    Advances the iterator and returns an array containing the next N values. Read more
    Returns the bounds on the remaining length of the iterator. Read more
    Consumes the iterator, counting the number of iterations and returning it. Read more
    Consumes the iterator, returning the last element. Read more
    🔬This is a nightly-only experimental API. (iter_advance_by)
    Advances the iterator by n elements. Read more
    Returns the nth element of the iterator. Read more
    Creates an iterator starting at the same point, but stepping by +

    Trait Implementations§

    The type of the elements being iterated over.
    Advances the iterator and returns the next value. Read more
    🔬This is a nightly-only experimental API. (iter_next_chunk)
    Advances the iterator and returns an array containing the next N values. Read more
    Returns the bounds on the remaining length of the iterator. Read more
    Consumes the iterator, counting the number of iterations and returning it. Read more
    Consumes the iterator, returning the last element. Read more
    🔬This is a nightly-only experimental API. (iter_advance_by)
    Advances the iterator by n elements. Read more
    Returns the nth element of the iterator. Read more
    Creates an iterator starting at the same point, but stepping by the given amount at each iteration. Read more
    Takes two iterators and creates a new iterator over both in sequence. Read more
    ‘Zips up’ two iterators into a single iterator of pairs. Read more
    🔬This is a nightly-only experimental API. (iter_intersperse)
    Creates a new iterator which places an item generated by separator between adjacent items of the original iterator. Read more
    Takes a closure and creates an iterator which calls that closure on each element. Read more
    Calls a closure on each element of an iterator. Read more
    Creates an iterator which uses a closure to determine if an element @@ -32,8 +32,8 @@ less than those of another. Read more
    Determines if the elements of this Iterator are lexicographically greater than those of another. Read more
    Determines if the elements of this Iterator are lexicographically greater than or equal to those of another. Read more
    🔬This is a nightly-only experimental API. (is_sorted)
    Checks if the elements of this iterator are sorted using the given comparator function. Read more
    🔬This is a nightly-only experimental API. (is_sorted)
    Checks if the elements of this iterator are sorted using the given key extraction -function. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more
    Calculate the sum over the iterator using checked arithmetic. If an over or underflow would -happen it returns None. Read more
    Calculate the sum over the iterator using checked arithmetic. If an over or underflow would +function. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more
    Calculate the sum over the iterator using checked arithmetic. If an over or underflow would +happen it returns None. Read more
    Calculate the sum over the iterator using checked arithmetic. If an over or underflow would happen it returns None. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of 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 ed2099441a..2eff7d1703 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§

    Iterate over all tx outputs known by TxGraph.

    This includes txouts of both full transactions as well as floating transactions.

    @@ -78,21 +78,21 @@ exist in update but not in self).

    Previews the resultant Additions when Self is updated against the update graph.

    The Additions would be the set difference between update and self (transactions that exist in update but not in self).

    -

    Get the position of the transaction in chain with tip chain_tip.

    +

    Get the position of the transaction in chain with tip chain_tip.

    If the given transaction of txid does not exist in the chain of chain_tip, None is returned.

    Error

    An error will occur if the ChainOracle implementation (chain) fails. If the ChainOracle is infallible, get_chain_position can be used instead.

    -

    Get the position of the transaction in chain with tip chain_tip.

    +

    Get the position of the transaction in chain with tip chain_tip.

    This is the infallible version of try_get_chain_position.

    -

    Get the txid of the spending transaction and where the spending transaction is observed in +

    Get the txid of the spending transaction and where the spending transaction is observed in the chain of chain_tip.

    If no in-chain transaction spends outpoint, None will be returned.

    Error

    An error will occur only if the ChainOracle implementation (chain) fails.

    If the ChainOracle is infallible, get_chain_spend can be used instead.

    -

    Get the txid of the spending transaction and where the spending transaction is observed in +

    Get the txid of the spending transaction and where the spending transaction is observed in the chain of chain_tip.

    This is the infallible version of try_get_chain_spend

    List graph transactions that are in chain with chain_tip.

    @@ -104,7 +104,7 @@ returned item.

    If the ChainOracle is infallible, list_chain_txs can be used instead.

    List graph transactions that are in chain with chain_tip.

    This is the infallible version of try_list_chain_txs.

    -

    Get a filtered list of outputs from the given outpoints that are in chain with +

    Get a filtered list of outputs from the given outpoints that are in chain with chain_tip.

    outpoints is a list of outpoints we are interested in, coupled with an outpoint identifier (OI) for convenience. If OI is not necessary, the caller can use (), or @@ -115,10 +115,10 @@ returned item.

    fails.

    If the ChainOracle implementation is infallible, filter_chain_txouts can be used instead.

    -

    Get a filtered list of outputs from the given outpoints that are in chain with +

    Get a filtered list of outputs from the given outpoints that are in chain with chain_tip.

    This is the infallible version of try_filter_chain_txouts.

    -

    Get a filtered list of unspent outputs (UTXOs) from the given outpoints that are in +

    Get a filtered list of unspent outputs (UTXOs) from the given outpoints that are in chain with chain_tip.

    outpoints is a list of outpoints we are interested in, coupled with an outpoint identifier (OI) for convenience. If OI is not necessary, the caller can use (), or @@ -129,7 +129,7 @@ instead.

    fails.

    If the ChainOracle implementation is infallible, filter_chain_unspents can be used instead.

    -

    Get a filtered list of unspent outputs (UTXOs) from the given outpoints that are in +

    Get a filtered list of unspent outputs (UTXOs) from the given outpoints that are in chain with chain_tip.

    This is the infallible version of try_filter_chain_unspents.

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

    @@ -141,7 +141,7 @@ instead.

    used instead.

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

    This is the infallible version of try_balance.

    -

    Trait Implementations§

    Converts this type into a shared reference of the (usually inferred) input type.
    Converts this type into a shared reference of the (usually inferred) input type.
    Converts this type into a shared reference of the (usually inferred) input type.
    Converts this type into a shared reference of the (usually inferred) input type.
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    The provided closure f will be called with each outpoint/txout pair.
    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    Converts this type into a shared reference of the (usually inferred) input type.
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    The provided closure f will be called with each outpoint/txout pair.
    This method tests for self and other values to be equal, and is used by ==. Read more
    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/electrum_ext/struct.ElectrumUpdate.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/electrum_ext/struct.ElectrumUpdate.html new file mode 100644 index 0000000000..a79c55aa05 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/electrum_ext/struct.ElectrumUpdate.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

    Redirecting to ../../bdk_electrum/struct.ElectrumUpdate.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 new file mode 100644 index 0000000000..ba0451aac7 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/electrum_ext/trait.ElectrumExt.html @@ -0,0 +1,11 @@ + + + + + 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 6a87c2f8d0..deb3f365d2 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,4 +1,4 @@ -bdk_electrum - Rust

    Crate bdk_electrum

    source ·
    Expand description

    This crate is used for updating structures of the [bdk_chain] crate with data from electrum.

    +bdk_electrum - Rust

    Crate bdk_electrum

    source ·
    Expand description

    This crate is used for updating structures of the [bdk_chain] crate with data from electrum.

    The star of the show is the ElectrumExt::scan method, which scans for relevant blockchain data (via electrum) and outputs an ElectrumUpdate.

    An ElectrumUpdate only includes txids and no full transactions. The caller is responsible @@ -15,4 +15,4 @@ these steps:

    Refer to bdk_electrum_example for a complete example.

    -

    Re-exports

    pub use bdk_chain;
    pub use electrum_client;

    Structs

    Traits

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

    Re-exports

    pub use bdk_chain;
    pub use electrum_client;

    Structs

    Traits

    \ 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 f427138cd5..0a2430d54b 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":[["ElectrumUpdate","The result of [`ElectrumExt::scan`]."]],"trait":[["ElectrumExt","Trait to extend [`electrum_client::Client`] functionality."]]}; \ No newline at end of file +window.SIDEBAR_ITEMS = {"struct":[["ElectrumUpdate",""]],"trait":[["ElectrumExt",""]]}; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/struct.ElectrumUpdate.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/struct.ElectrumUpdate.html index befb43943b..bd77fb1fce 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/struct.ElectrumUpdate.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_electrum/struct.ElectrumUpdate.html @@ -1,16 +1,14 @@ -ElectrumUpdate in bdk_electrum - Rust
    pub struct ElectrumUpdate<K, P> {
    -    pub chain_update: SparseChain<P>,
    -    pub last_active_indices: BTreeMap<K, u32>,
    -}
    Expand description

    The result of ElectrumExt::scan.

    -

    Fields§

    §chain_update: SparseChain<P>

    The internal [SparseChain] update.

    -
    §last_active_indices: BTreeMap<K, u32>

    The last keychain script pubkey indices, which had transaction histories.

    -

    Implementations§

    Return a list of missing full transactions that are required to inflate_update.

    -

    Transform the ElectrumUpdate into a [KeychainScan], which can be applied to a -tracker.

    -

    This will fail if there are missing full transactions not provided via new_txs.

    -

    Trait Implementations§

    Converts this type into a shared reference of the (usually inferred) input type.
    Returns the “default value” for a type. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    +ElectrumUpdate in bdk_electrum - Rust
    pub struct ElectrumUpdate<K, A> {
    +    pub graph_update: HashMap<Txid, BTreeSet<A>>,
    +    pub chain_update: LocalChain,
    +    pub keychain_update: BTreeMap<K, u32>,
    +}

    Fields§

    §graph_update: HashMap<Txid, BTreeSet<A>>§chain_update: LocalChain§keychain_update: BTreeMap<K, u32>

    Implementations§

    Finalizes the ElectrumUpdate with new_txs and anchors of type +[ConfirmationTimeAnchor].

    +

    Note: The confirmation time might not be precisely correct if there has been a reorg. +Electrum’s API intends that we use the merkle proof API, we should change bdk_electrum to +use it.

    +

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    -
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file 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 index ca20266439..df603aeeb6 100644 --- 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 @@ -1,20 +1,6 @@ -ElectrumExt in bdk_electrum - Rust
    pub trait ElectrumExt {
    +ElectrumExt in bdk_electrum - Rust
    pub trait ElectrumExt<A> {
         fn get_tip(&self) -> Result<(u32, BlockHash), Error>;
    -    fn scan<K: Ord + Clone>(
            &self,
            local_chain: &BTreeMap<u32, BlockHash>,
            keychain_spks: BTreeMap<K, impl IntoIterator<Item = (u32, Script)>>,
            txids: impl IntoIterator<Item = Txid>,
            outpoints: impl IntoIterator<Item = OutPoint>,
            stop_gap: usize,
            batch_size: usize
        ) -> Result<ElectrumUpdate<K, TxHeight>, Error>; + fn scan<K: Ord + Clone>(
            &self,
            local_chain: &BTreeMap<u32, BlockHash>,
            keychain_spks: BTreeMap<K, impl IntoIterator<Item = (u32, Script)>>,
            txids: impl IntoIterator<Item = Txid>,
            outpoints: impl IntoIterator<Item = OutPoint>,
            stop_gap: usize,
            batch_size: usize
        ) -> Result<ElectrumUpdate<K, A>, Error>; - fn scan_without_keychain(
            &self,
            local_chain: &BTreeMap<u32, BlockHash>,
            misc_spks: impl IntoIterator<Item = Script>,
            txids: impl IntoIterator<Item = Txid>,
            outpoints: impl IntoIterator<Item = OutPoint>,
            batch_size: usize
        ) -> Result<SparseChain, Error> { ... } -}
    Expand description

    Trait to extend [electrum_client::Client] functionality.

    -

    Refer to crate-level documentation for more.

    -

    Required Methods§

    Fetch the latest block height.

    -

    Scan the blockchain (via electrum) for the data specified. This returns a ElectrumUpdate -which can be transformed into a [KeychainScan] after we find all the missing full -transactions.

    -
      -
    • local_chain: the most recent block hashes present locally
    • -
    • keychain_spks: keychains that we want to scan transactions for
    • -
    • txids: transactions for which we want the updated [ChainPosition]s
    • -
    • outpoints: transactions associated with these outpoints (residing, spending) that we -want to included in the update
    • -
    -

    Provided Methods§

    Convenience method to call scan without requiring a keychain.

    -

    Implementations on Foreign Types§

    Implementors§

    \ No newline at end of file + fn scan_without_keychain(
            &self,
            local_chain: &BTreeMap<u32, BlockHash>,
            misc_spks: impl IntoIterator<Item = Script>,
            txids: impl IntoIterator<Item = Txid>,
            outpoints: impl IntoIterator<Item = OutPoint>,
            batch_size: usize
        ) -> Result<ElectrumUpdate<(), A>, Error> { ... } +}

    Required Methods§

    Provided Methods§

    Implementations on Foreign Types§

    Implementors§

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora/index.html index aabd8cf01a..ce60dea4b0 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora/index.html @@ -1,4 +1,4 @@ -bdk_esplora - Rust

    Crate bdk_esplora

    source ·
    Expand description

    BDK Esplora

    +bdk_esplora - Rust

    Crate bdk_esplora

    source ·
    Expand description

    BDK Esplora

    BDK Esplora extends esplora_client to update [bdk_chain] structures from an Esplora server.

    Usage

    @@ -17,6 +17,6 @@ from an Esplora server.

    // for blocking
     use bdk_esplora::EsploraExt;
     // for async
    -use bdk_esplora::EsploraAsyncExt;
    +// use bdk_esplora::EsploraAsyncExt;

    For full examples, refer to example-crates/wallet_esplora (blocking) and example-crates/wallet_esplora_async.

    Re-exports

    pub use esplora_client;

    Traits

    Trait to extend [esplora_client::AsyncClient] functionality.
    Trait to extend [esplora_client::BlockingClient] functionality.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora/trait.EsploraAsyncExt.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora/trait.EsploraAsyncExt.html index 3424249b60..9a13b0e7b4 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora/trait.EsploraAsyncExt.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora/trait.EsploraAsyncExt.html @@ -1,21 +1,22 @@ -EsploraAsyncExt in bdk_esplora - Rust
    pub trait EsploraAsyncExt {
    -    fn scan<'life0, 'life1, 'async_trait, K>(
            &'life0 self,
            local_chain: &'life1 BTreeMap<u32, BlockHash>,
            keychain_spks: BTreeMap<K, impl 'async_trait + IntoIterator<IntoIter = impl 'async_trait + Iterator<Item = (u32, Script)> + Send> + Send>,
            txids: impl 'async_trait + IntoIterator<IntoIter = impl 'async_trait + Iterator<Item = Txid> + Send> + Send,
            outpoints: impl 'async_trait + IntoIterator<IntoIter = impl 'async_trait + Iterator<Item = OutPoint> + Send> + Send,
            stop_gap: usize,
            parallel_requests: usize
        ) -> Pin<Box<dyn Future<Output = Result<KeychainScan<K, ConfirmationTime>, Error>> + Send + 'async_trait>>
        where
            K: 'async_trait + Ord + Clone + Send,
            Self: 'async_trait,
            'life0: 'async_trait,
            'life1: 'async_trait
    ; +EsploraAsyncExt in bdk_esplora - Rust
    pub trait EsploraAsyncExt {
    +    fn scan<'life0, 'life1, 'async_trait, K>(
            &'life0 self,
            local_chain: &'life1 BTreeMap<u32, BlockHash>,
            keychain_spks: BTreeMap<K, impl 'async_trait + IntoIterator<IntoIter = impl 'async_trait + Iterator<Item = (u32, Script)> + Send> + Send>,
            txids: impl 'async_trait + IntoIterator<IntoIter = impl 'async_trait + Iterator<Item = Txid> + Send> + Send,
            outpoints: impl 'async_trait + IntoIterator<IntoIter = impl 'async_trait + Iterator<Item = OutPoint> + Send> + Send,
            stop_gap: usize,
            parallel_requests: usize
        ) -> Pin<Box<dyn Future<Output = Result<LocalUpdate<K, ConfirmationTimeAnchor>, Error>> + Send + 'async_trait>>
        where
            K: 'async_trait + Ord + Clone + Send,
            Self: 'async_trait,
            'life0: 'async_trait,
            'life1: 'async_trait
    ; - fn scan_without_keychain<'life0, 'life1, 'async_trait>(
            &'life0 self,
            local_chain: &'life1 BTreeMap<u32, BlockHash>,
            misc_spks: impl 'async_trait + IntoIterator<IntoIter = impl 'async_trait + Iterator<Item = Script> + Send> + Send,
            txids: impl 'async_trait + IntoIterator<IntoIter = impl 'async_trait + Iterator<Item = Txid> + Send> + Send,
            outpoints: impl 'async_trait + IntoIterator<IntoIter = impl 'async_trait + Iterator<Item = OutPoint> + Send> + Send,
            parallel_requests: usize
        ) -> Pin<Box<dyn Future<Output = Result<ChainGraph<ConfirmationTime>, Error>> + Send + 'async_trait>>
        where
            Self: Sync + 'async_trait,
            'life0: 'async_trait,
            'life1: 'async_trait
    , + fn scan_without_keychain<'life0, 'life1, 'async_trait>(
            &'life0 self,
            local_chain: &'life1 BTreeMap<u32, BlockHash>,
            misc_spks: impl 'async_trait + IntoIterator<IntoIter = impl 'async_trait + Iterator<Item = Script> + Send> + Send,
            txids: impl 'async_trait + IntoIterator<IntoIter = impl 'async_trait + Iterator<Item = Txid> + Send> + Send,
            outpoints: impl 'async_trait + IntoIterator<IntoIter = impl 'async_trait + Iterator<Item = OutPoint> + Send> + Send,
            parallel_requests: usize
        ) -> Pin<Box<dyn Future<Output = Result<LocalUpdate<(), ConfirmationTimeAnchor>, Error>> + Send + 'async_trait>>
        where
            Self: Sync + 'async_trait,
            'life0: 'async_trait,
            'life1: 'async_trait
    , { ... } }
    Expand description

    Trait to extend [esplora_client::AsyncClient] functionality.

    This is the async version of EsploraExt. Refer to crate-level documentation for more.

    -

    Required Methods§

    Scan the blockchain (via esplora) for the data specified and returns a [KeychainScan].

    +

    Required Methods§

    Scan the blockchain (via esplora) for the data specified and returns a +[LocalUpdate<K, ConfirmationTimeAnchor>].

    • local_chain: the most recent block hashes present locally
    • keychain_spks: keychains that we want to scan transactions for
    • -
    • txids: transactions for which we want updated ChainPositions
    • +
    • txids: transactions for which we want updated [ConfirmationTimeAnchor]s
    • outpoints: transactions associated with these outpoints (residing, spending) that we want to included in the update

    The scan for each keychain stops after a gap of stop_gap script pubkeys with no associated transactions. parallel_requests specifies the max number of HTTP requests to make in parallel.

    -

    Provided Methods§

    Convenience method to call scan without requiring a keychain.

    -

    Implementations on Foreign Types§

    Implementors§

    \ No newline at end of file +

    Provided Methods§

    Convenience method to call scan without requiring a keychain.

    +

    Implementations on Foreign Types§

    Implementors§

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora/trait.EsploraExt.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora/trait.EsploraExt.html index b17811c8fa..50628e0f27 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora/trait.EsploraExt.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora/trait.EsploraExt.html @@ -1,19 +1,20 @@ -EsploraExt in bdk_esplora - Rust

    Trait bdk_esplora::EsploraExt

    source ·
    pub trait EsploraExt {
    -    fn scan<K: Ord + Clone>(
            &self,
            local_chain: &BTreeMap<u32, BlockHash>,
            keychain_spks: BTreeMap<K, impl IntoIterator<Item = (u32, Script)>>,
            txids: impl IntoIterator<Item = Txid>,
            outpoints: impl IntoIterator<Item = OutPoint>,
            stop_gap: usize,
            parallel_requests: usize
        ) -> Result<KeychainScan<K, ConfirmationTime>, Error>; +EsploraExt in bdk_esplora - Rust

    Trait bdk_esplora::EsploraExt

    source ·
    pub trait EsploraExt {
    +    fn scan<K: Ord + Clone>(
            &self,
            local_chain: &BTreeMap<u32, BlockHash>,
            keychain_spks: BTreeMap<K, impl IntoIterator<Item = (u32, Script)>>,
            txids: impl IntoIterator<Item = Txid>,
            outpoints: impl IntoIterator<Item = OutPoint>,
            stop_gap: usize,
            parallel_requests: usize
        ) -> Result<LocalUpdate<K, ConfirmationTimeAnchor>, Error>; - fn scan_without_keychain(
            &self,
            local_chain: &BTreeMap<u32, BlockHash>,
            misc_spks: impl IntoIterator<Item = Script>,
            txids: impl IntoIterator<Item = Txid>,
            outpoints: impl IntoIterator<Item = OutPoint>,
            parallel_requests: usize
        ) -> Result<ChainGraph<ConfirmationTime>, Error> { ... } + fn scan_without_keychain(
            &self,
            local_chain: &BTreeMap<u32, BlockHash>,
            misc_spks: impl IntoIterator<Item = Script>,
            txids: impl IntoIterator<Item = Txid>,
            outpoints: impl IntoIterator<Item = OutPoint>,
            parallel_requests: usize
        ) -> Result<LocalUpdate<(), ConfirmationTimeAnchor>, Error> { ... } }
    Expand description

    Trait to extend [esplora_client::BlockingClient] functionality.

    Refer to crate-level documentation for more.

    -

    Required Methods§

    Scan the blockchain (via esplora) for the data specified and returns a [KeychainScan].

    +

    Required Methods§

    Scan the blockchain (via esplora) for the data specified and returns a +[LocalUpdate<K, ConfirmationTimeAnchor>].

    • local_chain: the most recent block hashes present locally
    • keychain_spks: keychains that we want to scan transactions for
    • -
    • txids: transactions for which we want updated ChainPositions
    • +
    • txids: transactions for which we want updated [ConfirmationTimeAnchor]s
    • outpoints: transactions associated with these outpoints (residing, spending) that we want to included in the update

    The scan for each keychain stops after a gap of stop_gap script pubkeys with no associated transactions. parallel_requests specifies the max number of HTTP requests to make in parallel.

    -

    Provided Methods§

    Convenience method to call scan without requiring a keychain.

    -

    Implementations on Foreign Types§

    Implementors§

    \ No newline at end of file +

    Provided Methods§

    Convenience method to call scan without requiring a keychain.

    +

    Implementations on Foreign Types§

    Implementors§

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/all.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/all.html deleted file mode 100644 index 1200a31259..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/all.html +++ /dev/null @@ -1 +0,0 @@ -List of all items in this crate

    List of all items

    Functions

    Constants

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/constant.PARALLEL_REQUESTS.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/constant.PARALLEL_REQUESTS.html deleted file mode 100644 index 267c8c978e..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/constant.PARALLEL_REQUESTS.html +++ /dev/null @@ -1 +0,0 @@ -PARALLEL_REQUESTS in bdk_esplora_wallet_example - Rust
    pub(crate) const PARALLEL_REQUESTS: usize = 5;
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/constant.SEND_AMOUNT.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/constant.SEND_AMOUNT.html deleted file mode 100644 index 48f2ae8abf..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/constant.SEND_AMOUNT.html +++ /dev/null @@ -1 +0,0 @@ -SEND_AMOUNT in bdk_esplora_wallet_example - Rust
    pub(crate) const SEND_AMOUNT: u64 = 5000;
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/constant.STOP_GAP.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/constant.STOP_GAP.html deleted file mode 100644 index 5d1c0cd5f8..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/constant.STOP_GAP.html +++ /dev/null @@ -1 +0,0 @@ -STOP_GAP in bdk_esplora_wallet_example - Rust
    pub(crate) const STOP_GAP: usize = 50;
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/fn.main.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/fn.main.html deleted file mode 100644 index 190b42c146..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/fn.main.html +++ /dev/null @@ -1 +0,0 @@ -main in bdk_esplora_wallet_example - Rust
    pub(crate) fn main() -> Result<(), Box<dyn Error>>
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/index.html deleted file mode 100644 index 5021d2f5e1..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/index.html +++ /dev/null @@ -1 +0,0 @@ -bdk_esplora_wallet_example - Rust

    Constants

    SEND_AMOUNT ðŸ”’
    STOP_GAP ðŸ”’

    Functions

    main ðŸ”’
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/sidebar-items.js deleted file mode 100644 index a6121128e9..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_esplora_wallet_example/sidebar-items.js +++ /dev/null @@ -1 +0,0 @@ -window.SIDEBAR_ITEMS = {"constant":[["PARALLEL_REQUESTS",""],["SEND_AMOUNT",""],["STOP_GAP",""]],"fn":[["main",""]]}; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/all.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/all.html index d34d20c16d..aa9a75a662 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/all.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/all.html @@ -1 +1 @@ -List of all items in this crate
    \ No newline at end of file +List of all items in this crate

    List of all items

    Structs

    Enums

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/enum.FileError.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/enum.FileError.html index c3b916ed6e..f96ce68d3b 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/enum.FileError.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/enum.FileError.html @@ -1,4 +1,4 @@ -FileError in bdk_file_store - Rust
    pub enum FileError<'a> {
    +FileError in bdk_file_store - Rust
    pub enum FileError<'a> {
         Io(Error),
         InvalidMagicBytes {
             got: Vec<u8>,
    @@ -7,7 +7,7 @@
     }
    Expand description

    Error that occurs due to problems encountered with the file.

    Variants§

    §

    Io(Error)

    IO error, this may mean that the file is too short.

    §

    InvalidMagicBytes

    Fields

    §got: Vec<u8>
    §expected: &'a [u8]

    Magic bytes do not match what is expected.

    -

    Trait Implementations§

    Formats the value using the given formatter. Read more
    Formats the value using the given formatter. Read more
    The lower-level source of this error, if any. Read more
    👎Deprecated since 1.42.0: use the Display impl or to_string()
    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    Converts to this type from the input type.

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Trait Implementations§

    Formats the value using the given formatter. Read more
    Formats the value using the given formatter. Read more
    The lower-level source of this error, if any. Read more
    👎Deprecated since 1.42.0: use the Display impl or to_string()
    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    Converts to this type from the input type.

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/index.html index aa09d4c58f..b7f28aab5a 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/index.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/index.html @@ -1,7 +1,6 @@ -bdk_file_store - Rust

    Crate bdk_file_store

    source ·
    Expand description

    BDK File Store

    +bdk_file_store - Rust

    Crate bdk_file_store

    source ·
    Expand description

    BDK File Store

    This is a simple append-only flat file implementation of -Persist.

    -

    The main structure is KeychainStore, which can be used with bdk’s +Persist.

    +

    The main structure is Store, which can be used with bdk’s Wallet to persist wallet data into a flat file.

    -

    Structs

    Iterator over entries in a file store.
    Persists an append only list of KeychainChangeSet<K,P> to a single file. -[KeychainChangeSet<K,P>] record the changes made to a [KeychainTracker<K,P>].
    Persists an append-only list of changesets (C) to a single file.

    Enums

    Error that occurs due to problems encountered with the file.
    Error type for EntryIter.
    \ No newline at end of file +

    Structs

    Iterator over entries in a file store.
    Persists an append-only list of changesets (C) to a single file.

    Enums

    Error that occurs due to problems encountered with the file.
    Error type for EntryIter.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/keychain_store/struct.KeychainStore.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/keychain_store/struct.KeychainStore.html deleted file mode 100644 index 6ca1dc38b6..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/keychain_store/struct.KeychainStore.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Redirection - - -

    Redirecting to ../../bdk_file_store/struct.KeychainStore.html...

    - - - \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/sidebar-items.js index a79498f5cc..31f87d0c41 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/sidebar-items.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/sidebar-items.js @@ -1 +1 @@ -window.SIDEBAR_ITEMS = {"enum":[["FileError","Error that occurs due to problems encountered with the file."],["IterError","Error type for [`EntryIter`]."]],"struct":[["EntryIter","Iterator over entries in a file store."],["KeychainStore","Persists an append only list of `KeychainChangeSet` to a single file. [`KeychainChangeSet`] record the changes made to a [`KeychainTracker`]."],["Store","Persists an append-only list of changesets (`C`) to a single file."]]}; \ No newline at end of file +window.SIDEBAR_ITEMS = {"enum":[["FileError","Error that occurs due to problems encountered with the file."],["IterError","Error type for [`EntryIter`]."]],"struct":[["EntryIter","Iterator over entries in a file store."],["Store","Persists an append-only list of changesets (`C`) to a single file."]]}; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/struct.EntryIter.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/struct.EntryIter.html index e61f060aef..fe83fcf9ae 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/struct.EntryIter.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/struct.EntryIter.html @@ -1,7 +1,7 @@ EntryIter in bdk_file_store - Rust

    Struct bdk_file_store::EntryIter

    source ·
    pub struct EntryIter<'t, T> { /* private fields */ }
    Expand description

    Iterator over entries in a file store.

    Reads and returns an entry each time next is called. If an error occurs while reading the iterator will yield a Result::Err(_) instead and then None for the next call to next.

    -

    Implementations§

    Trait Implementations§

    The type of the elements being iterated over.
    Advances the iterator and returns the next value. Read more
    🔬This is a nightly-only experimental API. (iter_next_chunk)
    Advances the iterator and returns an array containing the next N values. Read more
    Returns the bounds on the remaining length of the iterator. Read more
    Consumes the iterator, counting the number of iterations and returning it. Read more
    Consumes the iterator, returning the last element. Read more
    🔬This is a nightly-only experimental API. (iter_advance_by)
    Advances the iterator by n elements. Read more
    Returns the nth element of the iterator. Read more
    Creates an iterator starting at the same point, but stepping by +

    Implementations§

    Trait Implementations§

    The type of the elements being iterated over.
    Advances the iterator and returns the next value. Read more
    🔬This is a nightly-only experimental API. (iter_next_chunk)
    Advances the iterator and returns an array containing the next N values. Read more
    Returns the bounds on the remaining length of the iterator. Read more
    Consumes the iterator, counting the number of iterations and returning it. Read more
    Consumes the iterator, returning the last element. Read more
    🔬This is a nightly-only experimental API. (iter_advance_by)
    Advances the iterator by n elements. Read more
    Returns the nth element of the iterator. Read more
    Creates an iterator starting at the same point, but stepping by the given amount at each iteration. Read more
    Takes two iterators and creates a new iterator over both in sequence. Read more
    ‘Zips up’ two iterators into a single iterator of pairs. Read more
    🔬This is a nightly-only experimental API. (iter_intersperse)
    Creates a new iterator which places an item generated by separator between adjacent items of the original iterator. Read more
    Takes a closure and creates an iterator which calls that closure on each element. Read more
    Calls a closure on each element of an iterator. Read more
    Creates an iterator which uses a closure to determine if an element diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/struct.KeychainStore.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/struct.KeychainStore.html deleted file mode 100644 index e966fc5a32..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/struct.KeychainStore.html +++ /dev/null @@ -1,33 +0,0 @@ -KeychainStore in bdk_file_store - Rust
    pub struct KeychainStore<K, P> { /* private fields */ }
    Expand description

    Persists an append only list of KeychainChangeSet<K,P> to a single file. -[KeychainChangeSet<K,P>] record the changes made to a [KeychainTracker<K,P>].

    -

    Implementations§

    Creates a new store from a File.

    -

    The file must have been opened with read and write permissions.

    -

    Creates or loads a store from db_path. If no file exists there, it will be created.

    -

    Iterates over the stored changeset from first to last, changing the seek position at each -iteration.

    -

    The iterator may fail to read an entry and therefore return an error. However, the first time -it returns an error will be the last. After doing so, the iterator will always yield None.

    -

    WARNING: This method changes the write position in the underlying file. You should -always iterate over all entries until None is returned if you want your next write to go -at the end; otherwise, you will write over existing entries.

    -

    Loads all the changesets that have been stored as one giant changeset.

    -

    This function returns a tuple of the aggregate changeset and a result that indicates -whether an error occurred while reading or deserializing one of the entries. If so the -changeset will consist of all of those it was able to read.

    -

    You should usually check the error. In many applications, it may make sense to do a full -wallet scan with a stop-gap after getting an error, since it is likely that one of the -changesets it was unable to read changed the derivation indices of the tracker.

    -

    WARNING: This method changes the write position of the underlying file. The next -changeset will be written over the erroring entry (or the end of the file if none existed).

    -

    Reads and applies all the changesets stored sequentially to the tracker, stopping when it fails -to read the next one.

    -

    WARNING: This method changes the write position of the underlying file. The next -changeset will be written over the erroring entry (or the end of the file if none existed).

    -

    Append a new changeset to the file and truncate the file to the end of the appended changeset.

    -

    The truncation is to avoid the possibility of having a valid but inconsistent changeset -directly after the appended changeset.

    -

    Trait Implementations§

    Formats the value using the given formatter. Read more
    The error the backend returns when it fails to write.
    The error the backend returns when it fails to load.
    Appends a new changeset to the persistent backend. Read more
    Applies all the changesets the backend has received to tracker.

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/struct.Store.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/struct.Store.html index 9f7d6f5e67..d28660f197 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/struct.Store.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/bdk_file_store/struct.Store.html @@ -1,6 +1,6 @@ Store in bdk_file_store - Rust

    Struct bdk_file_store::Store

    source ·
    pub struct Store<'a, C> { /* private fields */ }
    Expand description

    Persists an append-only list of changesets (C) to a single file.

    The changesets are the results of altering a tracker implementation (T).

    -

    Implementations§

    Creates a new store from a File.

    +

    Implementations§

    Creates a new store from a File.

    The file must have been opened with read and write permissions.

    magic is the expected prefixed bytes of the file. If this does not match, an error will be returned.

    @@ -27,8 +27,8 @@ changeset will be written over the erroring entry (or the end of the file if non changeset.

    The truncation is to avoid the possibility of having a valid but inconsistent changeset directly after the appended changeset.

    -

    Trait Implementations§

    Formats the value using the given formatter. Read more
    The error the backend returns when it fails to write.
    The error the backend returns when it fails to load changesets C.
    Writes a changeset to the persistence backend. Read more
    Return the aggregate changeset C from persistence.

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Trait Implementations§

    Formats the value using the given formatter. Read more
    The error the backend returns when it fails to write.
    The error the backend returns when it fails to load changesets C.
    Writes a changeset to the persistence backend. Read more
    Return the aggregate changeset C from persistence.

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    Calls U::from(self).

    That is, this conversion is whatever the implementation of From<T> for U chooses to do.

    -
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file +
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/crates.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/crates.js index 5930ee8a62..f45b4e4e4a 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/crates.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/crates.js @@ -1 +1 @@ -window.ALL_CRATES = ["bdk","bdk_chain","bdk_coin_select","bdk_electrum","bdk_esplora","bdk_esplora_wallet_example","bdk_file_store","bdk_tmp_plan","keychain_tracker_electrum_example","keychain_tracker_esplora_example","keychain_tracker_example_cli","wallet_electrum_example","wallet_esplora_async"]; \ No newline at end of file +window.ALL_CRATES = ["bdk","bdk_chain","bdk_coin_select","bdk_electrum","bdk_esplora","bdk_file_store","bdk_tmp_plan","example_cli","example_electrum","wallet_electrum_example","wallet_esplora","wallet_esplora_async"]; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/all.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/all.html new file mode 100644 index 0000000000..2919e2b59d --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/all.html @@ -0,0 +1 @@ +List of all items in this crate
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.AddressCmd.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.AddressCmd.html new file mode 100644 index 0000000000..2b87b6da74 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.AddressCmd.html @@ -0,0 +1,15 @@ +AddressCmd in example_cli - Rust

    Enum example_cli::AddressCmd

    source ·
    pub enum AddressCmd {
    +    Next,
    +    New,
    +    List {
    +        change: bool,
    +    },
    +    Index,
    +}

    Variants§

    §

    Next

    Get the next unused address.

    +
    §

    New

    Get a new address regardless of the existing unused addresses.

    +
    §

    List

    Fields

    §change: bool

    List all addresses

    +
    §

    Index

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Assign values from ArgMatches to self.
    Assign values from ArgMatches to self.
    Append to [Command] so it can instantiate Self. Read more
    Append to [Command] so it can update self. Read more
    Test whether Self can parse a specific subcommand

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Calls U::from(self).

    +

    That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

    +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.CoinSelectionAlgo.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.CoinSelectionAlgo.html new file mode 100644 index 0000000000..90e5f9e2da --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.CoinSelectionAlgo.html @@ -0,0 +1,11 @@ +CoinSelectionAlgo in example_cli - Rust
    pub enum CoinSelectionAlgo {
    +    LargestFirst,
    +    SmallestFirst,
    +    OldestFirst,
    +    NewestFirst,
    +    BranchAndBound,
    +}

    Variants§

    §

    LargestFirst

    §

    SmallestFirst

    §

    OldestFirst

    §

    NewestFirst

    §

    BranchAndBound

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Formats the value using the given formatter. Read more
    The associated error which can be returned from parsing.
    Parses a string s to return a value of this type. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Calls U::from(self).

    +

    That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

    +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    Converts the given value to a String. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.Commands.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.Commands.html new file mode 100644 index 0000000000..59d723e2f7 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.Commands.html @@ -0,0 +1,23 @@ +Commands in example_cli - Rust

    Enum example_cli::Commands

    source ·
    pub enum Commands<S: Subcommand> {
    +    ChainSpecific(S),
    +    Address {
    +        addr_cmd: AddressCmd,
    +    },
    +    Balance,
    +    TxOut {
    +        txout_cmd: TxOutCmd,
    +    },
    +    Send {
    +        value: u64,
    +        address: Address,
    +        coin_select: CoinSelectionAlgo,
    +    },
    +}

    Variants§

    §

    ChainSpecific(S)

    §

    Address

    Fields

    §addr_cmd: AddressCmd

    Address generation and inspection.

    +
    §

    Balance

    Get the wallet balance.

    +
    §

    TxOut

    Fields

    §txout_cmd: TxOutCmd

    TxOut related commands.

    +
    §

    Send

    Fields

    §value: u64
    §address: Address
    §coin_select: CoinSelectionAlgo

    Send coins to an address.

    +

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Assign values from ArgMatches to self.
    Assign values from ArgMatches to self.
    Append to [Command] so it can instantiate Self. Read more
    Append to [Command] so it can update self. Read more
    Test whether Self can parse a specific subcommand

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Calls U::from(self).

    +

    That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

    +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.Keychain.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.Keychain.html new file mode 100644 index 0000000000..e66717c1fd --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.Keychain.html @@ -0,0 +1,12 @@ +Keychain in example_cli - Rust

    Enum example_cli::Keychain

    source ·
    pub enum Keychain {
    +    External,
    +    Internal,
    +}

    Variants§

    §

    External

    §

    Internal

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Formats the value using the given formatter. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used +by ==. Read more
    This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason. Read more
    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
    This method tests greater than (for self and other) and is used by the > operator. Read more
    This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more
    Compare self to key and return true if they are equal.

    Returns the argument unchanged.

    +

    Calls U::from(self).

    +

    That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

    +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    Converts the given value to a String. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.TxOutCmd.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.TxOutCmd.html new file mode 100644 index 0000000000..029748c96e --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/enum.TxOutCmd.html @@ -0,0 +1,16 @@ +TxOutCmd in example_cli - Rust

    Enum example_cli::TxOutCmd

    source ·
    pub enum TxOutCmd {
    +    List {
    +        spent: bool,
    +        unspent: bool,
    +        confirmed: bool,
    +        unconfirmed: bool,
    +    },
    +}

    Variants§

    §

    List

    Fields

    §spent: bool

    Return only spent outputs.

    +
    §unspent: bool

    Return only unspent outputs.

    +
    §confirmed: bool

    Return only confirmed outputs.

    +
    §unconfirmed: bool

    Return only unconfirmed outputs.

    +

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Assign values from ArgMatches to self.
    Assign values from ArgMatches to self.
    Append to [Command] so it can instantiate Self. Read more
    Append to [Command] so it can update self. Read more
    Test whether Self can parse a specific subcommand

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Calls U::from(self).

    +

    That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

    +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.create_tx.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.create_tx.html new file mode 100644 index 0000000000..8667dc17f7 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.create_tx.html @@ -0,0 +1 @@ +create_tx in example_cli - Rust

    Function example_cli::create_tx

    source ·
    pub fn create_tx<A: Anchor, O: ChainOracle>(
        graph: &mut KeychainTxGraph<A>,
        chain: &O,
        keymap: &HashMap<DescriptorPublicKey, DescriptorSecretKey>,
        cs_algorithm: CoinSelectionAlgo,
        address: Address,
        value: u64
    ) -> Result<(Transaction, Option<(DerivationAdditions<Keychain>, (Keychain, u32))>)>where
        O::Error: Error + Send + Sync + 'static,
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.handle_commands.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.handle_commands.html new file mode 100644 index 0000000000..0b20f5fda7 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.handle_commands.html @@ -0,0 +1 @@ +handle_commands in example_cli - Rust

    Function example_cli::handle_commands

    source ·
    pub fn handle_commands<S: Subcommand, A: Anchor, O: ChainOracle, C>(
        graph: &Mutex<KeychainTxGraph<A>>,
        db: &Mutex<Database<'_, C>>,
        chain: &Mutex<O>,
        keymap: &HashMap<DescriptorPublicKey, DescriptorSecretKey>,
        network: Network,
        broadcast: impl FnOnce(&Transaction) -> Result<()>,
        cmd: Commands<S>
    ) -> Result<()>where
        O::Error: Error + Send + Sync + 'static,
        C: Default + Append + DeserializeOwned + Serialize + From<KeychainAdditions<A>>,
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.init.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.init.html new file mode 100644 index 0000000000..b9125dc5ae --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.init.html @@ -0,0 +1 @@ +init in example_cli - Rust

    Function example_cli::init

    source ·
    pub fn init<'m, S: Subcommand, C>(
        db_magic: &'m [u8],
        db_default_path: &str
    ) -> Result<(Args<S>, KeyMap, KeychainTxOutIndex<Keychain>, Mutex<Database<'m, C>>, C)>where
        C: Default + Append + Serialize + DeserializeOwned,
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.planned_utxos.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.planned_utxos.html new file mode 100644 index 0000000000..8f41cec867 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.planned_utxos.html @@ -0,0 +1 @@ +planned_utxos in example_cli - Rust

    Function example_cli::planned_utxos

    source ·
    pub fn planned_utxos<A: Anchor, O: ChainOracle, K: Clone + CanDerive>(
        graph: &KeychainTxGraph<A>,
        chain: &O,
        assets: &Assets<K>
    ) -> Result<Vec<(Plan<K>, FullTxOut<A>)>, O::Error>
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.run_address_cmd.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.run_address_cmd.html new file mode 100644 index 0000000000..38c1f5b110 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.run_address_cmd.html @@ -0,0 +1 @@ +run_address_cmd in example_cli - Rust

    Function example_cli::run_address_cmd

    source ·
    pub fn run_address_cmd<A, C>(
        graph: &mut KeychainTxGraph<A>,
        db: &Mutex<Database<'_, C>>,
        network: Network,
        cmd: AddressCmd
    ) -> Result<()>where
        C: Default + Append + DeserializeOwned + Serialize + From<KeychainAdditions<A>>,
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.run_balance_cmd.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.run_balance_cmd.html new file mode 100644 index 0000000000..3b87bd3dce --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.run_balance_cmd.html @@ -0,0 +1 @@ +run_balance_cmd in example_cli - Rust

    Function example_cli::run_balance_cmd

    source ·
    pub fn run_balance_cmd<A: Anchor, O: ChainOracle>(
        graph: &KeychainTxGraph<A>,
        chain: &O
    ) -> Result<(), O::Error>
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.run_send_cmd.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.run_send_cmd.html new file mode 100644 index 0000000000..6fc84c5d16 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.run_send_cmd.html @@ -0,0 +1 @@ +run_send_cmd in example_cli - Rust

    Function example_cli::run_send_cmd

    source ·
    pub fn run_send_cmd<A: Anchor, O: ChainOracle, C>(
        graph: &Mutex<KeychainTxGraph<A>>,
        db: &Mutex<Database<'_, C>>,
        chain: &O,
        keymap: &HashMap<DescriptorPublicKey, DescriptorSecretKey>,
        cs_algorithm: CoinSelectionAlgo,
        address: Address,
        value: u64,
        broadcast: impl FnOnce(&Transaction) -> Result<()>
    ) -> Result<()>where
        O::Error: Error + Send + Sync + 'static,
        C: Default + Append + DeserializeOwned + Serialize + From<KeychainAdditions<A>>,
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.run_txo_cmd.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.run_txo_cmd.html new file mode 100644 index 0000000000..9fc9bde01b --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/fn.run_txo_cmd.html @@ -0,0 +1 @@ +run_txo_cmd in example_cli - Rust

    Function example_cli::run_txo_cmd

    source ·
    pub fn run_txo_cmd<A: Anchor, O: ChainOracle>(
        graph: &KeychainTxGraph<A>,
        chain: &O,
        network: Network,
        cmd: TxOutCmd
    ) -> Result<()>where
        O::Error: Error + Send + Sync + 'static,
    \ No newline at end of file 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 new file mode 100644 index 0000000000..cd942f7b7c --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/index.html @@ -0,0 +1 @@ +example_cli - Rust
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/sidebar-items.js new file mode 100644 index 0000000000..818d7a2252 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":[["AddressCmd",""],["CoinSelectionAlgo",""],["Commands",""],["Keychain",""],["TxOutCmd",""]],"fn":[["create_tx",""],["handle_commands",""],["init",""],["planned_utxos",""],["run_address_cmd",""],["run_balance_cmd",""],["run_send_cmd",""],["run_txo_cmd",""]],"struct":[["Args",""]],"type":[["Database",""],["KeychainAdditions",""],["KeychainTxGraph",""]]}; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/struct.Args.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/struct.Args.html new file mode 100644 index 0000000000..abdf3b5735 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/struct.Args.html @@ -0,0 +1,12 @@ +Args in example_cli - Rust

    Struct example_cli::Args

    source ·
    pub struct Args<S: Subcommand> {
    +    pub descriptor: String,
    +    pub change_descriptor: Option<String>,
    +    pub network: Network,
    +    pub db_path: PathBuf,
    +    pub cp_limit: usize,
    +    pub command: Commands<S>,
    +}

    Fields§

    §descriptor: String§change_descriptor: Option<String>§network: Network§db_path: PathBuf§cp_limit: usize§command: Commands<S>

    Trait Implementations§

    Append to [Command] so it can instantiate Self. Read more
    Append to [Command] so it can update self. Read more
    Deprecated, replaced with CommandFactory::command
    Deprecated, replaced with CommandFactory::command_for_update
    Build a [Command] that can instantiate Self. Read more
    Build a [Command] that can update self. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Assign values from ArgMatches to self.
    Assign values from ArgMatches to self.
    Parse from std::env::args_os(), exit on error
    Parse from std::env::args_os(), return Err on error.
    Parse from iterator, exit on error
    Parse from iterator, return Err on error.
    Update from iterator, exit on error
    Update from iterator, return Err on error.

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Calls U::from(self).

    +

    That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

    +
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/type.Database.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/type.Database.html new file mode 100644 index 0000000000..767fb63b45 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/type.Database.html @@ -0,0 +1 @@ +Database in example_cli - Rust

    Type Definition example_cli::Database

    source ·
    pub type Database<'m, C> = Persist<Store<'m, C>, C>;
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/type.KeychainAdditions.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/type.KeychainAdditions.html new file mode 100644 index 0000000000..56c75a9c47 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/type.KeychainAdditions.html @@ -0,0 +1 @@ +KeychainAdditions in example_cli - Rust

    Type Definition example_cli::KeychainAdditions

    source ·
    pub type KeychainAdditions<A> = IndexedAdditions<A, DerivationAdditions<Keychain>>;
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/type.KeychainTxGraph.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/type.KeychainTxGraph.html new file mode 100644 index 0000000000..71f5898a9b --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_cli/type.KeychainTxGraph.html @@ -0,0 +1 @@ +KeychainTxGraph in example_cli - Rust

    Type Definition example_cli::KeychainTxGraph

    source ·
    pub type KeychainTxGraph<A> = IndexedTxGraph<A, KeychainTxOutIndex<Keychain>>;
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/all.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/all.html new file mode 100644 index 0000000000..f659ebc262 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/all.html @@ -0,0 +1 @@ +List of all items in this crate

    List of all items

    Structs

    Enums

    Functions

    Type Definitions

    Constants

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/constant.ASSUME_FINAL_DEPTH.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/constant.ASSUME_FINAL_DEPTH.html new file mode 100644 index 0000000000..bcd4b32881 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/constant.ASSUME_FINAL_DEPTH.html @@ -0,0 +1 @@ +ASSUME_FINAL_DEPTH in example_electrum - Rust
    pub(crate) const ASSUME_FINAL_DEPTH: usize = 10;
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/constant.DB_MAGIC.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/constant.DB_MAGIC.html new file mode 100644 index 0000000000..53a8d5b42a --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/constant.DB_MAGIC.html @@ -0,0 +1 @@ +DB_MAGIC in example_electrum - Rust

    Constant example_electrum::DB_MAGIC

    source ·
    pub(crate) const DB_MAGIC: &[u8] = b"bdk_example_electrum";
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/constant.DB_PATH.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/constant.DB_PATH.html new file mode 100644 index 0000000000..e058ba1366 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/constant.DB_PATH.html @@ -0,0 +1 @@ +DB_PATH in example_electrum - Rust

    Constant example_electrum::DB_PATH

    source ·
    pub(crate) const DB_PATH: &str = ".bdk_electrum_example.db";
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/enum.ElectrumCommands.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/enum.ElectrumCommands.html new file mode 100644 index 0000000000..45e1ef9089 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/enum.ElectrumCommands.html @@ -0,0 +1,24 @@ +ElectrumCommands in example_electrum - Rust
    pub(crate) enum ElectrumCommands {
    +    Scan {
    +        stop_gap: usize,
    +        scan_options: ScanOptions,
    +    },
    +    Sync {
    +        unused_spks: bool,
    +        all_spks: bool,
    +        utxos: bool,
    +        unconfirmed: bool,
    +        scan_options: ScanOptions,
    +    },
    +}

    Variants§

    §

    Scan

    Fields

    §stop_gap: usize

    When a gap this large has been found for a keychain, it will stop.

    +
    §scan_options: ScanOptions

    Scans the addresses in the wallet using the electrum API.

    +
    §

    Sync

    Fields

    §unused_spks: bool

    Scan all the unused addresses.

    +
    §all_spks: bool

    Scan every address that you have derived.

    +
    §utxos: bool

    Scan unspent outpoints for spends or changes to confirmation status of residing tx.

    +
    §unconfirmed: bool

    Scan unconfirmed transactions for updates.

    +
    §scan_options: ScanOptions

    Scans particular addresses using the electrum API.

    +

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Assign values from ArgMatches to self.
    Assign values from ArgMatches to self.
    Append to [Command] so it can instantiate Self. Read more
    Append to [Command] so it can update self. Read more
    Test whether Self can parse a specific subcommand

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Calls U::from(self).

    +

    That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

    +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ 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 new file mode 100644 index 0000000000..8c320d89f6 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/fn.main.html @@ -0,0 +1 @@ +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 new file mode 100644 index 0000000000..080a088b8a --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/index.html @@ -0,0 +1 @@ +example_electrum - Rust
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/sidebar-items.js new file mode 100644 index 0000000000..7ed1769574 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":[["ASSUME_FINAL_DEPTH",""],["DB_MAGIC",""],["DB_PATH",""]],"enum":[["ElectrumCommands",""]],"fn":[["main",""]],"struct":[["ScanOptions",""]],"type":[["ChangeSet",""]]}; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/struct.ScanOptions.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/struct.ScanOptions.html new file mode 100644 index 0000000000..f17b2e3572 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/struct.ScanOptions.html @@ -0,0 +1,10 @@ +ScanOptions in example_electrum - Rust
    pub struct ScanOptions {
    +    pub batch_size: usize,
    +}

    Fields§

    §batch_size: usize

    Set batch size for each script_history call to electrum client.

    +

    Trait Implementations§

    Append to [Command] so it can instantiate Self. Read more
    Append to [Command] so it can update self. Read more
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Deprecated, replaced with CommandFactory::command
    Deprecated, replaced with CommandFactory::command_for_update
    Build a [Command] that can instantiate Self. Read more
    Build a [Command] that can update self. Read more
    Formats the value using the given formatter. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Assign values from ArgMatches to self.
    Assign values from ArgMatches to self.
    Parse from std::env::args_os(), exit on error
    Parse from std::env::args_os(), return Err on error.
    Parse from iterator, exit on error
    Parse from iterator, return Err on error.
    Update from iterator, exit on error
    Update from iterator, return Err on error.
    This method tests for self and other values to be equal, and is used +by ==. Read more
    This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    +

    Calls U::from(self).

    +

    That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

    +
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/type.ChangeSet.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/type.ChangeSet.html new file mode 100644 index 0000000000..1e6554466d --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/example_electrum/type.ChangeSet.html @@ -0,0 +1 @@ +ChangeSet in example_electrum - Rust

    Type Definition example_electrum::ChangeSet

    source ·
    pub(crate) type ChangeSet = LocalChangeSet<Keychain, ConfirmationHeightAnchor>;
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/keychain/persist/trait.PersistBackend.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/keychain/persist/trait.PersistBackend.js deleted file mode 100644 index c151b3ba7b..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/keychain/persist/trait.PersistBackend.js +++ /dev/null @@ -1,4 +0,0 @@ -(function() {var implementors = { -"bdk_chain":[], -"bdk_file_store":[["impl<K, P> PersistBackend<K, P> for KeychainStore<K, P>where
        K: Ord + Clone + Debug,
        P: ChainPosition,
        KeychainChangeSet<K, P>: Serialize + DeserializeOwned,
    "]] -};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/persist/trait.PersistBackend.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/persist/trait.PersistBackend.js index 32bdf95d32..16b0094073 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/persist/trait.PersistBackend.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/persist/trait.PersistBackend.js @@ -1,4 +1,4 @@ (function() {var implementors = { "bdk_chain":[], -"bdk_file_store":[["impl<'a, C> PersistBackend<C> for Store<'a, C>where
        C: Default + Append + Serialize + DeserializeOwned,
    "]] +"bdk_file_store":[["impl<'a, C> PersistBackend<C> for Store<'a, C>where
        C: Default + Append + Serialize + DeserializeOwned,
    "]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/sparse_chain/trait.ChainPosition.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/sparse_chain/trait.ChainPosition.js deleted file mode 100644 index 1a8211de1a..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_chain/sparse_chain/trait.ChainPosition.js +++ /dev/null @@ -1,3 +0,0 @@ -(function() {var implementors = { -"bdk_chain":[] -};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_electrum/trait.ElectrumExt.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_electrum/electrum_ext/trait.ElectrumExt.js similarity index 100% rename from docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_electrum/trait.ElectrumExt.js rename to docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/bdk_electrum/electrum_ext/trait.ElectrumExt.js diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.Args.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.Args.js index a45f21567b..5c716ec5c3 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.Args.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.Args.js @@ -1,5 +1,4 @@ (function() {var implementors = { -"keychain_tracker_electrum_example":[["impl Args for ScanOptions"]], -"keychain_tracker_esplora_example":[["impl Args for ScanOptions"]], -"keychain_tracker_example_cli":[["impl<C: Subcommand> Args for Args<C>"]] +"example_cli":[["impl<S: Subcommand> Args for Args<S>"]], +"example_electrum":[["impl Args for ScanOptions"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.CommandFactory.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.CommandFactory.js index 4c44dd3681..4ae7c28aa1 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.CommandFactory.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.CommandFactory.js @@ -1,5 +1,4 @@ (function() {var implementors = { -"keychain_tracker_electrum_example":[["impl CommandFactory for ScanOptions"]], -"keychain_tracker_esplora_example":[["impl CommandFactory for ScanOptions"]], -"keychain_tracker_example_cli":[["impl<C: Subcommand> CommandFactory for Args<C>"]] +"example_cli":[["impl<S: Subcommand> CommandFactory for Args<S>"]], +"example_electrum":[["impl CommandFactory for ScanOptions"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.FromArgMatches.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.FromArgMatches.js index 7d96cca136..ff01a6177b 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.FromArgMatches.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.FromArgMatches.js @@ -1,5 +1,4 @@ (function() {var implementors = { -"keychain_tracker_electrum_example":[["impl FromArgMatches for ElectrumCommands"],["impl FromArgMatches for ScanOptions"]], -"keychain_tracker_esplora_example":[["impl FromArgMatches for EsploraCommands"],["impl FromArgMatches for ScanOptions"]], -"keychain_tracker_example_cli":[["impl<C: Subcommand> FromArgMatches for Args<C>"],["impl<C: Subcommand> FromArgMatches for Commands<C>"],["impl FromArgMatches for AddressCmd"],["impl FromArgMatches for TxOutCmd"]] +"example_cli":[["impl<S: Subcommand> FromArgMatches for Args<S>"],["impl<S: Subcommand> FromArgMatches for Commands<S>"],["impl FromArgMatches for AddressCmd"],["impl FromArgMatches for TxOutCmd"]], +"example_electrum":[["impl FromArgMatches for ElectrumCommands"],["impl FromArgMatches for ScanOptions"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.Parser.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.Parser.js index 0a70855e9f..9dd6fbe07e 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.Parser.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.Parser.js @@ -1,5 +1,4 @@ (function() {var implementors = { -"keychain_tracker_electrum_example":[["impl Parser for ScanOptions"]], -"keychain_tracker_esplora_example":[["impl Parser for ScanOptions"]], -"keychain_tracker_example_cli":[["impl<C: Subcommand> Parser for Args<C>"]] +"example_cli":[["impl<S: Subcommand> Parser for Args<S>"]], +"example_electrum":[["impl Parser for ScanOptions"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.Subcommand.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.Subcommand.js index 736dec0f24..914ad060ae 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.Subcommand.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/clap/derive/trait.Subcommand.js @@ -1,5 +1,4 @@ (function() {var implementors = { -"keychain_tracker_electrum_example":[["impl Subcommand for ElectrumCommands"]], -"keychain_tracker_esplora_example":[["impl Subcommand for EsploraCommands"]], -"keychain_tracker_example_cli":[["impl<C: Subcommand> Subcommand for Commands<C>"],["impl Subcommand for AddressCmd"],["impl Subcommand for TxOutCmd"]] +"example_cli":[["impl<S: Subcommand> Subcommand for Commands<S>"],["impl Subcommand for AddressCmd"],["impl Subcommand for TxOutCmd"]], +"example_electrum":[["impl Subcommand for ElectrumCommands"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/clone/trait.Clone.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/clone/trait.Clone.js index def672e25a..b295ff8be8 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/clone/trait.Clone.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/clone/trait.Clone.js @@ -1,9 +1,9 @@ (function() {var implementors = { "bdk":[["impl Clone for PkOrF"],["impl Clone for SatisfiableItem"],["impl Clone for Satisfaction"],["impl Clone for Policy"],["impl Clone for Condition"],["impl<'a> Clone for BuildSatisfaction<'a>"],["impl Clone for ScriptContextEnum"],["impl<K: Clone, Ctx: ScriptContext> Clone for GeneratedKey<K, Ctx>"],["impl Clone for PrivateKeyGenerateOptions"],["impl Clone for KeychainKind"],["impl Clone for FeeRate"],["impl Clone for LocalUtxo"],["impl Clone for WeightedUtxo"],["impl Clone for Utxo"],["impl Clone for TransactionDetails"],["impl Clone for LargestFirstCoinSelection"],["impl Clone for OldestFirstCoinSelection"],["impl Clone for BranchAndBoundCoinSelection"],["impl Clone for SignerId"],["impl Clone for SignerError"],["impl Clone for SignerContext"],["impl<S: Clone + Sized + Debug + Clone> Clone for SignerWrapper<S>"],["impl Clone for SignerOrdering"],["impl Clone for SignersContainer"],["impl Clone for SignOptions"],["impl Clone for TapLeavesOptions"],["impl Clone for CreateTx"],["impl Clone for BumpFee"],["impl<'a, D, Cs: Clone, Ctx> Clone for TxBuilder<'a, D, Cs, Ctx>"],["impl Clone for TxOrdering"],["impl Clone for ChangeSpendPolicy"]], -"bdk_chain":[["impl<P: Clone> Clone for ChainGraph<P>"],["impl<P: Clone> Clone for ChangeSet<P>"],["impl<P: Clone> Clone for NewError<P>"],["impl<P: Clone> Clone for InsertTxError<P>"],["impl<P: Clone> Clone for UpdateError<P>"],["impl<P: Clone> Clone for UnresolvableConflict<P>"],["impl<I: Clone> Clone for SpkTxOutIndex<I>"],["impl<A: Clone> Clone for ObservedAs<A>"],["impl Clone for TxHeight"],["impl Clone for ConfirmationTime"],["impl Clone for BlockId"],["impl Clone for ConfirmationHeightAnchor"],["impl Clone for ConfirmationTimeAnchor"],["impl<P: Clone> Clone for FullTxOut<P>"],["impl<A: Clone, IA: Clone> Clone for IndexedAdditions<A, IA>"],["impl<K: Clone, P: Clone> Clone for KeychainTracker<K, P>"],["impl<K: Clone> Clone for KeychainTxOutIndex<K>"],["impl<K: Clone> Clone for DerivationAdditions<K>"],["impl<K: Clone, P: Clone> Clone for KeychainScan<K, P>"],["impl<K: Clone, P: Clone> Clone for KeychainChangeSet<K, P>"],["impl Clone for Balance"],["impl Clone for LocalChain"],["impl Clone for UpdateNotConnectedError"],["impl Clone for InsertBlockNotMatchingError"],["impl<P: Clone> Clone for SparseChain<P>"],["impl<P: Clone> Clone for InsertTxError<P>"],["impl Clone for InsertCheckpointError"],["impl<P: Clone> Clone for UpdateError<P>"],["impl<P: Clone> Clone for ChangeSet<P>"],["impl<A: Clone> Clone for TxGraph<A>"],["impl<'a, T: Clone, A: Clone> Clone for TxNode<'a, T, A>"],["impl<'a, T: Clone, A: Clone> Clone for CanonicalTx<'a, T, A>"],["impl<A: Clone> Clone for Additions<A>"],["impl<D: Clone> Clone for SpkIterator<D>"]], +"bdk_chain":[["impl<I: Clone> Clone for SpkTxOutIndex<I>"],["impl<A: Clone> Clone for ChainPosition<A>"],["impl Clone for ConfirmationTime"],["impl Clone for BlockId"],["impl Clone for ConfirmationHeightAnchor"],["impl Clone for ConfirmationTimeAnchor"],["impl<A: Clone> Clone for FullTxOut<A>"],["impl<A: Clone, IA: Clone> Clone for IndexedAdditions<A, IA>"],["impl<K: Clone> Clone for KeychainTxOutIndex<K>"],["impl<K: Clone> Clone for DerivationAdditions<K>"],["impl<K: Clone, A: Clone> Clone for LocalUpdate<K, A>"],["impl<K: Clone, A: Clone> Clone for LocalChangeSet<K, A>"],["impl Clone for Balance"],["impl Clone for LocalChain"],["impl Clone for UpdateNotConnectedError"],["impl Clone for InsertBlockNotMatchingError"],["impl<A: Clone> Clone for TxGraph<A>"],["impl<'a, T: Clone, A: Clone> Clone for TxNode<'a, T, A>"],["impl<'a, T: Clone, A: Clone> Clone for CanonicalTx<'a, T, A>"],["impl<A: Clone> Clone for Additions<A>"],["impl<D: Clone> Clone for SpkIterator<D>"]], "bdk_coin_select":[["impl Clone for WeightedValue"],["impl Clone for CoinSelectorOpt"],["impl<'a> Clone for CoinSelector<'a>"],["impl Clone for SelectionError"],["impl Clone for SelectionConstraint"],["impl Clone for Selection"],["impl Clone for ExcessStrategyKind"],["impl Clone for ExcessStrategy"]], +"bdk_electrum":[["impl<K: Clone, A: Clone> Clone for ElectrumUpdate<K, A>"]], "bdk_tmp_plan":[["impl<Ak: Clone> Clone for Requirements<Ak>"],["impl<Ak: Clone> Clone for RequiredSignatures<Ak>"],["impl Clone for SigningError"],["impl<Ak: Clone> Clone for PlanKey<Ak>"],["impl<AK: Clone> Clone for Plan<AK>"],["impl Clone for SatisfactionMaterial"],["impl<K: Clone> Clone for Assets<K>"]], -"keychain_tracker_electrum_example":[["impl Clone for ElectrumCommands"],["impl Clone for ScanOptions"]], -"keychain_tracker_esplora_example":[["impl Clone for EsploraCommands"],["impl Clone for ScanOptions"]], -"keychain_tracker_example_cli":[["impl<C: Clone + Subcommand> Clone for Commands<C>"],["impl Clone for CoinSelectionAlgo"],["impl Clone for AddressCmd"],["impl Clone for TxOutCmd"],["impl Clone for Keychain"]] +"example_cli":[["impl<S: Clone + Subcommand> Clone for Commands<S>"],["impl Clone for CoinSelectionAlgo"],["impl Clone for AddressCmd"],["impl Clone for TxOutCmd"],["impl Clone for Keychain"]], +"example_electrum":[["impl Clone for ElectrumCommands"],["impl Clone for ScanOptions"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Eq.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Eq.js index 9bb8ceef61..e101bd134a 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Eq.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Eq.js @@ -1,6 +1,6 @@ (function() {var implementors = { "bdk":[["impl Eq for PkOrF"],["impl Eq for SatisfiableItem"],["impl Eq for Satisfaction"],["impl Eq for Policy"],["impl Eq for Condition"],["impl Eq for PolicyError"],["impl Eq for ScriptContextEnum"],["impl Eq for KeychainKind"],["impl Eq for LocalUtxo"],["impl Eq for WeightedUtxo"],["impl Eq for Utxo"],["impl Eq for TransactionDetails"],["impl Eq for SignerId"],["impl Eq for SignerError"],["impl Eq for SignerContext"],["impl Eq for SignerOrdering"],["impl Eq for TapLeavesOptions"],["impl Eq for TxOrdering"],["impl Eq for ChangeSpendPolicy"],["impl Eq for AddressInfo"]], -"bdk_chain":[["impl<A: Eq> Eq for ObservedAs<A>"],["impl Eq for TxHeight"],["impl Eq for ConfirmationTime"],["impl Eq for BlockId"],["impl Eq for ConfirmationHeightAnchor"],["impl Eq for ConfirmationTimeAnchor"],["impl<P: Eq> Eq for FullTxOut<P>"],["impl Eq for Balance"],["impl Eq for LocalChain"],["impl<'a, T: Eq, A: Eq> Eq for TxNode<'a, T, A>"],["impl<'a, T: Eq, A: Eq> Eq for CanonicalTx<'a, T, A>"]], +"bdk_chain":[["impl<A: Eq> Eq for ChainPosition<A>"],["impl Eq for ConfirmationTime"],["impl Eq for BlockId"],["impl Eq for ConfirmationHeightAnchor"],["impl Eq for ConfirmationTimeAnchor"],["impl<A: Eq> Eq for FullTxOut<A>"],["impl Eq for Balance"],["impl Eq for LocalChain"],["impl<'a, T: Eq, A: Eq> Eq for TxNode<'a, T, A>"],["impl<'a, T: Eq, A: Eq> Eq for CanonicalTx<'a, T, A>"]], "bdk_coin_select":[["impl Eq for SelectionConstraint"],["impl Eq for ExcessStrategyKind"]], -"keychain_tracker_example_cli":[["impl Eq for Keychain"]] +"example_cli":[["impl Eq for Keychain"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Ord.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Ord.js index b55e46bb2a..ba12207384 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Ord.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.Ord.js @@ -1,6 +1,6 @@ (function() {var implementors = { "bdk":[["impl Ord for KeychainKind"],["impl Ord for TransactionDetails"],["impl Ord for SignerId"],["impl Ord for SignerOrdering"],["impl Ord for TxOrdering"],["impl Ord for ChangeSpendPolicy"]], -"bdk_chain":[["impl<A: Ord> Ord for ObservedAs<A>"],["impl Ord for TxHeight"],["impl Ord for ConfirmationTime"],["impl Ord for BlockId"],["impl Ord for ConfirmationHeightAnchor"],["impl Ord for ConfirmationTimeAnchor"],["impl<P: Ord> Ord for FullTxOut<P>"],["impl Ord for LocalChain"],["impl<'a, T: Ord, A: Ord> Ord for TxNode<'a, T, A>"],["impl<'a, T: Ord, A: Ord> Ord for CanonicalTx<'a, T, A>"]], +"bdk_chain":[["impl<A: Ord> Ord for ChainPosition<A>"],["impl Ord for ConfirmationTime"],["impl Ord for BlockId"],["impl Ord for ConfirmationHeightAnchor"],["impl Ord for ConfirmationTimeAnchor"],["impl<A: Ord> Ord for FullTxOut<A>"],["impl Ord for LocalChain"],["impl<'a, T: Ord, A: Ord> Ord for TxNode<'a, T, A>"],["impl<'a, T: Ord, A: Ord> Ord for CanonicalTx<'a, T, A>"]], "bdk_coin_select":[["impl Ord for ExcessStrategyKind"]], -"keychain_tracker_example_cli":[["impl Ord for Keychain"]] +"example_cli":[["impl Ord for Keychain"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialEq.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialEq.js index 032c80d7ca..7111cab5c5 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialEq.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialEq.js @@ -1,8 +1,7 @@ (function() {var implementors = { "bdk":[["impl PartialEq<PkOrF> for PkOrF"],["impl PartialEq<SatisfiableItem> for SatisfiableItem"],["impl PartialEq<Satisfaction> for Satisfaction"],["impl PartialEq<Policy> for Policy"],["impl PartialEq<Condition> for Condition"],["impl PartialEq<PolicyError> for PolicyError"],["impl PartialEq<ScriptContextEnum> for ScriptContextEnum"],["impl PartialEq<KeychainKind> for KeychainKind"],["impl PartialEq<FeeRate> for FeeRate"],["impl PartialEq<LocalUtxo> for LocalUtxo"],["impl PartialEq<WeightedUtxo> for WeightedUtxo"],["impl PartialEq<Utxo> for Utxo"],["impl PartialEq<TransactionDetails> for TransactionDetails"],["impl PartialEq<SignerId> for SignerId"],["impl PartialEq<SignerError> for SignerError"],["impl PartialEq<SignerContext> for SignerContext"],["impl PartialEq<SignerOrdering> for SignerOrdering"],["impl PartialEq<TapLeavesOptions> for TapLeavesOptions"],["impl PartialEq<TxOrdering> for TxOrdering"],["impl PartialEq<ChangeSpendPolicy> for ChangeSpendPolicy"],["impl PartialEq<AddressInfo> for AddressInfo"]], -"bdk_chain":[["impl<P: PartialEq> PartialEq<ChainGraph<P>> for ChainGraph<P>"],["impl<P: PartialEq> PartialEq<ChangeSet<P>> for ChangeSet<P>"],["impl<P: PartialEq> PartialEq<NewError<P>> for NewError<P>"],["impl<P: PartialEq> PartialEq<InsertTxError<P>> for InsertTxError<P>"],["impl<P: PartialEq> PartialEq<UpdateError<P>> for UpdateError<P>"],["impl<P: PartialEq> PartialEq<UnresolvableConflict<P>> for UnresolvableConflict<P>"],["impl<A: PartialEq> PartialEq<ObservedAs<A>> for ObservedAs<A>"],["impl PartialEq<TxHeight> for TxHeight"],["impl PartialEq<ConfirmationTime> for ConfirmationTime"],["impl PartialEq<BlockId> for BlockId"],["impl PartialEq<ConfirmationHeightAnchor> for ConfirmationHeightAnchor"],["impl PartialEq<ConfirmationTimeAnchor> for ConfirmationTimeAnchor"],["impl<P: PartialEq> PartialEq<FullTxOut<P>> for FullTxOut<P>"],["impl<A: PartialEq, IA: PartialEq> PartialEq<IndexedAdditions<A, IA>> for IndexedAdditions<A, IA>"],["impl<K: PartialEq> PartialEq<DerivationAdditions<K>> for DerivationAdditions<K>"],["impl<K: PartialEq, P: PartialEq> PartialEq<KeychainScan<K, P>> for KeychainScan<K, P>"],["impl PartialEq<Balance> for Balance"],["impl PartialEq<LocalChain> for LocalChain"],["impl PartialEq<UpdateNotConnectedError> for UpdateNotConnectedError"],["impl PartialEq<InsertBlockNotMatchingError> for InsertBlockNotMatchingError"],["impl<P: PartialEq> PartialEq<SparseChain<P>> for SparseChain<P>"],["impl<P: PartialEq> PartialEq<InsertTxError<P>> for InsertTxError<P>"],["impl PartialEq<InsertCheckpointError> for InsertCheckpointError"],["impl<P: PartialEq> PartialEq<UpdateError<P>> for UpdateError<P>"],["impl<P: PartialEq> PartialEq<ChangeSet<P>> for ChangeSet<P>"],["impl<A: PartialEq> PartialEq<TxGraph<A>> for TxGraph<A>"],["impl<'a, T: PartialEq, A: PartialEq> PartialEq<TxNode<'a, T, A>> for TxNode<'a, T, A>"],["impl<'a, T: PartialEq, A: PartialEq> PartialEq<CanonicalTx<'a, T, A>> for CanonicalTx<'a, T, A>"],["impl<A: PartialEq> PartialEq<Additions<A>> for Additions<A>"]], +"bdk_chain":[["impl<A: PartialEq> PartialEq<ChainPosition<A>> for ChainPosition<A>"],["impl PartialEq<ConfirmationTime> for ConfirmationTime"],["impl PartialEq<BlockId> for BlockId"],["impl PartialEq<ConfirmationHeightAnchor> for ConfirmationHeightAnchor"],["impl PartialEq<ConfirmationTimeAnchor> for ConfirmationTimeAnchor"],["impl<A: PartialEq> PartialEq<FullTxOut<A>> for FullTxOut<A>"],["impl<A: PartialEq, IA: PartialEq> PartialEq<IndexedAdditions<A, IA>> for IndexedAdditions<A, IA>"],["impl<K: PartialEq> PartialEq<DerivationAdditions<K>> for DerivationAdditions<K>"],["impl<K: PartialEq, A: PartialEq> PartialEq<LocalUpdate<K, A>> for LocalUpdate<K, A>"],["impl<K: PartialEq, A: PartialEq> PartialEq<LocalChangeSet<K, A>> for LocalChangeSet<K, A>"],["impl PartialEq<Balance> for Balance"],["impl PartialEq<LocalChain> for LocalChain"],["impl PartialEq<UpdateNotConnectedError> for UpdateNotConnectedError"],["impl PartialEq<InsertBlockNotMatchingError> for InsertBlockNotMatchingError"],["impl<A: PartialEq> PartialEq<TxGraph<A>> for TxGraph<A>"],["impl<'a, T: PartialEq, A: PartialEq> PartialEq<TxNode<'a, T, A>> for TxNode<'a, T, A>"],["impl<'a, T: PartialEq, A: PartialEq> PartialEq<CanonicalTx<'a, T, A>> for CanonicalTx<'a, T, A>"],["impl<A: PartialEq> PartialEq<Additions<A>> for Additions<A>"]], "bdk_coin_select":[["impl PartialEq<SelectionConstraint> for SelectionConstraint"],["impl PartialEq<ExcessStrategyKind> for ExcessStrategyKind"]], -"keychain_tracker_electrum_example":[["impl PartialEq<ScanOptions> for ScanOptions"]], -"keychain_tracker_esplora_example":[["impl PartialEq<ScanOptions> for ScanOptions"]], -"keychain_tracker_example_cli":[["impl PartialEq<Keychain> for Keychain"]] +"example_cli":[["impl PartialEq<Keychain> for Keychain"]], +"example_electrum":[["impl PartialEq<ScanOptions> for ScanOptions"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialOrd.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialOrd.js index 30291c0331..c10faec600 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialOrd.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/cmp/trait.PartialOrd.js @@ -1,6 +1,6 @@ (function() {var implementors = { "bdk":[["impl PartialOrd<Condition> for Condition"],["impl PartialOrd<KeychainKind> for KeychainKind"],["impl PartialOrd<FeeRate> for FeeRate"],["impl PartialOrd<TransactionDetails> for TransactionDetails"],["impl PartialOrd<SignerId> for SignerId"],["impl PartialOrd<SignerOrdering> for SignerOrdering"],["impl PartialOrd<TxOrdering> for TxOrdering"],["impl PartialOrd<ChangeSpendPolicy> for ChangeSpendPolicy"]], -"bdk_chain":[["impl<A: PartialOrd> PartialOrd<ObservedAs<A>> for ObservedAs<A>"],["impl PartialOrd<TxHeight> for TxHeight"],["impl PartialOrd<ConfirmationTime> for ConfirmationTime"],["impl PartialOrd<BlockId> for BlockId"],["impl PartialOrd<ConfirmationHeightAnchor> for ConfirmationHeightAnchor"],["impl PartialOrd<ConfirmationTimeAnchor> for ConfirmationTimeAnchor"],["impl<P: PartialOrd> PartialOrd<FullTxOut<P>> for FullTxOut<P>"],["impl PartialOrd<LocalChain> for LocalChain"],["impl<'a, T: PartialOrd, A: PartialOrd> PartialOrd<TxNode<'a, T, A>> for TxNode<'a, T, A>"],["impl<'a, T: PartialOrd, A: PartialOrd> PartialOrd<CanonicalTx<'a, T, A>> for CanonicalTx<'a, T, A>"]], +"bdk_chain":[["impl<A: PartialOrd> PartialOrd<ChainPosition<A>> for ChainPosition<A>"],["impl PartialOrd<ConfirmationTime> for ConfirmationTime"],["impl PartialOrd<BlockId> for BlockId"],["impl PartialOrd<ConfirmationHeightAnchor> for ConfirmationHeightAnchor"],["impl PartialOrd<ConfirmationTimeAnchor> for ConfirmationTimeAnchor"],["impl<A: PartialOrd> PartialOrd<FullTxOut<A>> for FullTxOut<A>"],["impl PartialOrd<LocalChain> for LocalChain"],["impl<'a, T: PartialOrd, A: PartialOrd> PartialOrd<TxNode<'a, T, A>> for TxNode<'a, T, A>"],["impl<'a, T: PartialOrd, A: PartialOrd> PartialOrd<CanonicalTx<'a, T, A>> for CanonicalTx<'a, T, A>"]], "bdk_coin_select":[["impl PartialOrd<ExcessStrategyKind> for ExcessStrategyKind"]], -"keychain_tracker_example_cli":[["impl PartialOrd<Keychain> for Keychain"]] +"example_cli":[["impl PartialOrd<Keychain> for Keychain"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.AsRef.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.AsRef.js index bb39e80e78..e501f90875 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.AsRef.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.AsRef.js @@ -1,5 +1,4 @@ (function() {var implementors = { -"bdk":[["impl AsRef<[u8]> for KeychainKind"],["impl<D> AsRef<TxGraph<()>> for Wallet<D>"],["impl<D> AsRef<ChainGraph<ConfirmationTime>> for Wallet<D>"]], -"bdk_chain":[["impl<P> AsRef<SparseChain<P>> for ChainGraph<P>"],["impl<P> AsRef<TxGraph<()>> for ChainGraph<P>"],["impl<P> AsRef<ChainGraph<P>> for ChainGraph<P>"],["impl<K, P> AsRef<SparseChain<P>> for KeychainTracker<K, P>"],["impl<K, P> AsRef<TxGraph<()>> for KeychainTracker<K, P>"],["impl<K, P> AsRef<ChainGraph<P>> for KeychainTracker<K, P>"],["impl<K> AsRef<BTreeMap<K, u32, Global>> for DerivationAdditions<K>"],["impl<K, P> AsRef<TxGraph<()>> for KeychainScan<K, P>"],["impl AsRef<BTreeMap<u32, BlockHash, Global>> for LocalChain"],["impl<P> AsRef<SparseChain<P>> for SparseChain<P>"],["impl<A> AsRef<TxGraph<A>> for TxGraph<A>"]], -"bdk_electrum":[["impl<K, P> AsRef<SparseChain<P>> for ElectrumUpdate<K, P>"]] +"bdk":[["impl AsRef<[u8]> for KeychainKind"],["impl<D> AsRef<TxGraph<ConfirmationTimeAnchor>> for Wallet<D>"]], +"bdk_chain":[["impl<K> AsRef<BTreeMap<K, u32, Global>> for DerivationAdditions<K>"],["impl AsRef<BTreeMap<u32, BlockHash, Global>> for LocalChain"],["impl<A> AsRef<TxGraph<A>> for TxGraph<A>"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.From.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.From.js index 95e0888e28..c03c4784e6 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.From.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/convert/trait.From.js @@ -1,6 +1,6 @@ (function() {var implementors = { "bdk":[["impl From<Error> for Error"],["impl From<PolicyError> for Error"],["impl From<SignerError> for Error"],["impl From<KeyError> for Error"],["impl From<Error> for Error"],["impl From<Error> for Error"],["impl From<Error> for Error"],["impl From<KeyError> for Error"],["impl From<Error> for Error"],["impl From<Error> for Error"],["impl From<Error> for Error"],["impl From<Error> for Error"],["impl From<Error> for Error"],["impl From<PolicyError> for Error"],["impl From<bool> for Satisfaction"],["impl From<SatisfiableItem> for Policy"],["impl<Ctx: ScriptContext> From<ExtendedPubKey> for ExtendedKey<Ctx>"],["impl<Ctx: ScriptContext> From<ExtendedPrivKey> for ExtendedKey<Ctx>"],["impl From<Error> for KeyError"],["impl From<Error> for KeyError"],["impl From<Hash> for SignerId"],["impl From<Fingerprint> for SignerId"],["impl From<Error> for SignerError"]], -"bdk_chain":[["impl<P> From<InsertTxError<P>> for InsertTxError<P>"],["impl<P> From<UpdateError<P>> for UpdateError<P>"],["impl<P> From<UnresolvableConflict<P>> for UpdateError<P>"],["impl<P> From<UnresolvableConflict<P>> for InsertTxError<P>"],["impl From<Option<u32>> for TxHeight"],["impl From<TxHeight> for Option<u32>"],["impl From<(u32, BlockHash)> for BlockId"],["impl From<BlockId> for (u32, BlockHash)"],["impl From<(&u32, &BlockHash)> for BlockId"],["impl<K, P> From<ChainGraph<P>> for KeychainScan<K, P>"],["impl<K, P> From<ChangeSet<P>> for KeychainChangeSet<K, P>"],["impl<K, P> From<DerivationAdditions<K>> for KeychainChangeSet<K, P>"],["impl From<LocalChain> for BTreeMap<u32, BlockHash>"],["impl From<BTreeMap<u32, BlockHash, Global>> for LocalChain"]], +"bdk_chain":[["impl From<ChainPosition<ConfirmationTimeAnchor>> for ConfirmationTime"],["impl From<(u32, BlockHash)> for BlockId"],["impl From<BlockId> for (u32, BlockHash)"],["impl From<(&u32, &BlockHash)> for BlockId"],["impl<A, IA: Default> From<Additions<A>> for IndexedAdditions<A, IA>"],["impl<A, K> From<DerivationAdditions<K>> for IndexedAdditions<A, DerivationAdditions<K>>"],["impl<K, A> From<BTreeMap<u32, Option<BlockHash>, Global>> for LocalChangeSet<K, A>"],["impl<K, A> From<IndexedAdditions<A, DerivationAdditions<K>>> for LocalChangeSet<K, A>"],["impl From<LocalChain> for BTreeMap<u32, BlockHash>"],["impl From<BTreeMap<u32, BlockHash, Global>> for LocalChain"]], "bdk_coin_select":[["impl From<usize> for BnbLimit"],["impl From<Duration> for BnbLimit"]], "bdk_file_store":[["impl From<Error> for IterError"],["impl<'a> From<Error> for FileError<'a>"]], "bdk_tmp_plan":[["impl From<Error> for SigningError"],["impl From<Error> for SigningError"]] diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/default/trait.Default.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/default/trait.Default.js index fe1699c963..a87bb1fb23 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/default/trait.Default.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/default/trait.Default.js @@ -1,7 +1,7 @@ (function() {var implementors = { "bdk":[["impl Default for Condition"],["impl Default for PrivateKeyGenerateOptions"],["impl Default for FeeRate"],["impl Default for LargestFirstCoinSelection"],["impl Default for OldestFirstCoinSelection"],["impl Default for BranchAndBoundCoinSelection"],["impl Default for SignerOrdering"],["impl Default for SignersContainer"],["impl Default for TapLeavesOptions"],["impl Default for SignOptions"],["impl Default for CreateTx"],["impl Default for BumpFee"],["impl Default for TxOrdering"],["impl Default for ChangeSpendPolicy"]], -"bdk_chain":[["impl<P> Default for ChainGraph<P>"],["impl<P> Default for ChangeSet<P>"],["impl<I> Default for SpkTxOutIndex<I>"],["impl Default for TxHeight"],["impl Default for BlockId"],["impl Default for ConfirmationHeightAnchor"],["impl Default for ConfirmationTimeAnchor"],["impl<A, I: Default> Default for IndexedTxGraph<A, I>"],["impl<A, IA: Default> Default for IndexedAdditions<A, IA>"],["impl<K, P> Default for KeychainTracker<K, P>"],["impl<K> Default for KeychainTxOutIndex<K>"],["impl<K> Default for DerivationAdditions<K>"],["impl<K, P> Default for KeychainScan<K, P>"],["impl<K, P> Default for KeychainChangeSet<K, P>"],["impl Default for Balance"],["impl Default for LocalChain"],["impl<P> Default for SparseChain<P>"],["impl<I> Default for ChangeSet<I>"],["impl<A> Default for TxGraph<A>"],["impl<A> Default for Additions<A>"]], -"bdk_electrum":[["impl<K, P> Default for ElectrumUpdate<K, P>"]], +"bdk_chain":[["impl<I> Default for SpkTxOutIndex<I>"],["impl Default for BlockId"],["impl Default for ConfirmationHeightAnchor"],["impl Default for ConfirmationTimeAnchor"],["impl<A, I: Default> Default for IndexedTxGraph<A, I>"],["impl<A, IA: Default> Default for IndexedAdditions<A, IA>"],["impl<K> Default for KeychainTxOutIndex<K>"],["impl<K> Default for DerivationAdditions<K>"],["impl<K, A> Default for LocalUpdate<K, A>"],["impl<K, A> Default for LocalChangeSet<K, A>"],["impl Default for Balance"],["impl Default for LocalChain"],["impl<A> Default for TxGraph<A>"],["impl<A> Default for Additions<A>"]], +"bdk_electrum":[["impl<K, A> Default for ElectrumUpdate<K, A>"]], "bdk_tmp_plan":[["impl<Ak> Default for RequiredSignatures<Ak>"],["impl<Ak> Default for Requirements<Ak>"],["impl Default for SatisfactionMaterial"],["impl<K> Default for Assets<K>"]], -"keychain_tracker_example_cli":[["impl Default for CoinSelectionAlgo"]] +"example_cli":[["impl Default for CoinSelectionAlgo"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/error/trait.Error.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/error/trait.Error.js index 97d7cbd049..2b7594177e 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/error/trait.Error.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/error/trait.Error.js @@ -1,6 +1,6 @@ (function() {var implementors = { "bdk":[["impl Error for Error"],["impl Error for Error"],["impl Error for PolicyError"],["impl Error for KeyError"],["impl Error for SignerError"],["impl<P: Display + Debug> Error for NewError<P>"]], -"bdk_chain":[["impl<P: Debug> Error for NewError<P>"],["impl<P: Debug> Error for InsertTxError<P>"],["impl<P: Debug> Error for UpdateError<P>"],["impl<P: Debug> Error for UnresolvableConflict<P>"],["impl Error for UpdateNotConnectedError"],["impl Error for InsertBlockNotMatchingError"],["impl<P: Debug> Error for InsertTxError<P>"],["impl Error for InsertCheckpointError"],["impl<P: Debug> Error for UpdateError<P>"]], +"bdk_chain":[["impl Error for UpdateNotConnectedError"],["impl Error for InsertBlockNotMatchingError"]], "bdk_coin_select":[["impl Error for SelectionError"]], "bdk_file_store":[["impl Error for IterError"],["impl<'a> Error for FileError<'a>"]], "bdk_tmp_plan":[["impl Error for SigningError"]] diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Debug.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Debug.js index 7ce8efe914..3aec85602c 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Debug.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Debug.js @@ -1,10 +1,10 @@ (function() {var implementors = { -"bdk":[["impl Debug for Error"],["impl Debug for Error"],["impl Debug for PkOrF"],["impl Debug for SatisfiableItem"],["impl Debug for Satisfaction"],["impl Debug for Policy"],["impl Debug for Condition"],["impl Debug for PolicyError"],["impl<'a> Debug for BuildSatisfaction<'a>"],["impl<Ctx: Debug + ScriptContext> Debug for DescriptorKey<Ctx>"],["impl Debug for ScriptContextEnum"],["impl Debug for PrivateKeyGenerateOptions"],["impl Debug for KeyError"],["impl Debug for KeychainKind"],["impl Debug for FeeRate"],["impl Debug for LocalUtxo"],["impl Debug for WeightedUtxo"],["impl Debug for Utxo"],["impl Debug for TransactionDetails"],["impl Debug for Excess"],["impl Debug for CoinSelectionResult"],["impl Debug for LargestFirstCoinSelection"],["impl Debug for OldestFirstCoinSelection"],["impl Debug for BranchAndBoundCoinSelection"],["impl Debug for FullyNodedExport"],["impl Debug for SignerId"],["impl Debug for SignerError"],["impl Debug for SignerContext"],["impl<S: Debug + Sized + Debug + Clone> Debug for SignerWrapper<S>"],["impl Debug for SignerOrdering"],["impl Debug for SignersContainer"],["impl Debug for SignOptions"],["impl Debug for TapLeavesOptions"],["impl Debug for CreateTx"],["impl Debug for BumpFee"],["impl<'a, D: Debug, Cs: Debug, Ctx: Debug> Debug for TxBuilder<'a, D, Cs, Ctx>"],["impl Debug for TxOrdering"],["impl Debug for ChangeSpendPolicy"],["impl<D: Debug> Debug for Wallet<D>"],["impl Debug for AddressIndex"],["impl Debug for AddressInfo"],["impl<P: Debug> Debug for NewError<P>"]], -"bdk_chain":[["impl<P: Debug> Debug for ChainGraph<P>"],["impl<P: Debug> Debug for ChangeSet<P>"],["impl<P: Debug> Debug for NewError<P>"],["impl<P: Debug> Debug for InsertTxError<P>"],["impl<P: Debug> Debug for UpdateError<P>"],["impl<P: Debug> Debug for UnresolvableConflict<P>"],["impl<I: Debug> Debug for SpkTxOutIndex<I>"],["impl<A: Debug> Debug for ObservedAs<A>"],["impl Debug for TxHeight"],["impl Debug for ConfirmationTime"],["impl Debug for BlockId"],["impl Debug for ConfirmationHeightAnchor"],["impl Debug for ConfirmationTimeAnchor"],["impl<P: Debug> Debug for FullTxOut<P>"],["impl<A: Debug, I: Debug> Debug for IndexedTxGraph<A, I>"],["impl<A: Debug, IA: Debug> Debug for IndexedAdditions<A, IA>"],["impl<K: Debug, P: Debug, B: Debug> Debug for Persist<K, P, B>"],["impl<K: Debug, P: Debug> Debug for KeychainTracker<K, P>"],["impl<K: Debug> Debug for KeychainTxOutIndex<K>"],["impl<K: Debug> Debug for DerivationAdditions<K>"],["impl<K: Debug, P: Debug> Debug for KeychainScan<K, P>"],["impl<K: Debug, P: Debug> Debug for KeychainChangeSet<K, P>"],["impl Debug for Balance"],["impl Debug for LocalChain"],["impl Debug for UpdateNotConnectedError"],["impl Debug for InsertBlockNotMatchingError"],["impl<P: Debug> Debug for SparseChain<P>"],["impl<P: Debug> Debug for InsertTxError<P>"],["impl Debug for InsertCheckpointError"],["impl<P: Debug> Debug for UpdateError<P>"],["impl<P: Debug> Debug for ChangeSet<P>"],["impl<A: Debug> Debug for TxGraph<A>"],["impl<'a, T: Debug, A: Debug> Debug for TxNode<'a, T, A>"],["impl<'a, T: Debug, A: Debug> Debug for CanonicalTx<'a, T, A>"],["impl<A: Debug> Debug for Additions<A>"],["impl<B: Debug, C: Debug> Debug for Persist<B, C>"]], +"bdk":[["impl Debug for Error"],["impl Debug for Error"],["impl Debug for PkOrF"],["impl Debug for SatisfiableItem"],["impl Debug for Satisfaction"],["impl Debug for Policy"],["impl Debug for Condition"],["impl Debug for PolicyError"],["impl<'a> Debug for BuildSatisfaction<'a>"],["impl<Ctx: Debug + ScriptContext> Debug for DescriptorKey<Ctx>"],["impl Debug for ScriptContextEnum"],["impl Debug for PrivateKeyGenerateOptions"],["impl Debug for KeyError"],["impl Debug for KeychainKind"],["impl Debug for FeeRate"],["impl Debug for LocalUtxo"],["impl Debug for WeightedUtxo"],["impl Debug for Utxo"],["impl Debug for TransactionDetails"],["impl Debug for Excess"],["impl Debug for CoinSelectionResult"],["impl Debug for LargestFirstCoinSelection"],["impl Debug for OldestFirstCoinSelection"],["impl Debug for BranchAndBoundCoinSelection"],["impl Debug for FullyNodedExport"],["impl Debug for SignerId"],["impl Debug for SignerError"],["impl Debug for SignerContext"],["impl<S: Debug + Sized + Debug + Clone> Debug for SignerWrapper<S>"],["impl Debug for SignerOrdering"],["impl Debug for SignersContainer"],["impl Debug for SignOptions"],["impl Debug for TapLeavesOptions"],["impl Debug for CreateTx"],["impl Debug for BumpFee"],["impl<'a, D: Debug, Cs: Debug, Ctx: Debug> Debug for TxBuilder<'a, D, Cs, Ctx>"],["impl Debug for TxOrdering"],["impl Debug for ChangeSpendPolicy"],["impl<D: Debug> Debug for Wallet<D>"],["impl Debug for AddressIndex"],["impl Debug for AddressInfo"],["impl<P: Debug> Debug for NewError<P>"],["impl Debug for InsertTxError"]], +"bdk_chain":[["impl<I: Debug> Debug for SpkTxOutIndex<I>"],["impl<A: Debug> Debug for ChainPosition<A>"],["impl Debug for ConfirmationTime"],["impl Debug for BlockId"],["impl Debug for ConfirmationHeightAnchor"],["impl Debug for ConfirmationTimeAnchor"],["impl<A: Debug> Debug for FullTxOut<A>"],["impl<A: Debug, I: Debug> Debug for IndexedTxGraph<A, I>"],["impl<A: Debug, IA: Debug> Debug for IndexedAdditions<A, IA>"],["impl<K: Debug> Debug for KeychainTxOutIndex<K>"],["impl<K: Debug> Debug for DerivationAdditions<K>"],["impl<K: Debug, A: Debug> Debug for LocalUpdate<K, A>"],["impl<K: Debug, A: Debug> Debug for LocalChangeSet<K, A>"],["impl Debug for Balance"],["impl Debug for LocalChain"],["impl Debug for UpdateNotConnectedError"],["impl Debug for InsertBlockNotMatchingError"],["impl<A: Debug> Debug for TxGraph<A>"],["impl<'a, T: Debug, A: Debug> Debug for TxNode<'a, T, A>"],["impl<'a, T: Debug, A: Debug> Debug for CanonicalTx<'a, T, A>"],["impl<A: Debug> Debug for Additions<A>"],["impl<B: Debug, C: Debug> Debug for Persist<B, C>"]], "bdk_coin_select":[["impl Debug for WeightedValue"],["impl Debug for CoinSelectorOpt"],["impl<'a> Debug for CoinSelector<'a>"],["impl Debug for SelectionError"],["impl Debug for SelectionConstraint"],["impl Debug for Selection"],["impl Debug for ExcessStrategyKind"],["impl Debug for ExcessStrategy"]], -"bdk_file_store":[["impl Debug for IterError"],["impl<K: Debug, P: Debug> Debug for KeychainStore<K, P>"],["impl<'a, C: Debug> Debug for Store<'a, C>"],["impl<'a> Debug for FileError<'a>"]], +"bdk_electrum":[["impl<K: Debug, A: Debug> Debug for ElectrumUpdate<K, A>"]], +"bdk_file_store":[["impl Debug for IterError"],["impl<'a, C: Debug> Debug for Store<'a, C>"],["impl<'a> Debug for FileError<'a>"]], "bdk_tmp_plan":[["impl<Ak: Debug> Debug for Requirements<Ak>"],["impl<Ak: Debug> Debug for RequiredSignatures<Ak>"],["impl Debug for SigningError"],["impl<Ak: Debug> Debug for PlanKey<Ak>"],["impl<AK: Debug> Debug for Plan<AK>"],["impl Debug for SatisfactionMaterial"],["impl<K: Debug> Debug for Assets<K>"]], -"keychain_tracker_electrum_example":[["impl Debug for ElectrumCommands"],["impl Debug for ScanOptions"]], -"keychain_tracker_esplora_example":[["impl Debug for EsploraCommands"],["impl Debug for ScanOptions"]], -"keychain_tracker_example_cli":[["impl<C: Debug + Subcommand> Debug for Commands<C>"],["impl Debug for CoinSelectionAlgo"],["impl Debug for AddressCmd"],["impl Debug for TxOutCmd"],["impl Debug for Keychain"]] +"example_cli":[["impl<S: Debug + Subcommand> Debug for Commands<S>"],["impl Debug for CoinSelectionAlgo"],["impl Debug for AddressCmd"],["impl Debug for TxOutCmd"],["impl Debug for Keychain"]], +"example_electrum":[["impl Debug for ElectrumCommands"],["impl Debug for ScanOptions"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Display.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Display.js index 2e30fc46a9..36c69ff449 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Display.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/fmt/trait.Display.js @@ -1,8 +1,8 @@ (function() {var implementors = { "bdk":[["impl Display for Error"],["impl Display for Error"],["impl Display for PolicyError"],["impl Display for KeyError"],["impl Display for SignerError"],["impl Display for AddressInfo"],["impl<P> Display for NewError<P>where
        P: Display,
    "]], -"bdk_chain":[["impl<P: Debug> Display for NewError<P>"],["impl<P: Debug> Display for InsertTxError<P>"],["impl<P: Debug> Display for UpdateError<P>"],["impl<P: Debug> Display for UnresolvableConflict<P>"],["impl Display for TxHeight"],["impl Display for Balance"],["impl Display for UpdateNotConnectedError"],["impl Display for InsertBlockNotMatchingError"],["impl<P: Debug> Display for InsertTxError<P>"],["impl Display for InsertCheckpointError"],["impl<P: Debug> Display for UpdateError<P>"]], +"bdk_chain":[["impl Display for Balance"],["impl Display for UpdateNotConnectedError"],["impl Display for InsertBlockNotMatchingError"]], "bdk_coin_select":[["impl Display for SelectionError"],["impl Display for SelectionConstraint"],["impl Display for ExcessStrategyKind"]], "bdk_file_store":[["impl Display for IterError"],["impl<'a> Display for FileError<'a>"]], "bdk_tmp_plan":[["impl Display for SigningError"]], -"keychain_tracker_example_cli":[["impl Display for CoinSelectionAlgo"],["impl Display for Keychain"]] +"example_cli":[["impl Display for CoinSelectionAlgo"],["impl Display for Keychain"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/hash/trait.Hash.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/hash/trait.Hash.js index f31f0cf42a..2095916930 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/hash/trait.Hash.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/hash/trait.Hash.js @@ -1,5 +1,5 @@ (function() {var implementors = { "bdk":[["impl Hash for PkOrF"],["impl Hash for Condition"],["impl Hash for KeychainKind"],["impl Hash for LocalUtxo"],["impl Hash for SignerId"],["impl Hash for TxOrdering"],["impl Hash for ChangeSpendPolicy"]], -"bdk_chain":[["impl<A: Hash> Hash for ObservedAs<A>"],["impl Hash for TxHeight"],["impl Hash for ConfirmationTime"],["impl Hash for BlockId"],["impl Hash for ConfirmationHeightAnchor"],["impl Hash for ConfirmationTimeAnchor"]], +"bdk_chain":[["impl<A: Hash> Hash for ChainPosition<A>"],["impl Hash for ConfirmationTime"],["impl Hash for BlockId"],["impl Hash for ConfirmationHeightAnchor"],["impl Hash for ConfirmationTimeAnchor"]], "bdk_coin_select":[["impl Hash for ExcessStrategyKind"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/iter/traits/iterator/trait.Iterator.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/iter/traits/iterator/trait.Iterator.js index be46f0058d..6f7398d809 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/iter/traits/iterator/trait.Iterator.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/iter/traits/iterator/trait.Iterator.js @@ -1,5 +1,5 @@ (function() {var implementors = { "bdk_chain":[["impl<'g, A, F, O> Iterator for TxDescendants<'g, A, F>where
        F: FnMut(usize, Txid) -> Option<O>,
    "],["impl<D> Iterator for SpkIterator<D>where
        D: Borrow<Descriptor<DescriptorPublicKey>>,
    "]], "bdk_coin_select":[["impl<'c, 'f, S: Ord + Copy + Display> Iterator for BnbIter<'c, 'f, S>"]], -"bdk_file_store":[["impl<'t, T> Iterator for EntryIter<'t, T>where
        T: DeserializeOwned,
    "]] +"bdk_file_store":[["impl<'t, T> Iterator for EntryIter<'t, T>where
        T: DeserializeOwned,
    "]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Copy.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Copy.js index a7a958afe7..35d72c09aa 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Copy.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Copy.js @@ -1,6 +1,6 @@ (function() {var implementors = { "bdk":[["impl Copy for Condition"],["impl<'a> Copy for BuildSatisfaction<'a>"],["impl Copy for ScriptContextEnum"],["impl Copy for PrivateKeyGenerateOptions"],["impl Copy for KeychainKind"],["impl Copy for FeeRate"],["impl Copy for LargestFirstCoinSelection"],["impl Copy for OldestFirstCoinSelection"],["impl Copy for SignerContext"],["impl Copy for TxOrdering"],["impl Copy for ChangeSpendPolicy"]], -"bdk_chain":[["impl<A: Copy> Copy for ObservedAs<A>"],["impl Copy for TxHeight"],["impl Copy for ConfirmationTime"],["impl Copy for BlockId"],["impl Copy for ConfirmationHeightAnchor"],["impl Copy for ConfirmationTimeAnchor"]], +"bdk_chain":[["impl<A: Copy> Copy for ChainPosition<A>"],["impl Copy for ConfirmationTime"],["impl Copy for BlockId"],["impl Copy for ConfirmationHeightAnchor"],["impl Copy for ConfirmationTimeAnchor"]], "bdk_coin_select":[["impl Copy for WeightedValue"],["impl Copy for CoinSelectorOpt"],["impl Copy for SelectionConstraint"],["impl Copy for ExcessStrategyKind"],["impl Copy for ExcessStrategy"]], -"keychain_tracker_example_cli":[["impl Copy for Keychain"]] +"example_cli":[["impl Copy for Keychain"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Freeze.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Freeze.js index a335218f51..4eb0f36d1a 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Freeze.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Freeze.js @@ -1,11 +1,10 @@ (function() {var implementors = { -"bdk":[["impl Freeze for Error",1,["bdk::error::Error"]],["impl Freeze for Error",1,["bdk::descriptor::error::Error"]],["impl Freeze for PkOrF",1,["bdk::descriptor::policy::PkOrF"]],["impl Freeze for SatisfiableItem",1,["bdk::descriptor::policy::SatisfiableItem"]],["impl Freeze for Satisfaction",1,["bdk::descriptor::policy::Satisfaction"]],["impl Freeze for Policy",1,["bdk::descriptor::policy::Policy"]],["impl Freeze for Condition",1,["bdk::descriptor::policy::Condition"]],["impl Freeze for PolicyError",1,["bdk::descriptor::policy::PolicyError"]],["impl<'a> Freeze for BuildSatisfaction<'a>",1,["bdk::descriptor::policy::BuildSatisfaction"]],["impl<K> Freeze for P2Pkh<K>where
        K: Freeze,
    ",1,["bdk::descriptor::template::P2Pkh"]],["impl<K> Freeze for P2Wpkh_P2Sh<K>where
        K: Freeze,
    ",1,["bdk::descriptor::template::P2Wpkh_P2Sh"]],["impl<K> Freeze for P2Wpkh<K>where
        K: Freeze,
    ",1,["bdk::descriptor::template::P2Wpkh"]],["impl<K> Freeze for Bip44<K>where
        K: Freeze,
    ",1,["bdk::descriptor::template::Bip44"]],["impl<K> Freeze for Bip44Public<K>where
        K: Freeze,
    ",1,["bdk::descriptor::template::Bip44Public"]],["impl<K> Freeze for Bip49<K>where
        K: Freeze,
    ",1,["bdk::descriptor::template::Bip49"]],["impl<K> Freeze for Bip49Public<K>where
        K: Freeze,
    ",1,["bdk::descriptor::template::Bip49Public"]],["impl<K> Freeze for Bip84<K>where
        K: Freeze,
    ",1,["bdk::descriptor::template::Bip84"]],["impl<K> Freeze for Bip84Public<K>where
        K: Freeze,
    ",1,["bdk::descriptor::template::Bip84Public"]],["impl<Ctx> Freeze for DescriptorKey<Ctx>",1,["bdk::keys::DescriptorKey"]],["impl Freeze for ScriptContextEnum",1,["bdk::keys::ScriptContextEnum"]],["impl<Ctx> Freeze for ExtendedKey<Ctx>",1,["bdk::keys::ExtendedKey"]],["impl<K, Ctx> Freeze for GeneratedKey<K, Ctx>where
        K: Freeze,
    ",1,["bdk::keys::GeneratedKey"]],["impl Freeze for PrivateKeyGenerateOptions",1,["bdk::keys::PrivateKeyGenerateOptions"]],["impl Freeze for KeyError",1,["bdk::keys::KeyError"]],["impl Freeze for KeychainKind",1,["bdk::types::KeychainKind"]],["impl Freeze for FeeRate",1,["bdk::types::FeeRate"]],["impl Freeze for LocalUtxo",1,["bdk::types::LocalUtxo"]],["impl Freeze for WeightedUtxo",1,["bdk::types::WeightedUtxo"]],["impl Freeze for Utxo",1,["bdk::types::Utxo"]],["impl Freeze for TransactionDetails",1,["bdk::types::TransactionDetails"]],["impl Freeze for Excess",1,["bdk::wallet::coin_selection::Excess"]],["impl Freeze for CoinSelectionResult",1,["bdk::wallet::coin_selection::CoinSelectionResult"]],["impl Freeze for LargestFirstCoinSelection",1,["bdk::wallet::coin_selection::LargestFirstCoinSelection"]],["impl Freeze for OldestFirstCoinSelection",1,["bdk::wallet::coin_selection::OldestFirstCoinSelection"]],["impl Freeze for BranchAndBoundCoinSelection",1,["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]],["impl Freeze for FullyNodedExport",1,["bdk::wallet::export::FullyNodedExport"]],["impl Freeze for SignerId",1,["bdk::wallet::signer::SignerId"]],["impl Freeze for SignerError",1,["bdk::wallet::signer::SignerError"]],["impl Freeze for SignerContext",1,["bdk::wallet::signer::SignerContext"]],["impl<S> Freeze for SignerWrapper<S>where
        S: Freeze,
    ",1,["bdk::wallet::signer::SignerWrapper"]],["impl Freeze for SignerOrdering",1,["bdk::wallet::signer::SignerOrdering"]],["impl Freeze for SignersContainer",1,["bdk::wallet::signer::SignersContainer"]],["impl Freeze for SignOptions",1,["bdk::wallet::signer::SignOptions"]],["impl Freeze for TapLeavesOptions",1,["bdk::wallet::signer::TapLeavesOptions"]],["impl Freeze for CreateTx",1,["bdk::wallet::tx_builder::CreateTx"]],["impl Freeze for BumpFee",1,["bdk::wallet::tx_builder::BumpFee"]],["impl<'a, D, Cs, Ctx> Freeze for TxBuilder<'a, D, Cs, Ctx>where
        Cs: Freeze,
    ",1,["bdk::wallet::tx_builder::TxBuilder"]],["impl Freeze for TxOrdering",1,["bdk::wallet::tx_builder::TxOrdering"]],["impl Freeze for ChangeSpendPolicy",1,["bdk::wallet::tx_builder::ChangeSpendPolicy"]],["impl<D> Freeze for Wallet<D>where
        D: Freeze,
    ",1,["bdk::wallet::Wallet"]],["impl Freeze for AddressIndex",1,["bdk::wallet::AddressIndex"]],["impl Freeze for AddressInfo",1,["bdk::wallet::AddressInfo"]],["impl<P> Freeze for NewError<P>where
        P: Freeze,
    ",1,["bdk::wallet::NewError"]]], -"bdk_chain":[["impl<P> Freeze for ChainGraph<P>",1,["bdk_chain::chain_graph::ChainGraph"]],["impl<P> Freeze for ChangeSet<P>",1,["bdk_chain::chain_graph::ChangeSet"]],["impl<P> Freeze for NewError<P>where
        P: Freeze,
    ",1,["bdk_chain::chain_graph::NewError"]],["impl<P> Freeze for InsertTxError<P>where
        P: Freeze,
    ",1,["bdk_chain::chain_graph::InsertTxError"]],["impl<P> Freeze for UpdateError<P>where
        P: Freeze,
    ",1,["bdk_chain::chain_graph::UpdateError"]],["impl<P> Freeze for UnresolvableConflict<P>where
        P: Freeze,
    ",1,["bdk_chain::chain_graph::UnresolvableConflict"]],["impl<I> Freeze for SpkTxOutIndex<I>",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<A> Freeze for ObservedAs<A>where
        A: Freeze,
    ",1,["bdk_chain::chain_data::ObservedAs"]],["impl Freeze for TxHeight",1,["bdk_chain::chain_data::TxHeight"]],["impl Freeze for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Freeze for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl Freeze for ConfirmationHeightAnchor",1,["bdk_chain::chain_data::ConfirmationHeightAnchor"]],["impl Freeze for ConfirmationTimeAnchor",1,["bdk_chain::chain_data::ConfirmationTimeAnchor"]],["impl<P> Freeze for FullTxOut<P>where
        P: Freeze,
    ",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A, I> Freeze for IndexedTxGraph<A, I>where
        I: Freeze,
    ",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> Freeze for IndexedAdditions<A, IA>where
        IA: Freeze,
    ",1,["bdk_chain::indexed_tx_graph::IndexedAdditions"]],["impl<K, P, B> Freeze for Persist<K, P, B>where
        B: Freeze,
    ",1,["bdk_chain::keychain::persist::Persist"]],["impl<K, P> Freeze for KeychainTracker<K, P>",1,["bdk_chain::keychain::tracker::KeychainTracker"]],["impl<K> Freeze for KeychainTxOutIndex<K>",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> Freeze for DerivationAdditions<K>",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, P> Freeze for KeychainScan<K, P>",1,["bdk_chain::keychain::KeychainScan"]],["impl<K, P> Freeze for KeychainChangeSet<K, P>",1,["bdk_chain::keychain::KeychainChangeSet"]],["impl Freeze for Balance",1,["bdk_chain::keychain::Balance"]],["impl Freeze for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl Freeze for UpdateNotConnectedError",1,["bdk_chain::local_chain::UpdateNotConnectedError"]],["impl Freeze for InsertBlockNotMatchingError",1,["bdk_chain::local_chain::InsertBlockNotMatchingError"]],["impl<P> Freeze for SparseChain<P>",1,["bdk_chain::sparse_chain::SparseChain"]],["impl<P> Freeze for InsertTxError<P>where
        P: Freeze,
    ",1,["bdk_chain::sparse_chain::InsertTxError"]],["impl Freeze for InsertCheckpointError",1,["bdk_chain::sparse_chain::InsertCheckpointError"]],["impl<P> Freeze for UpdateError<P>where
        P: Freeze,
    ",1,["bdk_chain::sparse_chain::UpdateError"]],["impl<P> Freeze for ChangeSet<P>",1,["bdk_chain::sparse_chain::ChangeSet"]],["impl<A> Freeze for TxGraph<A>",1,["bdk_chain::tx_graph::TxGraph"]],["impl<'a, T, A> Freeze for TxNode<'a, T, A>",1,["bdk_chain::tx_graph::TxNode"]],["impl<'a, T, A> Freeze for CanonicalTx<'a, T, A>",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<A> Freeze for Additions<A>",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, A, F> Freeze for TxDescendants<'g, A, F>where
        F: Freeze,
    ",1,["bdk_chain::tx_graph::TxDescendants"]],["impl<B, C> Freeze for Persist<B, C>where
        B: Freeze,
        C: Freeze,
    ",1,["bdk_chain::persist::Persist"]],["impl<D> Freeze for SpkIterator<D>where
        D: Freeze,
    ",1,["bdk_chain::spk_iter::SpkIterator"]]], +"bdk":[["impl Freeze for Error",1,["bdk::error::Error"]],["impl Freeze for Error",1,["bdk::descriptor::error::Error"]],["impl Freeze for PkOrF",1,["bdk::descriptor::policy::PkOrF"]],["impl Freeze for SatisfiableItem",1,["bdk::descriptor::policy::SatisfiableItem"]],["impl Freeze for Satisfaction",1,["bdk::descriptor::policy::Satisfaction"]],["impl Freeze for Policy",1,["bdk::descriptor::policy::Policy"]],["impl Freeze for Condition",1,["bdk::descriptor::policy::Condition"]],["impl Freeze for PolicyError",1,["bdk::descriptor::policy::PolicyError"]],["impl<'a> Freeze for BuildSatisfaction<'a>",1,["bdk::descriptor::policy::BuildSatisfaction"]],["impl<K> Freeze for P2Pkh<K>where
        K: Freeze,
    ",1,["bdk::descriptor::template::P2Pkh"]],["impl<K> Freeze for P2Wpkh_P2Sh<K>where
        K: Freeze,
    ",1,["bdk::descriptor::template::P2Wpkh_P2Sh"]],["impl<K> Freeze for P2Wpkh<K>where
        K: Freeze,
    ",1,["bdk::descriptor::template::P2Wpkh"]],["impl<K> Freeze for Bip44<K>where
        K: Freeze,
    ",1,["bdk::descriptor::template::Bip44"]],["impl<K> Freeze for Bip44Public<K>where
        K: Freeze,
    ",1,["bdk::descriptor::template::Bip44Public"]],["impl<K> Freeze for Bip49<K>where
        K: Freeze,
    ",1,["bdk::descriptor::template::Bip49"]],["impl<K> Freeze for Bip49Public<K>where
        K: Freeze,
    ",1,["bdk::descriptor::template::Bip49Public"]],["impl<K> Freeze for Bip84<K>where
        K: Freeze,
    ",1,["bdk::descriptor::template::Bip84"]],["impl<K> Freeze for Bip84Public<K>where
        K: Freeze,
    ",1,["bdk::descriptor::template::Bip84Public"]],["impl<Ctx> Freeze for DescriptorKey<Ctx>",1,["bdk::keys::DescriptorKey"]],["impl Freeze for ScriptContextEnum",1,["bdk::keys::ScriptContextEnum"]],["impl<Ctx> Freeze for ExtendedKey<Ctx>",1,["bdk::keys::ExtendedKey"]],["impl<K, Ctx> Freeze for GeneratedKey<K, Ctx>where
        K: Freeze,
    ",1,["bdk::keys::GeneratedKey"]],["impl Freeze for PrivateKeyGenerateOptions",1,["bdk::keys::PrivateKeyGenerateOptions"]],["impl Freeze for KeyError",1,["bdk::keys::KeyError"]],["impl Freeze for KeychainKind",1,["bdk::types::KeychainKind"]],["impl Freeze for FeeRate",1,["bdk::types::FeeRate"]],["impl Freeze for LocalUtxo",1,["bdk::types::LocalUtxo"]],["impl Freeze for WeightedUtxo",1,["bdk::types::WeightedUtxo"]],["impl Freeze for Utxo",1,["bdk::types::Utxo"]],["impl Freeze for TransactionDetails",1,["bdk::types::TransactionDetails"]],["impl Freeze for Excess",1,["bdk::wallet::coin_selection::Excess"]],["impl Freeze for CoinSelectionResult",1,["bdk::wallet::coin_selection::CoinSelectionResult"]],["impl Freeze for LargestFirstCoinSelection",1,["bdk::wallet::coin_selection::LargestFirstCoinSelection"]],["impl Freeze for OldestFirstCoinSelection",1,["bdk::wallet::coin_selection::OldestFirstCoinSelection"]],["impl Freeze for BranchAndBoundCoinSelection",1,["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]],["impl Freeze for FullyNodedExport",1,["bdk::wallet::export::FullyNodedExport"]],["impl Freeze for SignerId",1,["bdk::wallet::signer::SignerId"]],["impl Freeze for SignerError",1,["bdk::wallet::signer::SignerError"]],["impl Freeze for SignerContext",1,["bdk::wallet::signer::SignerContext"]],["impl<S> Freeze for SignerWrapper<S>where
        S: Freeze,
    ",1,["bdk::wallet::signer::SignerWrapper"]],["impl Freeze for SignerOrdering",1,["bdk::wallet::signer::SignerOrdering"]],["impl Freeze for SignersContainer",1,["bdk::wallet::signer::SignersContainer"]],["impl Freeze for SignOptions",1,["bdk::wallet::signer::SignOptions"]],["impl Freeze for TapLeavesOptions",1,["bdk::wallet::signer::TapLeavesOptions"]],["impl Freeze for CreateTx",1,["bdk::wallet::tx_builder::CreateTx"]],["impl Freeze for BumpFee",1,["bdk::wallet::tx_builder::BumpFee"]],["impl<'a, D, Cs, Ctx> Freeze for TxBuilder<'a, D, Cs, Ctx>where
        Cs: Freeze,
    ",1,["bdk::wallet::tx_builder::TxBuilder"]],["impl Freeze for TxOrdering",1,["bdk::wallet::tx_builder::TxOrdering"]],["impl Freeze for ChangeSpendPolicy",1,["bdk::wallet::tx_builder::ChangeSpendPolicy"]],["impl<D> Freeze for Wallet<D>where
        D: Freeze,
    ",1,["bdk::wallet::Wallet"]],["impl Freeze for AddressIndex",1,["bdk::wallet::AddressIndex"]],["impl Freeze for AddressInfo",1,["bdk::wallet::AddressInfo"]],["impl<P> Freeze for NewError<P>where
        P: Freeze,
    ",1,["bdk::wallet::NewError"]],["impl Freeze for InsertTxError",1,["bdk::wallet::InsertTxError"]]], +"bdk_chain":[["impl<I> Freeze for SpkTxOutIndex<I>",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<A> Freeze for ChainPosition<A>where
        A: Freeze,
    ",1,["bdk_chain::chain_data::ChainPosition"]],["impl Freeze for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Freeze for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl Freeze for ConfirmationHeightAnchor",1,["bdk_chain::chain_data::ConfirmationHeightAnchor"]],["impl Freeze for ConfirmationTimeAnchor",1,["bdk_chain::chain_data::ConfirmationTimeAnchor"]],["impl<A> Freeze for FullTxOut<A>where
        A: Freeze,
    ",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A, I> Freeze for IndexedTxGraph<A, I>where
        I: Freeze,
    ",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> Freeze for IndexedAdditions<A, IA>where
        IA: Freeze,
    ",1,["bdk_chain::indexed_tx_graph::IndexedAdditions"]],["impl<K> Freeze for KeychainTxOutIndex<K>",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> Freeze for DerivationAdditions<K>",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, A> Freeze for LocalUpdate<K, A>",1,["bdk_chain::keychain::LocalUpdate"]],["impl<K, A> Freeze for LocalChangeSet<K, A>",1,["bdk_chain::keychain::LocalChangeSet"]],["impl Freeze for Balance",1,["bdk_chain::keychain::Balance"]],["impl Freeze for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl Freeze for UpdateNotConnectedError",1,["bdk_chain::local_chain::UpdateNotConnectedError"]],["impl Freeze for InsertBlockNotMatchingError",1,["bdk_chain::local_chain::InsertBlockNotMatchingError"]],["impl<A> Freeze for TxGraph<A>",1,["bdk_chain::tx_graph::TxGraph"]],["impl<'a, T, A> Freeze for TxNode<'a, T, A>",1,["bdk_chain::tx_graph::TxNode"]],["impl<'a, T, A> Freeze for CanonicalTx<'a, T, A>",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<A> Freeze for Additions<A>",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, A, F> Freeze for TxDescendants<'g, A, F>where
        F: Freeze,
    ",1,["bdk_chain::tx_graph::TxDescendants"]],["impl<B, C> Freeze for Persist<B, C>where
        B: Freeze,
        C: Freeze,
    ",1,["bdk_chain::persist::Persist"]],["impl<D> Freeze for SpkIterator<D>where
        D: Freeze,
    ",1,["bdk_chain::spk_iter::SpkIterator"]]], "bdk_coin_select":[["impl Freeze for WeightedValue",1,["bdk_coin_select::coin_selector::WeightedValue"]],["impl Freeze for CoinSelectorOpt",1,["bdk_coin_select::coin_selector::CoinSelectorOpt"]],["impl<'a> Freeze for CoinSelector<'a>",1,["bdk_coin_select::coin_selector::CoinSelector"]],["impl Freeze for SelectionError",1,["bdk_coin_select::coin_selector::SelectionError"]],["impl Freeze for SelectionConstraint",1,["bdk_coin_select::coin_selector::SelectionConstraint"]],["impl Freeze for Selection",1,["bdk_coin_select::coin_selector::Selection"]],["impl Freeze for ExcessStrategyKind",1,["bdk_coin_select::coin_selector::ExcessStrategyKind"]],["impl Freeze for ExcessStrategy",1,["bdk_coin_select::coin_selector::ExcessStrategy"]],["impl Freeze for BranchStrategy",1,["bdk_coin_select::bnb::BranchStrategy"]],["impl<'c, S> Freeze for Bnb<'c, S>where
        S: Freeze,
    ",1,["bdk_coin_select::bnb::Bnb"]],["impl<'c, 'f, S> Freeze for BnbIter<'c, 'f, S>where
        S: Freeze,
    ",1,["bdk_coin_select::bnb::BnbIter"]],["impl Freeze for BnbLimit",1,["bdk_coin_select::bnb::BnbLimit"]]], -"bdk_electrum":[["impl<K, P> Freeze for ElectrumUpdate<K, P>",1,["bdk_electrum::ElectrumUpdate"]]], -"bdk_file_store":[["impl<'t, T> Freeze for EntryIter<'t, T>",1,["bdk_file_store::entry_iter::EntryIter"]],["impl Freeze for IterError",1,["bdk_file_store::entry_iter::IterError"]],["impl<K, P> Freeze for KeychainStore<K, P>",1,["bdk_file_store::keychain_store::KeychainStore"]],["impl<'a, C> Freeze for Store<'a, C>",1,["bdk_file_store::store::Store"]],["impl<'a> Freeze for FileError<'a>",1,["bdk_file_store::FileError"]]], +"bdk_electrum":[["impl<K, A> Freeze for ElectrumUpdate<K, A>",1,["bdk_electrum::electrum_ext::ElectrumUpdate"]]], +"bdk_file_store":[["impl<'t, T> Freeze for EntryIter<'t, T>",1,["bdk_file_store::entry_iter::EntryIter"]],["impl Freeze for IterError",1,["bdk_file_store::entry_iter::IterError"]],["impl<'a, C> Freeze for Store<'a, C>",1,["bdk_file_store::store::Store"]],["impl<'a> Freeze for FileError<'a>",1,["bdk_file_store::FileError"]]], "bdk_tmp_plan":[["impl<Ak> Freeze for Requirements<Ak>where
        Ak: Freeze,
    ",1,["bdk_tmp_plan::requirements::Requirements"]],["impl<Ak> Freeze for RequiredSignatures<Ak>where
        Ak: Freeze,
    ",1,["bdk_tmp_plan::requirements::RequiredSignatures"]],["impl Freeze for SigningError",1,["bdk_tmp_plan::requirements::SigningError"]],["impl<Ak> Freeze for PlanKey<Ak>where
        Ak: Freeze,
    ",1,["bdk_tmp_plan::template::PlanKey"]],["impl<AK> !Freeze for Plan<AK>",1,["bdk_tmp_plan::Plan"]],["impl Freeze for SatisfactionMaterial",1,["bdk_tmp_plan::SatisfactionMaterial"]],["impl<Ak> Freeze for PlanState<Ak>where
        Ak: Freeze,
    ",1,["bdk_tmp_plan::PlanState"]],["impl<K> Freeze for Assets<K>",1,["bdk_tmp_plan::Assets"]]], -"keychain_tracker_electrum_example":[["impl Freeze for ElectrumCommands",1,["keychain_tracker_electrum_example::ElectrumCommands"]],["impl Freeze for ScanOptions",1,["keychain_tracker_electrum_example::ScanOptions"]]], -"keychain_tracker_esplora_example":[["impl Freeze for EsploraCommands",1,["keychain_tracker_esplora_example::EsploraCommands"]],["impl Freeze for ScanOptions",1,["keychain_tracker_esplora_example::ScanOptions"]]], -"keychain_tracker_example_cli":[["impl<C> Freeze for Args<C>where
        C: Freeze,
    ",1,["keychain_tracker_example_cli::Args"]],["impl<C> Freeze for Commands<C>where
        C: Freeze,
    ",1,["keychain_tracker_example_cli::Commands"]],["impl Freeze for CoinSelectionAlgo",1,["keychain_tracker_example_cli::CoinSelectionAlgo"]],["impl Freeze for AddressCmd",1,["keychain_tracker_example_cli::AddressCmd"]],["impl Freeze for TxOutCmd",1,["keychain_tracker_example_cli::TxOutCmd"]],["impl Freeze for Keychain",1,["keychain_tracker_example_cli::Keychain"]],["impl Freeze for AddrsOutput",1,["keychain_tracker_example_cli::AddrsOutput"]]] +"example_cli":[["impl<S> Freeze for Args<S>where
        S: Freeze,
    ",1,["example_cli::Args"]],["impl<S> Freeze for Commands<S>where
        S: Freeze,
    ",1,["example_cli::Commands"]],["impl Freeze for CoinSelectionAlgo",1,["example_cli::CoinSelectionAlgo"]],["impl Freeze for AddressCmd",1,["example_cli::AddressCmd"]],["impl Freeze for TxOutCmd",1,["example_cli::TxOutCmd"]],["impl Freeze for Keychain",1,["example_cli::Keychain"]]], +"example_electrum":[["impl Freeze for ElectrumCommands",1,["example_electrum::ElectrumCommands"]],["impl Freeze for ScanOptions",1,["example_electrum::ScanOptions"]]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Send.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Send.js index b8a7a6fa3b..187bf80f02 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Send.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Send.js @@ -1,11 +1,10 @@ (function() {var implementors = { -"bdk":[["impl Send for Error",1,["bdk::error::Error"]],["impl Send for Error",1,["bdk::descriptor::error::Error"]],["impl Send for PkOrF",1,["bdk::descriptor::policy::PkOrF"]],["impl Send for SatisfiableItem",1,["bdk::descriptor::policy::SatisfiableItem"]],["impl Send for Satisfaction",1,["bdk::descriptor::policy::Satisfaction"]],["impl Send for Policy",1,["bdk::descriptor::policy::Policy"]],["impl Send for Condition",1,["bdk::descriptor::policy::Condition"]],["impl Send for PolicyError",1,["bdk::descriptor::policy::PolicyError"]],["impl<'a> Send for BuildSatisfaction<'a>",1,["bdk::descriptor::policy::BuildSatisfaction"]],["impl<K> Send for P2Pkh<K>where
        K: Send,
    ",1,["bdk::descriptor::template::P2Pkh"]],["impl<K> Send for P2Wpkh_P2Sh<K>where
        K: Send,
    ",1,["bdk::descriptor::template::P2Wpkh_P2Sh"]],["impl<K> Send for P2Wpkh<K>where
        K: Send,
    ",1,["bdk::descriptor::template::P2Wpkh"]],["impl<K> Send for Bip44<K>where
        K: Send,
    ",1,["bdk::descriptor::template::Bip44"]],["impl<K> Send for Bip44Public<K>where
        K: Send,
    ",1,["bdk::descriptor::template::Bip44Public"]],["impl<K> Send for Bip49<K>where
        K: Send,
    ",1,["bdk::descriptor::template::Bip49"]],["impl<K> Send for Bip49Public<K>where
        K: Send,
    ",1,["bdk::descriptor::template::Bip49Public"]],["impl<K> Send for Bip84<K>where
        K: Send,
    ",1,["bdk::descriptor::template::Bip84"]],["impl<K> Send for Bip84Public<K>where
        K: Send,
    ",1,["bdk::descriptor::template::Bip84Public"]],["impl<Ctx> Send for DescriptorKey<Ctx>where
        Ctx: Send,
    ",1,["bdk::keys::DescriptorKey"]],["impl Send for ScriptContextEnum",1,["bdk::keys::ScriptContextEnum"]],["impl<Ctx> Send for ExtendedKey<Ctx>where
        Ctx: Send,
    ",1,["bdk::keys::ExtendedKey"]],["impl<K, Ctx> Send for GeneratedKey<K, Ctx>where
        Ctx: Send,
        K: Send,
    ",1,["bdk::keys::GeneratedKey"]],["impl Send for PrivateKeyGenerateOptions",1,["bdk::keys::PrivateKeyGenerateOptions"]],["impl Send for KeyError",1,["bdk::keys::KeyError"]],["impl Send for KeychainKind",1,["bdk::types::KeychainKind"]],["impl Send for FeeRate",1,["bdk::types::FeeRate"]],["impl Send for LocalUtxo",1,["bdk::types::LocalUtxo"]],["impl Send for WeightedUtxo",1,["bdk::types::WeightedUtxo"]],["impl Send for Utxo",1,["bdk::types::Utxo"]],["impl Send for TransactionDetails",1,["bdk::types::TransactionDetails"]],["impl Send for Excess",1,["bdk::wallet::coin_selection::Excess"]],["impl Send for CoinSelectionResult",1,["bdk::wallet::coin_selection::CoinSelectionResult"]],["impl Send for LargestFirstCoinSelection",1,["bdk::wallet::coin_selection::LargestFirstCoinSelection"]],["impl Send for OldestFirstCoinSelection",1,["bdk::wallet::coin_selection::OldestFirstCoinSelection"]],["impl Send for BranchAndBoundCoinSelection",1,["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]],["impl Send for FullyNodedExport",1,["bdk::wallet::export::FullyNodedExport"]],["impl Send for SignerId",1,["bdk::wallet::signer::SignerId"]],["impl Send for SignerError",1,["bdk::wallet::signer::SignerError"]],["impl Send for SignerContext",1,["bdk::wallet::signer::SignerContext"]],["impl<S> Send for SignerWrapper<S>where
        S: Send,
    ",1,["bdk::wallet::signer::SignerWrapper"]],["impl Send for SignerOrdering",1,["bdk::wallet::signer::SignerOrdering"]],["impl Send for SignersContainer",1,["bdk::wallet::signer::SignersContainer"]],["impl Send for SignOptions",1,["bdk::wallet::signer::SignOptions"]],["impl Send for TapLeavesOptions",1,["bdk::wallet::signer::TapLeavesOptions"]],["impl Send for CreateTx",1,["bdk::wallet::tx_builder::CreateTx"]],["impl Send for BumpFee",1,["bdk::wallet::tx_builder::BumpFee"]],["impl<'a, D, Cs, Ctx> !Send for TxBuilder<'a, D, Cs, Ctx>",1,["bdk::wallet::tx_builder::TxBuilder"]],["impl Send for TxOrdering",1,["bdk::wallet::tx_builder::TxOrdering"]],["impl Send for ChangeSpendPolicy",1,["bdk::wallet::tx_builder::ChangeSpendPolicy"]],["impl<D> Send for Wallet<D>where
        D: Send,
    ",1,["bdk::wallet::Wallet"]],["impl Send for AddressIndex",1,["bdk::wallet::AddressIndex"]],["impl Send for AddressInfo",1,["bdk::wallet::AddressInfo"]],["impl<P> Send for NewError<P>where
        P: Send,
    ",1,["bdk::wallet::NewError"]]], -"bdk_chain":[["impl<P> Send for ChainGraph<P>where
        P: Send,
    ",1,["bdk_chain::chain_graph::ChainGraph"]],["impl<P> Send for ChangeSet<P>where
        P: Send,
    ",1,["bdk_chain::chain_graph::ChangeSet"]],["impl<P> Send for NewError<P>where
        P: Send,
    ",1,["bdk_chain::chain_graph::NewError"]],["impl<P> Send for InsertTxError<P>where
        P: Send,
    ",1,["bdk_chain::chain_graph::InsertTxError"]],["impl<P> Send for UpdateError<P>where
        P: Send,
    ",1,["bdk_chain::chain_graph::UpdateError"]],["impl<P> Send for UnresolvableConflict<P>where
        P: Send,
    ",1,["bdk_chain::chain_graph::UnresolvableConflict"]],["impl<I> Send for SpkTxOutIndex<I>where
        I: Send,
    ",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<A> Send for ObservedAs<A>where
        A: Send,
    ",1,["bdk_chain::chain_data::ObservedAs"]],["impl Send for TxHeight",1,["bdk_chain::chain_data::TxHeight"]],["impl Send for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Send for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl Send for ConfirmationHeightAnchor",1,["bdk_chain::chain_data::ConfirmationHeightAnchor"]],["impl Send for ConfirmationTimeAnchor",1,["bdk_chain::chain_data::ConfirmationTimeAnchor"]],["impl<P> Send for FullTxOut<P>where
        P: Send,
    ",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A, I> Send for IndexedTxGraph<A, I>where
        A: Send,
        I: Send,
    ",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> Send for IndexedAdditions<A, IA>where
        A: Send,
        IA: Send,
    ",1,["bdk_chain::indexed_tx_graph::IndexedAdditions"]],["impl<K, P, B> Send for Persist<K, P, B>where
        B: Send,
        K: Send,
        P: Send,
    ",1,["bdk_chain::keychain::persist::Persist"]],["impl<K, P> Send for KeychainTracker<K, P>where
        K: Send,
        P: Send,
    ",1,["bdk_chain::keychain::tracker::KeychainTracker"]],["impl<K> Send for KeychainTxOutIndex<K>where
        K: Send,
    ",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> Send for DerivationAdditions<K>where
        K: Send,
    ",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, P> Send for KeychainScan<K, P>where
        K: Send,
        P: Send,
    ",1,["bdk_chain::keychain::KeychainScan"]],["impl<K, P> Send for KeychainChangeSet<K, P>where
        K: Send,
        P: Send,
    ",1,["bdk_chain::keychain::KeychainChangeSet"]],["impl Send for Balance",1,["bdk_chain::keychain::Balance"]],["impl Send for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl Send for UpdateNotConnectedError",1,["bdk_chain::local_chain::UpdateNotConnectedError"]],["impl Send for InsertBlockNotMatchingError",1,["bdk_chain::local_chain::InsertBlockNotMatchingError"]],["impl<P> Send for SparseChain<P>where
        P: Send,
    ",1,["bdk_chain::sparse_chain::SparseChain"]],["impl<P> Send for InsertTxError<P>where
        P: Send,
    ",1,["bdk_chain::sparse_chain::InsertTxError"]],["impl Send for InsertCheckpointError",1,["bdk_chain::sparse_chain::InsertCheckpointError"]],["impl<P> Send for UpdateError<P>where
        P: Send,
    ",1,["bdk_chain::sparse_chain::UpdateError"]],["impl<P> Send for ChangeSet<P>where
        P: Send,
    ",1,["bdk_chain::sparse_chain::ChangeSet"]],["impl<A> Send for TxGraph<A>where
        A: Send,
    ",1,["bdk_chain::tx_graph::TxGraph"]],["impl<'a, T, A> Send for TxNode<'a, T, A>where
        A: Sync,
        T: Sync,
    ",1,["bdk_chain::tx_graph::TxNode"]],["impl<'a, T, A> Send for CanonicalTx<'a, T, A>where
        A: Sync,
        T: Sync,
    ",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<A> Send for Additions<A>where
        A: Send,
    ",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, A, F> Send for TxDescendants<'g, A, F>where
        A: Sync,
        F: Send,
    ",1,["bdk_chain::tx_graph::TxDescendants"]],["impl<B, C> Send for Persist<B, C>where
        B: Send,
        C: Send,
    ",1,["bdk_chain::persist::Persist"]],["impl<D> Send for SpkIterator<D>where
        D: Send,
    ",1,["bdk_chain::spk_iter::SpkIterator"]]], +"bdk":[["impl Send for Error",1,["bdk::error::Error"]],["impl Send for Error",1,["bdk::descriptor::error::Error"]],["impl Send for PkOrF",1,["bdk::descriptor::policy::PkOrF"]],["impl Send for SatisfiableItem",1,["bdk::descriptor::policy::SatisfiableItem"]],["impl Send for Satisfaction",1,["bdk::descriptor::policy::Satisfaction"]],["impl Send for Policy",1,["bdk::descriptor::policy::Policy"]],["impl Send for Condition",1,["bdk::descriptor::policy::Condition"]],["impl Send for PolicyError",1,["bdk::descriptor::policy::PolicyError"]],["impl<'a> Send for BuildSatisfaction<'a>",1,["bdk::descriptor::policy::BuildSatisfaction"]],["impl<K> Send for P2Pkh<K>where
        K: Send,
    ",1,["bdk::descriptor::template::P2Pkh"]],["impl<K> Send for P2Wpkh_P2Sh<K>where
        K: Send,
    ",1,["bdk::descriptor::template::P2Wpkh_P2Sh"]],["impl<K> Send for P2Wpkh<K>where
        K: Send,
    ",1,["bdk::descriptor::template::P2Wpkh"]],["impl<K> Send for Bip44<K>where
        K: Send,
    ",1,["bdk::descriptor::template::Bip44"]],["impl<K> Send for Bip44Public<K>where
        K: Send,
    ",1,["bdk::descriptor::template::Bip44Public"]],["impl<K> Send for Bip49<K>where
        K: Send,
    ",1,["bdk::descriptor::template::Bip49"]],["impl<K> Send for Bip49Public<K>where
        K: Send,
    ",1,["bdk::descriptor::template::Bip49Public"]],["impl<K> Send for Bip84<K>where
        K: Send,
    ",1,["bdk::descriptor::template::Bip84"]],["impl<K> Send for Bip84Public<K>where
        K: Send,
    ",1,["bdk::descriptor::template::Bip84Public"]],["impl<Ctx> Send for DescriptorKey<Ctx>where
        Ctx: Send,
    ",1,["bdk::keys::DescriptorKey"]],["impl Send for ScriptContextEnum",1,["bdk::keys::ScriptContextEnum"]],["impl<Ctx> Send for ExtendedKey<Ctx>where
        Ctx: Send,
    ",1,["bdk::keys::ExtendedKey"]],["impl<K, Ctx> Send for GeneratedKey<K, Ctx>where
        Ctx: Send,
        K: Send,
    ",1,["bdk::keys::GeneratedKey"]],["impl Send for PrivateKeyGenerateOptions",1,["bdk::keys::PrivateKeyGenerateOptions"]],["impl Send for KeyError",1,["bdk::keys::KeyError"]],["impl Send for KeychainKind",1,["bdk::types::KeychainKind"]],["impl Send for FeeRate",1,["bdk::types::FeeRate"]],["impl Send for LocalUtxo",1,["bdk::types::LocalUtxo"]],["impl Send for WeightedUtxo",1,["bdk::types::WeightedUtxo"]],["impl Send for Utxo",1,["bdk::types::Utxo"]],["impl Send for TransactionDetails",1,["bdk::types::TransactionDetails"]],["impl Send for Excess",1,["bdk::wallet::coin_selection::Excess"]],["impl Send for CoinSelectionResult",1,["bdk::wallet::coin_selection::CoinSelectionResult"]],["impl Send for LargestFirstCoinSelection",1,["bdk::wallet::coin_selection::LargestFirstCoinSelection"]],["impl Send for OldestFirstCoinSelection",1,["bdk::wallet::coin_selection::OldestFirstCoinSelection"]],["impl Send for BranchAndBoundCoinSelection",1,["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]],["impl Send for FullyNodedExport",1,["bdk::wallet::export::FullyNodedExport"]],["impl Send for SignerId",1,["bdk::wallet::signer::SignerId"]],["impl Send for SignerError",1,["bdk::wallet::signer::SignerError"]],["impl Send for SignerContext",1,["bdk::wallet::signer::SignerContext"]],["impl<S> Send for SignerWrapper<S>where
        S: Send,
    ",1,["bdk::wallet::signer::SignerWrapper"]],["impl Send for SignerOrdering",1,["bdk::wallet::signer::SignerOrdering"]],["impl Send for SignersContainer",1,["bdk::wallet::signer::SignersContainer"]],["impl Send for SignOptions",1,["bdk::wallet::signer::SignOptions"]],["impl Send for TapLeavesOptions",1,["bdk::wallet::signer::TapLeavesOptions"]],["impl Send for CreateTx",1,["bdk::wallet::tx_builder::CreateTx"]],["impl Send for BumpFee",1,["bdk::wallet::tx_builder::BumpFee"]],["impl<'a, D, Cs, Ctx> !Send for TxBuilder<'a, D, Cs, Ctx>",1,["bdk::wallet::tx_builder::TxBuilder"]],["impl Send for TxOrdering",1,["bdk::wallet::tx_builder::TxOrdering"]],["impl Send for ChangeSpendPolicy",1,["bdk::wallet::tx_builder::ChangeSpendPolicy"]],["impl<D> Send for Wallet<D>where
        D: Send,
    ",1,["bdk::wallet::Wallet"]],["impl Send for AddressIndex",1,["bdk::wallet::AddressIndex"]],["impl Send for AddressInfo",1,["bdk::wallet::AddressInfo"]],["impl<P> Send for NewError<P>where
        P: Send,
    ",1,["bdk::wallet::NewError"]],["impl Send for InsertTxError",1,["bdk::wallet::InsertTxError"]]], +"bdk_chain":[["impl<I> Send for SpkTxOutIndex<I>where
        I: Send,
    ",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<A> Send for ChainPosition<A>where
        A: Send,
    ",1,["bdk_chain::chain_data::ChainPosition"]],["impl Send for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Send for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl Send for ConfirmationHeightAnchor",1,["bdk_chain::chain_data::ConfirmationHeightAnchor"]],["impl Send for ConfirmationTimeAnchor",1,["bdk_chain::chain_data::ConfirmationTimeAnchor"]],["impl<A> Send for FullTxOut<A>where
        A: Send,
    ",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A, I> Send for IndexedTxGraph<A, I>where
        A: Send,
        I: Send,
    ",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> Send for IndexedAdditions<A, IA>where
        A: Send,
        IA: Send,
    ",1,["bdk_chain::indexed_tx_graph::IndexedAdditions"]],["impl<K> Send for KeychainTxOutIndex<K>where
        K: Send,
    ",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> Send for DerivationAdditions<K>where
        K: Send,
    ",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, A> Send for LocalUpdate<K, A>where
        A: Send,
        K: Send,
    ",1,["bdk_chain::keychain::LocalUpdate"]],["impl<K, A> Send for LocalChangeSet<K, A>where
        A: Send,
        K: Send,
    ",1,["bdk_chain::keychain::LocalChangeSet"]],["impl Send for Balance",1,["bdk_chain::keychain::Balance"]],["impl Send for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl Send for UpdateNotConnectedError",1,["bdk_chain::local_chain::UpdateNotConnectedError"]],["impl Send for InsertBlockNotMatchingError",1,["bdk_chain::local_chain::InsertBlockNotMatchingError"]],["impl<A> Send for TxGraph<A>where
        A: Send,
    ",1,["bdk_chain::tx_graph::TxGraph"]],["impl<'a, T, A> Send for TxNode<'a, T, A>where
        A: Sync,
        T: Sync,
    ",1,["bdk_chain::tx_graph::TxNode"]],["impl<'a, T, A> Send for CanonicalTx<'a, T, A>where
        A: Sync,
        T: Sync,
    ",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<A> Send for Additions<A>where
        A: Send,
    ",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, A, F> Send for TxDescendants<'g, A, F>where
        A: Sync,
        F: Send,
    ",1,["bdk_chain::tx_graph::TxDescendants"]],["impl<B, C> Send for Persist<B, C>where
        B: Send,
        C: Send,
    ",1,["bdk_chain::persist::Persist"]],["impl<D> Send for SpkIterator<D>where
        D: Send,
    ",1,["bdk_chain::spk_iter::SpkIterator"]]], "bdk_coin_select":[["impl Send for WeightedValue",1,["bdk_coin_select::coin_selector::WeightedValue"]],["impl Send for CoinSelectorOpt",1,["bdk_coin_select::coin_selector::CoinSelectorOpt"]],["impl<'a> Send for CoinSelector<'a>",1,["bdk_coin_select::coin_selector::CoinSelector"]],["impl Send for SelectionError",1,["bdk_coin_select::coin_selector::SelectionError"]],["impl Send for SelectionConstraint",1,["bdk_coin_select::coin_selector::SelectionConstraint"]],["impl Send for Selection",1,["bdk_coin_select::coin_selector::Selection"]],["impl Send for ExcessStrategyKind",1,["bdk_coin_select::coin_selector::ExcessStrategyKind"]],["impl Send for ExcessStrategy",1,["bdk_coin_select::coin_selector::ExcessStrategy"]],["impl Send for BranchStrategy",1,["bdk_coin_select::bnb::BranchStrategy"]],["impl<'c, S> Send for Bnb<'c, S>where
        S: Send,
    ",1,["bdk_coin_select::bnb::Bnb"]],["impl<'c, 'f, S> !Send for BnbIter<'c, 'f, S>",1,["bdk_coin_select::bnb::BnbIter"]],["impl Send for BnbLimit",1,["bdk_coin_select::bnb::BnbLimit"]]], -"bdk_electrum":[["impl<K, P> Send for ElectrumUpdate<K, P>where
        K: Send,
        P: Send,
    ",1,["bdk_electrum::ElectrumUpdate"]]], -"bdk_file_store":[["impl<'t, T> Send for EntryIter<'t, T>where
        T: Send,
    ",1,["bdk_file_store::entry_iter::EntryIter"]],["impl Send for IterError",1,["bdk_file_store::entry_iter::IterError"]],["impl<K, P> Send for KeychainStore<K, P>where
        K: Send,
        P: Send,
    ",1,["bdk_file_store::keychain_store::KeychainStore"]],["impl<'a, C> Send for Store<'a, C>where
        C: Send,
    ",1,["bdk_file_store::store::Store"]],["impl<'a> Send for FileError<'a>",1,["bdk_file_store::FileError"]]], +"bdk_electrum":[["impl<K, A> Send for ElectrumUpdate<K, A>where
        A: Send,
        K: Send,
    ",1,["bdk_electrum::electrum_ext::ElectrumUpdate"]]], +"bdk_file_store":[["impl<'t, T> Send for EntryIter<'t, T>where
        T: Send,
    ",1,["bdk_file_store::entry_iter::EntryIter"]],["impl Send for IterError",1,["bdk_file_store::entry_iter::IterError"]],["impl<'a, C> Send for Store<'a, C>where
        C: Send,
    ",1,["bdk_file_store::store::Store"]],["impl<'a> Send for FileError<'a>",1,["bdk_file_store::FileError"]]], "bdk_tmp_plan":[["impl<Ak> Send for Requirements<Ak>where
        Ak: Send,
    ",1,["bdk_tmp_plan::requirements::Requirements"]],["impl<Ak> Send for RequiredSignatures<Ak>where
        Ak: Send,
    ",1,["bdk_tmp_plan::requirements::RequiredSignatures"]],["impl Send for SigningError",1,["bdk_tmp_plan::requirements::SigningError"]],["impl<Ak> Send for PlanKey<Ak>where
        Ak: Send,
    ",1,["bdk_tmp_plan::template::PlanKey"]],["impl<AK> Send for Plan<AK>where
        AK: Send,
    ",1,["bdk_tmp_plan::Plan"]],["impl Send for SatisfactionMaterial",1,["bdk_tmp_plan::SatisfactionMaterial"]],["impl<Ak> Send for PlanState<Ak>where
        Ak: Send,
    ",1,["bdk_tmp_plan::PlanState"]],["impl<K> Send for Assets<K>where
        K: Send,
    ",1,["bdk_tmp_plan::Assets"]]], -"keychain_tracker_electrum_example":[["impl Send for ElectrumCommands",1,["keychain_tracker_electrum_example::ElectrumCommands"]],["impl Send for ScanOptions",1,["keychain_tracker_electrum_example::ScanOptions"]]], -"keychain_tracker_esplora_example":[["impl Send for EsploraCommands",1,["keychain_tracker_esplora_example::EsploraCommands"]],["impl Send for ScanOptions",1,["keychain_tracker_esplora_example::ScanOptions"]]], -"keychain_tracker_example_cli":[["impl<C> Send for Args<C>where
        C: Send,
    ",1,["keychain_tracker_example_cli::Args"]],["impl<C> Send for Commands<C>where
        C: Send,
    ",1,["keychain_tracker_example_cli::Commands"]],["impl Send for CoinSelectionAlgo",1,["keychain_tracker_example_cli::CoinSelectionAlgo"]],["impl Send for AddressCmd",1,["keychain_tracker_example_cli::AddressCmd"]],["impl Send for TxOutCmd",1,["keychain_tracker_example_cli::TxOutCmd"]],["impl Send for Keychain",1,["keychain_tracker_example_cli::Keychain"]],["impl Send for AddrsOutput",1,["keychain_tracker_example_cli::AddrsOutput"]]] +"example_cli":[["impl<S> Send for Args<S>where
        S: Send,
    ",1,["example_cli::Args"]],["impl<S> Send for Commands<S>where
        S: Send,
    ",1,["example_cli::Commands"]],["impl Send for CoinSelectionAlgo",1,["example_cli::CoinSelectionAlgo"]],["impl Send for AddressCmd",1,["example_cli::AddressCmd"]],["impl Send for TxOutCmd",1,["example_cli::TxOutCmd"]],["impl Send for Keychain",1,["example_cli::Keychain"]]], +"example_electrum":[["impl Send for ElectrumCommands",1,["example_electrum::ElectrumCommands"]],["impl Send for ScanOptions",1,["example_electrum::ScanOptions"]]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralEq.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralEq.js index c8ea85504d..bbc85cae85 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralEq.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralEq.js @@ -1,6 +1,6 @@ (function() {var implementors = { "bdk":[["impl StructuralEq for PkOrF"],["impl StructuralEq for SatisfiableItem"],["impl StructuralEq for Satisfaction"],["impl StructuralEq for Policy"],["impl StructuralEq for Condition"],["impl StructuralEq for PolicyError"],["impl StructuralEq for ScriptContextEnum"],["impl StructuralEq for KeychainKind"],["impl StructuralEq for LocalUtxo"],["impl StructuralEq for WeightedUtxo"],["impl StructuralEq for Utxo"],["impl StructuralEq for TransactionDetails"],["impl StructuralEq for SignerId"],["impl StructuralEq for SignerError"],["impl StructuralEq for SignerContext"],["impl StructuralEq for SignerOrdering"],["impl StructuralEq for TapLeavesOptions"],["impl StructuralEq for TxOrdering"],["impl StructuralEq for ChangeSpendPolicy"],["impl StructuralEq for AddressInfo"]], -"bdk_chain":[["impl<A> StructuralEq for ObservedAs<A>"],["impl StructuralEq for TxHeight"],["impl StructuralEq for ConfirmationTime"],["impl StructuralEq for BlockId"],["impl StructuralEq for ConfirmationHeightAnchor"],["impl StructuralEq for ConfirmationTimeAnchor"],["impl<P> StructuralEq for FullTxOut<P>"],["impl StructuralEq for Balance"],["impl StructuralEq for LocalChain"],["impl<'a, T, A> StructuralEq for TxNode<'a, T, A>"],["impl<'a, T, A> StructuralEq for CanonicalTx<'a, T, A>"]], +"bdk_chain":[["impl<A> StructuralEq for ChainPosition<A>"],["impl StructuralEq for ConfirmationTime"],["impl StructuralEq for BlockId"],["impl StructuralEq for ConfirmationHeightAnchor"],["impl StructuralEq for ConfirmationTimeAnchor"],["impl<A> StructuralEq for FullTxOut<A>"],["impl StructuralEq for Balance"],["impl StructuralEq for LocalChain"],["impl<'a, T, A> StructuralEq for TxNode<'a, T, A>"],["impl<'a, T, A> StructuralEq for CanonicalTx<'a, T, A>"]], "bdk_coin_select":[["impl StructuralEq for SelectionConstraint"],["impl StructuralEq for ExcessStrategyKind"]], -"keychain_tracker_example_cli":[["impl StructuralEq for Keychain"]] +"example_cli":[["impl StructuralEq for Keychain"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralPartialEq.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralPartialEq.js index 2fe54def28..112afcbf49 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralPartialEq.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.StructuralPartialEq.js @@ -1,8 +1,7 @@ (function() {var implementors = { "bdk":[["impl StructuralPartialEq for PkOrF"],["impl StructuralPartialEq for SatisfiableItem"],["impl StructuralPartialEq for Satisfaction"],["impl StructuralPartialEq for Policy"],["impl StructuralPartialEq for Condition"],["impl StructuralPartialEq for PolicyError"],["impl StructuralPartialEq for ScriptContextEnum"],["impl StructuralPartialEq for KeychainKind"],["impl StructuralPartialEq for FeeRate"],["impl StructuralPartialEq for LocalUtxo"],["impl StructuralPartialEq for WeightedUtxo"],["impl StructuralPartialEq for Utxo"],["impl StructuralPartialEq for TransactionDetails"],["impl StructuralPartialEq for SignerId"],["impl StructuralPartialEq for SignerError"],["impl StructuralPartialEq for SignerContext"],["impl StructuralPartialEq for SignerOrdering"],["impl StructuralPartialEq for TapLeavesOptions"],["impl StructuralPartialEq for TxOrdering"],["impl StructuralPartialEq for ChangeSpendPolicy"],["impl StructuralPartialEq for AddressInfo"]], -"bdk_chain":[["impl<P> StructuralPartialEq for ChainGraph<P>"],["impl<P> StructuralPartialEq for ChangeSet<P>"],["impl<P> StructuralPartialEq for NewError<P>"],["impl<P> StructuralPartialEq for InsertTxError<P>"],["impl<P> StructuralPartialEq for UpdateError<P>"],["impl<P> StructuralPartialEq for UnresolvableConflict<P>"],["impl<A> StructuralPartialEq for ObservedAs<A>"],["impl StructuralPartialEq for TxHeight"],["impl StructuralPartialEq for ConfirmationTime"],["impl StructuralPartialEq for BlockId"],["impl StructuralPartialEq for ConfirmationHeightAnchor"],["impl StructuralPartialEq for ConfirmationTimeAnchor"],["impl<P> StructuralPartialEq for FullTxOut<P>"],["impl<A, IA> StructuralPartialEq for IndexedAdditions<A, IA>"],["impl<K> StructuralPartialEq for DerivationAdditions<K>"],["impl<K, P> StructuralPartialEq for KeychainScan<K, P>"],["impl StructuralPartialEq for Balance"],["impl StructuralPartialEq for LocalChain"],["impl StructuralPartialEq for UpdateNotConnectedError"],["impl StructuralPartialEq for InsertBlockNotMatchingError"],["impl<P> StructuralPartialEq for SparseChain<P>"],["impl<P> StructuralPartialEq for InsertTxError<P>"],["impl StructuralPartialEq for InsertCheckpointError"],["impl<P> StructuralPartialEq for UpdateError<P>"],["impl<P> StructuralPartialEq for ChangeSet<P>"],["impl<A> StructuralPartialEq for TxGraph<A>"],["impl<'a, T, A> StructuralPartialEq for TxNode<'a, T, A>"],["impl<'a, T, A> StructuralPartialEq for CanonicalTx<'a, T, A>"],["impl<A> StructuralPartialEq for Additions<A>"]], +"bdk_chain":[["impl<A> StructuralPartialEq for ChainPosition<A>"],["impl StructuralPartialEq for ConfirmationTime"],["impl StructuralPartialEq for BlockId"],["impl StructuralPartialEq for ConfirmationHeightAnchor"],["impl StructuralPartialEq for ConfirmationTimeAnchor"],["impl<A> StructuralPartialEq for FullTxOut<A>"],["impl<A, IA> StructuralPartialEq for IndexedAdditions<A, IA>"],["impl<K> StructuralPartialEq for DerivationAdditions<K>"],["impl<K, A> StructuralPartialEq for LocalUpdate<K, A>"],["impl<K, A> StructuralPartialEq for LocalChangeSet<K, A>"],["impl StructuralPartialEq for Balance"],["impl StructuralPartialEq for LocalChain"],["impl StructuralPartialEq for UpdateNotConnectedError"],["impl StructuralPartialEq for InsertBlockNotMatchingError"],["impl<A> StructuralPartialEq for TxGraph<A>"],["impl<'a, T, A> StructuralPartialEq for TxNode<'a, T, A>"],["impl<'a, T, A> StructuralPartialEq for CanonicalTx<'a, T, A>"],["impl<A> StructuralPartialEq for Additions<A>"]], "bdk_coin_select":[["impl StructuralPartialEq for SelectionConstraint"],["impl StructuralPartialEq for ExcessStrategyKind"]], -"keychain_tracker_electrum_example":[["impl StructuralPartialEq for ScanOptions"]], -"keychain_tracker_esplora_example":[["impl StructuralPartialEq for ScanOptions"]], -"keychain_tracker_example_cli":[["impl StructuralPartialEq for Keychain"]] +"example_cli":[["impl StructuralPartialEq for Keychain"]], +"example_electrum":[["impl StructuralPartialEq for ScanOptions"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Sync.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Sync.js index 552a459ffb..d851092d38 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Sync.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Sync.js @@ -1,11 +1,10 @@ (function() {var implementors = { -"bdk":[["impl Sync for Error",1,["bdk::error::Error"]],["impl Sync for Error",1,["bdk::descriptor::error::Error"]],["impl Sync for PkOrF",1,["bdk::descriptor::policy::PkOrF"]],["impl Sync for SatisfiableItem",1,["bdk::descriptor::policy::SatisfiableItem"]],["impl Sync for Satisfaction",1,["bdk::descriptor::policy::Satisfaction"]],["impl Sync for Policy",1,["bdk::descriptor::policy::Policy"]],["impl Sync for Condition",1,["bdk::descriptor::policy::Condition"]],["impl Sync for PolicyError",1,["bdk::descriptor::policy::PolicyError"]],["impl<'a> Sync for BuildSatisfaction<'a>",1,["bdk::descriptor::policy::BuildSatisfaction"]],["impl<K> Sync for P2Pkh<K>where
        K: Sync,
    ",1,["bdk::descriptor::template::P2Pkh"]],["impl<K> Sync for P2Wpkh_P2Sh<K>where
        K: Sync,
    ",1,["bdk::descriptor::template::P2Wpkh_P2Sh"]],["impl<K> Sync for P2Wpkh<K>where
        K: Sync,
    ",1,["bdk::descriptor::template::P2Wpkh"]],["impl<K> Sync for Bip44<K>where
        K: Sync,
    ",1,["bdk::descriptor::template::Bip44"]],["impl<K> Sync for Bip44Public<K>where
        K: Sync,
    ",1,["bdk::descriptor::template::Bip44Public"]],["impl<K> Sync for Bip49<K>where
        K: Sync,
    ",1,["bdk::descriptor::template::Bip49"]],["impl<K> Sync for Bip49Public<K>where
        K: Sync,
    ",1,["bdk::descriptor::template::Bip49Public"]],["impl<K> Sync for Bip84<K>where
        K: Sync,
    ",1,["bdk::descriptor::template::Bip84"]],["impl<K> Sync for Bip84Public<K>where
        K: Sync,
    ",1,["bdk::descriptor::template::Bip84Public"]],["impl<Ctx> Sync for DescriptorKey<Ctx>where
        Ctx: Sync,
    ",1,["bdk::keys::DescriptorKey"]],["impl Sync for ScriptContextEnum",1,["bdk::keys::ScriptContextEnum"]],["impl<Ctx> Sync for ExtendedKey<Ctx>where
        Ctx: Sync,
    ",1,["bdk::keys::ExtendedKey"]],["impl<K, Ctx> Sync for GeneratedKey<K, Ctx>where
        Ctx: Sync,
        K: Sync,
    ",1,["bdk::keys::GeneratedKey"]],["impl Sync for PrivateKeyGenerateOptions",1,["bdk::keys::PrivateKeyGenerateOptions"]],["impl Sync for KeyError",1,["bdk::keys::KeyError"]],["impl Sync for KeychainKind",1,["bdk::types::KeychainKind"]],["impl Sync for FeeRate",1,["bdk::types::FeeRate"]],["impl Sync for LocalUtxo",1,["bdk::types::LocalUtxo"]],["impl Sync for WeightedUtxo",1,["bdk::types::WeightedUtxo"]],["impl Sync for Utxo",1,["bdk::types::Utxo"]],["impl Sync for TransactionDetails",1,["bdk::types::TransactionDetails"]],["impl Sync for Excess",1,["bdk::wallet::coin_selection::Excess"]],["impl Sync for CoinSelectionResult",1,["bdk::wallet::coin_selection::CoinSelectionResult"]],["impl Sync for LargestFirstCoinSelection",1,["bdk::wallet::coin_selection::LargestFirstCoinSelection"]],["impl Sync for OldestFirstCoinSelection",1,["bdk::wallet::coin_selection::OldestFirstCoinSelection"]],["impl Sync for BranchAndBoundCoinSelection",1,["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]],["impl Sync for FullyNodedExport",1,["bdk::wallet::export::FullyNodedExport"]],["impl Sync for SignerId",1,["bdk::wallet::signer::SignerId"]],["impl Sync for SignerError",1,["bdk::wallet::signer::SignerError"]],["impl Sync for SignerContext",1,["bdk::wallet::signer::SignerContext"]],["impl<S> Sync for SignerWrapper<S>where
        S: Sync,
    ",1,["bdk::wallet::signer::SignerWrapper"]],["impl Sync for SignerOrdering",1,["bdk::wallet::signer::SignerOrdering"]],["impl Sync for SignersContainer",1,["bdk::wallet::signer::SignersContainer"]],["impl Sync for SignOptions",1,["bdk::wallet::signer::SignOptions"]],["impl Sync for TapLeavesOptions",1,["bdk::wallet::signer::TapLeavesOptions"]],["impl Sync for CreateTx",1,["bdk::wallet::tx_builder::CreateTx"]],["impl Sync for BumpFee",1,["bdk::wallet::tx_builder::BumpFee"]],["impl<'a, D, Cs, Ctx> !Sync for TxBuilder<'a, D, Cs, Ctx>",1,["bdk::wallet::tx_builder::TxBuilder"]],["impl Sync for TxOrdering",1,["bdk::wallet::tx_builder::TxOrdering"]],["impl Sync for ChangeSpendPolicy",1,["bdk::wallet::tx_builder::ChangeSpendPolicy"]],["impl<D> Sync for Wallet<D>where
        D: Sync,
    ",1,["bdk::wallet::Wallet"]],["impl Sync for AddressIndex",1,["bdk::wallet::AddressIndex"]],["impl Sync for AddressInfo",1,["bdk::wallet::AddressInfo"]],["impl<P> Sync for NewError<P>where
        P: Sync,
    ",1,["bdk::wallet::NewError"]]], -"bdk_chain":[["impl<P> Sync for ChainGraph<P>where
        P: Sync,
    ",1,["bdk_chain::chain_graph::ChainGraph"]],["impl<P> Sync for ChangeSet<P>where
        P: Sync,
    ",1,["bdk_chain::chain_graph::ChangeSet"]],["impl<P> Sync for NewError<P>where
        P: Sync,
    ",1,["bdk_chain::chain_graph::NewError"]],["impl<P> Sync for InsertTxError<P>where
        P: Sync,
    ",1,["bdk_chain::chain_graph::InsertTxError"]],["impl<P> Sync for UpdateError<P>where
        P: Sync,
    ",1,["bdk_chain::chain_graph::UpdateError"]],["impl<P> Sync for UnresolvableConflict<P>where
        P: Sync,
    ",1,["bdk_chain::chain_graph::UnresolvableConflict"]],["impl<I> Sync for SpkTxOutIndex<I>where
        I: Sync,
    ",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<A> Sync for ObservedAs<A>where
        A: Sync,
    ",1,["bdk_chain::chain_data::ObservedAs"]],["impl Sync for TxHeight",1,["bdk_chain::chain_data::TxHeight"]],["impl Sync for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Sync for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl Sync for ConfirmationHeightAnchor",1,["bdk_chain::chain_data::ConfirmationHeightAnchor"]],["impl Sync for ConfirmationTimeAnchor",1,["bdk_chain::chain_data::ConfirmationTimeAnchor"]],["impl<P> Sync for FullTxOut<P>where
        P: Sync,
    ",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A, I> Sync for IndexedTxGraph<A, I>where
        A: Sync,
        I: Sync,
    ",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> Sync for IndexedAdditions<A, IA>where
        A: Sync,
        IA: Sync,
    ",1,["bdk_chain::indexed_tx_graph::IndexedAdditions"]],["impl<K, P, B> Sync for Persist<K, P, B>where
        B: Sync,
        K: Sync,
        P: Sync,
    ",1,["bdk_chain::keychain::persist::Persist"]],["impl<K, P> Sync for KeychainTracker<K, P>where
        K: Sync,
        P: Sync,
    ",1,["bdk_chain::keychain::tracker::KeychainTracker"]],["impl<K> Sync for KeychainTxOutIndex<K>where
        K: Sync,
    ",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> Sync for DerivationAdditions<K>where
        K: Sync,
    ",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, P> Sync for KeychainScan<K, P>where
        K: Sync,
        P: Sync,
    ",1,["bdk_chain::keychain::KeychainScan"]],["impl<K, P> Sync for KeychainChangeSet<K, P>where
        K: Sync,
        P: Sync,
    ",1,["bdk_chain::keychain::KeychainChangeSet"]],["impl Sync for Balance",1,["bdk_chain::keychain::Balance"]],["impl Sync for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl Sync for UpdateNotConnectedError",1,["bdk_chain::local_chain::UpdateNotConnectedError"]],["impl Sync for InsertBlockNotMatchingError",1,["bdk_chain::local_chain::InsertBlockNotMatchingError"]],["impl<P> Sync for SparseChain<P>where
        P: Sync,
    ",1,["bdk_chain::sparse_chain::SparseChain"]],["impl<P> Sync for InsertTxError<P>where
        P: Sync,
    ",1,["bdk_chain::sparse_chain::InsertTxError"]],["impl Sync for InsertCheckpointError",1,["bdk_chain::sparse_chain::InsertCheckpointError"]],["impl<P> Sync for UpdateError<P>where
        P: Sync,
    ",1,["bdk_chain::sparse_chain::UpdateError"]],["impl<P> Sync for ChangeSet<P>where
        P: Sync,
    ",1,["bdk_chain::sparse_chain::ChangeSet"]],["impl<A> Sync for TxGraph<A>where
        A: Sync,
    ",1,["bdk_chain::tx_graph::TxGraph"]],["impl<'a, T, A> Sync for TxNode<'a, T, A>where
        A: Sync,
        T: Sync,
    ",1,["bdk_chain::tx_graph::TxNode"]],["impl<'a, T, A> Sync for CanonicalTx<'a, T, A>where
        A: Sync,
        T: Sync,
    ",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<A> Sync for Additions<A>where
        A: Sync,
    ",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, A, F> Sync for TxDescendants<'g, A, F>where
        A: Sync,
        F: Sync,
    ",1,["bdk_chain::tx_graph::TxDescendants"]],["impl<B, C> Sync for Persist<B, C>where
        B: Sync,
        C: Sync,
    ",1,["bdk_chain::persist::Persist"]],["impl<D> Sync for SpkIterator<D>where
        D: Sync,
    ",1,["bdk_chain::spk_iter::SpkIterator"]]], +"bdk":[["impl Sync for Error",1,["bdk::error::Error"]],["impl Sync for Error",1,["bdk::descriptor::error::Error"]],["impl Sync for PkOrF",1,["bdk::descriptor::policy::PkOrF"]],["impl Sync for SatisfiableItem",1,["bdk::descriptor::policy::SatisfiableItem"]],["impl Sync for Satisfaction",1,["bdk::descriptor::policy::Satisfaction"]],["impl Sync for Policy",1,["bdk::descriptor::policy::Policy"]],["impl Sync for Condition",1,["bdk::descriptor::policy::Condition"]],["impl Sync for PolicyError",1,["bdk::descriptor::policy::PolicyError"]],["impl<'a> Sync for BuildSatisfaction<'a>",1,["bdk::descriptor::policy::BuildSatisfaction"]],["impl<K> Sync for P2Pkh<K>where
        K: Sync,
    ",1,["bdk::descriptor::template::P2Pkh"]],["impl<K> Sync for P2Wpkh_P2Sh<K>where
        K: Sync,
    ",1,["bdk::descriptor::template::P2Wpkh_P2Sh"]],["impl<K> Sync for P2Wpkh<K>where
        K: Sync,
    ",1,["bdk::descriptor::template::P2Wpkh"]],["impl<K> Sync for Bip44<K>where
        K: Sync,
    ",1,["bdk::descriptor::template::Bip44"]],["impl<K> Sync for Bip44Public<K>where
        K: Sync,
    ",1,["bdk::descriptor::template::Bip44Public"]],["impl<K> Sync for Bip49<K>where
        K: Sync,
    ",1,["bdk::descriptor::template::Bip49"]],["impl<K> Sync for Bip49Public<K>where
        K: Sync,
    ",1,["bdk::descriptor::template::Bip49Public"]],["impl<K> Sync for Bip84<K>where
        K: Sync,
    ",1,["bdk::descriptor::template::Bip84"]],["impl<K> Sync for Bip84Public<K>where
        K: Sync,
    ",1,["bdk::descriptor::template::Bip84Public"]],["impl<Ctx> Sync for DescriptorKey<Ctx>where
        Ctx: Sync,
    ",1,["bdk::keys::DescriptorKey"]],["impl Sync for ScriptContextEnum",1,["bdk::keys::ScriptContextEnum"]],["impl<Ctx> Sync for ExtendedKey<Ctx>where
        Ctx: Sync,
    ",1,["bdk::keys::ExtendedKey"]],["impl<K, Ctx> Sync for GeneratedKey<K, Ctx>where
        Ctx: Sync,
        K: Sync,
    ",1,["bdk::keys::GeneratedKey"]],["impl Sync for PrivateKeyGenerateOptions",1,["bdk::keys::PrivateKeyGenerateOptions"]],["impl Sync for KeyError",1,["bdk::keys::KeyError"]],["impl Sync for KeychainKind",1,["bdk::types::KeychainKind"]],["impl Sync for FeeRate",1,["bdk::types::FeeRate"]],["impl Sync for LocalUtxo",1,["bdk::types::LocalUtxo"]],["impl Sync for WeightedUtxo",1,["bdk::types::WeightedUtxo"]],["impl Sync for Utxo",1,["bdk::types::Utxo"]],["impl Sync for TransactionDetails",1,["bdk::types::TransactionDetails"]],["impl Sync for Excess",1,["bdk::wallet::coin_selection::Excess"]],["impl Sync for CoinSelectionResult",1,["bdk::wallet::coin_selection::CoinSelectionResult"]],["impl Sync for LargestFirstCoinSelection",1,["bdk::wallet::coin_selection::LargestFirstCoinSelection"]],["impl Sync for OldestFirstCoinSelection",1,["bdk::wallet::coin_selection::OldestFirstCoinSelection"]],["impl Sync for BranchAndBoundCoinSelection",1,["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]],["impl Sync for FullyNodedExport",1,["bdk::wallet::export::FullyNodedExport"]],["impl Sync for SignerId",1,["bdk::wallet::signer::SignerId"]],["impl Sync for SignerError",1,["bdk::wallet::signer::SignerError"]],["impl Sync for SignerContext",1,["bdk::wallet::signer::SignerContext"]],["impl<S> Sync for SignerWrapper<S>where
        S: Sync,
    ",1,["bdk::wallet::signer::SignerWrapper"]],["impl Sync for SignerOrdering",1,["bdk::wallet::signer::SignerOrdering"]],["impl Sync for SignersContainer",1,["bdk::wallet::signer::SignersContainer"]],["impl Sync for SignOptions",1,["bdk::wallet::signer::SignOptions"]],["impl Sync for TapLeavesOptions",1,["bdk::wallet::signer::TapLeavesOptions"]],["impl Sync for CreateTx",1,["bdk::wallet::tx_builder::CreateTx"]],["impl Sync for BumpFee",1,["bdk::wallet::tx_builder::BumpFee"]],["impl<'a, D, Cs, Ctx> !Sync for TxBuilder<'a, D, Cs, Ctx>",1,["bdk::wallet::tx_builder::TxBuilder"]],["impl Sync for TxOrdering",1,["bdk::wallet::tx_builder::TxOrdering"]],["impl Sync for ChangeSpendPolicy",1,["bdk::wallet::tx_builder::ChangeSpendPolicy"]],["impl<D> Sync for Wallet<D>where
        D: Sync,
    ",1,["bdk::wallet::Wallet"]],["impl Sync for AddressIndex",1,["bdk::wallet::AddressIndex"]],["impl Sync for AddressInfo",1,["bdk::wallet::AddressInfo"]],["impl<P> Sync for NewError<P>where
        P: Sync,
    ",1,["bdk::wallet::NewError"]],["impl Sync for InsertTxError",1,["bdk::wallet::InsertTxError"]]], +"bdk_chain":[["impl<I> Sync for SpkTxOutIndex<I>where
        I: Sync,
    ",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<A> Sync for ChainPosition<A>where
        A: Sync,
    ",1,["bdk_chain::chain_data::ChainPosition"]],["impl Sync for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Sync for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl Sync for ConfirmationHeightAnchor",1,["bdk_chain::chain_data::ConfirmationHeightAnchor"]],["impl Sync for ConfirmationTimeAnchor",1,["bdk_chain::chain_data::ConfirmationTimeAnchor"]],["impl<A> Sync for FullTxOut<A>where
        A: Sync,
    ",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A, I> Sync for IndexedTxGraph<A, I>where
        A: Sync,
        I: Sync,
    ",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> Sync for IndexedAdditions<A, IA>where
        A: Sync,
        IA: Sync,
    ",1,["bdk_chain::indexed_tx_graph::IndexedAdditions"]],["impl<K> Sync for KeychainTxOutIndex<K>where
        K: Sync,
    ",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> Sync for DerivationAdditions<K>where
        K: Sync,
    ",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, A> Sync for LocalUpdate<K, A>where
        A: Sync,
        K: Sync,
    ",1,["bdk_chain::keychain::LocalUpdate"]],["impl<K, A> Sync for LocalChangeSet<K, A>where
        A: Sync,
        K: Sync,
    ",1,["bdk_chain::keychain::LocalChangeSet"]],["impl Sync for Balance",1,["bdk_chain::keychain::Balance"]],["impl Sync for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl Sync for UpdateNotConnectedError",1,["bdk_chain::local_chain::UpdateNotConnectedError"]],["impl Sync for InsertBlockNotMatchingError",1,["bdk_chain::local_chain::InsertBlockNotMatchingError"]],["impl<A> Sync for TxGraph<A>where
        A: Sync,
    ",1,["bdk_chain::tx_graph::TxGraph"]],["impl<'a, T, A> Sync for TxNode<'a, T, A>where
        A: Sync,
        T: Sync,
    ",1,["bdk_chain::tx_graph::TxNode"]],["impl<'a, T, A> Sync for CanonicalTx<'a, T, A>where
        A: Sync,
        T: Sync,
    ",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<A> Sync for Additions<A>where
        A: Sync,
    ",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, A, F> Sync for TxDescendants<'g, A, F>where
        A: Sync,
        F: Sync,
    ",1,["bdk_chain::tx_graph::TxDescendants"]],["impl<B, C> Sync for Persist<B, C>where
        B: Sync,
        C: Sync,
    ",1,["bdk_chain::persist::Persist"]],["impl<D> Sync for SpkIterator<D>where
        D: Sync,
    ",1,["bdk_chain::spk_iter::SpkIterator"]]], "bdk_coin_select":[["impl Sync for WeightedValue",1,["bdk_coin_select::coin_selector::WeightedValue"]],["impl Sync for CoinSelectorOpt",1,["bdk_coin_select::coin_selector::CoinSelectorOpt"]],["impl<'a> Sync for CoinSelector<'a>",1,["bdk_coin_select::coin_selector::CoinSelector"]],["impl Sync for SelectionError",1,["bdk_coin_select::coin_selector::SelectionError"]],["impl Sync for SelectionConstraint",1,["bdk_coin_select::coin_selector::SelectionConstraint"]],["impl Sync for Selection",1,["bdk_coin_select::coin_selector::Selection"]],["impl Sync for ExcessStrategyKind",1,["bdk_coin_select::coin_selector::ExcessStrategyKind"]],["impl Sync for ExcessStrategy",1,["bdk_coin_select::coin_selector::ExcessStrategy"]],["impl Sync for BranchStrategy",1,["bdk_coin_select::bnb::BranchStrategy"]],["impl<'c, S> Sync for Bnb<'c, S>where
        S: Sync,
    ",1,["bdk_coin_select::bnb::Bnb"]],["impl<'c, 'f, S> !Sync for BnbIter<'c, 'f, S>",1,["bdk_coin_select::bnb::BnbIter"]],["impl Sync for BnbLimit",1,["bdk_coin_select::bnb::BnbLimit"]]], -"bdk_electrum":[["impl<K, P> Sync for ElectrumUpdate<K, P>where
        K: Sync,
        P: Sync,
    ",1,["bdk_electrum::ElectrumUpdate"]]], -"bdk_file_store":[["impl<'t, T> Sync for EntryIter<'t, T>where
        T: Sync,
    ",1,["bdk_file_store::entry_iter::EntryIter"]],["impl Sync for IterError",1,["bdk_file_store::entry_iter::IterError"]],["impl<K, P> Sync for KeychainStore<K, P>where
        K: Sync,
        P: Sync,
    ",1,["bdk_file_store::keychain_store::KeychainStore"]],["impl<'a, C> Sync for Store<'a, C>where
        C: Sync,
    ",1,["bdk_file_store::store::Store"]],["impl<'a> Sync for FileError<'a>",1,["bdk_file_store::FileError"]]], +"bdk_electrum":[["impl<K, A> Sync for ElectrumUpdate<K, A>where
        A: Sync,
        K: Sync,
    ",1,["bdk_electrum::electrum_ext::ElectrumUpdate"]]], +"bdk_file_store":[["impl<'t, T> Sync for EntryIter<'t, T>where
        T: Sync,
    ",1,["bdk_file_store::entry_iter::EntryIter"]],["impl Sync for IterError",1,["bdk_file_store::entry_iter::IterError"]],["impl<'a, C> Sync for Store<'a, C>where
        C: Sync,
    ",1,["bdk_file_store::store::Store"]],["impl<'a> Sync for FileError<'a>",1,["bdk_file_store::FileError"]]], "bdk_tmp_plan":[["impl<Ak> Sync for Requirements<Ak>where
        Ak: Sync,
    ",1,["bdk_tmp_plan::requirements::Requirements"]],["impl<Ak> Sync for RequiredSignatures<Ak>where
        Ak: Sync,
    ",1,["bdk_tmp_plan::requirements::RequiredSignatures"]],["impl Sync for SigningError",1,["bdk_tmp_plan::requirements::SigningError"]],["impl<Ak> Sync for PlanKey<Ak>where
        Ak: Sync,
    ",1,["bdk_tmp_plan::template::PlanKey"]],["impl<AK> Sync for Plan<AK>where
        AK: Sync,
    ",1,["bdk_tmp_plan::Plan"]],["impl Sync for SatisfactionMaterial",1,["bdk_tmp_plan::SatisfactionMaterial"]],["impl<Ak> Sync for PlanState<Ak>where
        Ak: Sync,
    ",1,["bdk_tmp_plan::PlanState"]],["impl<K> Sync for Assets<K>where
        K: Sync,
    ",1,["bdk_tmp_plan::Assets"]]], -"keychain_tracker_electrum_example":[["impl Sync for ElectrumCommands",1,["keychain_tracker_electrum_example::ElectrumCommands"]],["impl Sync for ScanOptions",1,["keychain_tracker_electrum_example::ScanOptions"]]], -"keychain_tracker_esplora_example":[["impl Sync for EsploraCommands",1,["keychain_tracker_esplora_example::EsploraCommands"]],["impl Sync for ScanOptions",1,["keychain_tracker_esplora_example::ScanOptions"]]], -"keychain_tracker_example_cli":[["impl<C> Sync for Args<C>where
        C: Sync,
    ",1,["keychain_tracker_example_cli::Args"]],["impl<C> Sync for Commands<C>where
        C: Sync,
    ",1,["keychain_tracker_example_cli::Commands"]],["impl Sync for CoinSelectionAlgo",1,["keychain_tracker_example_cli::CoinSelectionAlgo"]],["impl Sync for AddressCmd",1,["keychain_tracker_example_cli::AddressCmd"]],["impl Sync for TxOutCmd",1,["keychain_tracker_example_cli::TxOutCmd"]],["impl Sync for Keychain",1,["keychain_tracker_example_cli::Keychain"]],["impl Sync for AddrsOutput",1,["keychain_tracker_example_cli::AddrsOutput"]]] +"example_cli":[["impl<S> Sync for Args<S>where
        S: Sync,
    ",1,["example_cli::Args"]],["impl<S> Sync for Commands<S>where
        S: Sync,
    ",1,["example_cli::Commands"]],["impl Sync for CoinSelectionAlgo",1,["example_cli::CoinSelectionAlgo"]],["impl Sync for AddressCmd",1,["example_cli::AddressCmd"]],["impl Sync for TxOutCmd",1,["example_cli::TxOutCmd"]],["impl Sync for Keychain",1,["example_cli::Keychain"]]], +"example_electrum":[["impl Sync for ElectrumCommands",1,["example_electrum::ElectrumCommands"]],["impl Sync for ScanOptions",1,["example_electrum::ScanOptions"]]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Unpin.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Unpin.js index 6fd328609d..b603db799f 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Unpin.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/marker/trait.Unpin.js @@ -1,11 +1,10 @@ (function() {var implementors = { -"bdk":[["impl Unpin for Error",1,["bdk::error::Error"]],["impl Unpin for Error",1,["bdk::descriptor::error::Error"]],["impl Unpin for PkOrF",1,["bdk::descriptor::policy::PkOrF"]],["impl Unpin for SatisfiableItem",1,["bdk::descriptor::policy::SatisfiableItem"]],["impl Unpin for Satisfaction",1,["bdk::descriptor::policy::Satisfaction"]],["impl Unpin for Policy",1,["bdk::descriptor::policy::Policy"]],["impl Unpin for Condition",1,["bdk::descriptor::policy::Condition"]],["impl Unpin for PolicyError",1,["bdk::descriptor::policy::PolicyError"]],["impl<'a> Unpin for BuildSatisfaction<'a>",1,["bdk::descriptor::policy::BuildSatisfaction"]],["impl<K> Unpin for P2Pkh<K>where
        K: Unpin,
    ",1,["bdk::descriptor::template::P2Pkh"]],["impl<K> Unpin for P2Wpkh_P2Sh<K>where
        K: Unpin,
    ",1,["bdk::descriptor::template::P2Wpkh_P2Sh"]],["impl<K> Unpin for P2Wpkh<K>where
        K: Unpin,
    ",1,["bdk::descriptor::template::P2Wpkh"]],["impl<K> Unpin for Bip44<K>where
        K: Unpin,
    ",1,["bdk::descriptor::template::Bip44"]],["impl<K> Unpin for Bip44Public<K>where
        K: Unpin,
    ",1,["bdk::descriptor::template::Bip44Public"]],["impl<K> Unpin for Bip49<K>where
        K: Unpin,
    ",1,["bdk::descriptor::template::Bip49"]],["impl<K> Unpin for Bip49Public<K>where
        K: Unpin,
    ",1,["bdk::descriptor::template::Bip49Public"]],["impl<K> Unpin for Bip84<K>where
        K: Unpin,
    ",1,["bdk::descriptor::template::Bip84"]],["impl<K> Unpin for Bip84Public<K>where
        K: Unpin,
    ",1,["bdk::descriptor::template::Bip84Public"]],["impl<Ctx> Unpin for DescriptorKey<Ctx>where
        Ctx: Unpin,
    ",1,["bdk::keys::DescriptorKey"]],["impl Unpin for ScriptContextEnum",1,["bdk::keys::ScriptContextEnum"]],["impl<Ctx> Unpin for ExtendedKey<Ctx>where
        Ctx: Unpin,
    ",1,["bdk::keys::ExtendedKey"]],["impl<K, Ctx> Unpin for GeneratedKey<K, Ctx>where
        Ctx: Unpin,
        K: Unpin,
    ",1,["bdk::keys::GeneratedKey"]],["impl Unpin for PrivateKeyGenerateOptions",1,["bdk::keys::PrivateKeyGenerateOptions"]],["impl Unpin for KeyError",1,["bdk::keys::KeyError"]],["impl Unpin for KeychainKind",1,["bdk::types::KeychainKind"]],["impl Unpin for FeeRate",1,["bdk::types::FeeRate"]],["impl Unpin for LocalUtxo",1,["bdk::types::LocalUtxo"]],["impl Unpin for WeightedUtxo",1,["bdk::types::WeightedUtxo"]],["impl Unpin for Utxo",1,["bdk::types::Utxo"]],["impl Unpin for TransactionDetails",1,["bdk::types::TransactionDetails"]],["impl Unpin for Excess",1,["bdk::wallet::coin_selection::Excess"]],["impl Unpin for CoinSelectionResult",1,["bdk::wallet::coin_selection::CoinSelectionResult"]],["impl Unpin for LargestFirstCoinSelection",1,["bdk::wallet::coin_selection::LargestFirstCoinSelection"]],["impl Unpin for OldestFirstCoinSelection",1,["bdk::wallet::coin_selection::OldestFirstCoinSelection"]],["impl Unpin for BranchAndBoundCoinSelection",1,["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]],["impl Unpin for FullyNodedExport",1,["bdk::wallet::export::FullyNodedExport"]],["impl Unpin for SignerId",1,["bdk::wallet::signer::SignerId"]],["impl Unpin for SignerError",1,["bdk::wallet::signer::SignerError"]],["impl Unpin for SignerContext",1,["bdk::wallet::signer::SignerContext"]],["impl<S> Unpin for SignerWrapper<S>where
        S: Unpin,
    ",1,["bdk::wallet::signer::SignerWrapper"]],["impl Unpin for SignerOrdering",1,["bdk::wallet::signer::SignerOrdering"]],["impl Unpin for SignersContainer",1,["bdk::wallet::signer::SignersContainer"]],["impl Unpin for SignOptions",1,["bdk::wallet::signer::SignOptions"]],["impl Unpin for TapLeavesOptions",1,["bdk::wallet::signer::TapLeavesOptions"]],["impl Unpin for CreateTx",1,["bdk::wallet::tx_builder::CreateTx"]],["impl Unpin for BumpFee",1,["bdk::wallet::tx_builder::BumpFee"]],["impl<'a, D, Cs, Ctx> Unpin for TxBuilder<'a, D, Cs, Ctx>where
        Cs: Unpin,
        Ctx: Unpin,
    ",1,["bdk::wallet::tx_builder::TxBuilder"]],["impl Unpin for TxOrdering",1,["bdk::wallet::tx_builder::TxOrdering"]],["impl Unpin for ChangeSpendPolicy",1,["bdk::wallet::tx_builder::ChangeSpendPolicy"]],["impl<D> Unpin for Wallet<D>where
        D: Unpin,
    ",1,["bdk::wallet::Wallet"]],["impl Unpin for AddressIndex",1,["bdk::wallet::AddressIndex"]],["impl Unpin for AddressInfo",1,["bdk::wallet::AddressInfo"]],["impl<P> Unpin for NewError<P>where
        P: Unpin,
    ",1,["bdk::wallet::NewError"]]], -"bdk_chain":[["impl<P> Unpin for ChainGraph<P>where
        P: Unpin,
    ",1,["bdk_chain::chain_graph::ChainGraph"]],["impl<P> Unpin for ChangeSet<P>",1,["bdk_chain::chain_graph::ChangeSet"]],["impl<P> Unpin for NewError<P>where
        P: Unpin,
    ",1,["bdk_chain::chain_graph::NewError"]],["impl<P> Unpin for InsertTxError<P>where
        P: Unpin,
    ",1,["bdk_chain::chain_graph::InsertTxError"]],["impl<P> Unpin for UpdateError<P>where
        P: Unpin,
    ",1,["bdk_chain::chain_graph::UpdateError"]],["impl<P> Unpin for UnresolvableConflict<P>where
        P: Unpin,
    ",1,["bdk_chain::chain_graph::UnresolvableConflict"]],["impl<I> Unpin for SpkTxOutIndex<I>where
        I: Unpin,
    ",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<A> Unpin for ObservedAs<A>where
        A: Unpin,
    ",1,["bdk_chain::chain_data::ObservedAs"]],["impl Unpin for TxHeight",1,["bdk_chain::chain_data::TxHeight"]],["impl Unpin for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Unpin for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl Unpin for ConfirmationHeightAnchor",1,["bdk_chain::chain_data::ConfirmationHeightAnchor"]],["impl Unpin for ConfirmationTimeAnchor",1,["bdk_chain::chain_data::ConfirmationTimeAnchor"]],["impl<P> Unpin for FullTxOut<P>where
        P: Unpin,
    ",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A, I> Unpin for IndexedTxGraph<A, I>where
        I: Unpin,
    ",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> Unpin for IndexedAdditions<A, IA>where
        IA: Unpin,
    ",1,["bdk_chain::indexed_tx_graph::IndexedAdditions"]],["impl<K, P, B> Unpin for Persist<K, P, B>where
        B: Unpin,
    ",1,["bdk_chain::keychain::persist::Persist"]],["impl<K, P> Unpin for KeychainTracker<K, P>where
        K: Unpin,
        P: Unpin,
    ",1,["bdk_chain::keychain::tracker::KeychainTracker"]],["impl<K> Unpin for KeychainTxOutIndex<K>where
        K: Unpin,
    ",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> Unpin for DerivationAdditions<K>",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, P> Unpin for KeychainScan<K, P>where
        P: Unpin,
    ",1,["bdk_chain::keychain::KeychainScan"]],["impl<K, P> Unpin for KeychainChangeSet<K, P>",1,["bdk_chain::keychain::KeychainChangeSet"]],["impl Unpin for Balance",1,["bdk_chain::keychain::Balance"]],["impl Unpin for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl Unpin for UpdateNotConnectedError",1,["bdk_chain::local_chain::UpdateNotConnectedError"]],["impl Unpin for InsertBlockNotMatchingError",1,["bdk_chain::local_chain::InsertBlockNotMatchingError"]],["impl<P> Unpin for SparseChain<P>where
        P: Unpin,
    ",1,["bdk_chain::sparse_chain::SparseChain"]],["impl<P> Unpin for InsertTxError<P>where
        P: Unpin,
    ",1,["bdk_chain::sparse_chain::InsertTxError"]],["impl Unpin for InsertCheckpointError",1,["bdk_chain::sparse_chain::InsertCheckpointError"]],["impl<P> Unpin for UpdateError<P>where
        P: Unpin,
    ",1,["bdk_chain::sparse_chain::UpdateError"]],["impl<P> Unpin for ChangeSet<P>",1,["bdk_chain::sparse_chain::ChangeSet"]],["impl<A> Unpin for TxGraph<A>",1,["bdk_chain::tx_graph::TxGraph"]],["impl<'a, T, A> Unpin for TxNode<'a, T, A>",1,["bdk_chain::tx_graph::TxNode"]],["impl<'a, T, A> Unpin for CanonicalTx<'a, T, A>",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<A> Unpin for Additions<A>",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, A, F> Unpin for TxDescendants<'g, A, F>where
        F: Unpin,
    ",1,["bdk_chain::tx_graph::TxDescendants"]],["impl<B, C> Unpin for Persist<B, C>where
        B: Unpin,
        C: Unpin,
    ",1,["bdk_chain::persist::Persist"]],["impl<D> Unpin for SpkIterator<D>where
        D: Unpin,
    ",1,["bdk_chain::spk_iter::SpkIterator"]]], +"bdk":[["impl Unpin for Error",1,["bdk::error::Error"]],["impl Unpin for Error",1,["bdk::descriptor::error::Error"]],["impl Unpin for PkOrF",1,["bdk::descriptor::policy::PkOrF"]],["impl Unpin for SatisfiableItem",1,["bdk::descriptor::policy::SatisfiableItem"]],["impl Unpin for Satisfaction",1,["bdk::descriptor::policy::Satisfaction"]],["impl Unpin for Policy",1,["bdk::descriptor::policy::Policy"]],["impl Unpin for Condition",1,["bdk::descriptor::policy::Condition"]],["impl Unpin for PolicyError",1,["bdk::descriptor::policy::PolicyError"]],["impl<'a> Unpin for BuildSatisfaction<'a>",1,["bdk::descriptor::policy::BuildSatisfaction"]],["impl<K> Unpin for P2Pkh<K>where
        K: Unpin,
    ",1,["bdk::descriptor::template::P2Pkh"]],["impl<K> Unpin for P2Wpkh_P2Sh<K>where
        K: Unpin,
    ",1,["bdk::descriptor::template::P2Wpkh_P2Sh"]],["impl<K> Unpin for P2Wpkh<K>where
        K: Unpin,
    ",1,["bdk::descriptor::template::P2Wpkh"]],["impl<K> Unpin for Bip44<K>where
        K: Unpin,
    ",1,["bdk::descriptor::template::Bip44"]],["impl<K> Unpin for Bip44Public<K>where
        K: Unpin,
    ",1,["bdk::descriptor::template::Bip44Public"]],["impl<K> Unpin for Bip49<K>where
        K: Unpin,
    ",1,["bdk::descriptor::template::Bip49"]],["impl<K> Unpin for Bip49Public<K>where
        K: Unpin,
    ",1,["bdk::descriptor::template::Bip49Public"]],["impl<K> Unpin for Bip84<K>where
        K: Unpin,
    ",1,["bdk::descriptor::template::Bip84"]],["impl<K> Unpin for Bip84Public<K>where
        K: Unpin,
    ",1,["bdk::descriptor::template::Bip84Public"]],["impl<Ctx> Unpin for DescriptorKey<Ctx>where
        Ctx: Unpin,
    ",1,["bdk::keys::DescriptorKey"]],["impl Unpin for ScriptContextEnum",1,["bdk::keys::ScriptContextEnum"]],["impl<Ctx> Unpin for ExtendedKey<Ctx>where
        Ctx: Unpin,
    ",1,["bdk::keys::ExtendedKey"]],["impl<K, Ctx> Unpin for GeneratedKey<K, Ctx>where
        Ctx: Unpin,
        K: Unpin,
    ",1,["bdk::keys::GeneratedKey"]],["impl Unpin for PrivateKeyGenerateOptions",1,["bdk::keys::PrivateKeyGenerateOptions"]],["impl Unpin for KeyError",1,["bdk::keys::KeyError"]],["impl Unpin for KeychainKind",1,["bdk::types::KeychainKind"]],["impl Unpin for FeeRate",1,["bdk::types::FeeRate"]],["impl Unpin for LocalUtxo",1,["bdk::types::LocalUtxo"]],["impl Unpin for WeightedUtxo",1,["bdk::types::WeightedUtxo"]],["impl Unpin for Utxo",1,["bdk::types::Utxo"]],["impl Unpin for TransactionDetails",1,["bdk::types::TransactionDetails"]],["impl Unpin for Excess",1,["bdk::wallet::coin_selection::Excess"]],["impl Unpin for CoinSelectionResult",1,["bdk::wallet::coin_selection::CoinSelectionResult"]],["impl Unpin for LargestFirstCoinSelection",1,["bdk::wallet::coin_selection::LargestFirstCoinSelection"]],["impl Unpin for OldestFirstCoinSelection",1,["bdk::wallet::coin_selection::OldestFirstCoinSelection"]],["impl Unpin for BranchAndBoundCoinSelection",1,["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]],["impl Unpin for FullyNodedExport",1,["bdk::wallet::export::FullyNodedExport"]],["impl Unpin for SignerId",1,["bdk::wallet::signer::SignerId"]],["impl Unpin for SignerError",1,["bdk::wallet::signer::SignerError"]],["impl Unpin for SignerContext",1,["bdk::wallet::signer::SignerContext"]],["impl<S> Unpin for SignerWrapper<S>where
        S: Unpin,
    ",1,["bdk::wallet::signer::SignerWrapper"]],["impl Unpin for SignerOrdering",1,["bdk::wallet::signer::SignerOrdering"]],["impl Unpin for SignersContainer",1,["bdk::wallet::signer::SignersContainer"]],["impl Unpin for SignOptions",1,["bdk::wallet::signer::SignOptions"]],["impl Unpin for TapLeavesOptions",1,["bdk::wallet::signer::TapLeavesOptions"]],["impl Unpin for CreateTx",1,["bdk::wallet::tx_builder::CreateTx"]],["impl Unpin for BumpFee",1,["bdk::wallet::tx_builder::BumpFee"]],["impl<'a, D, Cs, Ctx> Unpin for TxBuilder<'a, D, Cs, Ctx>where
        Cs: Unpin,
        Ctx: Unpin,
    ",1,["bdk::wallet::tx_builder::TxBuilder"]],["impl Unpin for TxOrdering",1,["bdk::wallet::tx_builder::TxOrdering"]],["impl Unpin for ChangeSpendPolicy",1,["bdk::wallet::tx_builder::ChangeSpendPolicy"]],["impl<D> Unpin for Wallet<D>where
        D: Unpin,
    ",1,["bdk::wallet::Wallet"]],["impl Unpin for AddressIndex",1,["bdk::wallet::AddressIndex"]],["impl Unpin for AddressInfo",1,["bdk::wallet::AddressInfo"]],["impl<P> Unpin for NewError<P>where
        P: Unpin,
    ",1,["bdk::wallet::NewError"]],["impl Unpin for InsertTxError",1,["bdk::wallet::InsertTxError"]]], +"bdk_chain":[["impl<I> Unpin for SpkTxOutIndex<I>where
        I: Unpin,
    ",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<A> Unpin for ChainPosition<A>where
        A: Unpin,
    ",1,["bdk_chain::chain_data::ChainPosition"]],["impl Unpin for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl Unpin for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl Unpin for ConfirmationHeightAnchor",1,["bdk_chain::chain_data::ConfirmationHeightAnchor"]],["impl Unpin for ConfirmationTimeAnchor",1,["bdk_chain::chain_data::ConfirmationTimeAnchor"]],["impl<A> Unpin for FullTxOut<A>where
        A: Unpin,
    ",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A, I> Unpin for IndexedTxGraph<A, I>where
        I: Unpin,
    ",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> Unpin for IndexedAdditions<A, IA>where
        IA: Unpin,
    ",1,["bdk_chain::indexed_tx_graph::IndexedAdditions"]],["impl<K> Unpin for KeychainTxOutIndex<K>where
        K: Unpin,
    ",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> Unpin for DerivationAdditions<K>",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, A> Unpin for LocalUpdate<K, A>",1,["bdk_chain::keychain::LocalUpdate"]],["impl<K, A> Unpin for LocalChangeSet<K, A>",1,["bdk_chain::keychain::LocalChangeSet"]],["impl Unpin for Balance",1,["bdk_chain::keychain::Balance"]],["impl Unpin for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl Unpin for UpdateNotConnectedError",1,["bdk_chain::local_chain::UpdateNotConnectedError"]],["impl Unpin for InsertBlockNotMatchingError",1,["bdk_chain::local_chain::InsertBlockNotMatchingError"]],["impl<A> Unpin for TxGraph<A>",1,["bdk_chain::tx_graph::TxGraph"]],["impl<'a, T, A> Unpin for TxNode<'a, T, A>",1,["bdk_chain::tx_graph::TxNode"]],["impl<'a, T, A> Unpin for CanonicalTx<'a, T, A>",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<A> Unpin for Additions<A>",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, A, F> Unpin for TxDescendants<'g, A, F>where
        F: Unpin,
    ",1,["bdk_chain::tx_graph::TxDescendants"]],["impl<B, C> Unpin for Persist<B, C>where
        B: Unpin,
        C: Unpin,
    ",1,["bdk_chain::persist::Persist"]],["impl<D> Unpin for SpkIterator<D>where
        D: Unpin,
    ",1,["bdk_chain::spk_iter::SpkIterator"]]], "bdk_coin_select":[["impl Unpin for WeightedValue",1,["bdk_coin_select::coin_selector::WeightedValue"]],["impl Unpin for CoinSelectorOpt",1,["bdk_coin_select::coin_selector::CoinSelectorOpt"]],["impl<'a> Unpin for CoinSelector<'a>",1,["bdk_coin_select::coin_selector::CoinSelector"]],["impl Unpin for SelectionError",1,["bdk_coin_select::coin_selector::SelectionError"]],["impl Unpin for SelectionConstraint",1,["bdk_coin_select::coin_selector::SelectionConstraint"]],["impl Unpin for Selection",1,["bdk_coin_select::coin_selector::Selection"]],["impl Unpin for ExcessStrategyKind",1,["bdk_coin_select::coin_selector::ExcessStrategyKind"]],["impl Unpin for ExcessStrategy",1,["bdk_coin_select::coin_selector::ExcessStrategy"]],["impl Unpin for BranchStrategy",1,["bdk_coin_select::bnb::BranchStrategy"]],["impl<'c, S> Unpin for Bnb<'c, S>where
        S: Unpin,
    ",1,["bdk_coin_select::bnb::Bnb"]],["impl<'c, 'f, S> Unpin for BnbIter<'c, 'f, S>where
        S: Unpin,
        'c: 'f,
    ",1,["bdk_coin_select::bnb::BnbIter"]],["impl Unpin for BnbLimit",1,["bdk_coin_select::bnb::BnbLimit"]]], -"bdk_electrum":[["impl<K, P> Unpin for ElectrumUpdate<K, P>where
        P: Unpin,
    ",1,["bdk_electrum::ElectrumUpdate"]]], -"bdk_file_store":[["impl<'t, T> Unpin for EntryIter<'t, T>where
        T: Unpin,
    ",1,["bdk_file_store::entry_iter::EntryIter"]],["impl Unpin for IterError",1,["bdk_file_store::entry_iter::IterError"]],["impl<K, P> Unpin for KeychainStore<K, P>where
        K: Unpin,
        P: Unpin,
    ",1,["bdk_file_store::keychain_store::KeychainStore"]],["impl<'a, C> Unpin for Store<'a, C>where
        C: Unpin,
    ",1,["bdk_file_store::store::Store"]],["impl<'a> Unpin for FileError<'a>",1,["bdk_file_store::FileError"]]], +"bdk_electrum":[["impl<K, A> Unpin for ElectrumUpdate<K, A>",1,["bdk_electrum::electrum_ext::ElectrumUpdate"]]], +"bdk_file_store":[["impl<'t, T> Unpin for EntryIter<'t, T>where
        T: Unpin,
    ",1,["bdk_file_store::entry_iter::EntryIter"]],["impl Unpin for IterError",1,["bdk_file_store::entry_iter::IterError"]],["impl<'a, C> Unpin for Store<'a, C>where
        C: Unpin,
    ",1,["bdk_file_store::store::Store"]],["impl<'a> Unpin for FileError<'a>",1,["bdk_file_store::FileError"]]], "bdk_tmp_plan":[["impl<Ak> Unpin for Requirements<Ak>where
        Ak: Unpin,
    ",1,["bdk_tmp_plan::requirements::Requirements"]],["impl<Ak> Unpin for RequiredSignatures<Ak>where
        Ak: Unpin,
    ",1,["bdk_tmp_plan::requirements::RequiredSignatures"]],["impl Unpin for SigningError",1,["bdk_tmp_plan::requirements::SigningError"]],["impl<Ak> Unpin for PlanKey<Ak>where
        Ak: Unpin,
    ",1,["bdk_tmp_plan::template::PlanKey"]],["impl<AK> Unpin for Plan<AK>where
        AK: Unpin,
    ",1,["bdk_tmp_plan::Plan"]],["impl Unpin for SatisfactionMaterial",1,["bdk_tmp_plan::SatisfactionMaterial"]],["impl<Ak> Unpin for PlanState<Ak>where
        Ak: Unpin,
    ",1,["bdk_tmp_plan::PlanState"]],["impl<K> Unpin for Assets<K>where
        K: Unpin,
    ",1,["bdk_tmp_plan::Assets"]]], -"keychain_tracker_electrum_example":[["impl Unpin for ElectrumCommands",1,["keychain_tracker_electrum_example::ElectrumCommands"]],["impl Unpin for ScanOptions",1,["keychain_tracker_electrum_example::ScanOptions"]]], -"keychain_tracker_esplora_example":[["impl Unpin for EsploraCommands",1,["keychain_tracker_esplora_example::EsploraCommands"]],["impl Unpin for ScanOptions",1,["keychain_tracker_esplora_example::ScanOptions"]]], -"keychain_tracker_example_cli":[["impl<C> Unpin for Args<C>where
        C: Unpin,
    ",1,["keychain_tracker_example_cli::Args"]],["impl<C> Unpin for Commands<C>where
        C: Unpin,
    ",1,["keychain_tracker_example_cli::Commands"]],["impl Unpin for CoinSelectionAlgo",1,["keychain_tracker_example_cli::CoinSelectionAlgo"]],["impl Unpin for AddressCmd",1,["keychain_tracker_example_cli::AddressCmd"]],["impl Unpin for TxOutCmd",1,["keychain_tracker_example_cli::TxOutCmd"]],["impl Unpin for Keychain",1,["keychain_tracker_example_cli::Keychain"]],["impl Unpin for AddrsOutput",1,["keychain_tracker_example_cli::AddrsOutput"]]] +"example_cli":[["impl<S> Unpin for Args<S>where
        S: Unpin,
    ",1,["example_cli::Args"]],["impl<S> Unpin for Commands<S>where
        S: Unpin,
    ",1,["example_cli::Commands"]],["impl Unpin for CoinSelectionAlgo",1,["example_cli::CoinSelectionAlgo"]],["impl Unpin for AddressCmd",1,["example_cli::AddressCmd"]],["impl Unpin for TxOutCmd",1,["example_cli::TxOutCmd"]],["impl Unpin for Keychain",1,["example_cli::Keychain"]]], +"example_electrum":[["impl Unpin for ElectrumCommands",1,["example_electrum::ElectrumCommands"]],["impl Unpin for ScanOptions",1,["example_electrum::ScanOptions"]]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js index 0acde12cc3..8f6e5f145f 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js @@ -1,11 +1,10 @@ (function() {var implementors = { -"bdk":[["impl RefUnwindSafe for Error",1,["bdk::error::Error"]],["impl RefUnwindSafe for Error",1,["bdk::descriptor::error::Error"]],["impl RefUnwindSafe for PkOrF",1,["bdk::descriptor::policy::PkOrF"]],["impl RefUnwindSafe for SatisfiableItem",1,["bdk::descriptor::policy::SatisfiableItem"]],["impl RefUnwindSafe for Satisfaction",1,["bdk::descriptor::policy::Satisfaction"]],["impl RefUnwindSafe for Policy",1,["bdk::descriptor::policy::Policy"]],["impl RefUnwindSafe for Condition",1,["bdk::descriptor::policy::Condition"]],["impl RefUnwindSafe for PolicyError",1,["bdk::descriptor::policy::PolicyError"]],["impl<'a> RefUnwindSafe for BuildSatisfaction<'a>",1,["bdk::descriptor::policy::BuildSatisfaction"]],["impl<K> RefUnwindSafe for P2Pkh<K>where
        K: RefUnwindSafe,
    ",1,["bdk::descriptor::template::P2Pkh"]],["impl<K> RefUnwindSafe for P2Wpkh_P2Sh<K>where
        K: RefUnwindSafe,
    ",1,["bdk::descriptor::template::P2Wpkh_P2Sh"]],["impl<K> RefUnwindSafe for P2Wpkh<K>where
        K: RefUnwindSafe,
    ",1,["bdk::descriptor::template::P2Wpkh"]],["impl<K> RefUnwindSafe for Bip44<K>where
        K: RefUnwindSafe,
    ",1,["bdk::descriptor::template::Bip44"]],["impl<K> RefUnwindSafe for Bip44Public<K>where
        K: RefUnwindSafe,
    ",1,["bdk::descriptor::template::Bip44Public"]],["impl<K> RefUnwindSafe for Bip49<K>where
        K: RefUnwindSafe,
    ",1,["bdk::descriptor::template::Bip49"]],["impl<K> RefUnwindSafe for Bip49Public<K>where
        K: RefUnwindSafe,
    ",1,["bdk::descriptor::template::Bip49Public"]],["impl<K> RefUnwindSafe for Bip84<K>where
        K: RefUnwindSafe,
    ",1,["bdk::descriptor::template::Bip84"]],["impl<K> RefUnwindSafe for Bip84Public<K>where
        K: RefUnwindSafe,
    ",1,["bdk::descriptor::template::Bip84Public"]],["impl<Ctx> RefUnwindSafe for DescriptorKey<Ctx>where
        Ctx: RefUnwindSafe,
    ",1,["bdk::keys::DescriptorKey"]],["impl RefUnwindSafe for ScriptContextEnum",1,["bdk::keys::ScriptContextEnum"]],["impl<Ctx> RefUnwindSafe for ExtendedKey<Ctx>where
        Ctx: RefUnwindSafe,
    ",1,["bdk::keys::ExtendedKey"]],["impl<K, Ctx> RefUnwindSafe for GeneratedKey<K, Ctx>where
        Ctx: RefUnwindSafe,
        K: RefUnwindSafe,
    ",1,["bdk::keys::GeneratedKey"]],["impl RefUnwindSafe for PrivateKeyGenerateOptions",1,["bdk::keys::PrivateKeyGenerateOptions"]],["impl RefUnwindSafe for KeyError",1,["bdk::keys::KeyError"]],["impl RefUnwindSafe for KeychainKind",1,["bdk::types::KeychainKind"]],["impl RefUnwindSafe for FeeRate",1,["bdk::types::FeeRate"]],["impl RefUnwindSafe for LocalUtxo",1,["bdk::types::LocalUtxo"]],["impl RefUnwindSafe for WeightedUtxo",1,["bdk::types::WeightedUtxo"]],["impl RefUnwindSafe for Utxo",1,["bdk::types::Utxo"]],["impl RefUnwindSafe for TransactionDetails",1,["bdk::types::TransactionDetails"]],["impl RefUnwindSafe for Excess",1,["bdk::wallet::coin_selection::Excess"]],["impl RefUnwindSafe for CoinSelectionResult",1,["bdk::wallet::coin_selection::CoinSelectionResult"]],["impl RefUnwindSafe for LargestFirstCoinSelection",1,["bdk::wallet::coin_selection::LargestFirstCoinSelection"]],["impl RefUnwindSafe for OldestFirstCoinSelection",1,["bdk::wallet::coin_selection::OldestFirstCoinSelection"]],["impl RefUnwindSafe for BranchAndBoundCoinSelection",1,["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]],["impl RefUnwindSafe for FullyNodedExport",1,["bdk::wallet::export::FullyNodedExport"]],["impl RefUnwindSafe for SignerId",1,["bdk::wallet::signer::SignerId"]],["impl RefUnwindSafe for SignerError",1,["bdk::wallet::signer::SignerError"]],["impl RefUnwindSafe for SignerContext",1,["bdk::wallet::signer::SignerContext"]],["impl<S> RefUnwindSafe for SignerWrapper<S>where
        S: RefUnwindSafe,
    ",1,["bdk::wallet::signer::SignerWrapper"]],["impl RefUnwindSafe for SignerOrdering",1,["bdk::wallet::signer::SignerOrdering"]],["impl !RefUnwindSafe for SignersContainer",1,["bdk::wallet::signer::SignersContainer"]],["impl RefUnwindSafe for SignOptions",1,["bdk::wallet::signer::SignOptions"]],["impl RefUnwindSafe for TapLeavesOptions",1,["bdk::wallet::signer::TapLeavesOptions"]],["impl RefUnwindSafe for CreateTx",1,["bdk::wallet::tx_builder::CreateTx"]],["impl RefUnwindSafe for BumpFee",1,["bdk::wallet::tx_builder::BumpFee"]],["impl<'a, D, Cs, Ctx> !RefUnwindSafe for TxBuilder<'a, D, Cs, Ctx>",1,["bdk::wallet::tx_builder::TxBuilder"]],["impl RefUnwindSafe for TxOrdering",1,["bdk::wallet::tx_builder::TxOrdering"]],["impl RefUnwindSafe for ChangeSpendPolicy",1,["bdk::wallet::tx_builder::ChangeSpendPolicy"]],["impl<D = ()> !RefUnwindSafe for Wallet<D>",1,["bdk::wallet::Wallet"]],["impl RefUnwindSafe for AddressIndex",1,["bdk::wallet::AddressIndex"]],["impl RefUnwindSafe for AddressInfo",1,["bdk::wallet::AddressInfo"]],["impl<P> RefUnwindSafe for NewError<P>where
        P: RefUnwindSafe,
    ",1,["bdk::wallet::NewError"]]], -"bdk_chain":[["impl<P> RefUnwindSafe for ChainGraph<P>where
        P: RefUnwindSafe,
    ",1,["bdk_chain::chain_graph::ChainGraph"]],["impl<P> RefUnwindSafe for ChangeSet<P>where
        P: RefUnwindSafe,
    ",1,["bdk_chain::chain_graph::ChangeSet"]],["impl<P> RefUnwindSafe for NewError<P>where
        P: RefUnwindSafe,
    ",1,["bdk_chain::chain_graph::NewError"]],["impl<P> RefUnwindSafe for InsertTxError<P>where
        P: RefUnwindSafe,
    ",1,["bdk_chain::chain_graph::InsertTxError"]],["impl<P> RefUnwindSafe for UpdateError<P>where
        P: RefUnwindSafe,
    ",1,["bdk_chain::chain_graph::UpdateError"]],["impl<P> RefUnwindSafe for UnresolvableConflict<P>where
        P: RefUnwindSafe,
    ",1,["bdk_chain::chain_graph::UnresolvableConflict"]],["impl<I> RefUnwindSafe for SpkTxOutIndex<I>where
        I: RefUnwindSafe,
    ",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<A> RefUnwindSafe for ObservedAs<A>where
        A: RefUnwindSafe,
    ",1,["bdk_chain::chain_data::ObservedAs"]],["impl RefUnwindSafe for TxHeight",1,["bdk_chain::chain_data::TxHeight"]],["impl RefUnwindSafe for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl RefUnwindSafe for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl RefUnwindSafe for ConfirmationHeightAnchor",1,["bdk_chain::chain_data::ConfirmationHeightAnchor"]],["impl RefUnwindSafe for ConfirmationTimeAnchor",1,["bdk_chain::chain_data::ConfirmationTimeAnchor"]],["impl<P> RefUnwindSafe for FullTxOut<P>where
        P: RefUnwindSafe,
    ",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A, I> RefUnwindSafe for IndexedTxGraph<A, I>where
        A: RefUnwindSafe,
        I: RefUnwindSafe,
    ",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> RefUnwindSafe for IndexedAdditions<A, IA>where
        A: RefUnwindSafe,
        IA: RefUnwindSafe,
    ",1,["bdk_chain::indexed_tx_graph::IndexedAdditions"]],["impl<K, P, B> RefUnwindSafe for Persist<K, P, B>where
        B: RefUnwindSafe,
        K: RefUnwindSafe,
        P: RefUnwindSafe,
    ",1,["bdk_chain::keychain::persist::Persist"]],["impl<K, P> RefUnwindSafe for KeychainTracker<K, P>where
        K: RefUnwindSafe,
        P: RefUnwindSafe,
    ",1,["bdk_chain::keychain::tracker::KeychainTracker"]],["impl<K> RefUnwindSafe for KeychainTxOutIndex<K>where
        K: RefUnwindSafe,
    ",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> RefUnwindSafe for DerivationAdditions<K>where
        K: RefUnwindSafe,
    ",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, P> RefUnwindSafe for KeychainScan<K, P>where
        K: RefUnwindSafe,
        P: RefUnwindSafe,
    ",1,["bdk_chain::keychain::KeychainScan"]],["impl<K, P> RefUnwindSafe for KeychainChangeSet<K, P>where
        K: RefUnwindSafe,
        P: RefUnwindSafe,
    ",1,["bdk_chain::keychain::KeychainChangeSet"]],["impl RefUnwindSafe for Balance",1,["bdk_chain::keychain::Balance"]],["impl RefUnwindSafe for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl RefUnwindSafe for UpdateNotConnectedError",1,["bdk_chain::local_chain::UpdateNotConnectedError"]],["impl RefUnwindSafe for InsertBlockNotMatchingError",1,["bdk_chain::local_chain::InsertBlockNotMatchingError"]],["impl<P> RefUnwindSafe for SparseChain<P>where
        P: RefUnwindSafe,
    ",1,["bdk_chain::sparse_chain::SparseChain"]],["impl<P> RefUnwindSafe for InsertTxError<P>where
        P: RefUnwindSafe,
    ",1,["bdk_chain::sparse_chain::InsertTxError"]],["impl RefUnwindSafe for InsertCheckpointError",1,["bdk_chain::sparse_chain::InsertCheckpointError"]],["impl<P> RefUnwindSafe for UpdateError<P>where
        P: RefUnwindSafe,
    ",1,["bdk_chain::sparse_chain::UpdateError"]],["impl<P> RefUnwindSafe for ChangeSet<P>where
        P: RefUnwindSafe,
    ",1,["bdk_chain::sparse_chain::ChangeSet"]],["impl<A> RefUnwindSafe for TxGraph<A>where
        A: RefUnwindSafe,
    ",1,["bdk_chain::tx_graph::TxGraph"]],["impl<'a, T, A> RefUnwindSafe for TxNode<'a, T, A>where
        A: RefUnwindSafe,
        T: RefUnwindSafe,
    ",1,["bdk_chain::tx_graph::TxNode"]],["impl<'a, T, A> RefUnwindSafe for CanonicalTx<'a, T, A>where
        A: RefUnwindSafe,
        T: RefUnwindSafe,
    ",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<A> RefUnwindSafe for Additions<A>where
        A: RefUnwindSafe,
    ",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, A, F> RefUnwindSafe for TxDescendants<'g, A, F>where
        A: RefUnwindSafe,
        F: RefUnwindSafe,
    ",1,["bdk_chain::tx_graph::TxDescendants"]],["impl<B, C> RefUnwindSafe for Persist<B, C>where
        B: RefUnwindSafe,
        C: RefUnwindSafe,
    ",1,["bdk_chain::persist::Persist"]],["impl<D> RefUnwindSafe for SpkIterator<D>where
        D: RefUnwindSafe,
    ",1,["bdk_chain::spk_iter::SpkIterator"]]], +"bdk":[["impl RefUnwindSafe for Error",1,["bdk::error::Error"]],["impl RefUnwindSafe for Error",1,["bdk::descriptor::error::Error"]],["impl RefUnwindSafe for PkOrF",1,["bdk::descriptor::policy::PkOrF"]],["impl RefUnwindSafe for SatisfiableItem",1,["bdk::descriptor::policy::SatisfiableItem"]],["impl RefUnwindSafe for Satisfaction",1,["bdk::descriptor::policy::Satisfaction"]],["impl RefUnwindSafe for Policy",1,["bdk::descriptor::policy::Policy"]],["impl RefUnwindSafe for Condition",1,["bdk::descriptor::policy::Condition"]],["impl RefUnwindSafe for PolicyError",1,["bdk::descriptor::policy::PolicyError"]],["impl<'a> RefUnwindSafe for BuildSatisfaction<'a>",1,["bdk::descriptor::policy::BuildSatisfaction"]],["impl<K> RefUnwindSafe for P2Pkh<K>where
        K: RefUnwindSafe,
    ",1,["bdk::descriptor::template::P2Pkh"]],["impl<K> RefUnwindSafe for P2Wpkh_P2Sh<K>where
        K: RefUnwindSafe,
    ",1,["bdk::descriptor::template::P2Wpkh_P2Sh"]],["impl<K> RefUnwindSafe for P2Wpkh<K>where
        K: RefUnwindSafe,
    ",1,["bdk::descriptor::template::P2Wpkh"]],["impl<K> RefUnwindSafe for Bip44<K>where
        K: RefUnwindSafe,
    ",1,["bdk::descriptor::template::Bip44"]],["impl<K> RefUnwindSafe for Bip44Public<K>where
        K: RefUnwindSafe,
    ",1,["bdk::descriptor::template::Bip44Public"]],["impl<K> RefUnwindSafe for Bip49<K>where
        K: RefUnwindSafe,
    ",1,["bdk::descriptor::template::Bip49"]],["impl<K> RefUnwindSafe for Bip49Public<K>where
        K: RefUnwindSafe,
    ",1,["bdk::descriptor::template::Bip49Public"]],["impl<K> RefUnwindSafe for Bip84<K>where
        K: RefUnwindSafe,
    ",1,["bdk::descriptor::template::Bip84"]],["impl<K> RefUnwindSafe for Bip84Public<K>where
        K: RefUnwindSafe,
    ",1,["bdk::descriptor::template::Bip84Public"]],["impl<Ctx> RefUnwindSafe for DescriptorKey<Ctx>where
        Ctx: RefUnwindSafe,
    ",1,["bdk::keys::DescriptorKey"]],["impl RefUnwindSafe for ScriptContextEnum",1,["bdk::keys::ScriptContextEnum"]],["impl<Ctx> RefUnwindSafe for ExtendedKey<Ctx>where
        Ctx: RefUnwindSafe,
    ",1,["bdk::keys::ExtendedKey"]],["impl<K, Ctx> RefUnwindSafe for GeneratedKey<K, Ctx>where
        Ctx: RefUnwindSafe,
        K: RefUnwindSafe,
    ",1,["bdk::keys::GeneratedKey"]],["impl RefUnwindSafe for PrivateKeyGenerateOptions",1,["bdk::keys::PrivateKeyGenerateOptions"]],["impl RefUnwindSafe for KeyError",1,["bdk::keys::KeyError"]],["impl RefUnwindSafe for KeychainKind",1,["bdk::types::KeychainKind"]],["impl RefUnwindSafe for FeeRate",1,["bdk::types::FeeRate"]],["impl RefUnwindSafe for LocalUtxo",1,["bdk::types::LocalUtxo"]],["impl RefUnwindSafe for WeightedUtxo",1,["bdk::types::WeightedUtxo"]],["impl RefUnwindSafe for Utxo",1,["bdk::types::Utxo"]],["impl RefUnwindSafe for TransactionDetails",1,["bdk::types::TransactionDetails"]],["impl RefUnwindSafe for Excess",1,["bdk::wallet::coin_selection::Excess"]],["impl RefUnwindSafe for CoinSelectionResult",1,["bdk::wallet::coin_selection::CoinSelectionResult"]],["impl RefUnwindSafe for LargestFirstCoinSelection",1,["bdk::wallet::coin_selection::LargestFirstCoinSelection"]],["impl RefUnwindSafe for OldestFirstCoinSelection",1,["bdk::wallet::coin_selection::OldestFirstCoinSelection"]],["impl RefUnwindSafe for BranchAndBoundCoinSelection",1,["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]],["impl RefUnwindSafe for FullyNodedExport",1,["bdk::wallet::export::FullyNodedExport"]],["impl RefUnwindSafe for SignerId",1,["bdk::wallet::signer::SignerId"]],["impl RefUnwindSafe for SignerError",1,["bdk::wallet::signer::SignerError"]],["impl RefUnwindSafe for SignerContext",1,["bdk::wallet::signer::SignerContext"]],["impl<S> RefUnwindSafe for SignerWrapper<S>where
        S: RefUnwindSafe,
    ",1,["bdk::wallet::signer::SignerWrapper"]],["impl RefUnwindSafe for SignerOrdering",1,["bdk::wallet::signer::SignerOrdering"]],["impl !RefUnwindSafe for SignersContainer",1,["bdk::wallet::signer::SignersContainer"]],["impl RefUnwindSafe for SignOptions",1,["bdk::wallet::signer::SignOptions"]],["impl RefUnwindSafe for TapLeavesOptions",1,["bdk::wallet::signer::TapLeavesOptions"]],["impl RefUnwindSafe for CreateTx",1,["bdk::wallet::tx_builder::CreateTx"]],["impl RefUnwindSafe for BumpFee",1,["bdk::wallet::tx_builder::BumpFee"]],["impl<'a, D, Cs, Ctx> !RefUnwindSafe for TxBuilder<'a, D, Cs, Ctx>",1,["bdk::wallet::tx_builder::TxBuilder"]],["impl RefUnwindSafe for TxOrdering",1,["bdk::wallet::tx_builder::TxOrdering"]],["impl RefUnwindSafe for ChangeSpendPolicy",1,["bdk::wallet::tx_builder::ChangeSpendPolicy"]],["impl<D = ()> !RefUnwindSafe for Wallet<D>",1,["bdk::wallet::Wallet"]],["impl RefUnwindSafe for AddressIndex",1,["bdk::wallet::AddressIndex"]],["impl RefUnwindSafe for AddressInfo",1,["bdk::wallet::AddressInfo"]],["impl<P> RefUnwindSafe for NewError<P>where
        P: RefUnwindSafe,
    ",1,["bdk::wallet::NewError"]],["impl RefUnwindSafe for InsertTxError",1,["bdk::wallet::InsertTxError"]]], +"bdk_chain":[["impl<I> RefUnwindSafe for SpkTxOutIndex<I>where
        I: RefUnwindSafe,
    ",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<A> RefUnwindSafe for ChainPosition<A>where
        A: RefUnwindSafe,
    ",1,["bdk_chain::chain_data::ChainPosition"]],["impl RefUnwindSafe for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl RefUnwindSafe for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl RefUnwindSafe for ConfirmationHeightAnchor",1,["bdk_chain::chain_data::ConfirmationHeightAnchor"]],["impl RefUnwindSafe for ConfirmationTimeAnchor",1,["bdk_chain::chain_data::ConfirmationTimeAnchor"]],["impl<A> RefUnwindSafe for FullTxOut<A>where
        A: RefUnwindSafe,
    ",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A, I> RefUnwindSafe for IndexedTxGraph<A, I>where
        A: RefUnwindSafe,
        I: RefUnwindSafe,
    ",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> RefUnwindSafe for IndexedAdditions<A, IA>where
        A: RefUnwindSafe,
        IA: RefUnwindSafe,
    ",1,["bdk_chain::indexed_tx_graph::IndexedAdditions"]],["impl<K> RefUnwindSafe for KeychainTxOutIndex<K>where
        K: RefUnwindSafe,
    ",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> RefUnwindSafe for DerivationAdditions<K>where
        K: RefUnwindSafe,
    ",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, A> RefUnwindSafe for LocalUpdate<K, A>where
        A: RefUnwindSafe,
        K: RefUnwindSafe,
    ",1,["bdk_chain::keychain::LocalUpdate"]],["impl<K, A> RefUnwindSafe for LocalChangeSet<K, A>where
        A: RefUnwindSafe,
        K: RefUnwindSafe,
    ",1,["bdk_chain::keychain::LocalChangeSet"]],["impl RefUnwindSafe for Balance",1,["bdk_chain::keychain::Balance"]],["impl RefUnwindSafe for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl RefUnwindSafe for UpdateNotConnectedError",1,["bdk_chain::local_chain::UpdateNotConnectedError"]],["impl RefUnwindSafe for InsertBlockNotMatchingError",1,["bdk_chain::local_chain::InsertBlockNotMatchingError"]],["impl<A> RefUnwindSafe for TxGraph<A>where
        A: RefUnwindSafe,
    ",1,["bdk_chain::tx_graph::TxGraph"]],["impl<'a, T, A> RefUnwindSafe for TxNode<'a, T, A>where
        A: RefUnwindSafe,
        T: RefUnwindSafe,
    ",1,["bdk_chain::tx_graph::TxNode"]],["impl<'a, T, A> RefUnwindSafe for CanonicalTx<'a, T, A>where
        A: RefUnwindSafe,
        T: RefUnwindSafe,
    ",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<A> RefUnwindSafe for Additions<A>where
        A: RefUnwindSafe,
    ",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, A, F> RefUnwindSafe for TxDescendants<'g, A, F>where
        A: RefUnwindSafe,
        F: RefUnwindSafe,
    ",1,["bdk_chain::tx_graph::TxDescendants"]],["impl<B, C> RefUnwindSafe for Persist<B, C>where
        B: RefUnwindSafe,
        C: RefUnwindSafe,
    ",1,["bdk_chain::persist::Persist"]],["impl<D> RefUnwindSafe for SpkIterator<D>where
        D: RefUnwindSafe,
    ",1,["bdk_chain::spk_iter::SpkIterator"]]], "bdk_coin_select":[["impl RefUnwindSafe for WeightedValue",1,["bdk_coin_select::coin_selector::WeightedValue"]],["impl RefUnwindSafe for CoinSelectorOpt",1,["bdk_coin_select::coin_selector::CoinSelectorOpt"]],["impl<'a> RefUnwindSafe for CoinSelector<'a>",1,["bdk_coin_select::coin_selector::CoinSelector"]],["impl RefUnwindSafe for SelectionError",1,["bdk_coin_select::coin_selector::SelectionError"]],["impl RefUnwindSafe for SelectionConstraint",1,["bdk_coin_select::coin_selector::SelectionConstraint"]],["impl RefUnwindSafe for Selection",1,["bdk_coin_select::coin_selector::Selection"]],["impl RefUnwindSafe for ExcessStrategyKind",1,["bdk_coin_select::coin_selector::ExcessStrategyKind"]],["impl RefUnwindSafe for ExcessStrategy",1,["bdk_coin_select::coin_selector::ExcessStrategy"]],["impl RefUnwindSafe for BranchStrategy",1,["bdk_coin_select::bnb::BranchStrategy"]],["impl<'c, S> RefUnwindSafe for Bnb<'c, S>where
        S: RefUnwindSafe,
    ",1,["bdk_coin_select::bnb::Bnb"]],["impl<'c, 'f, S> !RefUnwindSafe for BnbIter<'c, 'f, S>",1,["bdk_coin_select::bnb::BnbIter"]],["impl RefUnwindSafe for BnbLimit",1,["bdk_coin_select::bnb::BnbLimit"]]], -"bdk_electrum":[["impl<K, P> RefUnwindSafe for ElectrumUpdate<K, P>where
        K: RefUnwindSafe,
        P: RefUnwindSafe,
    ",1,["bdk_electrum::ElectrumUpdate"]]], -"bdk_file_store":[["impl<'t, T> RefUnwindSafe for EntryIter<'t, T>where
        T: RefUnwindSafe,
    ",1,["bdk_file_store::entry_iter::EntryIter"]],["impl !RefUnwindSafe for IterError",1,["bdk_file_store::entry_iter::IterError"]],["impl<K, P> RefUnwindSafe for KeychainStore<K, P>where
        K: RefUnwindSafe,
        P: RefUnwindSafe,
    ",1,["bdk_file_store::keychain_store::KeychainStore"]],["impl<'a, C> RefUnwindSafe for Store<'a, C>where
        C: RefUnwindSafe,
    ",1,["bdk_file_store::store::Store"]],["impl<'a> !RefUnwindSafe for FileError<'a>",1,["bdk_file_store::FileError"]]], +"bdk_electrum":[["impl<K, A> RefUnwindSafe for ElectrumUpdate<K, A>where
        A: RefUnwindSafe,
        K: RefUnwindSafe,
    ",1,["bdk_electrum::electrum_ext::ElectrumUpdate"]]], +"bdk_file_store":[["impl<'t, T> RefUnwindSafe for EntryIter<'t, T>where
        T: RefUnwindSafe,
    ",1,["bdk_file_store::entry_iter::EntryIter"]],["impl !RefUnwindSafe for IterError",1,["bdk_file_store::entry_iter::IterError"]],["impl<'a, C> RefUnwindSafe for Store<'a, C>where
        C: RefUnwindSafe,
    ",1,["bdk_file_store::store::Store"]],["impl<'a> !RefUnwindSafe for FileError<'a>",1,["bdk_file_store::FileError"]]], "bdk_tmp_plan":[["impl<Ak> RefUnwindSafe for Requirements<Ak>where
        Ak: RefUnwindSafe,
    ",1,["bdk_tmp_plan::requirements::Requirements"]],["impl<Ak> RefUnwindSafe for RequiredSignatures<Ak>where
        Ak: RefUnwindSafe,
    ",1,["bdk_tmp_plan::requirements::RequiredSignatures"]],["impl RefUnwindSafe for SigningError",1,["bdk_tmp_plan::requirements::SigningError"]],["impl<Ak> RefUnwindSafe for PlanKey<Ak>where
        Ak: RefUnwindSafe,
    ",1,["bdk_tmp_plan::template::PlanKey"]],["impl<AK> RefUnwindSafe for Plan<AK>where
        AK: RefUnwindSafe,
    ",1,["bdk_tmp_plan::Plan"]],["impl RefUnwindSafe for SatisfactionMaterial",1,["bdk_tmp_plan::SatisfactionMaterial"]],["impl<Ak> RefUnwindSafe for PlanState<Ak>where
        Ak: RefUnwindSafe,
    ",1,["bdk_tmp_plan::PlanState"]],["impl<K> RefUnwindSafe for Assets<K>where
        K: RefUnwindSafe,
    ",1,["bdk_tmp_plan::Assets"]]], -"keychain_tracker_electrum_example":[["impl RefUnwindSafe for ElectrumCommands",1,["keychain_tracker_electrum_example::ElectrumCommands"]],["impl RefUnwindSafe for ScanOptions",1,["keychain_tracker_electrum_example::ScanOptions"]]], -"keychain_tracker_esplora_example":[["impl RefUnwindSafe for EsploraCommands",1,["keychain_tracker_esplora_example::EsploraCommands"]],["impl RefUnwindSafe for ScanOptions",1,["keychain_tracker_esplora_example::ScanOptions"]]], -"keychain_tracker_example_cli":[["impl<C> RefUnwindSafe for Args<C>where
        C: RefUnwindSafe,
    ",1,["keychain_tracker_example_cli::Args"]],["impl<C> RefUnwindSafe for Commands<C>where
        C: RefUnwindSafe,
    ",1,["keychain_tracker_example_cli::Commands"]],["impl RefUnwindSafe for CoinSelectionAlgo",1,["keychain_tracker_example_cli::CoinSelectionAlgo"]],["impl RefUnwindSafe for AddressCmd",1,["keychain_tracker_example_cli::AddressCmd"]],["impl RefUnwindSafe for TxOutCmd",1,["keychain_tracker_example_cli::TxOutCmd"]],["impl RefUnwindSafe for Keychain",1,["keychain_tracker_example_cli::Keychain"]],["impl RefUnwindSafe for AddrsOutput",1,["keychain_tracker_example_cli::AddrsOutput"]]] +"example_cli":[["impl<S> RefUnwindSafe for Args<S>where
        S: RefUnwindSafe,
    ",1,["example_cli::Args"]],["impl<S> RefUnwindSafe for Commands<S>where
        S: RefUnwindSafe,
    ",1,["example_cli::Commands"]],["impl RefUnwindSafe for CoinSelectionAlgo",1,["example_cli::CoinSelectionAlgo"]],["impl RefUnwindSafe for AddressCmd",1,["example_cli::AddressCmd"]],["impl RefUnwindSafe for TxOutCmd",1,["example_cli::TxOutCmd"]],["impl RefUnwindSafe for Keychain",1,["example_cli::Keychain"]]], +"example_electrum":[["impl RefUnwindSafe for ElectrumCommands",1,["example_electrum::ElectrumCommands"]],["impl RefUnwindSafe for ScanOptions",1,["example_electrum::ScanOptions"]]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.UnwindSafe.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.UnwindSafe.js index 3d7c30a583..8ea1f5bff9 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.UnwindSafe.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/panic/unwind_safe/trait.UnwindSafe.js @@ -1,11 +1,10 @@ (function() {var implementors = { -"bdk":[["impl UnwindSafe for Error",1,["bdk::error::Error"]],["impl UnwindSafe for Error",1,["bdk::descriptor::error::Error"]],["impl UnwindSafe for PkOrF",1,["bdk::descriptor::policy::PkOrF"]],["impl UnwindSafe for SatisfiableItem",1,["bdk::descriptor::policy::SatisfiableItem"]],["impl UnwindSafe for Satisfaction",1,["bdk::descriptor::policy::Satisfaction"]],["impl UnwindSafe for Policy",1,["bdk::descriptor::policy::Policy"]],["impl UnwindSafe for Condition",1,["bdk::descriptor::policy::Condition"]],["impl UnwindSafe for PolicyError",1,["bdk::descriptor::policy::PolicyError"]],["impl<'a> UnwindSafe for BuildSatisfaction<'a>",1,["bdk::descriptor::policy::BuildSatisfaction"]],["impl<K> UnwindSafe for P2Pkh<K>where
        K: UnwindSafe,
    ",1,["bdk::descriptor::template::P2Pkh"]],["impl<K> UnwindSafe for P2Wpkh_P2Sh<K>where
        K: UnwindSafe,
    ",1,["bdk::descriptor::template::P2Wpkh_P2Sh"]],["impl<K> UnwindSafe for P2Wpkh<K>where
        K: UnwindSafe,
    ",1,["bdk::descriptor::template::P2Wpkh"]],["impl<K> UnwindSafe for Bip44<K>where
        K: UnwindSafe,
    ",1,["bdk::descriptor::template::Bip44"]],["impl<K> UnwindSafe for Bip44Public<K>where
        K: UnwindSafe,
    ",1,["bdk::descriptor::template::Bip44Public"]],["impl<K> UnwindSafe for Bip49<K>where
        K: UnwindSafe,
    ",1,["bdk::descriptor::template::Bip49"]],["impl<K> UnwindSafe for Bip49Public<K>where
        K: UnwindSafe,
    ",1,["bdk::descriptor::template::Bip49Public"]],["impl<K> UnwindSafe for Bip84<K>where
        K: UnwindSafe,
    ",1,["bdk::descriptor::template::Bip84"]],["impl<K> UnwindSafe for Bip84Public<K>where
        K: UnwindSafe,
    ",1,["bdk::descriptor::template::Bip84Public"]],["impl<Ctx> UnwindSafe for DescriptorKey<Ctx>where
        Ctx: UnwindSafe,
    ",1,["bdk::keys::DescriptorKey"]],["impl UnwindSafe for ScriptContextEnum",1,["bdk::keys::ScriptContextEnum"]],["impl<Ctx> UnwindSafe for ExtendedKey<Ctx>where
        Ctx: UnwindSafe,
    ",1,["bdk::keys::ExtendedKey"]],["impl<K, Ctx> UnwindSafe for GeneratedKey<K, Ctx>where
        Ctx: UnwindSafe,
        K: UnwindSafe,
    ",1,["bdk::keys::GeneratedKey"]],["impl UnwindSafe for PrivateKeyGenerateOptions",1,["bdk::keys::PrivateKeyGenerateOptions"]],["impl UnwindSafe for KeyError",1,["bdk::keys::KeyError"]],["impl UnwindSafe for KeychainKind",1,["bdk::types::KeychainKind"]],["impl UnwindSafe for FeeRate",1,["bdk::types::FeeRate"]],["impl UnwindSafe for LocalUtxo",1,["bdk::types::LocalUtxo"]],["impl UnwindSafe for WeightedUtxo",1,["bdk::types::WeightedUtxo"]],["impl UnwindSafe for Utxo",1,["bdk::types::Utxo"]],["impl UnwindSafe for TransactionDetails",1,["bdk::types::TransactionDetails"]],["impl UnwindSafe for Excess",1,["bdk::wallet::coin_selection::Excess"]],["impl UnwindSafe for CoinSelectionResult",1,["bdk::wallet::coin_selection::CoinSelectionResult"]],["impl UnwindSafe for LargestFirstCoinSelection",1,["bdk::wallet::coin_selection::LargestFirstCoinSelection"]],["impl UnwindSafe for OldestFirstCoinSelection",1,["bdk::wallet::coin_selection::OldestFirstCoinSelection"]],["impl UnwindSafe for BranchAndBoundCoinSelection",1,["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]],["impl UnwindSafe for FullyNodedExport",1,["bdk::wallet::export::FullyNodedExport"]],["impl UnwindSafe for SignerId",1,["bdk::wallet::signer::SignerId"]],["impl UnwindSafe for SignerError",1,["bdk::wallet::signer::SignerError"]],["impl UnwindSafe for SignerContext",1,["bdk::wallet::signer::SignerContext"]],["impl<S> UnwindSafe for SignerWrapper<S>where
        S: UnwindSafe,
    ",1,["bdk::wallet::signer::SignerWrapper"]],["impl UnwindSafe for SignerOrdering",1,["bdk::wallet::signer::SignerOrdering"]],["impl !UnwindSafe for SignersContainer",1,["bdk::wallet::signer::SignersContainer"]],["impl UnwindSafe for SignOptions",1,["bdk::wallet::signer::SignOptions"]],["impl UnwindSafe for TapLeavesOptions",1,["bdk::wallet::signer::TapLeavesOptions"]],["impl UnwindSafe for CreateTx",1,["bdk::wallet::tx_builder::CreateTx"]],["impl UnwindSafe for BumpFee",1,["bdk::wallet::tx_builder::BumpFee"]],["impl<'a, D, Cs, Ctx> !UnwindSafe for TxBuilder<'a, D, Cs, Ctx>",1,["bdk::wallet::tx_builder::TxBuilder"]],["impl UnwindSafe for TxOrdering",1,["bdk::wallet::tx_builder::TxOrdering"]],["impl UnwindSafe for ChangeSpendPolicy",1,["bdk::wallet::tx_builder::ChangeSpendPolicy"]],["impl<D = ()> !UnwindSafe for Wallet<D>",1,["bdk::wallet::Wallet"]],["impl UnwindSafe for AddressIndex",1,["bdk::wallet::AddressIndex"]],["impl UnwindSafe for AddressInfo",1,["bdk::wallet::AddressInfo"]],["impl<P> UnwindSafe for NewError<P>where
        P: UnwindSafe,
    ",1,["bdk::wallet::NewError"]]], -"bdk_chain":[["impl<P> UnwindSafe for ChainGraph<P>where
        P: UnwindSafe + RefUnwindSafe,
    ",1,["bdk_chain::chain_graph::ChainGraph"]],["impl<P> UnwindSafe for ChangeSet<P>where
        P: RefUnwindSafe,
    ",1,["bdk_chain::chain_graph::ChangeSet"]],["impl<P> UnwindSafe for NewError<P>where
        P: UnwindSafe,
    ",1,["bdk_chain::chain_graph::NewError"]],["impl<P> UnwindSafe for InsertTxError<P>where
        P: UnwindSafe,
    ",1,["bdk_chain::chain_graph::InsertTxError"]],["impl<P> UnwindSafe for UpdateError<P>where
        P: UnwindSafe,
    ",1,["bdk_chain::chain_graph::UpdateError"]],["impl<P> UnwindSafe for UnresolvableConflict<P>where
        P: UnwindSafe,
    ",1,["bdk_chain::chain_graph::UnresolvableConflict"]],["impl<I> UnwindSafe for SpkTxOutIndex<I>where
        I: UnwindSafe + RefUnwindSafe,
    ",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<A> UnwindSafe for ObservedAs<A>where
        A: UnwindSafe,
    ",1,["bdk_chain::chain_data::ObservedAs"]],["impl UnwindSafe for TxHeight",1,["bdk_chain::chain_data::TxHeight"]],["impl UnwindSafe for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl UnwindSafe for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl UnwindSafe for ConfirmationHeightAnchor",1,["bdk_chain::chain_data::ConfirmationHeightAnchor"]],["impl UnwindSafe for ConfirmationTimeAnchor",1,["bdk_chain::chain_data::ConfirmationTimeAnchor"]],["impl<P> UnwindSafe for FullTxOut<P>where
        P: UnwindSafe,
    ",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A, I> UnwindSafe for IndexedTxGraph<A, I>where
        A: RefUnwindSafe,
        I: UnwindSafe,
    ",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> UnwindSafe for IndexedAdditions<A, IA>where
        A: RefUnwindSafe,
        IA: UnwindSafe,
    ",1,["bdk_chain::indexed_tx_graph::IndexedAdditions"]],["impl<K, P, B> UnwindSafe for Persist<K, P, B>where
        B: UnwindSafe,
        K: RefUnwindSafe,
        P: RefUnwindSafe,
    ",1,["bdk_chain::keychain::persist::Persist"]],["impl<K, P> UnwindSafe for KeychainTracker<K, P>where
        K: UnwindSafe + RefUnwindSafe,
        P: UnwindSafe + RefUnwindSafe,
    ",1,["bdk_chain::keychain::tracker::KeychainTracker"]],["impl<K> UnwindSafe for KeychainTxOutIndex<K>where
        K: UnwindSafe + RefUnwindSafe,
    ",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> UnwindSafe for DerivationAdditions<K>where
        K: RefUnwindSafe,
    ",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, P> UnwindSafe for KeychainScan<K, P>where
        K: RefUnwindSafe,
        P: UnwindSafe + RefUnwindSafe,
    ",1,["bdk_chain::keychain::KeychainScan"]],["impl<K, P> UnwindSafe for KeychainChangeSet<K, P>where
        K: RefUnwindSafe,
        P: RefUnwindSafe,
    ",1,["bdk_chain::keychain::KeychainChangeSet"]],["impl UnwindSafe for Balance",1,["bdk_chain::keychain::Balance"]],["impl UnwindSafe for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl UnwindSafe for UpdateNotConnectedError",1,["bdk_chain::local_chain::UpdateNotConnectedError"]],["impl UnwindSafe for InsertBlockNotMatchingError",1,["bdk_chain::local_chain::InsertBlockNotMatchingError"]],["impl<P> UnwindSafe for SparseChain<P>where
        P: UnwindSafe + RefUnwindSafe,
    ",1,["bdk_chain::sparse_chain::SparseChain"]],["impl<P> UnwindSafe for InsertTxError<P>where
        P: UnwindSafe,
    ",1,["bdk_chain::sparse_chain::InsertTxError"]],["impl UnwindSafe for InsertCheckpointError",1,["bdk_chain::sparse_chain::InsertCheckpointError"]],["impl<P> UnwindSafe for UpdateError<P>where
        P: UnwindSafe,
    ",1,["bdk_chain::sparse_chain::UpdateError"]],["impl<P> UnwindSafe for ChangeSet<P>where
        P: RefUnwindSafe,
    ",1,["bdk_chain::sparse_chain::ChangeSet"]],["impl<A> UnwindSafe for TxGraph<A>where
        A: RefUnwindSafe,
    ",1,["bdk_chain::tx_graph::TxGraph"]],["impl<'a, T, A> UnwindSafe for TxNode<'a, T, A>where
        A: RefUnwindSafe,
        T: RefUnwindSafe,
    ",1,["bdk_chain::tx_graph::TxNode"]],["impl<'a, T, A> UnwindSafe for CanonicalTx<'a, T, A>where
        A: RefUnwindSafe,
        T: RefUnwindSafe,
    ",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<A> UnwindSafe for Additions<A>where
        A: RefUnwindSafe,
    ",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, A, F> UnwindSafe for TxDescendants<'g, A, F>where
        A: RefUnwindSafe,
        F: UnwindSafe,
    ",1,["bdk_chain::tx_graph::TxDescendants"]],["impl<B, C> UnwindSafe for Persist<B, C>where
        B: UnwindSafe,
        C: UnwindSafe,
    ",1,["bdk_chain::persist::Persist"]],["impl<D> UnwindSafe for SpkIterator<D>where
        D: UnwindSafe,
    ",1,["bdk_chain::spk_iter::SpkIterator"]]], +"bdk":[["impl UnwindSafe for Error",1,["bdk::error::Error"]],["impl UnwindSafe for Error",1,["bdk::descriptor::error::Error"]],["impl UnwindSafe for PkOrF",1,["bdk::descriptor::policy::PkOrF"]],["impl UnwindSafe for SatisfiableItem",1,["bdk::descriptor::policy::SatisfiableItem"]],["impl UnwindSafe for Satisfaction",1,["bdk::descriptor::policy::Satisfaction"]],["impl UnwindSafe for Policy",1,["bdk::descriptor::policy::Policy"]],["impl UnwindSafe for Condition",1,["bdk::descriptor::policy::Condition"]],["impl UnwindSafe for PolicyError",1,["bdk::descriptor::policy::PolicyError"]],["impl<'a> UnwindSafe for BuildSatisfaction<'a>",1,["bdk::descriptor::policy::BuildSatisfaction"]],["impl<K> UnwindSafe for P2Pkh<K>where
        K: UnwindSafe,
    ",1,["bdk::descriptor::template::P2Pkh"]],["impl<K> UnwindSafe for P2Wpkh_P2Sh<K>where
        K: UnwindSafe,
    ",1,["bdk::descriptor::template::P2Wpkh_P2Sh"]],["impl<K> UnwindSafe for P2Wpkh<K>where
        K: UnwindSafe,
    ",1,["bdk::descriptor::template::P2Wpkh"]],["impl<K> UnwindSafe for Bip44<K>where
        K: UnwindSafe,
    ",1,["bdk::descriptor::template::Bip44"]],["impl<K> UnwindSafe for Bip44Public<K>where
        K: UnwindSafe,
    ",1,["bdk::descriptor::template::Bip44Public"]],["impl<K> UnwindSafe for Bip49<K>where
        K: UnwindSafe,
    ",1,["bdk::descriptor::template::Bip49"]],["impl<K> UnwindSafe for Bip49Public<K>where
        K: UnwindSafe,
    ",1,["bdk::descriptor::template::Bip49Public"]],["impl<K> UnwindSafe for Bip84<K>where
        K: UnwindSafe,
    ",1,["bdk::descriptor::template::Bip84"]],["impl<K> UnwindSafe for Bip84Public<K>where
        K: UnwindSafe,
    ",1,["bdk::descriptor::template::Bip84Public"]],["impl<Ctx> UnwindSafe for DescriptorKey<Ctx>where
        Ctx: UnwindSafe,
    ",1,["bdk::keys::DescriptorKey"]],["impl UnwindSafe for ScriptContextEnum",1,["bdk::keys::ScriptContextEnum"]],["impl<Ctx> UnwindSafe for ExtendedKey<Ctx>where
        Ctx: UnwindSafe,
    ",1,["bdk::keys::ExtendedKey"]],["impl<K, Ctx> UnwindSafe for GeneratedKey<K, Ctx>where
        Ctx: UnwindSafe,
        K: UnwindSafe,
    ",1,["bdk::keys::GeneratedKey"]],["impl UnwindSafe for PrivateKeyGenerateOptions",1,["bdk::keys::PrivateKeyGenerateOptions"]],["impl UnwindSafe for KeyError",1,["bdk::keys::KeyError"]],["impl UnwindSafe for KeychainKind",1,["bdk::types::KeychainKind"]],["impl UnwindSafe for FeeRate",1,["bdk::types::FeeRate"]],["impl UnwindSafe for LocalUtxo",1,["bdk::types::LocalUtxo"]],["impl UnwindSafe for WeightedUtxo",1,["bdk::types::WeightedUtxo"]],["impl UnwindSafe for Utxo",1,["bdk::types::Utxo"]],["impl UnwindSafe for TransactionDetails",1,["bdk::types::TransactionDetails"]],["impl UnwindSafe for Excess",1,["bdk::wallet::coin_selection::Excess"]],["impl UnwindSafe for CoinSelectionResult",1,["bdk::wallet::coin_selection::CoinSelectionResult"]],["impl UnwindSafe for LargestFirstCoinSelection",1,["bdk::wallet::coin_selection::LargestFirstCoinSelection"]],["impl UnwindSafe for OldestFirstCoinSelection",1,["bdk::wallet::coin_selection::OldestFirstCoinSelection"]],["impl UnwindSafe for BranchAndBoundCoinSelection",1,["bdk::wallet::coin_selection::BranchAndBoundCoinSelection"]],["impl UnwindSafe for FullyNodedExport",1,["bdk::wallet::export::FullyNodedExport"]],["impl UnwindSafe for SignerId",1,["bdk::wallet::signer::SignerId"]],["impl UnwindSafe for SignerError",1,["bdk::wallet::signer::SignerError"]],["impl UnwindSafe for SignerContext",1,["bdk::wallet::signer::SignerContext"]],["impl<S> UnwindSafe for SignerWrapper<S>where
        S: UnwindSafe,
    ",1,["bdk::wallet::signer::SignerWrapper"]],["impl UnwindSafe for SignerOrdering",1,["bdk::wallet::signer::SignerOrdering"]],["impl !UnwindSafe for SignersContainer",1,["bdk::wallet::signer::SignersContainer"]],["impl UnwindSafe for SignOptions",1,["bdk::wallet::signer::SignOptions"]],["impl UnwindSafe for TapLeavesOptions",1,["bdk::wallet::signer::TapLeavesOptions"]],["impl UnwindSafe for CreateTx",1,["bdk::wallet::tx_builder::CreateTx"]],["impl UnwindSafe for BumpFee",1,["bdk::wallet::tx_builder::BumpFee"]],["impl<'a, D, Cs, Ctx> !UnwindSafe for TxBuilder<'a, D, Cs, Ctx>",1,["bdk::wallet::tx_builder::TxBuilder"]],["impl UnwindSafe for TxOrdering",1,["bdk::wallet::tx_builder::TxOrdering"]],["impl UnwindSafe for ChangeSpendPolicy",1,["bdk::wallet::tx_builder::ChangeSpendPolicy"]],["impl<D = ()> !UnwindSafe for Wallet<D>",1,["bdk::wallet::Wallet"]],["impl UnwindSafe for AddressIndex",1,["bdk::wallet::AddressIndex"]],["impl UnwindSafe for AddressInfo",1,["bdk::wallet::AddressInfo"]],["impl<P> UnwindSafe for NewError<P>where
        P: UnwindSafe,
    ",1,["bdk::wallet::NewError"]],["impl UnwindSafe for InsertTxError",1,["bdk::wallet::InsertTxError"]]], +"bdk_chain":[["impl<I> UnwindSafe for SpkTxOutIndex<I>where
        I: UnwindSafe + RefUnwindSafe,
    ",1,["bdk_chain::spk_txout_index::SpkTxOutIndex"]],["impl<A> UnwindSafe for ChainPosition<A>where
        A: UnwindSafe,
    ",1,["bdk_chain::chain_data::ChainPosition"]],["impl UnwindSafe for ConfirmationTime",1,["bdk_chain::chain_data::ConfirmationTime"]],["impl UnwindSafe for BlockId",1,["bdk_chain::chain_data::BlockId"]],["impl UnwindSafe for ConfirmationHeightAnchor",1,["bdk_chain::chain_data::ConfirmationHeightAnchor"]],["impl UnwindSafe for ConfirmationTimeAnchor",1,["bdk_chain::chain_data::ConfirmationTimeAnchor"]],["impl<A> UnwindSafe for FullTxOut<A>where
        A: UnwindSafe,
    ",1,["bdk_chain::chain_data::FullTxOut"]],["impl<A, I> UnwindSafe for IndexedTxGraph<A, I>where
        A: RefUnwindSafe,
        I: UnwindSafe,
    ",1,["bdk_chain::indexed_tx_graph::IndexedTxGraph"]],["impl<A, IA> UnwindSafe for IndexedAdditions<A, IA>where
        A: RefUnwindSafe,
        IA: UnwindSafe,
    ",1,["bdk_chain::indexed_tx_graph::IndexedAdditions"]],["impl<K> UnwindSafe for KeychainTxOutIndex<K>where
        K: UnwindSafe + RefUnwindSafe,
    ",1,["bdk_chain::keychain::txout_index::KeychainTxOutIndex"]],["impl<K> UnwindSafe for DerivationAdditions<K>where
        K: RefUnwindSafe,
    ",1,["bdk_chain::keychain::DerivationAdditions"]],["impl<K, A> UnwindSafe for LocalUpdate<K, A>where
        A: RefUnwindSafe,
        K: RefUnwindSafe,
    ",1,["bdk_chain::keychain::LocalUpdate"]],["impl<K, A> UnwindSafe for LocalChangeSet<K, A>where
        A: RefUnwindSafe,
        K: RefUnwindSafe,
    ",1,["bdk_chain::keychain::LocalChangeSet"]],["impl UnwindSafe for Balance",1,["bdk_chain::keychain::Balance"]],["impl UnwindSafe for LocalChain",1,["bdk_chain::local_chain::LocalChain"]],["impl UnwindSafe for UpdateNotConnectedError",1,["bdk_chain::local_chain::UpdateNotConnectedError"]],["impl UnwindSafe for InsertBlockNotMatchingError",1,["bdk_chain::local_chain::InsertBlockNotMatchingError"]],["impl<A> UnwindSafe for TxGraph<A>where
        A: RefUnwindSafe,
    ",1,["bdk_chain::tx_graph::TxGraph"]],["impl<'a, T, A> UnwindSafe for TxNode<'a, T, A>where
        A: RefUnwindSafe,
        T: RefUnwindSafe,
    ",1,["bdk_chain::tx_graph::TxNode"]],["impl<'a, T, A> UnwindSafe for CanonicalTx<'a, T, A>where
        A: RefUnwindSafe,
        T: RefUnwindSafe,
    ",1,["bdk_chain::tx_graph::CanonicalTx"]],["impl<A> UnwindSafe for Additions<A>where
        A: RefUnwindSafe,
    ",1,["bdk_chain::tx_graph::Additions"]],["impl<'g, A, F> UnwindSafe for TxDescendants<'g, A, F>where
        A: RefUnwindSafe,
        F: UnwindSafe,
    ",1,["bdk_chain::tx_graph::TxDescendants"]],["impl<B, C> UnwindSafe for Persist<B, C>where
        B: UnwindSafe,
        C: UnwindSafe,
    ",1,["bdk_chain::persist::Persist"]],["impl<D> UnwindSafe for SpkIterator<D>where
        D: UnwindSafe,
    ",1,["bdk_chain::spk_iter::SpkIterator"]]], "bdk_coin_select":[["impl UnwindSafe for WeightedValue",1,["bdk_coin_select::coin_selector::WeightedValue"]],["impl UnwindSafe for CoinSelectorOpt",1,["bdk_coin_select::coin_selector::CoinSelectorOpt"]],["impl<'a> UnwindSafe for CoinSelector<'a>",1,["bdk_coin_select::coin_selector::CoinSelector"]],["impl UnwindSafe for SelectionError",1,["bdk_coin_select::coin_selector::SelectionError"]],["impl UnwindSafe for SelectionConstraint",1,["bdk_coin_select::coin_selector::SelectionConstraint"]],["impl UnwindSafe for Selection",1,["bdk_coin_select::coin_selector::Selection"]],["impl UnwindSafe for ExcessStrategyKind",1,["bdk_coin_select::coin_selector::ExcessStrategyKind"]],["impl UnwindSafe for ExcessStrategy",1,["bdk_coin_select::coin_selector::ExcessStrategy"]],["impl UnwindSafe for BranchStrategy",1,["bdk_coin_select::bnb::BranchStrategy"]],["impl<'c, S> UnwindSafe for Bnb<'c, S>where
        S: UnwindSafe,
    ",1,["bdk_coin_select::bnb::Bnb"]],["impl<'c, 'f, S> !UnwindSafe for BnbIter<'c, 'f, S>",1,["bdk_coin_select::bnb::BnbIter"]],["impl UnwindSafe for BnbLimit",1,["bdk_coin_select::bnb::BnbLimit"]]], -"bdk_electrum":[["impl<K, P> UnwindSafe for ElectrumUpdate<K, P>where
        K: RefUnwindSafe,
        P: UnwindSafe + RefUnwindSafe,
    ",1,["bdk_electrum::ElectrumUpdate"]]], -"bdk_file_store":[["impl<'t, T> !UnwindSafe for EntryIter<'t, T>",1,["bdk_file_store::entry_iter::EntryIter"]],["impl !UnwindSafe for IterError",1,["bdk_file_store::entry_iter::IterError"]],["impl<K, P> UnwindSafe for KeychainStore<K, P>where
        K: UnwindSafe,
        P: UnwindSafe,
    ",1,["bdk_file_store::keychain_store::KeychainStore"]],["impl<'a, C> UnwindSafe for Store<'a, C>where
        C: UnwindSafe,
    ",1,["bdk_file_store::store::Store"]],["impl<'a> !UnwindSafe for FileError<'a>",1,["bdk_file_store::FileError"]]], +"bdk_electrum":[["impl<K, A> UnwindSafe for ElectrumUpdate<K, A>where
        A: RefUnwindSafe,
        K: RefUnwindSafe,
    ",1,["bdk_electrum::electrum_ext::ElectrumUpdate"]]], +"bdk_file_store":[["impl<'t, T> !UnwindSafe for EntryIter<'t, T>",1,["bdk_file_store::entry_iter::EntryIter"]],["impl !UnwindSafe for IterError",1,["bdk_file_store::entry_iter::IterError"]],["impl<'a, C> UnwindSafe for Store<'a, C>where
        C: UnwindSafe,
    ",1,["bdk_file_store::store::Store"]],["impl<'a> !UnwindSafe for FileError<'a>",1,["bdk_file_store::FileError"]]], "bdk_tmp_plan":[["impl<Ak> UnwindSafe for Requirements<Ak>where
        Ak: UnwindSafe,
    ",1,["bdk_tmp_plan::requirements::Requirements"]],["impl<Ak> UnwindSafe for RequiredSignatures<Ak>where
        Ak: UnwindSafe,
    ",1,["bdk_tmp_plan::requirements::RequiredSignatures"]],["impl UnwindSafe for SigningError",1,["bdk_tmp_plan::requirements::SigningError"]],["impl<Ak> UnwindSafe for PlanKey<Ak>where
        Ak: UnwindSafe,
    ",1,["bdk_tmp_plan::template::PlanKey"]],["impl<AK> UnwindSafe for Plan<AK>where
        AK: UnwindSafe,
    ",1,["bdk_tmp_plan::Plan"]],["impl UnwindSafe for SatisfactionMaterial",1,["bdk_tmp_plan::SatisfactionMaterial"]],["impl<Ak> UnwindSafe for PlanState<Ak>where
        Ak: UnwindSafe,
    ",1,["bdk_tmp_plan::PlanState"]],["impl<K> UnwindSafe for Assets<K>where
        K: UnwindSafe,
    ",1,["bdk_tmp_plan::Assets"]]], -"keychain_tracker_electrum_example":[["impl UnwindSafe for ElectrumCommands",1,["keychain_tracker_electrum_example::ElectrumCommands"]],["impl UnwindSafe for ScanOptions",1,["keychain_tracker_electrum_example::ScanOptions"]]], -"keychain_tracker_esplora_example":[["impl UnwindSafe for EsploraCommands",1,["keychain_tracker_esplora_example::EsploraCommands"]],["impl UnwindSafe for ScanOptions",1,["keychain_tracker_esplora_example::ScanOptions"]]], -"keychain_tracker_example_cli":[["impl<C> UnwindSafe for Args<C>where
        C: UnwindSafe,
    ",1,["keychain_tracker_example_cli::Args"]],["impl<C> UnwindSafe for Commands<C>where
        C: UnwindSafe,
    ",1,["keychain_tracker_example_cli::Commands"]],["impl UnwindSafe for CoinSelectionAlgo",1,["keychain_tracker_example_cli::CoinSelectionAlgo"]],["impl UnwindSafe for AddressCmd",1,["keychain_tracker_example_cli::AddressCmd"]],["impl UnwindSafe for TxOutCmd",1,["keychain_tracker_example_cli::TxOutCmd"]],["impl UnwindSafe for Keychain",1,["keychain_tracker_example_cli::Keychain"]],["impl UnwindSafe for AddrsOutput",1,["keychain_tracker_example_cli::AddrsOutput"]]] +"example_cli":[["impl<S> UnwindSafe for Args<S>where
        S: UnwindSafe,
    ",1,["example_cli::Args"]],["impl<S> UnwindSafe for Commands<S>where
        S: UnwindSafe,
    ",1,["example_cli::Commands"]],["impl UnwindSafe for CoinSelectionAlgo",1,["example_cli::CoinSelectionAlgo"]],["impl UnwindSafe for AddressCmd",1,["example_cli::AddressCmd"]],["impl UnwindSafe for TxOutCmd",1,["example_cli::TxOutCmd"]],["impl UnwindSafe for Keychain",1,["example_cli::Keychain"]]], +"example_electrum":[["impl UnwindSafe for ElectrumCommands",1,["example_electrum::ElectrumCommands"]],["impl UnwindSafe for ScanOptions",1,["example_electrum::ScanOptions"]]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/str/traits/trait.FromStr.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/str/traits/trait.FromStr.js index 4b898ef908..9ec6b1958f 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/str/traits/trait.FromStr.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/core/str/traits/trait.FromStr.js @@ -1,4 +1,4 @@ (function() {var implementors = { "bdk":[["impl FromStr for FullyNodedExport"]], -"keychain_tracker_example_cli":[["impl FromStr for CoinSelectionAlgo"]] +"example_cli":[["impl FromStr for CoinSelectionAlgo"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/de/trait.Deserialize.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/de/trait.Deserialize.js index 3f78bf519c..20c3cfc9e3 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/de/trait.Deserialize.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/de/trait.Deserialize.js @@ -1,5 +1,5 @@ (function() {var implementors = { -"bdk":[["impl<'de> Deserialize<'de> for KeychainKind"],["impl<'de> Deserialize<'de> for LocalUtxo"],["impl<'de> Deserialize<'de> for TransactionDetails"],["impl<'de> Deserialize<'de> for FullyNodedExport"]], -"bdk_chain":[["impl<'de, P> Deserialize<'de> for ChangeSet<P>where
        P: Deserialize<'de>,
    "],["impl<'de> Deserialize<'de> for TxHeight"],["impl<'de> Deserialize<'de> for ConfirmationTime"],["impl<'de> Deserialize<'de> for BlockId"],["impl<'de> Deserialize<'de> for ConfirmationHeightAnchor"],["impl<'de> Deserialize<'de> for ConfirmationTimeAnchor"],["impl<'de, A, IA> Deserialize<'de> for IndexedAdditions<A, IA>where
        A: Ord + Deserialize<'de>,
        IA: Deserialize<'de>,
    "],["impl<'de, K> Deserialize<'de> for DerivationAdditions<K>where
        K: Ord + Deserialize<'de>,
    "],["impl<'de, K, P> Deserialize<'de> for KeychainChangeSet<K, P>where
        K: Ord + Deserialize<'de>,
        P: Deserialize<'de>,
    "],["impl<'de> Deserialize<'de> for Balance"],["impl<'de, P> Deserialize<'de> for ChangeSet<P>where
        P: Deserialize<'de>,
    "],["impl<'de, A> Deserialize<'de> for Additions<A>where
        A: Ord + Deserialize<'de>,
    "]], -"keychain_tracker_example_cli":[["impl<'de> Deserialize<'de> for Keychain"],["impl<'de> Deserialize<'de> for AddrsOutput"]] +"bdk":[["impl<'de> Deserialize<'de> for KeychainKind"],["impl<'de> Deserialize<'de> for LocalUtxo"],["impl<'de> Deserialize<'de> for TransactionDetails"],["impl<'de> Deserialize<'de> for FullyNodedExport"]], +"bdk_chain":[["impl<'de> Deserialize<'de> for ConfirmationTime"],["impl<'de> Deserialize<'de> for BlockId"],["impl<'de> Deserialize<'de> for ConfirmationHeightAnchor"],["impl<'de> Deserialize<'de> for ConfirmationTimeAnchor"],["impl<'de, A, IA> Deserialize<'de> for IndexedAdditions<A, IA>where
        A: Ord + Deserialize<'de>,
        IA: Deserialize<'de>,
    "],["impl<'de, K> Deserialize<'de> for DerivationAdditions<K>where
        K: Ord + Deserialize<'de>,
    "],["impl<'de, K, A> Deserialize<'de> for LocalChangeSet<K, A>where
        K: Ord + Deserialize<'de>,
        A: Ord + Deserialize<'de>,
    "],["impl<'de> Deserialize<'de> for Balance"],["impl<'de, A> Deserialize<'de> for Additions<A>where
        A: Ord + Deserialize<'de>,
    "]], +"example_cli":[["impl<'de> Deserialize<'de> for Keychain"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/ser/trait.Serialize.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/ser/trait.Serialize.js index c46fe45a6d..88290d5daf 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/ser/trait.Serialize.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/implementors/serde/ser/trait.Serialize.js @@ -1,5 +1,5 @@ (function() {var implementors = { -"bdk":[["impl Serialize for PkOrF"],["impl Serialize for SatisfiableItem"],["impl Serialize for Satisfaction"],["impl Serialize for Policy"],["impl Serialize for Condition"],["impl Serialize for KeychainKind"],["impl Serialize for LocalUtxo"],["impl Serialize for TransactionDetails"],["impl Serialize for FullyNodedExport"]], -"bdk_chain":[["impl<P> Serialize for ChangeSet<P>where
        P: Serialize,
    "],["impl Serialize for TxHeight"],["impl Serialize for ConfirmationTime"],["impl Serialize for BlockId"],["impl Serialize for ConfirmationHeightAnchor"],["impl Serialize for ConfirmationTimeAnchor"],["impl<A, IA> Serialize for IndexedAdditions<A, IA>where
        A: Ord + Serialize,
        IA: Serialize,
    "],["impl<K> Serialize for DerivationAdditions<K>where
        K: Ord + Serialize,
    "],["impl<K, P> Serialize for KeychainChangeSet<K, P>where
        K: Ord + Serialize,
        P: Serialize,
    "],["impl Serialize for Balance"],["impl<P> Serialize for ChangeSet<P>where
        P: Serialize,
    "],["impl<A> Serialize for Additions<A>where
        A: Ord + Serialize,
    "]], -"keychain_tracker_example_cli":[["impl Serialize for Keychain"],["impl Serialize for AddrsOutput"]] +"bdk":[["impl Serialize for PkOrF"],["impl Serialize for SatisfiableItem"],["impl Serialize for Satisfaction"],["impl Serialize for Policy"],["impl Serialize for Condition"],["impl Serialize for KeychainKind"],["impl Serialize for LocalUtxo"],["impl Serialize for TransactionDetails"],["impl Serialize for FullyNodedExport"]], +"bdk_chain":[["impl Serialize for ConfirmationTime"],["impl Serialize for BlockId"],["impl Serialize for ConfirmationHeightAnchor"],["impl Serialize for ConfirmationTimeAnchor"],["impl<A, IA> Serialize for IndexedAdditions<A, IA>where
        A: Ord + Serialize,
        IA: Serialize,
    "],["impl<K> Serialize for DerivationAdditions<K>where
        K: Ord + Serialize,
    "],["impl<K, A> Serialize for LocalChangeSet<K, A>where
        K: Ord + Serialize,
        A: Ord + Serialize,
    "],["impl Serialize for Balance"],["impl<A> Serialize for Additions<A>where
        A: Ord + Serialize,
    "]], +"example_cli":[["impl Serialize for Keychain"]] };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/enum.ElectrumCommands.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/enum.ElectrumCommands.html deleted file mode 100644 index 6eaa0f257d..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/enum.ElectrumCommands.html +++ /dev/null @@ -1,24 +0,0 @@ -ElectrumCommands in keychain_tracker_electrum_example - Rust
    pub(crate) enum ElectrumCommands {
    -    Scan {
    -        stop_gap: usize,
    -        scan_options: ScanOptions,
    -    },
    -    Sync {
    -        unused_spks: bool,
    -        all_spks: bool,
    -        utxos: bool,
    -        unconfirmed: bool,
    -        scan_options: ScanOptions,
    -    },
    -}

    Variants§

    §

    Scan

    Fields

    §stop_gap: usize

    When a gap this large has been found for a keychain, it will stop.

    -
    §scan_options: ScanOptions

    Scans the addresses in the wallet using the esplora API.

    -
    §

    Sync

    Fields

    §unused_spks: bool

    Scan all the unused addresses.

    -
    §all_spks: bool

    Scan every address that you have derived.

    -
    §utxos: bool

    Scan unspent outpoints for spends or changes to confirmation status of residing tx.

    -
    §unconfirmed: bool

    Scan unconfirmed transactions for updates.

    -
    §scan_options: ScanOptions

    Scans particular addresses using the esplora API.

    -

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Assign values from ArgMatches to self.
    Assign values from ArgMatches to self.
    Append to [Command] so it can instantiate Self. Read more
    Append to [Command] so it can update self. Read more
    Test whether Self can parse a specific subcommand

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/fn.main.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/fn.main.html deleted file mode 100644 index c784201a5f..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/fn.main.html +++ /dev/null @@ -1 +0,0 @@ -main in keychain_tracker_electrum_example - Rust
    pub(crate) fn main() -> Result<()>
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/index.html deleted file mode 100644 index 61e3011028..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/index.html +++ /dev/null @@ -1 +0,0 @@ -keychain_tracker_electrum_example - Rust
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/sidebar-items.js deleted file mode 100644 index cdafc02ec3..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/sidebar-items.js +++ /dev/null @@ -1 +0,0 @@ -window.SIDEBAR_ITEMS = {"enum":[["ElectrumCommands",""]],"fn":[["main",""]],"struct":[["ScanOptions",""]]}; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/struct.ScanOptions.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/struct.ScanOptions.html deleted file mode 100644 index a159c4e348..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/struct.ScanOptions.html +++ /dev/null @@ -1,10 +0,0 @@ -ScanOptions in keychain_tracker_electrum_example - Rust
    pub struct ScanOptions {
    -    pub batch_size: usize,
    -}

    Fields§

    §batch_size: usize

    Set batch size for each script_history call to electrum client.

    -

    Trait Implementations§

    Append to [Command] so it can instantiate Self. Read more
    Append to [Command] so it can update self. Read more
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Deprecated, replaced with CommandFactory::command
    Deprecated, replaced with CommandFactory::command_for_update
    Build a [Command] that can instantiate Self. Read more
    Build a [Command] that can update self. Read more
    Formats the value using the given formatter. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Assign values from ArgMatches to self.
    Assign values from ArgMatches to self.
    Parse from std::env::args_os(), exit on error
    Parse from std::env::args_os(), return Err on error.
    Parse from iterator, exit on error
    Parse from iterator, return Err on error.
    Update from iterator, exit on error
    Update from iterator, return Err on error.
    This method tests for self and other values to be equal, and is used -by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/all.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/all.html deleted file mode 100644 index 466d67d62e..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/all.html +++ /dev/null @@ -1 +0,0 @@ -List of all items in this crate

    List of all items

    Structs

    Enums

    Functions

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/enum.EsploraCommands.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/enum.EsploraCommands.html deleted file mode 100644 index 100a3724bb..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/enum.EsploraCommands.html +++ /dev/null @@ -1,28 +0,0 @@ -EsploraCommands in keychain_tracker_esplora_example - Rust
    pub(crate) enum EsploraCommands {
    -    Scan {
    -        stop_gap: usize,
    -        scan_options: ScanOptions,
    -    },
    -    Sync {
    -        unused_spks: bool,
    -        all_spks: bool,
    -        utxos: bool,
    -        unconfirmed: bool,
    -        scan_options: ScanOptions,
    -    },
    -}

    Variants§

    §

    Scan

    Fields

    §stop_gap: usize

    When a gap this large has been found for a keychain, it will stop.

    -
    §scan_options: ScanOptions

    Scans the addresses in the wallet using the esplora API.

    -
    §

    Sync

    Fields

    §unused_spks: bool

    Scan all the unused addresses.

    -
    §all_spks: bool

    Scan every address that you have derived.

    -
    §utxos: bool

    Scan unspent outpoints for spends or changes to confirmation status of residing tx.

    -
    §unconfirmed: bool

    Scan unconfirmed transactions for updates.

    -
    §scan_options: ScanOptions

    Scans particular addresses using esplora API.

    -

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Assign values from ArgMatches to self.
    Assign values from ArgMatches to self.
    Append to [Command] so it can instantiate Self. Read more
    Append to [Command] so it can update self. Read more
    Test whether Self can parse a specific subcommand

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -
    Instruments this type with the provided Span, returning an -Instrumented wrapper. Read more
    Instruments this type with the current Span, returning an -Instrumented wrapper. Read more

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    Attaches the provided Subscriber to this type, returning a -WithDispatch wrapper. Read more
    Attaches the current default Subscriber to this type, returning a -WithDispatch wrapper. Read more
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/fn.main.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/fn.main.html deleted file mode 100644 index 2093bd41c2..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/fn.main.html +++ /dev/null @@ -1 +0,0 @@ -main in keychain_tracker_esplora_example - Rust
    pub(crate) fn main() -> Result<()>
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/index.html deleted file mode 100644 index 637b49cfb4..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/index.html +++ /dev/null @@ -1 +0,0 @@ -keychain_tracker_esplora_example - Rust
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/sidebar-items.js deleted file mode 100644 index 130d54f1e1..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/sidebar-items.js +++ /dev/null @@ -1 +0,0 @@ -window.SIDEBAR_ITEMS = {"enum":[["EsploraCommands",""]],"fn":[["main",""]],"struct":[["ScanOptions",""]]}; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/struct.ScanOptions.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/struct.ScanOptions.html deleted file mode 100644 index 07dedd7c19..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_esplora_example/struct.ScanOptions.html +++ /dev/null @@ -1,13 +0,0 @@ -ScanOptions in keychain_tracker_esplora_example - Rust
    pub struct ScanOptions {
    -    pub parallel_requests: usize,
    -}

    Fields§

    §parallel_requests: usize

    Trait Implementations§

    Append to [Command] so it can instantiate Self. Read more
    Append to [Command] so it can update self. Read more
    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Deprecated, replaced with CommandFactory::command
    Deprecated, replaced with CommandFactory::command_for_update
    Build a [Command] that can instantiate Self. Read more
    Build a [Command] that can update self. Read more
    Formats the value using the given formatter. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Assign values from ArgMatches to self.
    Assign values from ArgMatches to self.
    Parse from std::env::args_os(), exit on error
    Parse from std::env::args_os(), return Err on error.
    Parse from iterator, exit on error
    Parse from iterator, return Err on error.
    Update from iterator, exit on error
    Update from iterator, return Err on error.
    This method tests for self and other values to be equal, and is used -by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -
    Instruments this type with the provided Span, returning an -Instrumented wrapper. Read more
    Instruments this type with the current Span, returning an -Instrumented wrapper. Read more

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    Attaches the provided Subscriber to this type, returning a -WithDispatch wrapper. Read more
    Attaches the current default Subscriber to this type, returning a -WithDispatch wrapper. Read more
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/all.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/all.html deleted file mode 100644 index fb1892946a..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/all.html +++ /dev/null @@ -1 +0,0 @@ -List of all items in this crate
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.AddressCmd.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.AddressCmd.html deleted file mode 100644 index 696d46bd7a..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.AddressCmd.html +++ /dev/null @@ -1,15 +0,0 @@ -AddressCmd in keychain_tracker_example_cli - Rust
    pub enum AddressCmd {
    -    Next,
    -    New,
    -    List {
    -        change: bool,
    -    },
    -    Index,
    -}

    Variants§

    §

    Next

    Get the next unused address.

    -
    §

    New

    Get a new address regardless of the existing unused addresses.

    -
    §

    List

    Fields

    §change: bool

    List all addresses

    -
    §

    Index

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Assign values from ArgMatches to self.
    Assign values from ArgMatches to self.
    Append to [Command] so it can instantiate Self. Read more
    Append to [Command] so it can update self. Read more
    Test whether Self can parse a specific subcommand

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.CoinSelectionAlgo.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.CoinSelectionAlgo.html deleted file mode 100644 index f62a1429a7..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.CoinSelectionAlgo.html +++ /dev/null @@ -1,11 +0,0 @@ -CoinSelectionAlgo in keychain_tracker_example_cli - Rust
    pub enum CoinSelectionAlgo {
    -    LargestFirst,
    -    SmallestFirst,
    -    OldestFirst,
    -    NewestFirst,
    -    BranchAndBound,
    -}

    Variants§

    §

    LargestFirst

    §

    SmallestFirst

    §

    OldestFirst

    §

    NewestFirst

    §

    BranchAndBound

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Returns the “default value” for a type. Read more
    Formats the value using the given formatter. Read more
    The associated error which can be returned from parsing.
    Parses a string s to return a value of this type. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    Converts the given value to a String. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.Commands.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.Commands.html deleted file mode 100644 index cc85872d91..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.Commands.html +++ /dev/null @@ -1,23 +0,0 @@ -Commands in keychain_tracker_example_cli - Rust
    pub enum Commands<C: Subcommand> {
    -    ChainSpecific(C),
    -    Address {
    -        addr_cmd: AddressCmd,
    -    },
    -    Balance,
    -    TxOut {
    -        txout_cmd: TxOutCmd,
    -    },
    -    Send {
    -        value: u64,
    -        address: Address,
    -        coin_select: CoinSelectionAlgo,
    -    },
    -}

    Variants§

    §

    ChainSpecific(C)

    §

    Address

    Fields

    §addr_cmd: AddressCmd

    Address generation and inspection.

    -
    §

    Balance

    Get the wallet balance.

    -
    §

    TxOut

    Fields

    §txout_cmd: TxOutCmd

    TxOut related commands.

    -
    §

    Send

    Fields

    §value: u64
    §address: Address
    §coin_select: CoinSelectionAlgo

    Send coins to an address.

    -

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Assign values from ArgMatches to self.
    Assign values from ArgMatches to self.
    Append to [Command] so it can instantiate Self. Read more
    Append to [Command] so it can update self. Read more
    Test whether Self can parse a specific subcommand

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.Keychain.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.Keychain.html deleted file mode 100644 index a28524e370..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.Keychain.html +++ /dev/null @@ -1,12 +0,0 @@ -Keychain in keychain_tracker_example_cli - Rust
    pub enum Keychain {
    -    External,
    -    Internal,
    -}

    Variants§

    §

    External

    §

    Internal

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Deserialize this value from the given Serde deserializer. Read more
    Formats the value using the given formatter. Read more
    This method returns an Ordering between self and other. Read more
    Compares and returns the maximum of two values. Read more
    Compares and returns the minimum of two values. Read more
    Restrict a value to a certain interval. Read more
    This method tests for self and other values to be equal, and is used -by ==. Read more
    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason. Read more
    This method returns an ordering between self and other values if one exists. Read more
    This method tests less than (for self and other) and is used by the < operator. Read more
    This method tests less than or equal to (for self and other) and is used by the <= -operator. Read more
    This method tests greater than (for self and other) and is used by the > operator. Read more
    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more
    Compare self to key and return true if they are equal.

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    Converts the given value to a String. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.TxOutCmd.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.TxOutCmd.html deleted file mode 100644 index 82695a7a3e..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/enum.TxOutCmd.html +++ /dev/null @@ -1,16 +0,0 @@ -TxOutCmd in keychain_tracker_example_cli - Rust
    pub enum TxOutCmd {
    -    List {
    -        spent: bool,
    -        unspent: bool,
    -        confirmed: bool,
    -        unconfirmed: bool,
    -    },
    -}

    Variants§

    §

    List

    Fields

    §spent: bool

    Return only spent outputs.

    -
    §unspent: bool

    Return only unspent outputs.

    -
    §confirmed: bool

    Return only confirmed outputs.

    -
    §unconfirmed: bool

    Return only unconfirmed outputs.

    -

    Trait Implementations§

    Returns a copy of the value. Read more
    Performs copy-assignment from source. Read more
    Formats the value using the given formatter. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Assign values from ArgMatches to self.
    Assign values from ArgMatches to self.
    Append to [Command] so it can instantiate Self. Read more
    Append to [Command] so it can update self. Read more
    Test whether Self can parse a specific subcommand

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The resulting type after obtaining ownership.
    Creates owned data from borrowed data, usually by cloning. Read more
    Uses borrowed data to replace owned data, usually by cloning. Read more
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.create_tx.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.create_tx.html deleted file mode 100644 index 5b9c1abb74..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.create_tx.html +++ /dev/null @@ -1 +0,0 @@ -create_tx in keychain_tracker_example_cli - Rust
    pub fn create_tx<P: ChainPosition>(
        value: u64,
        address: Address,
        coin_select: CoinSelectionAlgo,
        keychain_tracker: &mut KeychainTracker<Keychain, P>,
        keymap: &HashMap<DescriptorPublicKey, DescriptorSecretKey>
    ) -> Result<(Transaction, Option<(DerivationAdditions<Keychain>, (Keychain, u32))>)>
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.handle_commands.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.handle_commands.html deleted file mode 100644 index 69e02bc783..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.handle_commands.html +++ /dev/null @@ -1 +0,0 @@ -handle_commands in keychain_tracker_example_cli - Rust
    pub fn handle_commands<C: Subcommand, P>(
        command: Commands<C>,
        broadcast: impl FnOnce(&Transaction) -> Result<()>,
        tracker: &Mutex<KeychainTracker<Keychain, P>>,
        store: &Mutex<KeychainStore<Keychain, P>>,
        network: Network,
        keymap: &HashMap<DescriptorPublicKey, DescriptorSecretKey>
    ) -> Result<()>where
        P: ChainPosition,
        KeychainChangeSet<Keychain, P>: Serialize + DeserializeOwned,
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.init.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.init.html deleted file mode 100644 index a5f86bc871..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.init.html +++ /dev/null @@ -1 +0,0 @@ -init in keychain_tracker_example_cli - Rust
    pub fn init<C: Subcommand, P>(
    ) -> Result<(Args<C>, KeyMap, Mutex<KeychainTracker<Keychain, P>>, Mutex<KeychainStore<Keychain, P>>)>where
        P: ChainPosition,
        KeychainChangeSet<Keychain, P>: Serialize + DeserializeOwned,
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.planned_utxos.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.planned_utxos.html deleted file mode 100644 index e3273eed53..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.planned_utxos.html +++ /dev/null @@ -1 +0,0 @@ -planned_utxos in keychain_tracker_example_cli - Rust
    pub fn planned_utxos<'a, AK: CanDerive + Clone, P: ChainPosition>(
        tracker: &'a KeychainTracker<Keychain, P>,
        assets: &'a Assets<AK>
    ) -> impl Iterator<Item = (Plan<AK>, FullTxOut<P>)> + 'a
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.run_address_cmd.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.run_address_cmd.html deleted file mode 100644 index 00a4f6922a..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.run_address_cmd.html +++ /dev/null @@ -1 +0,0 @@ -run_address_cmd in keychain_tracker_example_cli - Rust
    pub fn run_address_cmd<P>(
        tracker: &Mutex<KeychainTracker<Keychain, P>>,
        db: &Mutex<KeychainStore<Keychain, P>>,
        addr_cmd: AddressCmd,
        network: Network
    ) -> Result<()>where
        P: ChainPosition,
        KeychainChangeSet<Keychain, P>: Serialize + DeserializeOwned,
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.run_balance_cmd.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.run_balance_cmd.html deleted file mode 100644 index a7f2cb5a7d..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.run_balance_cmd.html +++ /dev/null @@ -1 +0,0 @@ -run_balance_cmd in keychain_tracker_example_cli - Rust
    pub fn run_balance_cmd<P: ChainPosition>(
        tracker: &Mutex<KeychainTracker<Keychain, P>>
    )
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.run_txo_cmd.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.run_txo_cmd.html deleted file mode 100644 index 4fc98f33c6..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/fn.run_txo_cmd.html +++ /dev/null @@ -1 +0,0 @@ -run_txo_cmd in keychain_tracker_example_cli - Rust
    pub fn run_txo_cmd<K: Debug + Clone + Ord, P: ChainPosition>(
        txout_cmd: TxOutCmd,
        tracker: &Mutex<KeychainTracker<K, P>>,
        network: Network
    )
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/index.html deleted file mode 100644 index 199d33df39..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/index.html +++ /dev/null @@ -1 +0,0 @@ -keychain_tracker_example_cli - Rust
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/sidebar-items.js deleted file mode 100644 index e3f5ee79c4..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/sidebar-items.js +++ /dev/null @@ -1 +0,0 @@ -window.SIDEBAR_ITEMS = {"enum":[["AddressCmd",""],["CoinSelectionAlgo",""],["Commands",""],["Keychain",""],["TxOutCmd",""]],"externcrate":[["anyhow",""]],"fn":[["create_tx",""],["handle_commands",""],["init",""],["planned_utxos",""],["run_address_cmd",""],["run_balance_cmd",""],["run_txo_cmd",""]],"struct":[["AddrsOutput","A structure defining the output of an [`AddressCmd`]` execution."],["Args",""]]}; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/struct.AddrsOutput.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/struct.AddrsOutput.html deleted file mode 100644 index d8f7a54f68..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/struct.AddrsOutput.html +++ /dev/null @@ -1,6 +0,0 @@ -AddrsOutput in keychain_tracker_example_cli - Rust
    pub struct AddrsOutput { /* private fields */ }
    Expand description

    A structure defining the output of an AddressCmd` execution.

    -

    Trait Implementations§

    Deserialize this value from the given Serde deserializer. Read more
    Serialize this value into the given Serde serializer. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/struct.Args.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/struct.Args.html deleted file mode 100644 index 2df01e9fea..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_example_cli/struct.Args.html +++ /dev/null @@ -1,12 +0,0 @@ -Args in keychain_tracker_example_cli - Rust
    pub struct Args<C: Subcommand> {
    -    pub descriptor: String,
    -    pub change_descriptor: Option<String>,
    -    pub network: Network,
    -    pub db_path: PathBuf,
    -    pub cp_limit: usize,
    -    pub command: Commands<C>,
    -}

    Fields§

    §descriptor: String§change_descriptor: Option<String>§network: Network§db_path: PathBuf§cp_limit: usize§command: Commands<C>

    Trait Implementations§

    Append to [Command] so it can instantiate Self. Read more
    Append to [Command] so it can update self. Read more
    Deprecated, replaced with CommandFactory::command
    Deprecated, replaced with CommandFactory::command_for_update
    Build a [Command] that can instantiate Self. Read more
    Build a [Command] that can update self. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    Assign values from ArgMatches to self.
    Assign values from ArgMatches to self.
    Parse from std::env::args_os(), exit on error
    Parse from std::env::args_os(), return Err on error.
    Parse from iterator, exit on error
    Parse from iterator, return Err on error.
    Update from iterator, exit on error
    Update from iterator, return Err on error.

    Auto Trait Implementations§

    Blanket Implementations§

    Gets the TypeId of self. Read more
    Immutably borrows from an owned value. Read more
    Mutably borrows from an owned value. Read more

    Returns the argument unchanged.

    -

    Calls U::from(self).

    -

    That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

    -
    The type returned in the event of a conversion error.
    Performs the conversion.
    The type returned in the event of a conversion error.
    Performs the conversion.
    \ 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 d77a0c7039..64c7b9a63c 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,17 +1,16 @@ var searchIndex = JSON.parse('{\ -"bdk":{"doc":"bdk","t":[13,13,13,13,13,4,13,3,13,13,13,13,13,2,13,13,13,13,13,13,4,13,3,13,13,13,13,13,13,13,2,13,13,13,3,13,2,13,4,8,2,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,12,0,14,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,14,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,0,11,12,11,11,11,11,0,12,11,12,12,11,11,11,2,11,2,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,12,11,11,11,11,11,11,11,12,10,5,11,11,11,11,11,11,11,0,11,12,12,12,12,12,12,13,6,4,2,4,3,6,8,13,6,8,16,6,4,3,13,13,2,8,4,13,13,6,13,13,4,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,12,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,10,11,11,0,11,11,11,11,11,11,11,11,11,11,11,10,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,12,5,5,5,5,13,13,4,13,13,13,13,13,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,13,13,4,13,3,6,13,13,6,13,13,13,13,13,13,13,13,13,13,13,4,3,4,13,13,13,13,13,4,4,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,12,11,11,11,12,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,3,3,3,3,3,3,8,6,3,3,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,8,4,4,4,16,16,8,4,13,8,8,3,8,13,13,13,16,4,6,13,13,13,16,13,3,13,8,4,13,13,13,3,3,4,3,13,6,13,13,13,5,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,11,5,11,10,11,11,5,10,11,12,12,11,11,11,11,11,11,10,12,11,11,11,11,10,11,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,8,10,10,10,4,3,3,13,8,13,13,4,13,13,6,6,3,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,12,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,10,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,12,11,11,11,11,11,5,3,13,8,3,6,4,3,13,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,5,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,3,6,12,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,13,13,13,13,13,13,8,13,13,13,13,13,13,13,13,13,13,13,13,13,13,3,8,4,4,4,3,3,3,13,4,8,13,11,12,12,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,10,11,11,10,11,12,11,12,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,13,3,13,13,4,3,13,13,3,8,4,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11],"n":["Bip32","BnBNoExactMatch","BnBTotalTriesExceeded","ChecksumMismatch","Descriptor","Error","External","FeeRate","FeeRateTooLow","FeeRateUnavailable","FeeTooLow","Foreign","Generic","HdKeyPaths","InsufficientFunds","Internal","InvalidOutpoint","InvalidPolicyPathError","IrreplaceableTransaction","Key","KeychainKind","Local","LocalUtxo","Miniscript","MiniscriptPsbt","MissingKeyOrigin","NoRecipients","NoUtxosSelected","OutputBelowDustLimit","Psbt","SignOptions","Signer","SpendingPolicyRequired","TransactionConfirmed","TransactionDetails","TransactionNotFound","TxBuilder","UnknownUtxo","Utxo","Vbytes","Wallet","WeightedUtxo","as_byte","as_ref","as_sat_per_vb","base32_len","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","chain","check_base32","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","confirmation_time","confirmation_time","default","default_min_relay_fee","derivation_index","descriptor","descriptor","deserialize","deserialize","deserialize","eq","eq","eq","eq","eq","eq","fee","fee_vb","fee_wu","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fragment","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_btc_per_kvb","from_sat_per_kvb","from_sat_per_kwu","from_sat_per_vb","from_vb","from_wu","hash","hash","into","into","into","into","into","into","into","is_spent","keychain","keys","outpoint","outpoint","partial_cmp","partial_cmp","partial_cmp","provide","psbt","received","sat_per_kwu","satisfaction_weight","sent","serialize","serialize","serialize","signer","sub","template","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","transaction","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","txid","txout","txout","type_id","type_id","type_id","type_id","type_id","type_id","type_id","utxo","vbytes","version","vzip","vzip","vzip","vzip","vzip","vzip","vzip","wallet","write_base32","available","needed","required","required","outpoint","psbt_input","Bare","DerivedDescriptor","Descriptor","DescriptorError","DescriptorPublicKey","DescriptorXKey","ExtendedDescriptor","ExtractPolicy","Hardened","HdKeyPaths","IntoWalletDescriptor","Key","KeyMap","Legacy","Miniscript","None","Pkh","Policy","ScriptContext","Segwitv0","Sh","Single","TapKeyOrigins","Tr","Unhardened","Wildcard","Wpkh","Wsh","XPub","address","as_enum","as_enum","as_inner","at_derivation_index","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","branches","calc_checksum","check_global_consensus_validity","check_global_consensus_validity","check_global_consensus_validity","check_global_policy_validity","check_global_policy_validity","check_global_validity","check_local_consensus_validity","check_local_consensus_validity","check_local_consensus_validity","check_local_policy_validity","check_local_policy_validity","check_local_policy_validity","check_local_validity","check_terminal_non_malleable","check_terminal_non_malleable","check_terminal_non_malleable","check_witness","check_witness","check_witness","checksum","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","cmp","contains_raw_pkh","derivation_path","derive","derived_descriptor","derived_descriptor","desc_type","deserialize","deserialize","dust_value","encode","eq","eq","eq","eq","eq","eq","error","explicit_script","ext","ext_check","extract_policy","extract_policy","extract_policy","find_derivation_index_for_spk","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_key","for_each_key","from","from","from","from","from","from","from","from","from","from","from","from","from_ast","from_str","from_str","from_str_ext","from_str_insane","from_tree","from_tree","get_nth_child","get_nth_pk","get_satisfaction","get_satisfaction_mall","has_mixed_timelocks","has_repeated_keys","has_wildcard","hash","hash","hash","hash","hash","hash","into","into","into","into","into","into","into_inner","into_wallet_descriptor","into_wallet_descriptor","is_deriveable","is_non_malleable","iter","iter_pk","lift","lift","lift_check","matches","max_satisfaction_size","max_satisfaction_size","max_satisfaction_size","max_satisfaction_size","max_satisfaction_weight","max_satisfaction_witness_elements","name_str","name_str","name_str","new_bare","new_pk","new_pkh","new_sh","new_sh_sortedmulti","new_sh_with_wpkh","new_sh_with_wsh","new_sh_wpkh","new_sh_wsh","new_sh_wsh_sortedmulti","new_tr","new_wpkh","new_wsh","new_wsh_sortedmulti","node","origin","other_top_level_checks","parse","parse_descriptor","parse_insane","parse_with_ext","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","pk_len","pk_len","pk_len","policy","requires_sig","sanity_check","sanity_check","satisfy","satisfy","satisfy_malleable","script_code","script_pubkey","script_size","serialize","serialize","sig_type","sig_type","sig_type","template","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string_with_secret","top_level_checks","top_level_type_check","translate_pk","translate_pk","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","ty","type_id","type_id","type_id","type_id","type_id","type_id","unsigned_script_sig","vzip","vzip","vzip","vzip","vzip","vzip","wildcard","within_resource_limits","xkey","calc_checksum","calc_checksum_bytes","get_checksum","get_checksum_bytes","Base58","Bip32","Error","HardenedDerivationXpub","Hex","InvalidDescriptorCharacter","InvalidDescriptorChecksum","InvalidHdKeyPath","Key","Miniscript","Pk","Policy","borrow","borrow_mut","fmt","fmt","from","from","from","from","from","from","from","from","into","provide","to_string","try_from","try_into","type_id","vzip","AbsoluteTimelock","AddOnLeaf","AddOnPartialComplete","BuildSatisfaction","Complete","Condition","ConditionMap","EcdsaSignature","Fingerprint","FoldedConditionMap","Hash160Preimage","Hash256Preimage","IncompatibleConditions","IndexOutOfRange","MixedTimelockUnits","Multisig","None","None","NotEnoughItemsSelected","Partial","PartialComplete","PkOrF","Policy","PolicyError","Psbt","PsbtTimelocks","Pubkey","RelativeTimelock","Ripemd160Preimage","Satisfaction","SatisfiableItem","SchnorrSignature","Sha256Preimage","Thresh","XOnlyPubkey","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","contribution","csv","default","eq","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","get_condition","hash","hash","id","id","into","into","into","into","into","into","into","is_leaf","is_leaf","is_null","item","partial_cmp","provide","requires_path","satisfaction","serialize","serialize","serialize","serialize","serialize","timelock","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","current_height","input_max_height","psbt","condition","conditions","conditions","items","items","m","m","n","n","sorted","sorted","hash","hash","hash","hash","items","keys","threshold","threshold","value","value","Bip44","Bip44Public","Bip49","Bip49Public","Bip84","Bip84Public","DescriptorTemplate","DescriptorTemplateOut","P2Pkh","P2Wpkh","P2Wpkh_P2Sh","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build","build","build","build","build","build","build","build","build","build","from","from","from","from","from","from","from","from","from","into","into","into","into","into","into","into","into","into","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","Bip32","DerivableKey","DescriptorKey","DescriptorPublicKey","DescriptorSecretKey","Entropy","Error","ExtScriptContext","ExtendedKey","FullKey","GeneratableDefaultOptions","GeneratableKey","GeneratedKey","IntoDescriptorKey","InvalidChecksum","InvalidNetwork","InvalidScriptContext","Key","KeyError","KeyMap","Legacy","Message","Miniscript","Options","Private","PrivateKeyGenerateOptions","Public","ScriptContext","ScriptContextEnum","Segwitv0","Single","Single","SinglePriv","SinglePub","SinglePubKey","SortedMultiVec","Tap","ValidNetworks","XOnly","XPrv","XPub","any_network","as_enum","at_derivation_index","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","check_global_consensus_validity","check_global_policy_validity","check_global_validity","check_local_consensus_validity","check_local_policy_validity","check_local_validity","check_terminal_non_malleable","check_witness","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","compressed","default","deref","derive","encode","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_key","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_public","from_secret","from_str","from_str","from_tree","full_derivation_path","generate","generate_default","generate_with_entropy","generate_with_entropy_default","has_secret","has_wildcard","hash","hash","hash","hash","into","into","into","into","into","into","into","into","into","into","into","into","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_extended_key","into_extended_key","into_extended_key","into_key","into_xprv","into_xpub","is_deriveable","is_legacy","is_legacy","is_segwit_v0","is_segwit_v0","is_taproot","is_taproot","is_uncompressed","is_x_only_key","k","key","key","lift","mainnet_network","master_fingerprint","max_satisfaction_size","max_satisfaction_size","max_satisfaction_witness_elements","merge_networks","name_str","new","origin","origin","other_top_level_checks","override_valid_networks","partial_cmp","partial_cmp","partial_cmp","partial_cmp","pk_len","pks","provide","sanity_check","satisfy","script_size","sig_type","sorted_node","test_networks","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_public","to_string","to_string","to_string","to_string","top_level_checks","top_level_type_check","translate_pk","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","PsbtUtils","fee_amount","fee_rate","get_utxo_for","AddressIndex","AddressInfo","Balance","Descriptor","IsDust","LastUnused","New","NewError","Peek","Persist","Update","UpdateError","Wallet","add","add_signer","address","apply_update","as_chain_graph","as_graph","as_ref","as_ref","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build_fee_bump","build_tx","cancel_tx","checkpoints","clone","clone_into","coin_selection","commit","confirmed","default","deref","derivation_index","derivation_of_spk","descriptor_checksum","deserialize","eq","eq","export","finalize_psbt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","get_address","get_balance","get_descriptor_for_keychain","get_internal_address","get_psbt_input","get_signers","get_tx","get_utxo","immature","index","insert_checkpoint","insert_tx","into","into","into","into","into","is_dust","is_mine","keychain","keychains","latest_checkpoint","list_transactions","list_unspent","network","new","new_no_persist","next_derivation_index","policies","provide","public_descriptor","secp_ctx","serialize","sign","signer","spks_of_all_keychains","spks_of_keychain","staged","to_owned","to_string","to_string","to_string","total","transactions","trusted_pending","trusted_spendable","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","tx_builder","type_id","type_id","type_id","type_id","type_id","untrusted_pending","vzip","vzip","vzip","vzip","vzip","wallet_name_from_descriptor","BranchAndBoundCoinSelection","Change","CoinSelectionAlgorithm","CoinSelectionResult","DefaultCoinSelectionAlgorithm","Excess","LargestFirstCoinSelection","NoChange","OldestFirstCoinSelection","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","coin_select","coin_select","coin_select","coin_select","decide_change","default","default","default","excess","fee_amount","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","into","into","into","into","into","local_selected_amount","new","selected","selected_amount","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","amount","change_fee","dust_threshold","fee","remaining_amount","FullyNodedExport","WalletExport","blockheight","borrow","borrow_mut","change_descriptor","descriptor","deserialize","export_wallet","fmt","from","from_str","into","label","serialize","to_string","try_from","try_into","type_id","vzip","All","Dummy","Exclude","Fingerprint","Include","InputIndexOutOfRange","InputSigner","InvalidKey","InvalidNonWitnessUtxo","InvalidSighash","Legacy","MissingHdKeypath","MissingKey","MissingNonWitnessUtxo","MissingWitnessScript","MissingWitnessUtxo","NonStandardSighash","None","PkHash","Segwitv0","SighashError","SignOptions","SignerCommon","SignerContext","SignerError","SignerId","SignerOrdering","SignerWrapper","SignersContainer","Tap","TapLeavesOptions","TransactionSigner","UserCanceled","add_external","allow_all_sighashes","allow_grinding","as_key_map","assume_height","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","default","default","default","default","deref","descriptor_secret_key","descriptor_secret_key","descriptor_secret_key","eq","eq","eq","eq","eq","find","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","hash","id","id","id","ids","into","into","into","into","into","into","into","into","new","new","partial_cmp","partial_cmp","provide","remove","remove_partial_sigs","sign_input","sign_input","sign_input","sign_transaction","sign_transaction","sign_with_tap_internal_key","signers","tap_leaves_options","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","trust_witness_utxo","try_finalize","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","is_internal_key","Bip69Lexicographic","BumpFee","ChangeAllowed","ChangeForbidden","ChangeSpendPolicy","CreateTx","OnlyChange","Shuffle","TxBuilder","TxBuilderContext","TxOrdering","Untouched","add_data","add_foreign_utxo","add_global_xpubs","add_recipient","add_unspendable","add_utxo","add_utxos","allow_dust","allow_shrinking","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","change_policy","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","coin_selection","current_height","default","default","default","default","do_not_spend_change","drain_to","drain_wallet","enable_rbf","enable_rbf_with_sequence","eq","eq","fee_absolute","fee_rate","finish","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","hash","hash","include_output_redeem_witness_script","into","into","into","into","into","manually_selected_only","nlocktime","only_spend_change","only_witness_utxo","ordering","partial_cmp","partial_cmp","policy_path","set_recipients","sighash","sort_tx","to_owned","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","unspendable","version","vzip","vzip","vzip","vzip","vzip"],"q":["bdk","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::Error","","","","bdk::Utxo","","bdk::descriptor","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor::checksum","","","","bdk::descriptor::error","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor::policy","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor::policy::BuildSatisfaction","","","bdk::descriptor::policy::Satisfaction","","","","","","","","","","","bdk::descriptor::policy::SatisfiableItem","","","","","","","","","","bdk::descriptor::template","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::keys","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::psbt","","","","bdk::wallet","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::coin_selection","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::coin_selection::Excess","","","","","bdk::wallet::export","","","","","","","","","","","","","","","","","","","","bdk::wallet::signer","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::signer::SignerContext","bdk::wallet::tx_builder","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"d":["BIP32 error","Branch and bound coin selection tries to avoid needing a …","Branch and bound coin selection possible attempts with …","Descriptor checksum mismatch","Error related to the parsing and usage of descriptors","Errors that can be thrown by the Wallet","External","Fee rate","When bumping a tx the fee rate requested is lower than …","Node doesn’t have data to estimate a fee rate","When bumping a tx the absolute fee requested is lower than …","A UTXO owned by another wallet.","Generic error","","Wallet’s UTXO set is not enough to cover recipient’s …","Internal, usually used for change outputs","Requested outpoint doesn’t exist in the tx (vout greater …","Error while extracting and manipulating policies","Trying to replace a tx that has a sequence >= 0xFFFFFFFE","Error while working with keys","Types of keychains","A UTXO owned by the local wallet.","An unspent output owned by a Wallet.","Miniscript error","Miniscript PSBT error","In order to use the TxBuilder::add_global_xpubs option …","Cannot build a tx without recipients","manually_selected_only option is selected but no utxo has …","Output created is under the dust limit, 546 satoshis","Partially signed bitcoin transaction error","","Signing error","Spending policy is not compatible with this KeychainKind","Happens when trying to bump a transaction that is already …","A wallet transaction","Thrown when a tx is not found in the internal database","","Happens when trying to spend an UTXO that is not in the …","An unspent transaction output (UTXO).","Trait implemented by types that can be used to measure …","","A Utxo with its satisfaction_weight.","Return KeychainKind as a byte","","Return the value as satoshi/vbyte","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The confirmation time for transaction containing this utxo","If the transaction is confirmed, contains height and Unix …","","Create a new FeeRate with the default min relay fee value","The derivation index for the script pubkey in the wallet","Descriptors","Macro to write full descriptors with code","","","","","","","","","","Fee value in sats if it was available.","Calculate absolute fee in Satoshis using size in virtual …","Calculate absolute fee in Satoshis using size in weight …","","","","","","","","","Macro to write descriptor fragments with code","","Returns the argument unchanged.","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Create a new instance of FeeRate given a float fee rate in …","Create a new instance of FeeRate given a float fee rate in …","Create a new instance of FeeRate given a float fee rate in …","Create a new instance of FeeRate given a float fee rate in …","Calculate fee rate from fee and vbytes.","Calculate fee rate from fee and weight units (wu).","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Whether this UTXO is spent or not","Type of keychain","Key formats","Get the location of the UTXO","Reference to a transaction output","","","","","Additional functions on the rust-bitcoin …","Received value (sats) Sum of owned outputs of this …","Return the value as satoshi/kwu","The weight of the witness data and scriptSig expressed in …","Sent value (sats) Sum of owned inputs of this transaction.","","","","","","","","","","","","","","Optional transaction","","","","","","","","","","","","","","","Transaction id","Get the TxOut of the UTXO","Transaction output","","","","","","","","The UTXO","Convert weight units to virtual bytes.","Get the version of BDK at runtime","","","","","","","","Wallet","","Sats available for spending","Sats needed for some transaction","Required fee rate (satoshi/vbyte)","Required fee absolute value (satoshi)","The location of the output.","The information about the input we require to add it to a …","A raw scriptpubkey (including pay-to-pubkey) under Legacy …","Alias for a Descriptor that contains extended derived keys","Script descriptor","","The descriptor pubkey, either a single pubkey or an xpub.","An extended key with origin, derivation path, and wildcard.","Alias for a Descriptor that can contain extended keys …","Trait implemented on Descriptors to add a method to …","Unhardened wildcard, e.g. *h","Alias for the type of maps that represent derivation paths …","Trait for types which can be converted into an …","The consensus key associated with the type. Must be a …","Alias type for a map of public key to secret key","Legacy ScriptContext To be used as P2SH scripts For …","Top-level script AST type","No wildcard","Pay-to-PubKey-Hash","","The ScriptContext for Miniscript. Additional type …","Segwitv0 ScriptContext","Pay-to-ScriptHash(includes nested wsh/wpkh/sorted multi)","Single public key.","Alias for the type of maps that represent taproot key …","Pay-to-Taproot","Unhardened wildcard, e.g. *","Whether a descriptor has a wildcard in it","Pay-to-Witness-PubKey-Hash","Pay-to-Witness-ScriptHash with Segwitv0 context","Extended public key (xpub).","Computes the Bitcoin address of the descriptor, if one …","","","Get a reference to the inner AstElem representing the root …","Replaces all wildcards (i.e. /*) in the descriptor with a …","","","","","","","","","","","","","Enumerates all child nodes of the current AST node (self) …","","Depending on script Context, some of the Terminals might …","","","Depending on script Context, some of the script resource …","","Check the consensus + policy(if not disabled) rules that …","Consensus rules at the Miniscript satisfaction time. It is …","","","Policy rules at the Miniscript satisfaction time. It is …","","","Check the consensus + policy(if not disabled) rules …","Depending on ScriptContext, fragments can be malleable. …","","","Check whether the given satisfaction is valid under the …","","","Descriptor checksum","","","","","","","","","","","","","","","","","","","Whether the given miniscript contains a raw pkh fragment","The derivation path","Deprecated name for [at_derivation_index].","Convert all the public keys in the descriptor to …","Convert all the public keys in the descriptor to …","Get the DescriptorType of Descriptor","","","","Encode as a Bitcoin script","","","","","","","Descriptor errors","Computes the the underlying script before any hashing is …","Additional information helpful for extra analysis.","Check whether the miniscript follows the given Extra …","Extract the spending policy","","","Utility method for deriving the descriptor at each index …","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Add type information(Type and Extdata) to Miniscript based …","","Parse a Miniscript from string and perform sanity checks …","Attempt to parse an Miniscripts that don’t follow the …","Attempt to parse an insane(scripts don’t clear sanity …","Parse an expression tree into a descriptor.","Parse an expression tree into a Miniscript. As a general …","Returns child node with given index, if any","Returns Option::Some with cloned n’th public key from …","Returns satisfying non-malleable witness and scriptSig to …","Returns a possilbly mallable satisfying non-malleable …","Whether the miniscript contains a combination of timelocks","Whether the miniscript has repeated Pk or Pkh","Whether or not the descriptor has any wildcards i.e. /*.","","","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Extracts the AstElem representing the root of the …","Convert to wallet descriptor","","Whether or not the descriptor has any wildcards","Whether the miniscript is malleable","Creates a new Iter iterator that will iterate over all …","Creates a new PkIter iterator that will iterate over all …","","","Lifting corresponds conversion of miniscript into Policy […","Compares this key with a keysource and returns the …","Depending on script context, the size of a satifaction …","","","Maximum size, in bytes, of a satisfying witness. For …","Computes an upper bound on the weight of a satisfying …","Maximum number of witness elements used to satisfy the …","Local helper function to display error messages with …","","","Create a new bare descriptor from witness script Errors …","Create a new pk descriptor","Create a new PkH descriptor","Create a new sh for a given redeem script Errors when …","Create a new sh sortedmulti descriptor with threshold k …","Create a new sh wrapper for the given wpkh descriptor","Create a new sh wrapper for the given wsh descriptor","Create a new sh wrapped wpkh from Pk. Errors when …","Create a new sh wrapped wsh descriptor with witness script …","Create a new sh wrapped wsh sortedmulti descriptor from …","Create new tr descriptor Errors when miniscript exceeds …","Create a new Wpkh descriptor Will return Err if …","Create a new wsh descriptor from witness script Errors …","Create a new wsh sorted multi descriptor Errors when …","A node in the Abstract Syntax Tree(","Origin information","Other top level checks that are context specific","Attempt to parse a Script into Miniscript representation.","Parse a descriptor that may contain secret keys","Attempt to parse an insane(scripts don’t clear sanity …","Attempt to parse an miniscript with extra features that …","","","","","","","Get the len of public key when serialized based on context …","","","Descriptor policy","Whether all spend paths of miniscript require a signature","Checks whether the descriptor is safe.","Check whether the underlying Miniscript is safe under the …","Attempts to produce a non-malleable satisfying witness and …","Attempt to produce non-malleable satisfying witness for the","Attempt to produce a malleable satisfying witness for the …","Computes the scriptCode of a transaction output.","Computes the scriptpubkey of the descriptor.","Size, in bytes of the script-pubkey. If this Miniscript is …","","","The type of signature required for satisfaction","","","Descriptor templates","","","","","","","","","Serialize a descriptor to string with its secret keys","Check top level consensus rules.","Check whether the top-level is type B","Converts a descriptor using abstract keys to one using …","Translates a struct from one generic to another where the …","","","","","","","","","","","","","The correctness and malleability type information for the …","","","","","","","Computes the scriptSig that will be in place for an …","","","","","","","Whether the descriptor is wildcard","Whether the miniscript can exceed the resource …","The extended key","Compute the checksum of a descriptor, excludes any …","Compute the checksum bytes of a descriptor, excludes any …","Compute the checksum of a descriptor","Compute the checksum bytes of a descriptor","Error during base58 decoding","BIP32 error","Errors related to the parsing and usage of descriptors","The descriptor contains hardened derivation steps on …","Hex decoding error","Invalid byte found in the descriptor checksum","The provided descriptor doesn’t match its checksum","Invalid HD Key path, such as having a wildcard but a …","Error thrown while working with keys","Miniscript error","Key-related error","Error while extracting and manipulating policies","","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","Absolute timeclock timestamp","Can not add to an item that is Satisfaction::None or …","Can not add to an item that is …","Options to build the satisfaction field in the policy","Can satisfy the policy item","An extra condition that must be satisfied but that is out …","Type for a map of sets of Condition items keyed by each set…","ECDSA Signature for a raw public key","An extended key fingerprint","Type for a map of folded sets of Condition items keyed by …","SHA256 then RIPEMD160 preimage hash","Double SHA256 preimage hash","Incompatible conditions (not currently used)","Index out of range for an item to satisfy a …","Can not merge CSV or timelock values unless both are less …","Multi-signature public keys with threshold count","Cannot satisfy or contribute to the policy item","Don’t generate satisfaction field","Not enough items are selected to satisfy a …","Only a partial satisfaction of some kind of threshold …","Can reach the threshold of some kind of threshold policy","A unique identifier for a key","Descriptor spending policy","Errors that can happen while extracting and manipulating …","Analyze the given PSBT to check for existing signatures","Like Psbt variant and also check for expired timelocks","A legacy public key","Relative timelock locktime","RIPEMD160 preimage hash","Represent if and how much a policy item is satisfied by …","An item that needs to be satisfied","Schnorr Signature for a raw public key","SHA256 preimage hash","Threshold items with threshold count","A x-only public key","","","","","","","","","","","","","","","","","","","","","","","","","","","How the wallet’s descriptor can satisfy this policy node","Optional CheckSequenceVerify condition","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Return the conditions that are set by the spending policy …","","","Returns a unique id for the SatisfiableItem","Identifier for this policy node","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Returns whether the SatisfiableItem is a leaf item","Returns whether the Satisfaction is a leaf item","Returns true if there are no extra conditions to verify","Type of this policy node","","","Return whether or not a specific path in the policy tree …","How much a given PSBT already satisfies this policy node …","","","","","","Optional timelock condition","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Current blockchain height","The highest confirmation height between the inputs CSV …","Given PSBT","Extra conditions that also need to be satisfied","Extra conditions that also need to be satisfied","Extra conditions that also need to be satisfied","The items that can be satisfied by the descriptor or are …","The items that can be satisfied by the descriptor","Threshold","Threshold","Total number of items","Total number of items","Whether the items are sorted in lexicographic order (used …","Whether the items are sorted in lexicographic order (used …","The digest value","The digest value","The digest value","The digest value","The policy items","The raw public key or extended key fingerprint","The required threshold count","The required threshold count","The timelock value","The timelock value","BIP44 template. Expands to pkh(key/44'/{0,1}'/0'/{0,1}/*)","BIP44 public template. Expands to pkh(key/{0,1}/*)","BIP49 template. Expands to …","BIP49 public template. Expands to sh(wpkh(key/{0,1}/*))","BIP84 template. Expands to wpkh(key/84'/{0,1}'/0'/{0,1}/*)","BIP84 public template. Expands to wpkh(key/{0,1}/*)","Trait for descriptor templates that can be built into a …","Type alias for the return type of DescriptorTemplate, …","P2PKH template. Expands to a descriptor pkh(key)","P2WPKH template. Expands to a descriptor wpkh(key)","P2WPKH-P2SH template. Expands to a descriptor sh(wpkh(key))","","","","","","","","","","","","","","","","","","","Build the complete descriptor","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","BIP32 error","Trait for keys that can be derived.","Container for public or secret keys","The descriptor pubkey, either a single pubkey or an xpub.","The descriptor secret key, either a single private key or …","Type specifying the amount of entropy required e.g. [u8;32]","Returned error in case of failure","Trait that adds extra useful methods to ScriptContexts","Enum for extended keys that can be either xprv or xpub","A bitcoin public key (compressed or uncompressed).","Trait that allows generating a key with the default options","Trait for keys that can be generated","Output of a GeneratableKey key generation","Trait for objects that can be turned into a public or …","The key has an invalid checksum","The key is not valid for the given network","The key cannot exist in the given script context","The consensus key associated with the type. Must be a …","Errors thrown while working with keys","Alias type for a map of public key to secret key","Legacy scripts","Custom error message","Miniscript error","Extra options required by the generate_with_entropy","A private extended key, aka an xprv","Options for generating a PrivateKey","A public extended key, aka an xpub","The ScriptContext for Miniscript. Additional type …","Enum representation of the known valid ScriptContexts","Segwitv0 scripts","Single public key.","Single private key.","A descriptor bitcoin::PrivateKey with optional origin …","A descriptor SinglePubKey with optional origin information.","Single public key without any origin or range information.","Contents of a “sortedmulti” descriptor","Taproot scripts","Set of valid networks for a key","An xonly public key.","Extended private key (xpriv).","Extended public key (xpub).","Create a set containing mainnet, testnet, signet, and …","Returns the ScriptContext as a ScriptContextEnum","Replaces any wildcard (i.e. /*) in the key with a …","","","","","","","","","","","","","","","","","","","","","","","","","Depending on script Context, some of the Terminals might …","Depending on script Context, some of the script resource …","Check the consensus + policy(if not disabled) rules that …","Consensus rules at the Miniscript satisfaction time. It is …","Policy rules at the Miniscript satisfaction time. It is …","Check the consensus + policy(if not disabled) rules …","Depending on ScriptContext, fragments can be malleable. …","Check whether the given satisfaction is valid under the …","","","","","","","","","","","","","","","","","","","Whether the generated key should be “compressed” or not","","","Deprecated name of [at_derivation_index].","Encode as a Bitcoin script","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Create an instance given a public key and a set of valid …","Create an instance given a secret key and a set of valid …","","","Parse an expression tree into a SortedMultiVec","Full path, from the master key","Generate a key given the options with a random entropy","Generate a key with the default options and a random …","Generate a key given the extra options and the entropy","Generate a key with the default options and a given entropy","Return whether or not the key contains the private data","Whether or not the key has a wildcard","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Turn the key into a DescriptorKey within the requested …","Consume self and turn it into a DescriptorKey by adding …","","","","","","Consume self and turn it into an ExtendedKey","","","Consumes self and returns the key","Transform the ExtendedKey into an ExtendedPrivKey for the …","Transform the ExtendedKey into an ExtendedPubKey for the …","Whether or not the key has a wildcard","Returns whether the script context is Legacy","Returns whether the script context is …","Returns whether the script context is Segwitv0","Returns whether the script context is …","Returns whether the script context is Tap, aka Taproot or …","Returns whether the script context is …","","","signatures required","The public key.","The private key.","","Create a set only containing mainnet","The fingerprint of the master key associated with this …","Depending on script context, the size of a satifaction …","Maximum size, in bytes, of a satisfying witness. In …","Maximum number of witness elements used to satisfy the …","Compute the intersection of two sets","Local helper function to display error messages with …","Create a new instance of SortedMultiVec given a list of …","Origin information (fingerprint and derivation path).","Origin information (fingerprint and derivation path).","Other top level checks that are context specific","Override the computed set of valid networks","","","","","Get the len of public key when serialized based on context …","public keys inside sorted Multi","","utility function to sanity a sorted multi vec","Attempt to produce a satisfying witness for the witness …","Size, in bytes of the script-pubkey. If this Miniscript is …","The type of signature required for satisfaction","Create Terminal::Multi containing sorted pubkeys","Create a set containing testnet and regtest","","","","","","","","Returns the public version of this key.","","","","","Check top level consensus rules.","Check whether the top-level is type B","This will panic if fpk returns an uncompressed key when …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Trait to add functions to extract utxos and calculate fees.","The total transaction fee amount, sum of input amounts …","The transaction’s fee rate. This value will only be …","Get the TxOut for the specified input index, if it doesn’…","The address index selection strategy to use to derived an …","A derived address and the index it was found at. For …","Balance, differentiated into various categories.","There was problem with the descriptors passed in","Trait to check if a value is below the dust limit. We are …","Return the address for the current descriptor index if it …","Return a new address after incrementing the current …","Error returned from Wallet::new","Return the address for a specific descriptor index. Does …","We were unable to load the wallet’s data from the …","The update to a Wallet used in Wallet::apply_update. This …","Error indicating that something was wrong with an Update<T>…","A Bitcoin wallet","","Add an external signer","Address","Applies an update to the wallet and stages the changes …","Get a reference to the inner ChainGraph.","Get a reference to the inner TxGraph.","","","","","","","","","","","","","Bump the fee of a transaction previously created with this …","Start building a transaction.","Informs the wallet that you no longer intend to broadcast …","Get all the checkpoints the wallet is currently storing …","","","Coin selection","Commits all curently staged changed to the persistence …","Confirmed and immediately spendable balance","","","The derivation index of this wallet. It will return None …","Finds how the wallet derived the script pubkey spk.","Return the checksum of the public descriptor associated to …","","","","Wallet export","Finalize a PSBT, i.e., for each input determine if …","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Return a derived address using the external descriptor, …","Return the balance, separated into available, …","Returns the descriptor used to create addresses for a …","Return a derived address using the internal (change) …","get the corresponding PSBT Input for a LocalUtxo","Get the signers","Return a single transactions made and received by the …","Returns the utxo owned by this wallet corresponding to …","All coinbase outputs not yet matured","Child index of this address","Add a new checkpoint to the wallet’s internal view of …","Add a transaction to the wallet’s internal view of the …","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Check whether or not a value is below dust limit","Return whether or not a script is part of this wallet …","Type of keychain","Iterator over all keychains in this wallet","Returns the latest checkpoint.","Deprecated. use Wallet::transactions instead.","Return the list of unspent outputs of this wallet","Get the Bitcoin network the wallet is using.","Create a wallet from a descriptor (and an optional …","Creates a wallet that does not persist data.","The index of the next address that you would get if you …","Return the spending policies for the wallet’s descriptor","","Return the “public” version of the wallet’s …","Return the secp256k1 context used for all signing …","","Sign a transaction with all the wallet’s signers, in the …","Generalized signers","Returns a iterators of all the script pubkeys for the …","Gets an iterator over all the script pubkeys in a single …","Returns the changes that will be staged with the next call …","","","","","Get the whole balance visible to the wallet.","Iterate over the transactions in the wallet in order of …","Unconfirmed UTXOs generated by a wallet tx","Get sum of trusted_pending and confirmed coins.","","","","","","","","","","","Transaction builder","","","","","","Unconfirmed UTXOs received from an external wallet","","","","","","Deterministically generate a unique name given the …","Branch and bound coin selection","It’s possible to create spendable output from excess …","Trait for generalized coin selection algorithms","Result of a successful coin selection","Default coin selection algorithm used by TxBuilder if not …","Remaining amount after performing coin selection","Simple and dumb coin selection","It’s not possible to create spendable output from excess …","OldestFirstCoinSelection always picks the utxo with the …","","","","","","","","","","","","","","","","","Perform the coin selection","","","","Decide if change can be created","","","","Remaining amount after deducing fees and outgoing outputs","Total fee amount for the selected utxos in satoshis","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","The total value of the inputs selected from the local …","Create new instance with target size for change output","List of outputs selected for use as inputs","The total value of the inputs selected.","","","","","","","","","","","","","","","","","","","","","","","","Effective amount available to create change after …","The calculated fee for the drain TxOut with the selected …","Threshold to consider amount as dust for this particular …","The deducted change output fee","Exceeding amount of current selection over outgoing value …","Structure that contains the export of a wallet","Alias for FullyNodedExport","Earliest block to rescan when looking for the wallet’s …","","","Return the internal descriptor, if present","Return the external descriptor","","Export a wallet","","Returns the argument unchanged.","","Calls U::from(self).","Arbitrary label for the wallet","","","","","","","The signer will sign all the leaves it has a key for.","Dummy identifier","The signer won’t sign the specified leaves.","The fingerprint of a BIP32 extended key","The signer won’t sign leaves other than the ones …","Input index is out of range","PSBT Input signer","The private key in use has the right fingerprint but …","The non_witness_utxo specified is invalid","Invalid SIGHASH for the signing context in use","Legacy context","The fingerprint and derivation path are missing from the …","The private key is missing for the required public key","The non_witness_utxo field of the transaction is required …","The witness_script field of the transaction is required to …","The witness_utxo field of the transaction is required to …","The psbt contains a non-SIGHASH_ALL sighash in one of its …","The signer won’t sign any leaf.","Bitcoin HASH160 (RIPEMD160 after SHA256) hash of an ECDSA …","Segwit v0 context (BIP 143)","Error while computing the hash to sign","Options for a software signer","Common signer methods","Signing context","Signing error","Identifier of a signer in the SignersContainers. Used as a …","Defines the order in which signers are called","Wrapper structure to pair a signer with its context","Container for multiple signers","Taproot context (BIP 340)","Customize which taproot script-path leaves the signer …","PSBT signer","The user canceled the operation","Adds an external signer to the container for the specified …","Whether the signer should use the sighash_type set in the …","Whether we should grind ECDSA signature to ensure signing …","Create a map of public keys to secret keys","Whether the wallet should assume a specific height has …","","","","","","","","","","","","","","","","","Build a new signer container from a KeyMap","","","","","","","","","","","","","","","","","","","","","","","","Return the secret key for the signer","","","","","","","","Finds the signer with lowest ordering for a given id in …","","","","","","","","","","Returns the argument unchanged.","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Return the SignerId for this signer","","","Returns the list of identifiers of all the signers in the …","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Create a wrapped signer from a signer and a context","Default constructor","","","","Removes a signer from the container and returns it","Whether to remove partial signatures from the PSBT inputs …","Sign a single psbt input","","","Sign all the inputs of the psbt","","Whether we should try to sign a taproot transaction with …","Returns the list of signers in the container, sorted by …","Specifies which Taproot script-spend leaves we should sign …","","","","","","","","","","Whether the signer should trust the witness_utxo, if the …","Whether to try finalizing the PSBT after the inputs are …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Whether the signer can sign for the internal key or not","BIP69 / Lexicographic","Marker type to indicate the TxBuilder is being used to …","Use both change and non-change outputs (default)","Only use non-change outputs (see …","Policy regarding the use of change outputs when creating a …","Marker type to indicate the TxBuilder is being used to …","Only use change outputs (see TxBuilder::only_spend_change)","Randomized (default)","A transaction builder","Context in which the TxBuilder is valid","Ordering of the transaction’s inputs and outputs","Unchanged","Add data as an output, using OP_RETURN","Add a foreign UTXO i.e. a UTXO not owned by this wallet.","Fill-in the PSBT_GLOBAL_XPUB field with the extended keys …","Add a recipient to the internal list","Add a utxo to the internal list of unspendable utxos","Add a utxo to the internal list of utxos that must be spent","Add the list of outpoints to the internal list of UTXOs …","Set whether or not the dust limit is checked.","Explicitly tells the wallet that it is allowed to reduce …","","","","","","","","","","","Set a specific ChangeSpendPolicy. See …","","","","","","","","","","","","","Choose the coin selection algorithm","Set the current blockchain height.","","","","","Do not spend change outputs","Sets the address to drain excess coins to.","Spend all the available inputs. This respects filters like …","Enable signaling RBF","Enable signaling RBF with a specific nSequence value","","","Set an absolute fee The fee_absolute method refers to the …","Set a custom fee rate","Finish building the transaction.","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Fill-in the psbt::Output::redeem_script and …","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Only spend utxos added by add_utxo.","Use a specific nLockTime while creating the transaction","Only spend change outputs","Only Fill-in the psbt::Input::witness_utxo field when …","Choose the ordering for inputs and outputs of the …","","","Set the policy path to use while creating the transaction …","Replace the recipients already added with a new list","Sign with a specific sig hash","Sort transaction inputs and outputs by TxOrdering variant","","","","","","","","","","","","","","","","","","","","","Replace the internal list of unspendable utxos with a new …","Build a transaction with a specific version","","","","",""],"i":[17,17,17,17,17,0,1,0,17,17,17,12,17,0,17,1,17,17,17,17,0,12,0,17,17,17,17,17,17,17,0,17,17,17,0,17,0,17,0,0,0,0,1,1,3,1,17,1,3,10,11,12,13,17,1,3,10,11,12,13,0,1,1,3,10,11,12,13,1,3,10,11,12,13,1,13,10,13,3,3,10,0,0,1,10,13,1,3,10,11,12,13,13,3,3,17,17,1,3,10,11,12,13,0,17,17,17,17,17,17,17,17,1,3,10,11,12,13,3,3,3,3,3,3,1,10,17,1,3,10,11,12,13,10,10,0,12,10,1,3,13,17,0,13,3,11,13,1,10,13,0,3,0,1,3,10,11,12,13,17,13,17,1,3,10,11,12,13,17,1,3,10,11,12,13,13,12,10,17,1,3,10,11,12,13,11,168,0,17,1,3,10,11,12,13,0,1,169,169,170,171,172,172,34,0,0,0,0,0,0,0,45,0,0,58,0,0,0,45,34,0,0,0,34,40,0,34,45,0,34,34,40,34,46,47,38,34,44,45,34,46,47,38,44,45,34,46,47,38,38,0,58,46,47,58,47,58,58,46,47,58,46,47,58,58,46,47,58,46,47,0,44,45,34,46,47,38,44,45,34,46,47,38,44,45,34,46,47,38,38,44,34,34,34,34,34,38,34,38,44,45,34,46,47,38,0,34,38,38,173,34,38,34,44,45,34,34,46,47,38,38,34,38,44,45,34,34,34,34,34,34,34,46,47,38,38,34,38,38,38,34,38,38,38,34,34,38,38,34,44,45,34,46,47,38,44,45,34,46,47,38,38,142,68,34,38,38,38,34,38,38,44,58,46,47,38,34,38,58,46,47,34,34,34,34,34,34,34,34,34,34,34,34,34,34,38,44,58,38,34,38,38,44,45,34,46,47,38,58,46,47,0,38,34,38,34,38,38,34,34,38,34,38,58,46,47,0,44,45,34,46,47,38,34,38,34,58,58,34,38,44,45,34,46,47,38,44,45,34,46,47,38,38,44,45,34,46,47,38,34,44,45,34,46,47,38,44,38,44,0,0,0,0,24,24,0,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,83,20,20,0,84,0,0,83,82,0,83,83,20,20,20,83,84,56,20,84,84,0,0,0,56,56,82,83,83,0,0,83,83,83,82,82,83,84,57,85,20,56,82,83,84,57,85,20,56,82,83,84,57,85,56,82,83,84,57,85,56,57,85,85,82,83,84,57,85,20,82,83,84,57,85,20,20,56,82,83,84,84,57,57,85,20,56,57,82,85,83,57,82,83,84,57,85,20,56,83,84,85,57,85,20,57,57,82,83,84,57,85,85,82,83,84,57,85,56,20,82,83,84,57,85,20,56,82,83,84,57,85,20,56,82,83,84,57,85,20,56,82,83,84,57,85,20,56,174,174,174,175,176,177,176,177,176,177,176,177,176,177,178,179,180,181,182,183,183,182,184,185,0,0,0,0,0,0,0,0,0,0,0,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,186,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,87,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,22,0,0,0,0,187,187,0,0,105,0,0,0,0,22,22,22,58,0,0,37,22,22,187,111,0,111,0,0,37,40,108,0,0,0,0,37,0,105,108,40,0,188,40,111,101,107,37,102,22,103,40,108,104,109,105,111,101,107,37,102,22,103,40,108,104,109,105,58,58,58,58,58,58,58,58,101,37,102,103,40,104,105,101,37,102,103,40,104,105,103,40,104,105,102,102,101,40,103,37,103,40,104,105,107,37,102,22,22,103,103,40,40,108,108,104,109,105,103,111,111,111,101,107,37,102,22,22,22,103,40,40,108,104,109,105,107,107,40,108,103,40,187,189,187,189,111,40,103,40,104,105,111,101,107,37,102,22,103,40,108,104,109,105,88,92,101,101,107,40,108,92,111,101,101,111,111,40,188,37,188,37,188,37,40,40,103,104,109,103,0,40,58,103,103,0,58,103,104,109,58,107,103,40,104,105,58,103,22,103,103,103,58,103,0,101,37,102,103,40,104,105,108,22,103,40,108,58,58,103,111,101,107,37,102,22,103,40,108,104,109,105,111,101,107,37,102,22,103,40,108,104,109,105,111,101,107,37,102,22,103,40,108,104,109,105,111,101,107,37,102,22,103,40,108,104,109,105,0,190,190,190,0,0,0,135,0,134,134,0,134,135,0,0,0,116,117,131,117,117,117,117,117,116,117,134,131,135,116,117,134,131,135,117,117,117,117,116,116,0,117,116,116,131,117,117,117,116,116,131,0,117,116,116,117,134,131,131,135,135,116,117,134,131,135,117,117,117,117,117,117,117,117,116,131,117,117,116,117,134,131,135,191,117,131,117,117,117,117,117,117,117,117,117,135,117,117,116,117,0,117,117,117,116,116,131,135,116,117,116,116,116,117,134,131,135,116,117,134,131,135,0,116,117,134,131,135,116,116,117,134,131,135,0,0,150,0,0,0,0,0,150,0,150,149,146,147,148,150,149,146,147,148,146,147,148,146,147,148,161,146,147,148,0,146,147,148,149,149,150,149,146,147,148,150,149,146,147,148,150,149,146,147,148,149,148,149,149,146,147,148,150,149,146,147,148,150,149,146,147,148,150,149,146,147,148,150,149,146,147,148,192,193,193,192,193,0,0,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,157,152,157,152,157,26,0,26,26,26,154,26,26,26,26,26,26,157,152,154,26,0,0,0,0,0,0,0,0,154,0,0,26,55,133,133,55,133,152,26,154,156,118,55,133,157,152,26,154,156,118,55,133,157,55,152,26,154,156,118,55,133,157,152,26,154,156,118,55,133,157,152,118,118,55,133,157,156,194,156,156,152,26,154,118,157,55,152,26,26,154,156,118,55,133,157,152,152,152,26,26,154,156,118,55,133,157,152,194,156,156,55,152,26,154,156,118,55,133,157,156,55,152,118,26,55,133,195,156,156,119,156,133,55,133,152,26,154,156,118,55,133,157,26,133,133,152,26,154,156,118,55,133,157,152,26,154,156,118,55,133,157,152,26,154,156,118,55,133,157,152,26,154,156,118,55,133,157,196,164,0,163,163,0,0,163,164,0,0,0,164,128,128,128,128,128,128,128,128,128,129,127,128,164,163,129,127,128,164,163,128,129,127,128,164,163,129,127,128,164,163,164,163,128,128,129,127,164,163,128,128,128,128,128,164,163,128,128,128,129,127,128,164,163,129,127,128,164,163,164,163,128,129,127,128,164,163,128,128,128,128,128,164,163,128,128,128,164,129,127,128,164,163,129,127,128,164,163,129,127,128,164,163,129,127,128,164,163,128,128,129,127,128,164,163],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[1,2],[1],[3,4],[[],5],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,[[],[[9,[[8,[6,7]]]]]],[1,1],[3,3],[10,10],[11,11],[12,12],[13,13],[[]],[[]],[[]],[[]],[[]],[[]],[[1,1],14],[[13,13],14],0,0,[[],3],[[],3],0,0,0,[[],[[9,[1]]]],[[],[[9,[10]]]],[[],[[9,[13]]]],[[1,1],15],[[3,3],15],[[10,10],15],[[11,11],15],[[12,12],15],[[13,13],15],0,[[3,5],16],[[3,5],16],[[17,18],19],[[17,18],19],[[1,18],19],[[3,18],19],[[10,18],19],[[11,18],19],[[12,18],19],[[13,18],19],0,[20,17],[[]],[21,17],[22,17],[23,17],[24,17],[25,17],[26,17],[[]],[[]],[[]],[[]],[[]],[[]],[4,3],[4,3],[4,3],[4,3],[[16,5],3],[[16,5],3],[1],[10],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,[12,27],0,[[1,1],[[28,[14]]]],[[3,3],[[28,[14]]]],[[13,13],[[28,[14]]]],[29],0,0,[3,4],0,0,[1,9],[10,9],[13,9],0,[[3,3]],0,[[]],[[]],[[]],[[]],[[]],[[]],[[],30],0,[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],0,[12,31],0,[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],0,[[],5],[[],33],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,[[],9],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[34,35],[[9,[36,23]]]],[[],37],[[],37],[38,39],[[[34,[40]],41],[[34,[42]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[38,[[8,[38,7]]]],0,[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[39,[[9,[43]]]],[39,[[9,[43]]]],[39,[[9,[43]]]],[[],[[9,[43]]]],[[],[[9,[43]]]],[[],[[9,[43]]]],0,[44,44],[45,45],[34,34],[46,46],[47,47],[38,38],[[]],[[]],[[]],[[]],[[]],[[]],[[44,44],14],[[45,45],14],[[34,34],14],[[46,46],14],[[47,47],14],[[38,38],14],[38,15],0,[[[34,[40]],41],[[34,[42]]]],[[[34,[40]],48,41],[[9,[[34,[49]],50]]]],[[[34,[42]],48],[[9,[[34,[49]],50]]]],[34,51],[[],[[9,[34]]]],[[],[[9,[38]]]],[[[34,[40]]],16],[38,52],[[44,44],15],[[45,45],15],[[34,34],15],[[46,46],15],[[47,47],15],[[38,38],15],0,[34,[[9,[52,23]]]],0,[[38,53],[[9,[54]]]],[[55,56,48],[[9,[[28,[57]],24]]]],[[[34,[40]],55,56,48],[[9,[[28,[57]],24]]]],[[[38,[40,58]],55,56,48],[[9,[[28,[57]],24]]]],[[[34,[40]],48,52,[59,[41]]],[[9,[28,50]]]],[[44,18],[[9,[60]]]],[[45,18],[[9,[60]]]],[[34,18],[[9,[60]]]],[[34,18],[[9,[60]]]],[[46,18],[[9,[60]]]],[[47,18],[[9,[60]]]],[[38,18],[[9,[60]]]],[[38,18],[[9,[60]]]],[34,15],[38,15],[[]],[[]],[61,34],[62,34],[63,34],[64,34],[65,34],[66,34],[[]],[[]],[[]],[[]],[39,[[9,[38,23]]]],[33,[[9,[34,23]]]],[33,[[9,[38,23]]]],[[33,53],[[9,[38,23]]]],[33,[[9,[38,23]]]],[67,[[9,[34,23]]]],[67,[[9,[38,23]]]],[[38,5],[[28,[38]]]],[[38,5],28],[34,[[9,[23]]]],[34,[[9,[23]]]],[38,15],[38,15],[[[34,[40]]],15],[44],[45],[34],[46],[47],[38],[[]],[[]],[[]],[[]],[[]],[[]],[38,39],[[48,35],[[9,[24]]]],[[68,48,35],[[9,[24]]]],[[[34,[40]]],15],[38,15],[38,69],[38,70],[34,[[9,[71,23]]]],[38,[[9,[71,23]]]],[38,[[9,[72]]]],[[44,48],[[28,[73]]]],[38,[[28,[5]]]],[38,[[28,[5]]]],[38,[[28,[5]]]],[38,[[9,[5,23]]]],[34,[[9,[5,23]]]],[38,[[9,[5,23]]]],[[],33],[[],33],[[],33],[[[38,[74]]],[[9,[34,23]]]],[[],34],[[],34],[[[38,[46]]],[[9,[34,23]]]],[[5,[8,[7]]],[[9,[34,23]]]],[65,34],[64,34],[[],[[9,[34,23]]]],[[[38,[47]]],[[9,[34,23]]]],[[5,[8,[7]]],[[9,[34,23]]]],[[[28,[75]]],[[9,[34,23]]]],[[],[[9,[34,23]]]],[[[38,[47]]],[[9,[34,23]]]],[[5,[8,[7]]],[[9,[34,23]]]],0,0,[38,[[9,[23]]]],[52,[[9,[38,23]]]],[[48,33],[[9,[23]]]],[52,[[9,[38,23]]]],[[52,53],[[9,[38,23]]]],[[44,44],[[28,[14]]]],[[45,45],[[28,[14]]]],[[34,34],[[28,[14]]]],[[46,46],[[28,[14]]]],[[47,47],[[28,[14]]]],[[38,38],[[28,[14]]]],[[],5],[[],5],[[],5],0,[38,15],[34,[[9,[23]]]],[38,[[9,[54]]]],[[34,76],[[9,[23]]]],[38,[[9,[[8,[[8,[2,7]],7]],23]]]],[38,[[9,[[8,[[8,[2,7]],7]],23]]]],[34,[[9,[52,23]]]],[34,52],[38,5],[34,9],[38,9],[[],77],[[],77],[[],77],0,[[]],[[]],[[]],[[]],[[]],[[]],[[],30],[[],30],[[[34,[40]],78],30],[38,[[9,[23]]]],[38,[[9,[23]]]],[34,9],[38,9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],0,[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[34,52],[[]],[[]],[[]],[[]],[[]],[[]],0,[38,15],0,[33,[[9,[30,24]]]],[33,[[9,[24]]]],[33,[[9,[30,24]]]],[33,[[9,[24]]]],0,0,0,0,0,0,0,0,0,0,0,0,[[]],[[]],[[24,18],19],[[24,18],19],[79,24],[23,24],[80,24],[20,24],[81,24],[22,24],[[]],[25,24],[[]],[29],[[],30],[[],9],[[],9],[[],32],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[82,82],[83,83],[84,84],[57,57],[85,85],[56,56],[[]],[[]],[[]],[[]],[[]],[[]],0,0,[[],85],[[82,82],15],[[83,83],15],[[84,84],15],[[57,57],15],[[85,85],15],[[20,20],15],[[82,18],19],[[83,18],19],[[84,18],19],[[57,18],19],[[85,18],19],[[20,18],19],[[20,18],19],[[56,18],19],[[]],[[]],[[]],[15,84],[[]],[83,57],[[]],[[]],[[]],[[57,86],[[9,[85,20]]]],[82],[85],[83,30],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[83,15],[84,15],[85,15],0,[[85,85],[[28,[14]]]],[29],[57,15],0,[82,9],[83,9],[84,9],[57,9],[85,9],0,[[]],[[]],[[]],[[]],[[]],[[]],[[],30],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[35,[[9,[87,24]]]],[[[89,[[88,[46]]]],35],[[9,[87,24]]]],[[[90,[[88,[47]]]],35],[[9,[87,24]]]],[[[91,[[88,[47]]]],35],[[9,[87,24]]]],[[[93,[[92,[46]]]],35],[[9,[87,24]]]],[[[94,[[92,[46]]]],35],[[9,[87,24]]]],[[[95,[[92,[47]]]],35],[[9,[87,24]]]],[[[96,[[92,[47]]]],35],[[9,[87,24]]]],[[[97,[[92,[47]]]],35],[[9,[87,24]]]],[[[98,[[92,[47]]]],35],[[9,[87,24]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[87,48,35],[[9,[24]]]],[[48,35],[[9,[24]]]],[[48,35],[[9,[24]]]],[[48,35],[[9,[24]]]],[[48,35],[[9,[24]]]],[[48,35],[[9,[24]]]],[[48,35],[[9,[24]]]],[[48,35],[[9,[24]]]],[[48,35],[[9,[24]]]],[[48,35],[[9,[24]]]],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[],99],[[],37],[[40,41],42],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[39,[[9,[43]]]],[[],[[9,[43]]]],[[[101,[100,58]]],[[101,[100,58]]]],[37,37],[102,102],[103,103],[40,40],[104,104],[105,105],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[103,103],14],[[40,40],14],[[104,104],14],[[105,105],14],0,[[],102],[[[101,[58]]]],[[40,41],42],[103,52],[[37,37],15],[[103,103],15],[[40,40],15],[[104,104],15],[[105,105],15],[[[107,[[0,[106,58]]]],18],19],[[37,18],19],[[102,18],19],[[22,18],19],[[22,18],19],[[103,18],[[9,[60]]]],[[103,18],[[9,[60]]]],[[40,18],[[9,[60]]]],[[40,18],[[9,[60]]]],[[108,18],[[9,[60]]]],[[108,18],[[9,[60]]]],[[104,18],[[9,[60]]]],[[109,18],[[9,[60]]]],[[105,18],[[9,[60]]]],[103,15],[110,[[111,[58]]]],[112,[[111,[58]]]],[[]],[[]],[[]],[[]],[[]],[[]],[25,22],[23,22],[[]],[42,40],[[]],[[]],[[]],[[]],[[]],[[40,99],[[107,[58]]]],[[108,99],[[107,[58]]]],[33,[[9,[40]]]],[33,[[9,[108]]]],[67,[[9,[103,23]]]],[40,73],[[],[[9,[101]]]],[[],[[9,[101]]]],[[],[[9,[101]]]],[[],[[9,[101]]]],[[[111,[58]]],15],[40,15],[103],[40],[104],[105],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],[[9,[107,22]]]],[[[28,[113]],73],[[9,[107,22]]]],[101,[[9,[107,22]]]],[[101,[28,[113]],73],[[9,[107,22]]]],[[[107,[58]]],[[9,[[107,[58]],22]]]],[40,[[9,[[107,[58]],22]]]],[108,[[9,[[107,[58]],22]]]],[[],[[9,[111,22]]]],[[[111,[58]]],[[9,[[111,[58]],22]]]],[101,[[9,[111,22]]]],[[[101,[58]]]],[[[111,[58]],35],[[28,[110]]]],[[[111,[58]],35,48],112],[40,15],[[],15],[37,15],[[],15],[37,15],[[],15],[37,15],[40,15],[40,15],0,0,0,[103,[[9,[71,23]]]],[[],99],[40,114],[38,[[28,[5]]]],[103,5],[103,5],[[99,99],99],[[],33],[[5,[8,[7]]],[[9,[103,23]]]],0,0,[38,[[9,[23]]]],[[[107,[58]],99],[[107,[58]]]],[[103,103],[[28,[14]]]],[[40,40],[[28,[14]]]],[[104,104],[[28,[14]]]],[[105,105],[[28,[14]]]],[[],5],0,[29],[103,[[9,[23]]]],[103,[[9,[[8,[[8,[2,7]],7]],23]]]],[103,5],[[],77],[103,39],[[],99],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[108,48],[[9,[40,115]]]],[[],30],[[],30],[[],30],[[],30],[38,[[9,[23]]]],[38,[[9,[23]]]],[103,[[9,[103]]]],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,[[],[[28,[16]]]],[[],[[28,[3]]]],[5,[[28,[31]]]],0,0,0,0,0,0,0,0,0,0,0,0,0,[[116,116],116],[[117,1,118,[120,[119]]]],0,[[117,121],[[9,[122]]]],[117,123],[117,124],[117,124],[117,123],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[117,125],[[9,[[128,[126,127]],17]]]],[117,[[128,[126,129]]]],[[117,130]],[117,86],[116,116],[[]],0,[117,9],0,[[],116],[131],[[117,1],[[28,[41]]]],[[117,52],28],[[117,1],30],[[],[[9,[116]]]],[[116,116],15],[[131,131],15],0,[[117,132,133],[[9,[15,17]]]],[[116,18],[[9,[60]]]],[[116,18],[[9,[60]]]],[[[117,[106]],18],19],[[134,18],19],[[131,18],19],[[131,18],19],[[[135,[106]],18],19],[[135,18],19],[[]],[[]],[[]],[[]],[[]],[[117,134],131],[117,116],[[117,1],68],[[117,134],131],[[117,10,[28,[136]],15],[[9,[137,17]]]],[[117,1],[[120,[55]]]],[[117,125,15],[[28,[13]]]],[[117,27],[[28,[10]]]],0,0,[[117,138],[[9,[15,139]]]],[[117,130,140],[[9,[15,[141,[140]]]]]],[[]],[[]],[[]],[[]],[[]],[52,15],[[117,52],15],0,[117,86],[117,[[28,[138]]]],[[117,15],[[8,[13]]]],[117,[[8,[10]]]],[117,35],[[142,[28,[142]],35],[[9,[117,135]]]],[[142,[28,[142]],35],[[9,[117,24]]]],[[117,1],41],[[117,1],[[9,[[28,[57]],17]]]],[29],[[117,1],[[28,[68]]]],[117,48],[116,9],[[117,132,133],[[9,[15,17]]]],0,[117,[[86,[1,[0,[143,100]]]]]],[[117,1],[[0,[143,100]]]],[117,144],[[]],[[],30],[[],30],[[],30],[116,16],[117,145],0,[116,16],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],0,[[],32],[[],32],[[],32],[[],32],[[],32],0,[[]],[[]],[[]],[[]],[[]],[[28,35,48],[[9,[30,17]]]],0,0,0,0,0,0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[146,146],[147,147],[148,148],[[]],[[]],[[]],[[[8,[11]],[8,[11]],3,16,52],[[9,[149,17]]]],[[146,[8,[11]],[8,[11]],3,16,52],[[9,[149,17]]]],[[147,[8,[11]],[8,[11]],3,16,52],[[9,[149,17]]]],[[148,[8,[11]],[8,[11]],3,16,52],[[9,[149,17]]]],[[16,3,52],150],[[],146],[[],147],[[],148],0,0,[[150,18],19],[[149,18],19],[[146,18],19],[[147,18],19],[[148,18],19],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[149,16],[16,148],0,[149,16],[[]],[[]],[[]],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,[[]],[[]],[151,[[28,[30]]]],[151,30],[[],[[9,[151]]]],[[117,33,15],[[9,[151,33]]]],[[151,18],19],[[]],[33,[[9,[151]]]],[[]],0,[151,9],[151,30],[[],9],[[],9],[[],32],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[55,152,118,[120,[119]]],[[28,[[120,[119]]]]]],0,0,[[55,48],153],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[153,34,48],55],[152,152],[26,26],[154,154],[[[156,[[0,[100,155,106,100]]]]],[[156,[[0,[100,155,106,100]]]]]],[118,118],[55,55],[133,133],[157,157],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[152,152],14],[[118,118],14],[[],118],[[],55],[[],133],[[],157],[[[156,[[0,[155,106,100]]]]]],[[],[[28,[108]]]],[[[156,[[44,[110]]]]],[[28,[108]]]],[[[156,[158]]],[[28,[108]]]],[[152,152],15],[[26,26],15],[[154,154],15],[[118,118],15],[[157,157],15],[[55,152],[[28,[120]]]],[[152,18],19],[[26,18],19],[[26,18],19],[[154,18],19],[[[156,[[0,[106,155,106,100]]]],18],19],[[118,18],19],[[55,18],19],[[133,18],19],[[157,18],19],[[]],[159,152],[114,152],[160,26],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[152],[48,152],[[[156,[[44,[110]]]],48],152],[[[156,[158]],48],152],[55,[[8,[152]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[[0,[155,106,100]],154],[[156,[[0,[155,106,100]]]]]],[[],55],[[152,152],[[28,[14]]]],[[118,118],[[28,[14]]]],[29],[[55,152,118],[[28,[[120,[119]]]]]],0,[[132,5,133,48],[[9,[26]]]],[[[156,[158]],132,5,133,48],[[9,[26]]]],[[[156,[[44,[110]]]],132,5,133,48],[[9,[26]]]],[[132,133,48],[[9,[26]]]],[[132,133,48],[[9,[26]]]],0,[55,[[8,[120]]]],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],30],0,0,[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,[[[128,[161,129]]],[[128,[161,129]]]],[[[128,[161,162]],27,137,5],[[9,[[128,[161,162]],17]]]],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,129]],52,16],[[128,[161,129]]]],[[[128,[161,162]],27],[[128,[161,162]]]],[[[128,[161,162]],27],[[9,[[128,[161,162]],17]]]],[[[128,[161,162]]],[[9,[[128,[161,162]],17]]]],[[[128,[161,162]],15],[[128,[161,162]]]],[[[128,[126,127]],52],[[9,[[128,[126,127]],17]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[[128,[161,162]],163],[[128,[161,162]]]],[129,129],[127,127],[[[128,[100]]],[[128,[100]]]],[164,164],[163,163],[[]],[[]],[[]],[[]],[[]],[[164,164],14],[[163,163],14],[[[128,[161,162]],161],[[128,[161,162]]]],[[[128,[161,162]],41],[[128,[161,162]]]],[[],129],[[],127],[[],164],[[],163],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,129]],52],[[128,[161,129]]]],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,162]],165],[[128,[161,162]]]],[[164,164],15],[[163,163],15],[[[128,[161,162]],16],[[128,[161,162]]]],[[[128,[161,162]],3],[[128,[161,162]]]],[[[128,[161,162]]],[[9,[17]]]],[[129,18],19],[[127,18],19],[[[128,[106,106,106]],18],19],[[164,18],19],[[163,18],19],[[]],[[]],[[]],[[]],[[]],[164],[163],[[[128,[161,162]]],[[128,[161,162]]]],[[]],[[]],[[]],[[]],[[]],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,162]],166],[[128,[161,162]]]],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,162]]],[[128,[161,162]]]],[[[128,[161,162]],164],[[128,[161,162]]]],[[164,164],[[28,[14]]]],[[163,163],[[28,[14]]]],[[[128,[161,162]],[86,[30,[8,[5]]]],1],[[128,[161,162]]]],[[[128,[161,129]],8],[[128,[161,129]]]],[[[128,[161,162]],136],[[128,[161,162]]]],[[164,130]],[[]],[[]],[[]],[[]],[[]],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[[128,[161,162]],[8,[27]]],[[128,[161,162]]]],[[[128,[161,162]],167],[[128,[161,162]]]],[[]],[[]],[[]],[[]],[[]]],"p":[[4,"KeychainKind"],[15,"u8"],[3,"FeeRate"],[15,"f32"],[15,"usize"],[3,"u5"],[3,"Global"],[3,"Vec"],[4,"Result"],[3,"LocalUtxo"],[3,"WeightedUtxo"],[4,"Utxo"],[3,"TransactionDetails"],[4,"Ordering"],[15,"bool"],[15,"u64"],[4,"Error"],[3,"Formatter"],[6,"Result"],[4,"PolicyError"],[4,"Error"],[4,"KeyError"],[4,"Error"],[4,"Error"],[4,"Error"],[4,"SignerError"],[3,"OutPoint"],[4,"Option"],[3,"Demand"],[3,"String"],[3,"TxOut"],[3,"TypeId"],[15,"str"],[4,"Descriptor"],[4,"Network"],[3,"Address"],[4,"ScriptContextEnum"],[3,"Miniscript"],[4,"Terminal"],[4,"DescriptorPublicKey"],[15,"u32"],[3,"DefiniteDescriptorKey"],[4,"ScriptContextError"],[3,"DescriptorXKey"],[4,"Wildcard"],[4,"Legacy"],[4,"Segwitv0"],[3,"Secp256k1"],[3,"PublicKey"],[4,"ConversionError"],[4,"DescriptorType"],[3,"Script"],[3,"ExtParams"],[4,"AnalysisError"],[3,"SignersContainer"],[4,"BuildSatisfaction"],[3,"Policy"],[8,"ScriptContext"],[3,"Range"],[3,"Error"],[3,"Sh"],[3,"Tr"],[3,"Bare"],[3,"Wsh"],[3,"Wpkh"],[3,"Pkh"],[3,"Tree"],[6,"ExtendedDescriptor"],[3,"Iter"],[3,"PkIter"],[4,"Policy"],[4,"LiftError"],[3,"DerivationPath"],[4,"BareCtx"],[4,"TapTree"],[3,"TxIn"],[4,"SigType"],[3,"HashMap"],[4,"Error"],[4,"Error"],[4,"Error"],[4,"PkOrF"],[4,"SatisfiableItem"],[4,"Satisfaction"],[3,"Condition"],[3,"BTreeMap"],[6,"DescriptorTemplateOut"],[8,"IntoDescriptorKey"],[3,"P2Pkh"],[3,"P2Wpkh_P2Sh"],[3,"P2Wpkh"],[8,"DerivableKey"],[3,"Bip44"],[3,"Bip44Public"],[3,"Bip49"],[3,"Bip49Public"],[3,"Bip84"],[3,"Bip84Public"],[6,"ValidNetworks"],[8,"Clone"],[3,"GeneratedKey"],[3,"PrivateKeyGenerateOptions"],[3,"SortedMultiVec"],[3,"SinglePub"],[4,"SinglePubKey"],[8,"Debug"],[4,"DescriptorKey"],[4,"DescriptorSecretKey"],[3,"SinglePriv"],[3,"ExtendedPrivKey"],[4,"ExtendedKey"],[3,"ExtendedPubKey"],[6,"KeySource"],[3,"Fingerprint"],[3,"DescriptorKeyParseError"],[3,"Balance"],[3,"Wallet"],[3,"SignerOrdering"],[8,"TransactionSigner"],[3,"Arc"],[6,"Update"],[6,"UpdateError"],[3,"ChainGraph"],[3,"TxGraph"],[3,"Txid"],[6,"DefaultCoinSelectionAlgorithm"],[3,"BumpFee"],[3,"TxBuilder"],[3,"CreateTx"],[3,"Transaction"],[3,"AddressInfo"],[3,"PartiallySignedTransaction"],[3,"SignOptions"],[4,"AddressIndex"],[4,"NewError"],[3,"PsbtSighashType"],[3,"Input"],[3,"BlockId"],[4,"InsertCheckpointError"],[4,"ConfirmationTime"],[4,"InsertTxError"],[8,"IntoWalletDescriptor"],[8,"Iterator"],[3,"KeychainChangeSet"],[8,"DoubleEndedIterator"],[3,"LargestFirstCoinSelection"],[3,"OldestFirstCoinSelection"],[3,"BranchAndBoundCoinSelection"],[3,"CoinSelectionResult"],[4,"Excess"],[3,"FullyNodedExport"],[4,"SignerId"],[6,"KeyMap"],[4,"SignerContext"],[8,"Sized"],[3,"SignerWrapper"],[4,"TapLeavesOptions"],[3,"PrivateKey"],[3,"Hash"],[4,"Error"],[8,"CoinSelectionAlgorithm"],[8,"TxBuilderContext"],[4,"ChangeSpendPolicy"],[4,"TxOrdering"],[3,"Sequence"],[4,"LockTime"],[15,"i32"],[8,"Vbytes"],[13,"InsufficientFunds"],[13,"FeeRateTooLow"],[13,"FeeTooLow"],[13,"Foreign"],[8,"ExtractPolicy"],[13,"PsbtTimelocks"],[13,"Complete"],[13,"Partial"],[13,"PartialComplete"],[13,"Sha256Preimage"],[13,"Hash256Preimage"],[13,"Ripemd160Preimage"],[13,"Hash160Preimage"],[13,"Thresh"],[13,"Multisig"],[13,"AbsoluteTimelock"],[13,"RelativeTimelock"],[8,"DescriptorTemplate"],[8,"GeneratableKey"],[8,"ExtScriptContext"],[8,"GeneratableDefaultOptions"],[8,"PsbtUtils"],[8,"IsDust"],[13,"Change"],[13,"NoChange"],[8,"SignerCommon"],[8,"InputSigner"],[13,"Tap"]]},\ -"bdk_chain":{"doc":"This crate is a collection of core structures for Bitcoin …","t":[8,8,17,3,17,8,3,4,3,13,13,13,8,16,8,3,16,4,3,8,3,3,4,13,13,13,16,11,10,11,11,12,12,10,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,12,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,10,11,11,12,11,11,11,11,0,10,0,11,11,11,11,11,2,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,12,12,13,13,3,3,13,6,4,13,4,3,13,13,4,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,12,12,16,3,3,8,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,10,10,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,3,3,3,3,3,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,12,11,12,11,11,11,11,11,11,16,3,8,16,10,11,11,11,11,11,11,10,11,11,11,11,11,11,11,6,3,3,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,8,3,13,4,4,13,3,13,13,13,4,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,3,3,3,3,3,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11],"n":["Anchor","Append","BIP32_MAX_INDEX","BlockId","COINBASE_MATURITY","ChainOracle","ConfirmationHeightAnchor","ConfirmationTime","ConfirmationTimeAnchor","Confirmed","Confirmed","Confirmed","DescriptorExt","Error","ForEachTxOut","FullTxOut","LoadError","ObservedAs","Persist","PersistBackend","SpkIterator","SpkTxOutIndex","TxHeight","Unconfirmed","Unconfirmed","Unconfirmed","WriteError","all_spks","anchor_block","anchor_block","anchor_block","anchor_block","anchor_block","append","apply_additions","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","borrow_mut","chain_graph","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","commit","confirmation_height","confirmation_height","confirmation_height_upper_bound","confirmation_height_upper_bound","confirmation_height_upper_bound","confirmation_height_upper_bound","confirmation_time","default","default","default","default","default","deserialize","deserialize","deserialize","deserialize","deserialize","dust_value","eq","eq","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_txout","from","from","from","from","from","from","from","from","from","from","from","from","from","hash","hash","hash","hash","hash","hash","hash","height","height","height","index_of_spk","index_tx","index_txout","indexed_tx_graph","insert_spk","into","into","into","into","into","into","into","into","into","into","into_iter","is_block_in_chain","is_confirmed","is_confirmed","is_confirmed_and_spendable","is_empty","is_mature","is_mature","is_on_coinbase","is_relevant","is_spendable_at","is_tx_relevant","is_used","keychain","load_from_persistence","local_chain","mark_used","max_ord_of_height","max_ord_of_height","min_ord_of_height","min_ord_of_height","miniscript","net_value","new","new","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","serialize","serialize","serialize","serialize","serialize","sparse_chain","spent_by","spk_at_index","stage","staged","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_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","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","type_id","unmark_used","unused_spks","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","write_changes","height","time","Chain","Chain","ChainGraph","ChangeSet","Conflict","InsertCheckpointError","InsertTxError","Missing","NewError","UnresolvableConflict","UnresolvableConflict","UnresolvableConflict","UpdateError","already_confirmed_tx","append","apply_changeset","apply_update","as_ref","as_ref","as_ref","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","chain","chain","checkpoint_limit","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","contains_eviction","default","default","deserialize","determine_changeset","eq","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_txout","for_each_txout","from","from","from","from","from","from","from","from","from","from","full_txout","get_tx_in_chain","graph","graph","inflate_update","insert_checkpoint","insert_checkpoint_preview","insert_tx","insert_tx_preview","insert_txout","insert_txout_preview","into","into","into","into","into","into","invalidate_checkpoints","invalidate_checkpoints_preview","is_empty","is_empty","new","provide","provide","provide","provide","serialize","set_checkpoint_limit","spent_by","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","transactions_in_chain","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","tx_conflicts_in_chain","type_id","type_id","type_id","type_id","type_id","type_id","update_tx","vzip","vzip","vzip","vzip","vzip","vzip","a","b","Additions","IndexedAdditions","IndexedTxGraph","Indexer","append","apply_additions","apply_additions","apply_update","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","default","default","deserialize","eq","fmt","fmt","from","from","graph","graph_additions","index","index_additions","index_tx","index_txout","insert_relevant_txs","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","DerivationAdditions","KeychainChangeSet","KeychainScan","KeychainTracker","KeychainTxOutIndex","add","add_keychain","add_keychain","append","append","apply_additions","apply_additions","apply_changeset","apply_update","as_inner","as_ref","as_ref","as_ref","as_ref","as_ref","balance","balance_at","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","chain","chain_graph","chain_graph","checkpoint_limit","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","confirmed","default","default","default","default","default","default","deref","derivation_indices","deserialize","deserialize","deserialize","determine_changeset","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_txout","from","from","from","from","from","from","from","from","from","full_txouts","full_utxos","graph","immature","index_tx","index_txout","inner","insert_checkpoint","insert_checkpoint_preview","insert_tx","insert_tx_preview","into","into","into","into","into","into","is_empty","is_empty","is_empty","is_tx_relevant","keychains","keychains","last_active_indices","last_revealed_index","last_revealed_indices","last_used_index","last_used_indices","lookahead_to_target","lookahead_to_target_multi","lookaheads","mark_used","next_index","next_unused_spk","outpoints","persist","reveal_next_spk","reveal_to_target","reveal_to_target_multi","revealed_spks_of_all_keychains","revealed_spks_of_keychain","scan","scan_txout","serialize","serialize","serialize","set_checkpoint_limit","set_lookahead","set_lookahead_for_all","spks_of_all_keychains","spks_of_keychain","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","total","trusted_pending","trusted_spendable","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","txout_index","txouts_of_keychain","type_id","type_id","type_id","type_id","type_id","type_id","unmark_used","untrusted_pending","unused_spks_of_keychain","update","vzip","vzip","vzip","vzip","vzip","vzip","LoadError","Persist","PersistBackend","WriteError","append_changeset","borrow","borrow_mut","commit","fmt","from","into","load_into_keychain_tracker","new","stage","staged","try_from","try_into","type_id","vzip","ChangeSet","InsertBlockNotMatchingError","LocalChain","UpdateNotConnectedError","apply_changeset","apply_update","as_ref","blocks","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","cmp","default","determine_changeset","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from_blocks","height","heights","initial_changeset","insert_block","into","into","into","is_block_in_chain","original_hash","partial_cmp","provide","provide","tip","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","update_hash","vzip","vzip","vzip","ChainPosition","ChangeSet","HashNotMatching","InsertCheckpointError","InsertTxError","NotConnected","SparseChain","TxInconsistent","TxMovedUnexpectedly","TxTooHigh","UpdateError","append","apply_changeset","apply_update","as_ref","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","changeset_additions","checkpoint_at","checkpoint_limit","checkpoints","checkpoints","clear_mempool","clear_mempool_preview","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","default","default","deserialize","determine_changeset","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from_checkpoints","full_txout","height","initial_changeset","insert_checkpoint","insert_checkpoint_preview","insert_tx","insert_tx_preview","into","into","into","into","into","invalidate_checkpoints","invalidate_checkpoints_preview","is_empty","is_empty","latest_checkpoint","max_ord_of_height","min_ord_of_height","provide","provide","provide","range_checkpoints","range_txids","range_txids_by_height","range_txids_by_position","serialize","set_checkpoint_limit","spent_by","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","tx_position","txids","txids","type_id","type_id","type_id","type_id","type_id","unconfirmed","vzip","vzip","vzip","vzip","vzip","height","original_hash","update_hash","original_pos","tip_height","tx_height","txid","txid","update_pos","original_pos","txid","update_pos","Additions","CanonicalTx","TxDescendants","TxGraph","TxNode","all_anchors","all_txouts","anchors","anchors","append","apply_additions","apply_update","as_ref","balance","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","calculate_fee","checked_sum","checked_sum","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmp","cmp","default","default","deref","deserialize","determine_additions","direct_conflicts_of_tx","eq","eq","eq","eq","filter_chain_txouts","filter_chain_unspents","floating_txouts","fmt","fmt","fmt","fmt","for_each_txout","for_each_txout","from","from","from","from","from","full_txs","get_chain_position","get_chain_spend","get_tx","get_tx_node","get_txout","insert_anchor","insert_anchor_preview","insert_seen_at","insert_seen_at_preview","insert_tx","insert_tx_preview","insert_txout","insert_txout_preview","into","into","into","into","into","into_iter","is_empty","is_empty","is_empty","last_seen","last_seen_unconfirmed","list_chain_txs","new","next","node","observed_as","outspends","partial_cmp","partial_cmp","serialize","to_owned","to_owned","to_owned","to_owned","try_balance","try_filter_chain_txouts","try_filter_chain_unspents","try_from","try_from","try_from","try_from","try_from","try_get_chain_position","try_get_chain_spend","try_into","try_into","try_into","try_into","try_into","try_list_chain_txs","tx","tx","tx_outputs","tx_spends","txid","txout","txouts","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","walk_conflicts","walk_descendants"],"q":["bdk_chain","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::ConfirmationTime","","bdk_chain::chain_graph","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::chain_graph::NewError","","bdk_chain::indexed_tx_graph","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::keychain","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::keychain::persist","","","","","","","","","","","","","","","","","","","bdk_chain::local_chain","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::sparse_chain","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::sparse_chain::InsertCheckpointError","","","bdk_chain::sparse_chain::InsertTxError","","","","","","bdk_chain::sparse_chain::UpdateError","","","bdk_chain::tx_graph","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"d":["Trait that “anchors” blockchain data to a specific …","Trait that makes an object appendable.","Maximum BIP32 derivation index.","A reference to a block in the canonical chain.","How many confirmations are needed f or a coinbase output …","Represents a service that tracks the blockchain.","An Anchor implementation that also records the exact …","Block height and timestamp at which a transaction is …","An Anchor implementation that also records the exact …","The chain data is seen as confirmed, and in anchored by A.","","","A trait to extend the functionality of a miniscript …","Error type.","Trait to do something with every txout contained in a …","A TxOut with as much data as we can retrieve about it","The error the backend returns when it fails to load …","Represents an observation of some chain data.","Persist wraps a PersistBackend (B) to create a convenient …","A persistence backend for Persist.","An iterator for derived script pubkeys.","An index storing TxOuts that have a script pubkey that …","Represents the height at which a transaction is confirmed.","The chain data is seen in mempool at this given timestamp.","","","The error the backend returns when it fails to write.","The script pubkeys that are being tracked by the index.","Returns the BlockId that the associated blockchain data is …","","","The anchor block.","The anchor block.","Append another object of the same type onto self.","","","","","","","","","","","","","","","","","","","","","","","Module for structures that combine the features of …","The position of the transaction in outpoint in the overall …","","","","","","","","","","","","","","","","","","","","","","","","","","","Commit the staged changes to the underlying persistance …","The exact confirmation height of the transaction.","","Get the upper bound of the chain data’s confirmation …","Get the upper bound of the chain data’s confirmation …","","","","","","","","","","","","","","Returns the minimum value (in satoshis) at which an output …","","","","","","","","","","","","","","","","","","The provided closure f will be called with each …","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","","","","","The hash of the block.","","","The height of the block.","Returns the index associated with the script pubkey.","","","","Adds a script pubkey to scan for. Returns false and does …","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","Determines whether block of BlockId exists as an ancestor …","","","Whether the utxo is/was/will be spendable with chain tip.","Returns whether the structure is considered empty.","","Whether the txout is considered mature.","Whether this output is on a coinbase transaction.","Whether any of the inputs of this transaction spend a …","Whether the utxo is/was/will be spendable at height.","","Returns whether the script pubkey at index has been used …","Module for keychain related structures.","Return the aggregate changeset C from persistence.","","Marks the script pubkey at index as used even though it …","","","","","","Computes the net value that this transaction gives to the …","Create a new Persist from PersistBackend.","Creates a new script pubkey iterator starting at 0 from a …","","","The location of the TxOut.","Get a reference to the set of indexed outpoints.","Iterates over all the outputs with script pubkeys in an …","","","","","","","","Scans an object containing many txouts.","Scan a single TxOut for a matching script pubkey and …","Computes total input value going from script pubkeys in …","","","","","","Module for structures that maintain sparse (purposely …","The txid and chain position of the transaction (if any) …","Returns the script that has been inserted at the index.","Stage a changeset to be commited later with commit.","Get the changes that have not been commited yet.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Module for structures that store and traverse transactions.","Returns the txout and script pubkey index of the TxOut at …","The TxOut.","Iterate over all known txouts that spend to tracked script …","Finds all txouts on a transaction that has previously been …","","","","","","","","","","","Undoes the effect of mark_used. Returns whether the index …","Iterates over all unused script pubkeys in an index range.","","","","","","","","","","","Writes a changeset to the persistence backend.","","","","The update chain was inconsistent with the existing chain","A consistent combination of a SparseChain<P> and a …","Represents changes to ChainGraph.","Two transactions within the sparse chain conflicted with …","A nice alias of sparse_chain::InsertCheckpointError.","Error that may occur when inserting a transaction.","One or more transactions in the chain were not in the graph","Error that may occur when calling ChainGraph::new.","Represents an unresolvable conflict between an update’s …","","A transaction in the update spent the same input as an …","Represents an update failure.","","Appends the changes in other into self such that applying …","Applies changeset to self.","Applies the update chain graph. Note this is shorthand for …","","","","","","","","","","","","","","","","Returns a reference to the internal SparseChain.","","Gets the checkpoint limit.","","","","","","","","","","","","","Returns true if this ChangeSet contains transaction …","","","","Calculates the difference between self and update in the …","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Returns the argument unchanged.","","Returns the argument unchanged.","","Returns the argument unchanged.","Get the full transaction output at an outpoint if it …","Get a transaction currently in the underlying SparseChain.","Returns a reference to the internal TxGraph.","","Take an update in the form of a SparseChain<P> and attempt …","Inserts checkpoint into Self.","Determines the changes required to insert a block_id (a …","Inserts Transaction at the given chain position.","Determines the changes required to insert a transaction …","Inserts a TxOut into the internal TxGraph.","Determines the changes required to insert a TxOut into the …","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Invalidate checkpoints from_height (inclusive) and above. …","Determines the changes required to invalidate checkpoints …","Whether the chain graph contains any data whatsoever.","Returns true if this ChangeSet records no changes.","Create a new chain graph from a chain and a graph.","","","","","","Sets the checkpoint limit.","Find the transaction in the chain that spends outpoint.","","","","","","","","","","","Iterate over the full transactions and their position in …","","","","","","","","","","","","","Given a transaction, return an iterator of txids that …","","","","","","","","","","","","","","","","The resultant “additions” when new transaction data is …","A structure that represents changes to an IndexedTxGraph.","A struct that combines TxGraph and an Indexer …","Represents a structure that can index transaction data.","","Apply additions to itself.","Applies the IndexedAdditions to the IndexedTxGraph.","Apply an update directly.","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Get a reference of the internal transaction graph.","TxGraph additions.","Transaction index.","Indexer additions.","Scan and index the given transaction.","Scan and index the given outpoint and txout.","Insert relevant transactions from the given txs iterator.","Insert and index a transaction into the graph.","Insert a floating txout of given outpoint.","Calls U::from(self).","Calls U::from(self).","","Determines whether the transaction should be included in …","Construct a new IndexedTxGraph with a given index.","","","","","","","","","","","Balance, differentiated into various categories.","Represents updates to the derivation index of a …","Represents changes to a KeychainTracker.","An update that includes the last active indexes of each …","A convenient combination of a KeychainTxOutIndex and a …","A convenient wrapper around SpkTxOutIndex that relates …","","Add a keychain to the tracker’s txout_index with a …","Add a keychain to the tracker’s txout_index with a …","Append another DerivationAdditions into self.","Appends the changes in other into self such that applying …","Applies the derivation additions to the KeychainTxOutIndex…","","Applies the changes in changeset to KeychainTracker.","Directly applies a KeychainScan on KeychainTracker.","Get the inner map of the keychain to its new derivation …","","","","","","Returns the balance of the keychain, i.e., the value of …","Returns the balance of all spendable confirmed unspent …","","","","","","","","","","","","","Returns a reference to the internal SparseChain (which is …","Returns a reference to the internal ChainGraph.","The changes that have occurred in the blockchain","Get the checkpoint limit of the internal SparseChain.","","","","","","","","","","","","","Confirmed and immediately spendable balance","","","","","","","","The changes in local keychain derivation indices","","","","Determines the resultant KeychainChangeSet if the given …","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","","Returns the argument unchanged.","Returns the argument unchanged.","Iterates through FullTxOuts that are considered to exist …","Iterates through FullTxOuts that are unspent outputs.","Returns a reference to the internal TxGraph (which is part …","All coinbase outputs not yet matured","","","Return a reference to the internal SpkTxOutIndex.","Directly insert a block_id into the tracker.","Determines the changes as a result of inserting block_id …","Directly insert a transaction into the inner ChainGraph …","Determines the changes as a result of inserting a …","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Returns whether the additions are empty.","","Returns whether the KeychainChangeSet is empty (no changes …","","Get the internal map of keychains to their descriptors. …","Return a reference to the internal map of the keychain to …","The last active indexes of each keychain","Get the last derivation index revealed for keychain.","Get the last derivation index that is revealed for each …","Returns the highest derivation index of the keychain where …","Returns the highest derivation index of each keychain that …","Store lookahead scripts until target_index.","Convenience method to call lookahead_to_target for …","Return the lookahead setting for each keychain.","Marks the script pubkey at index as used even though the …","Get the next derivation index for keychain. The next index …","Gets the next unused script pubkey in the keychain. I.e., …","Get a reference to the set of indexed outpoints.","Persistence for changes made to a KeychainTracker.","Attempts to reveal the next script pubkey for keychain.","Reveals script pubkeys of the keychain’s descriptor up …","Convenience method to call Self::reveal_to_target on …","Convenience method to get revealed_spks_of_keychain of all …","Iterates over the script pubkeys revealed by this index …","Scans an object for relevant outpoints, which are stored …","Scan a single outpoint for a matching script pubkey.","","","","Set the checkpoint limit of the internal SparseChain.","Set the lookahead count for keychain.","Convenience method to call set_lookahead for all keychains.","Generates script pubkey iterators for every keychain. The …","Generates a script pubkey iterator for the given keychain…","","","","","","","","Get the whole balance visible to the wallet.","Unconfirmed UTXOs generated by a wallet tx","Get sum of trusted_pending and confirmed coins.","","","","","","","","","","","","","Index between script pubkeys to transaction outputs","Iterates over all the OutPoint that have a TxOut with a …","","","","","","","Undoes the effect of mark_used. Returns whether the index …","Unconfirmed UTXOs received from an external wallet","Iterates over all unused script pubkeys for a keychain …","The update data in the form of a chain that could be …","","","","","","","The error the backend returns when it fails to load.","Persist wraps a PersistBackend to create a convenient …","A persistence backend for Persist.","The error the backend returns when it fails to write.","Appends a new changeset to the persistent backend.","","","Commit the staged changes to the underlying persistence …","","Returns the argument unchanged.","Calls U::from(self).","Applies all the changesets the backend has received to …","Create a new Persist from a PersistBackend.","Stage a changeset to later persistence with commit.","Get the changes that haven’t been committed yet","","","","","This is the return value of determine_changeset and …","Represents a failure when trying to insert a checkpoint …","This is a local implementation of ChainOracle.","Represents an update failure of LocalChain due to the …","Applies the given changeset.","Updates LocalChain with an update LocalChain.","","Get a reference to a map of block height to hash.","","","","","","","","","","","","","","","This is like the sparsechain’s logic, expect we must …","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","","","Insert a block of BlockId into the LocalChain.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","Represents a position in which transactions are ordered in …","The return value of determine_changeset.","Occurs when a checkpoint of the same height already exists …","Represents a failure when trying to insert a checkpoint …","Represents a failure when trying to insert a Txid into …","The update cannot be applied to the chain because the …","This is a non-monotone structure that tracks relevant Txid…","The update contains inconsistent tx states (e.g., it …","Occurs when the Txid is already in the SparseChain, and …","Occurs when the Txid is to be inserted at a height higher …","Represents an update failure of SparseChain.","Appends the changes of other into self such that applying …","","Updates SparseChain with another chain that connects to it.","","","","","","","","","","","","Return Txids that would be added to the sparse chain if …","Get the checkpoint at the given height if it exists.","Returns the value set as the checkpoint limit.","Return a BTreeMap of all checkpoints (block hashes by …","","Clears all transactions of height TxHeight::Unconfirmed.","Determines the ChangeSet when all transactions of height …","","","","","","","","","","","","","","Preview changes of updating Self with another chain that …","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Creates a new chain from a list of block hashes and …","Attempt to retrieve a FullTxOut of the given outpoint.","Get the transaction height of the position.","Derives a ChangeSet that assumes that there are no …","Insert a checkpoint (BlockId).","Determines the resultant ChangeSet if BlockId was inserted.","Inserts a given Txid at pos.","Determines the resultant ChangeSet if Txid was inserted at …","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Invalidate checkpoints from_height (inclusive) and above.","Determines the ChangeSet when checkpoints from_height …","Returns whether the sparse chain contains any checkpoints …","Whether this changeset contains no changes.","Get the checkpoint for the last known tip.","Get the position’s upper bound of a given height.","Get the position’s lower bound of a given height.","","","","Return an iterator over checkpoints in a height range, in …","Iterate over a sub-range of positioned Txids.","Iterate over a sub-range of positioned Txids, where the …","Iterate over a sub-range of positioned Txids, where the …","","Set the checkpoint limit.","Finds the transaction in the chain that spends outpoint.","","","","","","","","","","","","","","","","","","","Return the ChainPosition of a txid.","Iterate over all Txids ordered by their ChainPosition.","","","","","","","Get the unconfirmed position.","","","","","","","","","","","","","","","","","","A structure that represents changes to a TxGraph.","An outwards-facing view of a transaction that is part of …","An iterator that traverses transaction descendants.","A graph of transactions and spends.","An outward-facing view of a (transaction) node in the …","Get all transaction anchors known by TxGraph.","Iterate over all tx outputs known by TxGraph.","The blocks that the transaction is “anchored” in.","","","Applies Additions to TxGraph.","Extends this graph with another so that self becomes the …","","Get the total balance of outpoints that are in chain of …","","","","","","","","","","","Calculates the fee of a given transaction. Returns 0 if tx …","","","","","","","","","","","","","","","","","Previews the resultant Additions when Self is updated …","Given a transaction, return an iterator of txids that …","","","","","Get a filtered list of outputs from the given outpoints …","Get a filtered list of unspent outputs (UTXOs) from the …","Iterate over floating txouts known by TxGraph.","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Iterate over all full transactions in the graph.","Get the position of the transaction in chain with tip …","Get the txid of the spending transaction and where the …","Get a transaction by txid. This only returns Some for full …","Get a transaction node by txid. This only returns Some for …","Obtains a single tx output (if any) at the specified …","Inserts the given anchor into TxGraph.","Returns the resultant Additions if the txid is set in …","Inserts the given seen_at into TxGraph.","Returns the resultant Additions if the txid is set to …","Inserts the given transaction into TxGraph.","Returns the resultant Additions if the given transaction …","Inserts the given TxOut at OutPoint.","Returns the resultant Additions if the given txout is …","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","Whether the graph has any transactions or outputs in it.","Returns true if the Additions is empty (no transactions or …","","","The last-seen unix timestamp of the transaction as …","List graph transactions that are in chain with chain_tip.","Construct a new TxGraph from a list of transactions.","","The transaction node (as part of the graph).","How the transaction is observed as (confirmed or …","The transactions spending from this output.","","","","","","","","Get the total balance of outpoints that are in chain of …","Get a filtered list of outputs from the given outpoints …","Get a filtered list of unspent outputs (UTXOs) from the …","","","","","","Get the position of the transaction in chain with tip …","Get the txid of the spending transaction and where the …","","","","","","List graph transactions that are in chain with chain_tip.","A partial or full representation of the transaction.","","Returns known outputs of a given txid.","Iterates over the transactions spending from txid.","Txid of the transaction.","","Iterates over all outpoints contained within Additions.","","","","","","","","","","","Creates an iterator that both filters and maps conflicting …","Creates an iterator that filters and maps descendants from …"],"i":[0,0,0,0,0,0,0,0,0,8,9,10,0,84,0,0,85,0,0,0,0,0,0,8,9,10,85,3,30,6,7,6,7,56,3,0,3,8,9,10,5,6,7,11,14,12,3,8,9,10,5,6,7,11,14,12,0,11,3,8,9,10,5,6,7,11,12,3,8,9,10,5,6,7,11,12,8,8,9,10,5,6,7,11,14,6,7,30,30,6,7,7,3,9,5,6,7,9,10,5,6,7,86,8,9,10,5,6,7,11,3,8,9,9,10,5,6,7,11,14,87,3,8,9,9,10,5,5,5,6,7,11,14,12,8,9,10,5,6,7,5,9,10,5,3,3,3,0,3,3,8,9,10,5,6,7,11,14,12,12,84,9,10,11,56,11,11,11,3,11,3,3,0,85,0,3,9,10,9,10,0,3,14,12,12,12,11,3,3,8,9,10,5,6,7,11,3,3,3,9,10,5,6,7,0,11,3,14,14,3,8,9,10,5,6,7,11,12,9,3,8,9,10,5,6,7,11,14,12,3,8,9,10,5,6,7,11,14,12,0,3,11,3,3,3,8,9,10,5,6,7,11,14,12,3,3,3,8,9,10,5,6,7,11,14,12,85,88,88,48,44,0,0,47,0,0,47,0,0,48,44,0,49,42,43,43,43,43,43,43,42,47,48,44,49,43,42,47,48,44,49,43,42,43,43,42,47,48,44,49,43,42,47,48,44,49,42,43,42,42,43,43,42,47,48,44,49,43,42,47,47,48,48,44,44,49,49,43,42,43,42,47,48,48,48,44,44,44,49,43,43,43,42,43,43,43,43,43,43,43,43,42,47,48,44,49,43,43,43,42,43,47,48,44,49,42,43,43,43,42,47,48,44,49,47,48,44,49,43,43,42,47,48,44,49,43,42,47,48,44,49,43,43,42,47,48,44,49,49,43,42,47,48,44,49,89,89,58,0,0,0,57,58,59,59,59,57,59,57,57,57,59,57,57,57,59,57,59,57,59,57,59,57,58,58,59,59,59,59,57,57,58,59,57,57,59,57,59,57,59,57,59,57,0,0,0,0,0,0,61,62,65,66,67,65,65,62,62,66,62,62,62,66,68,62,62,62,65,66,68,67,61,62,65,66,68,67,61,62,62,67,62,62,65,66,68,67,61,62,65,66,68,67,61,61,62,65,66,68,67,61,65,67,66,67,61,62,66,68,61,62,65,66,68,67,61,61,67,62,65,66,68,68,67,67,67,61,62,62,62,61,65,65,65,62,62,62,62,62,65,66,68,67,61,66,66,67,65,62,65,68,65,65,65,65,65,65,65,65,65,65,65,0,65,65,65,65,65,65,65,66,67,61,62,65,65,65,65,62,65,66,68,67,61,61,61,61,61,62,65,66,68,67,61,62,65,66,68,67,61,62,65,62,65,66,68,67,61,65,61,65,68,62,65,66,68,67,61,90,0,0,90,90,69,69,69,69,69,69,90,69,69,69,69,69,69,69,0,0,0,0,70,70,70,70,70,72,73,70,72,73,70,72,73,70,72,73,70,70,70,70,72,73,70,72,72,73,73,70,70,72,73,70,73,70,70,70,70,72,73,70,73,70,72,73,70,70,72,73,72,73,70,72,73,70,72,73,70,72,73,73,70,72,73,0,0,76,0,0,51,0,51,50,50,0,75,46,46,46,46,50,76,51,75,46,50,76,51,75,46,46,46,46,75,46,46,46,50,76,51,75,46,50,76,51,75,46,75,75,46,46,50,76,51,75,46,50,50,76,76,51,51,75,46,50,76,51,75,46,46,31,46,46,46,46,46,46,50,76,51,75,46,46,46,75,46,31,31,50,76,51,46,46,46,46,75,46,46,46,50,76,51,75,50,76,51,46,50,76,51,75,46,50,76,51,75,46,46,75,46,50,76,51,75,31,46,50,76,51,75,91,91,91,92,93,93,93,92,92,94,94,94,0,0,0,0,0,45,45,80,77,77,45,45,45,45,82,45,80,81,77,82,45,80,81,77,45,82,82,45,80,81,77,45,80,81,77,80,81,45,77,80,77,45,45,45,80,81,77,45,45,45,45,80,81,77,45,77,82,45,80,81,77,45,45,45,45,45,45,45,45,45,45,45,45,45,45,82,45,80,81,77,82,45,77,77,77,80,45,45,82,81,81,45,80,81,77,45,80,81,77,45,45,45,82,45,80,81,77,45,45,82,45,80,81,77,45,80,77,45,45,80,77,77,82,45,80,81,77,82,45,80,81,77,45,45],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[[3,[[0,[1,2]]]]],4],[[],5],[6,5],[7,5],0,0,[[]],[[[3,[[0,[1,2]]]]]],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,[[[3,[1]]],[[3,[1]]]],[[[8,[1]]],[[8,[1]]]],[9,9],[10,10],[5,5],[6,6],[7,7],[[[11,[1]]],[[11,[1]]]],[[[12,[1]]],[[12,[1]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[8,[[8,[1]]]],[[[8,[2]],8],13],[[9,9],13],[[10,10],13],[[5,5],13],[[6,6],13],[[7,7],13],[[[11,[2]],11],13],[14,[[16,[15]]]],0,0,[[],17],[[],17],[6,17],[7,17],0,[[],3],[[],9],[[],5],[[],6],[[],7],[[],[[16,[9]]]],[[],[[16,[10]]]],[[],[[16,[5]]]],[[],[[16,[6]]]],[[],[[16,[7]]]],[[],18],[[[8,[19]],8],20],[[9,9],20],[[10,10],20],[[5,5],20],[[6,6],20],[[7,7],20],[[[11,[19]],11],20],[[[3,[21]],22],23],[[[8,[21]],22],23],[[9,22],23],[[9,22],23],[[10,22],23],[[5,22],23],[[6,22],23],[[7,22],23],[[[11,[21]],22],23],[[[14,[21,21]],22],23],[24],[[]],[[]],[[[15,[17]]],9],[[]],[[]],[[],5],[[],5],[[]],[[]],[[]],[[]],[[]],[[]],[[[8,[25]]]],[9],[10],[5],[6],[7],0,[9,9],[10,9],0,[[[3,[[0,[1,2]]]],26],15],[[[3,[[0,[1,2]]]],27]],[[[3,[[0,[1,2]]]],28,29]],0,[[[3,[[0,[1,2]]]],[0,[1,2]],26],20],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[5,5],[[16,[[15,[20]]]]]],[9,20],[10,20],[[[11,[[8,[30]]]],17],20],[[],20],[[[11,[31]],17],20],[[[11,[[8,[30]]]],17],20],0,[[[3,[[0,[1,2]]]],27],20],[[[11,[31]],17],20],[[[3,[[0,[1,2]]]],27],20],[[[3,[[0,[1,2]]]]],20],0,[[],16],0,[[[3,[[0,[1,2]]]]],20],[9,9],[9,10],[9,9],[9,10],0,[[[3,[[0,[1,2]]]],27],32],[[],14],[[],12],[12,15],[[12,33],15],0,[[[3,[[0,[1,2]]]]],34],[[[3,[[0,[1,2]]]],[35,[[0,[1,2]]]]],36],[[[8,[37]],8],[[15,[13]]]],[[9,9],[[15,[13]]]],[[10,10],[[15,[13]]]],[[5,5],[[15,[13]]]],[[6,6],[[15,[13]]]],[[7,7],[[15,[13]]]],[[[11,[37]],11],[[15,[13]]]],[[[3,[[0,[1,2]]]]],[[34,[[0,[1,2]]]]]],[[[3,[[0,[1,2]]]],28,29],15],[[[3,[[0,[1,2]]]],27]],[9,16],[10,16],[5,16],[6,16],[7,16],0,0,[[[3,[[0,[1,2]]]]],[[15,[26]]]],[14],[14],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],38],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],0,[[[3,[[0,[1,2]]]],28],15],0,[[[3,[[0,[1,2]]]]],[[0,[36,39]]]],[[[3,[[0,[1,2]]]],40],36],[[],41],[[],41],[[],41],[[],41],[[],41],[[],41],[[],41],[[],41],[[],41],[[],41],[[[3,[[0,[1,2]]]]],20],[[[3,[[0,[1,2]]]]],36],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[42,42]],[[43,42]],[[43,43],[[16,[42,44]]]],[43,45],[43,43],[43,46],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[43,46],0,[43,[[15,[33]]]],[[[43,[1]]],[[43,[1]]]],[[[42,[1]]],[[42,[1]]]],[[[47,[1]]],[[47,[1]]]],[[[48,[1]]],[[48,[1]]]],[[[44,[1]]],[[44,[1]]]],[[[49,[1]]],[[49,[1]]]],[[]],[[]],[[]],[[]],[[]],[[]],[42,20],[[],43],[[],42],[[],[[16,[42]]]],[[43,43],[[16,[42,44]]]],[[[43,[19]],43],20],[[[42,[19]],42],20],[[[47,[19]],47],20],[[[48,[19]],48],20],[[[44,[19]],44],20],[[[49,[19]],49],20],[[[43,[21]],22],23],[[[42,[21]],22],23],[[[47,[21]],22],23],[[[47,[21]],22],23],[[[48,[21]],22],23],[[[48,[21]],22],23],[[[44,[21]],22],23],[[[44,[21]],22],23],[[[49,[21]],22],23],[[[49,[21]],22],23],[[43,24]],[[42,24]],[[]],[[]],[[]],[50,48],[49,48],[[]],[51,44],[[]],[49,44],[[]],[[43,28],[[15,[11]]]],[[43,40],15],[43,45],0,[[43,46,52],[[16,[43,47]]]],[[43,5],[[16,[42,53]]]],[[43,5],[[16,[42,53]]]],[[43,27],[[16,[42,48]]]],[[43,27],[[16,[42,48]]]],[[43,28,29],42],[[43,28,29],42],[[]],[[]],[[]],[[]],[[]],[[]],[[43,17],42],[[43,17],42],[43,20],[42,20],[[46,45],[[16,[43,47]]]],[54],[54],[54],[54],[42,16],[[43,[15,[33]]]],[[43,28],15],[[]],[[]],[[]],[[]],[[]],[[]],[[],38],[[],38],[[],38],[[],38],[43,36],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[43,27],55],[[],41],[[],41],[[],41],[[],41],[[],41],[[],41],0,[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,[[[57,[30,56]],[57,[30,56]]]],[[]],[[[59,[30,58]],[57,[30]]]],[[[59,[30,58]],[45,[30]]],[[57,[30]]]],[[]],[[]],[[]],[[]],[[[57,[1,1]]],[[57,[1,1]]]],[[]],[[],[[59,[60]]]],[[],[[57,[60]]]],[[],[[16,[57]]]],[[[57,[19,19]],57],20],[[[59,[21,21]],22],23],[[[57,[21,21]],22],23],[[]],[[]],[59,45],0,0,0,[27],[[28,29]],[[[59,[30,58]],52,[15,[18]]],[[57,[30]]]],[[[59,[30,58]],27,52,[15,[18]]],[[57,[30]]]],[[[59,[30,58]],28,29],[[57,[30]]]],[[]],[[]],[[[57,[30,56]]],20],[27,20],[[],59],[57,16],[[]],[[],16],[[],16],[[],16],[[],16],[[],41],[[],41],[[]],[[]],0,0,0,0,0,0,[[61,61],61],[[62,[64,[63]]]],[[[65,[[0,[1,2,21]]]],[0,[1,2,21]],[64,[63]]]],[[[66,[2]],[66,[2]]]],[[67,67]],[[[65,[[0,[1,2,21]]]],[66,[[0,[1,2,21]]]]]],[[[65,[[0,[1,2,21]]]]]],[[62,67]],[[62,68],[[16,[67,44]]]],[66,4],[62,46],[62,45],[62,43],[66,4],[68,45],[[62,24],61],[[62,17],18],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[62,46],[62,43],0,[62,[[15,[33]]]],[[[62,[1,1]]],[[62,[1,1]]]],[[[65,[1]]],[[65,[1]]]],[[[66,[1]]],[[66,[1]]]],[[[68,[1,1]]],[[68,[1,1]]]],[[[67,[1,1]]],[[67,[1,1]]]],[61,61],[[]],[[]],[[]],[[]],[[]],[[]],0,[[],62],[[],65],[[],66],[[],68],[[],67],[[],61],[65],0,[[],[[16,[66]]]],[[],[[16,[67]]]],[[],[[16,[61]]]],[[62,68],[[16,[67,44]]]],[[[66,[19]],66],20],[[[68,[19,19]],68],20],[[61,61],20],[[[62,[21,21]],22],23],[[[65,[21]],22],23],[[[66,[21]],22],23],[[[68,[21,21]],22],23],[[[67,[21,21]],22],23],[[61,22],23],[[61,22],23],[[67,24]],[[]],[[]],[[]],[[]],[43,68],[66,67],[42,67],[[]],[[]],[62,55],[62,55],[62,45],0,[[[65,[[0,[1,2,21]]]],27]],[[[65,[[0,[1,2,21]]]],28,29]],[[[65,[[0,[1,2,21]]]]],3],[[62,5],[[16,[67,53]]]],[[62,5],[[16,[67,53]]]],[[62,27],[[16,[67,48]]]],[[62,27],[[16,[67,48]]]],[[]],[[]],[[]],[[]],[[]],[[]],[66,20],[[[66,[2]]],20],[67,20],[[[65,[[0,[1,2,21]]]],27],20],[62,4],[[[65,[[0,[1,2,21]]]]],4],0,[[[65,[[0,[1,2,21]]]]],[[15,[17]]]],[[[65,[[0,[1,2,21]]]]],4],[[[65,[[0,[1,2,21]]]]],[[15,[17]]]],[[[65,[[0,[1,2,21]]]]],[[4,[[0,[1,2,21]],17]]]],[[[65,[[0,[1,2,21]]]],17]],[[[65,[[0,[1,2,21]]]],[4,[[0,[1,2,21]],17]]]],[[[65,[[0,[1,2,21]]]]],4],[[[65,[[0,[1,2,21]]]],17],20],[[[65,[[0,[1,2,21]]]]]],[[[65,[[0,[1,2,21]]]]]],[[[65,[[0,[1,2,21]]]]],34],0,[[[65,[[0,[1,2,21]]]]]],[[[65,[[0,[1,2,21]]]],17]],[[[65,[[0,[1,2,21]]]],4]],[[[65,[[0,[1,2,21]]]]],[[4,[[0,[1,2,21]],[0,[55,1]]]]]],[[[65,[[0,[1,2,21]]]]],[[0,[36,1]]]],[[[65,[[0,[1,2,21]]]]],[[66,[[0,[1,2,21]]]]]],[[[65,[[0,[1,2,21]]]],28,29],[[66,[[0,[1,2,21]]]]]],[66,16],[67,16],[61,16],[[62,[15,[33]]]],[[[65,[[0,[1,2,21]]]],17]],[[[65,[[0,[1,2,21]]]],17]],[[[65,[[0,[1,2,21]]]]],[[4,[[0,[1,2,21]],[12,[[64,[63]]]]]]]],[[[65,[[0,[1,2,21]]]]],[[12,[[64,[63]]]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[],38],[61,18],0,[61,18],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],0,[[[65,[[0,[1,2,21]]]]],36],[[],41],[[],41],[[],41],[[],41],[[],41],[[],41],[[[65,[[0,[1,2,21]]]],17],20],0,[[[65,[[0,[1,2,21]]]]],36],0,[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,[67,16],[[]],[[]],[69,16],[[[69,[21,21,21]],22],23],[[]],[[]],[62,16],[[],69],[[69,67]],[69,67],[[],16],[[],16],[[],41],[[]],0,0,0,0,[[70,71]],[[70,70],[[16,[71,72]]]],[70,4],[70,4],[[]],[[]],[[]],[[]],[[]],[[]],[70,70],[72,72],[73,73],[[]],[[]],[[]],[[70,70],13],[[],70],[[70,70],[[16,[71,72]]]],[[70,70],20],[[72,72],20],[[73,73],20],[[70,22],23],[[72,22],23],[[72,22],23],[[73,22],23],[[73,22],23],[[[4,[17,74]]],70],[[]],[[]],[[]],[[],70],0,[70,[[34,[17]]]],[70,71],[[70,5],[[16,[71,73]]]],[[]],[[]],[[]],[[70,5,5],[[16,[[15,[20]]]]]],0,[[70,70],[[15,[13]]]],[54],[54],[70,[[15,[5]]]],[[]],[[]],[[]],[[],38],[[],38],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],41],[[],41],[[],41],0,[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,[[75,75]],[[[46,[31]],[75,[31]]]],[[[46,[31]],[46,[31]]],[[16,[[75,[31]],[51,[31]]]]]],[46,46],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[[46,[31]],75],55],[[[46,[31]],17],[[15,[5]]]],[[[46,[31]]],[[15,[33]]]],[[[46,[31]]],4],0,[[[46,[31]]],[[75,[31]]]],[[[46,[31]]],[[75,[31]]]],[[[46,[1]]],[[46,[1]]]],[[[50,[1]]],[[50,[1]]]],[76,76],[[[51,[1]]],[[51,[1]]]],[[[75,[1]]],[[75,[1]]]],[[]],[[]],[[]],[[]],[[]],[[],46],[[],75],[[],[[16,[75]]]],[[[46,[31]],[46,[31]]],[[16,[[75,[31]],[51,[31]]]]]],[[[46,[19]],46],20],[[[50,[19]],50],20],[[76,76],20],[[[51,[19]],51],20],[[[75,[19]],75],20],[[[46,[21]],22],23],[[[50,[21]],22],23],[[[50,[21]],22],23],[[76,22],23],[[76,22],23],[[[51,[21]],22],23],[[[51,[21]],22],23],[[[75,[21]],22],23],[[]],[[]],[[]],[[]],[[]],[[],[[46,[31]]]],[[[46,[31]],45,28],[[15,[[11,[31]]]]]],[[],9],[[[46,[31]]],[[75,[31]]]],[[[46,[31]],5],[[16,[[75,[31]],76]]]],[[[46,[31]],5],[[16,[[75,[31]],76]]]],[[[46,[31]],40,31],[[16,[[75,[31]],[50,[31]]]]]],[[[46,[31]],40,31],[[16,[[75,[31]],[50,[31]]]]]],[[]],[[]],[[]],[[]],[[]],[[[46,[31]],17],[[75,[31]]]],[[[46,[31]],17],[[75,[31]]]],[[[46,[31]]],20],[75,20],[[[46,[31]]],[[15,[5]]]],[9],[9],[54],[54],[54],[[[46,[31]],[35,[17]]],36],[[[46,[31]]],36],[[[46,[31]]],36],[[[46,[31]]],36],[75,16],[[[46,[31]],[15,[33]]]],[[[46,[31]],45,28],15],[[]],[[]],[[]],[[]],[[]],[[],38],[[],38],[[],38],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[],16],[[[46,[31]],40],15],[[[46,[31]]],[[0,[36,39]]]],0,[[],41],[[],41],[[],41],[[],41],[[],41],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[45,34],[45,55],0,0,[[[77,[2]],[77,[2]]]],[[[45,[[0,[1,2]]]],[77,[[0,[1,2]]]]]],[[[45,[[0,[1,2]]]],[45,[[0,[1,2]]]]],[[77,[[0,[1,2]]]]]],[45,45],[[[45,[30]],5,52,24],61],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[45,27],[[15,[32]]]],[[],[[15,[78]]]],[[],[[15,[79]]]],[[[45,[1]]],[[45,[1]]]],[[[80,[1,1]]],[[80,[1,1]]]],[[[81,[1,1]]],[[81,[1,1]]]],[[[77,[1]]],[[77,[1]]]],[[]],[[]],[[]],[[]],[[[80,[2,2]],80],13],[[[81,[2,2]],81],13],[[],45],[[],77],[80],[[],[[16,[77]]]],[[[45,[[0,[1,2]]]],45],[[77,[[0,[1,2]]]]]],[[45,27],55],[[[45,[19]],45],20],[[[80,[19,19]],80],20],[[[81,[19,19]],81],20],[[[77,[19]],77],20],[[[45,[30]],5,52],55],[[[45,[30]],5,52],55],[45,55],[[[45,[21]],22],23],[[[80,[21,21]],22],23],[[[81,[21,21]],22],23],[[[77,[21]],22],23],[[45,24]],[[77,24]],[[]],[[]],[[]],[[]],[[]],[45,55],[[[45,[30]],5,40],[[15,[8]]]],[[[45,[30]],5,28],15],[[45,40],[[15,[27]]]],[[45,40],[[15,[[80,[27]]]]]],[[45,28],[[15,[29]]]],[[[45,[[0,[1,2]]]],40,[0,[1,2]]],[[77,[[0,[1,2]]]]]],[[[45,[[0,[1,2]]]],40,[0,[1,2]]],[[77,[[0,[1,2]]]]]],[[[45,[[0,[1,2]]]],40,18],[[77,[[0,[1,2]]]]]],[[[45,[[0,[1,2]]]],40,18],[[77,[[0,[1,2]]]]]],[[[45,[[0,[1,2]]]],27],[[77,[[0,[1,2]]]]]],[[[45,[[0,[1,2]]]],27],[[77,[[0,[1,2]]]]]],[[[45,[[0,[1,2]]]],28,29],[[77,[[0,[1,2]]]]]],[[[45,[[0,[1,2]]]],28,29],[[77,[[0,[1,2]]]]]],[[]],[[]],[[]],[[]],[[]],[[]],[45,20],[77,20],[[[77,[2]]],20],0,0,[[[45,[30]],5],55],[52,[[45,[[0,[1,2]]]]]],[82,15],0,0,[[45,28],83],[[[80,[37,37]],80],[[15,[13]]]],[[[81,[37,37]],81],[[15,[13]]]],[77,16],[[]],[[]],[[]],[[]],[[[45,[30]],5,52,24],[[16,[61]]]],[[[45,[30]],5,52],55],[[[45,[30]],5,52],55],[[],16],[[],16],[[],16],[[],16],[[],16],[[[45,[30]],5,40],[[16,[[15,[8]]]]]],[[[45,[30]],5,28],[[16,[15]]]],[[],16],[[],16],[[],16],[[],16],[[],16],[[[45,[30]],5],55],0,0,[[45,40],[[15,[[4,[17,29]]]]]],[[45,40],36],0,0,[77,55],[[],41],[[],41],[[],41],[[],41],[[],41],[[]],[[]],[[]],[[]],[[]],[[45,27],82],[[45,40],82]],"p":[[8,"Clone"],[8,"Ord"],[3,"SpkTxOutIndex"],[3,"BTreeMap"],[3,"BlockId"],[3,"ConfirmationHeightAnchor"],[3,"ConfirmationTimeAnchor"],[4,"ObservedAs"],[4,"TxHeight"],[4,"ConfirmationTime"],[3,"FullTxOut"],[3,"SpkIterator"],[4,"Ordering"],[3,"Persist"],[4,"Option"],[4,"Result"],[15,"u32"],[15,"u64"],[8,"PartialEq"],[15,"bool"],[8,"Debug"],[3,"Formatter"],[6,"Result"],[8,"FnMut"],[8,"Hash"],[3,"Script"],[3,"Transaction"],[3,"OutPoint"],[3,"TxOut"],[8,"Anchor"],[8,"ChainPosition"],[15,"i64"],[15,"usize"],[3,"BTreeSet"],[8,"RangeBounds"],[8,"DoubleEndedIterator"],[8,"PartialOrd"],[3,"String"],[8,"ExactSizeIterator"],[3,"Txid"],[3,"TypeId"],[3,"ChangeSet"],[3,"ChainGraph"],[4,"UpdateError"],[3,"TxGraph"],[3,"SparseChain"],[4,"NewError"],[4,"InsertTxError"],[3,"UnresolvableConflict"],[4,"InsertTxError"],[4,"UpdateError"],[8,"IntoIterator"],[6,"InsertCheckpointError"],[3,"Demand"],[8,"Iterator"],[8,"Append"],[3,"IndexedAdditions"],[8,"Indexer"],[3,"IndexedTxGraph"],[8,"Default"],[3,"Balance"],[3,"KeychainTracker"],[4,"DescriptorPublicKey"],[4,"Descriptor"],[3,"KeychainTxOutIndex"],[3,"DerivationAdditions"],[3,"KeychainChangeSet"],[3,"KeychainScan"],[3,"Persist"],[3,"LocalChain"],[6,"ChangeSet"],[3,"UpdateNotConnectedError"],[3,"InsertBlockNotMatchingError"],[3,"BlockHash"],[3,"ChangeSet"],[4,"InsertCheckpointError"],[3,"Additions"],[3,"SignedAmount"],[3,"Amount"],[3,"TxNode"],[3,"CanonicalTx"],[3,"TxDescendants"],[3,"HashSet"],[8,"ChainOracle"],[8,"PersistBackend"],[8,"DescriptorExt"],[8,"ForEachTxOut"],[13,"Confirmed"],[13,"Conflict"],[8,"PersistBackend"],[13,"HashNotMatching"],[13,"TxMovedUnexpectedly"],[13,"TxTooHigh"],[13,"TxInconsistent"]]},\ +"bdk":{"doc":"bdk","t":[13,13,13,13,13,4,13,3,13,13,13,13,13,2,13,13,13,13,13,13,4,13,3,13,13,13,13,13,13,13,2,13,13,13,3,13,2,13,4,8,2,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,12,0,14,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,14,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,0,11,12,11,11,11,11,0,12,11,12,12,11,11,11,2,11,2,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,12,11,11,11,11,11,11,11,12,10,5,11,11,11,11,11,11,11,0,11,12,12,12,12,12,12,13,6,4,2,4,3,6,8,13,6,8,16,6,4,3,13,13,2,8,4,13,13,6,13,13,4,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,12,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,10,11,11,0,11,11,11,11,11,11,11,11,11,11,11,10,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,12,5,5,5,5,13,13,4,13,13,13,13,13,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,13,13,4,13,3,6,13,13,6,13,13,13,13,13,13,13,13,13,13,13,4,3,4,13,13,13,13,13,4,4,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,12,11,11,11,12,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,3,3,3,3,3,3,8,6,3,3,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,8,4,4,4,16,16,8,4,13,8,8,3,8,13,13,13,16,4,6,13,13,13,16,13,3,13,8,4,13,13,13,3,3,4,3,13,6,13,13,13,5,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,11,5,11,10,11,11,5,10,11,12,12,11,11,11,11,11,11,10,12,11,11,11,11,10,11,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,8,10,10,10,4,3,3,6,13,13,4,8,13,13,4,13,13,6,3,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,12,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,10,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,12,11,11,11,11,11,11,5,12,12,3,13,8,3,6,4,3,13,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,5,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,3,6,12,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,13,13,13,13,13,13,8,13,13,13,13,13,13,13,13,13,13,13,13,13,13,3,8,4,4,4,3,3,3,13,4,8,13,11,12,12,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,10,11,11,10,11,12,11,12,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,13,3,13,13,4,3,13,13,3,8,4,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11],"n":["Bip32","BnBNoExactMatch","BnBTotalTriesExceeded","ChecksumMismatch","Descriptor","Error","External","FeeRate","FeeRateTooLow","FeeRateUnavailable","FeeTooLow","Foreign","Generic","HdKeyPaths","InsufficientFunds","Internal","InvalidOutpoint","InvalidPolicyPathError","IrreplaceableTransaction","Key","KeychainKind","Local","LocalUtxo","Miniscript","MiniscriptPsbt","MissingKeyOrigin","NoRecipients","NoUtxosSelected","OutputBelowDustLimit","Psbt","SignOptions","Signer","SpendingPolicyRequired","TransactionConfirmed","TransactionDetails","TransactionNotFound","TxBuilder","UnknownUtxo","Utxo","Vbytes","Wallet","WeightedUtxo","as_byte","as_ref","as_sat_per_vb","base32_len","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","chain","check_base32","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","confirmation_time","confirmation_time","default","default_min_relay_fee","derivation_index","descriptor","descriptor","deserialize","deserialize","deserialize","eq","eq","eq","eq","eq","eq","fee","fee_vb","fee_wu","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fragment","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_btc_per_kvb","from_sat_per_kvb","from_sat_per_kwu","from_sat_per_vb","from_vb","from_wu","hash","hash","into","into","into","into","into","into","into","is_spent","keychain","keys","outpoint","outpoint","partial_cmp","partial_cmp","partial_cmp","provide","psbt","received","sat_per_kwu","satisfaction_weight","sent","serialize","serialize","serialize","signer","sub","template","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","transaction","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","txid","txout","txout","type_id","type_id","type_id","type_id","type_id","type_id","type_id","utxo","vbytes","version","vzip","vzip","vzip","vzip","vzip","vzip","vzip","wallet","write_base32","available","needed","required","required","outpoint","psbt_input","Bare","DerivedDescriptor","Descriptor","DescriptorError","DescriptorPublicKey","DescriptorXKey","ExtendedDescriptor","ExtractPolicy","Hardened","HdKeyPaths","IntoWalletDescriptor","Key","KeyMap","Legacy","Miniscript","None","Pkh","Policy","ScriptContext","Segwitv0","Sh","Single","TapKeyOrigins","Tr","Unhardened","Wildcard","Wpkh","Wsh","XPub","address","as_enum","as_enum","as_inner","at_derivation_index","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","branches","calc_checksum","check_global_consensus_validity","check_global_consensus_validity","check_global_consensus_validity","check_global_policy_validity","check_global_policy_validity","check_global_validity","check_local_consensus_validity","check_local_consensus_validity","check_local_consensus_validity","check_local_policy_validity","check_local_policy_validity","check_local_policy_validity","check_local_validity","check_terminal_non_malleable","check_terminal_non_malleable","check_terminal_non_malleable","check_witness","check_witness","check_witness","checksum","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","cmp","contains_raw_pkh","derivation_path","derive","derived_descriptor","derived_descriptor","desc_type","deserialize","deserialize","dust_value","encode","eq","eq","eq","eq","eq","eq","error","explicit_script","ext","ext_check","extract_policy","extract_policy","extract_policy","find_derivation_index_for_spk","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_key","for_each_key","from","from","from","from","from","from","from","from","from","from","from","from","from_ast","from_str","from_str","from_str_ext","from_str_insane","from_tree","from_tree","get_nth_child","get_nth_pk","get_satisfaction","get_satisfaction_mall","has_mixed_timelocks","has_repeated_keys","has_wildcard","hash","hash","hash","hash","hash","hash","into","into","into","into","into","into","into_inner","into_wallet_descriptor","into_wallet_descriptor","is_deriveable","is_non_malleable","iter","iter_pk","lift","lift","lift_check","matches","max_satisfaction_size","max_satisfaction_size","max_satisfaction_size","max_satisfaction_size","max_satisfaction_weight","max_satisfaction_witness_elements","name_str","name_str","name_str","new_bare","new_pk","new_pkh","new_sh","new_sh_sortedmulti","new_sh_with_wpkh","new_sh_with_wsh","new_sh_wpkh","new_sh_wsh","new_sh_wsh_sortedmulti","new_tr","new_wpkh","new_wsh","new_wsh_sortedmulti","node","origin","other_top_level_checks","parse","parse_descriptor","parse_insane","parse_with_ext","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","pk_len","pk_len","pk_len","policy","requires_sig","sanity_check","sanity_check","satisfy","satisfy","satisfy_malleable","script_code","script_pubkey","script_size","serialize","serialize","sig_type","sig_type","sig_type","template","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string_with_secret","top_level_checks","top_level_type_check","translate_pk","translate_pk","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","ty","type_id","type_id","type_id","type_id","type_id","type_id","unsigned_script_sig","vzip","vzip","vzip","vzip","vzip","vzip","wildcard","within_resource_limits","xkey","calc_checksum","calc_checksum_bytes","get_checksum","get_checksum_bytes","Base58","Bip32","Error","HardenedDerivationXpub","Hex","InvalidDescriptorCharacter","InvalidDescriptorChecksum","InvalidHdKeyPath","Key","Miniscript","Pk","Policy","borrow","borrow_mut","fmt","fmt","from","from","from","from","from","from","from","from","into","provide","to_string","try_from","try_into","type_id","vzip","AbsoluteTimelock","AddOnLeaf","AddOnPartialComplete","BuildSatisfaction","Complete","Condition","ConditionMap","EcdsaSignature","Fingerprint","FoldedConditionMap","Hash160Preimage","Hash256Preimage","IncompatibleConditions","IndexOutOfRange","MixedTimelockUnits","Multisig","None","None","NotEnoughItemsSelected","Partial","PartialComplete","PkOrF","Policy","PolicyError","Psbt","PsbtTimelocks","Pubkey","RelativeTimelock","Ripemd160Preimage","Satisfaction","SatisfiableItem","SchnorrSignature","Sha256Preimage","Thresh","XOnlyPubkey","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","contribution","csv","default","eq","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","get_condition","hash","hash","id","id","into","into","into","into","into","into","into","is_leaf","is_leaf","is_null","item","partial_cmp","provide","requires_path","satisfaction","serialize","serialize","serialize","serialize","serialize","timelock","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","current_height","input_max_height","psbt","condition","conditions","conditions","items","items","m","m","n","n","sorted","sorted","hash","hash","hash","hash","items","keys","threshold","threshold","value","value","Bip44","Bip44Public","Bip49","Bip49Public","Bip84","Bip84Public","DescriptorTemplate","DescriptorTemplateOut","P2Pkh","P2Wpkh","P2Wpkh_P2Sh","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build","build","build","build","build","build","build","build","build","build","from","from","from","from","from","from","from","from","from","into","into","into","into","into","into","into","into","into","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","Bip32","DerivableKey","DescriptorKey","DescriptorPublicKey","DescriptorSecretKey","Entropy","Error","ExtScriptContext","ExtendedKey","FullKey","GeneratableDefaultOptions","GeneratableKey","GeneratedKey","IntoDescriptorKey","InvalidChecksum","InvalidNetwork","InvalidScriptContext","Key","KeyError","KeyMap","Legacy","Message","Miniscript","Options","Private","PrivateKeyGenerateOptions","Public","ScriptContext","ScriptContextEnum","Segwitv0","Single","Single","SinglePriv","SinglePub","SinglePubKey","SortedMultiVec","Tap","ValidNetworks","XOnly","XPrv","XPub","any_network","as_enum","at_derivation_index","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","check_global_consensus_validity","check_global_policy_validity","check_global_validity","check_local_consensus_validity","check_local_policy_validity","check_local_validity","check_terminal_non_malleable","check_witness","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","compressed","default","deref","derive","encode","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_key","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_public","from_secret","from_str","from_str","from_tree","full_derivation_path","generate","generate_default","generate_with_entropy","generate_with_entropy_default","has_secret","has_wildcard","hash","hash","hash","hash","into","into","into","into","into","into","into","into","into","into","into","into","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_extended_key","into_extended_key","into_extended_key","into_key","into_xprv","into_xpub","is_deriveable","is_legacy","is_legacy","is_segwit_v0","is_segwit_v0","is_taproot","is_taproot","is_uncompressed","is_x_only_key","k","key","key","lift","mainnet_network","master_fingerprint","max_satisfaction_size","max_satisfaction_size","max_satisfaction_witness_elements","merge_networks","name_str","new","origin","origin","other_top_level_checks","override_valid_networks","partial_cmp","partial_cmp","partial_cmp","partial_cmp","pk_len","pks","provide","sanity_check","satisfy","script_size","sig_type","sorted_node","test_networks","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_public","to_string","to_string","to_string","to_string","top_level_checks","top_level_type_check","translate_pk","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","PsbtUtils","fee_amount","fee_rate","get_utxo_for","AddressIndex","AddressInfo","Balance","ChangeSet","ConfirmationHeightCannotBeGreaterThanTip","Descriptor","InsertTxError","IsDust","LastUnused","New","NewError","Peek","Persist","Update","Wallet","add","add_signer","address","apply_update","as_ref","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build_fee_bump","build_tx","cancel_tx","checkpoints","clone","clone_into","coin_selection","commit","confirmed","default","deref","derivation_index","derivation_of_spk","descriptor_checksum","deserialize","eq","eq","export","finalize_psbt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","get_address","get_balance","get_descriptor_for_keychain","get_internal_address","get_psbt_input","get_signers","get_tx","get_utxo","immature","index","insert_checkpoint","insert_tx","into","into","into","into","into","into","is_dust","is_mine","keychain","keychains","latest_checkpoint","list_unspent","local_chain","network","new","new_no_persist","next_derivation_index","policies","provide","public_descriptor","secp_ctx","serialize","sign","signer","spk_index","spks_of_all_keychains","spks_of_keychain","staged","to_owned","to_string","to_string","to_string","total","transactions","trusted_pending","trusted_spendable","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","tx_builder","tx_graph","type_id","type_id","type_id","type_id","type_id","type_id","untrusted_pending","vzip","vzip","vzip","vzip","vzip","vzip","wallet_name_from_descriptor","tip_height","tx_height","BranchAndBoundCoinSelection","Change","CoinSelectionAlgorithm","CoinSelectionResult","DefaultCoinSelectionAlgorithm","Excess","LargestFirstCoinSelection","NoChange","OldestFirstCoinSelection","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","coin_select","coin_select","coin_select","coin_select","decide_change","default","default","default","excess","fee_amount","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","into","into","into","into","into","local_selected_amount","new","selected","selected_amount","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","amount","change_fee","dust_threshold","fee","remaining_amount","FullyNodedExport","WalletExport","blockheight","borrow","borrow_mut","change_descriptor","descriptor","deserialize","export_wallet","fmt","from","from_str","into","label","serialize","to_string","try_from","try_into","type_id","vzip","All","Dummy","Exclude","Fingerprint","Include","InputIndexOutOfRange","InputSigner","InvalidKey","InvalidNonWitnessUtxo","InvalidSighash","Legacy","MissingHdKeypath","MissingKey","MissingNonWitnessUtxo","MissingWitnessScript","MissingWitnessUtxo","NonStandardSighash","None","PkHash","Segwitv0","SighashError","SignOptions","SignerCommon","SignerContext","SignerError","SignerId","SignerOrdering","SignerWrapper","SignersContainer","Tap","TapLeavesOptions","TransactionSigner","UserCanceled","add_external","allow_all_sighashes","allow_grinding","as_key_map","assume_height","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","default","default","default","default","deref","descriptor_secret_key","descriptor_secret_key","descriptor_secret_key","eq","eq","eq","eq","eq","find","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","hash","id","id","id","ids","into","into","into","into","into","into","into","into","new","new","partial_cmp","partial_cmp","provide","remove","remove_partial_sigs","sign_input","sign_input","sign_input","sign_transaction","sign_transaction","sign_with_tap_internal_key","signers","tap_leaves_options","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","trust_witness_utxo","try_finalize","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","is_internal_key","Bip69Lexicographic","BumpFee","ChangeAllowed","ChangeForbidden","ChangeSpendPolicy","CreateTx","OnlyChange","Shuffle","TxBuilder","TxBuilderContext","TxOrdering","Untouched","add_data","add_foreign_utxo","add_global_xpubs","add_recipient","add_unspendable","add_utxo","add_utxos","allow_dust","allow_shrinking","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","change_policy","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","coin_selection","current_height","default","default","default","default","do_not_spend_change","drain_to","drain_wallet","enable_rbf","enable_rbf_with_sequence","eq","eq","fee_absolute","fee_rate","finish","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","hash","hash","include_output_redeem_witness_script","into","into","into","into","into","manually_selected_only","nlocktime","only_spend_change","only_witness_utxo","ordering","partial_cmp","partial_cmp","policy_path","set_recipients","sighash","sort_tx","to_owned","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","unspendable","version","vzip","vzip","vzip","vzip","vzip"],"q":["bdk","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::Error","","","","bdk::Utxo","","bdk::descriptor","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor::checksum","","","","bdk::descriptor::error","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor::policy","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::descriptor::policy::BuildSatisfaction","","","bdk::descriptor::policy::Satisfaction","","","","","","","","","","","bdk::descriptor::policy::SatisfiableItem","","","","","","","","","","bdk::descriptor::template","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::keys","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::psbt","","","","bdk::wallet","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::InsertTxError","","bdk::wallet::coin_selection","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::coin_selection::Excess","","","","","bdk::wallet::export","","","","","","","","","","","","","","","","","","","","bdk::wallet::signer","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk::wallet::signer::SignerContext","bdk::wallet::tx_builder","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"d":["BIP32 error","Branch and bound coin selection tries to avoid needing a …","Branch and bound coin selection possible attempts with …","Descriptor checksum mismatch","Error related to the parsing and usage of descriptors","Errors that can be thrown by the Wallet","External keychain, used for deriving recipient addresses.","Fee rate","When bumping a tx the fee rate requested is lower than …","Node doesn’t have data to estimate a fee rate","When bumping a tx the absolute fee requested is lower than …","A UTXO owned by another wallet.","Generic error","","Wallet’s UTXO set is not enough to cover recipient’s …","Internal keychain, used for deriving change addresses.","Requested outpoint doesn’t exist in the tx (vout greater …","Error while extracting and manipulating policies","Trying to replace a tx that has a sequence >= 0xFFFFFFFE","Error while working with keys","Types of keychains","A UTXO owned by the local wallet.","An unspent output owned by a Wallet.","Miniscript error","Miniscript PSBT error","In order to use the TxBuilder::add_global_xpubs option …","Cannot build a tx without recipients","manually_selected_only option is selected but no utxo has …","Output created is under the dust limit, 546 satoshis","Partially signed bitcoin transaction error","","Signing error","Spending policy is not compatible with this KeychainKind","Happens when trying to bump a transaction that is already …","A wallet transaction","Thrown when a tx is not found in the internal database","","Happens when trying to spend an UTXO that is not in the …","An unspent transaction output (UTXO).","Trait implemented by types that can be used to measure …","","A Utxo with its satisfaction_weight.","Return KeychainKind as a byte","","Return the value as satoshi/vbyte","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The confirmation time for transaction containing this utxo","If the transaction is confirmed, contains height and Unix …","","Create a new FeeRate with the default min relay fee value","The derivation index for the script pubkey in the wallet","Descriptors","Macro to write full descriptors with code","","","","","","","","","","Fee value in sats if it was available.","Calculate absolute fee in Satoshis using size in virtual …","Calculate absolute fee in Satoshis using size in weight …","","","","","","","","","Macro to write descriptor fragments with code","Returns the argument unchanged.","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Create a new instance of FeeRate given a float fee rate in …","Create a new instance of FeeRate given a float fee rate in …","Create a new instance of FeeRate given a float fee rate in …","Create a new instance of FeeRate given a float fee rate in …","Calculate fee rate from fee and vbytes.","Calculate fee rate from fee and weight units (wu).","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Whether this UTXO is spent or not","Type of keychain","Key formats","Get the location of the UTXO","Reference to a transaction output","","","","","Additional functions on the rust-bitcoin …","Received value (sats) Sum of owned outputs of this …","Return the value as satoshi/kwu","The weight of the witness data and scriptSig expressed in …","Sent value (sats) Sum of owned inputs of this transaction.","","","","","","","","","","","","","","Optional transaction","","","","","","","","","","","","","","","Transaction id","Get the TxOut of the UTXO","Transaction output","","","","","","","","The UTXO","Convert weight units to virtual bytes.","Get the version of BDK at runtime","","","","","","","","Wallet","","Sats available for spending","Sats needed for some transaction","Required fee rate (satoshi/vbyte)","Required fee absolute value (satoshi)","The location of the output.","The information about the input we require to add it to a …","A raw scriptpubkey (including pay-to-pubkey) under Legacy …","Alias for a Descriptor that contains extended derived keys","Script descriptor","","The descriptor pubkey, either a single pubkey or an xpub.","An extended key with origin, derivation path, and wildcard.","Alias for a Descriptor that can contain extended keys …","Trait implemented on Descriptors to add a method to …","Unhardened wildcard, e.g. *h","Alias for the type of maps that represent derivation paths …","Trait for types which can be converted into an …","The consensus key associated with the type. Must be a …","Alias type for a map of public key to secret key","Legacy ScriptContext To be used as P2SH scripts For …","Top-level script AST type","No wildcard","Pay-to-PubKey-Hash","","The ScriptContext for Miniscript. Additional type …","Segwitv0 ScriptContext","Pay-to-ScriptHash(includes nested wsh/wpkh/sorted multi)","Single public key.","Alias for the type of maps that represent taproot key …","Pay-to-Taproot","Unhardened wildcard, e.g. *","Whether a descriptor has a wildcard in it","Pay-to-Witness-PubKey-Hash","Pay-to-Witness-ScriptHash with Segwitv0 context","Extended public key (xpub).","Computes the Bitcoin address of the descriptor, if one …","","","Get a reference to the inner AstElem representing the root …","Replaces all wildcards (i.e. /*) in the descriptor with a …","","","","","","","","","","","","","Enumerates all child nodes of the current AST node (self) …","","Depending on script Context, some of the Terminals might …","","","Depending on script Context, some of the script resource …","","Check the consensus + policy(if not disabled) rules that …","Consensus rules at the Miniscript satisfaction time. It is …","","","Policy rules at the Miniscript satisfaction time. It is …","","","Check the consensus + policy(if not disabled) rules …","Depending on ScriptContext, fragments can be malleable. …","","","Check whether the given satisfaction is valid under the …","","","Descriptor checksum","","","","","","","","","","","","","","","","","","","Whether the given miniscript contains a raw pkh fragment","The derivation path","Deprecated name for [at_derivation_index].","Convert all the public keys in the descriptor to …","Convert all the public keys in the descriptor to …","Get the DescriptorType of Descriptor","","","","Encode as a Bitcoin script","","","","","","","Descriptor errors","Computes the the underlying script before any hashing is …","Additional information helpful for extra analysis.","Check whether the miniscript follows the given Extra …","Extract the spending policy","","","Utility method for deriving the descriptor at each index …","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Add type information(Type and Extdata) to Miniscript based …","","Parse a Miniscript from string and perform sanity checks …","Attempt to parse an Miniscripts that don’t follow the …","Attempt to parse an insane(scripts don’t clear sanity …","Parse an expression tree into a descriptor.","Parse an expression tree into a Miniscript. As a general …","Returns child node with given index, if any","Returns Option::Some with cloned n’th public key from …","Returns satisfying non-malleable witness and scriptSig to …","Returns a possilbly mallable satisfying non-malleable …","Whether the miniscript contains a combination of timelocks","Whether the miniscript has repeated Pk or Pkh","Whether or not the descriptor has any wildcards i.e. /*.","","","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Extracts the AstElem representing the root of the …","Convert to wallet descriptor","","Whether or not the descriptor has any wildcards","Whether the miniscript is malleable","Creates a new Iter iterator that will iterate over all …","Creates a new PkIter iterator that will iterate over all …","","","Lifting corresponds conversion of miniscript into Policy […","Compares this key with a keysource and returns the …","Depending on script context, the size of a satifaction …","","","Maximum size, in bytes, of a satisfying witness. For …","Computes an upper bound on the weight of a satisfying …","Maximum number of witness elements used to satisfy the …","Local helper function to display error messages with …","","","Create a new bare descriptor from witness script Errors …","Create a new pk descriptor","Create a new PkH descriptor","Create a new sh for a given redeem script Errors when …","Create a new sh sortedmulti descriptor with threshold k …","Create a new sh wrapper for the given wpkh descriptor","Create a new sh wrapper for the given wsh descriptor","Create a new sh wrapped wpkh from Pk. Errors when …","Create a new sh wrapped wsh descriptor with witness script …","Create a new sh wrapped wsh sortedmulti descriptor from …","Create new tr descriptor Errors when miniscript exceeds …","Create a new Wpkh descriptor Will return Err if …","Create a new wsh descriptor from witness script Errors …","Create a new wsh sorted multi descriptor Errors when …","A node in the Abstract Syntax Tree(","Origin information","Other top level checks that are context specific","Attempt to parse a Script into Miniscript representation.","Parse a descriptor that may contain secret keys","Attempt to parse an insane(scripts don’t clear sanity …","Attempt to parse an miniscript with extra features that …","","","","","","","Get the len of public key when serialized based on context …","","","Descriptor policy","Whether all spend paths of miniscript require a signature","Checks whether the descriptor is safe.","Check whether the underlying Miniscript is safe under the …","Attempts to produce a non-malleable satisfying witness and …","Attempt to produce non-malleable satisfying witness for the","Attempt to produce a malleable satisfying witness for the …","Computes the scriptCode of a transaction output.","Computes the scriptpubkey of the descriptor.","Size, in bytes of the script-pubkey. If this Miniscript is …","","","The type of signature required for satisfaction","","","Descriptor templates","","","","","","","","","Serialize a descriptor to string with its secret keys","Check top level consensus rules.","Check whether the top-level is type B","Converts a descriptor using abstract keys to one using …","Translates a struct from one generic to another where the …","","","","","","","","","","","","","The correctness and malleability type information for the …","","","","","","","Computes the scriptSig that will be in place for an …","","","","","","","Whether the descriptor is wildcard","Whether the miniscript can exceed the resource …","The extended key","Compute the checksum of a descriptor, excludes any …","Compute the checksum bytes of a descriptor, excludes any …","Compute the checksum of a descriptor","Compute the checksum bytes of a descriptor","Error during base58 decoding","BIP32 error","Errors related to the parsing and usage of descriptors","The descriptor contains hardened derivation steps on …","Hex decoding error","Invalid byte found in the descriptor checksum","The provided descriptor doesn’t match its checksum","Invalid HD Key path, such as having a wildcard but a …","Error thrown while working with keys","Miniscript error","Key-related error","Error while extracting and manipulating policies","","","","","","Returns the argument unchanged.","","","","","","","Calls U::from(self).","","","","","","","Absolute timeclock timestamp","Can not add to an item that is Satisfaction::None or …","Can not add to an item that is …","Options to build the satisfaction field in the policy","Can satisfy the policy item","An extra condition that must be satisfied but that is out …","Type for a map of sets of Condition items keyed by each set…","ECDSA Signature for a raw public key","An extended key fingerprint","Type for a map of folded sets of Condition items keyed by …","SHA256 then RIPEMD160 preimage hash","Double SHA256 preimage hash","Incompatible conditions (not currently used)","Index out of range for an item to satisfy a …","Can not merge CSV or timelock values unless both are less …","Multi-signature public keys with threshold count","Cannot satisfy or contribute to the policy item","Don’t generate satisfaction field","Not enough items are selected to satisfy a …","Only a partial satisfaction of some kind of threshold …","Can reach the threshold of some kind of threshold policy","A unique identifier for a key","Descriptor spending policy","Errors that can happen while extracting and manipulating …","Analyze the given PSBT to check for existing signatures","Like Psbt variant and also check for expired timelocks","A legacy public key","Relative timelock locktime","RIPEMD160 preimage hash","Represent if and how much a policy item is satisfied by …","An item that needs to be satisfied","Schnorr Signature for a raw public key","SHA256 preimage hash","Threshold items with threshold count","A x-only public key","","","","","","","","","","","","","","","","","","","","","","","","","","","How the wallet’s descriptor can satisfy this policy node","Optional CheckSequenceVerify condition","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Return the conditions that are set by the spending policy …","","","Returns a unique id for the SatisfiableItem","Identifier for this policy node","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Returns whether the SatisfiableItem is a leaf item","Returns whether the Satisfaction is a leaf item","Returns true if there are no extra conditions to verify","Type of this policy node","","","Return whether or not a specific path in the policy tree …","How much a given PSBT already satisfies this policy node …","","","","","","Optional timelock condition","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Current blockchain height","The highest confirmation height between the inputs CSV …","Given PSBT","Extra conditions that also need to be satisfied","Extra conditions that also need to be satisfied","Extra conditions that also need to be satisfied","The items that can be satisfied by the descriptor or are …","The items that can be satisfied by the descriptor","Threshold","Threshold","Total number of items","Total number of items","Whether the items are sorted in lexicographic order (used …","Whether the items are sorted in lexicographic order (used …","The digest value","The digest value","The digest value","The digest value","The policy items","The raw public key or extended key fingerprint","The required threshold count","The required threshold count","The timelock value","The timelock value","BIP44 template. Expands to pkh(key/44'/{0,1}'/0'/{0,1}/*)","BIP44 public template. Expands to pkh(key/{0,1}/*)","BIP49 template. Expands to …","BIP49 public template. Expands to sh(wpkh(key/{0,1}/*))","BIP84 template. Expands to wpkh(key/84'/{0,1}'/0'/{0,1}/*)","BIP84 public template. Expands to wpkh(key/{0,1}/*)","Trait for descriptor templates that can be built into a …","Type alias for the return type of DescriptorTemplate, …","P2PKH template. Expands to a descriptor pkh(key)","P2WPKH template. Expands to a descriptor wpkh(key)","P2WPKH-P2SH template. Expands to a descriptor sh(wpkh(key))","","","","","","","","","","","","","","","","","","","Build the complete descriptor","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","BIP32 error","Trait for keys that can be derived.","Container for public or secret keys","The descriptor pubkey, either a single pubkey or an xpub.","The descriptor secret key, either a single private key or …","Type specifying the amount of entropy required e.g. [u8;32]","Returned error in case of failure","Trait that adds extra useful methods to ScriptContexts","Enum for extended keys that can be either xprv or xpub","A bitcoin public key (compressed or uncompressed).","Trait that allows generating a key with the default options","Trait for keys that can be generated","Output of a GeneratableKey key generation","Trait for objects that can be turned into a public or …","The key has an invalid checksum","The key is not valid for the given network","The key cannot exist in the given script context","The consensus key associated with the type. Must be a …","Errors thrown while working with keys","Alias type for a map of public key to secret key","Legacy scripts","Custom error message","Miniscript error","Extra options required by the generate_with_entropy","A private extended key, aka an xprv","Options for generating a PrivateKey","A public extended key, aka an xpub","The ScriptContext for Miniscript. Additional type …","Enum representation of the known valid ScriptContexts","Segwitv0 scripts","Single public key.","Single private key.","A descriptor bitcoin::PrivateKey with optional origin …","A descriptor SinglePubKey with optional origin information.","Single public key without any origin or range information.","Contents of a “sortedmulti” descriptor","Taproot scripts","Set of valid networks for a key","An xonly public key.","Extended private key (xpriv).","Extended public key (xpub).","Create a set containing mainnet, testnet, signet, and …","Returns the ScriptContext as a ScriptContextEnum","Replaces any wildcard (i.e. /*) in the key with a …","","","","","","","","","","","","","","","","","","","","","","","","","Depending on script Context, some of the Terminals might …","Depending on script Context, some of the script resource …","Check the consensus + policy(if not disabled) rules that …","Consensus rules at the Miniscript satisfaction time. It is …","Policy rules at the Miniscript satisfaction time. It is …","Check the consensus + policy(if not disabled) rules …","Depending on ScriptContext, fragments can be malleable. …","Check whether the given satisfaction is valid under the …","","","","","","","","","","","","","","","","","","","Whether the generated key should be “compressed” or not","","","Deprecated name of [at_derivation_index].","Encode as a Bitcoin script","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Create an instance given a public key and a set of valid …","Create an instance given a secret key and a set of valid …","","","Parse an expression tree into a SortedMultiVec","Full path, from the master key","Generate a key given the options with a random entropy","Generate a key with the default options and a random …","Generate a key given the extra options and the entropy","Generate a key with the default options and a given entropy","Return whether or not the key contains the private data","Whether or not the key has a wildcard","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Turn the key into a DescriptorKey within the requested …","Consume self and turn it into a DescriptorKey by adding …","","","","","","Consume self and turn it into an ExtendedKey","","","Consumes self and returns the key","Transform the ExtendedKey into an ExtendedPrivKey for the …","Transform the ExtendedKey into an ExtendedPubKey for the …","Whether or not the key has a wildcard","Returns whether the script context is Legacy","Returns whether the script context is …","Returns whether the script context is Segwitv0","Returns whether the script context is …","Returns whether the script context is Tap, aka Taproot or …","Returns whether the script context is …","","","signatures required","The public key.","The private key.","","Create a set only containing mainnet","The fingerprint of the master key associated with this …","Depending on script context, the size of a satifaction …","Maximum size, in bytes, of a satisfying witness. In …","Maximum number of witness elements used to satisfy the …","Compute the intersection of two sets","Local helper function to display error messages with …","Create a new instance of SortedMultiVec given a list of …","Origin information (fingerprint and derivation path).","Origin information (fingerprint and derivation path).","Other top level checks that are context specific","Override the computed set of valid networks","","","","","Get the len of public key when serialized based on context …","public keys inside sorted Multi","","utility function to sanity a sorted multi vec","Attempt to produce a satisfying witness for the witness …","Size, in bytes of the script-pubkey. If this Miniscript is …","The type of signature required for satisfaction","Create Terminal::Multi containing sorted pubkeys","Create a set containing testnet and regtest","","","","","","","","Returns the public version of this key.","","","","","Check top level consensus rules.","Check whether the top-level is type B","This will panic if fpk returns an uncompressed key when …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Trait to add functions to extract utxos and calculate fees.","The total transaction fee amount, sum of input amounts …","The transaction’s fee rate. This value will only be …","Get the TxOut for the specified input index, if it doesn’…","The address index selection strategy to use to derived an …","A derived address and the index it was found at. For …","Balance, differentiated into various categories.","The changeset produced internally by Wallet when mutated.","The error variant that occurs when the caller attempts to …","There was problem with the descriptors passed in","An error that may occur when inserting a transaction into …","Trait to check if a value is below the dust limit. We are …","Return the address for the current descriptor index if it …","Return a new address after incrementing the current …","Error returned from Wallet::new","Return the address for a specific descriptor index. Does …","We were unable to load the wallet’s data from the …","The update to a Wallet used in Wallet::apply_update. This …","A Bitcoin wallet","","Add an external signer","Address","Applies an update to the wallet and stages the changes …","","","","","","","","","","","","","","Bump the fee of a transaction previously created with this …","Start building a transaction.","Informs the wallet that you no longer intend to broadcast …","Get all the checkpoints the wallet is currently storing …","","","Coin selection","Commits all curently staged changed to the persistence …","Confirmed and immediately spendable balance","","","The derivation index of this wallet. It will return None …","Finds how the wallet derived the script pubkey spk.","Return the checksum of the public descriptor associated to …","","","","Wallet export","Finalize a PSBT, i.e., for each input determine if …","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Return a derived address using the external descriptor, …","Return the balance, separated into available, …","Returns the descriptor used to create addresses for a …","Return a derived address using the internal (change) …","get the corresponding PSBT Input for a LocalUtxo","Get the signers","Return a single transactions made and received by the …","Returns the utxo owned by this wallet corresponding to …","All coinbase outputs not yet matured","Child index of this address","Add a new checkpoint to the wallet’s internal view of …","Add a transaction to the wallet’s internal view of the …","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Check whether or not a value is below dust limit","Return whether or not a script is part of this wallet …","Type of keychain","Iterator over all keychains in this wallet","Returns the latest checkpoint.","Return the list of unspent outputs of this wallet","Get a reference to the inner LocalChain.","Get the Bitcoin network the wallet is using.","Create a wallet from a descriptor (and an optional …","Creates a wallet that does not persist data.","The index of the next address that you would get if you …","Return the spending policies for the wallet’s descriptor","","Return the “public” version of the wallet’s …","Return the secp256k1 context used for all signing …","","Sign a transaction with all the wallet’s signers, in the …","Generalized signers","Get a reference to the inner KeychainTxOutIndex.","Returns a iterators of all the script pubkeys for the …","Gets an iterator over all the script pubkeys in a single …","Returns the changes that will be staged with the next call …","","","","","Get the whole balance visible to the wallet.","Iterate over the transactions in the wallet.","Unconfirmed UTXOs generated by a wallet tx","Get sum of trusted_pending and confirmed coins.","","","","","","","","","","","","","Transaction builder","Get a reference to the inner TxGraph.","","","","","","","Unconfirmed UTXOs received from an external wallet","","","","","","","Deterministically generate a unique name given the …","The internal chain’s tip height.","The introduced transaction’s confirmation height.","Branch and bound coin selection","It’s possible to create spendable output from excess …","Trait for generalized coin selection algorithms","Result of a successful coin selection","Default coin selection algorithm used by TxBuilder if not …","Remaining amount after performing coin selection","Simple and dumb coin selection","It’s not possible to create spendable output from excess …","OldestFirstCoinSelection always picks the utxo with the …","","","","","","","","","","","","","","","","","Perform the coin selection","","","","Decide if change can be created","","","","Remaining amount after deducing fees and outgoing outputs","Total fee amount for the selected utxos in satoshis","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","The total value of the inputs selected from the local …","Create new instance with target size for change output","List of outputs selected for use as inputs","The total value of the inputs selected.","","","","","","","","","","","","","","","","","","","","","","","","Effective amount available to create change after …","The calculated fee for the drain TxOut with the selected …","Threshold to consider amount as dust for this particular …","The deducted change output fee","Exceeding amount of current selection over outgoing value …","Structure that contains the export of a wallet","Alias for FullyNodedExport","Earliest block to rescan when looking for the wallet’s …","","","Return the internal descriptor, if present","Return the external descriptor","","Export a wallet","","Returns the argument unchanged.","","Calls U::from(self).","Arbitrary label for the wallet","","","","","","","The signer will sign all the leaves it has a key for.","Dummy identifier","The signer won’t sign the specified leaves.","The fingerprint of a BIP32 extended key","The signer won’t sign leaves other than the ones …","Input index is out of range","PSBT Input signer","The private key in use has the right fingerprint but …","The non_witness_utxo specified is invalid","Invalid SIGHASH for the signing context in use","Legacy context","The fingerprint and derivation path are missing from the …","The private key is missing for the required public key","The non_witness_utxo field of the transaction is required …","The witness_script field of the transaction is required to …","The witness_utxo field of the transaction is required to …","The psbt contains a non-SIGHASH_ALL sighash in one of its …","The signer won’t sign any leaf.","Bitcoin HASH160 (RIPEMD160 after SHA256) hash of an ECDSA …","Segwit v0 context (BIP 143)","Error while computing the hash to sign","Options for a software signer","Common signer methods","Signing context","Signing error","Identifier of a signer in the SignersContainers. Used as a …","Defines the order in which signers are called","Wrapper structure to pair a signer with its context","Container for multiple signers","Taproot context (BIP 340)","Customize which taproot script-path leaves the signer …","PSBT signer","The user canceled the operation","Adds an external signer to the container for the specified …","Whether the signer should use the sighash_type set in the …","Whether we should grind ECDSA signature to ensure signing …","Create a map of public keys to secret keys","Whether the wallet should assume a specific height has …","","","","","","","","","","","","","","","","","Build a new signer container from a KeyMap","","","","","","","","","","","","","","","","","","","","","","","","Return the secret key for the signer","","","","","","","","Finds the signer with lowest ordering for a given id in …","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Return the SignerId for this signer","","","Returns the list of identifiers of all the signers in the …","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Create a wrapped signer from a signer and a context","Default constructor","","","","Removes a signer from the container and returns it","Whether to remove partial signatures from the PSBT inputs …","Sign a single psbt input","","","Sign all the inputs of the psbt","","Whether we should try to sign a taproot transaction with …","Returns the list of signers in the container, sorted by …","Specifies which Taproot script-spend leaves we should sign …","","","","","","","","","","Whether the signer should trust the witness_utxo, if the …","Whether to try finalizing the PSBT after the inputs are …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Whether the signer can sign for the internal key or not","BIP69 / Lexicographic","Marker type to indicate the TxBuilder is being used to …","Use both change and non-change outputs (default)","Only use non-change outputs (see …","Policy regarding the use of change outputs when creating a …","Marker type to indicate the TxBuilder is being used to …","Only use change outputs (see TxBuilder::only_spend_change)","Randomized (default)","A transaction builder","Context in which the TxBuilder is valid","Ordering of the transaction’s inputs and outputs","Unchanged","Add data as an output, using OP_RETURN","Add a foreign UTXO i.e. a UTXO not owned by this wallet.","Fill-in the PSBT_GLOBAL_XPUB field with the extended keys …","Add a recipient to the internal list","Add a utxo to the internal list of unspendable utxos","Add a utxo to the internal list of utxos that must be spent","Add the list of outpoints to the internal list of UTXOs …","Set whether or not the dust limit is checked.","Explicitly tells the wallet that it is allowed to reduce …","","","","","","","","","","","Set a specific ChangeSpendPolicy. See …","","","","","","","","","","","","","Choose the coin selection algorithm","Set the current blockchain height.","","","","","Do not spend change outputs","Sets the address to drain excess coins to.","Spend all the available inputs. This respects filters like …","Enable signaling RBF","Enable signaling RBF with a specific nSequence value","","","Set an absolute fee The fee_absolute method refers to the …","Set a custom fee rate","Finish building the transaction.","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Fill-in the psbt::Output::redeem_script and …","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Only spend utxos added by add_utxo.","Use a specific nLockTime while creating the transaction","Only spend change outputs","Only Fill-in the psbt::Input::witness_utxo field when …","Choose the ordering for inputs and outputs of the …","","","Set the policy path to use while creating the transaction …","Replace the recipients already added with a new list","Sign with a specific sig hash","Sort transaction inputs and outputs by TxOrdering variant","","","","","","","","","","","","","","","","","","","","","Replace the internal list of unspendable utxos with a new …","Build a transaction with a specific version","","","","",""],"i":[17,17,17,17,17,0,1,0,17,17,17,12,17,0,17,1,17,17,17,17,0,12,0,17,17,17,17,17,17,17,0,17,17,17,0,17,0,17,0,0,0,0,1,1,3,1,17,1,3,10,11,12,13,17,1,3,10,11,12,13,0,1,1,3,10,11,12,13,1,3,10,11,12,13,1,13,10,13,3,3,10,0,0,1,10,13,1,3,10,11,12,13,13,3,3,17,17,1,3,10,11,12,13,0,17,17,17,17,17,17,17,17,1,3,10,11,12,13,3,3,3,3,3,3,1,10,17,1,3,10,11,12,13,10,10,0,12,10,1,3,13,17,0,13,3,11,13,1,10,13,0,3,0,1,3,10,11,12,13,17,13,17,1,3,10,11,12,13,17,1,3,10,11,12,13,13,12,10,17,1,3,10,11,12,13,11,168,0,17,1,3,10,11,12,13,0,1,169,169,170,171,172,172,34,0,0,0,0,0,0,0,45,0,0,58,0,0,0,45,34,0,0,0,34,40,0,34,45,0,34,34,40,34,46,47,38,34,44,45,34,46,47,38,44,45,34,46,47,38,38,0,58,46,47,58,47,58,58,46,47,58,46,47,58,58,46,47,58,46,47,0,44,45,34,46,47,38,44,45,34,46,47,38,44,45,34,46,47,38,38,44,34,34,34,34,34,38,34,38,44,45,34,46,47,38,0,34,38,38,173,34,38,34,44,45,34,34,46,47,38,38,34,38,44,45,34,34,34,34,34,34,34,46,47,38,38,34,38,38,38,34,38,38,38,34,34,38,38,34,44,45,34,46,47,38,44,45,34,46,47,38,38,143,68,34,38,38,38,34,38,38,44,58,46,47,38,34,38,58,46,47,34,34,34,34,34,34,34,34,34,34,34,34,34,34,38,44,58,38,34,38,38,44,45,34,46,47,38,58,46,47,0,38,34,38,34,38,38,34,34,38,34,38,58,46,47,0,44,45,34,46,47,38,34,38,34,58,58,34,38,44,45,34,46,47,38,44,45,34,46,47,38,38,44,45,34,46,47,38,34,44,45,34,46,47,38,44,38,44,0,0,0,0,26,26,0,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,83,25,25,0,84,0,0,83,82,0,83,83,25,25,25,83,84,56,25,84,84,0,0,0,56,56,82,83,83,0,0,83,83,83,82,82,83,84,57,85,25,56,82,83,84,57,85,25,56,82,83,84,57,85,56,82,83,84,57,85,56,57,85,85,82,83,84,57,85,25,82,83,84,57,85,25,25,56,82,83,84,84,57,57,85,25,56,57,82,85,83,57,82,83,84,57,85,25,56,83,84,85,57,85,25,57,57,82,83,84,57,85,85,82,83,84,57,85,56,25,82,83,84,57,85,25,56,82,83,84,57,85,25,56,82,83,84,57,85,25,56,82,83,84,57,85,25,56,174,174,174,175,176,177,176,177,176,177,176,177,176,177,178,179,180,181,182,183,183,182,184,185,0,0,0,0,0,0,0,0,0,0,0,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,186,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,87,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,89,90,91,93,94,95,96,97,98,23,0,0,0,0,187,187,0,0,105,0,0,0,0,23,23,23,58,0,0,37,23,23,187,111,0,111,0,0,37,40,108,0,0,0,0,37,0,105,108,40,0,188,40,111,101,107,37,102,23,103,40,108,104,109,105,111,101,107,37,102,23,103,40,108,104,109,105,58,58,58,58,58,58,58,58,101,37,102,103,40,104,105,101,37,102,103,40,104,105,103,40,104,105,102,102,101,40,103,37,103,40,104,105,107,37,102,23,23,103,103,40,40,108,108,104,109,105,103,111,111,111,101,107,37,102,23,23,23,103,40,40,108,104,109,105,107,107,40,108,103,40,187,189,187,189,111,40,103,40,104,105,111,101,107,37,102,23,103,40,108,104,109,105,88,92,101,101,107,40,108,92,111,101,101,111,111,40,188,37,188,37,188,37,40,40,103,104,109,103,0,40,58,103,103,0,58,103,104,109,58,107,103,40,104,105,58,103,23,103,103,103,58,103,0,101,37,102,103,40,104,105,108,23,103,40,108,58,58,103,111,101,107,37,102,23,103,40,108,104,109,105,111,101,107,37,102,23,103,40,108,104,109,105,111,101,107,37,102,23,103,40,108,104,109,105,111,101,107,37,102,23,103,40,108,104,109,105,0,190,190,190,0,0,0,0,135,134,0,0,133,133,0,133,134,0,0,116,117,130,117,117,116,117,133,130,134,135,116,117,133,130,134,135,117,117,117,117,116,116,0,117,116,116,130,117,117,117,116,116,130,0,117,116,116,117,133,130,130,134,134,135,116,117,133,130,134,135,117,117,117,117,117,117,117,117,116,130,117,117,116,117,133,130,134,135,191,117,130,117,117,117,117,117,117,117,117,117,134,117,117,116,117,0,117,117,117,117,116,116,130,134,116,117,116,116,116,117,133,130,134,135,116,117,133,130,134,135,0,117,116,117,133,130,134,135,116,116,117,133,130,134,135,0,192,192,0,150,0,0,0,0,0,150,0,150,149,146,147,148,150,149,146,147,148,146,147,148,146,147,148,161,146,147,148,0,146,147,148,149,149,150,149,146,147,148,150,149,146,147,148,150,149,146,147,148,149,148,149,149,146,147,148,150,149,146,147,148,150,149,146,147,148,150,149,146,147,148,150,149,146,147,148,193,194,194,193,194,0,0,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,157,152,157,152,157,24,0,24,24,24,154,24,24,24,24,24,24,157,152,154,24,0,0,0,0,0,0,0,0,154,0,0,24,55,132,132,55,132,152,24,154,156,118,55,132,157,152,24,154,156,118,55,132,157,55,152,24,154,156,118,55,132,157,152,24,154,156,118,55,132,157,152,118,118,55,132,157,156,195,156,156,152,24,154,118,157,55,152,24,24,154,156,118,55,132,157,152,152,152,24,24,154,156,118,55,132,157,152,195,156,156,55,152,24,154,156,118,55,132,157,156,55,152,118,24,55,132,196,156,156,119,156,132,55,132,152,24,154,156,118,55,132,157,24,132,132,152,24,154,156,118,55,132,157,152,24,154,156,118,55,132,157,152,24,154,156,118,55,132,157,152,24,154,156,118,55,132,157,197,164,0,163,163,0,0,163,164,0,0,0,164,127,127,127,127,127,127,127,127,127,128,126,127,164,163,128,126,127,164,163,127,128,126,127,164,163,128,126,127,164,163,164,163,127,127,128,126,164,163,127,127,127,127,127,164,163,127,127,127,128,126,127,164,163,128,126,127,164,163,164,163,127,128,126,127,164,163,127,127,127,127,127,164,163,127,127,127,164,128,126,127,164,163,128,126,127,164,163,128,126,127,164,163,128,126,127,164,163,127,127,128,126,127,164,163],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[1,2],[1],[3,4],[[],5],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,[[],[[9,[[8,[6,7]]]]]],[1,1],[3,3],[10,10],[11,11],[12,12],[13,13],[[]],[[]],[[]],[[]],[[]],[[]],[[1,1],14],[[13,13],14],0,0,[[],3],[[],3],0,0,0,[[],[[9,[1]]]],[[],[[9,[10]]]],[[],[[9,[13]]]],[[1,1],15],[[3,3],15],[[10,10],15],[[11,11],15],[[12,12],15],[[13,13],15],0,[[3,5],16],[[3,5],16],[[17,18],19],[[17,18],19],[[1,18],19],[[3,18],19],[[10,18],19],[[11,18],19],[[12,18],19],[[13,18],19],0,[[]],[20,17],[21,17],[22,17],[23,17],[24,17],[25,17],[26,17],[[]],[[]],[[]],[[]],[[]],[[]],[4,3],[4,3],[4,3],[4,3],[[16,5],3],[[16,5],3],[1],[10],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,[12,27],0,[[1,1],[[28,[14]]]],[[3,3],[[28,[14]]]],[[13,13],[[28,[14]]]],[29],0,0,[3,4],0,0,[1,9],[10,9],[13,9],0,[[3,3]],0,[[]],[[]],[[]],[[]],[[]],[[]],[[],30],0,[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],0,[12,31],0,[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],0,[[],5],[[],33],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,[[],9],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[34,35],[[9,[36,21]]]],[[],37],[[],37],[38,39],[[[34,[40]],41],[[34,[42]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[38,[[8,[38,7]]]],0,[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[39,[[9,[43]]]],[39,[[9,[43]]]],[39,[[9,[43]]]],[[],[[9,[43]]]],[[],[[9,[43]]]],[[],[[9,[43]]]],0,[44,44],[45,45],[34,34],[46,46],[47,47],[38,38],[[]],[[]],[[]],[[]],[[]],[[]],[[44,44],14],[[45,45],14],[[34,34],14],[[46,46],14],[[47,47],14],[[38,38],14],[38,15],0,[[[34,[40]],41],[[34,[42]]]],[[[34,[40]],48,41],[[9,[[34,[49]],50]]]],[[[34,[42]],48],[[9,[[34,[49]],50]]]],[34,51],[[],[[9,[34]]]],[[],[[9,[38]]]],[[[34,[40]]],16],[38,52],[[44,44],15],[[45,45],15],[[34,34],15],[[46,46],15],[[47,47],15],[[38,38],15],0,[34,[[9,[52,21]]]],0,[[38,53],[[9,[54]]]],[[55,56,48],[[9,[[28,[57]],26]]]],[[[34,[40]],55,56,48],[[9,[[28,[57]],26]]]],[[[38,[40,58]],55,56,48],[[9,[[28,[57]],26]]]],[[[34,[40]],48,52,[59,[41]]],[[9,[28,50]]]],[[44,18],[[9,[60]]]],[[45,18],[[9,[60]]]],[[34,18],[[9,[60]]]],[[34,18],[[9,[60]]]],[[46,18],[[9,[60]]]],[[47,18],[[9,[60]]]],[[38,18],[[9,[60]]]],[[38,18],[[9,[60]]]],[34,15],[38,15],[[]],[[]],[61,34],[[]],[62,34],[63,34],[64,34],[65,34],[66,34],[[]],[[]],[[]],[39,[[9,[38,21]]]],[33,[[9,[34,21]]]],[33,[[9,[38,21]]]],[[33,53],[[9,[38,21]]]],[33,[[9,[38,21]]]],[67,[[9,[34,21]]]],[67,[[9,[38,21]]]],[[38,5],[[28,[38]]]],[[38,5],28],[34,[[9,[21]]]],[34,[[9,[21]]]],[38,15],[38,15],[[[34,[40]]],15],[44],[45],[34],[46],[47],[38],[[]],[[]],[[]],[[]],[[]],[[]],[38,39],[[48,35],[[9,[26]]]],[[68,48,35],[[9,[26]]]],[[[34,[40]]],15],[38,15],[38,69],[38,70],[34,[[9,[71,21]]]],[38,[[9,[71,21]]]],[38,[[9,[72]]]],[[44,48],[[28,[73]]]],[38,[[28,[5]]]],[38,[[28,[5]]]],[38,[[28,[5]]]],[38,[[9,[5,21]]]],[34,[[9,[5,21]]]],[38,[[9,[5,21]]]],[[],33],[[],33],[[],33],[[[38,[74]]],[[9,[34,21]]]],[[],34],[[],34],[[[38,[46]]],[[9,[34,21]]]],[[5,[8,[7]]],[[9,[34,21]]]],[63,34],[65,34],[[],[[9,[34,21]]]],[[[38,[47]]],[[9,[34,21]]]],[[5,[8,[7]]],[[9,[34,21]]]],[[[28,[75]]],[[9,[34,21]]]],[[],[[9,[34,21]]]],[[[38,[47]]],[[9,[34,21]]]],[[5,[8,[7]]],[[9,[34,21]]]],0,0,[38,[[9,[21]]]],[52,[[9,[38,21]]]],[[48,33],[[9,[21]]]],[52,[[9,[38,21]]]],[[52,53],[[9,[38,21]]]],[[44,44],[[28,[14]]]],[[45,45],[[28,[14]]]],[[34,34],[[28,[14]]]],[[46,46],[[28,[14]]]],[[47,47],[[28,[14]]]],[[38,38],[[28,[14]]]],[[],5],[[],5],[[],5],0,[38,15],[34,[[9,[21]]]],[38,[[9,[54]]]],[[34,76],[[9,[21]]]],[38,[[9,[[8,[[8,[2,7]],7]],21]]]],[38,[[9,[[8,[[8,[2,7]],7]],21]]]],[34,[[9,[52,21]]]],[34,52],[38,5],[34,9],[38,9],[[],77],[[],77],[[],77],0,[[]],[[]],[[]],[[]],[[]],[[]],[[],30],[[],30],[[[34,[40]],78],30],[38,[[9,[21]]]],[38,[[9,[21]]]],[34,9],[38,9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],0,[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[34,52],[[]],[[]],[[]],[[]],[[]],[[]],0,[38,15],0,[33,[[9,[30,26]]]],[33,[[9,[26]]]],[33,[[9,[30,26]]]],[33,[[9,[26]]]],0,0,0,0,0,0,0,0,0,0,0,0,[[]],[[]],[[26,18],19],[[26,18],19],[25,26],[[]],[23,26],[22,26],[79,26],[80,26],[81,26],[21,26],[[]],[29],[[],30],[[],9],[[],9],[[],32],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[82,82],[83,83],[84,84],[57,57],[85,85],[56,56],[[]],[[]],[[]],[[]],[[]],[[]],0,0,[[],85],[[82,82],15],[[83,83],15],[[84,84],15],[[57,57],15],[[85,85],15],[[25,25],15],[[82,18],19],[[83,18],19],[[84,18],19],[[57,18],19],[[85,18],19],[[25,18],19],[[25,18],19],[[56,18],19],[[]],[[]],[[]],[15,84],[83,57],[[]],[[]],[[]],[[]],[[57,86],[[9,[85,25]]]],[82],[85],[83,30],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[83,15],[84,15],[85,15],0,[[85,85],[[28,[14]]]],[29],[57,15],0,[82,9],[83,9],[84,9],[57,9],[85,9],0,[[]],[[]],[[]],[[]],[[]],[[]],[[],30],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[35,[[9,[87,26]]]],[[[89,[[88,[46]]]],35],[[9,[87,26]]]],[[[90,[[88,[47]]]],35],[[9,[87,26]]]],[[[91,[[88,[47]]]],35],[[9,[87,26]]]],[[[93,[[92,[46]]]],35],[[9,[87,26]]]],[[[94,[[92,[46]]]],35],[[9,[87,26]]]],[[[95,[[92,[47]]]],35],[[9,[87,26]]]],[[[96,[[92,[47]]]],35],[[9,[87,26]]]],[[[97,[[92,[47]]]],35],[[9,[87,26]]]],[[[98,[[92,[47]]]],35],[[9,[87,26]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[87,48,35],[[9,[26]]]],[[48,35],[[9,[26]]]],[[48,35],[[9,[26]]]],[[48,35],[[9,[26]]]],[[48,35],[[9,[26]]]],[[48,35],[[9,[26]]]],[[48,35],[[9,[26]]]],[[48,35],[[9,[26]]]],[[48,35],[[9,[26]]]],[[48,35],[[9,[26]]]],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[],99],[[],37],[[40,41],42],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[38,[[9,[43]]]],[39,[[9,[43]]]],[[],[[9,[43]]]],[[[101,[100,58]]],[[101,[100,58]]]],[37,37],[102,102],[103,103],[40,40],[104,104],[105,105],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[103,103],14],[[40,40],14],[[104,104],14],[[105,105],14],0,[[],102],[[[101,[58]]]],[[40,41],42],[103,52],[[37,37],15],[[103,103],15],[[40,40],15],[[104,104],15],[[105,105],15],[[[107,[[0,[106,58]]]],18],19],[[37,18],19],[[102,18],19],[[23,18],19],[[23,18],19],[[103,18],[[9,[60]]]],[[103,18],[[9,[60]]]],[[40,18],[[9,[60]]]],[[40,18],[[9,[60]]]],[[108,18],[[9,[60]]]],[[108,18],[[9,[60]]]],[[104,18],[[9,[60]]]],[[109,18],[[9,[60]]]],[[105,18],[[9,[60]]]],[103,15],[110,[[111,[58]]]],[[]],[112,[[111,[58]]]],[[]],[[]],[[]],[[]],[22,23],[21,23],[[]],[[]],[42,40],[[]],[[]],[[]],[[]],[[]],[[40,99],[[107,[58]]]],[[108,99],[[107,[58]]]],[33,[[9,[40]]]],[33,[[9,[108]]]],[67,[[9,[103,21]]]],[40,73],[[],[[9,[101]]]],[[],[[9,[101]]]],[[],[[9,[101]]]],[[],[[9,[101]]]],[[[111,[58]]],15],[40,15],[103],[40],[104],[105],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],[[9,[107,23]]]],[[[28,[113]],73],[[9,[107,23]]]],[101,[[9,[107,23]]]],[[101,[28,[113]],73],[[9,[107,23]]]],[[[107,[58]]],[[9,[[107,[58]],23]]]],[40,[[9,[[107,[58]],23]]]],[108,[[9,[[107,[58]],23]]]],[[],[[9,[111,23]]]],[[[111,[58]]],[[9,[[111,[58]],23]]]],[101,[[9,[111,23]]]],[[[101,[58]]]],[[[111,[58]],35],[[28,[110]]]],[[[111,[58]],35,48],112],[40,15],[[],15],[37,15],[[],15],[37,15],[[],15],[37,15],[40,15],[40,15],0,0,0,[103,[[9,[71,21]]]],[[],99],[40,114],[38,[[28,[5]]]],[103,5],[103,5],[[99,99],99],[[],33],[[5,[8,[7]]],[[9,[103,21]]]],0,0,[38,[[9,[21]]]],[[[107,[58]],99],[[107,[58]]]],[[103,103],[[28,[14]]]],[[40,40],[[28,[14]]]],[[104,104],[[28,[14]]]],[[105,105],[[28,[14]]]],[[],5],0,[29],[103,[[9,[21]]]],[103,[[9,[[8,[[8,[2,7]],7]],21]]]],[103,5],[[],77],[103,39],[[],99],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[108,48],[[9,[40,115]]]],[[],30],[[],30],[[],30],[[],30],[38,[[9,[21]]]],[38,[[9,[21]]]],[103,[[9,[103]]]],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,[[],[[28,[16]]]],[[],[[28,[3]]]],[5,[[28,[31]]]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[116,116],116],[[117,1,118,[120,[119]]]],0,[[117,121],[[9,[15,122]]]],[117,123],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[117,124],[[9,[[127,[125,126]],17]]]],[117,[[127,[125,128]]]],[[117,129]],[117,86],[116,116],[[]],0,[117,[[9,[15]]]],0,[[],116],[130],[[117,1],[[28,[41]]]],[[117,52],28],[[117,1],30],[[],[[9,[116]]]],[[116,116],15],[[130,130],15],0,[[117,131,132],[[9,[15,17]]]],[[116,18],[[9,[60]]]],[[116,18],[[9,[60]]]],[[[117,[106]],18],19],[[133,18],19],[[130,18],19],[[130,18],19],[[134,18],19],[[[134,[106]],18],19],[[135,18],19],[[]],[[]],[[]],[[]],[[]],[[]],[[117,133],130],[117,116],[[117,1],68],[[117,133],130],[[117,10,[28,[136]],15],[[9,[137,17]]]],[[117,1],[[120,[55]]]],[[117,124,15],[[28,[13]]]],[[117,27],[[28,[10]]]],0,0,[[117,138],[[9,[15,139]]]],[[117,129,140],[[9,[15,135]]]],[[]],[[]],[[]],[[]],[[]],[[]],[52,15],[[117,52],15],0,[117,86],[117,[[28,[138]]]],[117,141],[117,142],[117,35],[[143,[28,[143]],35],[[9,[117,134]]]],[[143,[28,[143]],35],[[9,[117,26]]]],[[117,1],41],[[117,1],[[9,[[28,[57]],17]]]],[29],[[117,1],[[28,[68]]]],[117,48],[116,9],[[117,131,132],[[9,[15,17]]]],0,[117,144],[117,[[86,[1,[0,[141,100]]]]]],[[117,1],[[0,[141,100]]]],[117,145],[[]],[[],30],[[],30],[[],30],[116,16],[117,141],0,[116,16],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],0,[117,123],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],0,[[]],[[]],[[]],[[]],[[]],[[]],[[28,35,48],[[9,[30,17]]]],0,0,0,0,0,0,0,0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[146,146],[147,147],[148,148],[[]],[[]],[[]],[[[8,[11]],[8,[11]],3,16,52],[[9,[149,17]]]],[[146,[8,[11]],[8,[11]],3,16,52],[[9,[149,17]]]],[[147,[8,[11]],[8,[11]],3,16,52],[[9,[149,17]]]],[[148,[8,[11]],[8,[11]],3,16,52],[[9,[149,17]]]],[[16,3,52],150],[[],146],[[],147],[[],148],0,0,[[150,18],19],[[149,18],19],[[146,18],19],[[147,18],19],[[148,18],19],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[149,16],[16,148],0,[149,16],[[]],[[]],[[]],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,[[]],[[]],[151,[[28,[30]]]],[151,30],[[],[[9,[151]]]],[[117,33,15],[[9,[151,33]]]],[[151,18],19],[[]],[33,[[9,[151]]]],[[]],0,[151,9],[151,30],[[],9],[[],9],[[],32],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[55,152,118,[120,[119]]],[[28,[[120,[119]]]]]],0,0,[[55,48],153],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[153,34,48],55],[152,152],[24,24],[154,154],[[[156,[[0,[100,155,106,100]]]]],[[156,[[0,[100,155,106,100]]]]]],[118,118],[55,55],[132,132],[157,157],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[152,152],14],[[118,118],14],[[],118],[[],55],[[],132],[[],157],[[[156,[[0,[155,106,100]]]]]],[[],[[28,[108]]]],[[[156,[158]]],[[28,[108]]]],[[[156,[[44,[110]]]]],[[28,[108]]]],[[152,152],15],[[24,24],15],[[154,154],15],[[118,118],15],[[157,157],15],[[55,152],[[28,[120]]]],[[152,18],19],[[24,18],19],[[24,18],19],[[154,18],19],[[[156,[[0,[106,155,106,100]]]],18],19],[[118,18],19],[[55,18],19],[[132,18],19],[[157,18],19],[114,152],[159,152],[[]],[[]],[160,24],[[]],[[]],[[]],[[]],[[]],[[]],[152],[48,152],[[[156,[[44,[110]]]],48],152],[[[156,[158]],48],152],[55,[[8,[152]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[[0,[155,106,100]],154],[[156,[[0,[155,106,100]]]]]],[[],55],[[152,152],[[28,[14]]]],[[118,118],[[28,[14]]]],[29],[[55,152,118],[[28,[[120,[119]]]]]],0,[[131,5,132,48],[[9,[24]]]],[[[156,[[44,[110]]]],131,5,132,48],[[9,[24]]]],[[[156,[158]],131,5,132,48],[[9,[24]]]],[[131,132,48],[[9,[24]]]],[[131,132,48],[[9,[24]]]],0,[55,[[8,[120]]]],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],30],0,0,[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,[[[127,[161,128]]],[[127,[161,128]]]],[[[127,[161,162]],27,137,5],[[9,[[127,[161,162]],17]]]],[[[127,[161,162]]],[[127,[161,162]]]],[[[127,[161,128]],52,16],[[127,[161,128]]]],[[[127,[161,162]],27],[[127,[161,162]]]],[[[127,[161,162]],27],[[9,[[127,[161,162]],17]]]],[[[127,[161,162]]],[[9,[[127,[161,162]],17]]]],[[[127,[161,162]],15],[[127,[161,162]]]],[[[127,[125,126]],52],[[9,[[127,[125,126]],17]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[[127,[161,162]],163],[[127,[161,162]]]],[128,128],[126,126],[[[127,[100]]],[[127,[100]]]],[164,164],[163,163],[[]],[[]],[[]],[[]],[[]],[[164,164],14],[[163,163],14],[[[127,[161,162]],161],[[127,[161,162]]]],[[[127,[161,162]],41],[[127,[161,162]]]],[[],128],[[],126],[[],164],[[],163],[[[127,[161,162]]],[[127,[161,162]]]],[[[127,[161,128]],52],[[127,[161,128]]]],[[[127,[161,162]]],[[127,[161,162]]]],[[[127,[161,162]]],[[127,[161,162]]]],[[[127,[161,162]],165],[[127,[161,162]]]],[[164,164],15],[[163,163],15],[[[127,[161,162]],16],[[127,[161,162]]]],[[[127,[161,162]],3],[[127,[161,162]]]],[[[127,[161,162]]],[[9,[17]]]],[[128,18],19],[[126,18],19],[[[127,[106,106,106]],18],19],[[164,18],19],[[163,18],19],[[]],[[]],[[]],[[]],[[]],[164],[163],[[[127,[161,162]]],[[127,[161,162]]]],[[]],[[]],[[]],[[]],[[]],[[[127,[161,162]]],[[127,[161,162]]]],[[[127,[161,162]],166],[[127,[161,162]]]],[[[127,[161,162]]],[[127,[161,162]]]],[[[127,[161,162]]],[[127,[161,162]]]],[[[127,[161,162]],164],[[127,[161,162]]]],[[164,164],[[28,[14]]]],[[163,163],[[28,[14]]]],[[[127,[161,162]],[86,[30,[8,[5]]]],1],[[127,[161,162]]]],[[[127,[161,128]],8],[[127,[161,128]]]],[[[127,[161,162]],136],[[127,[161,162]]]],[[164,129]],[[]],[[]],[[]],[[]],[[]],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],9],[[],32],[[],32],[[],32],[[],32],[[],32],[[[127,[161,162]],[8,[27]]],[[127,[161,162]]]],[[[127,[161,162]],167],[[127,[161,162]]]],[[]],[[]],[[]],[[]],[[]]],"p":[[4,"KeychainKind"],[15,"u8"],[3,"FeeRate"],[15,"f32"],[15,"usize"],[3,"u5"],[3,"Global"],[3,"Vec"],[4,"Result"],[3,"LocalUtxo"],[3,"WeightedUtxo"],[4,"Utxo"],[3,"TransactionDetails"],[4,"Ordering"],[15,"bool"],[15,"u64"],[4,"Error"],[3,"Formatter"],[6,"Result"],[4,"Error"],[4,"Error"],[4,"Error"],[4,"KeyError"],[4,"SignerError"],[4,"PolicyError"],[4,"Error"],[3,"OutPoint"],[4,"Option"],[3,"Demand"],[3,"String"],[3,"TxOut"],[3,"TypeId"],[15,"str"],[4,"Descriptor"],[4,"Network"],[3,"Address"],[4,"ScriptContextEnum"],[3,"Miniscript"],[4,"Terminal"],[4,"DescriptorPublicKey"],[15,"u32"],[3,"DefiniteDescriptorKey"],[4,"ScriptContextError"],[3,"DescriptorXKey"],[4,"Wildcard"],[4,"Legacy"],[4,"Segwitv0"],[3,"Secp256k1"],[3,"PublicKey"],[4,"ConversionError"],[4,"DescriptorType"],[3,"Script"],[3,"ExtParams"],[4,"AnalysisError"],[3,"SignersContainer"],[4,"BuildSatisfaction"],[3,"Policy"],[8,"ScriptContext"],[3,"Range"],[3,"Error"],[3,"Sh"],[3,"Bare"],[3,"Wpkh"],[3,"Tr"],[3,"Wsh"],[3,"Pkh"],[3,"Tree"],[6,"ExtendedDescriptor"],[3,"Iter"],[3,"PkIter"],[4,"Policy"],[4,"LiftError"],[3,"DerivationPath"],[4,"BareCtx"],[4,"TapTree"],[3,"TxIn"],[4,"SigType"],[3,"HashMap"],[4,"Error"],[4,"Error"],[4,"Error"],[4,"PkOrF"],[4,"SatisfiableItem"],[4,"Satisfaction"],[3,"Condition"],[3,"BTreeMap"],[6,"DescriptorTemplateOut"],[8,"IntoDescriptorKey"],[3,"P2Pkh"],[3,"P2Wpkh_P2Sh"],[3,"P2Wpkh"],[8,"DerivableKey"],[3,"Bip44"],[3,"Bip44Public"],[3,"Bip49"],[3,"Bip49Public"],[3,"Bip84"],[3,"Bip84Public"],[6,"ValidNetworks"],[8,"Clone"],[3,"GeneratedKey"],[3,"PrivateKeyGenerateOptions"],[3,"SortedMultiVec"],[3,"SinglePub"],[4,"SinglePubKey"],[8,"Debug"],[4,"DescriptorKey"],[4,"DescriptorSecretKey"],[3,"SinglePriv"],[3,"ExtendedPrivKey"],[4,"ExtendedKey"],[3,"ExtendedPubKey"],[6,"KeySource"],[3,"Fingerprint"],[3,"DescriptorKeyParseError"],[3,"Balance"],[3,"Wallet"],[3,"SignerOrdering"],[8,"TransactionSigner"],[3,"Arc"],[6,"Update"],[3,"UpdateNotConnectedError"],[3,"TxGraph"],[3,"Txid"],[6,"DefaultCoinSelectionAlgorithm"],[3,"BumpFee"],[3,"TxBuilder"],[3,"CreateTx"],[3,"Transaction"],[3,"AddressInfo"],[3,"PartiallySignedTransaction"],[3,"SignOptions"],[4,"AddressIndex"],[4,"NewError"],[4,"InsertTxError"],[3,"PsbtSighashType"],[3,"Input"],[3,"BlockId"],[3,"InsertBlockNotMatchingError"],[4,"ConfirmationTime"],[8,"Iterator"],[3,"LocalChain"],[8,"IntoWalletDescriptor"],[3,"KeychainTxOutIndex"],[6,"ChangeSet"],[3,"LargestFirstCoinSelection"],[3,"OldestFirstCoinSelection"],[3,"BranchAndBoundCoinSelection"],[3,"CoinSelectionResult"],[4,"Excess"],[3,"FullyNodedExport"],[4,"SignerId"],[6,"KeyMap"],[4,"SignerContext"],[8,"Sized"],[3,"SignerWrapper"],[4,"TapLeavesOptions"],[3,"PrivateKey"],[3,"Hash"],[4,"Error"],[8,"CoinSelectionAlgorithm"],[8,"TxBuilderContext"],[4,"ChangeSpendPolicy"],[4,"TxOrdering"],[3,"Sequence"],[4,"LockTime"],[15,"i32"],[8,"Vbytes"],[13,"InsufficientFunds"],[13,"FeeRateTooLow"],[13,"FeeTooLow"],[13,"Foreign"],[8,"ExtractPolicy"],[13,"PsbtTimelocks"],[13,"Complete"],[13,"Partial"],[13,"PartialComplete"],[13,"Sha256Preimage"],[13,"Hash256Preimage"],[13,"Ripemd160Preimage"],[13,"Hash160Preimage"],[13,"Thresh"],[13,"Multisig"],[13,"AbsoluteTimelock"],[13,"RelativeTimelock"],[8,"DescriptorTemplate"],[8,"GeneratableKey"],[8,"ExtScriptContext"],[8,"GeneratableDefaultOptions"],[8,"PsbtUtils"],[8,"IsDust"],[13,"ConfirmationHeightCannotBeGreaterThanTip"],[13,"Change"],[13,"NoChange"],[8,"SignerCommon"],[8,"InputSigner"],[13,"Tap"]]},\ +"bdk_chain":{"doc":"This crate is a collection of core structures for Bitcoin …","t":[8,8,17,3,17,8,4,3,4,3,13,13,8,16,8,3,2,16,3,8,3,3,2,13,13,16,11,10,11,11,12,12,10,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,12,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,12,12,11,11,11,0,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,10,11,12,11,11,11,0,10,0,11,2,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,12,12,12,16,3,3,8,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,10,10,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,3,3,3,3,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,12,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,6,3,3,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,3,3,3,3,3,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,12,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11],"n":["Anchor","Append","BIP32_MAX_INDEX","BlockId","COINBASE_MATURITY","ChainOracle","ChainPosition","ConfirmationHeightAnchor","ConfirmationTime","ConfirmationTimeAnchor","Confirmed","Confirmed","DescriptorExt","Error","ForEachTxOut","FullTxOut","IndexedTxGraph","LoadError","Persist","PersistBackend","SpkIterator","SpkTxOutIndex","TxGraph","Unconfirmed","Unconfirmed","WriteError","all_spks","anchor_block","anchor_block","anchor_block","anchor_block","anchor_block","append","apply_additions","bitcoin","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_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cloned","cmp","cmp","cmp","cmp","cmp","cmp","commit","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","deserialize","deserialize","deserialize","deserialize","dust_value","eq","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_txout","from","from","from","from","from","from","from","from","from","from","from","from","get_chain_tip","hash","hash","hash","hash","hash","hash","height","index_of_spk","index_tx","index_txout","indexed_tx_graph","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","load_from_persistence","local_chain","mark_used","miniscript","net_value","new","new","next","nth","outpoint","outpoints","outputs_in_range","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","scan","scan_txout","sent_and_received","serialize","serialize","serialize","serialize","spent_by","spk_at_index","stage","staged","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","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","write_changes","height","last_seen","time","Additions","IndexedAdditions","IndexedTxGraph","Indexer","append","apply_additions","apply_additions","apply_update","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","default","default","deserialize","eq","fmt","fmt","from","from","from","from","graph","graph_additions","index","index_additions","index_tx","index_txout","insert_relevant_txs","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","DerivationAdditions","KeychainTxOutIndex","LocalChangeSet","LocalUpdate","add","add_keychain","append","append","apply_additions","apply_additions","as_inner","as_ref","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","chain","chain_changeset","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","confirmed","default","default","default","default","default","deref","deserialize","deserialize","deserialize","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","graph","immature","index_tx","index_txout","indexed_additions","inner","into","into","into","into","into","is_empty","is_empty","is_empty","is_tx_relevant","keychain","keychains","last_revealed_index","last_revealed_indices","last_used_index","last_used_indices","lookahead_to_target","lookahead_to_target_multi","lookaheads","mark_used","next_index","next_unused_spk","outpoints","reveal_next_spk","reveal_to_target","reveal_to_target_multi","revealed_spks_of_all_keychains","revealed_spks_of_keychain","scan","scan_txout","serialize","serialize","serialize","set_lookahead","set_lookahead_for_all","spks_of_all_keychains","spks_of_keychain","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","total","trusted_pending","trusted_spendable","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","txouts_of_keychain","type_id","type_id","type_id","type_id","type_id","unmark_used","untrusted_pending","unused_spks_of_keychain","vzip","vzip","vzip","vzip","vzip","ChangeSet","InsertBlockNotMatchingError","LocalChain","UpdateNotConnectedError","apply_changeset","apply_update","as_ref","blocks","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","cmp","default","determine_changeset","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from_blocks","get_chain_tip","height","initial_changeset","insert_block","into","into","into","is_block_in_chain","original_hash","partial_cmp","provide","provide","tip","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","update_hash","vzip","vzip","vzip","Additions","CanonicalTx","TxDescendants","TxGraph","TxNode","all_anchors","all_txouts","anchors","anchors","append","apply_additions","apply_update","as_ref","balance","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","calculate_fee","checked_sum","checked_sum","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmp","cmp","default","default","deref","deserialize","determine_additions","direct_conflicts_of_tx","eq","eq","eq","eq","filter_chain_txouts","filter_chain_unspents","floating_txouts","fmt","fmt","fmt","fmt","for_each_txout","for_each_txout","from","from","from","from","from","full_txs","get_chain_position","get_chain_spend","get_tx","get_tx_node","get_txout","insert_anchor","insert_anchor_preview","insert_seen_at","insert_seen_at_preview","insert_tx","insert_tx_preview","insert_txout","insert_txout_preview","into","into","into","into","into","into_iter","is_empty","is_empty","is_empty","last_seen","last_seen_unconfirmed","list_chain_txs","new","next","node","observed_as","outspends","partial_cmp","partial_cmp","serialize","to_owned","to_owned","to_owned","to_owned","try_balance","try_filter_chain_txouts","try_filter_chain_unspents","try_from","try_from","try_from","try_from","try_from","try_get_chain_position","try_get_chain_spend","try_into","try_into","try_into","try_into","try_into","try_list_chain_txs","tx","tx_outputs","tx_spends","txid","txouts","txouts","txs","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","walk_conflicts","walk_descendants"],"q":["bdk_chain","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::ConfirmationTime","","","bdk_chain::indexed_tx_graph","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::keychain","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::local_chain","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_chain::tx_graph","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"d":["Trait that “anchors” blockchain data to a specific …","Trait that makes an object appendable.","Maximum BIP32 derivation index.","A reference to a block in the canonical chain.","How many confirmations are needed f or a coinbase output …","Represents a service that tracks the blockchain.","Represents the observed position of some chain data.","An Anchor implementation that also records the exact …","Block height and timestamp at which a transaction is …","An Anchor implementation that also records the exact …","The chain data is seen as confirmed, and in anchored by A.","The confirmed variant.","A trait to extend the functionality of a miniscript …","Error type.","Trait to do something with every txout contained in a …","A TxOut with as much data as we can retrieve about it","","The error the backend returns when it fails to load …","Persist wraps a PersistBackend (B) to create a convenient …","A persistence backend for Persist.","An iterator for derived script pubkeys.","An index storing TxOuts that have a script pubkey that …","","The chain data is seen in mempool at this given timestamp.","The unconfirmed variant.","The error the backend returns when it fails to write.","The script pubkeys that are being tracked by the index.","Returns the BlockId that the associated blockchain data is …","","","The anchor block.","The anchor block.","Append another object of the same type onto self.","","","","","","","","","","","","","","","","","","","","","The position of the transaction in outpoint in the overall …","","","","","","","","","","","","","","","","","Maps a ChainPosition<&A> into a ChainPosition<A> by …","","","","","","","Commit the staged changes to the underlying persistance …","The exact confirmation height of the transaction.","The confirmation height of the chain data being anchored.","Get the upper bound of the chain data’s confirmation …","Get the upper bound of the chain data’s confirmation …","Determines the upper bound of the confirmation height.","","","The confirmation time of the chain data being anchored.","","","","","","","","","Returns the minimum value (in satoshis) at which an output …","","","","","","","","","","","","","","","The provided closure f will be called with each …","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Get the best chain’s chain tip.","","","","","","The hash of the block.","The height of the block.","Returns the index associated with the script pubkey.","","","Contains the IndexedTxGraph structure and associated types.","Adds a script pubkey to scan for. Returns false and does …","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","Determines whether block of BlockId exists as an ancestor …","Returns whether ChainPosition is confirmed or not.","Returns whether ConfirmationTime is the confirmed variant.","Whether the utxo is/was/will be spendable with chain tip.","Returns whether the structure is considered empty.","Whether the txout is considered mature.","Whether this output is on a coinbase transaction.","Whether any of the inputs of this transaction spend a …","","Returns whether the script pubkey at index has been used …","Module for keychain related structures.","Return the aggregate changeset C from persistence.","The LocalChain is a local implementation of ChainOracle.","Marks the script pubkey at index as used even though it …","","Computes the net value that this transaction gives to the …","Create a new Persist from PersistBackend.","Creates a new script pubkey iterator starting at 0 from a …","","","The location of the TxOut.","Get a reference to the set of indexed outpoints.","Iterates over all the outputs with script pubkeys in an …","","","","","","","Scans an object containing many txouts.","Scan a single TxOut for a matching script pubkey and …","Computes total input value going from script pubkeys in …","","","","","The txid and chain position of the transaction (if any) …","Returns the script that has been inserted at the index.","Stage a changeset to be commited later with commit.","Get the changes that have not been commited yet.","","","","","","","","","","","","","","","","","","","","","","","","","","","Module for structures that store and traverse transactions.","Returns the txout and script pubkey index of the TxOut at …","The TxOut.","Iterate over all known txouts that spend to tracked script …","Finds all txouts on a transaction that has previously been …","","","","","","","","","","Construct an unconfirmed variant using the given last_seen …","Undoes the effect of mark_used. Returns whether the index …","Iterates over all unused script pubkeys in an index range.","","","","","","","","","","Writes a changeset to the persistence backend.","Confirmation height.","The last-seen timestamp in unix seconds.","Confirmation time in unix seconds.","The resultant “additions” when new transaction data is …","A structure that represents changes to an IndexedTxGraph.","A struct that combines TxGraph and an Indexer …","Represents a structure that can index transaction data.","","Apply additions to itself.","Applies the IndexedAdditions to the IndexedTxGraph.","Apply an update directly.","","","","","","","","","","","","","Returns the argument unchanged.","","","Returns the argument unchanged.","Get a reference of the internal transaction graph.","TxGraph additions.","Transaction index.","Indexer additions.","Scan and index the given transaction.","Scan and index the given outpoint and txout.","Insert relevant transactions from the given txs iterator.","Insert and index a transaction into the graph.","Insert a floating txout of given outpoint.","Calls U::from(self).","Calls U::from(self).","","Determines whether the transaction should be included in …","Construct a new IndexedTxGraph with a given index.","","","","","","","","","","","Balance, differentiated into various categories.","Represents updates to the derivation index of a …","A convenient wrapper around SpkTxOutIndex that relates …","A structure that records the corresponding changes as …","A structure to update KeychainTxOutIndex, TxGraph and …","","Add a keychain to the tracker’s txout_index with a …","Append another DerivationAdditions into self.","","Applies the derivation additions to the KeychainTxOutIndex…","","Get the inner map of the keychain to its new derivation …","","","","","","","","","","","","Update for the LocalChain.","Changes to the LocalChain.","","","","","","","","","","","Confirmed and immediately spendable balance","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","","Returns the argument unchanged.","Update for the TxGraph.","All coinbase outputs not yet matured","","","Additions to IndexedTxGraph.","Return a reference to the internal SpkTxOutIndex.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Returns whether the additions are empty.","","","","Last active derivation index per keychain (K).","Return a reference to the internal map of the keychain to …","Get the last derivation index revealed for keychain.","Get the last derivation index that is revealed for each …","Returns the highest derivation index of the keychain where …","Returns the highest derivation index of each keychain that …","Store lookahead scripts until target_index.","Convenience method to call lookahead_to_target for …","Return the lookahead setting for each keychain.","Marks the script pubkey at index as used even though the …","Get the next derivation index for keychain. The next index …","Gets the next unused script pubkey in the keychain. I.e., …","Get a reference to the set of indexed outpoints.","Attempts to reveal the next script pubkey for keychain.","Reveals script pubkeys of the keychain’s descriptor up …","Convenience method to call Self::reveal_to_target on …","Convenience method to get revealed_spks_of_keychain of all …","Iterates over the script pubkeys revealed by this index …","Scans an object for relevant outpoints, which are stored …","Scan a single outpoint for a matching script pubkey.","","","","Set the lookahead count for keychain.","Convenience method to call set_lookahead for all keychains.","Generates script pubkey iterators for every keychain. The …","Generates a script pubkey iterator for the given keychain…","","","","","","","Get the whole balance visible to the wallet.","Unconfirmed UTXOs generated by a wallet tx","Get sum of trusted_pending and confirmed coins.","","","","","","","","","","","Iterates over all the OutPoint that have a TxOut with a …","","","","","","Undoes the effect of mark_used. Returns whether the index …","Unconfirmed UTXOs received from an external wallet","Iterates over all unused script pubkeys for a keychain …","","","","","","This is the return value of determine_changeset and …","Represents a failure when trying to insert a checkpoint …","This is a local implementation of ChainOracle.","Represents an update failure of LocalChain due to the …","Applies the given changeset.","Updates LocalChain with an update LocalChain.","","Get a reference to a map of block height to hash.","","","","","","","","","","","","","","","This is like the sparsechain’s logic, expect we must …","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Contruct a LocalChain from a list of BlockIds.","","The checkpoints’ height.","Derives a ChangeSet that assumes that there are no …","Insert a block of BlockId into the LocalChain.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","Original checkpoint’s block hash.","","","","Get the chain tip.","","","","","","","","","","","","","","","Update checkpoint’s block hash.","","","","A structure that represents changes to a TxGraph.","An outwards-facing view of a transaction that is part of …","An iterator that traverses transaction descendants.","A graph of transactions and spends.","An outward-facing view of a (transaction) node in the …","Get all transaction anchors known by TxGraph.","Iterate over all tx outputs known by TxGraph.","The blocks that the transaction is “anchored” in.","Added anchors.","","Applies Additions to TxGraph.","Extends this graph with another so that self becomes the …","","Get the total balance of outpoints that are in chain of …","","","","","","","","","","","Calculates the fee of a given transaction. Returns 0 if tx …","","","","","","","","","","","","","","","","","Previews the resultant Additions when Self is updated …","Given a transaction, return an iterator of txids that …","","","","","Get a filtered list of outputs from the given outpoints …","Get a filtered list of unspent outputs (UTXOs) from the …","Iterate over floating txouts known by TxGraph.","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Iterate over all full transactions in the graph.","Get the position of the transaction in chain with tip …","Get the txid of the spending transaction and where the …","Get a transaction by txid. This only returns Some for full …","Get a transaction node by txid. This only returns Some for …","Obtains a single tx output (if any) at the specified …","Inserts the given anchor into TxGraph.","Returns the resultant Additions if the txid is set in …","Inserts the given seen_at into TxGraph.","Returns the resultant Additions if the txid is set to …","Inserts the given transaction into TxGraph.","Returns the resultant Additions if the given transaction …","Inserts the given TxOut at OutPoint.","Returns the resultant Additions if the given txout is …","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","Whether the graph has any transactions or outputs in it.","","Returns true if the Additions is empty (no transactions or …","Added last-seen unix timestamps of transactions.","The last-seen unix timestamp of the transaction as …","List graph transactions that are in chain with chain_tip.","Construct a new TxGraph from a list of transactions.","","The transaction node (as part of the graph).","How the transaction is observed as (confirmed or …","The transactions spending from this output.","","","","","","","","Get the total balance of outpoints that are in chain of …","Get a filtered list of outputs from the given outpoints …","Get a filtered list of unspent outputs (UTXOs) from the …","","","","","","Get the position of the transaction in chain with tip …","Get the txid of the spending transaction and where the …","","","","","","List graph transactions that are in chain with chain_tip.","A partial or full representation of the transaction.","Returns known outputs of a given txid.","Iterates over the transactions spending from txid.","Txid of the transaction.","Iterates over all outpoints contained within Additions.","Added txouts.","Added transactions.","","","","","","","","","","","Creates an iterator that both filters and maps conflicting …","Creates an iterator that filters and maps descendants from …"],"i":[0,0,0,0,0,0,0,0,0,0,8,9,0,68,0,0,0,69,0,0,0,0,0,8,9,69,3,17,6,7,6,7,39,3,0,3,8,9,5,6,7,10,13,11,3,8,9,5,6,7,10,13,11,10,3,8,9,5,6,7,10,11,3,8,9,5,6,7,10,11,8,8,9,5,6,7,10,13,6,7,17,17,8,6,7,7,3,5,6,7,9,5,6,7,70,8,9,5,6,7,10,3,8,9,5,6,7,10,13,71,3,8,9,9,5,5,5,6,7,10,13,11,68,8,9,5,6,7,5,5,3,3,3,0,3,3,8,9,5,6,7,10,13,11,11,68,8,9,10,39,10,10,3,3,3,0,69,0,3,0,3,13,11,11,11,10,3,3,8,9,5,6,7,10,3,3,3,9,5,6,7,10,3,13,13,3,8,9,5,6,7,10,11,3,8,9,5,6,7,10,13,11,3,8,9,5,6,7,10,13,11,0,3,10,3,3,3,8,9,5,6,7,10,13,11,9,3,3,3,8,9,5,6,7,10,13,11,69,72,73,72,41,0,0,0,40,41,42,42,42,40,42,40,40,40,42,40,40,40,42,40,42,40,40,40,42,40,42,40,41,41,42,42,42,42,40,40,41,42,40,40,42,40,42,40,42,40,42,40,0,0,0,0,0,48,49,45,52,49,49,45,45,49,45,53,52,48,49,45,53,52,48,53,52,49,45,53,52,48,49,45,53,52,48,48,49,45,53,52,48,49,45,52,48,45,53,52,48,49,45,53,52,48,48,49,45,53,52,52,52,48,53,48,49,49,52,49,49,45,53,52,48,45,45,52,49,53,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,45,52,48,49,49,49,49,49,45,53,52,48,48,48,48,48,49,45,53,52,48,49,45,53,52,48,49,49,45,53,52,48,49,48,49,49,45,53,52,48,0,0,0,0,57,57,57,57,57,58,59,57,58,59,57,58,59,57,58,59,57,57,57,57,58,59,57,58,58,59,59,57,57,58,59,57,57,59,57,57,57,58,59,57,59,57,58,59,57,57,58,59,58,59,57,58,59,57,58,59,57,58,59,59,57,58,59,0,0,0,0,0,43,43,64,46,46,43,43,43,43,66,43,64,65,46,66,43,64,65,46,43,66,66,43,64,65,46,43,64,65,46,64,65,43,46,64,46,43,43,43,64,65,46,43,43,43,43,64,65,46,43,46,66,43,64,65,46,43,43,43,43,43,43,43,43,43,43,43,43,43,43,66,43,64,65,46,66,43,46,46,46,64,43,43,66,65,65,43,64,65,46,43,64,65,46,43,43,43,66,43,64,65,46,43,43,66,43,64,65,46,43,64,43,43,64,46,46,46,66,43,64,65,46,66,43,64,65,46,43,43],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[[3,[[0,[1,2]]]]],4],[[],5],[6,5],[7,5],0,0,[[]],[[[3,[[0,[1,2]]]]]],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,[[[3,[1]]],[[3,[1]]]],[[[8,[1]]],[[8,[1]]]],[9,9],[5,5],[6,6],[7,7],[[[10,[1]]],[[10,[1]]]],[[[11,[1]]],[[11,[1]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[8,[[8,[1]]]],[[[8,[2]],8],12],[[9,9],12],[[5,5],12],[[6,6],12],[[7,7],12],[[[10,[2]],10],12],[13,[[15,[14]]]],0,0,[[],16],[[],16],[[[8,[17]]],[[14,[16]]]],[6,16],[7,16],0,[[],3],[[],5],[[],6],[[],7],[[],[[15,[9]]]],[[],[[15,[5]]]],[[],[[15,[6]]]],[[],[[15,[7]]]],[[],18],[[[8,[19]],8],20],[[9,9],20],[[5,5],20],[[6,6],20],[[7,7],20],[[[10,[19]],10],20],[[[3,[21]],22],23],[[[8,[21]],22],23],[[9,22],23],[[5,22],23],[[6,22],23],[[7,22],23],[[[10,[21]],22],23],[[[13,[21,21]],22],23],[24],[[]],[[]],[[]],[[[8,[7]]],9],[[],5],[[],5],[[]],[[]],[[]],[[]],[[]],[[]],[[],[[15,[[14,[5]]]]]],[[[8,[25]]]],[9],[5],[6],[7],0,0,[[[3,[[0,[1,2]]]],26],14],[[[3,[[0,[1,2]]]],27]],[[[3,[[0,[1,2]]]],28,29]],0,[[[3,[[0,[1,2]]]],[0,[1,2]],26],20],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[5,5],[[15,[[14,[20]]]]]],[8,20],[9,20],[[[10,[17]],16],20],[[],20],[[[10,[17]],16],20],0,[[[3,[[0,[1,2]]]],27],20],[[[3,[[0,[1,2]]]],27],20],[[[3,[[0,[1,2]]]]],20],0,[[],15],0,[[[3,[[0,[1,2]]]]],20],0,[[[3,[[0,[1,2]]]],27],30],[[],13],[[],11],[11,14],[[11,31],14],0,[[[3,[[0,[1,2]]]]],32],[[[3,[[0,[1,2]]]],[33,[[0,[1,2]]]]],34],[[[8,[35]],8],[[14,[12]]]],[[9,9],[[14,[12]]]],[[5,5],[[14,[12]]]],[[6,6],[[14,[12]]]],[[7,7],[[14,[12]]]],[[[10,[35]],10],[[14,[12]]]],[[[3,[[0,[1,2]]]]],[[32,[[0,[1,2]]]]]],[[[3,[[0,[1,2]]]],28,29],14],[[[3,[[0,[1,2]]]],27]],[9,15],[5,15],[6,15],[7,15],0,[[[3,[[0,[1,2]]]]],[[14,[26]]]],[13],[13],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],0,[[[3,[[0,[1,2]]]],28],14],0,[[[3,[[0,[1,2]]]]],[[0,[34,36]]]],[[[3,[[0,[1,2]]]],37],34],[[],38],[[],38],[[],38],[[],38],[[],38],[[],38],[[],38],[[],38],[[],38],[18,9],[[[3,[[0,[1,2]]]]],20],[[[3,[[0,[1,2]]]]],34],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],15],0,0,0,0,0,0,0,[[[40,[17,39]],[40,[17,39]]]],[[]],[[[42,[17,41]],[40,[17]]]],[[[42,[17,41]],[43,[17]]],[[40,[17]]]],[[]],[[]],[[]],[[]],[[[40,[1,1]]],[[40,[1,1]]]],[[]],[[],[[42,[44]]]],[[],[[40,[44]]]],[[],[[15,[40]]]],[[[40,[19,19]],40],20],[[[42,[21,21]],22],23],[[[40,[21,21]],22],23],[[]],[45,[[40,[45]]]],[46,[[40,[44]]]],[[]],[42,43],0,0,0,[27],[[28,29]],[[[42,[17,41]],47,[14,[18]]],[[40,[17]]]],[[[42,[17,41]],27,47,[14,[18]]],[[40,[17]]]],[[[42,[17,41]],28,29],[[40,[17]]]],[[]],[[]],[[[40,[17,39]]],20],[27,20],[[],42],[40,15],[[]],[[],15],[[],15],[[],15],[[],15],[[],38],[[],38],[[]],[[]],0,0,0,0,0,[[48,48],48],[[[49,[[0,[1,2,21]]]],[0,[1,2,21]],[51,[50]]]],[[[45,[2]],[45,[2]]]],[[[52,[2,17]],[52,[2,17]]]],[[[49,[[0,[1,2,21]]]],[45,[[0,[1,2,21]]]]]],[[[49,[[0,[1,2,21]]]]]],[45,4],[45,4],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,[[[49,[1]]],[[49,[1]]]],[[[45,[1]]],[[45,[1]]]],[[[53,[1,1]]],[[53,[1,1]]]],[[[52,[1,1]]],[[52,[1,1]]]],[48,48],[[]],[[]],[[]],[[]],[[]],0,[[],49],[[],45],[[],53],[[],52],[[],48],[49],[[],[[15,[45]]]],[[],[[15,[52]]]],[[],[[15,[48]]]],[[[45,[19]],45],20],[[[53,[19,19]],53],20],[[[52,[19,19]],52],20],[[48,48],20],[[[49,[21]],22],23],[[[45,[21]],22],23],[[[53,[21,21]],22],23],[[[52,[21,21]],22],23],[[48,22],23],[[48,22],23],[[]],[[]],[[]],[54,52],[[]],[[[40,[45]]],52],[[]],0,0,[[[49,[[0,[1,2,21]]]],27]],[[[49,[[0,[1,2,21]]]],28,29]],0,[[[49,[[0,[1,2,21]]]]],3],[[]],[[]],[[]],[[]],[[]],[45,20],[[[45,[2]]],20],[[[52,[2,17]]],20],[[[49,[[0,[1,2,21]]]],27],20],0,[[[49,[[0,[1,2,21]]]]],4],[[[49,[[0,[1,2,21]]]]],[[14,[16]]]],[[[49,[[0,[1,2,21]]]]],4],[[[49,[[0,[1,2,21]]]]],[[14,[16]]]],[[[49,[[0,[1,2,21]]]]],[[4,[[0,[1,2,21]],16]]]],[[[49,[[0,[1,2,21]]]],16]],[[[49,[[0,[1,2,21]]]],[4,[[0,[1,2,21]],16]]]],[[[49,[[0,[1,2,21]]]]],4],[[[49,[[0,[1,2,21]]]],16],20],[[[49,[[0,[1,2,21]]]]]],[[[49,[[0,[1,2,21]]]]]],[[[49,[[0,[1,2,21]]]]],32],[[[49,[[0,[1,2,21]]]]]],[[[49,[[0,[1,2,21]]]],16]],[[[49,[[0,[1,2,21]]]],4]],[[[49,[[0,[1,2,21]]]]],[[4,[[0,[1,2,21]],[0,[55,1]]]]]],[[[49,[[0,[1,2,21]]]]],[[0,[34,1]]]],[[[49,[[0,[1,2,21]]]]],[[45,[[0,[1,2,21]]]]]],[[[49,[[0,[1,2,21]]]],28,29],[[45,[[0,[1,2,21]]]]]],[45,15],[52,15],[48,15],[[[49,[[0,[1,2,21]]]],16]],[[[49,[[0,[1,2,21]]]],16]],[[[49,[[0,[1,2,21]]]]],[[4,[[0,[1,2,21]],[11,[[51,[50]]]]]]]],[[[49,[[0,[1,2,21]]]]],[[11,[[51,[50]]]]]],[[]],[[]],[[]],[[]],[[]],[[],56],[48,18],0,[48,18],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[[49,[[0,[1,2,21]]]]],34],[[],38],[[],38],[[],38],[[],38],[[],38],[[[49,[[0,[1,2,21]]]],16],20],0,[[[49,[[0,[1,2,21]]]]],34],[[]],[[]],[[]],[[]],[[]],0,0,0,0,[[57,54]],[[57,57],[[15,[54,58]]]],[57,4],[57,4],[[]],[[]],[[]],[[]],[[]],[[]],[57,57],[58,58],[59,59],[[]],[[]],[[]],[[57,57],12],[[],57],[[57,57],[[15,[54,58]]]],[[57,57],20],[[58,58],20],[[59,59],20],[[57,22],23],[[58,22],23],[[58,22],23],[[59,22],23],[[59,22],23],[[[4,[16,60]]],57],[[]],[[]],[[]],[[],57],[57,[[15,[[14,[5]]]]]],0,[57,54],[[57,5],[[15,[54,59]]]],[[]],[[]],[[]],[[57,5,5],[[15,[[14,[20]]]]]],0,[[57,57],[[14,[12]]]],[61],[61],[57,[[14,[5]]]],[[]],[[]],[[]],[[],56],[[],56],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],38],[[],38],[[],38],0,[[]],[[]],[[]],0,0,0,0,0,[43,32],[43,55],0,0,[[[46,[2]],[46,[2]]]],[[[43,[[0,[1,2]]]],[46,[[0,[1,2]]]]]],[[[43,[[0,[1,2]]]],[43,[[0,[1,2]]]]],[[46,[[0,[1,2]]]]]],[43,43],[[[43,[17]],5,47,24],48],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[43,27],[[14,[30]]]],[[],[[14,[62]]]],[[],[[14,[63]]]],[[[43,[1]]],[[43,[1]]]],[[[64,[1,1]]],[[64,[1,1]]]],[[[65,[1,1]]],[[65,[1,1]]]],[[[46,[1]]],[[46,[1]]]],[[]],[[]],[[]],[[]],[[[64,[2,2]],64],12],[[[65,[2,2]],65],12],[[],43],[[],46],[64],[[],[[15,[46]]]],[[[43,[[0,[1,2]]]],43],[[46,[[0,[1,2]]]]]],[[43,27],55],[[[43,[19]],43],20],[[[64,[19,19]],64],20],[[[65,[19,19]],65],20],[[[46,[19]],46],20],[[[43,[17]],5,47],55],[[[43,[17]],5,47],55],[43,55],[[[43,[21]],22],23],[[[64,[21,21]],22],23],[[[65,[21,21]],22],23],[[[46,[21]],22],23],[[43,24]],[[46,24]],[[]],[[]],[[]],[[]],[[]],[43,55],[[[43,[17]],5,37],[[14,[8]]]],[[[43,[17]],5,28],14],[[43,37],[[14,[27]]]],[[43,37],[[14,[[64,[27]]]]]],[[43,28],[[14,[29]]]],[[[43,[[0,[1,2]]]],37,[0,[1,2]]],[[46,[[0,[1,2]]]]]],[[[43,[[0,[1,2]]]],37,[0,[1,2]]],[[46,[[0,[1,2]]]]]],[[[43,[[0,[1,2]]]],37,18],[[46,[[0,[1,2]]]]]],[[[43,[[0,[1,2]]]],37,18],[[46,[[0,[1,2]]]]]],[[[43,[[0,[1,2]]]],27],[[46,[[0,[1,2]]]]]],[[[43,[[0,[1,2]]]],27],[[46,[[0,[1,2]]]]]],[[[43,[[0,[1,2]]]],28,29],[[46,[[0,[1,2]]]]]],[[[43,[[0,[1,2]]]],28,29],[[46,[[0,[1,2]]]]]],[[]],[[]],[[]],[[]],[[]],[[]],[43,20],[[[46,[2]]],20],[46,20],0,0,[[[43,[17]],5],55],[47,[[43,[[0,[1,2]]]]]],[66,14],0,0,[[43,28],67],[[[64,[35,35]],64],[[14,[12]]]],[[[65,[35,35]],65],[[14,[12]]]],[46,15],[[]],[[]],[[]],[[]],[[[43,[17]],5,47,24],[[15,[48]]]],[[[43,[17]],5,47],55],[[[43,[17]],5,47],55],[[],15],[[],15],[[],15],[[],15],[[],15],[[[43,[17]],5,37],[[15,[[14,[8]]]]]],[[[43,[17]],5,28],[[15,[14]]]],[[],15],[[],15],[[],15],[[],15],[[],15],[[[43,[17]],5],55],0,[[43,37],[[14,[[4,[16,29]]]]]],[[43,37],34],0,[46,55],0,0,[[],38],[[],38],[[],38],[[],38],[[],38],[[]],[[]],[[]],[[]],[[]],[[43,27],66],[[43,37],66]],"p":[[8,"Clone"],[8,"Ord"],[3,"SpkTxOutIndex"],[3,"BTreeMap"],[3,"BlockId"],[3,"ConfirmationHeightAnchor"],[3,"ConfirmationTimeAnchor"],[4,"ChainPosition"],[4,"ConfirmationTime"],[3,"FullTxOut"],[3,"SpkIterator"],[4,"Ordering"],[3,"Persist"],[4,"Option"],[4,"Result"],[15,"u32"],[8,"Anchor"],[15,"u64"],[8,"PartialEq"],[15,"bool"],[8,"Debug"],[3,"Formatter"],[6,"Result"],[8,"FnMut"],[8,"Hash"],[3,"Script"],[3,"Transaction"],[3,"OutPoint"],[3,"TxOut"],[15,"i64"],[15,"usize"],[3,"BTreeSet"],[8,"RangeBounds"],[8,"DoubleEndedIterator"],[8,"PartialOrd"],[8,"ExactSizeIterator"],[3,"Txid"],[3,"TypeId"],[8,"Append"],[3,"IndexedAdditions"],[8,"Indexer"],[3,"IndexedTxGraph"],[3,"TxGraph"],[8,"Default"],[3,"DerivationAdditions"],[3,"Additions"],[8,"IntoIterator"],[3,"Balance"],[3,"KeychainTxOutIndex"],[4,"DescriptorPublicKey"],[4,"Descriptor"],[3,"LocalChangeSet"],[3,"LocalUpdate"],[6,"ChangeSet"],[8,"Iterator"],[3,"String"],[3,"LocalChain"],[3,"UpdateNotConnectedError"],[3,"InsertBlockNotMatchingError"],[3,"BlockHash"],[3,"Demand"],[3,"Amount"],[3,"SignedAmount"],[3,"TxNode"],[3,"CanonicalTx"],[3,"TxDescendants"],[3,"HashSet"],[8,"ChainOracle"],[8,"PersistBackend"],[8,"DescriptorExt"],[8,"ForEachTxOut"],[13,"Confirmed"],[13,"Unconfirmed"]]},\ "bdk_coin_select":{"doc":"","t":[3,3,4,4,3,3,13,6,13,3,4,13,13,13,3,4,3,13,13,17,13,13,13,13,13,3,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,11,11,11,12,11,12,11,11,11,11,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,12,12,12,12,11,11,11,11,12,11,12,12,11,12,12,12,11,11,11,11,12,11,11,11,11,11,11,12,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,11],"n":["Bnb","BnbIter","BnbLimit","BranchStrategy","CoinSelector","CoinSelectorOpt","Continue","DecideStrategy","Duration","ExcessStrategy","ExcessStrategyKind","MinAbsoluteFee","MinDrainValue","Rounds","Selection","SelectionConstraint","SelectionError","SkipBoth","SkipInclusion","TXIN_BASE_WEIGHT","TargetFee","TargetValue","ToDrain","ToFee","ToRecipient","WeightedValue","advertise_new_score","all_selected","apply_selection","backtrack","base_weight","best_score","best_strategy","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","candidate","candidates","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","coin_select_bnb","current_excess","current_weight","deselect","drain_value","drain_waste","drain_weight","effective_target","effective_value","eq","eq","excess","excess_strategies","fee","feerate","finish","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","forward","from","from","from","from","from","from","from","from","from","from","from","from","from","from","fund_outputs","hash","input_count","into","into","into","into","into","into","into","into","into","into","into","into","into_iter","into_iter","is_empty","is_segwit","is_selected","long_term_feerate","long_term_feerate","max_extra_target","min_absolute_fee","min_drain_value","new","new","new","next","opts","partial_cmp","pool","pool_pos","provide","recipient_value","rem_abs","rem_eff","select","select_all","select_until_finished","selected","selected","selected_absolute_value","selected_count","selected_effective_value","selected_indexes","selected_waste","selected_weight","selection","spend_drain_weight","target_feerate","target_value","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","unselected","unselected_indexes","value","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","waste","weight","weight","will_continue"],"q":["bdk_coin_select","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"d":["Bnb represents the current state of the BnB algorithm.","","Determines how we should limit rounds of branch and bound.","Strategy in which we should branch.","CoinSelector selects and deselects from a set of …","","We continue exploring subtrees of this node, starting with …","Closure to decide the branching strategy, alongside a …","","","","Min absolute fee is not met","Min drain value is not met","","","","","We skip both the inclusion and omission branches of this …","We continue exploring ONLY the omission branch of this …","Txin “base” fields include outpoint (32+4) and …","The target fee (given the feerate) is not met","The target is not met","","","","A WeightedValue represents an input candidate for …","Compare the advertised score with the current best. The …","","","Attempt to backtrack to the previously selected node’s …","The weight of the template transaction, including fixed …","","Returns the ExcessStrategy that results in the least waste.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","This is a variation of the Branch and Bound Coin Selection …","Current excess.","Current weight of template tx + selected inputs.","","","","Additional weight if we include the drain (change) output.","This is the effective target value.","Effective value of this input candidate: …","","","","","","Returns feerate in sats/wu.","","","","","","","","","","","","","Continue down this branch and skip the inclusion branch if …","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","The total number of inputs; so we can calculate extra …","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Turns our Bnb state into an iterator.","","","Whether this WeightedValue contains at least one segwit …","","","The feerate","Additional leeway for the target value.","The minimum absolute fee. I.e., needed for RBF.","Minimum value allowed for a drain (change) output.","Creates a new Bnb.","Create a new WeightedValue that represents a single input.","","","","","","","","","","","","","","","","Absolute value sum of all selected inputs.","","Effective value sum of all selected inputs.","","Waste sum of all selected inputs.","Weight sum of all selected inputs.","","Weight of spending the drain (change) output in the future.","The feerate we should try and achieve in sats per weight …","The value we need to select. If the value is None, then …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Total value of the UTXO(s) that this WeightedValue …","","","","","","","","","","","","","","Total weight of including this/these UTXO(s). txin fields: …","",""],"i":[0,0,0,0,0,0,34,0,22,0,0,11,11,22,0,0,0,34,34,0,11,11,12,12,12,0,2,4,5,2,9,2,5,34,2,26,22,8,9,4,10,11,5,12,13,34,2,26,22,8,9,4,10,11,5,12,13,4,4,8,9,4,10,11,5,12,13,8,9,4,10,11,5,12,13,12,0,4,4,4,13,9,9,4,8,11,12,5,5,13,13,4,8,9,4,10,10,11,11,5,12,12,13,2,34,2,26,22,22,22,8,9,4,10,11,5,12,13,9,12,8,34,2,26,22,8,9,4,10,11,5,12,13,2,26,4,8,4,9,9,9,9,9,2,8,4,26,4,12,2,2,10,13,2,2,4,4,4,4,5,4,4,4,4,4,4,2,9,9,9,8,9,4,10,11,5,12,13,10,11,12,34,2,26,22,8,9,4,10,11,5,12,13,34,2,26,22,8,9,4,10,11,5,12,13,34,2,26,22,8,9,4,10,11,5,12,13,4,4,8,34,2,26,22,8,9,4,10,11,5,12,13,13,8,13,34],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[[2,[1]],1],3],[4,3],[5,6],[[[2,[1]]],3],0,0,[5],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[4,7],8],0,[8,8],[9,9],[4,4],[10,10],[11,11],[5,5],[12,12],[13,13],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[12,12],14],[4,[[15,[4]]]],[4,16],[4,17],[[4,7],3],0,[9,16],0,[4,16],[[8,18],16],[[11,11],3],[[12,12],3],0,0,0,[13,18],[4,[[19,[5,10]]]],[[8,20],21],[[9,20],21],[[4,20],21],[[10,20],21],[[10,20],21],[[11,20],21],[[11,20],21],[[5,20],21],[[12,20],21],[[12,20],21],[[13,20],21],[[[2,[1]],3]],[[]],[[]],[[]],[[]],[7,22],[23,22],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[24,17],9],[12],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[[2,[1]],25],[[26,[1]]]],[[]],[4,3],0,[[4,7],3],[9,18],0,0,0,0,[[4,27,1],[[2,[1]]]],[[28,17,3],8],[[27,9],4],[[[26,[[0,[1,29,30]]]]],15],0,[[12,12],[[15,[14]]]],0,0,[31],0,0,0,[[4,7],3],[4],[4,[[19,[5,10]]]],[4,6],0,[4,28],[4,7],[4,16],[4,6],[4,16],[4,17],0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],32],[[],32],[[],32],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],19],[[],33],[[],33],[[],33],[[],33],[[],33],[[],33],[[],33],[[],33],[[],33],[[],33],[[],33],[[],33],[4,6],[4,6],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,[34,3]],"p":[[8,"Ord"],[3,"Bnb"],[15,"bool"],[3,"CoinSelector"],[3,"Selection"],[8,"Iterator"],[15,"usize"],[3,"WeightedValue"],[3,"CoinSelectorOpt"],[3,"SelectionError"],[4,"SelectionConstraint"],[4,"ExcessStrategyKind"],[3,"ExcessStrategy"],[4,"Ordering"],[4,"Option"],[15,"i64"],[15,"u32"],[15,"f32"],[4,"Result"],[3,"Formatter"],[6,"Result"],[4,"BnbLimit"],[3,"Duration"],[3,"TxOut"],[6,"DecideStrategy"],[3,"BnbIter"],[3,"Vec"],[15,"u64"],[8,"Copy"],[8,"Display"],[3,"Demand"],[3,"String"],[3,"TypeId"],[4,"BranchStrategy"]]},\ -"bdk_electrum":{"doc":"This crate is used for updating structures of the bdk_chain…","t":[8,3,11,2,11,11,12,11,2,11,10,11,11,11,12,11,10,11,11,11,11,11],"n":["ElectrumExt","ElectrumUpdate","as_ref","bdk_chain","borrow","borrow_mut","chain_update","default","electrum_client","from","get_tip","into","into_confirmation_time_update","into_keychain_scan","last_active_indices","missing_full_txs","scan","scan_without_keychain","try_from","try_into","type_id","vzip"],"q":["bdk_electrum","","","","","","","","","","","","","","","","","","","","",""],"d":["Trait to extend electrum_client::Client functionality.","The result of ElectrumExt::scan.","","","","","The internal SparseChain update.","","","Returns the argument unchanged.","Fetch the latest block height.","Calls U::from(self).","Creates ElectrumUpdate<K, ConfirmationTime> from …","Transform the ElectrumUpdate into a KeychainScan, which …","The last keychain script pubkey indices, which had …","Return a list of missing full transactions that are …","Scan the blockchain (via electrum) for the data specified. …","Convenience method to call scan without requiring a …","","","",""],"i":[0,0,1,0,1,1,1,1,0,1,21,1,1,1,1,1,21,21,1,1,1,1],"f":[0,0,[1,2],0,[[]],[[]],0,[[],1],0,[[]],[[],[[4,[3]]]],[[]],[[[1,[[0,[5,6,7]],8]],9],[[4,[[1,[[0,[5,6,7]],10]],3]]]],[[[1,[[0,[5,6,7]],11]],[13,[12]]],[[4,[[14,[[0,[5,6,7]],11]],[15,[11]]]]]],0,[[[1,[[0,[5,6,7]],11]]],[[13,[16]]]],[[17,[17,[[0,[5,6]],18]],18,18,19,19],[[4,[[1,[[0,[5,6]],8]],3]]]],[[17,18,18,18,19],[[4,[2,3]]]],[[],4],[[],4],[[],20],[[]]],"p":[[3,"ElectrumUpdate"],[3,"SparseChain"],[4,"Error"],[4,"Result"],[8,"Ord"],[8,"Clone"],[8,"Debug"],[4,"TxHeight"],[3,"Client"],[4,"ConfirmationTime"],[8,"ChainPosition"],[3,"Transaction"],[3,"Vec"],[3,"KeychainScan"],[4,"NewError"],[3,"Txid"],[3,"BTreeMap"],[8,"IntoIterator"],[15,"usize"],[3,"TypeId"],[8,"ElectrumExt"]]},\ -"bdk_esplora":{"doc":"BDK Esplora","t":[8,8,2,10,10,11,11,11,11],"n":["EsploraAsyncExt","EsploraExt","esplora_client","scan","scan","scan_without_keychain","scan_without_keychain","scan_without_keychain","scan_without_keychain"],"q":["bdk_esplora","","","","","","","",""],"d":["Trait to extend esplora_client::AsyncClient functionality.","Trait to extend esplora_client::BlockingClient …","","Scan the blockchain (via esplora) for the data specified …","Scan the blockchain (via esplora) for the data specified …","Convenience method to call scan without requiring a …","Convenience method to call scan without requiring a …","Convenience method to call scan without requiring a …","Convenience method to call scan without requiring a …"],"i":[0,0,0,15,16,15,15,16,16],"f":[0,0,0,[[1,[1,[[0,[2,3]],4]],4,4,5,5],[[9,[[7,[[0,[2,3]],6]],8]]]],[[1,[1,[[0,[4,10]]]],[0,[4,10]],[0,[4,10]],5,5],[[13,[[12,[11]]]]]],[[1,4,4,4,5],[[9,[[14,[6]],8]]]],[[1,4,4,4,5],[[9,[[14,[6]],8]]]],[[1,[0,[4,10]],[0,[4,10]],[0,[4,10]],5],[[13,[[12,[11]]]]]],[[1,[0,[4,10]],[0,[4,10]],[0,[4,10]],5],[[13,[[12,[11]]]]]]],"p":[[3,"BTreeMap"],[8,"Ord"],[8,"Clone"],[8,"IntoIterator"],[15,"usize"],[4,"ConfirmationTime"],[3,"KeychainScan"],[4,"Error"],[4,"Result"],[8,"Send"],[8,"Future"],[3,"Box"],[3,"Pin"],[3,"ChainGraph"],[8,"EsploraExt"],[8,"EsploraAsyncExt"]]},\ -"bdk_esplora_wallet_example":{"doc":"","t":[17,17,17,5],"n":["PARALLEL_REQUESTS","SEND_AMOUNT","STOP_GAP","main"],"q":["bdk_esplora_wallet_example","","",""],"d":["","","",""],"i":[0,0,0,0],"f":[0,0,0,[[],[[3,[[2,[1]]]]]]],"p":[[8,"Error"],[3,"Box"],[4,"Result"]]},\ -"bdk_file_store":{"doc":"BDK File Store","t":[13,3,4,13,13,13,4,3,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12],"n":["Bincode","EntryIter","FileError","InvalidMagicBytes","Io","Io","IterError","KeychainStore","Store","aggregate_changeset","aggregate_changesets","append_changeset","append_changeset","append_changeset","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","into","into","into","into","into","into_iter","iter_changesets","iter_changesets","load_from_persistence","load_into_keychain_tracker","load_into_keychain_tracker","new","new","new","new_from_path","new_from_path","next","provide","provide","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":["bdk_file_store","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_file_store::FileError",""],"d":["Failure to decode data from the file.","Iterator over entries in a file store.","Error that occurs due to problems encountered with the …","Magic bytes do not match what is expected.","Failure to read from the file.","IO error, this may mean that the file is too short.","Error type for EntryIter.","Persists an append only list of KeychainChangeSet<K,P> to …","Persists an append-only list of changesets (C) to a single …","Loads all the changesets that have been stored as one …","Loads all the changesets that have been stored as one …","","Append a new changeset to the file and truncate the file …","Append a new changeset to the file and truncate the file …","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","Iterates over the stored changeset from first to last, …","Iterates over the stored changeset from first to last, …","","","Reads and applies all the changesets stored sequentially …","","Creates a new store from a File.","Creates a new store from a File.","Creates or loads a store from db_path. If no file exists …","Creates or loads a store from db_path.","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"i":[6,0,0,10,6,10,0,0,0,1,2,1,1,2,11,6,1,2,10,11,6,1,2,10,6,6,1,2,10,10,11,6,6,1,2,10,10,11,6,1,2,10,11,1,2,2,1,1,11,1,2,1,2,11,6,10,6,10,11,6,1,2,10,11,6,1,2,10,11,6,1,2,10,11,6,1,2,10,2,21,21],"f":[0,0,0,0,0,0,0,0,0,[1],[2],[[1,3],4],[[1,3],[[4,[5]]]],[2,[[4,[5]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[6,7],8],[[6,7],8],[[[1,[9,9]],7],8],[[[2,[9]],7],8],[[10,7],8],[[10,7],8],[[]],[5,6],[[]],[[]],[[]],[[]],[5,10],[[]],[[]],[[]],[[]],[[]],[[]],[1,[[4,[[11,[3]],5]]]],[2,11],[2,4],[[1,12],4],[[1,12],[[4,[6]]]],[[13,14],11],[14,[[4,[1,0]]]],[14,[[4,[2,10]]]],[[[16,[15]]],[[4,[1,0]]]],[[],[[4,[2,10]]]],[11,17],[18],[18],[[],19],[[],19],[[],4],[[],4],[[],4],[[],4],[[],4],[[],4],[[],4],[[],4],[[],4],[[],4],[[],20],[[],20],[[],20],[[],20],[[],20],[[]],[[]],[[]],[[]],[[]],[2,4],0,0],"p":[[3,"KeychainStore"],[3,"Store"],[3,"KeychainChangeSet"],[4,"Result"],[3,"Error"],[4,"IterError"],[3,"Formatter"],[6,"Result"],[8,"Debug"],[4,"FileError"],[3,"EntryIter"],[3,"KeychainTracker"],[15,"u64"],[3,"File"],[3,"Path"],[8,"AsRef"],[4,"Option"],[3,"Demand"],[3,"String"],[3,"TypeId"],[13,"InvalidMagicBytes"]]},\ +"bdk_electrum":{"doc":"This crate is used for updating structures of the bdk_chain…","t":[8,3,2,11,11,12,11,11,11,2,11,11,11,11,10,12,11,12,11,10,11,11,11,11,11,11,11],"n":["ElectrumExt","ElectrumUpdate","bdk_chain","borrow","borrow_mut","chain_update","clone","clone_into","default","electrum_client","finalize","finalize_as_confirmation_time","fmt","from","get_tip","graph_update","into","keychain_update","missing_full_txs","scan","scan_without_keychain","scan_without_keychain","to_owned","try_from","try_into","type_id","vzip"],"q":["bdk_electrum","","","","","","","","","","","","","","","","","","","","","","","","","",""],"d":["","","","","","","","","","","","Finalizes the ElectrumUpdate with new_txs and anchors of …","","Returns the argument unchanged.","","","Calls U::from(self).","","","","","","","","","",""],"i":[0,0,0,2,2,2,2,2,2,0,2,2,2,2,23,2,2,2,2,23,23,23,2,2,2,2,2],"f":[0,0,0,[[]],[[]],0,[[[2,[1,1]]],[[2,[1,1]]]],[[]],[[],2],0,[[[2,[3]],4,[6,[5]],[8,[7]]],[[11,[[9,[3]],10]]]],[[[2,[12]],4,[6,[5]],[8,[7]]],[[11,[[9,[13]],10]]]],[[[2,[14,14]],15],16],[[]],[[],[[11,[10]]]],0,[[]],0,[[[2,[3]],17],[[8,[7]]]],[[18,[18,[[0,[19,1]],20]],20,20,21,21],[[11,[[2,[[0,[19,1]]]],10]]]],[[18,20,20,20,21],[[11,[2,10]]]],[[18,20,20,20,21],[[11,[2,10]]]],[[]],[[],11],[[],11],[[],22],[[]]],"p":[[8,"Clone"],[3,"ElectrumUpdate"],[8,"Anchor"],[3,"Client"],[15,"u64"],[4,"Option"],[3,"Txid"],[3,"Vec"],[3,"LocalUpdate"],[4,"Error"],[4,"Result"],[3,"ConfirmationHeightAnchor"],[3,"ConfirmationTimeAnchor"],[8,"Debug"],[3,"Formatter"],[6,"Result"],[3,"TxGraph"],[3,"BTreeMap"],[8,"Ord"],[8,"IntoIterator"],[15,"usize"],[3,"TypeId"],[8,"ElectrumExt"]]},\ +"bdk_esplora":{"doc":"BDK Esplora","t":[8,8,2,10,10,11,11,11,11],"n":["EsploraAsyncExt","EsploraExt","esplora_client","scan","scan","scan_without_keychain","scan_without_keychain","scan_without_keychain","scan_without_keychain"],"q":["bdk_esplora","","","","","","","",""],"d":["Trait to extend esplora_client::AsyncClient functionality.","Trait to extend esplora_client::BlockingClient …","","Scan the blockchain (via esplora) for the data specified …","Scan the blockchain (via esplora) for the data specified …","Convenience method to call scan without requiring a …","Convenience method to call scan without requiring a …","Convenience method to call scan without requiring a …","Convenience method to call scan without requiring a …"],"i":[0,0,0,14,15,14,14,15,15],"f":[0,0,0,[[1,[1,[[0,[2,3]],4]],4,4,5,5],[[9,[[7,[[0,[2,3]],6]],8]]]],[[1,[1,[[0,[4,10]]]],[0,[4,10]],[0,[4,10]],5,5],[[13,[[12,[11]]]]]],[[1,4,4,4,5],[[9,[[7,[6]],8]]]],[[1,4,4,4,5],[[9,[[7,[6]],8]]]],[[1,[0,[4,10]],[0,[4,10]],[0,[4,10]],5],[[13,[[12,[11]]]]]],[[1,[0,[4,10]],[0,[4,10]],[0,[4,10]],5],[[13,[[12,[11]]]]]]],"p":[[3,"BTreeMap"],[8,"Ord"],[8,"Clone"],[8,"IntoIterator"],[15,"usize"],[3,"ConfirmationTimeAnchor"],[3,"LocalUpdate"],[4,"Error"],[4,"Result"],[8,"Send"],[8,"Future"],[3,"Box"],[3,"Pin"],[8,"EsploraExt"],[8,"EsploraAsyncExt"]]},\ +"bdk_file_store":{"doc":"BDK File Store","t":[13,3,4,13,13,13,4,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12],"n":["Bincode","EntryIter","FileError","InvalidMagicBytes","Io","Io","IterError","Store","aggregate_changesets","append_changeset","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","into","into","into","into","into_iter","iter_changesets","load_from_persistence","new","new","new_from_path","next","provide","provide","to_string","to_string","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","write_changes","expected","got"],"q":["bdk_file_store","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_file_store::FileError",""],"d":["Failure to decode data from the file.","Iterator over entries in a file store.","Error that occurs due to problems encountered with the …","Magic bytes do not match what is expected.","Failure to read from the file.","IO error, this may mean that the file is too short.","Error type for EntryIter.","Persists an append-only list of changesets (C) to a single …","Loads all the changesets that have been stored as one …","Append a new changeset to the file and truncate the file …","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","Iterates over the stored changeset from first to last, …","","","Creates a new store from a File.","Creates or loads a store from db_path.","","","","","","","","","","","","","","","","","","","","","","","",""],"i":[4,0,0,8,4,8,0,0,1,1,9,4,1,8,9,4,1,8,4,4,1,8,8,9,4,4,1,8,8,9,4,1,8,9,1,1,9,1,1,9,4,8,4,8,9,4,1,8,9,4,1,8,9,4,1,8,9,4,1,8,1,16,16],"f":[0,0,0,0,0,0,0,0,[1],[1,[[3,[2]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[4,5],6],[[4,5],6],[[[1,[7]],5],6],[[8,5],6],[[8,5],6],[[]],[[]],[2,4],[[]],[2,8],[[]],[[]],[[]],[[]],[[]],[[]],[1,9],[1,3],[[10,11],9],[11,[[3,[1,8]]]],[[],[[3,[1,8]]]],[9,12],[13],[13],[[],14],[[],14],[[],3],[[],3],[[],3],[[],3],[[],3],[[],3],[[],3],[[],3],[[],15],[[],15],[[],15],[[],15],[[]],[[]],[[]],[[]],[1,3],0,0],"p":[[3,"Store"],[3,"Error"],[4,"Result"],[4,"IterError"],[3,"Formatter"],[6,"Result"],[8,"Debug"],[4,"FileError"],[3,"EntryIter"],[15,"u64"],[3,"File"],[4,"Option"],[3,"Demand"],[3,"String"],[3,"TypeId"],[13,"InvalidMagicBytes"]]},\ "bdk_tmp_plan":{"doc":"A spending plan or plan for short is a representation of a …","t":[3,8,13,13,13,13,3,3,4,4,3,3,13,13,4,13,13,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,11,11,11,11,11,11,11,11,12,12,11,5,11,11,11,11,11,12,12,12,12,12,12,12,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12],"n":["Assets","CanDerive","Complete","DerivationError","Incomplete","Legacy","Plan","PlanKey","PlanState","RequiredSignatures","Requirements","SatisfactionMaterial","Segwitv0","SigHashError","SigningError","TapKey","TapScript","asset_key","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","can_derive","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","default","default","default","default","derivation_hint","descriptor_key","ecdsa_sigs","expected_weight","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","hash160","hash160_images","hash160_preimages","hash256","hash256_images","hash256_preimages","into","into","into","into","into","into","into","into","keys","max_locktime","min_version","plan_satisfaction","provide","required_locktime","required_sequence","requirements","requires_hash_preimages","ripemd160","ripemd160_images","ripemd160_preimages","schnorr_sigs","sha256","sha256_images","sha256_preimages","sign_with_keymap","signatures","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","try_complete","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","txo_age","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","witness_version","final_script_sig","final_script_witness","keys","keys","leaf_hash","merkle_root","plan_key","plan_keys"],"q":["bdk_tmp_plan","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","bdk_tmp_plan::PlanState","","bdk_tmp_plan::RequiredSignatures","","","","",""],"d":["","","The plan is complete","","","Legacy ECDSA signatures are required","A plan represents a particular spending path for a …","A plan key contains the asset key originally provided …","The returned value from Plan::try_complete.","The signatures required to complete the plan","Signatures and hash pre-images that must be provided to …","Signatures and hash pre-images that can be used to …","Segwitv0 ECDSA signatures are required","","","A Taproot key spend signature is required","Taproot script path signatures are required","The key the planner will sign with","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","A hint from how to get from the asset key to the concrete …","The key that was in the descriptor that we are satisfying …","ECDSA signatures under their keys","The expected satisfaction weight for the plan if it is …","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","required hash160 pre-images","hash160 pre-images under their images","","required hash256 pre-images","hash256 pre-images under their images","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","The minmum required transaction version required on the …","","","The minimum required locktime height or time on the …","The minimum required sequence (height or time) on the …","","Whether any hash pre-images are required in the plan","","required ripemd160 pre-images","ripemd160 pre-images under their images","Schnorr signautres under their keys","","required sha256 pre-images","SHA256 pre-images under their images","","required signatures","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Witness version for the plan","The script sig that should be set on the input","The witness that should be set on the input","","","The leaf hash of the script being used","The merkle root of the taproot output","the internal key","The keys in the script that require signatures"],"i":[0,0,33,7,33,6,0,0,0,0,0,0,6,7,0,6,6,8,33,5,6,7,8,9,10,11,33,5,6,7,8,9,10,11,36,5,6,7,8,9,10,11,5,6,7,8,9,10,11,5,6,10,11,8,8,10,9,5,6,7,7,8,9,10,11,33,5,6,7,7,7,8,9,10,11,11,5,10,11,5,10,33,5,6,7,8,9,10,11,11,11,9,0,7,9,9,9,5,11,5,10,10,11,5,10,6,5,5,6,7,8,9,10,11,7,9,33,5,6,7,8,9,10,11,33,5,6,7,8,9,10,11,11,33,5,6,7,8,9,10,11,33,5,6,7,8,9,10,11,9,37,37,38,39,40,41,41,40],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[1,[[3,[2]]]],[[[5,[4]]],[[5,[4]]]],[[[6,[4]]],[[6,[4]]]],[7,7],[[[8,[4]]],[[8,[4]]]],[[[9,[4]]],[[9,[4]]]],[10,10],[[[11,[4]]],[[11,[4]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],5],[[],6],[[],10],[[],11],0,0,0,[9,12],[[[5,[13]],14],15],[[[6,[13]],14],15],[[7,14],15],[[7,14],15],[[[8,[13]],14],15],[[[9,[13]],14],15],[[10,14],15],[[[11,[13]],14],15],[[]],[[]],[[]],[16,7],[[]],[17,7],[[]],[[]],[[]],[[]],0,0,0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,[9,[[3,[18]]]],[[19,11],[[3,[9]]]],[20],[9,[[3,[21]]]],[9,[[3,[22]]]],[9,5],[5,23],0,0,0,0,0,0,0,[[[6,[24]],12,25,26,[3,[27]],[3,[28]],29,10,30],[[31,[23,7]]]],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],32],[[9,10],33],[[],31],[[],31],[[],31],[[],31],[[],31],[[],31],[[],31],[[],31],[[],31],[[],31],[[],31],[[],31],[[],31],[[],31],[[],31],[[],31],0,[[],34],[[],34],[[],34],[[],34],[[],34],[[],34],[[],34],[[],34],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[9,[[3,[35]]]],0,0,0,0,0,0,0,0],"p":[[3,"DefiniteDescriptorKey"],[3,"DerivationPath"],[4,"Option"],[8,"Clone"],[3,"Requirements"],[4,"RequiredSignatures"],[4,"SigningError"],[3,"PlanKey"],[3,"Plan"],[3,"SatisfactionMaterial"],[3,"Assets"],[15,"usize"],[8,"Debug"],[3,"Formatter"],[6,"Result"],[4,"Error"],[4,"Error"],[15,"u32"],[4,"Descriptor"],[3,"Demand"],[4,"LockTime"],[3,"Sequence"],[15,"bool"],[4,"DescriptorPublicKey"],[6,"KeyMap"],[4,"Prevouts"],[4,"SchnorrSighashType"],[4,"EcdsaSighashType"],[3,"SighashCache"],[3,"Secp256k1"],[4,"Result"],[3,"String"],[4,"PlanState"],[3,"TypeId"],[4,"WitnessVersion"],[8,"CanDerive"],[13,"Complete"],[13,"Legacy"],[13,"Segwitv0"],[13,"TapScript"],[13,"TapKey"]]},\ -"keychain_tracker_electrum_example":{"doc":"","t":[4,13,3,13,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12],"n":["ElectrumCommands","Scan","ScanOptions","Sync","augment_args","augment_args_for_update","augment_subcommands","augment_subcommands_for_update","batch_size","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","eq","fmt","fmt","from","from","from_arg_matches","from_arg_matches","from_arg_matches_mut","from_arg_matches_mut","has_subcommand","into","into","into_app","into_app_for_update","main","to_owned","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches_mut","update_from_arg_matches_mut","vzip","vzip","all_spks","scan_options","scan_options","stop_gap","unconfirmed","unused_spks","utxos"],"q":["keychain_tracker_electrum_example","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","keychain_tracker_electrum_example::ElectrumCommands","","","","","",""],"d":["","Scans the addresses in the wallet using the esplora API.","","Scans particular addresses using the esplora API.","","","","","Set batch size for each script_history call to electrum …","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","Scan every address that you have derived.","","","When a gap this large has been found for a keychain, it …","Scan unconfirmed transactions for updates.","Scan all the unused addresses.","Scan unspent outpoints for spends or changes to …"],"i":[0,2,0,2,3,3,2,2,3,2,3,2,3,2,3,2,3,3,2,3,2,3,2,3,2,3,2,2,3,3,3,0,2,3,2,3,2,3,2,3,2,3,2,3,2,3,13,14,13,14,13,13,13],"f":[0,0,0,0,[1,1],[1,1],[1,1],[1,1],0,[[]],[[]],[[]],[[]],[2,2],[3,3],[[]],[[]],[[3,3],4],[[2,5],6],[[3,5],6],[[]],[[]],[7,[[9,[2,8]]]],[7,[[9,[3,8]]]],[7,[[9,[2,8]]]],[7,[[9,[3,8]]]],[10,4],[[]],[[]],[[],1],[[],1],[[],11],[[]],[[]],[[],9],[[],9],[[],9],[[],9],[[],12],[[],12],[[2,7],[[9,[8]]]],[[3,7],[[9,[8]]]],[[2,7],[[9,[8]]]],[[3,7],[[9,[8]]]],[[]],[[]],0,0,0,0,0,0,0],"p":[[6,"Command"],[4,"ElectrumCommands"],[3,"ScanOptions"],[15,"bool"],[3,"Formatter"],[6,"Result"],[3,"ArgMatches"],[3,"Error"],[4,"Result"],[15,"str"],[6,"Result"],[3,"TypeId"],[13,"Sync"],[13,"Scan"]]},\ -"keychain_tracker_esplora_example":{"doc":"","t":[4,13,3,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12],"n":["EsploraCommands","Scan","ScanOptions","Sync","augment_args","augment_args_for_update","augment_subcommands","augment_subcommands_for_update","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","eq","fmt","fmt","from","from","from_arg_matches","from_arg_matches","from_arg_matches_mut","from_arg_matches_mut","has_subcommand","into","into","into_app","into_app_for_update","main","parallel_requests","to_owned","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches_mut","update_from_arg_matches_mut","vzip","vzip","all_spks","scan_options","scan_options","stop_gap","unconfirmed","unused_spks","utxos"],"q":["keychain_tracker_esplora_example","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","keychain_tracker_esplora_example::EsploraCommands","","","","","",""],"d":["","Scans the addresses in the wallet using the esplora API.","","Scans particular addresses using esplora API.","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","Scan every address that you have derived.","","","When a gap this large has been found for a keychain, it …","Scan unconfirmed transactions for updates.","Scan all the unused addresses.","Scan unspent outpoints for spends or changes to …"],"i":[0,2,0,2,3,3,2,2,2,3,2,3,2,3,2,3,3,2,3,2,3,2,3,2,3,2,2,3,3,3,0,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,13,14,13,14,13,13,13],"f":[0,0,0,0,[1,1],[1,1],[1,1],[1,1],[[]],[[]],[[]],[[]],[2,2],[3,3],[[]],[[]],[[3,3],4],[[2,5],6],[[3,5],6],[[]],[[]],[7,[[9,[2,8]]]],[7,[[9,[3,8]]]],[7,[[9,[2,8]]]],[7,[[9,[3,8]]]],[10,4],[[]],[[]],[[],1],[[],1],[[],11],0,[[]],[[]],[[],9],[[],9],[[],9],[[],9],[[],12],[[],12],[[2,7],[[9,[8]]]],[[3,7],[[9,[8]]]],[[2,7],[[9,[8]]]],[[3,7],[[9,[8]]]],[[]],[[]],0,0,0,0,0,0,0],"p":[[6,"Command"],[4,"EsploraCommands"],[3,"ScanOptions"],[15,"bool"],[3,"Formatter"],[6,"Result"],[3,"ArgMatches"],[3,"Error"],[4,"Result"],[15,"str"],[6,"Result"],[3,"TypeId"],[13,"Sync"],[13,"Scan"]]},\ -"keychain_tracker_example_cli":{"doc":"","t":[13,4,3,3,13,13,13,4,4,13,13,13,4,13,13,13,13,13,13,13,13,13,13,4,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,2,11,11,11,11,11,11,11,11,11,11,11,12,12,5,12,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,11,11,11,5,11,11,11,11,11,11,11,11,11,12,11,5,5,5,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12],"n":["Address","AddressCmd","AddrsOutput","Args","Balance","BranchAndBound","ChainSpecific","CoinSelectionAlgo","Commands","External","Index","Internal","Keychain","LargestFirst","List","List","New","NewestFirst","Next","OldestFirst","Send","SmallestFirst","TxOut","TxOutCmd","augment_args","augment_args_for_update","augment_subcommands","augment_subcommands","augment_subcommands","augment_subcommands_for_update","augment_subcommands_for_update","augment_subcommands_for_update","bdk_file_store","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","change_descriptor","clap","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","command","cp_limit","create_tx","db_path","default","descriptor","deserialize","deserialize","eq","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from_arg_matches","from_arg_matches","from_arg_matches","from_arg_matches","from_arg_matches_mut","from_arg_matches_mut","from_arg_matches_mut","from_arg_matches_mut","from_str","handle_commands","has_subcommand","has_subcommand","has_subcommand","init","into","into","into","into","into","into","into","into_app","into_app_for_update","network","partial_cmp","planned_utxos","run_address_cmd","run_balance_cmd","run_txo_cmd","serialize","serialize","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches_mut","update_from_arg_matches_mut","update_from_arg_matches_mut","update_from_arg_matches_mut","vzip","vzip","vzip","vzip","vzip","vzip","vzip","change","addr_cmd","address","coin_select","txout_cmd","value","confirmed","spent","unconfirmed","unspent"],"q":["keychain_tracker_example_cli","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","keychain_tracker_example_cli::AddressCmd","keychain_tracker_example_cli::Commands","","","","","keychain_tracker_example_cli::TxOutCmd","","",""],"d":["Address generation and inspection.","","A structure defining the output of an AddressCmd` …","","Get the wallet balance.","","","","","","","","","","List all addresses","","Get a new address regardless of the existing unused …","","Get the next unused address.","","Send coins to an address.","","TxOut related commands.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","","","","","","","","","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Return only confirmed outputs.","Return only spent outputs.","Return only unconfirmed outputs.","Return only unspent outputs."],"i":[4,0,0,0,4,5,4,0,0,8,6,8,0,5,6,7,6,5,6,5,4,5,4,0,22,22,4,6,7,4,6,7,0,22,4,5,6,7,8,16,22,4,5,6,7,8,16,22,0,4,5,6,7,8,4,5,6,7,8,8,22,22,0,22,5,22,8,16,8,8,4,5,5,6,7,8,8,22,4,5,6,7,8,16,22,4,6,7,22,4,6,7,5,0,4,6,7,0,22,4,5,6,7,8,16,22,22,22,8,0,0,0,0,8,16,4,5,6,7,8,5,8,22,4,5,6,7,8,16,22,4,5,6,7,8,16,22,4,5,6,7,8,16,22,4,6,7,22,4,6,7,22,4,5,6,7,8,16,33,34,35,35,36,35,37,37,37,37],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[1,1],[1,1],[1,1],[1,1],[1,1],[1,1],[1,1],[1,1],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,[[[4,[[0,[2,3]]]]],[[4,[[0,[2,3]]]]]],[5,5],[6,6],[7,7],[8,8],[[]],[[]],[[]],[[]],[[]],[[8,8],9],0,0,[[10,11,5,12,13],14],0,[[],5],0,[[],[[15,[8]]]],[[],[[15,[16]]]],[[8,8],17],[[],17],[[[4,[[0,[18,3]]]],19],20],[[5,19],20],[[5,19],20],[[6,19],20],[[7,19],20],[[8,19],20],[[8,19],20],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[21,[[15,[[22,[3]],23]]]],[21,[[15,[[4,[3]],23]]]],[21,[[15,[6,23]]]],[21,[[15,[7,23]]]],[21,[[15,[[22,[3]],23]]]],[21,[[15,[[4,[3]],23]]]],[21,[[15,[6,23]]]],[21,[[15,[7,23]]]],[24,[[14,[5]]]],[[[4,[3]],25,26,26,27,13],14],[24,17],[24,17],[24,17],[[],14],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],1],[[],1],0,[[8,8],[[28,[9]]]],[[12,29],30],[[26,26,6,27],14],[26],[[7,26,27]],[8,15],[16,15],[[]],[[]],[[]],[[]],[[]],[[],31],[[],31],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[],32],[[[22,[3]],21],[[15,[23]]]],[[[4,[3]],21],[[15,[23]]]],[[6,21],[[15,[23]]]],[[7,21],[[15,[23]]]],[[[22,[3]],21],[[15,[23]]]],[[[4,[3]],21],[[15,[23]]]],[[6,21],[[15,[23]]]],[[7,21],[[15,[23]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0],"p":[[6,"Command"],[8,"Clone"],[8,"Subcommand"],[4,"Commands"],[4,"CoinSelectionAlgo"],[4,"AddressCmd"],[4,"TxOutCmd"],[4,"Keychain"],[4,"Ordering"],[15,"u64"],[3,"Address"],[3,"KeychainTracker"],[3,"HashMap"],[6,"Result"],[4,"Result"],[3,"AddrsOutput"],[15,"bool"],[8,"Debug"],[3,"Formatter"],[6,"Result"],[3,"ArgMatches"],[3,"Args"],[3,"Error"],[15,"str"],[8,"FnOnce"],[3,"Mutex"],[4,"Network"],[4,"Option"],[3,"Assets"],[8,"Iterator"],[3,"String"],[3,"TypeId"],[13,"List"],[13,"Address"],[13,"Send"],[13,"TxOut"],[13,"List"]]},\ -"wallet_electrum_example":{"doc":"","t":[17,17,17,5],"n":["BATCH_SIZE","SEND_AMOUNT","STOP_GAP","main"],"q":["wallet_electrum_example","","",""],"d":["","","",""],"i":[0,0,0,0],"f":[0,0,0,[[],[[3,[[2,[1]]]]]]],"p":[[8,"Error"],[3,"Box"],[4,"Result"]]},\ -"wallet_esplora_async":{"doc":"","t":[17,17,17,5],"n":["PARALLEL_REQUESTS","SEND_AMOUNT","STOP_GAP","main"],"q":["wallet_esplora_async","","",""],"d":["","","",""],"i":[0,0,0,0],"f":[0,0,0,[[],[[3,[[2,[1]]]]]]],"p":[[8,"Error"],[3,"Box"],[4,"Result"]]}\ +"example_cli":{"doc":"","t":[13,4,3,13,13,13,4,4,6,13,13,13,4,6,6,13,13,13,13,13,13,13,13,13,13,4,2,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,12,2,11,11,11,11,11,11,11,11,11,11,11,12,12,5,12,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,11,11,11,5,11,11,11,11,11,11,11,11,12,11,5,5,5,5,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12],"n":["Address","AddressCmd","Args","Balance","BranchAndBound","ChainSpecific","CoinSelectionAlgo","Commands","Database","External","Index","Internal","Keychain","KeychainAdditions","KeychainTxGraph","LargestFirst","List","List","New","NewestFirst","Next","OldestFirst","Send","SmallestFirst","TxOut","TxOutCmd","anyhow","augment_args","augment_args_for_update","augment_subcommands","augment_subcommands","augment_subcommands","augment_subcommands_for_update","augment_subcommands_for_update","augment_subcommands_for_update","bdk_file_store","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","change_descriptor","clap","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","command","cp_limit","create_tx","db_path","default","descriptor","deserialize","eq","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from_arg_matches","from_arg_matches","from_arg_matches","from_arg_matches","from_arg_matches_mut","from_arg_matches_mut","from_arg_matches_mut","from_arg_matches_mut","from_str","handle_commands","has_subcommand","has_subcommand","has_subcommand","init","into","into","into","into","into","into","into_app","into_app_for_update","network","partial_cmp","planned_utxos","run_address_cmd","run_balance_cmd","run_send_cmd","run_txo_cmd","serialize","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches_mut","update_from_arg_matches_mut","update_from_arg_matches_mut","update_from_arg_matches_mut","vzip","vzip","vzip","vzip","vzip","vzip","change","addr_cmd","address","coin_select","txout_cmd","value","confirmed","spent","unconfirmed","unspent"],"q":["example_cli","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","example_cli::AddressCmd","example_cli::Commands","","","","","example_cli::TxOutCmd","","",""],"d":["Address generation and inspection.","","","Get the wallet balance.","","","","","","","","","","","","","List all addresses","","Get a new address regardless of the existing unused …","","Get the next unused address.","","Send coins to an address.","","TxOut related commands.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","","","","","","","","","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Return only confirmed outputs.","Return only spent outputs.","Return only unconfirmed outputs.","Return only unspent outputs."],"i":[4,0,0,4,5,4,0,0,0,8,6,8,0,0,0,5,6,7,6,5,6,5,4,5,4,0,0,21,21,4,6,7,4,6,7,0,21,4,5,6,7,8,21,4,5,6,7,8,21,0,4,5,6,7,8,4,5,6,7,8,8,21,21,0,21,5,21,8,8,8,4,5,5,6,7,8,8,21,4,5,6,7,8,21,4,6,7,21,4,6,7,5,0,4,6,7,0,21,4,5,6,7,8,21,21,21,8,0,0,0,0,0,8,4,5,6,7,8,5,8,21,4,5,6,7,8,21,4,5,6,7,8,21,4,5,6,7,8,21,4,6,7,21,4,6,7,21,4,5,6,7,8,32,33,34,34,35,34,36,36,36,36],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[1,1],[1,1],[1,1],[1,1],[1,1],[1,1],[1,1],[1,1],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,[[[4,[[0,[2,3]]]]],[[4,[[0,[2,3]]]]]],[5,5],[6,6],[7,7],[8,8],[[]],[[]],[[]],[[]],[[]],[[8,8],9],0,0,[[10,11,5,12,13],14],0,[[],5],0,[[],[[15,[8]]]],[[8,8],16],[[],16],[[[4,[[0,[17,3]]]],18],19],[[5,18],19],[[5,18],19],[[6,18],19],[[7,18],19],[[8,18],19],[[8,18],19],[[]],[[]],[[]],[[]],[[]],[[]],[20,[[15,[[21,[3]],22]]]],[20,[[15,[[4,[3]],22]]]],[20,[[15,[6,22]]]],[20,[[15,[7,22]]]],[20,[[15,[[21,[3]],22]]]],[20,[[15,[[4,[3]],22]]]],[20,[[15,[6,22]]]],[20,[[15,[7,22]]]],[23,[[15,[5]]]],[[24,24,24,11,25,26,[4,[3]]],14],[23,16],[23,16],[23,16],[23,14],[[]],[[]],[[]],[[]],[[]],[[]],[[],1],[[],1],0,[[8,8],[[27,[9]]]],[[10,28],[[15,[29]]]],[[10,24,25,6],14],[10,15],[[24,24,11,5,12,13,26],14],[[10,25,7],14],[8,15],[[]],[[]],[[]],[[]],[[]],[[],30],[[],30],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],15],[[],31],[[],31],[[],31],[[],31],[[],31],[[],31],[[[21,[3]],20],[[15,[22]]]],[[[4,[3]],20],[[15,[22]]]],[[6,20],[[15,[22]]]],[[7,20],[[15,[22]]]],[[[21,[3]],20],[[15,[22]]]],[[[4,[3]],20],[[15,[22]]]],[[6,20],[[15,[22]]]],[[7,20],[[15,[22]]]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0],"p":[[6,"Command"],[8,"Clone"],[8,"Subcommand"],[4,"Commands"],[4,"CoinSelectionAlgo"],[4,"AddressCmd"],[4,"TxOutCmd"],[4,"Keychain"],[4,"Ordering"],[6,"KeychainTxGraph"],[3,"HashMap"],[3,"Address"],[15,"u64"],[6,"Result"],[4,"Result"],[15,"bool"],[8,"Debug"],[3,"Formatter"],[6,"Result"],[3,"ArgMatches"],[3,"Args"],[3,"Error"],[15,"str"],[3,"Mutex"],[4,"Network"],[8,"FnOnce"],[4,"Option"],[3,"Assets"],[3,"Vec"],[3,"String"],[3,"TypeId"],[13,"List"],[13,"Address"],[13,"Send"],[13,"TxOut"],[13,"List"]]},\ +"example_electrum":{"doc":"","t":[17,6,17,17,4,13,3,13,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12],"n":["ASSUME_FINAL_DEPTH","ChangeSet","DB_MAGIC","DB_PATH","ElectrumCommands","Scan","ScanOptions","Sync","augment_args","augment_args_for_update","augment_subcommands","augment_subcommands_for_update","batch_size","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","eq","fmt","fmt","from","from","from_arg_matches","from_arg_matches","from_arg_matches_mut","from_arg_matches_mut","has_subcommand","into","into","into_app","into_app_for_update","main","to_owned","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches_mut","update_from_arg_matches_mut","vzip","vzip","all_spks","scan_options","scan_options","stop_gap","unconfirmed","unused_spks","utxos"],"q":["example_electrum","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","example_electrum::ElectrumCommands","","","","","",""],"d":["","","","","","Scans the addresses in the wallet using the electrum API.","","Scans particular addresses using the electrum API.","","","","","Set batch size for each script_history call to electrum …","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","Scan every address that you have derived.","","","When a gap this large has been found for a keychain, it …","Scan unconfirmed transactions for updates.","Scan all the unused addresses.","Scan unspent outpoints for spends or changes to …"],"i":[0,0,0,0,0,2,0,2,3,3,2,2,3,2,3,2,3,2,3,2,3,3,2,3,2,3,2,3,2,3,2,2,3,3,3,0,2,3,2,3,2,3,2,3,2,3,2,3,2,3,13,14,13,14,13,13,13],"f":[0,0,0,0,0,0,0,0,[1,1],[1,1],[1,1],[1,1],0,[[]],[[]],[[]],[[]],[2,2],[3,3],[[]],[[]],[[3,3],4],[[2,5],6],[[3,5],6],[[]],[[]],[7,[[9,[2,8]]]],[7,[[9,[3,8]]]],[7,[[9,[2,8]]]],[7,[[9,[3,8]]]],[10,4],[[]],[[]],[[],1],[[],1],[[],11],[[]],[[]],[[],9],[[],9],[[],9],[[],9],[[],12],[[],12],[[2,7],[[9,[8]]]],[[3,7],[[9,[8]]]],[[2,7],[[9,[8]]]],[[3,7],[[9,[8]]]],[[]],[[]],0,0,0,0,0,0,0],"p":[[6,"Command"],[4,"ElectrumCommands"],[3,"ScanOptions"],[15,"bool"],[3,"Formatter"],[6,"Result"],[3,"ArgMatches"],[3,"Error"],[4,"Result"],[15,"str"],[6,"Result"],[3,"TypeId"],[13,"Sync"],[13,"Scan"]]},\ +"wallet_electrum_example":{"doc":"","t":[17,17,17,17,5],"n":["BATCH_SIZE","DB_MAGIC","SEND_AMOUNT","STOP_GAP","main"],"q":["wallet_electrum_example","","","",""],"d":["","","","",""],"i":[0,0,0,0,0],"f":[0,0,0,0,[[],[[3,[[2,[1]]]]]]],"p":[[8,"Error"],[3,"Box"],[4,"Result"]]},\ +"wallet_esplora":{"doc":"","t":[17,17,17,17,5],"n":["DB_MAGIC","PARALLEL_REQUESTS","SEND_AMOUNT","STOP_GAP","main"],"q":["wallet_esplora","","","",""],"d":["","","","",""],"i":[0,0,0,0,0],"f":[0,0,0,0,[[],[[3,[[2,[1]]]]]]],"p":[[8,"Error"],[3,"Box"],[4,"Result"]]},\ +"wallet_esplora_async":{"doc":"","t":[17,17,17,17,5],"n":["DB_MAGIC","PARALLEL_REQUESTS","SEND_AMOUNT","STOP_GAP","main"],"q":["wallet_esplora_async","","","",""],"d":["","","","",""],"i":[0,0,0,0,0],"f":[0,0,0,0,[[],[[3,[[2,[1]]]]]]],"p":[[8,"Error"],[3,"Box"],[4,"Result"]]}\ }'); if (typeof window !== 'undefined' && window.initSearch) {window.initSearch(searchIndex)}; if (typeof exports !== 'undefined') {exports.searchIndex = searchIndex}; diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/source-files.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/source-files.js index 623685958a..dad14fb8c8 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/source-files.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/source-files.js @@ -1,16 +1,15 @@ var sourcesIndex = JSON.parse('{\ "bdk":["",[["descriptor",[],["checksum.rs","dsl.rs","error.rs","mod.rs","policy.rs","template.rs"]],["keys",[],["mod.rs"]],["psbt",[],["mod.rs"]],["wallet",[],["coin_selection.rs","export.rs","mod.rs","signer.rs","tx_builder.rs","utils.rs"]]],["error.rs","lib.rs","types.rs"]],\ -"bdk_chain":["",[["keychain",[],["persist.rs","tracker.rs","txout_index.rs"]]],["chain_data.rs","chain_graph.rs","chain_oracle.rs","descriptor_ext.rs","example_utils.rs","indexed_tx_graph.rs","keychain.rs","lib.rs","local_chain.rs","persist.rs","sparse_chain.rs","spk_iter.rs","spk_txout_index.rs","tx_data_traits.rs","tx_graph.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","persist.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":["",[],["lib.rs"]],\ +"bdk_electrum":["",[],["electrum_ext.rs","lib.rs"]],\ "bdk_esplora":["",[],["async_ext.rs","blocking_ext.rs","lib.rs"]],\ -"bdk_esplora_wallet_example":["",[],["main.rs"]],\ -"bdk_file_store":["",[],["entry_iter.rs","keychain_store.rs","lib.rs","store.rs"]],\ +"bdk_file_store":["",[],["entry_iter.rs","lib.rs","store.rs"]],\ "bdk_tmp_plan":["",[],["lib.rs","plan_impls.rs","requirements.rs","template.rs"]],\ -"keychain_tracker_electrum_example":["",[],["main.rs"]],\ -"keychain_tracker_esplora_example":["",[],["main.rs"]],\ -"keychain_tracker_example_cli":["",[],["lib.rs"]],\ +"example_cli":["",[],["lib.rs"]],\ +"example_electrum":["",[],["main.rs"]],\ "wallet_electrum_example":["",[],["main.rs"]],\ +"wallet_esplora":["",[],["main.rs"]],\ "wallet_esplora_async":["",[],["main.rs"]]\ }'); createSourceSidebar(); diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/lib.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/lib.rs.html index 21e2f1645d..769a65431d 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/lib.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/lib.rs.html @@ -44,8 +44,12 @@ 44 45 46 +47 +48
    #![doc = include_str!("../README.md")]
     #![no_std]
    +#![warn(missing_docs)]
    +
     #[cfg(feature = "std")]
     #[macro_use]
     extern crate std;
    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/types.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/types.rs.html
    index b5df7a01f9..bc8aa909a3 100644
    --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/types.rs.html
    +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/types.rs.html
    @@ -361,9 +361,9 @@
     /// Types of keychains
     #[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)]
     pub enum KeychainKind {
    -    /// External
    +    /// External keychain, used for deriving recipient addresses.
         External = 0,
    -    /// Internal, usually used for change outputs
    +    /// Internal keychain, used for deriving change addresses.
         Internal = 1,
     }
     
    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/coin_selection.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/coin_selection.rs.html
    index e42b2e2647..3ceacebed0 100644
    --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/coin_selection.rs.html
    +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/coin_selection.rs.html
    @@ -1435,6 +1435,14 @@
     1435
     1436
     1437
    +1438
    +1439
    +1440
    +1441
    +1442
    +1443
    +1444
    +1445
     
    // Bitcoin Dev Kit
     // Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
     //
    @@ -2159,9 +2167,13 @@
     
         fn get_test_utxos() -> Vec<WeightedUtxo> {
             vec![
    -            utxo(100_000, 0, ConfirmationTime::Unconfirmed),
    -            utxo(FEE_AMOUNT - 40, 1, ConfirmationTime::Unconfirmed),
    -            utxo(200_000, 2, ConfirmationTime::Unconfirmed),
    +            utxo(100_000, 0, ConfirmationTime::Unconfirmed { last_seen: 0 }),
    +            utxo(
    +                FEE_AMOUNT - 40,
    +                1,
    +                ConfirmationTime::Unconfirmed { last_seen: 0 },
    +            ),
    +            utxo(200_000, 2, ConfirmationTime::Unconfirmed { last_seen: 0 }),
             ]
         }
     
    @@ -2217,7 +2229,7 @@
                                 time: rng.next_u64(),
                             }
                         } else {
    -                        ConfirmationTime::Unconfirmed
    +                        ConfirmationTime::Unconfirmed { last_seen: 0 }
                         },
                     }),
                 });
    @@ -2240,7 +2252,7 @@
                     keychain: KeychainKind::External,
                     is_spent: false,
                     derivation_index: 42,
    -                confirmation_time: ConfirmationTime::Unconfirmed,
    +                confirmation_time: ConfirmationTime::Unconfirmed { last_seen: 0 },
                 }),
             };
             vec![utxo; utxos_number]
    @@ -2528,7 +2540,11 @@
     
             let required = vec![utxos[0].clone()];
             let mut optional = utxos[1..].to_vec();
    -        optional.push(utxo(500_000, 3, ConfirmationTime::Unconfirmed));
    +        optional.push(utxo(
    +            500_000,
    +            3,
    +            ConfirmationTime::Unconfirmed { last_seen: 0 },
    +        ));
     
             // Defensive assertions, for sanity and in case someone changes the test utxos vector.
             let amount: u64 = required.iter().map(|u| u.utxo.txout().value).sum();
    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/export.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/export.rs.html
    index 85a8322d97..5686a8d80f 100644
    --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/export.rs.html
    +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/export.rs.html
    @@ -338,6 +338,7 @@
     338
     339
     340
    +341
     
    // Bitcoin Dev Kit
     // Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
     //
    @@ -396,7 +397,6 @@
     use core::str::FromStr;
     
     use alloc::string::{String, ToString};
    -use bdk_chain::sparse_chain::ChainPosition;
     use serde::{Deserialize, Serialize};
     
     use miniscript::descriptor::{ShInner, WshInner};
    @@ -470,8 +470,10 @@
                 wallet
                     .transactions()
                     .next()
    -                .and_then(|(pos, _)| pos.height().into())
    -                .unwrap_or(0)
    +                .map_or(0, |canonical_tx| match canonical_tx.observed_as {
    +                    bdk_chain::ChainPosition::Confirmed(a) => a.confirmation_height,
    +                    bdk_chain::ChainPosition::Unconfirmed(_) => 0,
    +                })
             } else {
                 0
             };
    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/mod.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/mod.rs.html
    index 1da6367b06..378edc683d 100644
    --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/mod.rs.html
    +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/mod.rs.html
    @@ -1801,6 +1801,108 @@
     1801
     1802
     1803
    +1804
    +1805
    +1806
    +1807
    +1808
    +1809
    +1810
    +1811
    +1812
    +1813
    +1814
    +1815
    +1816
    +1817
    +1818
    +1819
    +1820
    +1821
    +1822
    +1823
    +1824
    +1825
    +1826
    +1827
    +1828
    +1829
    +1830
    +1831
    +1832
    +1833
    +1834
    +1835
    +1836
    +1837
    +1838
    +1839
    +1840
    +1841
    +1842
    +1843
    +1844
    +1845
    +1846
    +1847
    +1848
    +1849
    +1850
    +1851
    +1852
    +1853
    +1854
    +1855
    +1856
    +1857
    +1858
    +1859
    +1860
    +1861
    +1862
    +1863
    +1864
    +1865
    +1866
    +1867
    +1868
    +1869
    +1870
    +1871
    +1872
    +1873
    +1874
    +1875
    +1876
    +1877
    +1878
    +1879
    +1880
    +1881
    +1882
    +1883
    +1884
    +1885
    +1886
    +1887
    +1888
    +1889
    +1890
    +1891
    +1892
    +1893
    +1894
    +1895
    +1896
    +1897
    +1898
    +1899
    +1900
    +1901
    +1902
    +1903
    +1904
    +1905
     
    // Bitcoin Dev Kit
     // Written in 2020 by Alekos Filini <alekos.filini@gmail.com>
     //
    @@ -1824,9 +1926,12 @@
     };
     pub use bdk_chain::keychain::Balance;
     use bdk_chain::{
    -    chain_graph,
    -    keychain::{persist, KeychainChangeSet, KeychainScan, KeychainTracker},
    -    sparse_chain, BlockId, ConfirmationTime,
    +    indexed_tx_graph::IndexedAdditions,
    +    keychain::{KeychainTxOutIndex, LocalChangeSet, LocalUpdate},
    +    local_chain::{self, LocalChain, UpdateNotConnectedError},
    +    tx_graph::{CanonicalTx, TxGraph},
    +    Append, BlockId, ChainPosition, ConfirmationTime, ConfirmationTimeAnchor, FullTxOut,
    +    IndexedTxGraph, Persist, PersistBackend,
     };
     use bitcoin::consensus::encode::serialize;
     use bitcoin::secp256k1::Secp256k1;
    @@ -1886,19 +1991,18 @@
     pub struct Wallet<D = ()> {
         signers: Arc<SignersContainer>,
         change_signers: Arc<SignersContainer>,
    -    keychain_tracker: KeychainTracker<KeychainKind, ConfirmationTime>,
    -    persist: persist::Persist<KeychainKind, ConfirmationTime, D>,
    +    chain: LocalChain,
    +    indexed_graph: IndexedTxGraph<ConfirmationTimeAnchor, KeychainTxOutIndex<KeychainKind>>,
    +    persist: Persist<D, ChangeSet>,
         network: Network,
         secp: SecpCtx,
     }
     
     /// The update to a [`Wallet`] used in [`Wallet::apply_update`]. This is usually returned from blockchain data sources.
    -/// The type parameter `T` indicates the kind of transaction contained in the update. It's usually a [`bitcoin::Transaction`].
    -pub type Update = KeychainScan<KeychainKind, ConfirmationTime>;
    -/// Error indicating that something was wrong with an [`Update<T>`].
    -pub type UpdateError = chain_graph::UpdateError<ConfirmationTime>;
    -/// The changeset produced internally by applying an update
    -pub(crate) type ChangeSet = KeychainChangeSet<KeychainKind, ConfirmationTime>;
    +pub type Update = LocalUpdate<KeychainKind, ConfirmationTimeAnchor>;
    +
    +/// The changeset produced internally by [`Wallet`] when mutated.
    +pub type ChangeSet = LocalChangeSet<KeychainKind, ConfirmationTimeAnchor>;
     
     /// The address index selection strategy to use to derived an address from the wallet's external
     /// descriptor. See [`Wallet::get_address`]. If you're unsure which one to use use `WalletIndex::New`.
    @@ -1985,6 +2089,19 @@
         }
     }
     
    +/// An error that may occur when inserting a transaction into [`Wallet`].
    +#[derive(Debug)]
    +pub enum InsertTxError {
    +    /// The error variant that occurs when the caller attempts to insert a transaction with a
    +    /// confirmation height that is greater than the internal chain tip.
    +    ConfirmationHeightCannotBeGreaterThanTip {
    +        /// The internal chain's tip height.
    +        tip_height: Option<u32>,
    +        /// The introduced transaction's confirmation height.
    +        tx_height: u32,
    +    },
    +}
    +
     #[cfg(feature = "std")]
     impl<P: core::fmt::Display + core::fmt::Debug> std::error::Error for NewError<P> {}
     
    @@ -1998,15 +2115,17 @@
             network: Network,
         ) -> Result<Self, NewError<D::LoadError>>
         where
    -        D: persist::PersistBackend<KeychainKind, ConfirmationTime>,
    +        D: PersistBackend<ChangeSet>,
         {
             let secp = Secp256k1::new();
    +        let mut chain = LocalChain::default();
    +        let mut indexed_graph =
    +            IndexedTxGraph::<ConfirmationTimeAnchor, KeychainTxOutIndex<KeychainKind>>::default();
     
    -        let mut keychain_tracker = KeychainTracker::default();
             let (descriptor, keymap) = into_wallet_descriptor_checked(descriptor, &secp, network)
                 .map_err(NewError::Descriptor)?;
    -        keychain_tracker
    -            .txout_index
    +        indexed_graph
    +            .index
                 .add_keychain(KeychainKind::External, descriptor.clone());
             let signers = Arc::new(SignersContainer::build(keymap, &descriptor, &secp));
             let change_signers = match change_descriptor {
    @@ -2021,8 +2140,8 @@
                         &secp,
                     ));
     
    -                keychain_tracker
    -                    .txout_index
    +                indexed_graph
    +                    .index
                         .add_keychain(KeychainKind::Internal, change_descriptor);
     
                     change_signers
    @@ -2030,18 +2149,20 @@
                 None => Arc::new(SignersContainer::new()),
             };
     
    -        db.load_into_keychain_tracker(&mut keychain_tracker)
    -            .map_err(NewError::Persist)?;
    +        let changeset = db.load_from_persistence().map_err(NewError::Persist)?;
    +        chain.apply_changeset(changeset.chain_changeset);
    +        indexed_graph.apply_additions(changeset.indexed_additions);
     
    -        let persist = persist::Persist::new(db);
    +        let persist = Persist::new(db);
     
             Ok(Wallet {
                 signers,
                 change_signers,
                 network,
    +            chain,
    +            indexed_graph,
                 persist,
                 secp,
    -            keychain_tracker,
             })
         }
     
    @@ -2052,7 +2173,7 @@
     
         /// Iterator over all keychains in this wallet
         pub fn keychains(&self) -> &BTreeMap<KeychainKind, ExtendedDescriptor> {
    -        self.keychain_tracker.txout_index.keychains()
    +        self.indexed_graph.index.keychains()
         }
     
         /// Return a derived address using the external descriptor, see [`AddressIndex`] for
    @@ -2060,9 +2181,10 @@
         /// (i.e. does not end with /*) then the same address will always be returned for any [`AddressIndex`].
         pub fn get_address(&mut self, address_index: AddressIndex) -> AddressInfo
         where
    -        D: persist::PersistBackend<KeychainKind, ConfirmationTime>,
    +        D: PersistBackend<ChangeSet>,
         {
    -        self._get_address(address_index, KeychainKind::External)
    +        self._get_address(KeychainKind::External, address_index)
    +            .expect("persistence backend must not fail")
         }
     
         /// Return a derived address using the internal (change) descriptor.
    @@ -2074,91 +2196,99 @@
         /// be returned for any [`AddressIndex`].
         pub fn get_internal_address(&mut self, address_index: AddressIndex) -> AddressInfo
         where
    -        D: persist::PersistBackend<KeychainKind, ConfirmationTime>,
    +        D: PersistBackend<ChangeSet>,
         {
    -        self._get_address(address_index, KeychainKind::Internal)
    +        self._get_address(KeychainKind::Internal, address_index)
    +            .expect("persistence backend must not fail")
         }
     
    -    fn _get_address(&mut self, address_index: AddressIndex, keychain: KeychainKind) -> AddressInfo
    +    /// Return a derived address using the specified `keychain` (external/internal).
    +    ///
    +    /// If `keychain` is [`KeychainKind::External`], external addresses will be derived (used for
    +    /// receiving funds).
    +    ///
    +    /// If `keychain` is [`KeychainKind::Internal`], internal addresses will be derived (used for
    +    /// creating change outputs). If the wallet does not have an internal keychain, it will use the
    +    /// external keychain to derive change outputs.
    +    ///
    +    /// See [`AddressIndex`] for available address index selection strategies. If none of the keys
    +    /// in the descriptor are derivable (i.e. does not end with /*) then the same address will
    +    /// always be returned for any [`AddressIndex`].
    +    fn _get_address(
    +        &mut self,
    +        keychain: KeychainKind,
    +        address_index: AddressIndex,
    +    ) -> Result<AddressInfo, D::WriteError>
         where
    -        D: persist::PersistBackend<KeychainKind, ConfirmationTime>,
    +        D: PersistBackend<ChangeSet>,
         {
             let keychain = self.map_keychain(keychain);
    -        let txout_index = &mut self.keychain_tracker.txout_index;
    -        let (index, spk) = match address_index {
    +        let txout_index = &mut self.indexed_graph.index;
    +        let (index, spk, additions) = match address_index {
                 AddressIndex::New => {
    -                let ((index, spk), changeset) = txout_index.reveal_next_spk(&keychain);
    -                let spk = spk.clone();
    -
    -                self.persist.stage(changeset.into());
    -                self.persist.commit().expect("TODO");
    -                (index, spk)
    +                let ((index, spk), index_additions) = txout_index.reveal_next_spk(&keychain);
    +                (index, spk.clone(), Some(index_additions))
                 }
                 AddressIndex::LastUnused => {
    -                let index = txout_index.last_revealed_index(&keychain);
    -                match index {
    -                    Some(index) if !txout_index.is_used(&(keychain, index)) => (
    -                        index,
    -                        txout_index
    -                            .spk_at_index(&(keychain, index))
    -                            .expect("must exist")
    -                            .clone(),
    -                    ),
    -                    _ => return self._get_address(AddressIndex::New, keychain),
    -                }
    +                let ((index, spk), index_additions) = txout_index.next_unused_spk(&keychain);
    +                (index, spk.clone(), Some(index_additions))
    +            }
    +            AddressIndex::Peek(index) => {
    +                let (index, spk) = txout_index
    +                    .spks_of_keychain(&keychain)
    +                    .take(index as usize + 1)
    +                    .last()
    +                    .unwrap();
    +                (index, spk, None)
                 }
    -            AddressIndex::Peek(index) => txout_index
    -                .spks_of_keychain(&keychain)
    -                .take(index as usize + 1)
    -                .last()
    -                .unwrap(),
             };
    -        AddressInfo {
    +
    +        if let Some(additions) = additions {
    +            self.persist
    +                .stage(ChangeSet::from(IndexedAdditions::from(additions)));
    +            self.persist.commit()?;
    +        }
    +
    +        Ok(AddressInfo {
                 index,
                 address: Address::from_script(&spk, self.network)
                     .expect("descriptor must have address form"),
                 keychain,
    -        }
    +        })
         }
     
         /// Return whether or not a `script` is part of this wallet (either internal or external)
         pub fn is_mine(&self, script: &Script) -> bool {
    -        self.keychain_tracker
    -            .txout_index
    -            .index_of_spk(script)
    -            .is_some()
    +        self.indexed_graph.index.index_of_spk(script).is_some()
         }
     
         /// Finds how the wallet derived the script pubkey `spk`.
         ///
         /// Will only return `Some(_)` if the wallet has given out the spk.
         pub fn derivation_of_spk(&self, spk: &Script) -> Option<(KeychainKind, u32)> {
    -        self.keychain_tracker.txout_index.index_of_spk(spk).copied()
    +        self.indexed_graph.index.index_of_spk(spk).copied()
         }
     
         /// Return the list of unspent outputs of this wallet
    -    pub fn list_unspent(&self) -> Vec<LocalUtxo> {
    -        self.keychain_tracker
    -            .full_utxos()
    -            .map(|(&(keychain, derivation_index), utxo)| LocalUtxo {
    -                outpoint: utxo.outpoint,
    -                txout: utxo.txout,
    -                keychain,
    -                is_spent: false,
    -                derivation_index,
    -                confirmation_time: utxo.chain_position,
    -            })
    -            .collect()
    +    pub fn list_unspent(&self) -> impl Iterator<Item = LocalUtxo> + '_ {
    +        self.indexed_graph
    +            .graph()
    +            .filter_chain_unspents(
    +                &self.chain,
    +                self.chain.tip().unwrap_or_default(),
    +                self.indexed_graph.index.outpoints().iter().cloned(),
    +            )
    +            .map(|((k, i), full_txo)| new_local_utxo(k, i, full_txo))
         }
     
         /// Get all the checkpoints the wallet is currently storing indexed by height.
         pub fn checkpoints(&self) -> &BTreeMap<u32, BlockHash> {
    -        self.keychain_tracker.chain().checkpoints()
    +        self.chain.blocks()
         }
     
         /// Returns the latest checkpoint.
         pub fn latest_checkpoint(&self) -> Option<BlockId> {
    -        self.keychain_tracker.chain().latest_checkpoint()
    +        self.chain.tip()
         }
     
         /// Returns a iterators of all the script pubkeys for the `Internal` and External` variants in `KeychainKind`.
    @@ -2172,7 +2302,7 @@
         pub fn spks_of_all_keychains(
             &self,
         ) -> BTreeMap<KeychainKind, impl Iterator<Item = (u32, Script)> + Clone> {
    -        self.keychain_tracker.txout_index.spks_of_all_keychains()
    +        self.indexed_graph.index.spks_of_all_keychains()
         }
     
         /// Gets an iterator over all the script pubkeys in a single keychain.
    @@ -2184,30 +2314,22 @@
             &self,
             keychain: KeychainKind,
         ) -> impl Iterator<Item = (u32, Script)> + Clone {
    -        self.keychain_tracker
    -            .txout_index
    -            .spks_of_keychain(&keychain)
    +        self.indexed_graph.index.spks_of_keychain(&keychain)
         }
     
         /// Returns the utxo owned by this wallet corresponding to `outpoint` if it exists in the
         /// wallet's database.
         pub fn get_utxo(&self, op: OutPoint) -> Option<LocalUtxo> {
    -        self.keychain_tracker
    -            .full_utxos()
    -            .find_map(|(&(keychain, derivation_index), txo)| {
    -                if op == txo.outpoint {
    -                    Some(LocalUtxo {
    -                        outpoint: txo.outpoint,
    -                        txout: txo.txout,
    -                        keychain,
    -                        is_spent: txo.spent_by.is_none(),
    -                        derivation_index,
    -                        confirmation_time: txo.chain_position,
    -                    })
    -                } else {
    -                    None
    -                }
    -            })
    +        let (&spk_i, _) = self.indexed_graph.index.txout(op)?;
    +        self.indexed_graph
    +            .graph()
    +            .filter_chain_unspents(
    +                &self.chain,
    +                self.chain.tip().unwrap_or_default(),
    +                core::iter::once((spk_i, op)),
    +            )
    +            .map(|((k, i), full_txo)| new_local_utxo(k, i, full_txo))
    +            .next()
         }
     
         /// Return a single transactions made and received by the wallet
    @@ -2215,54 +2337,22 @@
         /// Optionally fill the [`TransactionDetails::transaction`] field with the raw transaction if
         /// `include_raw` is `true`.
         pub fn get_tx(&self, txid: Txid, include_raw: bool) -> Option<TransactionDetails> {
    -        let (&confirmation_time, tx) = self.keychain_tracker.chain_graph().get_tx_in_chain(txid)?;
    -        let graph = self.keychain_tracker.graph();
    -        let txout_index = &self.keychain_tracker.txout_index;
    -
    -        let received = tx
    -            .output
    -            .iter()
    -            .map(|txout| {
    -                if txout_index.index_of_spk(&txout.script_pubkey).is_some() {
    -                    txout.value
    -                } else {
    -                    0
    -                }
    -            })
    -            .sum();
    -
    -        let sent = tx
    -            .input
    -            .iter()
    -            .map(|txin| {
    -                if let Some((_, txout)) = txout_index.txout(txin.previous_output) {
    -                    txout.value
    -                } else {
    -                    0
    -                }
    -            })
    -            .sum();
    -
    -        let inputs = tx
    -            .input
    -            .iter()
    -            .map(|txin| {
    -                graph
    -                    .get_txout(txin.previous_output)
    -                    .map(|txout| txout.value)
    -            })
    -            .sum::<Option<u64>>();
    -        let outputs = tx.output.iter().map(|txout| txout.value).sum();
    -        let fee = inputs.map(|inputs| inputs.saturating_sub(outputs));
    +        let graph = self.indexed_graph.graph();
    +
    +        let canonical_tx = CanonicalTx {
    +            observed_as: graph.get_chain_position(
    +                &self.chain,
    +                self.chain.tip().unwrap_or_default(),
    +                txid,
    +            )?,
    +            node: graph.get_tx_node(txid)?,
    +        };
     
    -        Some(TransactionDetails {
    -            transaction: if include_raw { Some(tx.clone()) } else { None },
    -            txid,
    -            received,
    -            sent,
    -            fee,
    -            confirmation_time,
    -        })
    +        Some(new_tx_details(
    +            &self.indexed_graph,
    +            canonical_tx,
    +            include_raw,
    +        ))
         }
     
         /// Add a new checkpoint to the wallet's internal view of the chain.
    @@ -2275,24 +2365,30 @@
         pub fn insert_checkpoint(
             &mut self,
             block_id: BlockId,
    -    ) -> Result<bool, sparse_chain::InsertCheckpointError> {
    -        let changeset = self.keychain_tracker.insert_checkpoint(block_id)?;
    -        let changed = changeset.is_empty();
    -        self.persist.stage(changeset);
    +    ) -> Result<bool, local_chain::InsertBlockNotMatchingError>
    +    where
    +        D: PersistBackend<ChangeSet>,
    +    {
    +        let changeset = self.chain.insert_block(block_id)?;
    +        let changed = !changeset.is_empty();
    +        self.persist.stage(changeset.into());
             Ok(changed)
         }
     
    -    /// Add a transaction to the wallet's internal view of the chain.
    -    /// This stages but does not [`commit`] the change.
    -    ///
    -    /// There are a number reasons `tx` could be rejected with an `Err(_)`. The most important one
    -    /// is that the transaction is at a height that is greater than [`latest_checkpoint`]. Therefore
    -    /// you should use [`insert_checkpoint`] to insert new checkpoints before manually inserting new
    -    /// transactions.
    +    /// Add a transaction to the wallet's internal view of the chain. This stages but does not
    +    /// [`commit`] the change.
         ///
         /// Returns whether anything changed with the transaction insertion (e.g. `false` if the
         /// transaction was already inserted at the same position).
         ///
    +    /// A `tx` can be rejected if `position` has a height greater than the [`latest_checkpoint`].
    +    /// Therefore you should use [`insert_checkpoint`] to insert new checkpoints before manually
    +    /// inserting new transactions.
    +    ///
    +    /// **WARNING:** If `position` is confirmed, we anchor the `tx` to a the lowest checkpoint that
    +    /// is >= the `position`'s height. The caller is responsible for ensuring the `tx` exists in our
    +    /// local view of the best chain's history.
    +    ///
         /// [`commit`]: Self::commit
         /// [`latest_checkpoint`]: Self::latest_checkpoint
         /// [`insert_checkpoint`]: Self::insert_checkpoint
    @@ -2300,41 +2396,60 @@
             &mut self,
             tx: Transaction,
             position: ConfirmationTime,
    -    ) -> Result<bool, chain_graph::InsertTxError<ConfirmationTime>> {
    -        let changeset = self.keychain_tracker.insert_tx(tx, position)?;
    -        let changed = changeset.is_empty();
    +    ) -> Result<bool, InsertTxError>
    +    where
    +        D: PersistBackend<ChangeSet>,
    +    {
    +        let (anchor, last_seen) = match position {
    +            ConfirmationTime::Confirmed { height, time } => {
    +                // anchor tx to checkpoint with lowest height that is >= position's height
    +                let anchor = self
    +                    .chain
    +                    .blocks()
    +                    .range(height..)
    +                    .next()
    +                    .ok_or(InsertTxError::ConfirmationHeightCannotBeGreaterThanTip {
    +                        tip_height: self.chain.tip().map(|b| b.height),
    +                        tx_height: height,
    +                    })
    +                    .map(|(&anchor_height, &anchor_hash)| ConfirmationTimeAnchor {
    +                        anchor_block: BlockId {
    +                            height: anchor_height,
    +                            hash: anchor_hash,
    +                        },
    +                        confirmation_height: height,
    +                        confirmation_time: time,
    +                    })?;
    +
    +                (Some(anchor), None)
    +            }
    +            ConfirmationTime::Unconfirmed { last_seen } => (None, Some(last_seen)),
    +        };
    +
    +        let changeset: ChangeSet = self.indexed_graph.insert_tx(&tx, anchor, last_seen).into();
    +        let changed = !changeset.is_empty();
             self.persist.stage(changeset);
             Ok(changed)
         }
     
    -    #[deprecated(note = "use Wallet::transactions instead")]
    -    /// Deprecated. use `Wallet::transactions` instead.
    -    pub fn list_transactions(&self, include_raw: bool) -> Vec<TransactionDetails> {
    -        self.keychain_tracker
    -            .chain()
    -            .txids()
    -            .map(|&(_, txid)| self.get_tx(txid, include_raw).expect("must exist"))
    -            .collect()
    -    }
    -
    -    /// Iterate over the transactions in the wallet in order of ascending confirmation time with
    -    /// unconfirmed transactions last.
    +    /// Iterate over the transactions in the wallet.
         pub fn transactions(
             &self,
    -    ) -> impl DoubleEndedIterator<Item = (ConfirmationTime, &Transaction)> + '_ {
    -        self.keychain_tracker
    -            .chain_graph()
    -            .transactions_in_chain()
    -            .map(|(pos, tx)| (*pos, tx))
    +    ) -> impl Iterator<Item = CanonicalTx<'_, Transaction, ConfirmationTimeAnchor>> + '_ {
    +        self.indexed_graph
    +            .graph()
    +            .list_chain_txs(&self.chain, self.chain.tip().unwrap_or_default())
         }
     
         /// Return the balance, separated into available, trusted-pending, untrusted-pending and immature
         /// values.
         pub fn get_balance(&self) -> Balance {
    -        self.keychain_tracker.balance(|keychain| match keychain {
    -            KeychainKind::External => false,
    -            KeychainKind::Internal => true,
    -        })
    +        self.indexed_graph.graph().balance(
    +            &self.chain,
    +            self.chain.tip().unwrap_or_default(),
    +            self.indexed_graph.index.outpoints().iter().cloned(),
    +            |&(k, _), _| k == KeychainKind::Internal,
    +        )
         }
     
         /// Add an external signer
    @@ -2416,17 +2531,17 @@
             params: TxParams,
         ) -> Result<(psbt::PartiallySignedTransaction, TransactionDetails), Error>
         where
    -        D: persist::PersistBackend<KeychainKind, ConfirmationTime>,
    +        D: PersistBackend<ChangeSet>,
         {
             let external_descriptor = self
    -            .keychain_tracker
    -            .txout_index
    +            .indexed_graph
    +            .index
                 .keychains()
                 .get(&KeychainKind::External)
                 .expect("must exist");
             let internal_descriptor = self
    -            .keychain_tracker
    -            .txout_index
    +            .indexed_graph
    +            .index
                 .keychains()
                 .get(&KeychainKind::Internal);
     
    @@ -2503,9 +2618,8 @@
             let current_height = match params.current_height {
                 // If they didn't tell us the current height, we assume it's the latest sync height.
                 None => self
    -                .keychain_tracker
    -                .chain()
    -                .latest_checkpoint()
    +                .chain
    +                .tip()
                     .and_then(|cp| cp.height.into())
                     .map(|height| LockTime::from_height(height).expect("Invalid height")),
                 h => h,
    @@ -2677,15 +2791,12 @@
                 Some(ref drain_recipient) => drain_recipient.clone(),
                 None => {
                     let change_keychain = self.map_keychain(KeychainKind::Internal);
    -                let ((index, spk), changeset) = self
    -                    .keychain_tracker
    -                    .txout_index
    -                    .next_unused_spk(&change_keychain);
    +                let ((index, spk), index_additions) =
    +                    self.indexed_graph.index.next_unused_spk(&change_keychain);
                     let spk = spk.clone();
    -                self.keychain_tracker
    -                    .txout_index
    -                    .mark_used(&change_keychain, index);
    -                self.persist.stage(changeset.into());
    +                self.indexed_graph.index.mark_used(&change_keychain, index);
    +                self.persist
    +                    .stage(ChangeSet::from(IndexedAdditions::from(index_additions)));
                     self.persist.commit().expect("TODO");
                     spk
                 }
    @@ -2770,7 +2881,7 @@
             let transaction_details = TransactionDetails {
                 transaction: None,
                 txid,
    -            confirmation_time: ConfirmationTime::Unconfirmed,
    +            confirmation_time: ConfirmationTime::Unconfirmed { last_seen: 0 },
                 received,
                 sent,
                 fee: Some(fee_amount),
    @@ -2822,16 +2933,21 @@
             &mut self,
             txid: Txid,
         ) -> Result<TxBuilder<'_, D, DefaultCoinSelectionAlgorithm, BumpFee>, Error> {
    -        let graph = self.keychain_tracker.graph();
    -        let txout_index = &self.keychain_tracker.txout_index;
    -        let tx_and_height = self.keychain_tracker.chain_graph().get_tx_in_chain(txid);
    -        let mut tx = match tx_and_height {
    -            None => return Err(Error::TransactionNotFound),
    -            Some((ConfirmationTime::Confirmed { .. }, _tx)) => {
    -                return Err(Error::TransactionConfirmed)
    -            }
    -            Some((_, tx)) => tx.clone(),
    -        };
    +        let graph = self.indexed_graph.graph();
    +        let txout_index = &self.indexed_graph.index;
    +        let chain_tip = self.chain.tip().unwrap_or_default();
    +
    +        let mut tx = graph
    +            .get_tx(txid)
    +            .ok_or(Error::TransactionNotFound)?
    +            .clone();
    +
    +        let pos = graph
    +            .get_chain_position(&self.chain, chain_tip, txid)
    +            .ok_or(Error::TransactionNotFound)?;
    +        if let ChainPosition::Confirmed(_) = pos {
    +            return Err(Error::TransactionConfirmed);
    +        }
     
             if !tx
                 .input
    @@ -2854,13 +2970,17 @@
             let original_utxos = original_txin
                 .iter()
                 .map(|txin| -> Result<_, Error> {
    -                let (&confirmation_time, prev_tx) = self
    -                    .keychain_tracker
    -                    .chain_graph()
    -                    .get_tx_in_chain(txin.previous_output.txid)
    +                let prev_tx = graph
    +                    .get_tx(txin.previous_output.txid)
                         .ok_or(Error::UnknownUtxo)?;
                     let txout = &prev_tx.output[txin.previous_output.vout as usize];
     
    +                let confirmation_time: ConfirmationTime = graph
    +                    .get_chain_position(&self.chain, chain_tip, txin.previous_output.txid)
    +                    .ok_or(Error::UnknownUtxo)?
    +                    .cloned()
    +                    .into();
    +
                     let weighted_utxo = match txout_index.index_of_spk(&txout.script_pubkey) {
                         Some(&(keychain, derivation_index)) => {
                             let satisfaction_weight = self
    @@ -3034,7 +3154,7 @@
         ///
         /// This can be used to build a watch-only version of a wallet
         pub fn public_descriptor(&self, keychain: KeychainKind) -> Option<&ExtendedDescriptor> {
    -        self.keychain_tracker.txout_index.keychains().get(&keychain)
    +        self.indexed_graph.index.keychains().get(&keychain)
         }
     
         /// Finalize a PSBT, i.e., for each input determine if sufficient data is available to pass
    @@ -3050,6 +3170,8 @@
             psbt: &mut psbt::PartiallySignedTransaction,
             sign_options: SignOptions,
         ) -> Result<bool, Error> {
    +        let chain_tip = self.chain.tip().unwrap_or_default();
    +
             let tx = &psbt.unsigned_tx;
             let mut finished = true;
     
    @@ -3062,19 +3184,16 @@
                     continue;
                 }
                 let confirmation_height = self
    -                .keychain_tracker
    -                .chain()
    -                .tx_position(input.previous_output.txid)
    -                .map(|conftime| match conftime {
    -                    &ConfirmationTime::Confirmed { height, .. } => height,
    -                    ConfirmationTime::Unconfirmed => u32::MAX,
    +                .indexed_graph
    +                .graph()
    +                .get_chain_position(&self.chain, chain_tip, input.previous_output.txid)
    +                .map(|observed_as| match observed_as {
    +                    ChainPosition::Confirmed(a) => a.confirmation_height,
    +                    ChainPosition::Unconfirmed(_) => u32::MAX,
                     });
    -            let last_sync_height = self
    -                .keychain_tracker
    -                .chain()
    -                .latest_checkpoint()
    -                .map(|block_id| block_id.height);
    -            let current_height = sign_options.assume_height.or(last_sync_height);
    +            let current_height = sign_options
    +                .assume_height
    +                .or(self.chain.tip().map(|b| b.height));
     
                 debug!(
                     "Input #{} - {}, using `confirmation_height` = {:?}, `current_height` = {:?}",
    @@ -3091,8 +3210,8 @@
                     .get_utxo_for(n)
                     .and_then(|txout| self.get_descriptor_for_txout(&txout))
                     .or_else(|| {
    -                    self.keychain_tracker
    -                        .txout_index
    +                    self.indexed_graph
    +                        .index
                             .keychains()
                             .iter()
                             .find_map(|(_, desc)| {
    @@ -3150,14 +3269,12 @@
         /// The derivation index of this wallet. It will return `None` if it has not derived any addresses.
         /// Otherwise, it will return the index of the highest address it has derived.
         pub fn derivation_index(&self, keychain: KeychainKind) -> Option<u32> {
    -        self.keychain_tracker
    -            .txout_index
    -            .last_revealed_index(&keychain)
    +        self.indexed_graph.index.last_revealed_index(&keychain)
         }
     
         /// The index of the next address that you would get if you were to ask the wallet for a new address
         pub fn next_derivation_index(&self, keychain: KeychainKind) -> u32 {
    -        self.keychain_tracker.txout_index.next_index(&keychain).0
    +        self.indexed_graph.index.next_index(&keychain).0
         }
     
         /// Informs the wallet that you no longer intend to broadcast a tx that was built from it.
    @@ -3165,7 +3282,7 @@
         /// This frees up the change address used when creating the tx for use in future transactions.
         // TODO: Make this free up reserved utxos when that's implemented
         pub fn cancel_tx(&mut self, tx: &Transaction) {
    -        let txout_index = &mut self.keychain_tracker.txout_index;
    +        let txout_index = &mut self.indexed_graph.index;
             for txout in &tx.output {
                 if let Some(&(keychain, index)) = txout_index.index_of_spk(&txout.script_pubkey) {
                     // NOTE: unmark_used will **not** make something unused if it has actually been used
    @@ -3187,8 +3304,8 @@
     
         fn get_descriptor_for_txout(&self, txout: &TxOut) -> Option<DerivedDescriptor> {
             let &(keychain, child) = self
    -            .keychain_tracker
    -            .txout_index
    +            .indexed_graph
    +            .index
                 .index_of_spk(&txout.script_pubkey)?;
             let descriptor = self.get_descriptor_for_keychain(keychain);
             Some(descriptor.at_derivation_index(child))
    @@ -3196,7 +3313,6 @@
     
         fn get_available_utxos(&self) -> Vec<(LocalUtxo, usize)> {
             self.list_unspent()
    -            .into_iter()
                 .map(|utxo| {
                     let keychain = utxo.keychain;
                     (
    @@ -3222,6 +3338,7 @@
             must_only_use_confirmed_tx: bool,
             current_height: Option<u32>,
         ) -> (Vec<WeightedUtxo>, Vec<WeightedUtxo>) {
    +        let chain_tip = self.chain.tip().unwrap_or_default();
             //    must_spend <- manually selected utxos
             //    may_spend  <- all other available utxos
             let mut may_spend = self.get_available_utxos();
    @@ -3241,39 +3358,43 @@
     
             let satisfies_confirmed = may_spend
                 .iter()
    -            .map(|u| {
    +            .map(|u| -> bool {
                     let txid = u.0.outpoint.txid;
    -                let tx = self.keychain_tracker.chain_graph().get_tx_in_chain(txid);
    -                match tx {
    -                    // We don't have the tx in the db for some reason,
    -                    // so we can't know for sure if it's mature or not.
    -                    // We prefer not to spend it.
    -                    None => false,
    -                    Some((confirmation_time, tx)) => {
    -                        // Whether the UTXO is mature and, if needed, confirmed
    -                        let mut spendable = true;
    -                        if must_only_use_confirmed_tx && !confirmation_time.is_confirmed() {
    -                            return false;
    -                        }
    -                        if tx.is_coin_base() {
    -                            debug_assert!(
    -                                confirmation_time.is_confirmed(),
    -                                "coinbase must always be confirmed"
    -                            );
    -                            if let Some(current_height) = current_height {
    -                                match confirmation_time {
    -                                    ConfirmationTime::Confirmed { height, .. } => {
    -                                        // https://github.com/bitcoin/bitcoin/blob/c5e67be03bb06a5d7885c55db1f016fbf2333fe3/src/validation.cpp#L373-L375
    -                                        spendable &= (current_height.saturating_sub(*height))
    -                                            >= COINBASE_MATURITY;
    -                                    }
    -                                    ConfirmationTime::Unconfirmed => spendable = false,
    -                                }
    +                let tx = match self.indexed_graph.graph().get_tx(txid) {
    +                    Some(tx) => tx,
    +                    None => return false,
    +                };
    +                let confirmation_time: ConfirmationTime = match self
    +                    .indexed_graph
    +                    .graph()
    +                    .get_chain_position(&self.chain, chain_tip, txid)
    +                {
    +                    Some(observed_as) => observed_as.cloned().into(),
    +                    None => return false,
    +                };
    +
    +                // Whether the UTXO is mature and, if needed, confirmed
    +                let mut spendable = true;
    +                if must_only_use_confirmed_tx && !confirmation_time.is_confirmed() {
    +                    return false;
    +                }
    +                if tx.is_coin_base() {
    +                    debug_assert!(
    +                        confirmation_time.is_confirmed(),
    +                        "coinbase must always be confirmed"
    +                    );
    +                    if let Some(current_height) = current_height {
    +                        match confirmation_time {
    +                            ConfirmationTime::Confirmed { height, .. } => {
    +                                // https://github.com/bitcoin/bitcoin/blob/c5e67be03bb06a5d7885c55db1f016fbf2333fe3/src/validation.cpp#L373-L375
    +                                spendable &=
    +                                    (current_height.saturating_sub(height)) >= COINBASE_MATURITY;
                                 }
    +                            ConfirmationTime::Unconfirmed { .. } => spendable = false,
                             }
    -                        spendable
                         }
                     }
    +                spendable
                 })
                 .collect::<Vec<_>>();
     
    @@ -3393,8 +3514,8 @@
             // Try to find the prev_script in our db to figure out if this is internal or external,
             // and the derivation index
             let &(keychain, child) = self
    -            .keychain_tracker
    -            .txout_index
    +            .indexed_graph
    +            .index
                 .index_of_spk(&utxo.txout.script_pubkey)
                 .ok_or(Error::UnknownUtxo)?;
     
    @@ -3411,7 +3532,7 @@
                 .map_err(MiniscriptPsbtError::Conversion)?;
     
             let prev_output = utxo.outpoint;
    -        if let Some(prev_tx) = self.keychain_tracker.graph().get_tx(prev_output.txid) {
    +        if let Some(prev_tx) = self.indexed_graph.graph().get_tx(prev_output.txid) {
                 if desc.is_witness() || desc.is_taproot() {
                     psbt_input.witness_utxo = Some(prev_tx.output[prev_output.vout as usize].clone());
                 }
    @@ -3444,10 +3565,8 @@
     
             // Try to figure out the keychain and derivation for every input and output
             for (is_input, index, out) in utxos.into_iter() {
    -            if let Some(&(keychain, child)) = self
    -                .keychain_tracker
    -                .txout_index
    -                .index_of_spk(&out.script_pubkey)
    +            if let Some(&(keychain, child)) =
    +                self.indexed_graph.index.index_of_spk(&out.script_pubkey)
                 {
                     debug!(
                         "Found descriptor for input #{} {:?}/{}",
    @@ -3484,56 +3603,71 @@
     
         /// Applies an update to the wallet and stages the changes (but does not [`commit`] them).
         ///
    +    /// This returns whether the `update` resulted in any changes.
    +    ///
         /// Usually you create an `update` by interacting with some blockchain data source and inserting
         /// transactions related to your wallet into it.
         ///
         /// [`commit`]: Self::commit
    -    pub fn apply_update(&mut self, update: Update) -> Result<(), UpdateError>
    +    pub fn apply_update(&mut self, update: Update) -> Result<bool, UpdateNotConnectedError>
         where
    -        D: persist::PersistBackend<KeychainKind, ConfirmationTime>,
    +        D: PersistBackend<ChangeSet>,
         {
    -        let changeset = self.keychain_tracker.apply_update(update)?;
    +        let mut changeset: ChangeSet = self.chain.apply_update(update.chain)?.into();
    +        let (_, index_additions) = self
    +            .indexed_graph
    +            .index
    +            .reveal_to_target_multi(&update.keychain);
    +        changeset.append(ChangeSet::from(IndexedAdditions::from(index_additions)));
    +        changeset.append(self.indexed_graph.apply_update(update.graph).into());
    +
    +        let changed = !changeset.is_empty();
             self.persist.stage(changeset);
    -        Ok(())
    +        Ok(changed)
         }
     
    -    /// Commits all curently [`staged`] changed to the persistence backend returning and error when this fails.
    +    /// Commits all curently [`staged`] changed to the persistence backend returning and error when
    +    /// this fails.
    +    ///
    +    /// This returns whether the `update` resulted in any changes.
         ///
         /// [`staged`]: Self::staged
    -    pub fn commit(&mut self) -> Result<(), D::WriteError>
    +    pub fn commit(&mut self) -> Result<bool, D::WriteError>
         where
    -        D: persist::PersistBackend<KeychainKind, ConfirmationTime>,
    +        D: PersistBackend<ChangeSet>,
         {
    -        self.persist.commit()
    +        self.persist.commit().map(|c| c.is_some())
         }
     
         /// Returns the changes that will be staged with the next call to [`commit`].
         ///
         /// [`commit`]: Self::commit
    -    pub fn staged(&self) -> &ChangeSet {
    +    pub fn staged(&self) -> &ChangeSet
    +    where
    +        D: PersistBackend<ChangeSet>,
    +    {
             self.persist.staged()
         }
     
    -    /// Get a reference to the inner [`TxGraph`](bdk_chain::tx_graph::TxGraph).
    -    pub fn as_graph(&self) -> &bdk_chain::tx_graph::TxGraph {
    -        self.keychain_tracker.graph()
    +    /// Get a reference to the inner [`TxGraph`].
    +    pub fn tx_graph(&self) -> &TxGraph<ConfirmationTimeAnchor> {
    +        self.indexed_graph.graph()
         }
     
    -    /// Get a reference to the inner [`ChainGraph`](bdk_chain::chain_graph::ChainGraph).
    -    pub fn as_chain_graph(&self) -> &bdk_chain::chain_graph::ChainGraph<ConfirmationTime> {
    -        self.keychain_tracker.chain_graph()
    +    /// Get a reference to the inner [`KeychainTxOutIndex`].
    +    pub fn spk_index(&self) -> &KeychainTxOutIndex<KeychainKind> {
    +        &self.indexed_graph.index
         }
    -}
     
    -impl<D> AsRef<bdk_chain::tx_graph::TxGraph> for Wallet<D> {
    -    fn as_ref(&self) -> &bdk_chain::tx_graph::TxGraph {
    -        self.keychain_tracker.graph()
    +    /// Get a reference to the inner [`LocalChain`].
    +    pub fn local_chain(&self) -> &LocalChain {
    +        &self.chain
         }
     }
     
    -impl<D> AsRef<bdk_chain::chain_graph::ChainGraph<ConfirmationTime>> for Wallet<D> {
    -    fn as_ref(&self) -> &bdk_chain::chain_graph::ChainGraph<ConfirmationTime> {
    -        self.keychain_tracker.chain_graph()
    +impl<D> AsRef<bdk_chain::tx_graph::TxGraph<ConfirmationTimeAnchor>> for Wallet<D> {
    +    fn as_ref(&self) -> &bdk_chain::tx_graph::TxGraph<ConfirmationTimeAnchor> {
    +        self.indexed_graph.graph()
         }
     }
     
    @@ -3568,6 +3702,76 @@
         Ok(wallet_name)
     }
     
    +fn new_local_utxo(
    +    keychain: KeychainKind,
    +    derivation_index: u32,
    +    full_txo: FullTxOut<ConfirmationTimeAnchor>,
    +) -> LocalUtxo {
    +    LocalUtxo {
    +        outpoint: full_txo.outpoint,
    +        txout: full_txo.txout,
    +        is_spent: full_txo.spent_by.is_some(),
    +        confirmation_time: full_txo.chain_position.into(),
    +        keychain,
    +        derivation_index,
    +    }
    +}
    +
    +fn new_tx_details(
    +    indexed_graph: &IndexedTxGraph<ConfirmationTimeAnchor, KeychainTxOutIndex<KeychainKind>>,
    +    canonical_tx: CanonicalTx<'_, Transaction, ConfirmationTimeAnchor>,
    +    include_raw: bool,
    +) -> TransactionDetails {
    +    let graph = indexed_graph.graph();
    +    let index = &indexed_graph.index;
    +    let tx = canonical_tx.node.tx;
    +
    +    let received = tx
    +        .output
    +        .iter()
    +        .map(|txout| {
    +            if index.index_of_spk(&txout.script_pubkey).is_some() {
    +                txout.value
    +            } else {
    +                0
    +            }
    +        })
    +        .sum();
    +
    +    let sent = tx
    +        .input
    +        .iter()
    +        .map(|txin| {
    +            if let Some((_, txout)) = index.txout(txin.previous_output) {
    +                txout.value
    +            } else {
    +                0
    +            }
    +        })
    +        .sum();
    +
    +    let inputs = tx
    +        .input
    +        .iter()
    +        .map(|txin| {
    +            graph
    +                .get_txout(txin.previous_output)
    +                .map(|txout| txout.value)
    +        })
    +        .sum::<Option<u64>>();
    +    let outputs = tx.output.iter().map(|txout| txout.value).sum();
    +    let fee = inputs.map(|inputs| inputs.saturating_sub(outputs));
    +
    +    TransactionDetails {
    +        transaction: if include_raw { Some(tx.clone()) } else { None },
    +        txid: canonical_tx.node.txid,
    +        received,
    +        sent,
    +        fee,
    +        confirmation_time: canonical_tx.observed_as.cloned().into(),
    +    }
    +}
    +
     #[macro_export]
     #[doc(hidden)]
     /// Macro for getting a wallet for use in a doctest
    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/tx_builder.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/tx_builder.rs.html
    index 35b073d5eb..45c7a78335 100644
    --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/tx_builder.rs.html
    +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk/wallet/tx_builder.rs.html
    @@ -986,7 +986,7 @@
     use crate::collections::BTreeMap;
     use crate::collections::HashSet;
     use alloc::{boxed::Box, rc::Rc, string::String, vec::Vec};
    -use bdk_chain::ConfirmationTime;
    +use bdk_chain::PersistBackend;
     use core::cell::RefCell;
     use core::marker::PhantomData;
     
    @@ -994,7 +994,7 @@
     use bitcoin::{LockTime, OutPoint, Script, Sequence, Transaction};
     
     use super::coin_selection::{CoinSelectionAlgorithm, DefaultCoinSelectionAlgorithm};
    -use super::persist;
    +use super::ChangeSet;
     use crate::{
         types::{FeeRate, KeychainKind, LocalUtxo, WeightedUtxo},
         TransactionDetails,
    @@ -1476,7 +1476,7 @@
         /// [`BIP174`]: https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki
         pub fn finish(self) -> Result<(Psbt, TransactionDetails), Error>
         where
    -        D: persist::PersistBackend<KeychainKind, ConfirmationTime>,
    +        D: PersistBackend<ChangeSet>,
         {
             self.wallet
                 .borrow_mut()
    @@ -1831,7 +1831,7 @@
                     txout: Default::default(),
                     keychain: KeychainKind::External,
                     is_spent: false,
    -                confirmation_time: ConfirmationTime::Unconfirmed,
    +                confirmation_time: ConfirmationTime::Unconfirmed { last_seen: 0 },
                     derivation_index: 0,
                 },
                 LocalUtxo {
    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_data.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_data.rs.html
    index 05364c01a2..4783b49213 100644
    --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_data.rs.html
    +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_data.rs.html
    @@ -256,195 +256,48 @@
     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
     
    use bitcoin::{hashes::Hash, BlockHash, OutPoint, TxOut, Txid};
     
    -use crate::{
    -    sparse_chain::{self, ChainPosition},
    -    Anchor, COINBASE_MATURITY,
    -};
    +use crate::{Anchor, COINBASE_MATURITY};
     
    -/// Represents an observation of some chain data.
    +/// Represents the observed position of some chain data.
     ///
     /// The generic `A` should be a [`Anchor`] implementation.
     #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, core::hash::Hash)]
    -pub enum ObservedAs<A> {
    +pub enum ChainPosition<A> {
         /// The chain data is seen as confirmed, and in anchored by `A`.
         Confirmed(A),
         /// The chain data is seen in mempool at this given timestamp.
         Unconfirmed(u64),
     }
     
    -impl<A: Clone> ObservedAs<&A> {
    -    pub fn cloned(self) -> ObservedAs<A> {
    -        match self {
    -            ObservedAs::Confirmed(a) => ObservedAs::Confirmed(a.clone()),
    -            ObservedAs::Unconfirmed(last_seen) => ObservedAs::Unconfirmed(last_seen),
    -        }
    -    }
    -}
    -
    -/// Represents the height at which a transaction is confirmed.
    -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
    -#[cfg_attr(
    -    feature = "serde",
    -    derive(serde::Deserialize, serde::Serialize),
    -    serde(crate = "serde_crate")
    -)]
    -pub enum TxHeight {
    -    Confirmed(u32),
    -    Unconfirmed,
    -}
    -
    -impl Default for TxHeight {
    -    fn default() -> Self {
    -        Self::Unconfirmed
    +impl<A> ChainPosition<A> {
    +    /// Returns whether [`ChainPosition`] is confirmed or not.
    +    pub fn is_confirmed(&self) -> bool {
    +        matches!(self, Self::Confirmed(_))
         }
     }
     
    -impl core::fmt::Display for TxHeight {
    -    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
    +impl<A: Clone> ChainPosition<&A> {
    +    /// Maps a [`ChainPosition<&A>`] into a [`ChainPosition<A>`] by cloning the contents.
    +    pub fn cloned(self) -> ChainPosition<A> {
             match self {
    -            Self::Confirmed(h) => core::write!(f, "confirmed_at({})", h),
    -            Self::Unconfirmed => core::write!(f, "unconfirmed"),
    -        }
    -    }
    -}
    -
    -impl From<Option<u32>> for TxHeight {
    -    fn from(opt: Option<u32>) -> Self {
    -        match opt {
    -            Some(h) => Self::Confirmed(h),
    -            None => Self::Unconfirmed,
    +            ChainPosition::Confirmed(a) => ChainPosition::Confirmed(a.clone()),
    +            ChainPosition::Unconfirmed(last_seen) => ChainPosition::Unconfirmed(last_seen),
             }
         }
     }
     
    -impl From<TxHeight> for Option<u32> {
    -    fn from(height: TxHeight) -> Self {
    -        match height {
    -            TxHeight::Confirmed(h) => Some(h),
    -            TxHeight::Unconfirmed => None,
    +impl<A: Anchor> ChainPosition<A> {
    +    /// Determines the upper bound of the confirmation height.
    +    pub fn confirmation_height_upper_bound(&self) -> Option<u32> {
    +        match self {
    +            ChainPosition::Confirmed(a) => Some(a.confirmation_height_upper_bound()),
    +            ChainPosition::Unconfirmed(_) => None,
             }
         }
     }
     
    -impl crate::sparse_chain::ChainPosition for TxHeight {
    -    fn height(&self) -> TxHeight {
    -        *self
    -    }
    -
    -    fn max_ord_of_height(height: TxHeight) -> Self {
    -        height
    -    }
    -
    -    fn min_ord_of_height(height: TxHeight) -> Self {
    -        height
    -    }
    -}
    -
    -impl TxHeight {
    -    pub fn is_confirmed(&self) -> bool {
    -        matches!(self, Self::Confirmed(_))
    -    }
    -}
    -
     /// Block height and timestamp at which a transaction is confirmed.
     #[derive(Debug, Clone, PartialEq, Eq, Copy, PartialOrd, Ord, core::hash::Hash)]
     #[cfg_attr(
    @@ -453,45 +306,44 @@
         serde(crate = "serde_crate")
     )]
     pub enum ConfirmationTime {
    -    Confirmed { height: u32, time: u64 },
    -    Unconfirmed,
    +    /// The confirmed variant.
    +    Confirmed {
    +        /// Confirmation height.
    +        height: u32,
    +        /// Confirmation time in unix seconds.
    +        time: u64,
    +    },
    +    /// The unconfirmed variant.
    +    Unconfirmed {
    +        /// The last-seen timestamp in unix seconds.
    +        last_seen: u64,
    +    },
     }
     
    -impl sparse_chain::ChainPosition for ConfirmationTime {
    -    fn height(&self) -> TxHeight {
    -        match self {
    -            ConfirmationTime::Confirmed { height, .. } => TxHeight::Confirmed(*height),
    -            ConfirmationTime::Unconfirmed => TxHeight::Unconfirmed,
    -        }
    +impl ConfirmationTime {
    +    /// Construct an unconfirmed variant using the given `last_seen` time in unix seconds.
    +    pub fn unconfirmed(last_seen: u64) -> Self {
    +        Self::Unconfirmed { last_seen }
         }
     
    -    fn max_ord_of_height(height: TxHeight) -> Self {
    -        match height {
    -            TxHeight::Confirmed(height) => Self::Confirmed {
    -                height,
    -                time: u64::MAX,
    -            },
    -            TxHeight::Unconfirmed => Self::Unconfirmed,
    -        }
    +    /// Returns whether [`ConfirmationTime`] is the confirmed variant.
    +    pub fn is_confirmed(&self) -> bool {
    +        matches!(self, Self::Confirmed { .. })
         }
    +}
     
    -    fn min_ord_of_height(height: TxHeight) -> Self {
    -        match height {
    -            TxHeight::Confirmed(height) => Self::Confirmed {
    -                height,
    -                time: u64::MIN,
    +impl From<ChainPosition<ConfirmationTimeAnchor>> for ConfirmationTime {
    +    fn from(observed_as: ChainPosition<ConfirmationTimeAnchor>) -> Self {
    +        match observed_as {
    +            ChainPosition::Confirmed(a) => Self::Confirmed {
    +                height: a.confirmation_height,
    +                time: a.confirmation_time,
                 },
    -            TxHeight::Unconfirmed => Self::Unconfirmed,
    +            ChainPosition::Unconfirmed(_) => Self::Unconfirmed { last_seen: 0 },
             }
         }
     }
     
    -impl ConfirmationTime {
    -    pub fn is_confirmed(&self) -> bool {
    -        matches!(self, Self::Confirmed { .. })
    -    }
    -}
    -
     /// A reference to a block in the canonical chain.
     #[derive(Debug, Clone, PartialEq, Eq, Copy, PartialOrd, Ord, core::hash::Hash)]
     #[cfg_attr(
    @@ -574,9 +426,10 @@
     pub struct ConfirmationTimeAnchor {
         /// The anchor block.
         pub anchor_block: BlockId,
    -
    -    pub confirmation_height: u32,
    -    pub confirmation_time: u64,
    +    /// The confirmation height of the chain data being anchored.
    +    pub confirmation_height: u32,
    +    /// The confirmation time of the chain data being anchored.
    +    pub confirmation_time: u64,
     }
     
     impl Anchor for ConfirmationTimeAnchor {
    @@ -590,75 +443,32 @@
     }
     /// A `TxOut` with as much data as we can retrieve about it
     #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
    -pub struct FullTxOut<P> {
    +pub struct FullTxOut<A> {
         /// The location of the `TxOut`.
         pub outpoint: OutPoint,
         /// The `TxOut`.
         pub txout: TxOut,
         /// The position of the transaction in `outpoint` in the overall chain.
    -    pub chain_position: P,
    +    pub chain_position: ChainPosition<A>,
         /// The txid and chain position of the transaction (if any) that has spent this output.
    -    pub spent_by: Option<(P, Txid)>,
    +    pub spent_by: Option<(ChainPosition<A>, Txid)>,
         /// Whether this output is on a coinbase transaction.
         pub is_on_coinbase: bool,
     }
     
    -impl<P: ChainPosition> FullTxOut<P> {
    -    /// Whether the utxo is/was/will be spendable at `height`.
    -    ///
    -    /// It is spendable if it is not an immature coinbase output and no spending tx has been
    -    /// confirmed by that height.
    -    pub fn is_spendable_at(&self, height: u32) -> bool {
    -        if !self.is_mature(height) {
    -            return false;
    -        }
    -
    -        if self.chain_position.height() > TxHeight::Confirmed(height) {
    -            return false;
    -        }
    -
    -        match &self.spent_by {
    -            Some((spending_height, _)) => spending_height.height() > TxHeight::Confirmed(height),
    -            None => true,
    -        }
    -    }
    -
    -    pub fn is_mature(&self, height: u32) -> bool {
    -        if self.is_on_coinbase {
    -            let tx_height = match self.chain_position.height() {
    -                TxHeight::Confirmed(tx_height) => tx_height,
    -                TxHeight::Unconfirmed => {
    -                    debug_assert!(false, "coinbase tx can never be unconfirmed");
    -                    return false;
    -                }
    -            };
    -            let age = height.saturating_sub(tx_height);
    -            if age + 1 < COINBASE_MATURITY {
    -                return false;
    -            }
    -        }
    -
    -        true
    -    }
    -}
    -
    -impl<A: Anchor> FullTxOut<ObservedAs<A>> {
    +impl<A: Anchor> FullTxOut<A> {
         /// Whether the `txout` is considered mature.
         ///
    -    /// This is the alternative version of [`is_mature`] which depends on `chain_position` being a
    -    /// [`ObservedAs<A>`] where `A` implements [`Anchor`].
    -    ///
         /// Depending on the implementation of [`confirmation_height_upper_bound`] in [`Anchor`], this
         /// method may return false-negatives. In other words, interpretted confirmation count may be
         /// less than the actual value.
         ///
    -    /// [`is_mature`]: Self::is_mature
         /// [`confirmation_height_upper_bound`]: Anchor::confirmation_height_upper_bound
         pub fn is_mature(&self, tip: u32) -> bool {
             if self.is_on_coinbase {
                 let tx_height = match &self.chain_position {
    -                ObservedAs::Confirmed(anchor) => anchor.confirmation_height_upper_bound(),
    -                ObservedAs::Unconfirmed(_) => {
    +                ChainPosition::Confirmed(anchor) => anchor.confirmation_height_upper_bound(),
    +                ChainPosition::Unconfirmed(_) => {
                         debug_assert!(false, "coinbase tx can never be unconfirmed");
                         return false;
                     }
    @@ -676,14 +486,10 @@
         ///
         /// This method does not take into account the locktime.
         ///
    -    /// This is the alternative version of [`is_spendable_at`] which depends on `chain_position`
    -    /// being a [`ObservedAs<A>`] where `A` implements [`Anchor`].
    -    ///
         /// Depending on the implementation of [`confirmation_height_upper_bound`] in [`Anchor`], this
         /// method may return false-negatives. In other words, interpretted confirmation count may be
         /// less than the actual value.
         ///
    -    /// [`is_spendable_at`]: Self::is_spendable_at
         /// [`confirmation_height_upper_bound`]: Anchor::confirmation_height_upper_bound
         pub fn is_confirmed_and_spendable(&self, tip: u32) -> bool {
             if !self.is_mature(tip) {
    @@ -691,15 +497,15 @@
             }
     
             let confirmation_height = match &self.chain_position {
    -            ObservedAs::Confirmed(anchor) => anchor.confirmation_height_upper_bound(),
    -            ObservedAs::Unconfirmed(_) => return false,
    +            ChainPosition::Confirmed(anchor) => anchor.confirmation_height_upper_bound(),
    +            ChainPosition::Unconfirmed(_) => return false,
             };
             if confirmation_height > tip {
                 return false;
             }
     
             // if the spending tx is confirmed within tip height, the txout is no longer spendable
    -        if let Some((ObservedAs::Confirmed(spending_anchor), _)) = &self.spent_by {
    +        if let Some((ChainPosition::Confirmed(spending_anchor), _)) = &self.spent_by {
                 if spending_anchor.anchor_block().height <= tip {
                     return false;
                 }
    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_graph.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_graph.rs.html
    deleted file mode 100644
    index 43bab99631..0000000000
    --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_graph.rs.html
    +++ /dev/null
    @@ -1,1280 +0,0 @@
    -chain_graph.rs - source
    1
    -2
    -3
    -4
    -5
    -6
    -7
    -8
    -9
    -10
    -11
    -12
    -13
    -14
    -15
    -16
    -17
    -18
    -19
    -20
    -21
    -22
    -23
    -24
    -25
    -26
    -27
    -28
    -29
    -30
    -31
    -32
    -33
    -34
    -35
    -36
    -37
    -38
    -39
    -40
    -41
    -42
    -43
    -44
    -45
    -46
    -47
    -48
    -49
    -50
    -51
    -52
    -53
    -54
    -55
    -56
    -57
    -58
    -59
    -60
    -61
    -62
    -63
    -64
    -65
    -66
    -67
    -68
    -69
    -70
    -71
    -72
    -73
    -74
    -75
    -76
    -77
    -78
    -79
    -80
    -81
    -82
    -83
    -84
    -85
    -86
    -87
    -88
    -89
    -90
    -91
    -92
    -93
    -94
    -95
    -96
    -97
    -98
    -99
    -100
    -101
    -102
    -103
    -104
    -105
    -106
    -107
    -108
    -109
    -110
    -111
    -112
    -113
    -114
    -115
    -116
    -117
    -118
    -119
    -120
    -121
    -122
    -123
    -124
    -125
    -126
    -127
    -128
    -129
    -130
    -131
    -132
    -133
    -134
    -135
    -136
    -137
    -138
    -139
    -140
    -141
    -142
    -143
    -144
    -145
    -146
    -147
    -148
    -149
    -150
    -151
    -152
    -153
    -154
    -155
    -156
    -157
    -158
    -159
    -160
    -161
    -162
    -163
    -164
    -165
    -166
    -167
    -168
    -169
    -170
    -171
    -172
    -173
    -174
    -175
    -176
    -177
    -178
    -179
    -180
    -181
    -182
    -183
    -184
    -185
    -186
    -187
    -188
    -189
    -190
    -191
    -192
    -193
    -194
    -195
    -196
    -197
    -198
    -199
    -200
    -201
    -202
    -203
    -204
    -205
    -206
    -207
    -208
    -209
    -210
    -211
    -212
    -213
    -214
    -215
    -216
    -217
    -218
    -219
    -220
    -221
    -222
    -223
    -224
    -225
    -226
    -227
    -228
    -229
    -230
    -231
    -232
    -233
    -234
    -235
    -236
    -237
    -238
    -239
    -240
    -241
    -242
    -243
    -244
    -245
    -246
    -247
    -248
    -249
    -250
    -251
    -252
    -253
    -254
    -255
    -256
    -257
    -258
    -259
    -260
    -261
    -262
    -263
    -264
    -265
    -266
    -267
    -268
    -269
    -270
    -271
    -272
    -273
    -274
    -275
    -276
    -277
    -278
    -279
    -280
    -281
    -282
    -283
    -284
    -285
    -286
    -287
    -288
    -289
    -290
    -291
    -292
    -293
    -294
    -295
    -296
    -297
    -298
    -299
    -300
    -301
    -302
    -303
    -304
    -305
    -306
    -307
    -308
    -309
    -310
    -311
    -312
    -313
    -314
    -315
    -316
    -317
    -318
    -319
    -320
    -321
    -322
    -323
    -324
    -325
    -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
    -590
    -591
    -592
    -593
    -594
    -595
    -596
    -597
    -598
    -599
    -600
    -601
    -602
    -603
    -604
    -605
    -606
    -607
    -608
    -609
    -610
    -611
    -612
    -613
    -614
    -615
    -616
    -617
    -618
    -619
    -620
    -621
    -622
    -623
    -624
    -625
    -626
    -627
    -628
    -629
    -630
    -631
    -632
    -633
    -634
    -635
    -636
    -637
    -638
    -639
    -
    //! Module for structures that combine the features of [`sparse_chain`] and [`tx_graph`].
    -use crate::{
    -    collections::HashSet,
    -    sparse_chain::{self, ChainPosition, SparseChain},
    -    tx_graph::{self, TxGraph},
    -    Append, BlockId, ForEachTxOut, FullTxOut, TxHeight,
    -};
    -use alloc::{string::ToString, vec::Vec};
    -use bitcoin::{OutPoint, Transaction, TxOut, Txid};
    -use core::fmt::Debug;
    -
    -/// A consistent combination of a [`SparseChain<P>`] and a [`TxGraph<T>`].
    -///
    -/// `SparseChain` only keeps track of transaction ids and their position in the chain, but you often
    -/// want to store the full transactions as well. Additionally, you want to make sure that everything
    -/// in the chain is consistent with the full transaction data. `ChainGraph` enforces these two
    -/// invariants:
    -///
    -/// 1. Every transaction that is in the chain is also in the graph (you always have the full
    -/// transaction).
    -/// 2. No transactions in the chain conflict with each other, i.e., they don't double spend each
    -/// other or have ancestors that double spend each other.
    -///
    -/// Note that the `ChainGraph` guarantees a 1:1 mapping between transactions in the `chain` and
    -/// `graph` but not the other way around. Transactions may fall out of the *chain* (via re-org or
    -/// mempool eviction) but will remain in the *graph*.
    -#[derive(Clone, Debug, PartialEq)]
    -pub struct ChainGraph<P = TxHeight> {
    -    chain: SparseChain<P>,
    -    graph: TxGraph,
    -}
    -
    -impl<P> Default for ChainGraph<P> {
    -    fn default() -> Self {
    -        Self {
    -            chain: Default::default(),
    -            graph: Default::default(),
    -        }
    -    }
    -}
    -
    -impl<P> AsRef<SparseChain<P>> for ChainGraph<P> {
    -    fn as_ref(&self) -> &SparseChain<P> {
    -        &self.chain
    -    }
    -}
    -
    -impl<P> AsRef<TxGraph> for ChainGraph<P> {
    -    fn as_ref(&self) -> &TxGraph {
    -        &self.graph
    -    }
    -}
    -
    -impl<P> AsRef<ChainGraph<P>> for ChainGraph<P> {
    -    fn as_ref(&self) -> &ChainGraph<P> {
    -        self
    -    }
    -}
    -
    -impl<P> ChainGraph<P> {
    -    /// Returns a reference to the internal [`SparseChain`].
    -    pub fn chain(&self) -> &SparseChain<P> {
    -        &self.chain
    -    }
    -
    -    /// Returns a reference to the internal [`TxGraph`].
    -    pub fn graph(&self) -> &TxGraph {
    -        &self.graph
    -    }
    -}
    -
    -impl<P> ChainGraph<P>
    -where
    -    P: ChainPosition,
    -{
    -    /// Create a new chain graph from a `chain` and a `graph`.
    -    ///
    -    /// There are two reasons this can return an `Err`:
    -    ///
    -    /// 1. There is a transaction in the `chain` that does not have its corresponding full
    -    /// transaction in `graph`.
    -    /// 2. The `chain` has two transactions that are allegedly in it, but they conflict in the `graph`
    -    /// (so could not possibly be in the same chain).
    -    pub fn new(chain: SparseChain<P>, graph: TxGraph) -> Result<Self, NewError<P>> {
    -        let mut missing = HashSet::default();
    -        for (pos, txid) in chain.txids() {
    -            if let Some(tx) = graph.get_tx(*txid) {
    -                let conflict = graph
    -                    .walk_conflicts(tx, |_, txid| Some((chain.tx_position(txid)?.clone(), txid)))
    -                    .next();
    -                if let Some((conflict_pos, conflict)) = conflict {
    -                    return Err(NewError::Conflict {
    -                        a: (pos.clone(), *txid),
    -                        b: (conflict_pos, conflict),
    -                    });
    -                }
    -            } else {
    -                missing.insert(*txid);
    -            }
    -        }
    -
    -        if !missing.is_empty() {
    -            return Err(NewError::Missing(missing));
    -        }
    -
    -        Ok(Self { chain, graph })
    -    }
    -
    -    /// Take an update in the form of a [`SparseChain<P>`][`SparseChain`] and attempt to turn it
    -    /// into a chain graph by filling in full transactions from `self` and from `new_txs`. This
    -    /// returns a `ChainGraph<P, Cow<T>>` where the [`Cow<'a, T>`] will borrow the transaction if it
    -    /// got it from `self`.
    -    ///
    -    /// This is useful when interacting with services like an electrum server which returns a list
    -    /// of txids and heights when calling [`script_get_history`], which can easily be inserted into a
    -    /// [`SparseChain<TxHeight>`][`SparseChain`]. From there, you need to figure out which full
    -    /// transactions you are missing in your chain graph and form `new_txs`. You then use
    -    /// `inflate_update` to turn this into an update `ChainGraph<P, Cow<Transaction>>` and finally
    -    /// use [`determine_changeset`] to generate the changeset from it.
    -    ///
    -    /// [`SparseChain`]: crate::sparse_chain::SparseChain
    -    /// [`Cow<'a, T>`]: std::borrow::Cow
    -    /// [`script_get_history`]: https://docs.rs/electrum-client/latest/electrum_client/trait.ElectrumApi.html#tymethod.script_get_history
    -    /// [`determine_changeset`]: Self::determine_changeset
    -    pub fn inflate_update(
    -        &self,
    -        update: SparseChain<P>,
    -        new_txs: impl IntoIterator<Item = Transaction>,
    -    ) -> Result<ChainGraph<P>, NewError<P>> {
    -        let mut inflated_chain = SparseChain::default();
    -        let mut inflated_graph = TxGraph::default();
    -
    -        for (height, hash) in update.checkpoints().clone().into_iter() {
    -            let _ = inflated_chain
    -                .insert_checkpoint(BlockId { height, hash })
    -                .expect("must insert");
    -        }
    -
    -        // [TODO] @evanlinjin: These need better comments
    -        // - copy transactions that have changed positions into the graph
    -        // - add new transactions to an inflated chain
    -        for (pos, txid) in update.txids() {
    -            match self.chain.tx_position(*txid) {
    -                Some(original_pos) => {
    -                    if original_pos != pos {
    -                        let tx = self
    -                            .graph
    -                            .get_tx(*txid)
    -                            .expect("tx must exist as it is referenced in sparsechain")
    -                            .clone();
    -                        let _ = inflated_chain
    -                            .insert_tx(*txid, pos.clone())
    -                            .expect("must insert since this was already in update");
    -                        let _ = inflated_graph.insert_tx(tx);
    -                    }
    -                }
    -                None => {
    -                    let _ = inflated_chain
    -                        .insert_tx(*txid, pos.clone())
    -                        .expect("must insert since this was already in update");
    -                }
    -            }
    -        }
    -
    -        for tx in new_txs {
    -            let _ = inflated_graph.insert_tx(tx);
    -        }
    -
    -        ChainGraph::new(inflated_chain, inflated_graph)
    -    }
    -
    -    /// Gets the checkpoint limit.
    -    ///
    -    /// Refer to [`SparseChain::checkpoint_limit`] for more.
    -    pub fn checkpoint_limit(&self) -> Option<usize> {
    -        self.chain.checkpoint_limit()
    -    }
    -
    -    /// Sets the checkpoint limit.
    -    ///
    -    /// Refer to [`SparseChain::set_checkpoint_limit`] for more.
    -    pub fn set_checkpoint_limit(&mut self, limit: Option<usize>) {
    -        self.chain.set_checkpoint_limit(limit)
    -    }
    -
    -    /// Determines the changes required to invalidate checkpoints `from_height` (inclusive) and
    -    /// above. Displaced transactions will have their positions moved to [`TxHeight::Unconfirmed`].
    -    pub fn invalidate_checkpoints_preview(&self, from_height: u32) -> ChangeSet<P> {
    -        ChangeSet {
    -            chain: self.chain.invalidate_checkpoints_preview(from_height),
    -            ..Default::default()
    -        }
    -    }
    -
    -    /// Invalidate checkpoints `from_height` (inclusive) and above. Displaced transactions will be
    -    /// re-positioned to [`TxHeight::Unconfirmed`].
    -    ///
    -    /// This is equivalent to calling [`Self::invalidate_checkpoints_preview`] and
    -    /// [`Self::apply_changeset`] in sequence.
    -    pub fn invalidate_checkpoints(&mut self, from_height: u32) -> ChangeSet<P>
    -    where
    -        ChangeSet<P>: Clone,
    -    {
    -        let changeset = self.invalidate_checkpoints_preview(from_height);
    -        self.apply_changeset(changeset.clone());
    -        changeset
    -    }
    -
    -    /// Get a transaction currently in the underlying [`SparseChain`].
    -    ///
    -    /// This does not necessarily mean that it is *confirmed* in the blockchain; it might just be in
    -    /// the unconfirmed transaction list within the [`SparseChain`].
    -    pub fn get_tx_in_chain(&self, txid: Txid) -> Option<(&P, &Transaction)> {
    -        let position = self.chain.tx_position(txid)?;
    -        let full_tx = self.graph.get_tx(txid).expect("must exist");
    -        Some((position, full_tx))
    -    }
    -
    -    /// Determines the changes required to insert a transaction into the inner [`ChainGraph`] and
    -    /// [`SparseChain`] at the given `position`.
    -    ///
    -    /// If inserting it into the chain `position` will result in conflicts, the returned
    -    /// [`ChangeSet`] should evict conflicting transactions.
    -    pub fn insert_tx_preview(
    -        &self,
    -        tx: Transaction,
    -        pos: P,
    -    ) -> Result<ChangeSet<P>, InsertTxError<P>> {
    -        let mut changeset = ChangeSet {
    -            chain: self.chain.insert_tx_preview(tx.txid(), pos)?,
    -            graph: self.graph.insert_tx_preview(tx),
    -        };
    -        self.fix_conflicts(&mut changeset)?;
    -        Ok(changeset)
    -    }
    -
    -    /// Inserts [`Transaction`] at the given chain position.
    -    ///
    -    /// This is equivalent to calling [`Self::insert_tx_preview`] and [`Self::apply_changeset`] in
    -    /// sequence.
    -    pub fn insert_tx(&mut self, tx: Transaction, pos: P) -> Result<ChangeSet<P>, InsertTxError<P>> {
    -        let changeset = self.insert_tx_preview(tx, pos)?;
    -        self.apply_changeset(changeset.clone());
    -        Ok(changeset)
    -    }
    -
    -    /// Determines the changes required to insert a [`TxOut`] into the internal [`TxGraph`].
    -    pub fn insert_txout_preview(&self, outpoint: OutPoint, txout: TxOut) -> ChangeSet<P> {
    -        ChangeSet {
    -            chain: Default::default(),
    -            graph: self.graph.insert_txout_preview(outpoint, txout),
    -        }
    -    }
    -
    -    /// Inserts a [`TxOut`] into the internal [`TxGraph`].
    -    ///
    -    /// This is equivalent to calling [`Self::insert_txout_preview`] and [`Self::apply_changeset`]
    -    /// in sequence.
    -    pub fn insert_txout(&mut self, outpoint: OutPoint, txout: TxOut) -> ChangeSet<P> {
    -        let changeset = self.insert_txout_preview(outpoint, txout);
    -        self.apply_changeset(changeset.clone());
    -        changeset
    -    }
    -
    -    /// Determines the changes required to insert a `block_id` (a height and block hash) into the
    -    /// chain.
    -    ///
    -    /// If a checkpoint with a different hash already exists at that height, this will return an error.
    -    pub fn insert_checkpoint_preview(
    -        &self,
    -        block_id: BlockId,
    -    ) -> Result<ChangeSet<P>, InsertCheckpointError> {
    -        self.chain
    -            .insert_checkpoint_preview(block_id)
    -            .map(|chain_changeset| ChangeSet {
    -                chain: chain_changeset,
    -                ..Default::default()
    -            })
    -    }
    -
    -    /// Inserts checkpoint into [`Self`].
    -    ///
    -    /// This is equivalent to calling [`Self::insert_checkpoint_preview`] and
    -    /// [`Self::apply_changeset`] in sequence.
    -    pub fn insert_checkpoint(
    -        &mut self,
    -        block_id: BlockId,
    -    ) -> Result<ChangeSet<P>, InsertCheckpointError> {
    -        let changeset = self.insert_checkpoint_preview(block_id)?;
    -        self.apply_changeset(changeset.clone());
    -        Ok(changeset)
    -    }
    -
    -    /// Calculates the difference between self and `update` in the form of a [`ChangeSet`].
    -    pub fn determine_changeset(
    -        &self,
    -        update: &ChainGraph<P>,
    -    ) -> Result<ChangeSet<P>, UpdateError<P>> {
    -        let chain_changeset = self
    -            .chain
    -            .determine_changeset(&update.chain)
    -            .map_err(UpdateError::Chain)?;
    -
    -        let mut changeset = ChangeSet {
    -            chain: chain_changeset,
    -            graph: self.graph.determine_additions(&update.graph),
    -        };
    -
    -        self.fix_conflicts(&mut changeset)?;
    -        Ok(changeset)
    -    }
    -
    -    /// Given a transaction, return an iterator of `txid`s that conflict with it (spends at least
    -    /// one of the same inputs). This iterator includes all descendants of conflicting transactions.
    -    ///
    -    /// This method only returns conflicts that exist in the [`SparseChain`] as transactions that
    -    /// are not included in [`SparseChain`] are already considered as evicted.
    -    pub fn tx_conflicts_in_chain<'a>(
    -        &'a self,
    -        tx: &'a Transaction,
    -    ) -> impl Iterator<Item = (&'a P, Txid)> + 'a {
    -        self.graph.walk_conflicts(tx, move |_, conflict_txid| {
    -            self.chain
    -                .tx_position(conflict_txid)
    -                .map(|conflict_pos| (conflict_pos, conflict_txid))
    -        })
    -    }
    -
    -    /// Fix changeset conflicts.
    -    ///
    -    /// **WARNING:** If there are any missing full txs, conflict resolution will not be complete. In
    -    /// debug mode, this will result in panic.
    -    fn fix_conflicts(&self, changeset: &mut ChangeSet<P>) -> Result<(), UnresolvableConflict<P>> {
    -        let mut chain_conflicts = vec![];
    -
    -        for (&txid, pos_change) in &changeset.chain.txids {
    -            let pos = match pos_change {
    -                Some(pos) => {
    -                    // Ignore txs that are still in the chain -- we only care about new ones
    -                    if self.chain.tx_position(txid).is_some() {
    -                        continue;
    -                    }
    -                    pos
    -                }
    -                // Ignore txids that are being deleted by the change (they can't conflict)
    -                None => continue,
    -            };
    -
    -            let mut full_tx = self.graph.get_tx(txid);
    -
    -            if full_tx.is_none() {
    -                full_tx = changeset.graph.tx.iter().find(|tx| tx.txid() == txid)
    -            }
    -
    -            debug_assert!(full_tx.is_some(), "should have full tx at this point");
    -
    -            let full_tx = match full_tx {
    -                Some(full_tx) => full_tx,
    -                None => continue,
    -            };
    -
    -            for (conflict_pos, conflict_txid) in self.tx_conflicts_in_chain(full_tx) {
    -                chain_conflicts.push((pos.clone(), txid, conflict_pos, conflict_txid))
    -            }
    -        }
    -
    -        for (update_pos, update_txid, conflicting_pos, conflicting_txid) in chain_conflicts {
    -            // We have found a tx that conflicts with our update txid. Only allow this when the
    -            // conflicting tx will be positioned as "unconfirmed" after the update is applied.
    -            // If so, we will modify the changeset to evict the conflicting txid.
    -
    -            // determine the position of the conflicting txid after the current changeset is applied
    -            let conflicting_new_pos = changeset
    -                .chain
    -                .txids
    -                .get(&conflicting_txid)
    -                .map(Option::as_ref)
    -                .unwrap_or(Some(conflicting_pos));
    -
    -            match conflicting_new_pos {
    -                None => {
    -                    // conflicting txid will be deleted, can ignore
    -                }
    -                Some(existing_new_pos) => match existing_new_pos.height() {
    -                    TxHeight::Confirmed(_) => {
    -                        // the new position of the conflicting tx is "confirmed", therefore cannot be
    -                        // evicted, return error
    -                        return Err(UnresolvableConflict {
    -                            already_confirmed_tx: (conflicting_pos.clone(), conflicting_txid),
    -                            update_tx: (update_pos, update_txid),
    -                        });
    -                    }
    -                    TxHeight::Unconfirmed => {
    -                        // the new position of the conflicting tx is "unconfirmed", therefore it can
    -                        // be evicted
    -                        changeset.chain.txids.insert(conflicting_txid, None);
    -                    }
    -                },
    -            };
    -        }
    -
    -        Ok(())
    -    }
    -
    -    /// Applies `changeset` to `self`.
    -    ///
    -    /// **Warning** this method assumes that the changeset is correctly formed. If it is not, the
    -    /// chain graph may behave incorrectly in the future and panic unexpectedly.
    -    pub fn apply_changeset(&mut self, changeset: ChangeSet<P>) {
    -        self.chain.apply_changeset(changeset.chain);
    -        self.graph.apply_additions(changeset.graph);
    -    }
    -
    -    /// Applies the `update` chain graph. Note this is shorthand for calling
    -    /// [`Self::determine_changeset()`] and [`Self::apply_changeset()`] in sequence.
    -    pub fn apply_update(&mut self, update: ChainGraph<P>) -> Result<ChangeSet<P>, UpdateError<P>> {
    -        let changeset = self.determine_changeset(&update)?;
    -        self.apply_changeset(changeset.clone());
    -        Ok(changeset)
    -    }
    -
    -    /// Get the full transaction output at an outpoint if it exists in the chain and the graph.
    -    pub fn full_txout(&self, outpoint: OutPoint) -> Option<FullTxOut<P>> {
    -        self.chain.full_txout(&self.graph, outpoint)
    -    }
    -
    -    /// Iterate over the full transactions and their position in the chain ordered by their position
    -    /// in ascending order.
    -    pub fn transactions_in_chain(&self) -> impl DoubleEndedIterator<Item = (&P, &Transaction)> {
    -        self.chain
    -            .txids()
    -            .map(move |(pos, txid)| (pos, self.graph.get_tx(*txid).expect("must exist")))
    -    }
    -
    -    /// Find the transaction in the chain that spends `outpoint`.
    -    ///
    -    /// This uses the input/output relationships in the internal `graph`. Note that the transaction
    -    /// which includes `outpoint` does not need to be in the `graph` or the `chain` for this to
    -    /// return `Some(_)`.
    -    pub fn spent_by(&self, outpoint: OutPoint) -> Option<(&P, Txid)> {
    -        self.chain.spent_by(&self.graph, outpoint)
    -    }
    -
    -    /// Whether the chain graph contains any data whatsoever.
    -    pub fn is_empty(&self) -> bool {
    -        self.chain.is_empty() && self.graph.is_empty()
    -    }
    -}
    -
    -/// Represents changes to [`ChainGraph`].
    -///
    -/// This is essentially a combination of [`sparse_chain::ChangeSet`] and [`tx_graph::Additions`].
    -#[derive(Debug, Clone, PartialEq)]
    -#[cfg_attr(
    -    feature = "serde",
    -    derive(serde::Deserialize, serde::Serialize),
    -    serde(
    -        crate = "serde_crate",
    -        bound(
    -            deserialize = "P: serde::Deserialize<'de>",
    -            serialize = "P: serde::Serialize"
    -        )
    -    )
    -)]
    -#[must_use]
    -pub struct ChangeSet<P> {
    -    pub chain: sparse_chain::ChangeSet<P>,
    -    pub graph: tx_graph::Additions,
    -}
    -
    -impl<P> ChangeSet<P> {
    -    /// Returns `true` if this [`ChangeSet`] records no changes.
    -    pub fn is_empty(&self) -> bool {
    -        self.chain.is_empty() && self.graph.is_empty()
    -    }
    -
    -    /// Returns `true` if this [`ChangeSet`] contains transaction evictions.
    -    pub fn contains_eviction(&self) -> bool {
    -        self.chain
    -            .txids
    -            .iter()
    -            .any(|(_, new_pos)| new_pos.is_none())
    -    }
    -
    -    /// Appends the changes in `other` into self such that applying `self` afterward has the same
    -    /// effect as sequentially applying the original `self` and `other`.
    -    pub fn append(&mut self, other: ChangeSet<P>)
    -    where
    -        P: ChainPosition,
    -    {
    -        self.chain.append(other.chain);
    -        self.graph.append(other.graph);
    -    }
    -}
    -
    -impl<P> Default for ChangeSet<P> {
    -    fn default() -> Self {
    -        Self {
    -            chain: Default::default(),
    -            graph: Default::default(),
    -        }
    -    }
    -}
    -
    -impl<P> ForEachTxOut for ChainGraph<P> {
    -    fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut))) {
    -        self.graph.for_each_txout(f)
    -    }
    -}
    -
    -impl<P> ForEachTxOut for ChangeSet<P> {
    -    fn for_each_txout(&self, f: impl FnMut((OutPoint, &TxOut))) {
    -        self.graph.for_each_txout(f)
    -    }
    -}
    -
    -/// Error that may occur when calling [`ChainGraph::new`].
    -#[derive(Clone, Debug, PartialEq)]
    -pub enum NewError<P> {
    -    /// Two transactions within the sparse chain conflicted with each other
    -    Conflict { a: (P, Txid), b: (P, Txid) },
    -    /// One or more transactions in the chain were not in the graph
    -    Missing(HashSet<Txid>),
    -}
    -
    -impl<P: core::fmt::Debug> core::fmt::Display for NewError<P> {
    -    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
    -        match self {
    -            NewError::Conflict { a, b } => write!(
    -                f,
    -                "Unable to inflate sparse chain to chain graph since transactions {:?} and {:?}",
    -                a, b
    -            ),
    -            NewError::Missing(missing) => write!(
    -                f,
    -                "missing full transactions for {}",
    -                missing
    -                    .iter()
    -                    .map(|txid| txid.to_string())
    -                    .collect::<Vec<_>>()
    -                    .join(", ")
    -            ),
    -        }
    -    }
    -}
    -
    -#[cfg(feature = "std")]
    -impl<P: core::fmt::Debug> std::error::Error for NewError<P> {}
    -
    -/// Error that may occur when inserting a transaction.
    -///
    -/// Refer to [`ChainGraph::insert_tx_preview`] and [`ChainGraph::insert_tx`].
    -#[derive(Clone, Debug, PartialEq)]
    -pub enum InsertTxError<P> {
    -    Chain(sparse_chain::InsertTxError<P>),
    -    UnresolvableConflict(UnresolvableConflict<P>),
    -}
    -
    -impl<P: core::fmt::Debug> core::fmt::Display for InsertTxError<P> {
    -    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
    -        match self {
    -            InsertTxError::Chain(inner) => core::fmt::Display::fmt(inner, f),
    -            InsertTxError::UnresolvableConflict(inner) => core::fmt::Display::fmt(inner, f),
    -        }
    -    }
    -}
    -
    -impl<P> From<sparse_chain::InsertTxError<P>> for InsertTxError<P> {
    -    fn from(inner: sparse_chain::InsertTxError<P>) -> Self {
    -        Self::Chain(inner)
    -    }
    -}
    -
    -#[cfg(feature = "std")]
    -impl<P: core::fmt::Debug> std::error::Error for InsertTxError<P> {}
    -
    -/// A nice alias of [`sparse_chain::InsertCheckpointError`].
    -pub type InsertCheckpointError = sparse_chain::InsertCheckpointError;
    -
    -/// Represents an update failure.
    -#[derive(Clone, Debug, PartialEq)]
    -pub enum UpdateError<P> {
    -    /// The update chain was inconsistent with the existing chain
    -    Chain(sparse_chain::UpdateError<P>),
    -    /// A transaction in the update spent the same input as an already confirmed transaction
    -    UnresolvableConflict(UnresolvableConflict<P>),
    -}
    -
    -impl<P: core::fmt::Debug> core::fmt::Display for UpdateError<P> {
    -    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
    -        match self {
    -            UpdateError::Chain(inner) => core::fmt::Display::fmt(inner, f),
    -            UpdateError::UnresolvableConflict(inner) => core::fmt::Display::fmt(inner, f),
    -        }
    -    }
    -}
    -
    -impl<P> From<sparse_chain::UpdateError<P>> for UpdateError<P> {
    -    fn from(inner: sparse_chain::UpdateError<P>) -> Self {
    -        Self::Chain(inner)
    -    }
    -}
    -
    -#[cfg(feature = "std")]
    -impl<P: core::fmt::Debug> std::error::Error for UpdateError<P> {}
    -
    -/// Represents an unresolvable conflict between an update's transaction and an
    -/// already-confirmed transaction.
    -#[derive(Clone, Debug, PartialEq)]
    -pub struct UnresolvableConflict<P> {
    -    pub already_confirmed_tx: (P, Txid),
    -    pub update_tx: (P, Txid),
    -}
    -
    -impl<P: core::fmt::Debug> core::fmt::Display for UnresolvableConflict<P> {
    -    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
    -        let Self {
    -            already_confirmed_tx,
    -            update_tx,
    -        } = self;
    -        write!(f, "update transaction {} at height {:?} conflicts with an already confirmed transaction {} at height {:?}",
    -            update_tx.1, update_tx.0, already_confirmed_tx.1, already_confirmed_tx.0)
    -    }
    -}
    -
    -impl<P> From<UnresolvableConflict<P>> for UpdateError<P> {
    -    fn from(inner: UnresolvableConflict<P>) -> Self {
    -        Self::UnresolvableConflict(inner)
    -    }
    -}
    -
    -impl<P> From<UnresolvableConflict<P>> for InsertTxError<P> {
    -    fn from(inner: UnresolvableConflict<P>) -> Self {
    -        Self::UnresolvableConflict(inner)
    -    }
    -}
    -
    -#[cfg(feature = "std")]
    -impl<P: core::fmt::Debug> std::error::Error for UnresolvableConflict<P> {}
    -
    -
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_oracle.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_oracle.rs.html index 52393d0091..8988dc1707 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_oracle.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/chain_oracle.rs.html @@ -20,6 +20,9 @@ 20 21 22 +23 +24 +25
    use crate::BlockId;
     
     /// Represents a service that tracks the blockchain.
    @@ -41,6 +44,9 @@
             block: BlockId,
             chain_tip: BlockId,
         ) -> Result<Option<bool>, Self::Error>;
    +
    +    /// Get the best chain's chain tip.
    +    fn get_chain_tip(&self) -> Result<Option<BlockId>, Self::Error>;
     }
     
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/indexed_tx_graph.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/indexed_tx_graph.rs.html index 8aa29b5c27..367a9109d7 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 @@ -220,10 +220,38 @@ 220 221 222 -
    use alloc::vec::Vec;
    +223
    +224
    +225
    +226
    +227
    +228
    +229
    +230
    +231
    +232
    +233
    +234
    +235
    +236
    +237
    +238
    +239
    +240
    +241
    +242
    +243
    +244
    +245
    +
    //! Contains the [`IndexedTxGraph`] structure and associated types.
    +//!
    +//! This is essentially a [`TxGraph`] combined with an indexer.
    +
    +use alloc::vec::Vec;
     use bitcoin::{OutPoint, Transaction, TxOut};
     
     use crate::{
    +    keychain::DerivationAdditions,
         tx_graph::{Additions, TxGraph},
         Anchor, Append,
     };
    @@ -272,10 +300,10 @@
     
             self.index.apply_additions(index_additions);
     
    -        for tx in &graph_additions.tx {
    +        for tx in &graph_additions.txs {
                 self.index.index_tx(tx);
             }
    -        for (&outpoint, txout) in &graph_additions.txout {
    +        for (&outpoint, txout) in &graph_additions.txouts {
                 self.index.index_txout(outpoint, txout);
             }
     
    @@ -294,10 +322,10 @@
             let graph_additions = self.graph.apply_update(update);
     
             let mut index_additions = I::Additions::default();
    -        for added_tx in &graph_additions.tx {
    +        for added_tx in &graph_additions.txs {
                 index_additions.append(self.index.index_tx(added_tx));
             }
    -        for (&added_outpoint, added_txout) in &graph_additions.txout {
    +        for (&added_outpoint, added_txout) in &graph_additions.txouts {
                 index_additions.append(self.index.index_txout(added_outpoint, added_txout));
             }
     
    @@ -425,6 +453,24 @@
         }
     }
     
    +impl<A, IA: Default> From<Additions<A>> for IndexedAdditions<A, IA> {
    +    fn from(graph_additions: Additions<A>) -> Self {
    +        Self {
    +            graph_additions,
    +            ..Default::default()
    +        }
    +    }
    +}
    +
    +impl<A, K> From<DerivationAdditions<K>> for IndexedAdditions<A, DerivationAdditions<K>> {
    +    fn from(index_additions: DerivationAdditions<K>) -> Self {
    +        Self {
    +            graph_additions: Default::default(),
    +            index_additions,
    +        }
    +    }
    +}
    +
     /// Represents a structure that can index transaction data.
     pub trait Indexer {
         /// The resultant "additions" when new transaction data is indexed.
    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain.rs.html
    index 9d0b080271..c0152587d4 100644
    --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain.rs.html
    +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain.rs.html
    @@ -264,54 +264,6 @@
     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
     
    //! Module for keychain related structures.
     //!
     //! A keychain here is a set of application-defined indexes for a miniscript descriptor where we can
    @@ -322,29 +274,16 @@
     //! has a `txout` containing an indexed script pubkey). Internally, this uses [`SpkTxOutIndex`], but
     //! also maintains "revealed" and "lookahead" index counts per keychain.
     //!
    -//! [`KeychainTracker`] combines [`ChainGraph`] and [`KeychainTxOutIndex`] and enforces atomic
    -//! changes between both these structures. [`KeychainScan`] is a structure used to update to
    -//! [`KeychainTracker`] and changes made on a [`KeychainTracker`] are reported by
    -//! [`KeychainChangeSet`]s.
    -//!
     //! [`SpkTxOutIndex`]: crate::SpkTxOutIndex
     
     use crate::{
    -    chain_graph::{self, ChainGraph},
         collections::BTreeMap,
    -    sparse_chain::ChainPosition,
    +    indexed_tx_graph::IndexedAdditions,
    +    local_chain::{self, LocalChain},
         tx_graph::TxGraph,
    -    Append, ForEachTxOut,
    +    Anchor, Append,
     };
     
    -#[cfg(feature = "miniscript")]
    -pub mod persist;
    -#[cfg(feature = "miniscript")]
    -pub use persist::*;
    -#[cfg(feature = "miniscript")]
    -mod tracker;
    -#[cfg(feature = "miniscript")]
    -pub use tracker::*;
     #[cfg(feature = "miniscript")]
     mod txout_index;
     #[cfg(feature = "miniscript")]
    @@ -416,116 +355,89 @@
         }
     }
     
    -#[derive(Clone, Debug, PartialEq)]
    -/// An update that includes the last active indexes of each keychain.
    -pub struct KeychainScan<K, P> {
    -    /// The update data in the form of a chain that could be applied
    -    pub update: ChainGraph<P>,
    -    /// The last active indexes of each keychain
    -    pub last_active_indices: BTreeMap<K, u32>,
    +/// A structure to update [`KeychainTxOutIndex`], [`TxGraph`] and [`LocalChain`]
    +/// atomically.
    +#[derive(Debug, Clone, PartialEq)]
    +pub struct LocalUpdate<K, A> {
    +    /// Last active derivation index per keychain (`K`).
    +    pub keychain: BTreeMap<K, u32>,
    +    /// Update for the [`TxGraph`].
    +    pub graph: TxGraph<A>,
    +    /// Update for the [`LocalChain`].
    +    pub chain: LocalChain,
     }
     
    -impl<K, P> Default for KeychainScan<K, P> {
    +impl<K, A> Default for LocalUpdate<K, A> {
         fn default() -> Self {
             Self {
    -            update: Default::default(),
    -            last_active_indices: Default::default(),
    -        }
    -    }
    -}
    -
    -impl<K, P> From<ChainGraph<P>> for KeychainScan<K, P> {
    -    fn from(update: ChainGraph<P>) -> Self {
    -        KeychainScan {
    -            update,
    -            last_active_indices: Default::default(),
    +            keychain: Default::default(),
    +            graph: Default::default(),
    +            chain: Default::default(),
             }
         }
     }
     
    -/// Represents changes to a [`KeychainTracker`].
    -///
    -/// This is essentially a combination of [`DerivationAdditions`] and [`chain_graph::ChangeSet`].
    -#[derive(Clone, Debug)]
    +/// A structure that records the corresponding changes as result of applying an [`LocalUpdate`].
    +#[derive(Debug, Clone, PartialEq)]
     #[cfg_attr(
         feature = "serde",
         derive(serde::Deserialize, serde::Serialize),
         serde(
             crate = "serde_crate",
             bound(
    -            deserialize = "K: Ord + serde::Deserialize<'de>, P: serde::Deserialize<'de>",
    -            serialize = "K: Ord + serde::Serialize, P: serde::Serialize"
    -        )
    +            deserialize = "K: Ord + serde::Deserialize<'de>, A: Ord + serde::Deserialize<'de>",
    +            serialize = "K: Ord + serde::Serialize, A: Ord + serde::Serialize",
    +        )
         )
     )]
    -#[must_use]
    -pub struct KeychainChangeSet<K, P> {
    -    /// The changes in local keychain derivation indices
    -    pub derivation_indices: DerivationAdditions<K>,
    -    /// The changes that have occurred in the blockchain
    -    pub chain_graph: chain_graph::ChangeSet<P>,
    +pub struct LocalChangeSet<K, A> {
    +    /// Changes to the [`LocalChain`].
    +    pub chain_changeset: local_chain::ChangeSet,
    +
    +    /// Additions to [`IndexedTxGraph`].
    +    ///
    +    /// [`IndexedTxGraph`]: crate::indexed_tx_graph::IndexedTxGraph
    +    pub indexed_additions: IndexedAdditions<A, DerivationAdditions<K>>,
     }
     
    -impl<K, P> Default for KeychainChangeSet<K, P> {
    +impl<K, A> Default for LocalChangeSet<K, A> {
         fn default() -> Self {
             Self {
    -            chain_graph: Default::default(),
    -            derivation_indices: Default::default(),
    +            chain_changeset: Default::default(),
    +            indexed_additions: Default::default(),
             }
         }
     }
     
    -impl<K, P> KeychainChangeSet<K, P> {
    -    /// Returns whether the [`KeychainChangeSet`] is empty (no changes recorded).
    -    pub fn is_empty(&self) -> bool {
    -        self.chain_graph.is_empty() && self.derivation_indices.is_empty()
    +impl<K: Ord, A: Anchor> Append for LocalChangeSet<K, A> {
    +    fn append(&mut self, other: Self) {
    +        Append::append(&mut self.chain_changeset, other.chain_changeset);
    +        Append::append(&mut self.indexed_additions, other.indexed_additions);
         }
     
    -    /// Appends the changes in `other` into `self` such that applying `self` afterward has the same
    -    /// effect as sequentially applying the original `self` and `other`.
    -    ///
    -    /// Note the derivation indices cannot be decreased, so `other` will only change the derivation
    -    /// index for a keychain, if it's value is higher than the one in `self`.
    -    pub fn append(&mut self, other: KeychainChangeSet<K, P>)
    -    where
    -        K: Ord,
    -        P: ChainPosition,
    -    {
    -        self.derivation_indices.append(other.derivation_indices);
    -        self.chain_graph.append(other.chain_graph);
    +    fn is_empty(&self) -> bool {
    +        self.chain_changeset.is_empty() && self.indexed_additions.is_empty()
         }
     }
     
    -impl<K, P> From<chain_graph::ChangeSet<P>> for KeychainChangeSet<K, P> {
    -    fn from(changeset: chain_graph::ChangeSet<P>) -> Self {
    +impl<K, A> From<local_chain::ChangeSet> for LocalChangeSet<K, A> {
    +    fn from(chain_changeset: local_chain::ChangeSet) -> Self {
             Self {
    -            chain_graph: changeset,
    +            chain_changeset,
                 ..Default::default()
             }
         }
     }
     
    -impl<K, P> From<DerivationAdditions<K>> for KeychainChangeSet<K, P> {
    -    fn from(additions: DerivationAdditions<K>) -> Self {
    +impl<K, A> From<IndexedAdditions<A, DerivationAdditions<K>>> for LocalChangeSet<K, A> {
    +    fn from(indexed_additions: IndexedAdditions<A, DerivationAdditions<K>>) -> Self {
             Self {
    -            derivation_indices: additions,
    +            indexed_additions,
                 ..Default::default()
             }
         }
     }
     
    -impl<K, P> AsRef<TxGraph> for KeychainScan<K, P> {
    -    fn as_ref(&self) -> &TxGraph {
    -        self.update.graph()
    -    }
    -}
    -
    -impl<K, P> ForEachTxOut for KeychainChangeSet<K, P> {
    -    fn for_each_txout(&self, f: impl FnMut((bitcoin::OutPoint, &bitcoin::TxOut))) {
    -        self.chain_graph.for_each_txout(f)
    -    }
    -}
    -
     /// Balance, differentiated into various categories.
     #[derive(Debug, PartialEq, Eq, Clone, Default)]
     #[cfg_attr(
    @@ -584,9 +496,8 @@
     
     #[cfg(test)]
     mod test {
    -    use crate::TxHeight;
    -
         use super::*;
    +
         #[test]
         fn append_keychain_derivation_indices() {
             #[derive(Ord, PartialOrd, Eq, PartialEq, Clone, Debug)]
    @@ -604,26 +515,19 @@
             rhs_di.insert(Keychain::Two, 5);
             lhs_di.insert(Keychain::Three, 3);
             rhs_di.insert(Keychain::Four, 4);
    -        let mut lhs = KeychainChangeSet {
    -            derivation_indices: DerivationAdditions(lhs_di),
    -            chain_graph: chain_graph::ChangeSet::<TxHeight>::default(),
    -        };
    -
    -        let rhs = KeychainChangeSet {
    -            derivation_indices: DerivationAdditions(rhs_di),
    -            chain_graph: chain_graph::ChangeSet::<TxHeight>::default(),
    -        };
     
    +        let mut lhs = DerivationAdditions(lhs_di);
    +        let rhs = DerivationAdditions(rhs_di);
             lhs.append(rhs);
     
             // Exiting index doesn't update if the new index in `other` is lower than `self`.
    -        assert_eq!(lhs.derivation_indices.0.get(&Keychain::One), Some(&7));
    +        assert_eq!(lhs.0.get(&Keychain::One), Some(&7));
             // Existing index updates if the new index in `other` is higher than `self`.
    -        assert_eq!(lhs.derivation_indices.0.get(&Keychain::Two), Some(&5));
    +        assert_eq!(lhs.0.get(&Keychain::Two), Some(&5));
             // Existing index is unchanged if keychain doesn't exist in `other`.
    -        assert_eq!(lhs.derivation_indices.0.get(&Keychain::Three), Some(&3));
    +        assert_eq!(lhs.0.get(&Keychain::Three), Some(&3));
             // New keychain gets added if the keychain is in `other` but not in `self`.
    -        assert_eq!(lhs.derivation_indices.0.get(&Keychain::Four), Some(&4));
    +        assert_eq!(lhs.0.get(&Keychain::Four), Some(&4));
         }
     }
     
    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain/persist.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain/persist.rs.html deleted file mode 100644 index b3150a37c0..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain/persist.rs.html +++ /dev/null @@ -1,218 +0,0 @@ -persist.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
    -
    //! Persistence for changes made to a [`KeychainTracker`].
    -//!
    -//! BDK's [`KeychainTracker`] needs somewhere to persist changes it makes during operation.
    -//! Operations like giving out a new address are crucial to persist so that next time the
    -//! application is loaded, it can find transactions related to that address.
    -//!
    -//! Note that the [`KeychainTracker`] does not read this persisted data during operation since it
    -//! always has a copy in memory.
    -//!
    -//! [`KeychainTracker`]: crate::keychain::KeychainTracker
    -
    -use crate::{keychain, sparse_chain::ChainPosition};
    -
    -/// `Persist` wraps a [`PersistBackend`] to create a convenient staging area for changes before they
    -/// are persisted. Not all changes made to the [`KeychainTracker`] need to be written to disk right
    -/// away so you can use [`Persist::stage`] to *stage* it first and then [`Persist::commit`] to
    -/// finally, write it to disk.
    -///
    -/// [`KeychainTracker`]: keychain::KeychainTracker
    -#[derive(Debug)]
    -pub struct Persist<K, P, B> {
    -    backend: B,
    -    stage: keychain::KeychainChangeSet<K, P>,
    -}
    -
    -impl<K, P, B> Persist<K, P, B> {
    -    /// Create a new `Persist` from a [`PersistBackend`].
    -    pub fn new(backend: B) -> Self {
    -        Self {
    -            backend,
    -            stage: Default::default(),
    -        }
    -    }
    -
    -    /// Stage a `changeset` to later persistence with [`commit`].
    -    ///
    -    /// [`commit`]: Self::commit
    -    pub fn stage(&mut self, changeset: keychain::KeychainChangeSet<K, P>)
    -    where
    -        K: Ord,
    -        P: ChainPosition,
    -    {
    -        self.stage.append(changeset)
    -    }
    -
    -    /// Get the changes that haven't been committed yet
    -    pub fn staged(&self) -> &keychain::KeychainChangeSet<K, P> {
    -        &self.stage
    -    }
    -
    -    /// Commit the staged changes to the underlying persistence backend.
    -    ///
    -    /// Returns a backend-defined error if this fails.
    -    pub fn commit(&mut self) -> Result<(), B::WriteError>
    -    where
    -        B: PersistBackend<K, P>,
    -    {
    -        self.backend.append_changeset(&self.stage)?;
    -        self.stage = Default::default();
    -        Ok(())
    -    }
    -}
    -
    -/// A persistence backend for [`Persist`].
    -pub trait PersistBackend<K, P> {
    -    /// The error the backend returns when it fails to write.
    -    type WriteError: core::fmt::Debug;
    -
    -    /// The error the backend returns when it fails to load.
    -    type LoadError: core::fmt::Debug;
    -
    -    /// Appends a new changeset to the persistent backend.
    -    ///
    -    /// It is up to the backend what it does with this. It could store every changeset in a list or
    -    /// it inserts the actual changes into a more structured database. All it needs to guarantee is
    -    /// that [`load_into_keychain_tracker`] restores a keychain tracker to what it should be if all
    -    /// changesets had been applied sequentially.
    -    ///
    -    /// [`load_into_keychain_tracker`]: Self::load_into_keychain_tracker
    -    fn append_changeset(
    -        &mut self,
    -        changeset: &keychain::KeychainChangeSet<K, P>,
    -    ) -> Result<(), Self::WriteError>;
    -
    -    /// Applies all the changesets the backend has received to `tracker`.
    -    fn load_into_keychain_tracker(
    -        &mut self,
    -        tracker: &mut keychain::KeychainTracker<K, P>,
    -    ) -> Result<(), Self::LoadError>;
    -}
    -
    -impl<K, P> PersistBackend<K, P> for () {
    -    type WriteError = ();
    -    type LoadError = ();
    -
    -    fn append_changeset(
    -        &mut self,
    -        _changeset: &keychain::KeychainChangeSet<K, P>,
    -    ) -> Result<(), Self::WriteError> {
    -        Ok(())
    -    }
    -    fn load_into_keychain_tracker(
    -        &mut self,
    -        _tracker: &mut keychain::KeychainTracker<K, P>,
    -    ) -> Result<(), Self::LoadError> {
    -        Ok(())
    -    }
    -}
    -
    -
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain/tracker.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain/tracker.rs.html deleted file mode 100644 index 796f2a96a6..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain/tracker.rs.html +++ /dev/null @@ -1,618 +0,0 @@ -tracker.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
    -
    use bitcoin::Transaction;
    -use miniscript::{Descriptor, DescriptorPublicKey};
    -
    -use crate::{
    -    chain_graph::{self, ChainGraph},
    -    collections::*,
    -    keychain::{KeychainChangeSet, KeychainScan, KeychainTxOutIndex},
    -    sparse_chain::{self, SparseChain},
    -    tx_graph::TxGraph,
    -    BlockId, FullTxOut, TxHeight,
    -};
    -
    -use super::{Balance, DerivationAdditions};
    -
    -/// A convenient combination of a [`KeychainTxOutIndex`] and a [`ChainGraph`].
    -///
    -/// The [`KeychainTracker`] atomically updates its [`KeychainTxOutIndex`] whenever new chain data is
    -/// incorporated into its internal [`ChainGraph`].
    -#[derive(Clone, Debug)]
    -pub struct KeychainTracker<K, P> {
    -    /// Index between script pubkeys to transaction outputs
    -    pub txout_index: KeychainTxOutIndex<K>,
    -    chain_graph: ChainGraph<P>,
    -}
    -
    -impl<K, P> KeychainTracker<K, P>
    -where
    -    P: sparse_chain::ChainPosition,
    -    K: Ord + Clone + core::fmt::Debug,
    -{
    -    /// Add a keychain to the tracker's `txout_index` with a descriptor to derive addresses.
    -    /// This is just shorthand for calling [`KeychainTxOutIndex::add_keychain`] on the internal
    -    /// `txout_index`.
    -    ///
    -    /// Adding a keychain means you will be able to derive new script pubkeys under that keychain
    -    /// and the tracker will discover transaction outputs with those script pubkeys.
    -    pub fn add_keychain(&mut self, keychain: K, descriptor: Descriptor<DescriptorPublicKey>) {
    -        self.txout_index.add_keychain(keychain, descriptor)
    -    }
    -
    -    /// Get the internal map of keychains to their descriptors. This is just shorthand for calling
    -    /// [`KeychainTxOutIndex::keychains`] on the internal `txout_index`.
    -    pub fn keychains(&mut self) -> &BTreeMap<K, Descriptor<DescriptorPublicKey>> {
    -        self.txout_index.keychains()
    -    }
    -
    -    /// Get the checkpoint limit of the internal [`SparseChain`].
    -    ///
    -    /// Refer to [`SparseChain::checkpoint_limit`] for more.
    -    pub fn checkpoint_limit(&self) -> Option<usize> {
    -        self.chain_graph.checkpoint_limit()
    -    }
    -
    -    /// Set the checkpoint limit of the internal [`SparseChain`].
    -    ///
    -    /// Refer to [`SparseChain::set_checkpoint_limit`] for more.
    -    pub fn set_checkpoint_limit(&mut self, limit: Option<usize>) {
    -        self.chain_graph.set_checkpoint_limit(limit)
    -    }
    -
    -    /// Determines the resultant [`KeychainChangeSet`] if the given [`KeychainScan`] is applied.
    -    ///
    -    /// Internally, we call [`ChainGraph::determine_changeset`] and also determine the additions of
    -    /// [`KeychainTxOutIndex`].
    -    pub fn determine_changeset(
    -        &self,
    -        scan: &KeychainScan<K, P>,
    -    ) -> Result<KeychainChangeSet<K, P>, chain_graph::UpdateError<P>> {
    -        // TODO: `KeychainTxOutIndex::determine_additions`
    -        let mut derivation_indices = scan.last_active_indices.clone();
    -        derivation_indices.retain(|keychain, index| {
    -            match self.txout_index.last_revealed_index(keychain) {
    -                Some(existing) => *index > existing,
    -                None => true,
    -            }
    -        });
    -
    -        Ok(KeychainChangeSet {
    -            derivation_indices: DerivationAdditions(derivation_indices),
    -            chain_graph: self.chain_graph.determine_changeset(&scan.update)?,
    -        })
    -    }
    -
    -    /// Directly applies a [`KeychainScan`] on [`KeychainTracker`].
    -    ///
    -    /// This is equivalent to calling [`determine_changeset`] and [`apply_changeset`] in sequence.
    -    ///
    -    /// [`determine_changeset`]: Self::determine_changeset
    -    /// [`apply_changeset`]: Self::apply_changeset
    -    pub fn apply_update(
    -        &mut self,
    -        scan: KeychainScan<K, P>,
    -    ) -> Result<KeychainChangeSet<K, P>, chain_graph::UpdateError<P>> {
    -        let changeset = self.determine_changeset(&scan)?;
    -        self.apply_changeset(changeset.clone());
    -        Ok(changeset)
    -    }
    -
    -    /// Applies the changes in `changeset` to [`KeychainTracker`].
    -    ///
    -    /// Internally, this calls [`KeychainTxOutIndex::apply_additions`] and
    -    /// [`ChainGraph::apply_changeset`] in sequence.
    -    pub fn apply_changeset(&mut self, changeset: KeychainChangeSet<K, P>) {
    -        let KeychainChangeSet {
    -            derivation_indices,
    -            chain_graph,
    -        } = changeset;
    -        self.txout_index.apply_additions(derivation_indices);
    -        let _ = self.txout_index.scan(&chain_graph);
    -        self.chain_graph.apply_changeset(chain_graph)
    -    }
    -
    -    /// Iterates through [`FullTxOut`]s that are considered to exist in our representation of the
    -    /// blockchain/mempool.
    -    ///
    -    /// In other words, these are `txout`s of confirmed and in-mempool transactions, based on our
    -    /// view of the blockchain/mempool.
    -    pub fn full_txouts(&self) -> impl Iterator<Item = (&(K, u32), FullTxOut<P>)> + '_ {
    -        self.txout_index
    -            .txouts()
    -            .filter_map(move |(spk_i, op, _)| Some((spk_i, self.chain_graph.full_txout(op)?)))
    -    }
    -
    -    /// Iterates through [`FullTxOut`]s that are unspent outputs.
    -    ///
    -    /// Refer to [`full_txouts`] for more.
    -    ///
    -    /// [`full_txouts`]: Self::full_txouts
    -    pub fn full_utxos(&self) -> impl Iterator<Item = (&(K, u32), FullTxOut<P>)> + '_ {
    -        self.full_txouts()
    -            .filter(|(_, txout)| txout.spent_by.is_none())
    -    }
    -
    -    /// Returns a reference to the internal [`ChainGraph`].
    -    pub fn chain_graph(&self) -> &ChainGraph<P> {
    -        &self.chain_graph
    -    }
    -
    -    /// Returns a reference to the internal [`TxGraph`] (which is part of the [`ChainGraph`]).
    -    pub fn graph(&self) -> &TxGraph {
    -        self.chain_graph().graph()
    -    }
    -
    -    /// Returns a reference to the internal [`SparseChain`] (which is part of the [`ChainGraph`]).
    -    pub fn chain(&self) -> &SparseChain<P> {
    -        self.chain_graph().chain()
    -    }
    -
    -    /// Determines the changes as a result of inserting `block_id` (a height and block hash) into the
    -    /// tracker.
    -    ///
    -    /// The caller is responsible for guaranteeing that a block exists at that height. If a
    -    /// checkpoint already exists at that height with a different hash; this will return an error.
    -    /// Otherwise it will return `Ok(true)` if the checkpoint didn't already exist or `Ok(false)`
    -    /// if it did.
    -    ///
    -    /// **Warning**: This function modifies the internal state of the tracker. You are responsible
    -    /// for persisting these changes to disk if you need to restore them.
    -    pub fn insert_checkpoint_preview(
    -        &self,
    -        block_id: BlockId,
    -    ) -> Result<KeychainChangeSet<K, P>, chain_graph::InsertCheckpointError> {
    -        Ok(KeychainChangeSet {
    -            chain_graph: self.chain_graph.insert_checkpoint_preview(block_id)?,
    -            ..Default::default()
    -        })
    -    }
    -
    -    /// Directly insert a `block_id` into the tracker.
    -    ///
    -    /// This is equivalent of calling [`insert_checkpoint_preview`] and [`apply_changeset`] in
    -    /// sequence.
    -    ///
    -    /// [`insert_checkpoint_preview`]: Self::insert_checkpoint_preview
    -    /// [`apply_changeset`]: Self::apply_changeset
    -    pub fn insert_checkpoint(
    -        &mut self,
    -        block_id: BlockId,
    -    ) -> Result<KeychainChangeSet<K, P>, chain_graph::InsertCheckpointError> {
    -        let changeset = self.insert_checkpoint_preview(block_id)?;
    -        self.apply_changeset(changeset.clone());
    -        Ok(changeset)
    -    }
    -
    -    /// Determines the changes as a result of inserting a transaction into the inner [`ChainGraph`]
    -    /// and optionally into the inner chain at `position`.
    -    ///
    -    /// **Warning**: This function modifies the internal state of the chain graph. You are
    -    /// responsible for persisting these changes to disk if you need to restore them.
    -    pub fn insert_tx_preview(
    -        &self,
    -        tx: Transaction,
    -        pos: P,
    -    ) -> Result<KeychainChangeSet<K, P>, chain_graph::InsertTxError<P>> {
    -        Ok(KeychainChangeSet {
    -            chain_graph: self.chain_graph.insert_tx_preview(tx, pos)?,
    -            ..Default::default()
    -        })
    -    }
    -
    -    /// Directly insert a transaction into the inner [`ChainGraph`] and optionally into the inner
    -    /// chain at `position`.
    -    ///
    -    /// This is equivalent of calling [`insert_tx_preview`] and [`apply_changeset`] in sequence.
    -    ///
    -    /// [`insert_tx_preview`]: Self::insert_tx_preview
    -    /// [`apply_changeset`]: Self::apply_changeset
    -    pub fn insert_tx(
    -        &mut self,
    -        tx: Transaction,
    -        pos: P,
    -    ) -> Result<KeychainChangeSet<K, P>, chain_graph::InsertTxError<P>> {
    -        let changeset = self.insert_tx_preview(tx, pos)?;
    -        self.apply_changeset(changeset.clone());
    -        Ok(changeset)
    -    }
    -
    -    /// Returns the *balance* of the keychain, i.e., the value of unspent transaction outputs tracked.
    -    ///
    -    /// The caller provides a `should_trust` predicate which must decide whether the value of
    -    /// unconfirmed outputs on this keychain are guaranteed to be realized or not. For example:
    -    ///
    -    /// - For an *internal* (change) keychain, `should_trust` should generally be `true` since even if
    -    /// you lose an internal output due to eviction, you will always gain back the value from whatever output the
    -    /// unconfirmed transaction was spending (since that output is presumably from your wallet).
    -    /// - For an *external* keychain, you might want `should_trust` to return  `false` since someone may cancel (by double spending)
    -    /// a payment made to addresses on that keychain.
    -    ///
    -    /// When in doubt set `should_trust` to return false. This doesn't do anything other than change
    -    /// where the unconfirmed output's value is accounted for in `Balance`.
    -    pub fn balance(&self, mut should_trust: impl FnMut(&K) -> bool) -> Balance {
    -        let mut immature = 0;
    -        let mut trusted_pending = 0;
    -        let mut untrusted_pending = 0;
    -        let mut confirmed = 0;
    -        let last_sync_height = self.chain().latest_checkpoint().map(|latest| latest.height);
    -        for ((keychain, _), utxo) in self.full_utxos() {
    -            let chain_position = &utxo.chain_position;
    -
    -            match chain_position.height() {
    -                TxHeight::Confirmed(_) => {
    -                    if utxo.is_on_coinbase {
    -                        if utxo.is_mature(
    -                            last_sync_height
    -                                .expect("since it's confirmed we must have a checkpoint"),
    -                        ) {
    -                            confirmed += utxo.txout.value;
    -                        } else {
    -                            immature += utxo.txout.value;
    -                        }
    -                    } else {
    -                        confirmed += utxo.txout.value;
    -                    }
    -                }
    -                TxHeight::Unconfirmed => {
    -                    if should_trust(keychain) {
    -                        trusted_pending += utxo.txout.value;
    -                    } else {
    -                        untrusted_pending += utxo.txout.value;
    -                    }
    -                }
    -            }
    -        }
    -
    -        Balance {
    -            immature,
    -            trusted_pending,
    -            untrusted_pending,
    -            confirmed,
    -        }
    -    }
    -
    -    /// Returns the balance of all spendable confirmed unspent outputs of this tracker at a
    -    /// particular height.
    -    pub fn balance_at(&self, height: u32) -> u64 {
    -        self.full_txouts()
    -            .filter(|(_, full_txout)| full_txout.is_spendable_at(height))
    -            .map(|(_, full_txout)| full_txout.txout.value)
    -            .sum()
    -    }
    -}
    -
    -impl<K, P> Default for KeychainTracker<K, P> {
    -    fn default() -> Self {
    -        Self {
    -            txout_index: Default::default(),
    -            chain_graph: Default::default(),
    -        }
    -    }
    -}
    -
    -impl<K, P> AsRef<SparseChain<P>> for KeychainTracker<K, P> {
    -    fn as_ref(&self) -> &SparseChain<P> {
    -        self.chain_graph.chain()
    -    }
    -}
    -
    -impl<K, P> AsRef<TxGraph> for KeychainTracker<K, P> {
    -    fn as_ref(&self) -> &TxGraph {
    -        self.chain_graph.graph()
    -    }
    -}
    -
    -impl<K, P> AsRef<ChainGraph<P>> for KeychainTracker<K, P> {
    -    fn as_ref(&self) -> &ChainGraph<P> {
    -        &self.chain_graph
    -    }
    -}
    -
    -
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain/txout_index.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain/txout_index.rs.html index 41ec623f55..22e2cca691 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain/txout_index.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/keychain/txout_index.rs.html @@ -583,6 +583,9 @@ 583 584 585 +586 +587 +588
    use crate::{
         collections::*,
         indexed_tx_graph::Indexer,
    @@ -751,7 +754,10 @@
         ///
         /// This will panic if a different `descriptor` is introduced to the same `keychain`.
         pub fn add_keychain(&mut self, keychain: K, descriptor: Descriptor<DescriptorPublicKey>) {
    -        let old_descriptor = &*self.keychains.entry(keychain).or_insert(descriptor.clone());
    +        let old_descriptor = &*self
    +            .keychains
    +            .entry(keychain)
    +            .or_insert_with(|| descriptor.clone());
             assert_eq!(
                 &descriptor, old_descriptor,
                 "keychain already contains a different descriptor"
    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/lib.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/lib.rs.html
    index 2b119e74eb..f7a502ec67 100644
    --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/lib.rs.html
    +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/lib.rs.html
    @@ -97,6 +97,9 @@
     97
     98
     99
    +100
    +101
    +102
     
    //! This crate is a collection of core structures for [Bitcoin Dev Kit] (alpha release).
     //!
     //! The goal of this crate is to give wallets the mechanisms needed to:
    @@ -116,20 +119,23 @@
     //!    cache or how you fetch it.
     //!
     //! [Bitcoin Dev Kit]: https://bitcoindevkit.org/
    +
     #![no_std]
    +#![warn(missing_docs)]
    +
     pub use bitcoin;
    -pub mod chain_graph;
     mod spk_txout_index;
     pub use spk_txout_index::*;
     mod chain_data;
     pub use chain_data::*;
     pub mod indexed_tx_graph;
    +pub use indexed_tx_graph::IndexedTxGraph;
     pub mod keychain;
     pub mod local_chain;
    -pub mod sparse_chain;
     mod tx_data_traits;
     pub mod tx_graph;
     pub use tx_data_traits::*;
    +pub use tx_graph::TxGraph;
     mod chain_oracle;
     pub use chain_oracle::*;
     mod persist;
    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/local_chain.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/local_chain.rs.html
    index 0a82413437..5e88857f5e 100644
    --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/local_chain.rs.html
    +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/local_chain.rs.html
    @@ -238,9 +238,21 @@
     238
     239
     240
    -
    use core::convert::Infallible;
    -
    -use alloc::collections::{BTreeMap, BTreeSet};
    +241
    +242
    +243
    +244
    +245
    +246
    +247
    +248
    +249
    +250
    +
    //! The [`LocalChain`] is a local implementation of [`ChainOracle`].
    +
    +use core::convert::Infallible;
    +
    +use alloc::collections::BTreeMap;
     use bitcoin::BlockHash;
     
     use crate::{BlockId, ChainOracle};
    @@ -274,6 +286,10 @@
                 },
             )
         }
    +
    +    fn get_chain_tip(&self) -> Result<Option<BlockId>, Self::Error> {
    +        Ok(self.tip())
    +    }
     }
     
     impl AsRef<BTreeMap<u32, BlockHash>> for LocalChain {
    @@ -295,7 +311,8 @@
     }
     
     impl LocalChain {
    -    pub fn from_blocks<B>(blocks: B) -> Self
    +    /// Contruct a [`LocalChain`] from a list of [`BlockId`]s.
    +    pub fn from_blocks<B>(blocks: B) -> Self
         where
             B: IntoIterator<Item = BlockId>,
         {
    @@ -309,7 +326,8 @@
             &self.blocks
         }
     
    -    pub fn tip(&self) -> Option<BlockId> {
    +    /// Get the chain tip.
    +    pub fn tip(&self) -> Option<BlockId> {
             self.blocks
                 .iter()
                 .last()
    @@ -394,17 +412,16 @@
             Ok(changeset)
         }
     
    -    pub fn initial_changeset(&self) -> ChangeSet {
    +    /// Derives a [`ChangeSet`] that assumes that there are no preceding changesets.
    +    ///
    +    /// The changeset returned will record additions of all blocks included in [`Self`].
    +    pub fn initial_changeset(&self) -> ChangeSet {
             self.blocks
                 .iter()
                 .map(|(&height, &hash)| (height, Some(hash)))
                 .collect()
         }
     
    -    pub fn heights(&self) -> BTreeSet<u32> {
    -        self.blocks.keys().cloned().collect()
    -    }
    -
         /// Insert a block of [`BlockId`] into the [`LocalChain`].
         ///
         /// # Error
    @@ -461,9 +478,12 @@
     /// Represents a failure when trying to insert a checkpoint into [`LocalChain`].
     #[derive(Clone, Debug, PartialEq)]
     pub struct InsertBlockNotMatchingError {
    -    pub height: u32,
    -    pub original_hash: BlockHash,
    -    pub update_hash: BlockHash,
    +    /// The checkpoints' height.
    +    pub height: u32,
    +    /// Original checkpoint's block hash.
    +    pub original_hash: BlockHash,
    +    /// Update checkpoint's block hash.
    +    pub update_hash: BlockHash,
     }
     
     impl core::fmt::Display for InsertBlockNotMatchingError {
    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/sparse_chain.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/sparse_chain.rs.html
    deleted file mode 100644
    index 105dfcd986..0000000000
    --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/sparse_chain.rs.html
    +++ /dev/null
    @@ -1,2206 +0,0 @@
    -sparse_chain.rs - source
    1
    -2
    -3
    -4
    -5
    -6
    -7
    -8
    -9
    -10
    -11
    -12
    -13
    -14
    -15
    -16
    -17
    -18
    -19
    -20
    -21
    -22
    -23
    -24
    -25
    -26
    -27
    -28
    -29
    -30
    -31
    -32
    -33
    -34
    -35
    -36
    -37
    -38
    -39
    -40
    -41
    -42
    -43
    -44
    -45
    -46
    -47
    -48
    -49
    -50
    -51
    -52
    -53
    -54
    -55
    -56
    -57
    -58
    -59
    -60
    -61
    -62
    -63
    -64
    -65
    -66
    -67
    -68
    -69
    -70
    -71
    -72
    -73
    -74
    -75
    -76
    -77
    -78
    -79
    -80
    -81
    -82
    -83
    -84
    -85
    -86
    -87
    -88
    -89
    -90
    -91
    -92
    -93
    -94
    -95
    -96
    -97
    -98
    -99
    -100
    -101
    -102
    -103
    -104
    -105
    -106
    -107
    -108
    -109
    -110
    -111
    -112
    -113
    -114
    -115
    -116
    -117
    -118
    -119
    -120
    -121
    -122
    -123
    -124
    -125
    -126
    -127
    -128
    -129
    -130
    -131
    -132
    -133
    -134
    -135
    -136
    -137
    -138
    -139
    -140
    -141
    -142
    -143
    -144
    -145
    -146
    -147
    -148
    -149
    -150
    -151
    -152
    -153
    -154
    -155
    -156
    -157
    -158
    -159
    -160
    -161
    -162
    -163
    -164
    -165
    -166
    -167
    -168
    -169
    -170
    -171
    -172
    -173
    -174
    -175
    -176
    -177
    -178
    -179
    -180
    -181
    -182
    -183
    -184
    -185
    -186
    -187
    -188
    -189
    -190
    -191
    -192
    -193
    -194
    -195
    -196
    -197
    -198
    -199
    -200
    -201
    -202
    -203
    -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
    -590
    -591
    -592
    -593
    -594
    -595
    -596
    -597
    -598
    -599
    -600
    -601
    -602
    -603
    -604
    -605
    -606
    -607
    -608
    -609
    -610
    -611
    -612
    -613
    -614
    -615
    -616
    -617
    -618
    -619
    -620
    -621
    -622
    -623
    -624
    -625
    -626
    -627
    -628
    -629
    -630
    -631
    -632
    -633
    -634
    -635
    -636
    -637
    -638
    -639
    -640
    -641
    -642
    -643
    -644
    -645
    -646
    -647
    -648
    -649
    -650
    -651
    -652
    -653
    -654
    -655
    -656
    -657
    -658
    -659
    -660
    -661
    -662
    -663
    -664
    -665
    -666
    -667
    -668
    -669
    -670
    -671
    -672
    -673
    -674
    -675
    -676
    -677
    -678
    -679
    -680
    -681
    -682
    -683
    -684
    -685
    -686
    -687
    -688
    -689
    -690
    -691
    -692
    -693
    -694
    -695
    -696
    -697
    -698
    -699
    -700
    -701
    -702
    -703
    -704
    -705
    -706
    -707
    -708
    -709
    -710
    -711
    -712
    -713
    -714
    -715
    -716
    -717
    -718
    -719
    -720
    -721
    -722
    -723
    -724
    -725
    -726
    -727
    -728
    -729
    -730
    -731
    -732
    -733
    -734
    -735
    -736
    -737
    -738
    -739
    -740
    -741
    -742
    -743
    -744
    -745
    -746
    -747
    -748
    -749
    -750
    -751
    -752
    -753
    -754
    -755
    -756
    -757
    -758
    -759
    -760
    -761
    -762
    -763
    -764
    -765
    -766
    -767
    -768
    -769
    -770
    -771
    -772
    -773
    -774
    -775
    -776
    -777
    -778
    -779
    -780
    -781
    -782
    -783
    -784
    -785
    -786
    -787
    -788
    -789
    -790
    -791
    -792
    -793
    -794
    -795
    -796
    -797
    -798
    -799
    -800
    -801
    -802
    -803
    -804
    -805
    -806
    -807
    -808
    -809
    -810
    -811
    -812
    -813
    -814
    -815
    -816
    -817
    -818
    -819
    -820
    -821
    -822
    -823
    -824
    -825
    -826
    -827
    -828
    -829
    -830
    -831
    -832
    -833
    -834
    -835
    -836
    -837
    -838
    -839
    -840
    -841
    -842
    -843
    -844
    -845
    -846
    -847
    -848
    -849
    -850
    -851
    -852
    -853
    -854
    -855
    -856
    -857
    -858
    -859
    -860
    -861
    -862
    -863
    -864
    -865
    -866
    -867
    -868
    -869
    -870
    -871
    -872
    -873
    -874
    -875
    -876
    -877
    -878
    -879
    -880
    -881
    -882
    -883
    -884
    -885
    -886
    -887
    -888
    -889
    -890
    -891
    -892
    -893
    -894
    -895
    -896
    -897
    -898
    -899
    -900
    -901
    -902
    -903
    -904
    -905
    -906
    -907
    -908
    -909
    -910
    -911
    -912
    -913
    -914
    -915
    -916
    -917
    -918
    -919
    -920
    -921
    -922
    -923
    -924
    -925
    -926
    -927
    -928
    -929
    -930
    -931
    -932
    -933
    -934
    -935
    -936
    -937
    -938
    -939
    -940
    -941
    -942
    -943
    -944
    -945
    -946
    -947
    -948
    -949
    -950
    -951
    -952
    -953
    -954
    -955
    -956
    -957
    -958
    -959
    -960
    -961
    -962
    -963
    -964
    -965
    -966
    -967
    -968
    -969
    -970
    -971
    -972
    -973
    -974
    -975
    -976
    -977
    -978
    -979
    -980
    -981
    -982
    -983
    -984
    -985
    -986
    -987
    -988
    -989
    -990
    -991
    -992
    -993
    -994
    -995
    -996
    -997
    -998
    -999
    -1000
    -1001
    -1002
    -1003
    -1004
    -1005
    -1006
    -1007
    -1008
    -1009
    -1010
    -1011
    -1012
    -1013
    -1014
    -1015
    -1016
    -1017
    -1018
    -1019
    -1020
    -1021
    -1022
    -1023
    -1024
    -1025
    -1026
    -1027
    -1028
    -1029
    -1030
    -1031
    -1032
    -1033
    -1034
    -1035
    -1036
    -1037
    -1038
    -1039
    -1040
    -1041
    -1042
    -1043
    -1044
    -1045
    -1046
    -1047
    -1048
    -1049
    -1050
    -1051
    -1052
    -1053
    -1054
    -1055
    -1056
    -1057
    -1058
    -1059
    -1060
    -1061
    -1062
    -1063
    -1064
    -1065
    -1066
    -1067
    -1068
    -1069
    -1070
    -1071
    -1072
    -1073
    -1074
    -1075
    -1076
    -1077
    -1078
    -1079
    -1080
    -1081
    -1082
    -1083
    -1084
    -1085
    -1086
    -1087
    -1088
    -1089
    -1090
    -1091
    -1092
    -1093
    -1094
    -1095
    -1096
    -1097
    -1098
    -1099
    -1100
    -1101
    -1102
    -
    //! Module for structures that maintain sparse (purposely incomplete) snapshots of blockchain data.
    -//!
    -//! [`SparseChain`] stores [`Txid`]s ordered by an index that implements [`ChainPosition`] (this
    -//! represents the transaction's position in the blockchain; by default, [`TxHeight`] is used).
    -//! [`SparseChain`] also contains "checkpoints" which relate block height to block hash. Changes to
    -//! a [`SparseChain`] is reported by returning [`ChangeSet`]s.
    -//!
    -//! # Updating [`SparseChain`]
    -//!
    -//! A sparsechain can be thought of as a consistent snapshot of history. A [`SparseChain`] can be
    -//! updated by applying an update [`SparseChain`] on top, but only if they "connect" via their
    -//! checkpoints and don't result in unexpected movements of transactions.
    -//!
    -//! ```
    -//! # use bdk_chain::{BlockId, TxHeight, sparse_chain::*, example_utils::*};
    -//! # use bitcoin::BlockHash;
    -//! # let hash_a = new_hash::<BlockHash>("a");
    -//! # let hash_b = new_hash::<BlockHash>("b");
    -//! # let hash_c = new_hash::<BlockHash>("c");
    -//! # let hash_d = new_hash::<BlockHash>("d");
    -//! // create empty sparsechain
    -//! let mut chain = SparseChain::<TxHeight>::default();
    -//!
    -//! /* Updating an empty sparsechain will always succeed */
    -//!
    -//! let update = SparseChain::from_checkpoints(vec![
    -//!     BlockId {
    -//!         height: 1,
    -//!         hash: hash_a,
    -//!     },
    -//!     BlockId {
    -//!         height: 2,
    -//!         hash: hash_b,
    -//!     },
    -//! ]);
    -//! let _ = chain
    -//!     .apply_update(update)
    -//!     .expect("updating an empty sparsechain will always succeed");
    -//!
    -//! /* To update a non-empty sparsechain, the update must connect */
    -//!
    -//! let update = SparseChain::from_checkpoints(vec![
    -//!     BlockId {
    -//!         height: 2,
    -//!         hash: hash_b,
    -//!     },
    -//!     BlockId {
    -//!         height: 3,
    -//!         hash: hash_c,
    -//!     },
    -//! ]);
    -//! let _ = chain
    -//!     .apply_update(update)
    -//!     .expect("we have connected at block height 2, so this must succeed");
    -//! ```
    -//!
    -//! ## Invalid updates
    -//!
    -//! As shown above, sparsechains can be "connected" by comparing their checkpoints. However, there
    -//! are situations where two sparsechains cannot connect in a way that guarantees consistency.
    -//!
    -//! ```
    -//! # use bdk_chain::{BlockId, TxHeight, sparse_chain::*, example_utils::*};
    -//! # use bitcoin::BlockHash;
    -//! # let hash_a = new_hash::<BlockHash>("a");
    -//! # let hash_b = new_hash::<BlockHash>("b");
    -//! # let hash_c = new_hash::<BlockHash>("c");
    -//! # let hash_d = new_hash::<BlockHash>("d");
    -//! // our sparsechain has two checkpoints
    -//! let chain = SparseChain::<TxHeight>::from_checkpoints(vec![
    -//!     BlockId {
    -//!         height: 1,
    -//!         hash: hash_a,
    -//!     },
    -//!     BlockId {
    -//!         height: 2,
    -//!         hash: hash_b,
    -//!     },
    -//! ]);
    -//!
    -//! /* Example of an ambiguous update that does not fully connect */
    -//!
    -//! let ambiguous_update = SparseChain::from_checkpoints(vec![
    -//!     // the update sort of "connects" at checkpoint 1, but...
    -//!     BlockId {
    -//!         height: 1,
    -//!         hash: hash_a,
    -//!     },
    -//!     // we cannot determine whether checkpoint 3 connects with checkpoint 2
    -//!     BlockId {
    -//!         height: 3,
    -//!         hash: hash_c,
    -//!     },
    -//! ]);
    -//! let _ = chain
    -//!     .determine_changeset(&ambiguous_update)
    -//!     .expect_err("cannot apply ambiguous update");
    -//!
    -//! /* Example of an update that completely misses the point */
    -//!
    -//! let disconnected_update = SparseChain::from_checkpoints(vec![
    -//!     // the last checkpoint in the chain is 2, so 3 and 4 do not connect
    -//!     BlockId {
    -//!         height: 3,
    -//!         hash: hash_c,
    -//!     },
    -//!     BlockId {
    -//!         height: 4,
    -//!         hash: hash_d,
    -//!     },
    -//! ]);
    -//! let _ = chain
    -//!     .determine_changeset(&disconnected_update)
    -//!     .expect_err("cannot apply a totally-disconnected update");
    -//! ```
    -//!
    -//! ## Handling reorgs
    -//!
    -//! Updates can be formed to evict data from the original sparsechain. This is useful for handling
    -//! blockchain reorgs.
    -//!
    -//! ```
    -//! # use bdk_chain::{BlockId, TxHeight, sparse_chain::*, example_utils::*};
    -//! # use bitcoin::BlockHash;
    -//! # let hash_a = new_hash::<BlockHash>("a");
    -//! # let hash_b = new_hash::<BlockHash>("b");
    -//! # let hash_c = new_hash::<BlockHash>("c");
    -//! # let hash_d = new_hash::<BlockHash>("d");
    -//! // our chain has a single checkpoint at height 11.
    -//! let mut chain = SparseChain::<TxHeight>::from_checkpoints(vec![BlockId {
    -//!     height: 11,
    -//!     hash: hash_a,
    -//! }]);
    -//!
    -//! // we detect a reorg at height 11, and we introduce a new checkpoint at height 12
    -//! let update = SparseChain::from_checkpoints(vec![
    -//!     BlockId {
    -//!         height: 11,
    -//!         hash: hash_b,
    -//!     },
    -//!     BlockId {
    -//!         height: 12,
    -//!         hash: hash_c,
    -//!     },
    -//! ]);
    -//! let _ = chain
    -//!     .apply_update(update)
    -//!     .expect("we can evict/replace checkpoint 11 since it is the only checkpoint");
    -//!
    -//! // now our `chain` has two checkpoints (11:hash_b & 12:hash_c)
    -//! // we detect another reorg, this time at height 12.
    -//! let update = SparseChain::from_checkpoints(vec![
    -//!     // we connect at checkpoint 11 as this is our "point of agreement".
    -//!     BlockId {
    -//!         height: 11,
    -//!         hash: hash_b,
    -//!     },
    -//!     BlockId {
    -//!         height: 12,
    -//!         hash: hash_d,
    -//!     },
    -//! ]);
    -//! let _ = chain
    -//!     .apply_update(update)
    -//!     .expect("we have provided a valid point of agreement, so our reorg update will succeed");
    -//! ```
    -//!
    -//! ## Movement of transactions during update
    -//!
    -//! If the original sparsechain and update sparsechain contain the same transaction at different
    -//! [`ChainPosition`]s, the transaction is considered as "moved". There are various movements of a
    -//! transaction that are invalid and update will fail.
    -//!
    -//! Valid movements:
    -//!
    -//! * When the transaction moved from unconfirmed (in original) to confirmed (in update). In other
    -//!     words, confirming transactions are allowed!
    -//! * If there has been a reorg at height x, an originally confirmed transaction at height x or
    -//!     above, may move to another height (that is at x or above, including becoming unconfirmed).
    -//!
    -//! Invalid movements:
    -//!
    -//! * A confirmed transaction cannot move without a reorg.
    -//! * Even with a reorg, an originally confirmed transaction cannot be moved below the height of the
    -//!     reorg.
    -//!
    -//! # Custom [`ChainPosition`]
    -//!
    -//! [`SparseChain`] maintains a list of txids ordered by [`ChainPosition`]. By default, [`TxHeight`]
    -//! is used; however, additional data can be incorporated into the implementation.
    -//!
    -//! For example, we can have "perfect ordering" of transactions if our positional index is a
    -//! combination of block height and transaction position in a block.
    -//!
    -//! ```
    -//! # use bdk_chain::{BlockId, TxHeight, sparse_chain::*, example_utils::*};
    -//! # use bitcoin::{BlockHash, Txid};
    -//! # let hash_a = new_hash::<BlockHash>("a");
    -//! # let txid_1 = new_hash::<Txid>("1");
    -//! # let txid_2 = new_hash::<Txid>("2");
    -//! # let txid_3 = new_hash::<Txid>("3");
    -//! #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
    -//! pub enum TxPosition {
    -//!     Confirmed {
    -//!         height: u32,   // height of block
    -//!         position: u32, // position of transaction in the block
    -//!     },
    -//!     Unconfirmed,
    -//! }
    -//!
    -//! impl Default for TxPosition {
    -//!     fn default() -> Self {
    -//!         Self::Unconfirmed
    -//!     }
    -//! }
    -//!
    -//! impl ChainPosition for TxPosition {
    -//!     fn height(&self) -> TxHeight {
    -//!         match self {
    -//!             Self::Confirmed { height, .. } => TxHeight::Confirmed(*height),
    -//!             Self::Unconfirmed => TxHeight::Unconfirmed,
    -//!         }
    -//!     }
    -//!
    -//!     fn max_ord_of_height(height: TxHeight) -> Self {
    -//!         match height {
    -//!             TxHeight::Confirmed(height) => Self::Confirmed {
    -//!                 height,
    -//!                 position: u32::MAX,
    -//!             },
    -//!             TxHeight::Unconfirmed => Self::Unconfirmed,
    -//!         }
    -//!     }
    -//!
    -//!     fn min_ord_of_height(height: TxHeight) -> Self {
    -//!         match height {
    -//!             TxHeight::Confirmed(height) => Self::Confirmed {
    -//!                 height,
    -//!                 position: u32::MIN,
    -//!             },
    -//!             TxHeight::Unconfirmed => Self::Unconfirmed,
    -//!         }
    -//!     }
    -//! }
    -//!
    -//! let mut chain = SparseChain::<TxPosition>::default();
    -//! let _ = chain
    -//!     .insert_checkpoint(BlockId {
    -//!         height: 10,
    -//!         hash: hash_a,
    -//!     })
    -//!     .unwrap();
    -//! let _ = chain
    -//!     .insert_tx(
    -//!         txid_1,
    -//!         TxPosition::Confirmed {
    -//!             height: 9,
    -//!             position: 4321,
    -//!         },
    -//!     )
    -//!     .unwrap();
    -//! let _ = chain
    -//!     .insert_tx(
    -//!         txid_2,
    -//!         TxPosition::Confirmed {
    -//!             height: 9,
    -//!             position: 1234,
    -//!         },
    -//!     )
    -//!     .unwrap();
    -//! let _ = chain
    -//!     .insert_tx(
    -//!         txid_3,
    -//!         TxPosition::Confirmed {
    -//!             height: 10,
    -//!             position: 321,
    -//!         },
    -//!     )
    -//!     .unwrap();
    -//!
    -//! // transactions are ordered correctly
    -//! assert_eq!(
    -//!     chain.txids().collect::<Vec<_>>(),
    -//!     vec![
    -//!         &(
    -//!             TxPosition::Confirmed {
    -//!                 height: 9,
    -//!                 position: 1234
    -//!             },
    -//!             txid_2
    -//!         ),
    -//!         &(
    -//!             TxPosition::Confirmed {
    -//!                 height: 9,
    -//!                 position: 4321
    -//!             },
    -//!             txid_1
    -//!         ),
    -//!         &(
    -//!             TxPosition::Confirmed {
    -//!                 height: 10,
    -//!                 position: 321
    -//!             },
    -//!             txid_3
    -//!         ),
    -//!     ],
    -//! );
    -//! ```
    -use core::{
    -    fmt::Debug,
    -    ops::{Bound, RangeBounds},
    -};
    -
    -use crate::{collections::*, tx_graph::TxGraph, BlockId, FullTxOut, TxHeight};
    -use bitcoin::{hashes::Hash, BlockHash, OutPoint, Txid};
    -
    -/// This is a non-monotone structure that tracks relevant [`Txid`]s that are ordered by chain
    -/// position `P`.
    -///
    -/// We use [`BlockHash`]s alongside their chain height as "checkpoints" to enforce consistency.
    -///
    -/// To "merge" two [`SparseChain`]s, the [`ChangeSet`] can be calculated by calling
    -/// [`determine_changeset`] and applying the [`ChangeSet`] via [`apply_changeset`]. For convenience,
    -/// [`apply_update`] does the above two steps in one call.
    -///
    -/// Refer to [module-level documentation] for more.
    -///
    -/// [`determine_changeset`]: Self::determine_changeset
    -/// [`apply_changeset`]: Self::apply_changeset
    -/// [`apply_update`]: Self::apply_update
    -/// [module-level documentation]: crate::sparse_chain
    -#[derive(Clone, Debug, PartialEq)]
    -pub struct SparseChain<P = TxHeight> {
    -    /// Block height to checkpoint data.
    -    checkpoints: BTreeMap<u32, BlockHash>,
    -    /// Txids ordered by the pos `P`.
    -    ordered_txids: BTreeSet<(P, Txid)>,
    -    /// Confirmation heights of txids.
    -    txid_to_pos: HashMap<Txid, P>,
    -    /// Limit the number of checkpoints.
    -    checkpoint_limit: Option<usize>,
    -}
    -
    -impl<P> AsRef<SparseChain<P>> for SparseChain<P> {
    -    fn as_ref(&self) -> &SparseChain<P> {
    -        self
    -    }
    -}
    -
    -impl<P> Default for SparseChain<P> {
    -    fn default() -> Self {
    -        Self {
    -            checkpoints: Default::default(),
    -            ordered_txids: Default::default(),
    -            txid_to_pos: Default::default(),
    -            checkpoint_limit: Default::default(),
    -        }
    -    }
    -}
    -
    -/// Represents a failure when trying to insert a [`Txid`] into [`SparseChain`].
    -#[derive(Clone, Debug, PartialEq)]
    -pub enum InsertTxError<P> {
    -    /// Occurs when the [`Txid`] is to be inserted at a height higher than the [`SparseChain`]'s tip.
    -    TxTooHigh {
    -        txid: Txid,
    -        tx_height: u32,
    -        tip_height: Option<u32>,
    -    },
    -    /// Occurs when the [`Txid`] is already in the [`SparseChain`], and the insertion would result in
    -    /// an unexpected move in [`ChainPosition`].
    -    TxMovedUnexpectedly {
    -        txid: Txid,
    -        original_pos: P,
    -        update_pos: P,
    -    },
    -}
    -
    -impl<P: core::fmt::Debug> core::fmt::Display for InsertTxError<P> {
    -    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
    -        match self {
    -            InsertTxError::TxTooHigh {
    -                txid,
    -                tx_height,
    -                tip_height,
    -            } => write!(
    -                f,
    -                "txid ({}) cannot be inserted at height ({}) greater than chain tip ({:?})",
    -                txid, tx_height, tip_height
    -            ),
    -            InsertTxError::TxMovedUnexpectedly {
    -                txid,
    -                original_pos,
    -                update_pos,
    -            } => write!(
    -                f,
    -                "txid ({}) insertion resulted in an expected positional move from {:?} to {:?}",
    -                txid, original_pos, update_pos
    -            ),
    -        }
    -    }
    -}
    -
    -#[cfg(feature = "std")]
    -impl<P: core::fmt::Debug> std::error::Error for InsertTxError<P> {}
    -
    -/// Represents a failure when trying to insert a checkpoint into [`SparseChain`].
    -#[derive(Clone, Debug, PartialEq)]
    -pub enum InsertCheckpointError {
    -    /// Occurs when a checkpoint of the same height already exists with a different [`BlockHash`].
    -    HashNotMatching {
    -        height: u32,
    -        original_hash: BlockHash,
    -        update_hash: BlockHash,
    -    },
    -}
    -
    -impl core::fmt::Display for InsertCheckpointError {
    -    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
    -        write!(f, "{:?}", self)
    -    }
    -}
    -
    -#[cfg(feature = "std")]
    -impl std::error::Error for InsertCheckpointError {}
    -
    -/// Represents an update failure of [`SparseChain`].
    -#[derive(Clone, Debug, PartialEq)]
    -pub enum UpdateError<P = TxHeight> {
    -    /// The update cannot be applied to the chain because the chain suffix it represents did not
    -    /// connect to the existing chain. This error case contains the checkpoint height to include so
    -    /// that the chains can connect.
    -    NotConnected(u32),
    -    /// The update contains inconsistent tx states (e.g., it changed the transaction's height). This
    -    /// error is usually the inconsistency found.
    -    TxInconsistent {
    -        txid: Txid,
    -        original_pos: P,
    -        update_pos: P,
    -    },
    -}
    -
    -impl<P: core::fmt::Debug> core::fmt::Display for UpdateError<P> {
    -    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
    -        match self {
    -            Self::NotConnected(h) =>
    -                write!(f, "the checkpoints in the update could not be connected to the checkpoints in the chain, try include checkpoint of height {} to connect",
    -                    h),
    -            Self::TxInconsistent { txid, original_pos, update_pos } =>
    -                write!(f, "tx ({}) had position ({:?}), but is ({:?}) in the update",
    -                    txid, original_pos, update_pos),
    -        }
    -    }
    -}
    -
    -#[cfg(feature = "std")]
    -impl<P: core::fmt::Debug> std::error::Error for UpdateError<P> {}
    -
    -impl<P: ChainPosition> SparseChain<P> {
    -    /// Creates a new chain from a list of block hashes and heights. The caller must guarantee they
    -    /// are in the same chain.
    -    pub fn from_checkpoints<C>(checkpoints: C) -> Self
    -    where
    -        C: IntoIterator<Item = BlockId>,
    -    {
    -        Self {
    -            checkpoints: checkpoints
    -                .into_iter()
    -                .map(|block_id| block_id.into())
    -                .collect(),
    -            ..Default::default()
    -        }
    -    }
    -
    -    /// Get the checkpoint for the last known tip.
    -    pub fn latest_checkpoint(&self) -> Option<BlockId> {
    -        self.checkpoints
    -            .iter()
    -            .last()
    -            .map(|(&height, &hash)| BlockId { height, hash })
    -    }
    -
    -    /// Get the checkpoint at the given height if it exists.
    -    pub fn checkpoint_at(&self, height: u32) -> Option<BlockId> {
    -        self.checkpoints
    -            .get(&height)
    -            .map(|&hash| BlockId { height, hash })
    -    }
    -
    -    /// Return the [`ChainPosition`] of a `txid`.
    -    ///
    -    /// This returns [`None`] if the transaction does not exist.
    -    pub fn tx_position(&self, txid: Txid) -> Option<&P> {
    -        self.txid_to_pos.get(&txid)
    -    }
    -
    -    /// Return a [`BTreeMap`] of all checkpoints (block hashes by height).
    -    pub fn checkpoints(&self) -> &BTreeMap<u32, BlockHash> {
    -        &self.checkpoints
    -    }
    -
    -    /// Return an iterator over checkpoints in a height range, in ascending height order.
    -    pub fn range_checkpoints(
    -        &self,
    -        range: impl RangeBounds<u32>,
    -    ) -> impl DoubleEndedIterator<Item = BlockId> + '_ {
    -        self.checkpoints
    -            .range(range)
    -            .map(|(&height, &hash)| BlockId { height, hash })
    -    }
    -
    -    /// Preview changes of updating [`Self`] with another chain that connects to it.
    -    ///
    -    /// If the `update` wishes to introduce confirmed transactions, it must contain a checkpoint
    -    /// that is exactly the same height as one of `self`'s checkpoints.
    -    ///
    -    /// To invalidate from a given checkpoint, `update` must contain a checkpoint of the same height
    -    /// but different hash. Invalidated checkpoints result in invalidated transactions becoming
    -    /// "unconfirmed".
    -    ///
    -    /// An error will be returned if an update results in inconsistencies or if the update does
    -    /// not correctly connect with `self`.
    -    ///
    -    /// Refer to [module-level documentation] for more.
    -    ///
    -    /// [module-level documentation]: crate::sparse_chain
    -    pub fn determine_changeset(&self, update: &Self) -> Result<ChangeSet<P>, UpdateError<P>> {
    -        let agreement_point = update
    -            .checkpoints
    -            .iter()
    -            .rev()
    -            .find(|&(height, hash)| self.checkpoints.get(height) == Some(hash))
    -            .map(|(&h, _)| h);
    -
    -        let last_update_cp = update.checkpoints.iter().last().map(|(&h, _)| h);
    -
    -        // the lower bound of the invalidation range
    -        let invalid_lb = if last_update_cp.is_none() || last_update_cp == agreement_point {
    -            // if the agreement point is the last update checkpoint, or there are no update checkpoints,
    -            // no invalidation is required
    -            u32::MAX
    -        } else {
    -            agreement_point.map(|h| h + 1).unwrap_or(0)
    -        };
    -
    -        // the first checkpoint of the sparsechain to invalidate (if any)
    -        let invalid_from = self.checkpoints.range(invalid_lb..).next().map(|(&h, _)| h);
    -
    -        // the first checkpoint to invalidate (if any) should be represented in the update
    -        if let Some(first_invalid) = invalid_from {
    -            if !update.checkpoints.contains_key(&first_invalid) {
    -                return Err(UpdateError::NotConnected(first_invalid));
    -            }
    -        }
    -
    -        for (&txid, update_pos) in &update.txid_to_pos {
    -            // ensure all currently confirmed txs are still at the same height (unless they are
    -            // within invalidation range, or to be confirmed)
    -            if let Some(original_pos) = &self.txid_to_pos.get(&txid) {
    -                if original_pos.height() < TxHeight::Confirmed(invalid_lb)
    -                    && original_pos != &update_pos
    -                {
    -                    return Err(UpdateError::TxInconsistent {
    -                        txid,
    -                        original_pos: P::clone(original_pos),
    -                        update_pos: update_pos.clone(),
    -                    });
    -                }
    -            }
    -        }
    -
    -        // create initial change-set based on checkpoints and txids that are to be "invalidated".
    -        let mut changeset = invalid_from
    -            .map(|from_height| self.invalidate_checkpoints_preview(from_height))
    -            .unwrap_or_default();
    -
    -        for (&height, &new_hash) in &update.checkpoints {
    -            let original_hash = self.checkpoints.get(&height).cloned();
    -
    -            let update_hash = *changeset
    -                .checkpoints
    -                .entry(height)
    -                .and_modify(|change| *change = Some(new_hash))
    -                .or_insert_with(|| Some(new_hash));
    -
    -            if original_hash == update_hash {
    -                changeset.checkpoints.remove(&height);
    -            }
    -        }
    -
    -        for (txid, new_pos) in &update.txid_to_pos {
    -            let original_pos = self.txid_to_pos.get(txid).cloned();
    -
    -            let update_pos = changeset
    -                .txids
    -                .entry(*txid)
    -                .and_modify(|change| *change = Some(new_pos.clone()))
    -                .or_insert_with(|| Some(new_pos.clone()));
    -
    -            if original_pos == *update_pos {
    -                changeset.txids.remove(txid);
    -            }
    -        }
    -
    -        Ok(changeset)
    -    }
    -
    -    /// Updates [`SparseChain`] with another chain that connects to it.
    -    ///
    -    /// This is equivilant to calling [`determine_changeset`] and [`apply_changeset`] in sequence.
    -    ///
    -    /// [`determine_changeset`]: Self::determine_changeset
    -    /// [`apply_changeset`]: Self::apply_changeset
    -    pub fn apply_update(&mut self, update: Self) -> Result<ChangeSet<P>, UpdateError<P>> {
    -        let changeset = self.determine_changeset(&update)?;
    -        self.apply_changeset(changeset.clone());
    -        Ok(changeset)
    -    }
    -
    -    pub fn apply_changeset(&mut self, changeset: ChangeSet<P>) {
    -        for (height, update_hash) in changeset.checkpoints {
    -            let _original_hash = match update_hash {
    -                Some(update_hash) => self.checkpoints.insert(height, update_hash),
    -                None => self.checkpoints.remove(&height),
    -            };
    -        }
    -
    -        for (txid, update_pos) in changeset.txids {
    -            let original_pos = self.txid_to_pos.remove(&txid);
    -
    -            if let Some(pos) = original_pos {
    -                self.ordered_txids.remove(&(pos, txid));
    -            }
    -
    -            if let Some(pos) = update_pos {
    -                self.txid_to_pos.insert(txid, pos.clone());
    -                self.ordered_txids.insert((pos.clone(), txid));
    -            }
    -        }
    -
    -        self.prune_checkpoints();
    -    }
    -
    -    /// Derives a [`ChangeSet`] that assumes that there are no preceding changesets.
    -    ///
    -    /// The changeset returned will record additions of all [`Txid`]s and checkpoints included in
    -    /// [`Self`].
    -    pub fn initial_changeset(&self) -> ChangeSet<P> {
    -        ChangeSet {
    -            checkpoints: self
    -                .checkpoints
    -                .iter()
    -                .map(|(height, hash)| (*height, Some(*hash)))
    -                .collect(),
    -            txids: self
    -                .ordered_txids
    -                .iter()
    -                .map(|(pos, txid)| (*txid, Some(pos.clone())))
    -                .collect(),
    -        }
    -    }
    -
    -    /// Determines the [`ChangeSet`] when checkpoints `from_height` (inclusive) and above are
    -    /// invalidated. Displaced [`Txid`]s will be repositioned to [`TxHeight::Unconfirmed`].
    -    pub fn invalidate_checkpoints_preview(&self, from_height: u32) -> ChangeSet<P> {
    -        ChangeSet::<P> {
    -            checkpoints: self
    -                .checkpoints
    -                .range(from_height..)
    -                .map(|(height, _)| (*height, None))
    -                .collect(),
    -            // invalidated transactions become unconfirmed
    -            txids: self
    -                .range_txids_by_height(TxHeight::Confirmed(from_height)..TxHeight::Unconfirmed)
    -                .map(|(_, txid)| (*txid, Some(P::max_ord_of_height(TxHeight::Unconfirmed))))
    -                .collect(),
    -        }
    -    }
    -
    -    /// Invalidate checkpoints `from_height` (inclusive) and above.
    -    ///
    -    /// This is equivalent to calling [`invalidate_checkpoints_preview`] and [`apply_changeset`] in
    -    /// sequence.
    -    ///
    -    /// [`invalidate_checkpoints_preview`]: Self::invalidate_checkpoints_preview
    -    /// [`apply_changeset`]: Self::apply_changeset
    -    pub fn invalidate_checkpoints(&mut self, from_height: u32) -> ChangeSet<P> {
    -        let changeset = self.invalidate_checkpoints_preview(from_height);
    -        self.apply_changeset(changeset.clone());
    -        changeset
    -    }
    -
    -    /// Determines the [`ChangeSet`] when all transactions of height [`TxHeight::Unconfirmed`] are
    -    /// removed completely.
    -    pub fn clear_mempool_preview(&self) -> ChangeSet<P> {
    -        let mempool_range = &(
    -            P::min_ord_of_height(TxHeight::Unconfirmed),
    -            Txid::all_zeros(),
    -        )..;
    -
    -        let txids = self
    -            .ordered_txids
    -            .range(mempool_range)
    -            .map(|(_, txid)| (*txid, None))
    -            .collect();
    -
    -        ChangeSet::<P> {
    -            txids,
    -            ..Default::default()
    -        }
    -    }
    -
    -    /// Clears all transactions of height [`TxHeight::Unconfirmed`].
    -    ///
    -    /// This is equivalent to calling [`clear_mempool_preview`] and [`apply_changeset`] in sequence.
    -    ///
    -    /// [`clear_mempool_preview`]: Self::clear_mempool_preview
    -    /// [`apply_changeset`]: Self::apply_changeset
    -    /// [`ChangeSet`].
    -    pub fn clear_mempool(&mut self) -> ChangeSet<P> {
    -        let changeset = self.clear_mempool_preview();
    -        self.apply_changeset(changeset.clone());
    -        changeset
    -    }
    -
    -    /// Determines the resultant [`ChangeSet`] if [`Txid`] was inserted at position `pos`.
    -    ///
    -    /// Changes to the [`Txid`]'s position are allowed (under the rules noted in
    -    /// [module-level documentation]) and will be reflected in the [`ChangeSet`].
    -    ///
    -    /// [module-level documentation]: crate::sparse_chain
    -    pub fn insert_tx_preview(&self, txid: Txid, pos: P) -> Result<ChangeSet<P>, InsertTxError<P>> {
    -        let mut update = Self::default();
    -
    -        if let Some(block_id) = self.latest_checkpoint() {
    -            let _old_hash = update.checkpoints.insert(block_id.height, block_id.hash);
    -            debug_assert!(_old_hash.is_none());
    -        }
    -
    -        let tip_height = self.checkpoints.iter().last().map(|(h, _)| *h);
    -        if let TxHeight::Confirmed(tx_height) = pos.height() {
    -            if Some(tx_height) > tip_height {
    -                return Err(InsertTxError::TxTooHigh {
    -                    txid,
    -                    tx_height,
    -                    tip_height,
    -                });
    -            }
    -        }
    -
    -        let _old_pos = update.txid_to_pos.insert(txid, pos.clone());
    -        debug_assert!(_old_pos.is_none());
    -
    -        let _inserted = update.ordered_txids.insert((pos, txid));
    -        debug_assert!(_inserted, "must insert tx");
    -
    -        match self.determine_changeset(&update) {
    -            Ok(changeset) => Ok(changeset),
    -            Err(UpdateError::NotConnected(_)) => panic!("should always connect"),
    -            Err(UpdateError::TxInconsistent {
    -                txid: inconsistent_txid,
    -                original_pos,
    -                update_pos,
    -            }) => Err(InsertTxError::TxMovedUnexpectedly {
    -                txid: inconsistent_txid,
    -                original_pos,
    -                update_pos,
    -            }),
    -        }
    -    }
    -
    -    /// Inserts a given [`Txid`] at `pos`.
    -    ///
    -    /// This is equivilant to calling [`insert_tx_preview`] and [`apply_changeset`] in sequence.
    -    ///
    -    /// [`insert_tx_preview`]: Self::insert_tx_preview
    -    /// [`apply_changeset`]: Self::apply_changeset
    -    pub fn insert_tx(&mut self, txid: Txid, pos: P) -> Result<ChangeSet<P>, InsertTxError<P>> {
    -        let changeset = self.insert_tx_preview(txid, pos)?;
    -        self.apply_changeset(changeset.clone());
    -        Ok(changeset)
    -    }
    -
    -    /// Determines the resultant [`ChangeSet`] if [`BlockId`] was inserted.
    -    ///
    -    /// If the change would result in a change in block hash of a certain height, insertion would
    -    /// fail.
    -    pub fn insert_checkpoint_preview(
    -        &self,
    -        block_id: BlockId,
    -    ) -> Result<ChangeSet<P>, InsertCheckpointError> {
    -        let mut update = Self::default();
    -
    -        if let Some(block_id) = self.latest_checkpoint() {
    -            let _old_hash = update.checkpoints.insert(block_id.height, block_id.hash);
    -            debug_assert!(_old_hash.is_none());
    -        }
    -
    -        if let Some(original_hash) = update.checkpoints.insert(block_id.height, block_id.hash) {
    -            if original_hash != block_id.hash {
    -                return Err(InsertCheckpointError::HashNotMatching {
    -                    height: block_id.height,
    -                    original_hash,
    -                    update_hash: block_id.hash,
    -                });
    -            }
    -        }
    -
    -        match self.determine_changeset(&update) {
    -            Ok(changeset) => Ok(changeset),
    -            Err(UpdateError::NotConnected(_)) => panic!("error should have caught above"),
    -            Err(UpdateError::TxInconsistent { .. }) => panic!("should never add txs"),
    -        }
    -    }
    -
    -    /// Insert a checkpoint ([`BlockId`]).
    -    ///
    -    /// This is equivalent to calling [`insert_checkpoint_preview`] and [`apply_changeset`] in
    -    /// sequence.
    -    ///
    -    /// [`insert_checkpoint_preview`]: Self::insert_checkpoint_preview
    -    /// [`apply_changeset`]: Self::apply_changeset
    -    pub fn insert_checkpoint(
    -        &mut self,
    -        block_id: BlockId,
    -    ) -> Result<ChangeSet<P>, InsertCheckpointError> {
    -        let changeset = self.insert_checkpoint_preview(block_id)?;
    -        self.apply_changeset(changeset.clone());
    -        Ok(changeset)
    -    }
    -
    -    /// Iterate over all [`Txid`]s ordered by their [`ChainPosition`].
    -    pub fn txids(&self) -> impl DoubleEndedIterator<Item = &(P, Txid)> + ExactSizeIterator + '_ {
    -        self.ordered_txids.iter()
    -    }
    -
    -    /// Iterate over a sub-range of positioned [`Txid`]s.
    -    pub fn range_txids<R>(&self, range: R) -> impl DoubleEndedIterator<Item = &(P, Txid)> + '_
    -    where
    -        R: RangeBounds<(P, Txid)>,
    -    {
    -        let map_bound = |b: Bound<&(P, Txid)>| match b {
    -            Bound::Included((pos, txid)) => Bound::Included((pos.clone(), *txid)),
    -            Bound::Excluded((pos, txid)) => Bound::Excluded((pos.clone(), *txid)),
    -            Bound::Unbounded => Bound::Unbounded,
    -        };
    -
    -        self.ordered_txids
    -            .range((map_bound(range.start_bound()), map_bound(range.end_bound())))
    -    }
    -
    -    /// Iterate over a sub-range of positioned [`Txid`]s, where the range is defined by
    -    /// [`ChainPosition`] only.
    -    pub fn range_txids_by_position<R>(
    -        &self,
    -        range: R,
    -    ) -> impl DoubleEndedIterator<Item = &(P, Txid)> + '_
    -    where
    -        R: RangeBounds<P>,
    -    {
    -        let map_bound = |b: Bound<&P>, inc: Txid, exc: Txid| match b {
    -            Bound::Included(pos) => Bound::Included((pos.clone(), inc)),
    -            Bound::Excluded(pos) => Bound::Excluded((pos.clone(), exc)),
    -            Bound::Unbounded => Bound::Unbounded,
    -        };
    -
    -        self.ordered_txids.range((
    -            map_bound(range.start_bound(), min_txid(), max_txid()),
    -            map_bound(range.end_bound(), max_txid(), min_txid()),
    -        ))
    -    }
    -
    -    /// Iterate over a sub-range of positioned [`Txid`]s, where the range is defined by [`TxHeight`]
    -    /// only.
    -    pub fn range_txids_by_height<R>(
    -        &self,
    -        range: R,
    -    ) -> impl DoubleEndedIterator<Item = &(P, Txid)> + '_
    -    where
    -        R: RangeBounds<TxHeight>,
    -    {
    -        let ord_it = |height, is_max| match is_max {
    -            true => P::max_ord_of_height(height),
    -            false => P::min_ord_of_height(height),
    -        };
    -
    -        let map_bound = |b: Bound<&TxHeight>, inc: (bool, Txid), exc: (bool, Txid)| match b {
    -            Bound::Included(&h) => Bound::Included((ord_it(h, inc.0), inc.1)),
    -            Bound::Excluded(&h) => Bound::Excluded((ord_it(h, exc.0), exc.1)),
    -            Bound::Unbounded => Bound::Unbounded,
    -        };
    -
    -        self.ordered_txids.range((
    -            map_bound(range.start_bound(), (false, min_txid()), (true, max_txid())),
    -            map_bound(range.end_bound(), (true, max_txid()), (false, min_txid())),
    -        ))
    -    }
    -
    -    /// Attempt to retrieve a [`FullTxOut`] of the given `outpoint`.
    -    ///
    -    /// This will return `Some` only if the output's transaction is in both `self` and `graph`.
    -    pub fn full_txout(&self, graph: &TxGraph, outpoint: OutPoint) -> Option<FullTxOut<P>> {
    -        let chain_pos = self.tx_position(outpoint.txid)?;
    -
    -        let tx = graph.get_tx(outpoint.txid)?;
    -        let is_on_coinbase = tx.is_coin_base();
    -        let txout = tx.output.get(outpoint.vout as usize)?.clone();
    -
    -        let spent_by = self
    -            .spent_by(graph, outpoint)
    -            .map(|(pos, txid)| (pos.clone(), txid));
    -
    -        Some(FullTxOut {
    -            outpoint,
    -            txout,
    -            chain_position: chain_pos.clone(),
    -            spent_by,
    -            is_on_coinbase,
    -        })
    -    }
    -
    -    /// Returns the value set as the checkpoint limit.
    -    ///
    -    /// Refer to [`set_checkpoint_limit`].
    -    ///
    -    /// [`set_checkpoint_limit`]: Self::set_checkpoint_limit
    -    pub fn checkpoint_limit(&self) -> Option<usize> {
    -        self.checkpoint_limit
    -    }
    -
    -    /// Set the checkpoint limit.
    -    ///
    -    /// The checkpoint limit restricts the number of checkpoints that can be stored in [`Self`].
    -    /// Oldest checkpoints are pruned first.
    -    pub fn set_checkpoint_limit(&mut self, limit: Option<usize>) {
    -        self.checkpoint_limit = limit;
    -        self.prune_checkpoints();
    -    }
    -
    -    /// Return [`Txid`]s that would be added to the sparse chain if this `changeset` was applied.
    -    pub fn changeset_additions<'a>(
    -        &'a self,
    -        changeset: &'a ChangeSet<P>,
    -    ) -> impl Iterator<Item = Txid> + 'a {
    -        changeset
    -            .txids
    -            .iter()
    -            .filter(move |(&txid, pos)| {
    -                pos.is_some() /*it was not a deletion*/ &&
    -                self.tx_position(txid).is_none() /* we don't have the txid already */
    -            })
    -            .map(|(&txid, _)| txid)
    -    }
    -
    -    fn prune_checkpoints(&mut self) -> Option<BTreeMap<u32, BlockHash>> {
    -        let limit = self.checkpoint_limit?;
    -
    -        // find the last height to be pruned
    -        let last_height = *self.checkpoints.keys().rev().nth(limit)?;
    -        // first height to be kept
    -        let keep_height = last_height + 1;
    -
    -        let mut split = self.checkpoints.split_off(&keep_height);
    -        core::mem::swap(&mut self.checkpoints, &mut split);
    -
    -        Some(split)
    -    }
    -
    -    /// Finds the transaction in the chain that spends `outpoint`.
    -    ///
    -    /// [`TxGraph`] is used to provide the spend relationships.
    -    ///
    -    /// Note that the transaction including `outpoint` does not need to be in the `graph` or the
    -    /// `chain` for this to return `Some`.
    -    pub fn spent_by(&self, graph: &TxGraph, outpoint: OutPoint) -> Option<(&P, Txid)> {
    -        graph
    -            .outspends(outpoint)
    -            .iter()
    -            .find_map(|&txid| Some((self.tx_position(txid)?, txid)))
    -    }
    -
    -    /// Returns whether the sparse chain contains any checkpoints or transactions.
    -    pub fn is_empty(&self) -> bool {
    -        self.checkpoints.is_empty() && self.txid_to_pos.is_empty()
    -    }
    -}
    -
    -/// The return value of [`determine_changeset`].
    -///
    -/// [`determine_changeset`]: SparseChain::determine_changeset.
    -#[derive(Debug, Clone, PartialEq)]
    -#[cfg_attr(
    -    feature = "serde",
    -    derive(serde::Deserialize, serde::Serialize),
    -    serde(crate = "serde_crate")
    -)]
    -#[must_use]
    -pub struct ChangeSet<P = TxHeight> {
    -    pub checkpoints: BTreeMap<u32, Option<BlockHash>>,
    -    pub txids: BTreeMap<Txid, Option<P>>,
    -}
    -
    -impl<I> Default for ChangeSet<I> {
    -    fn default() -> Self {
    -        Self {
    -            checkpoints: Default::default(),
    -            txids: Default::default(),
    -        }
    -    }
    -}
    -
    -impl<P> ChangeSet<P> {
    -    /// Appends the changes of `other` into self such that applying `self` afterward has the same
    -    /// effect as sequentially applying the original `self` and `other`.
    -    pub fn append(&mut self, mut other: Self)
    -    where
    -        P: ChainPosition,
    -    {
    -        self.checkpoints.append(&mut other.checkpoints);
    -        self.txids.append(&mut other.txids);
    -    }
    -
    -    /// Whether this changeset contains no changes.
    -    pub fn is_empty(&self) -> bool {
    -        self.checkpoints.is_empty() && self.txids.is_empty()
    -    }
    -}
    -
    -fn min_txid() -> Txid {
    -    Txid::from_inner([0x00; 32])
    -}
    -
    -fn max_txid() -> Txid {
    -    Txid::from_inner([0xff; 32])
    -}
    -
    -/// Represents a position in which transactions are ordered in [`SparseChain`].
    -///
    -/// [`ChainPosition`] implementations must be [`Ord`] by [`TxHeight`] first.
    -pub trait ChainPosition:
    -    core::fmt::Debug + Clone + Eq + PartialOrd + Ord + core::hash::Hash + Send + Sync + 'static
    -{
    -    /// Get the transaction height of the position.
    -    fn height(&self) -> TxHeight;
    -
    -    /// Get the position's upper bound of a given height.
    -    fn max_ord_of_height(height: TxHeight) -> Self;
    -
    -    /// Get the position's lower bound of a given height.
    -    fn min_ord_of_height(height: TxHeight) -> Self;
    -
    -    /// Get the unconfirmed position.
    -    fn unconfirmed() -> Self {
    -        Self::max_ord_of_height(TxHeight::Unconfirmed)
    -    }
    -}
    -
    -#[cfg(test)]
    -pub mod verify_chain_position {
    -    use crate::{sparse_chain::ChainPosition, ConfirmationTime, TxHeight};
    -    use alloc::vec::Vec;
    -
    -    pub fn verify_chain_position<P: ChainPosition>(head_count: u32, tail_count: u32) {
    -        let values = (0..head_count)
    -            .chain(u32::MAX - tail_count..u32::MAX)
    -            .flat_map(|i| {
    -                [
    -                    P::min_ord_of_height(TxHeight::Confirmed(i)),
    -                    P::max_ord_of_height(TxHeight::Confirmed(i)),
    -                ]
    -            })
    -            .chain([
    -                P::min_ord_of_height(TxHeight::Unconfirmed),
    -                P::max_ord_of_height(TxHeight::Unconfirmed),
    -            ])
    -            .collect::<Vec<_>>();
    -
    -        for i in 0..values.len() {
    -            for j in 0..values.len() {
    -                if i == j {
    -                    assert_eq!(values[i], values[j]);
    -                }
    -                if i < j {
    -                    assert!(values[i] <= values[j]);
    -                }
    -                if i > j {
    -                    assert!(values[i] >= values[j]);
    -                }
    -            }
    -        }
    -    }
    -
    -    #[test]
    -    fn verify_tx_height() {
    -        verify_chain_position::<TxHeight>(1000, 1000);
    -    }
    -
    -    #[test]
    -    fn verify_confirmation_time() {
    -        verify_chain_position::<ConfirmationTime>(1000, 1000);
    -    }
    -}
    -
    -
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/spk_txout_index.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/spk_txout_index.rs.html index 51382124bf..8e676c71af 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/spk_txout_index.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/spk_txout_index.rs.html @@ -357,13 +357,13 @@ /// Note there is no harm in scanning transactions that disappear from the blockchain or were never /// in there in the first place. `SpkTxOutIndex` is intentionally *monotone* -- you cannot delete or /// modify txouts that have been indexed. To find out which txouts from the index are actually in the -/// chain or unspent, you must use other sources of information like a [`SparseChain`]. +/// chain or unspent, you must use other sources of information like a [`TxGraph`]. /// /// [`TxOut`]: bitcoin::TxOut /// [`insert_spk`]: Self::insert_spk /// [`Ord`]: core::cmp::Ord /// [`scan`]: Self::scan -/// [`SparseChain`]: crate::sparse_chain::SparseChain +/// [`TxGraph`]: crate::tx_graph::TxGraph
    #[derive(Clone, Debug)] pub struct SpkTxOutIndex<I> { /// script pubkeys ordered by index diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/tx_graph.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/tx_graph.rs.html index 50a0c502c4..1f7556264d 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/tx_graph.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_chain/tx_graph.rs.html @@ -1179,6 +1179,10 @@ 1179 1180 1181 +1182 +1183 +1184 +1185
    //! Module for structures that store and traverse transactions.
     //!
     //! [`TxGraph`] is a monotone structure that inserts transactions and indexes the spends. The
    @@ -1237,8 +1241,8 @@
     //! ```
     
     use crate::{
    -    collections::*, keychain::Balance, Anchor, Append, BlockId, ChainOracle, ForEachTxOut,
    -    FullTxOut, ObservedAs,
    +    collections::*, keychain::Balance, Anchor, Append, BlockId, ChainOracle, ChainPosition,
    +    ForEachTxOut, FullTxOut,
     };
     use alloc::vec::Vec;
     use bitcoin::{OutPoint, Script, Transaction, TxOut, Txid};
    @@ -1316,7 +1320,7 @@
     #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
     pub struct CanonicalTx<'a, T, A> {
         /// How the transaction is observed as (confirmed or unconfirmed).
    -    pub observed_as: ObservedAs<&'a A>,
    +    pub observed_as: ChainPosition<&'a A>,
         /// The transaction node (as part of the graph).
         pub node: TxNode<'a, T, A>,
     }
    @@ -1663,7 +1667,7 @@
     
         /// Applies [`Additions`] to [`TxGraph`].
         pub fn apply_additions(&mut self, additions: Additions<A>) {
    -        for tx in additions.tx {
    +        for tx in additions.txs {
                 let txid = tx.txid();
     
                 tx.input
    @@ -1694,7 +1698,7 @@
                 }
             }
     
    -        for (outpoint, txout) in additions.txout {
    +        for (outpoint, txout) in additions.txouts {
                 let tx_entry = self
                     .txs
                     .entry(outpoint.txid)
    @@ -1734,11 +1738,11 @@
             for (&txid, (update_tx_node, _, update_last_seen)) in &update.txs {
                 let prev_last_seen: u64 = match (self.txs.get(&txid), update_tx_node) {
                     (None, TxNodeInternal::Whole(update_tx)) => {
    -                    additions.tx.insert(update_tx.clone());
    +                    additions.txs.insert(update_tx.clone());
                         0
                     }
                     (None, TxNodeInternal::Partial(update_txos)) => {
    -                    additions.txout.extend(
    +                    additions.txouts.extend(
                             update_txos
                                 .iter()
                                 .map(|(&vout, txo)| (OutPoint::new(txid, vout), txo.clone())),
    @@ -1750,14 +1754,14 @@
                         Some((TxNodeInternal::Partial(_), _, last_seen)),
                         TxNodeInternal::Whole(update_tx),
                     ) => {
    -                    additions.tx.insert(update_tx.clone());
    +                    additions.txs.insert(update_tx.clone());
                         *last_seen
                     }
                     (
                         Some((TxNodeInternal::Partial(txos), _, last_seen)),
                         TxNodeInternal::Partial(update_txos),
                     ) => {
    -                    additions.txout.extend(
    +                    additions.txouts.extend(
                             update_txos
                                 .iter()
                                 .filter(|(vout, _)| !txos.contains_key(*vout))
    @@ -1795,7 +1799,7 @@
             chain: &C,
             chain_tip: BlockId,
             txid: Txid,
    -    ) -> Result<Option<ObservedAs<&A>>, C::Error> {
    +    ) -> Result<Option<ChainPosition<&A>>, C::Error> {
             let (tx_node, anchors, last_seen) = match self.txs.get(&txid) {
                 Some(v) => v,
                 None => return Ok(None),
    @@ -1803,7 +1807,7 @@
     
             for anchor in anchors {
                 match chain.is_block_in_chain(anchor.anchor_block(), chain_tip)? {
    -                Some(true) => return Ok(Some(ObservedAs::Confirmed(anchor))),
    +                Some(true) => return Ok(Some(ChainPosition::Confirmed(anchor))),
                     _ => continue,
                 }
             }
    @@ -1832,7 +1836,7 @@
                 }
             }
     
    -        Ok(Some(ObservedAs::Unconfirmed(*last_seen)))
    +        Ok(Some(ChainPosition::Unconfirmed(*last_seen)))
         }
     
         /// Get the position of the transaction in `chain` with tip `chain_tip`.
    @@ -1845,7 +1849,7 @@
             chain: &C,
             chain_tip: BlockId,
             txid: Txid,
    -    ) -> Option<ObservedAs<&A>> {
    +    ) -> Option<ChainPosition<&A>> {
             self.try_get_chain_position(chain, chain_tip, txid)
                 .expect("error is infallible")
         }
    @@ -1867,7 +1871,7 @@
             chain: &C,
             chain_tip: BlockId,
             outpoint: OutPoint,
    -    ) -> Result<Option<(ObservedAs<&A>, Txid)>, C::Error> {
    +    ) -> Result<Option<(ChainPosition<&A>, Txid)>, C::Error> {
             if self
                 .try_get_chain_position(chain, chain_tip, outpoint.txid)?
                 .is_none()
    @@ -1895,7 +1899,7 @@
             chain: &C,
             static_block: BlockId,
             outpoint: OutPoint,
    -    ) -> Option<(ObservedAs<&A>, Txid)> {
    +    ) -> Option<(ChainPosition<&A>, Txid)> {
             self.try_get_chain_spend(chain, static_block, outpoint)
                 .expect("error is infallible")
         }
    @@ -1967,7 +1971,7 @@
             chain: &'a C,
             chain_tip: BlockId,
             outpoints: impl IntoIterator<Item = (OI, OutPoint)> + 'a,
    -    ) -> impl Iterator<Item = Result<(OI, FullTxOut<ObservedAs<A>>), C::Error>> + 'a {
    +    ) -> impl Iterator<Item = Result<(OI, FullTxOut<A>), C::Error>> + 'a {
             outpoints
                 .into_iter()
                 .map(
    @@ -2018,7 +2022,7 @@
             chain: &'a C,
             chain_tip: BlockId,
             outpoints: impl IntoIterator<Item = (OI, OutPoint)> + 'a,
    -    ) -> impl Iterator<Item = (OI, FullTxOut<ObservedAs<A>>)> + 'a {
    +    ) -> impl Iterator<Item = (OI, FullTxOut<A>)> + 'a {
             self.try_filter_chain_txouts(chain, chain_tip, outpoints)
                 .map(|r| r.expect("oracle is infallible"))
         }
    @@ -2046,7 +2050,7 @@
             chain: &'a C,
             chain_tip: BlockId,
             outpoints: impl IntoIterator<Item = (OI, OutPoint)> + 'a,
    -    ) -> impl Iterator<Item = Result<(OI, FullTxOut<ObservedAs<A>>), C::Error>> + 'a {
    +    ) -> impl Iterator<Item = Result<(OI, FullTxOut<A>), C::Error>> + 'a {
             self.try_filter_chain_txouts(chain, chain_tip, outpoints)
                 .filter(|r| match r {
                     // keep unspents, drop spents
    @@ -2067,7 +2071,7 @@
             chain: &'a C,
             chain_tip: BlockId,
             txouts: impl IntoIterator<Item = (OI, OutPoint)> + 'a,
    -    ) -> impl Iterator<Item = (OI, FullTxOut<ObservedAs<A>>)> + 'a {
    +    ) -> impl Iterator<Item = (OI, FullTxOut<A>)> + 'a {
             self.try_filter_chain_unspents(chain, chain_tip, txouts)
                 .map(|r| r.expect("oracle is infallible"))
         }
    @@ -2100,14 +2104,14 @@
                 let (spk_i, txout) = res?;
     
                 match &txout.chain_position {
    -                ObservedAs::Confirmed(_) => {
    +                ChainPosition::Confirmed(_) => {
                         if txout.is_confirmed_and_spendable(chain_tip.height) {
                             confirmed += txout.txout.value;
                         } else if !txout.is_mature(chain_tip.height) {
                             immature += txout.txout.value;
                         }
                     }
    -                ObservedAs::Unconfirmed(_) => {
    +                ChainPosition::Unconfirmed(_) => {
                         if trust_predicate(&spk_i, &txout.txout.script_pubkey) {
                             trusted_pending += txout.txout.value;
                         } else {
    @@ -2164,17 +2168,21 @@
     )]
     #[must_use]
     pub struct Additions<A = ()> {
    -    pub tx: BTreeSet<Transaction>,
    -    pub txout: BTreeMap<OutPoint, TxOut>,
    -    pub anchors: BTreeSet<(A, Txid)>,
    -    pub last_seen: BTreeMap<Txid, u64>,
    +    /// Added transactions.
    +    pub txs: BTreeSet<Transaction>,
    +    /// Added txouts.
    +    pub txouts: BTreeMap<OutPoint, TxOut>,
    +    /// Added anchors.
    +    pub anchors: BTreeSet<(A, Txid)>,
    +    /// Added last-seen unix timestamps of transactions.
    +    pub last_seen: BTreeMap<Txid, u64>,
     }
     
     impl<A> Default for Additions<A> {
         fn default() -> Self {
             Self {
    -            tx: Default::default(),
    -            txout: Default::default(),
    +            txs: Default::default(),
    +            txouts: Default::default(),
                 anchors: Default::default(),
                 last_seen: Default::default(),
             }
    @@ -2184,12 +2192,12 @@
     impl<A> Additions<A> {
         /// Returns true if the [`Additions`] is empty (no transactions or txouts).
         pub fn is_empty(&self) -> bool {
    -        self.tx.is_empty() && self.txout.is_empty()
    +        self.txs.is_empty() && self.txouts.is_empty()
         }
     
         /// Iterates over all outpoints contained within [`Additions`].
         pub fn txouts(&self) -> impl Iterator<Item = (OutPoint, &TxOut)> {
    -        self.tx
    +        self.txs
                 .iter()
                 .flat_map(|tx| {
                     tx.output
    @@ -2197,14 +2205,14 @@
                         .enumerate()
                         .map(move |(vout, txout)| (OutPoint::new(tx.txid(), vout as _), txout))
                 })
    -            .chain(self.txout.iter().map(|(op, txout)| (*op, txout)))
    +            .chain(self.txouts.iter().map(|(op, txout)| (*op, txout)))
         }
     }
     
     impl<A: Ord> Append for Additions<A> {
         fn append(&mut self, mut other: Self) {
    -        self.tx.append(&mut other.tx);
    -        self.txout.append(&mut other.txout);
    +        self.txs.append(&mut other.txs);
    +        self.txouts.append(&mut other.txouts);
             self.anchors.append(&mut other.anchors);
     
             // last_seen timestamps should only increase
    @@ -2218,8 +2226,8 @@
         }
     
         fn is_empty(&self) -> bool {
    -        self.tx.is_empty()
    -            && self.txout.is_empty()
    +        self.txs.is_empty()
    +            && self.txouts.is_empty()
                 && self.anchors.is_empty()
                 && self.last_seen.is_empty()
         }
    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
    new file mode 100644
    index 0000000000..cab646137e
    --- /dev/null
    +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_electrum/electrum_ext.rs.html
    @@ -0,0 +1,974 @@
    +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
    +
    use bdk_chain::{
    +    bitcoin::{hashes::hex::FromHex, BlockHash, OutPoint, Script, Transaction, Txid},
    +    keychain::LocalUpdate,
    +    local_chain::LocalChain,
    +    tx_graph::{self, TxGraph},
    +    Anchor, BlockId, ConfirmationHeightAnchor, ConfirmationTimeAnchor,
    +};
    +use electrum_client::{Client, ElectrumApi, Error};
    +use std::{
    +    collections::{BTreeMap, BTreeSet, HashMap, HashSet},
    +    fmt::Debug,
    +};
    +
    +#[derive(Debug, Clone)]
    +pub struct ElectrumUpdate<K, A> {
    +    pub graph_update: HashMap<Txid, BTreeSet<A>>,
    +    pub chain_update: LocalChain,
    +    pub keychain_update: BTreeMap<K, u32>,
    +}
    +
    +impl<K, A> Default for ElectrumUpdate<K, A> {
    +    fn default() -> Self {
    +        Self {
    +            graph_update: Default::default(),
    +            chain_update: Default::default(),
    +            keychain_update: Default::default(),
    +        }
    +    }
    +}
    +
    +impl<K, A: Anchor> ElectrumUpdate<K, A> {
    +    pub fn missing_full_txs<A2>(&self, graph: &TxGraph<A2>) -> Vec<Txid> {
    +        self.graph_update
    +            .keys()
    +            .filter(move |&&txid| graph.as_ref().get_tx(txid).is_none())
    +            .cloned()
    +            .collect()
    +    }
    +
    +    pub fn finalize(
    +        self,
    +        client: &Client,
    +        seen_at: Option<u64>,
    +        missing: Vec<Txid>,
    +    ) -> Result<LocalUpdate<K, A>, Error> {
    +        let new_txs = client.batch_transaction_get(&missing)?;
    +        let mut graph_update = TxGraph::<A>::new(new_txs);
    +        for (txid, anchors) in self.graph_update {
    +            if let Some(seen_at) = seen_at {
    +                let _ = graph_update.insert_seen_at(txid, seen_at);
    +            }
    +            for anchor in anchors {
    +                let _ = graph_update.insert_anchor(txid, anchor);
    +            }
    +        }
    +        Ok(LocalUpdate {
    +            keychain: self.keychain_update,
    +            graph: graph_update,
    +            chain: self.chain_update,
    +        })
    +    }
    +}
    +
    +impl<K> ElectrumUpdate<K, ConfirmationHeightAnchor> {
    +    /// Finalizes the [`ElectrumUpdate`] with `new_txs` and anchors of type
    +    /// [`ConfirmationTimeAnchor`].
    +    ///
    +    /// **Note:** The confirmation time might not be precisely correct if there has been a reorg.
    +    /// Electrum's API intends that we use the merkle proof API, we should change `bdk_electrum` to
    +    /// use it.
    +    pub fn finalize_as_confirmation_time(
    +        self,
    +        client: &Client,
    +        seen_at: Option<u64>,
    +        missing: Vec<Txid>,
    +    ) -> Result<LocalUpdate<K, ConfirmationTimeAnchor>, Error> {
    +        let update = self.finalize(client, seen_at, missing)?;
    +
    +        let relevant_heights = {
    +            let mut visited_heights = HashSet::new();
    +            update
    +                .graph
    +                .all_anchors()
    +                .iter()
    +                .map(|(a, _)| a.confirmation_height_upper_bound())
    +                .filter(move |&h| visited_heights.insert(h))
    +                .collect::<Vec<_>>()
    +        };
    +
    +        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>>();
    +
    +        let graph_additions = {
    +            let old_additions = TxGraph::default().determine_additions(&update.graph);
    +            tx_graph::Additions {
    +                txs: old_additions.txs,
    +                txouts: old_additions.txouts,
    +                last_seen: old_additions.last_seen,
    +                anchors: old_additions
    +                    .anchors
    +                    .into_iter()
    +                    .map(|(height_anchor, txid)| {
    +                        let confirmation_height = height_anchor.confirmation_height;
    +                        let confirmation_time = height_to_time[&confirmation_height];
    +                        let time_anchor = ConfirmationTimeAnchor {
    +                            anchor_block: height_anchor.anchor_block,
    +                            confirmation_height,
    +                            confirmation_time,
    +                        };
    +                        (time_anchor, txid)
    +                    })
    +                    .collect(),
    +            }
    +        };
    +
    +        Ok(LocalUpdate {
    +            keychain: update.keychain,
    +            graph: {
    +                let mut graph = TxGraph::default();
    +                graph.apply_additions(graph_additions);
    +                graph
    +            },
    +            chain: update.chain,
    +        })
    +    }
    +}
    +
    +pub trait ElectrumExt<A> {
    +    fn get_tip(&self) -> Result<(u32, BlockHash), Error>;
    +
    +    fn scan<K: Ord + Clone>(
    +        &self,
    +        local_chain: &BTreeMap<u32, BlockHash>,
    +        keychain_spks: BTreeMap<K, impl IntoIterator<Item = (u32, Script)>>,
    +        txids: impl IntoIterator<Item = Txid>,
    +        outpoints: impl IntoIterator<Item = OutPoint>,
    +        stop_gap: usize,
    +        batch_size: usize,
    +    ) -> Result<ElectrumUpdate<K, A>, Error>;
    +
    +    fn scan_without_keychain(
    +        &self,
    +        local_chain: &BTreeMap<u32, BlockHash>,
    +        misc_spks: impl IntoIterator<Item = Script>,
    +        txids: impl IntoIterator<Item = Txid>,
    +        outpoints: impl IntoIterator<Item = OutPoint>,
    +        batch_size: usize,
    +    ) -> Result<ElectrumUpdate<(), A>, Error> {
    +        let spk_iter = misc_spks
    +            .into_iter()
    +            .enumerate()
    +            .map(|(i, spk)| (i as u32, spk));
    +
    +        self.scan(
    +            local_chain,
    +            [((), spk_iter)].into(),
    +            txids,
    +            outpoints,
    +            usize::MAX,
    +            batch_size,
    +        )
    +    }
    +}
    +
    +impl ElectrumExt<ConfirmationHeightAnchor> for Client {
    +    fn get_tip(&self) -> Result<(u32, BlockHash), Error> {
    +        // TODO: unsubscribe when added to the client, or is there a better call to use here?
    +        self.block_headers_subscribe()
    +            .map(|data| (data.height as u32, data.header.block_hash()))
    +    }
    +
    +    fn scan<K: Ord + Clone>(
    +        &self,
    +        local_chain: &BTreeMap<u32, BlockHash>,
    +        keychain_spks: BTreeMap<K, impl IntoIterator<Item = (u32, Script)>>,
    +        txids: impl IntoIterator<Item = Txid>,
    +        outpoints: impl IntoIterator<Item = OutPoint>,
    +        stop_gap: usize,
    +        batch_size: usize,
    +    ) -> Result<ElectrumUpdate<K, ConfirmationHeightAnchor>, Error> {
    +        let mut request_spks = keychain_spks
    +            .into_iter()
    +            .map(|(k, s)| (k, s.into_iter()))
    +            .collect::<BTreeMap<K, _>>();
    +        let mut scanned_spks = BTreeMap::<(K, u32), (Script, bool)>::new();
    +
    +        let txids = txids.into_iter().collect::<Vec<_>>();
    +        let outpoints = outpoints.into_iter().collect::<Vec<_>>();
    +
    +        let update = loop {
    +            let mut update = ElectrumUpdate::<K, ConfirmationHeightAnchor> {
    +                chain_update: prepare_chain_update(self, local_chain)?,
    +                ..Default::default()
    +            };
    +            let anchor_block = update
    +                .chain_update
    +                .tip()
    +                .expect("must have atleast one block");
    +
    +            if !request_spks.is_empty() {
    +                if !scanned_spks.is_empty() {
    +                    scanned_spks.append(&mut populate_with_spks(
    +                        self,
    +                        anchor_block,
    +                        &mut 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,
    +                            anchor_block,
    +                            &mut update,
    +                            keychain_spks,
    +                            stop_gap,
    +                            batch_size,
    +                        )?
    +                        .into_iter()
    +                        .map(|(spk_i, spk)| ((keychain.clone(), spk_i), spk)),
    +                    );
    +                }
    +            }
    +
    +            populate_with_txids(self, anchor_block, &mut update, &mut txids.iter().cloned())?;
    +
    +            let _txs = populate_with_outpoints(
    +                self,
    +                anchor_block,
    +                &mut update,
    +                &mut outpoints.iter().cloned(),
    +            )?;
    +
    +            // check for reorgs during scan process
    +            let server_blockhash = self
    +                .block_header(anchor_block.height as usize)?
    +                .block_hash();
    +            if anchor_block.hash != server_blockhash {
    +                continue; // reorg
    +            }
    +
    +            update.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 update;
    +        };
    +
    +        Ok(update)
    +    }
    +}
    +
    +/// Prepare an update "template" based on the checkpoints of the `local_chain`.
    +fn prepare_chain_update(
    +    client: &Client,
    +    local_chain: &BTreeMap<u32, BlockHash>,
    +) -> Result<LocalChain, Error> {
    +    let mut update = LocalChain::default();
    +
    +    // Find the local chain block that is still there so our update can connect to the local chain.
    +    for (&existing_height, &existing_hash) in local_chain.iter().rev() {
    +        // TODO: a batch request may be safer, as a reorg that happens when we are obtaining
    +        //       `block_header`s will result in inconsistencies
    +        let current_hash = client.block_header(existing_height as usize)?.block_hash();
    +        let _ = update
    +            .insert_block(BlockId {
    +                height: existing_height,
    +                hash: current_hash,
    +            })
    +            .expect("This never errors because we are working with a fresh chain");
    +
    +        if current_hash == existing_hash {
    +            break;
    +        }
    +    }
    +
    +    // Insert the new tip so new transactions will be accepted into the sparsechain.
    +    let tip = {
    +        let (height, hash) = crate::get_tip(client)?;
    +        BlockId { height, hash }
    +    };
    +    if update.insert_block(tip).is_err() {
    +        // There has been a re-org before we even begin scanning addresses.
    +        // Just recursively call (this should never happen).
    +        return prepare_chain_update(client, local_chain);
    +    }
    +
    +    Ok(update)
    +}
    +
    +fn determine_tx_anchor(
    +    anchor_block: BlockId,
    +    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_hex("4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b")
    +            .expect("must deserialize genesis coinbase txid")
    +    {
    +        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;
    +            if h > anchor_block.height {
    +                None
    +            } else {
    +                Some(ConfirmationHeightAnchor {
    +                    anchor_block,
    +                    confirmation_height: h,
    +                })
    +            }
    +        }
    +    }
    +}
    +
    +fn populate_with_outpoints<K>(
    +    client: &Client,
    +    anchor_block: BlockId,
    +    update: &mut ElectrumUpdate<K, ConfirmationHeightAnchor>,
    +    outpoints: &mut impl Iterator<Item = OutPoint>,
    +) -> Result<HashMap<Txid, Transaction>, Error> {
    +    let mut full_txs = HashMap::new();
    +    for outpoint in outpoints {
    +        let txid = outpoint.txid;
    +        let tx = client.transaction_get(&txid)?;
    +        debug_assert_eq!(tx.txid(), txid);
    +        let txout = match tx.output.get(outpoint.vout as usize) {
    +            Some(txout) => txout,
    +            None => continue,
    +        };
    +        // 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(&txout.script_pubkey)? {
    +            if has_residing && has_spending {
    +                break;
    +            }
    +
    +            if res.tx_hash == txid {
    +                if has_residing {
    +                    continue;
    +                }
    +                has_residing = true;
    +                full_txs.insert(res.tx_hash, tx.clone());
    +            } else {
    +                if has_spending {
    +                    continue;
    +                }
    +                let res_tx = match full_txs.get(&res.tx_hash) {
    +                    Some(tx) => tx,
    +                    None => {
    +                        let res_tx = client.transaction_get(&res.tx_hash)?;
    +                        full_txs.insert(res.tx_hash, res_tx);
    +                        full_txs.get(&res.tx_hash).expect("just inserted")
    +                    }
    +                };
    +                has_spending = res_tx
    +                    .input
    +                    .iter()
    +                    .any(|txin| txin.previous_output == outpoint);
    +                if !has_spending {
    +                    continue;
    +                }
    +            };
    +
    +            let anchor = determine_tx_anchor(anchor_block, res.height, res.tx_hash);
    +
    +            let tx_entry = update.graph_update.entry(res.tx_hash).or_default();
    +            if let Some(anchor) = anchor {
    +                tx_entry.insert(anchor);
    +            }
    +        }
    +    }
    +    Ok(full_txs)
    +}
    +
    +fn populate_with_txids<K>(
    +    client: &Client,
    +    anchor_block: BlockId,
    +    update: &mut ElectrumUpdate<K, ConfirmationHeightAnchor>,
    +    txids: &mut impl Iterator<Item = Txid>,
    +) -> Result<(), Error> {
    +    for txid in txids {
    +        let tx = match client.transaction_get(&txid) {
    +            Ok(tx) => tx,
    +            Err(electrum_client::Error::Protocol(_)) => continue,
    +            Err(other_err) => return Err(other_err),
    +        };
    +
    +        let spk = tx
    +            .output
    +            .get(0)
    +            .map(|txo| &txo.script_pubkey)
    +            .expect("tx must have an output");
    +
    +        let anchor = match client
    +            .script_get_history(spk)?
    +            .into_iter()
    +            .find(|r| r.tx_hash == txid)
    +        {
    +            Some(r) => determine_tx_anchor(anchor_block, r.height, txid),
    +            None => continue,
    +        };
    +
    +        let tx_entry = update.graph_update.entry(txid).or_default();
    +        if let Some(anchor) = anchor {
    +            tx_entry.insert(anchor);
    +        }
    +    }
    +    Ok(())
    +}
    +
    +fn populate_with_spks<K, I: Ord + Clone>(
    +    client: &Client,
    +    anchor_block: BlockId,
    +    update: &mut ElectrumUpdate<K, ConfirmationHeightAnchor>,
    +    spks: &mut impl Iterator<Item = (I, Script)>,
    +    stop_gap: usize,
    +    batch_size: usize,
    +) -> Result<BTreeMap<I, (Script, 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))?;
    +
    +        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 in spk_history {
    +                let tx_entry = update.graph_update.entry(tx.tx_hash).or_default();
    +                if let Some(anchor) = determine_tx_anchor(anchor_block, tx.height, tx.tx_hash) {
    +                    tx_entry.insert(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 a855b81065..621f859653 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 @@ -33,559 +33,6 @@ 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
    //! This crate is used for updating structures of the [`bdk_chain`] crate with data from electrum.
     //!
     //! The star of the show is the [`ElectrumExt::scan`] method, which scans for relevant blockchain
    @@ -608,305 +55,12 @@
     //! [`batch_transaction_get`]: ElectrumApi::batch_transaction_get
     //! [`bdk_electrum_example`]: https://github.com/LLFourn/bdk_core_staging/tree/master/bdk_electrum_example
     
    -use std::{
    -    collections::{BTreeMap, HashMap},
    -    fmt::Debug,
    -};
    -
    +use bdk_chain::bitcoin::BlockHash;
    +use electrum_client::{Client, ElectrumApi, Error};
    +mod electrum_ext;
     pub use bdk_chain;
    -use bdk_chain::{
    -    bitcoin::{hashes::hex::FromHex, BlockHash, OutPoint, Script, Transaction, Txid},
    -    chain_graph::{self, ChainGraph},
    -    keychain::KeychainScan,
    -    sparse_chain::{self, ChainPosition, SparseChain},
    -    tx_graph::TxGraph,
    -    BlockId, ConfirmationTime, TxHeight,
    -};
     pub use electrum_client;
    -use electrum_client::{Client, ElectrumApi, Error};
    -
    -/// Trait to extend [`electrum_client::Client`] functionality.
    -///
    -/// Refer to [crate-level documentation] for more.
    -///
    -/// [crate-level documentation]: crate
    -pub trait ElectrumExt {
    -    /// Fetch the latest block height.
    -    fn get_tip(&self) -> Result<(u32, BlockHash), Error>;
    -
    -    /// Scan the blockchain (via electrum) for the data specified. This returns a [`ElectrumUpdate`]
    -    /// which can be transformed into a [`KeychainScan`] after we find all the missing full
    -    /// transactions.
    -    ///
    -    /// - `local_chain`: the most recent block hashes present locally
    -    /// - `keychain_spks`: keychains that we want to scan transactions for
    -    /// - `txids`: transactions for which we want the updated [`ChainPosition`]s
    -    /// - `outpoints`: transactions associated with these outpoints (residing, spending) that we
    -    ///     want to included in the update
    -    fn scan<K: Ord + Clone>(
    -        &self,
    -        local_chain: &BTreeMap<u32, BlockHash>,
    -        keychain_spks: BTreeMap<K, impl IntoIterator<Item = (u32, Script)>>,
    -        txids: impl IntoIterator<Item = Txid>,
    -        outpoints: impl IntoIterator<Item = OutPoint>,
    -        stop_gap: usize,
    -        batch_size: usize,
    -    ) -> Result<ElectrumUpdate<K, TxHeight>, Error>;
    -
    -    /// Convenience method to call [`scan`] without requiring a keychain.
    -    ///
    -    /// [`scan`]: ElectrumExt::scan
    -    fn scan_without_keychain(
    -        &self,
    -        local_chain: &BTreeMap<u32, BlockHash>,
    -        misc_spks: impl IntoIterator<Item = Script>,
    -        txids: impl IntoIterator<Item = Txid>,
    -        outpoints: impl IntoIterator<Item = OutPoint>,
    -        batch_size: usize,
    -    ) -> Result<SparseChain, Error> {
    -        let spk_iter = misc_spks
    -            .into_iter()
    -            .enumerate()
    -            .map(|(i, spk)| (i as u32, spk));
    -
    -        self.scan(
    -            local_chain,
    -            [((), spk_iter)].into(),
    -            txids,
    -            outpoints,
    -            usize::MAX,
    -            batch_size,
    -        )
    -        .map(|u| u.chain_update)
    -    }
    -}
    -
    -impl ElectrumExt for Client {
    -    fn get_tip(&self) -> Result<(u32, BlockHash), Error> {
    -        // TODO: unsubscribe when added to the client, or is there a better call to use here?
    -        self.block_headers_subscribe()
    -            .map(|data| (data.height as u32, data.header.block_hash()))
    -    }
    -
    -    fn scan<K: Ord + Clone>(
    -        &self,
    -        local_chain: &BTreeMap<u32, BlockHash>,
    -        keychain_spks: BTreeMap<K, impl IntoIterator<Item = (u32, Script)>>,
    -        txids: impl IntoIterator<Item = Txid>,
    -        outpoints: impl IntoIterator<Item = OutPoint>,
    -        stop_gap: usize,
    -        batch_size: usize,
    -    ) -> Result<ElectrumUpdate<K, TxHeight>, Error> {
    -        let mut request_spks = keychain_spks
    -            .into_iter()
    -            .map(|(k, s)| {
    -                let iter = s.into_iter();
    -                (k, iter)
    -            })
    -            .collect::<BTreeMap<K, _>>();
    -        let mut scanned_spks = BTreeMap::<(K, u32), (Script, bool)>::new();
    -
    -        let txids = txids.into_iter().collect::<Vec<_>>();
    -        let outpoints = outpoints.into_iter().collect::<Vec<_>>();
    -
    -        let update = loop {
    -            let mut update = prepare_update(self, local_chain)?;
    -
    -            if !request_spks.is_empty() {
    -                if !scanned_spks.is_empty() {
    -                    let mut scanned_spk_iter = scanned_spks
    -                        .iter()
    -                        .map(|(i, (spk, _))| (i.clone(), spk.clone()));
    -                    match populate_with_spks::<K, _, _>(
    -                        self,
    -                        &mut update,
    -                        &mut scanned_spk_iter,
    -                        stop_gap,
    -                        batch_size,
    -                    ) {
    -                        Err(InternalError::Reorg) => continue,
    -                        Err(InternalError::ElectrumError(e)) => return Err(e),
    -                        Ok(mut spks) => scanned_spks.append(&mut spks),
    -                    };
    -                }
    -                for (keychain, keychain_spks) in &mut request_spks {
    -                    match populate_with_spks::<K, u32, _>(
    -                        self,
    -                        &mut update,
    -                        keychain_spks,
    -                        stop_gap,
    -                        batch_size,
    -                    ) {
    -                        Err(InternalError::Reorg) => continue,
    -                        Err(InternalError::ElectrumError(e)) => return Err(e),
    -                        Ok(spks) => scanned_spks.extend(
    -                            spks.into_iter()
    -                                .map(|(spk_i, spk)| ((keychain.clone(), spk_i), spk)),
    -                        ),
    -                    };
    -                }
    -            }
    -
    -            match populate_with_txids(self, &mut update, &mut txids.iter().cloned()) {
    -                Err(InternalError::Reorg) => continue,
    -                Err(InternalError::ElectrumError(e)) => return Err(e),
    -                Ok(_) => {}
    -            }
    -
    -            match populate_with_outpoints(self, &mut update, &mut outpoints.iter().cloned()) {
    -                Err(InternalError::Reorg) => continue,
    -                Err(InternalError::ElectrumError(e)) => return Err(e),
    -                Ok(_txs) => { /* [TODO] cache full txs to reduce bandwidth */ }
    -            }
    -
    -            // check for reorgs during scan process
    -            let our_tip = update
    -                .latest_checkpoint()
    -                .expect("update must have atleast one checkpoint");
    -            let server_blockhash = self.block_header(our_tip.height as usize)?.block_hash();
    -            if our_tip.hash != server_blockhash {
    -                continue; // reorg
    -            } else {
    -                break update;
    -            }
    -        };
    -
    -        let last_active_index = 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<_, _>>();
    -
    -        Ok(ElectrumUpdate {
    -            chain_update: update,
    -            last_active_indices: last_active_index,
    -        })
    -    }
    -}
    -
    -/// The result of [`ElectrumExt::scan`].
    -pub struct ElectrumUpdate<K, P> {
    -    /// The internal [`SparseChain`] update.
    -    pub chain_update: SparseChain<P>,
    -    /// The last keychain script pubkey indices, which had transaction histories.
    -    pub last_active_indices: BTreeMap<K, u32>,
    -}
    -
    -impl<K, P> Default for ElectrumUpdate<K, P> {
    -    fn default() -> Self {
    -        Self {
    -            chain_update: Default::default(),
    -            last_active_indices: Default::default(),
    -        }
    -    }
    -}
    -
    -impl<K, P> AsRef<SparseChain<P>> for ElectrumUpdate<K, P> {
    -    fn as_ref(&self) -> &SparseChain<P> {
    -        &self.chain_update
    -    }
    -}
    -
    -impl<K: Ord + Clone + Debug, P: ChainPosition> ElectrumUpdate<K, P> {
    -    /// Return a list of missing full transactions that are required to [`inflate_update`].
    -    ///
    -    /// [`inflate_update`]: bdk_chain::chain_graph::ChainGraph::inflate_update
    -    pub fn missing_full_txs<G>(&self, graph: G) -> Vec<&Txid>
    -    where
    -        G: AsRef<TxGraph>,
    -    {
    -        self.chain_update
    -            .txids()
    -            .filter(|(_, txid)| graph.as_ref().get_tx(*txid).is_none())
    -            .map(|(_, txid)| txid)
    -            .collect()
    -    }
    -
    -    /// Transform the [`ElectrumUpdate`] into a [`KeychainScan`], which can be applied to a
    -    /// `tracker`.
    -    ///
    -    /// This will fail if there are missing full transactions not provided via `new_txs`.
    -    pub fn into_keychain_scan<CG>(
    -        self,
    -        new_txs: Vec<Transaction>,
    -        chain_graph: &CG,
    -    ) -> Result<KeychainScan<K, P>, chain_graph::NewError<P>>
    -    where
    -        CG: AsRef<ChainGraph<P>>,
    -    {
    -        Ok(KeychainScan {
    -            update: chain_graph
    -                .as_ref()
    -                .inflate_update(self.chain_update, new_txs)?,
    -            last_active_indices: self.last_active_indices,
    -        })
    -    }
    -}
    -
    -impl<K: Ord + Clone + Debug> ElectrumUpdate<K, TxHeight> {
    -    /// Creates [`ElectrumUpdate<K, ConfirmationTime>`] from [`ElectrumUpdate<K, TxHeight>`].
    -    pub fn into_confirmation_time_update(
    -        self,
    -        client: &electrum_client::Client,
    -    ) -> Result<ElectrumUpdate<K, ConfirmationTime>, Error> {
    -        let heights = self
    -            .chain_update
    -            .range_txids_by_height(..TxHeight::Unconfirmed)
    -            .map(|(h, _)| match h {
    -                TxHeight::Confirmed(h) => *h,
    -                _ => unreachable!("already filtered out unconfirmed"),
    -            })
    -            .collect::<Vec<u32>>();
    -
    -        let height_to_time = heights
    -            .clone()
    -            .into_iter()
    -            .zip(
    -                client
    -                    .batch_block_header(heights)?
    -                    .into_iter()
    -                    .map(|bh| bh.time as u64),
    -            )
    -            .collect::<HashMap<u32, u64>>();
    -
    -        let mut new_update = SparseChain::<ConfirmationTime>::from_checkpoints(
    -            self.chain_update.range_checkpoints(..),
    -        );
    -
    -        for &(tx_height, txid) in self.chain_update.txids() {
    -            let conf_time = match tx_height {
    -                TxHeight::Confirmed(height) => ConfirmationTime::Confirmed {
    -                    height,
    -                    time: height_to_time[&height],
    -                },
    -                TxHeight::Unconfirmed => ConfirmationTime::Unconfirmed,
    -            };
    -            let _ = new_update.insert_tx(txid, conf_time).expect("must insert");
    -        }
    -
    -        Ok(ElectrumUpdate {
    -            chain_update: new_update,
    -            last_active_indices: self.last_active_indices,
    -        })
    -    }
    -}
    -
    -#[derive(Debug)]
    -enum InternalError {
    -    ElectrumError(Error),
    -    Reorg,
    -}
    -
    -impl From<electrum_client::Error> for InternalError {
    -    fn from(value: electrum_client::Error) -> Self {
    -        Self::ElectrumError(value)
    -    }
    -}
    +pub use electrum_ext::*;
     
     fn get_tip(client: &Client) -> Result<(u32, BlockHash), Error> {
         // TODO: unsubscribe when added to the client, or is there a better call to use here?
    @@ -914,265 +68,5 @@
             .block_headers_subscribe()
             .map(|data| (data.height as u32, data.header.block_hash()))
     }
    -
    -/// Prepare an update sparsechain "template" based on the checkpoints of the `local_chain`.
    -fn prepare_update(
    -    client: &Client,
    -    local_chain: &BTreeMap<u32, BlockHash>,
    -) -> Result<SparseChain, Error> {
    -    let mut update = SparseChain::default();
    -
    -    // Find the local chain block that is still there so our update can connect to the local chain.
    -    for (&existing_height, &existing_hash) in local_chain.iter().rev() {
    -        // TODO: a batch request may be safer, as a reorg that happens when we are obtaining
    -        //       `block_header`s will result in inconsistencies
    -        let current_hash = client.block_header(existing_height as usize)?.block_hash();
    -        let _ = update
    -            .insert_checkpoint(BlockId {
    -                height: existing_height,
    -                hash: current_hash,
    -            })
    -            .expect("This never errors because we are working with a fresh chain");
    -
    -        if current_hash == existing_hash {
    -            break;
    -        }
    -    }
    -
    -    // Insert the new tip so new transactions will be accepted into the sparsechain.
    -    let tip = {
    -        let (height, hash) = get_tip(client)?;
    -        BlockId { height, hash }
    -    };
    -    if let Err(failure) = update.insert_checkpoint(tip) {
    -        match failure {
    -            sparse_chain::InsertCheckpointError::HashNotMatching { .. } => {
    -                // There has been a re-org before we even begin scanning addresses.
    -                // Just recursively call (this should never happen).
    -                return prepare_update(client, local_chain);
    -            }
    -        }
    -    }
    -
    -    Ok(update)
    -}
    -
    -/// This atrocity is required because electrum thinks a height of 0 means "unconfirmed", but there is
    -/// such thing as a genesis block.
    -///
    -/// We contain an expectation for the genesis coinbase txid to always have a chain position of
    -/// [`TxHeight::Confirmed(0)`].
    -fn determine_tx_height(raw_height: i32, tip_height: u32, txid: Txid) -> TxHeight {
    -    if txid
    -        == Txid::from_hex("4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b")
    -            .expect("must deserialize genesis coinbase txid")
    -    {
    -        return TxHeight::Confirmed(0);
    -    }
    -    match raw_height {
    -        h if h <= 0 => {
    -            debug_assert!(
    -                h == 0 || h == -1,
    -                "unexpected height ({}) from electrum server",
    -                h
    -            );
    -            TxHeight::Unconfirmed
    -        }
    -        h => {
    -            let h = h as u32;
    -            if h > tip_height {
    -                TxHeight::Unconfirmed
    -            } else {
    -                TxHeight::Confirmed(h)
    -            }
    -        }
    -    }
    -}
    -
    -/// Populates the update [`SparseChain`] with related transactions and associated [`ChainPosition`]s
    -/// of the provided `outpoints` (this is the tx which contains the outpoint and the one spending the
    -/// outpoint).
    -///
    -/// Unfortunately, this is awkward to implement as electrum does not provide such an API. Instead, we
    -/// will get the tx history of the outpoint's spk and try to find the containing tx and the
    -/// spending tx.
    -fn populate_with_outpoints(
    -    client: &Client,
    -    update: &mut SparseChain,
    -    outpoints: &mut impl Iterator<Item = OutPoint>,
    -) -> Result<HashMap<Txid, Transaction>, InternalError> {
    -    let tip = update
    -        .latest_checkpoint()
    -        .expect("update must atleast have one checkpoint");
    -
    -    let mut full_txs = HashMap::new();
    -    for outpoint in outpoints {
    -        let txid = outpoint.txid;
    -        let tx = client.transaction_get(&txid)?;
    -        debug_assert_eq!(tx.txid(), txid);
    -        let txout = match tx.output.get(outpoint.vout as usize) {
    -            Some(txout) => txout,
    -            None => continue,
    -        };
    -
    -        // 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(&txout.script_pubkey)? {
    -            if has_residing && has_spending {
    -                break;
    -            }
    -
    -            if res.tx_hash == txid {
    -                if has_residing {
    -                    continue;
    -                }
    -                has_residing = true;
    -                full_txs.insert(res.tx_hash, tx.clone());
    -            } else {
    -                if has_spending {
    -                    continue;
    -                }
    -                let res_tx = match full_txs.get(&res.tx_hash) {
    -                    Some(tx) => tx,
    -                    None => {
    -                        let res_tx = client.transaction_get(&res.tx_hash)?;
    -                        full_txs.insert(res.tx_hash, res_tx);
    -                        full_txs.get(&res.tx_hash).expect("just inserted")
    -                    }
    -                };
    -                has_spending = res_tx
    -                    .input
    -                    .iter()
    -                    .any(|txin| txin.previous_output == outpoint);
    -                if !has_spending {
    -                    continue;
    -                }
    -            };
    -
    -            let tx_height = determine_tx_height(res.height, tip.height, res.tx_hash);
    -
    -            if let Err(failure) = update.insert_tx(res.tx_hash, tx_height) {
    -                match failure {
    -                    sparse_chain::InsertTxError::TxTooHigh { .. } => {
    -                        unreachable!("we should never encounter this as we ensured height <= tip");
    -                    }
    -                    sparse_chain::InsertTxError::TxMovedUnexpectedly { .. } => {
    -                        return Err(InternalError::Reorg);
    -                    }
    -                }
    -            }
    -        }
    -    }
    -    Ok(full_txs)
    -}
    -
    -/// Populate an update [`SparseChain`] with transactions (and associated block positions) from
    -/// the given `txids`.
    -fn populate_with_txids(
    -    client: &Client,
    -    update: &mut SparseChain,
    -    txids: &mut impl Iterator<Item = Txid>,
    -) -> Result<(), InternalError> {
    -    let tip = update
    -        .latest_checkpoint()
    -        .expect("update must have atleast one checkpoint");
    -    for txid in txids {
    -        let tx = match client.transaction_get(&txid) {
    -            Ok(tx) => tx,
    -            Err(electrum_client::Error::Protocol(_)) => continue,
    -            Err(other_err) => return Err(other_err.into()),
    -        };
    -
    -        let spk = tx
    -            .output
    -            .get(0)
    -            .map(|txo| &txo.script_pubkey)
    -            .expect("tx must have an output");
    -
    -        let tx_height = match client
    -            .script_get_history(spk)?
    -            .into_iter()
    -            .find(|r| r.tx_hash == txid)
    -        {
    -            Some(r) => determine_tx_height(r.height, tip.height, r.tx_hash),
    -            None => continue,
    -        };
    -
    -        if let Err(failure) = update.insert_tx(txid, tx_height) {
    -            match failure {
    -                sparse_chain::InsertTxError::TxTooHigh { .. } => {
    -                    unreachable!("we should never encounter this as we ensured height <= tip");
    -                }
    -                sparse_chain::InsertTxError::TxMovedUnexpectedly { .. } => {
    -                    return Err(InternalError::Reorg);
    -                }
    -            }
    -        }
    -    }
    -    Ok(())
    -}
    -
    -/// Populate an update [`SparseChain`] with transactions (and associated block positions) from
    -/// the transaction history of the provided `spk`s.
    -fn populate_with_spks<K, I, S>(
    -    client: &Client,
    -    update: &mut SparseChain,
    -    spks: &mut S,
    -    stop_gap: usize,
    -    batch_size: usize,
    -) -> Result<BTreeMap<I, (Script, bool)>, InternalError>
    -where
    -    K: Ord + Clone,
    -    I: Ord + Clone,
    -    S: Iterator<Item = (I, Script)>,
    -{
    -    let tip = update.latest_checkpoint().map_or(0, |cp| cp.height);
    -    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))?;
    -
    -        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 in spk_history {
    -                let tx_height = determine_tx_height(tx.height, tip, tx.tx_hash);
    -
    -                if let Err(failure) = update.insert_tx(tx.tx_hash, tx_height) {
    -                    match failure {
    -                        sparse_chain::InsertTxError::TxTooHigh { .. } => {
    -                            unreachable!(
    -                                "we should never encounter this as we ensured height <= tip"
    -                            );
    -                        }
    -                        sparse_chain::InsertTxError::TxMovedUnexpectedly { .. } => {
    -                            return Err(InternalError::Reorg);
    -                        }
    -                    }
    -                }
    -            }
    -        }
    -    }
    -}
     
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_esplora/async_ext.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_esplora/async_ext.rs.html index 58854a1a15..5bdfe15619 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_esplora/async_ext.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_esplora/async_ext.rs.html @@ -267,66 +267,17 @@ 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 -
    use std::collections::BTreeMap;
    -
    -use async_trait::async_trait;
    +
    use async_trait::async_trait;
     use bdk_chain::{
         bitcoin::{BlockHash, OutPoint, Script, Txid},
    -    chain_graph::ChainGraph,
    -    keychain::KeychainScan,
    -    sparse_chain, BlockId, ConfirmationTime,
    +    collections::BTreeMap,
    +    keychain::LocalUpdate,
    +    BlockId, ConfirmationTimeAnchor,
     };
    -use esplora_client::{Error, OutputStatus};
    -use futures::stream::{FuturesOrdered, TryStreamExt};
    +use esplora_client::{Error, OutputStatus, TxStatus};
    +use futures::{stream::FuturesOrdered, TryStreamExt};
     
    -use crate::map_confirmation_time;
    +use crate::map_confirmation_time_anchor;
     
     /// Trait to extend [`esplora_client::AsyncClient`] functionality.
     ///
    @@ -335,23 +286,21 @@
     ///
     /// [`EsploraExt`]: crate::EsploraExt
     /// [crate-level documentation]: crate
    -#[cfg(feature = "async")]
    -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
    +#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
     #[cfg_attr(not(target_arch = "wasm32"), async_trait)]
     pub trait EsploraAsyncExt {
    -    /// Scan the blockchain (via esplora) for the data specified and returns a [`KeychainScan`].
    +    /// Scan the blockchain (via esplora) for the data specified and returns a
    +    /// [`LocalUpdate<K, ConfirmationTimeAnchor>`].
         ///
         /// - `local_chain`: the most recent block hashes present locally
         /// - `keychain_spks`: keychains that we want to scan transactions for
    -    /// - `txids`: transactions for which we want updated [`ChainPosition`]s
    +    /// - `txids`: transactions for which we want updated [`ConfirmationTimeAnchor`]s
         /// - `outpoints`: transactions associated with these outpoints (residing, spending) that we
         ///     want to included in the update
         ///
         /// The scan for each keychain stops after a gap of `stop_gap` script pubkeys with no associated
         /// transactions. `parallel_requests` specifies the max number of HTTP requests to make in
         /// parallel.
    -    ///
    -    /// [`ChainPosition`]: bdk_chain::sparse_chain::ChainPosition
         #[allow(clippy::result_large_err)] // FIXME
         async fn scan<K: Ord + Clone + Send>(
             &self,
    @@ -364,7 +313,7 @@
             outpoints: impl IntoIterator<IntoIter = impl Iterator<Item = OutPoint> + Send> + Send,
             stop_gap: usize,
             parallel_requests: usize,
    -    ) -> Result<KeychainScan<K, ConfirmationTime>, Error>;
    +    ) -> Result<LocalUpdate<K, ConfirmationTimeAnchor>, Error>;
     
         /// Convenience method to call [`scan`] without requiring a keychain.
         ///
    @@ -377,31 +326,27 @@
             txids: impl IntoIterator<IntoIter = impl Iterator<Item = Txid> + Send> + Send,
             outpoints: impl IntoIterator<IntoIter = impl Iterator<Item = OutPoint> + Send> + Send,
             parallel_requests: usize,
    -    ) -> Result<ChainGraph<ConfirmationTime>, Error> {
    -        let wallet_scan = self
    -            .scan(
    -                local_chain,
    -                [(
    -                    (),
    -                    misc_spks
    -                        .into_iter()
    -                        .enumerate()
    -                        .map(|(i, spk)| (i as u32, spk)),
    -                )]
    -                .into(),
    -                txids,
    -                outpoints,
    -                usize::MAX,
    -                parallel_requests,
    -            )
    -            .await?;
    -
    -        Ok(wallet_scan.update)
    -    }
    +    ) -> Result<LocalUpdate<(), ConfirmationTimeAnchor>, Error> {
    +        self.scan(
    +            local_chain,
    +            [(
    +                (),
    +                misc_spks
    +                    .into_iter()
    +                    .enumerate()
    +                    .map(|(i, spk)| (i as u32, spk)),
    +            )]
    +            .into(),
    +            txids,
    +            outpoints,
    +            usize::MAX,
    +            parallel_requests,
    +        )
    +        .await
    +    }
     }
     
    -#[cfg(feature = "async")]
    -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
    +#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
     #[cfg_attr(not(target_arch = "wasm32"), async_trait)]
     impl EsploraAsyncExt for esplora_client::AsyncClient {
         #[allow(clippy::result_large_err)] // FIXME
    @@ -416,47 +361,35 @@
             outpoints: impl IntoIterator<IntoIter = impl Iterator<Item = OutPoint> + Send> + Send,
             stop_gap: usize,
             parallel_requests: usize,
    -    ) -> Result<KeychainScan<K, ConfirmationTime>, Error> {
    -        let txids = txids.into_iter();
    -        let outpoints = outpoints.into_iter();
    -        let parallel_requests = parallel_requests.max(1);
    -        let mut scan = KeychainScan::default();
    -        let update = &mut scan.update;
    -        let last_active_indices = &mut scan.last_active_indices;
    +    ) -> Result<LocalUpdate<K, ConfirmationTimeAnchor>, Error> {
    +        let parallel_requests = Ord::max(parallel_requests, 1);
    +
    +        let (mut update, tip_at_start) = loop {
    +            let mut update = LocalUpdate::<K, ConfirmationTimeAnchor>::default();
     
    -        for (&height, &original_hash) in local_chain.iter().rev() {
    -            let update_block_id = BlockId {
    -                height,
    -                hash: self.get_block_hash(height).await?,
    +            for (&height, &original_hash) in local_chain.iter().rev() {
    +                let update_block_id = BlockId {
    +                    height,
    +                    hash: self.get_block_hash(height).await?,
    +                };
    +                let _ = update
    +                    .chain
    +                    .insert_block(update_block_id)
    +                    .expect("cannot repeat height here");
    +                if update_block_id.hash == original_hash {
    +                    break;
    +                }
    +            }
    +
    +            let tip_at_start = BlockId {
    +                height: self.get_height().await?,
    +                hash: self.get_tip_hash().await?,
                 };
    -            let _ = update
    -                .insert_checkpoint(update_block_id)
    -                .expect("cannot repeat height here");
    -            if update_block_id.hash == original_hash {
    -                break;
    +
    +            if update.chain.insert_block(tip_at_start).is_ok() {
    +                break (update, tip_at_start);
                 }
    -        }
    -        let tip_at_start = BlockId {
    -            height: self.get_height().await?,
    -            hash: self.get_tip_hash().await?,
             };
    -        if let Err(failure) = update.insert_checkpoint(tip_at_start) {
    -            match failure {
    -                sparse_chain::InsertCheckpointError::HashNotMatching { .. } => {
    -                    // there was a re-org before we started scanning. We haven't consumed any iterators, so calling this function recursively is safe.
    -                    return EsploraAsyncExt::scan(
    -                        self,
    -                        local_chain,
    -                        keychain_spks,
    -                        txids,
    -                        outpoints,
    -                        stop_gap,
    -                        parallel_requests,
    -                    )
    -                    .await;
    -                }
    -            }
    -        }
     
             for (keychain, spks) in keychain_spks {
                 let mut spks = spks.into_iter();
    @@ -465,7 +398,7 @@
                 type IndexWithTxs = (u32, Vec<esplora_client::Tx>);
     
                 loop {
    -                let futures: FuturesOrdered<_> = (0..parallel_requests)
    +                let futures = (0..parallel_requests)
                         .filter_map(|_| {
                             let (index, script) = spks.next()?;
                             let client = self.clone();
    @@ -496,13 +429,11 @@
                                 Result::<_, esplora_client::Error>::Ok((index, related_txs))
                             })
                         })
    -                    .collect();
    +                    .collect::<FuturesOrdered<_>>();
     
                     let n_futures = futures.len();
     
    -                let idx_with_tx: Vec<IndexWithTxs> = futures.try_collect().await?;
    -
    -                for (index, related_txs) in idx_with_tx {
    +                for (index, related_txs) in futures.try_collect::<Vec<IndexWithTxs>>().await? {
                         if related_txs.is_empty() {
                             empty_scripts += 1;
                         } else {
    @@ -510,22 +441,11 @@
                             empty_scripts = 0;
                         }
                         for tx in related_txs {
    -                        let confirmation_time =
    -                            map_confirmation_time(&tx.status, tip_at_start.height);
    +                        let anchor = map_confirmation_time_anchor(&tx.status, tip_at_start);
     
    -                        if let Err(failure) = update.insert_tx(tx.to_tx(), confirmation_time) {
    -                            use bdk_chain::{
    -                                chain_graph::InsertTxError, sparse_chain::InsertTxError::*,
    -                            };
    -                            match failure {
    -                                InsertTxError::Chain(TxTooHigh { .. }) => {
    -                                    unreachable!("chain position already checked earlier")
    -                                }
    -                                InsertTxError::Chain(TxMovedUnexpectedly { .. })
    -                                | InsertTxError::UnresolvableConflict(_) => {
    -                                    /* implies reorg during a scan. We deal with that below */
    -                                }
    -                            }
    +                        let _ = update.graph.insert_tx(tx.to_tx());
    +                        if let Some(anchor) = anchor {
    +                            let _ = update.graph.insert_anchor(tx.txid, anchor);
                             }
                         }
                     }
    @@ -536,36 +456,37 @@
                 }
     
                 if let Some(last_active_index) = last_active_index {
    -                last_active_indices.insert(keychain, last_active_index);
    +                update.keychain.insert(keychain, last_active_index);
                 }
             }
     
    -        for txid in txids {
    -            let (tx, tx_status) =
    -                match (self.get_tx(&txid).await?, self.get_tx_status(&txid).await?) {
    -                    (Some(tx), Some(tx_status)) => (tx, tx_status),
    -                    _ => continue,
    -                };
    -
    -            let confirmation_time = map_confirmation_time(&tx_status, tip_at_start.height);
    -
    -            if let Err(failure) = update.insert_tx(tx, confirmation_time) {
    -                use bdk_chain::{chain_graph::InsertTxError, sparse_chain::InsertTxError::*};
    -                match failure {
    -                    InsertTxError::Chain(TxTooHigh { .. }) => {
    -                        unreachable!("chain position already checked earlier")
    +        for txid in txids.into_iter() {
    +            if update.graph.get_tx(txid).is_none() {
    +                match self.get_tx(&txid).await? {
    +                    Some(tx) => {
    +                        let _ = update.graph.insert_tx(tx);
                         }
    -                    InsertTxError::Chain(TxMovedUnexpectedly { .. })
    -                    | InsertTxError::UnresolvableConflict(_) => {
    -                        /* implies reorg during a scan. We deal with that below */
    -                    }
    +                    None => continue,
                     }
                 }
    +            match self.get_tx_status(&txid).await? {
    +                tx_status if tx_status.confirmed => {
    +                    if let Some(anchor) = map_confirmation_time_anchor(&tx_status, tip_at_start) {
    +                        let _ = update.graph.insert_anchor(txid, anchor);
    +                    }
    +                }
    +                _ => continue,
    +            }
             }
     
    -        for op in outpoints {
    +        for op in outpoints.into_iter() {
                 let mut op_txs = Vec::with_capacity(2);
    -            if let (Some(tx), Some(tx_status)) = (
    +            if let (
    +                Some(tx),
    +                tx_status @ TxStatus {
    +                    confirmed: true, ..
    +                },
    +            ) = (
                     self.get_tx(&op.txid).await?,
                     self.get_tx_status(&op.txid).await?,
                 ) {
    @@ -583,40 +504,24 @@
                 }
     
                 for (tx, status) in op_txs {
    -                let confirmation_time = map_confirmation_time(&status, tip_at_start.height);
    +                let txid = tx.txid();
    +                let anchor = map_confirmation_time_anchor(&status, tip_at_start);
     
    -                if let Err(failure) = update.insert_tx(tx, confirmation_time) {
    -                    use bdk_chain::{chain_graph::InsertTxError, sparse_chain::InsertTxError::*};
    -                    match failure {
    -                        InsertTxError::Chain(TxTooHigh { .. }) => {
    -                            unreachable!("chain position already checked earlier")
    -                        }
    -                        InsertTxError::Chain(TxMovedUnexpectedly { .. })
    -                        | InsertTxError::UnresolvableConflict(_) => {
    -                            /* implies reorg during a scan. We deal with that below */
    -                        }
    -                    }
    +                let _ = update.graph.insert_tx(tx);
    +                if let Some(anchor) = anchor {
    +                    let _ = update.graph.insert_anchor(txid, anchor);
                     }
                 }
             }
     
    -        let reorg_occurred = {
    -            if let Some(checkpoint) = update.chain().latest_checkpoint() {
    -                self.get_block_hash(checkpoint.height).await? != checkpoint.hash
    -            } else {
    -                false
    -            }
    -        };
    -
    -        if reorg_occurred {
    -            // A reorg occurred, so let's find out where all the txids we found are in the chain now.
    -            // XXX: collect required because of weird type naming issues
    +        if tip_at_start.hash != self.get_block_hash(tip_at_start.height).await? {
    +            // A reorg occurred, so let's find out where all the txids we found are now in the chain
                 let txids_found = update
    -                .chain()
    -                .txids()
    -                .map(|(_, txid)| *txid)
    +                .graph
    +                .full_txs()
    +                .map(|tx_node| tx_node.txid)
                     .collect::<Vec<_>>();
    -            scan.update = EsploraAsyncExt::scan_without_keychain(
    +            update.chain = EsploraAsyncExt::scan_without_keychain(
                     self,
                     local_chain,
                     [],
    @@ -624,10 +529,11 @@
                     [],
                     parallel_requests,
                 )
    -            .await?;
    +            .await?
    +            .chain;
             }
     
    -        Ok(scan)
    +        Ok(update)
         }
     }
     
    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_esplora/blocking_ext.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_esplora/blocking_ext.rs.html index 19b5f4c452..2ecb7f309b 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_esplora/blocking_ext.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_esplora/blocking_ext.rs.html @@ -249,56 +249,13 @@ 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 -
    use std::collections::BTreeMap;
    +
    use bdk_chain::bitcoin::{BlockHash, OutPoint, Script, Txid};
    +use bdk_chain::collections::BTreeMap;
    +use bdk_chain::BlockId;
    +use bdk_chain::{keychain::LocalUpdate, ConfirmationTimeAnchor};
    +use esplora_client::{Error, OutputStatus, TxStatus};
     
    -use bdk_chain::{
    -    bitcoin::{BlockHash, OutPoint, Script, Txid},
    -    chain_graph::ChainGraph,
    -    keychain::KeychainScan,
    -    sparse_chain, BlockId, ConfirmationTime,
    -};
    -use esplora_client::{Error, OutputStatus};
    -
    -use crate::map_confirmation_time;
    +use crate::map_confirmation_time_anchor;
     
     /// Trait to extend [`esplora_client::BlockingClient`] functionality.
     ///
    @@ -306,19 +263,18 @@
     ///
     /// [crate-level documentation]: crate
     pub trait EsploraExt {
    -    /// Scan the blockchain (via esplora) for the data specified and returns a [`KeychainScan`].
    +    /// Scan the blockchain (via esplora) for the data specified and returns a
    +    /// [`LocalUpdate<K, ConfirmationTimeAnchor>`].
         ///
         /// - `local_chain`: the most recent block hashes present locally
         /// - `keychain_spks`: keychains that we want to scan transactions for
    -    /// - `txids`: transactions for which we want updated [`ChainPosition`]s
    +    /// - `txids`: transactions for which we want updated [`ConfirmationTimeAnchor`]s
         /// - `outpoints`: transactions associated with these outpoints (residing, spending) that we
         ///     want to included in the update
         ///
         /// The scan for each keychain stops after a gap of `stop_gap` script pubkeys with no associated
         /// transactions. `parallel_requests` specifies the max number of HTTP requests to make in
         /// parallel.
    -    ///
    -    /// [`ChainPosition`]: bdk_chain::sparse_chain::ChainPosition
         #[allow(clippy::result_large_err)] // FIXME
         fn scan<K: Ord + Clone>(
             &self,
    @@ -328,7 +284,7 @@
             outpoints: impl IntoIterator<Item = OutPoint>,
             stop_gap: usize,
             parallel_requests: usize,
    -    ) -> Result<KeychainScan<K, ConfirmationTime>, Error>;
    +    ) -> Result<LocalUpdate<K, ConfirmationTimeAnchor>, Error>;
     
         /// Convenience method to call [`scan`] without requiring a keychain.
         ///
    @@ -341,8 +297,8 @@
             txids: impl IntoIterator<Item = Txid>,
             outpoints: impl IntoIterator<Item = OutPoint>,
             parallel_requests: usize,
    -    ) -> Result<ChainGraph<ConfirmationTime>, Error> {
    -        let wallet_scan = self.scan(
    +    ) -> Result<LocalUpdate<(), ConfirmationTimeAnchor>, Error> {
    +        self.scan(
                 local_chain,
                 [(
                     (),
    @@ -356,9 +312,7 @@
                 outpoints,
                 usize::MAX,
                 parallel_requests,
    -        )?;
    -
    -        Ok(wallet_scan.update)
    +        )
         }
     }
     
    @@ -371,44 +325,35 @@
             outpoints: impl IntoIterator<Item = OutPoint>,
             stop_gap: usize,
             parallel_requests: usize,
    -    ) -> Result<KeychainScan<K, ConfirmationTime>, Error> {
    -        let parallel_requests = parallel_requests.max(1);
    -        let mut scan = KeychainScan::default();
    -        let update = &mut scan.update;
    -        let last_active_indices = &mut scan.last_active_indices;
    +    ) -> Result<LocalUpdate<K, ConfirmationTimeAnchor>, Error> {
    +        let parallel_requests = Ord::max(parallel_requests, 1);
    +
    +        let (mut update, tip_at_start) = loop {
    +            let mut update = LocalUpdate::<K, ConfirmationTimeAnchor>::default();
     
    -        for (&height, &original_hash) in local_chain.iter().rev() {
    -            let update_block_id = BlockId {
    -                height,
    -                hash: self.get_block_hash(height)?,
    +            for (&height, &original_hash) in local_chain.iter().rev() {
    +                let update_block_id = BlockId {
    +                    height,
    +                    hash: self.get_block_hash(height)?,
    +                };
    +                let _ = update
    +                    .chain
    +                    .insert_block(update_block_id)
    +                    .expect("cannot repeat height here");
    +                if update_block_id.hash == original_hash {
    +                    break;
    +                }
    +            }
    +
    +            let tip_at_start = BlockId {
    +                height: self.get_height()?,
    +                hash: self.get_tip_hash()?,
                 };
    -            let _ = update
    -                .insert_checkpoint(update_block_id)
    -                .expect("cannot repeat height here");
    -            if update_block_id.hash == original_hash {
    -                break;
    +
    +            if update.chain.insert_block(tip_at_start).is_ok() {
    +                break (update, tip_at_start);
                 }
    -        }
    -        let tip_at_start = BlockId {
    -            height: self.get_height()?,
    -            hash: self.get_tip_hash()?,
             };
    -        if let Err(failure) = update.insert_checkpoint(tip_at_start) {
    -            match failure {
    -                sparse_chain::InsertCheckpointError::HashNotMatching { .. } => {
    -                    // there was a re-org before we started scanning. We haven't consumed any iterators, so calling this function recursively is safe.
    -                    return EsploraExt::scan(
    -                        self,
    -                        local_chain,
    -                        keychain_spks,
    -                        txids,
    -                        outpoints,
    -                        stop_gap,
    -                        parallel_requests,
    -                    );
    -                }
    -            }
    -        }
     
             for (keychain, spks) in keychain_spks {
                 let mut spks = spks.into_iter();
    @@ -461,22 +406,11 @@
                             empty_scripts = 0;
                         }
                         for tx in related_txs {
    -                        let confirmation_time =
    -                            map_confirmation_time(&tx.status, tip_at_start.height);
    +                        let anchor = map_confirmation_time_anchor(&tx.status, tip_at_start);
     
    -                        if let Err(failure) = update.insert_tx(tx.to_tx(), confirmation_time) {
    -                            use bdk_chain::{
    -                                chain_graph::InsertTxError, sparse_chain::InsertTxError::*,
    -                            };
    -                            match failure {
    -                                InsertTxError::Chain(TxTooHigh { .. }) => {
    -                                    unreachable!("chain position already checked earlier")
    -                                }
    -                                InsertTxError::Chain(TxMovedUnexpectedly { .. })
    -                                | InsertTxError::UnresolvableConflict(_) => {
    -                                    /* implies reorg during a scan. We deal with that below */
    -                                }
    -                            }
    +                        let _ = update.graph.insert_tx(tx.to_tx());
    +                        if let Some(anchor) = anchor {
    +                            let _ = update.graph.insert_anchor(tx.txid, anchor);
                             }
                         }
                     }
    @@ -487,36 +421,39 @@
                 }
     
                 if let Some(last_active_index) = last_active_index {
    -                last_active_indices.insert(keychain, last_active_index);
    +                update.keychain.insert(keychain, last_active_index);
                 }
             }
     
             for txid in txids.into_iter() {
    -            let (tx, tx_status) = match (self.get_tx(&txid)?, self.get_tx_status(&txid)?) {
    -                (Some(tx), Some(tx_status)) => (tx, tx_status),
    -                _ => continue,
    -            };
    -
    -            let confirmation_time = map_confirmation_time(&tx_status, tip_at_start.height);
    -
    -            if let Err(failure) = update.insert_tx(tx, confirmation_time) {
    -                use bdk_chain::{chain_graph::InsertTxError, sparse_chain::InsertTxError::*};
    -                match failure {
    -                    InsertTxError::Chain(TxTooHigh { .. }) => {
    -                        unreachable!("chain position already checked earlier")
    +            if update.graph.get_tx(txid).is_none() {
    +                match self.get_tx(&txid)? {
    +                    Some(tx) => {
    +                        let _ = update.graph.insert_tx(tx);
                         }
    -                    InsertTxError::Chain(TxMovedUnexpectedly { .. })
    -                    | InsertTxError::UnresolvableConflict(_) => {
    -                        /* implies reorg during a scan. We deal with that below */
    -                    }
    +                    None => continue,
                     }
                 }
    +            match self.get_tx_status(&txid)? {
    +                tx_status @ TxStatus {
    +                    confirmed: true, ..
    +                } => {
    +                    if let Some(anchor) = map_confirmation_time_anchor(&tx_status, tip_at_start) {
    +                        let _ = update.graph.insert_anchor(txid, anchor);
    +                    }
    +                }
    +                _ => continue,
    +            }
             }
     
             for op in outpoints.into_iter() {
                 let mut op_txs = Vec::with_capacity(2);
    -            if let (Some(tx), Some(tx_status)) =
    -                (self.get_tx(&op.txid)?, self.get_tx_status(&op.txid)?)
    +            if let (
    +                Some(tx),
    +                tx_status @ TxStatus {
    +                    confirmed: true, ..
    +                },
    +            ) = (self.get_tx(&op.txid)?, self.get_tx_status(&op.txid)?)
                 {
                     op_txs.push((tx, tx_status));
                     if let Some(OutputStatus {
    @@ -532,50 +469,35 @@
                 }
     
                 for (tx, status) in op_txs {
    -                let confirmation_time = map_confirmation_time(&status, tip_at_start.height);
    +                let txid = tx.txid();
    +                let anchor = map_confirmation_time_anchor(&status, tip_at_start);
     
    -                if let Err(failure) = update.insert_tx(tx, confirmation_time) {
    -                    use bdk_chain::{chain_graph::InsertTxError, sparse_chain::InsertTxError::*};
    -                    match failure {
    -                        InsertTxError::Chain(TxTooHigh { .. }) => {
    -                            unreachable!("chain position already checked earlier")
    -                        }
    -                        InsertTxError::Chain(TxMovedUnexpectedly { .. })
    -                        | InsertTxError::UnresolvableConflict(_) => {
    -                            /* implies reorg during a scan. We deal with that below */
    -                        }
    -                    }
    +                let _ = update.graph.insert_tx(tx);
    +                if let Some(anchor) = anchor {
    +                    let _ = update.graph.insert_anchor(txid, anchor);
                     }
                 }
             }
     
    -        let reorg_occurred = {
    -            if let Some(checkpoint) = update.chain().latest_checkpoint() {
    -                self.get_block_hash(checkpoint.height)? != checkpoint.hash
    -            } else {
    -                false
    -            }
    -        };
    -
    -        if reorg_occurred {
    -            // A reorg occurred, so let's find out where all the txids we found are now in the chain.
    -            // XXX: collect required because of weird type naming issues
    +        if tip_at_start.hash != self.get_block_hash(tip_at_start.height)? {
    +            // A reorg occurred, so let's find out where all the txids we found are now in the chain
                 let txids_found = update
    -                .chain()
    -                .txids()
    -                .map(|(_, txid)| *txid)
    +                .graph
    +                .full_txs()
    +                .map(|tx_node| tx_node.txid)
                     .collect::<Vec<_>>();
    -            scan.update = EsploraExt::scan_without_keychain(
    +            update.chain = EsploraExt::scan_without_keychain(
                     self,
                     local_chain,
                     [],
                     txids_found,
                     [],
                     parallel_requests,
    -            )?;
    +            )?
    +            .chain;
             }
     
    -        Ok(scan)
    +        Ok(update)
         }
     }
     
    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_esplora/lib.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_esplora/lib.rs.html index afe1321511..70ad77f97f 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_esplora/lib.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_esplora/lib.rs.html @@ -25,8 +25,10 @@ 25 26 27 +28 +29
    #![doc = include_str!("../README.md")]
    -use bdk_chain::ConfirmationTime;
    +use bdk_chain::{BlockId, ConfirmationTimeAnchor};
     use esplora_client::TxStatus;
     
     pub use esplora_client;
    @@ -41,15 +43,17 @@
     #[cfg(feature = "async")]
     pub use async_ext::*;
     
    -pub(crate) fn map_confirmation_time(
    +pub(crate) fn map_confirmation_time_anchor(
         tx_status: &TxStatus,
    -    height_at_start: u32,
    -) -> ConfirmationTime {
    +    tip_at_start: BlockId,
    +) -> Option<ConfirmationTimeAnchor> {
         match (tx_status.block_time, tx_status.block_height) {
    -        (Some(time), Some(height)) if height <= height_at_start => {
    -            ConfirmationTime::Confirmed { height, time }
    -        }
    -        _ => ConfirmationTime::Unconfirmed,
    +        (Some(confirmation_time), Some(confirmation_height)) => Some(ConfirmationTimeAnchor {
    +            anchor_block: tip_at_start,
    +            confirmation_height,
    +            confirmation_time,
    +        }),
    +        _ => None,
         }
     }
     
    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_file_store/keychain_store.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_file_store/keychain_store.rs.html deleted file mode 100644 index ee55b1bba4..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_file_store/keychain_store.rs.html +++ /dev/null @@ -1,628 +0,0 @@ -keychain_store.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
    -
    //! Module for persisting data on disk.
    -//!
    -//! The star of the show is [`KeychainStore`], which maintains an append-only file of
    -//! [`KeychainChangeSet`]s which can be used to restore a [`KeychainTracker`].
    -use bdk_chain::{
    -    keychain::{KeychainChangeSet, KeychainTracker},
    -    sparse_chain,
    -};
    -use bincode::Options;
    -use std::{
    -    fs::{File, OpenOptions},
    -    io::{self, Read, Seek, Write},
    -    path::Path,
    -};
    -
    -use crate::{bincode_options, EntryIter, IterError};
    -
    -/// BDK File Store magic bytes length.
    -const MAGIC_BYTES_LEN: usize = 12;
    -
    -/// BDK File Store magic bytes.
    -const MAGIC_BYTES: [u8; MAGIC_BYTES_LEN] = [98, 100, 107, 102, 115, 48, 48, 48, 48, 48, 48, 48];
    -
    -/// Persists an append only list of `KeychainChangeSet<K,P>` to a single file.
    -/// [`KeychainChangeSet<K,P>`] record the changes made to a [`KeychainTracker<K,P>`].
    -#[derive(Debug)]
    -pub struct KeychainStore<K, P> {
    -    db_file: File,
    -    changeset_type_params: core::marker::PhantomData<(K, P)>,
    -}
    -
    -impl<K, P> KeychainStore<K, P>
    -where
    -    K: Ord + Clone + core::fmt::Debug,
    -    P: sparse_chain::ChainPosition,
    -    KeychainChangeSet<K, P>: serde::Serialize + serde::de::DeserializeOwned,
    -{
    -    /// Creates a new store from a [`File`].
    -    ///
    -    /// The file must have been opened with read and write permissions.
    -    ///
    -    /// [`File`]: std::fs::File
    -    pub fn new(mut file: File) -> Result<Self, FileError> {
    -        file.rewind()?;
    -
    -        let mut magic_bytes = [0_u8; MAGIC_BYTES_LEN];
    -        file.read_exact(&mut magic_bytes)?;
    -
    -        if magic_bytes != MAGIC_BYTES {
    -            return Err(FileError::InvalidMagicBytes(magic_bytes));
    -        }
    -
    -        Ok(Self {
    -            db_file: file,
    -            changeset_type_params: Default::default(),
    -        })
    -    }
    -
    -    /// Creates or loads a store from `db_path`. If no file exists there, it will be created.
    -    pub fn new_from_path<D: AsRef<Path>>(db_path: D) -> Result<Self, FileError> {
    -        let already_exists = db_path.as_ref().exists();
    -
    -        let mut db_file = OpenOptions::new()
    -            .read(true)
    -            .write(true)
    -            .create(true)
    -            .open(db_path)?;
    -
    -        if !already_exists {
    -            db_file.write_all(&MAGIC_BYTES)?;
    -        }
    -
    -        Self::new(db_file)
    -    }
    -
    -    /// Iterates over the stored changeset from first to last, changing the seek position at each
    -    /// iteration.
    -    ///
    -    /// The iterator may fail to read an entry and therefore return an error. However, the first time
    -    /// it returns an error will be the last. After doing so, the iterator will always yield `None`.
    -    ///
    -    /// **WARNING**: This method changes the write position in the underlying file. You should
    -    /// always iterate over all entries until `None` is returned if you want your next write to go
    -    /// at the end; otherwise, you will write over existing entries.
    -    pub fn iter_changesets(&mut self) -> Result<EntryIter<KeychainChangeSet<K, P>>, io::Error> {
    -        Ok(EntryIter::new(MAGIC_BYTES_LEN as u64, &mut self.db_file))
    -    }
    -
    -    /// Loads all the changesets that have been stored as one giant changeset.
    -    ///
    -    /// This function returns a tuple of the aggregate changeset and a result that indicates
    -    /// whether an error occurred while reading or deserializing one of the entries. If so the
    -    /// changeset will consist of all of those it was able to read.
    -    ///
    -    /// You should usually check the error. In many applications, it may make sense to do a full
    -    /// wallet scan with a stop-gap after getting an error, since it is likely that one of the
    -    /// changesets it was unable to read changed the derivation indices of the tracker.
    -    ///
    -    /// **WARNING**: This method changes the write position of the underlying file. The next
    -    /// changeset will be written over the erroring entry (or the end of the file if none existed).
    -    pub fn aggregate_changeset(&mut self) -> (KeychainChangeSet<K, P>, Result<(), IterError>) {
    -        let mut changeset = KeychainChangeSet::default();
    -        let result = (|| {
    -            let iter_changeset = self.iter_changesets()?;
    -            for next_changeset in iter_changeset {
    -                changeset.append(next_changeset?);
    -            }
    -            Ok(())
    -        })();
    -
    -        (changeset, result)
    -    }
    -
    -    /// Reads and applies all the changesets stored sequentially to the tracker, stopping when it fails
    -    /// to read the next one.
    -    ///
    -    /// **WARNING**: This method changes the write position of the underlying file. The next
    -    /// changeset will be written over the erroring entry (or the end of the file if none existed).
    -    pub fn load_into_keychain_tracker(
    -        &mut self,
    -        tracker: &mut KeychainTracker<K, P>,
    -    ) -> Result<(), IterError> {
    -        for changeset in self.iter_changesets()? {
    -            tracker.apply_changeset(changeset?)
    -        }
    -        Ok(())
    -    }
    -
    -    /// Append a new changeset to the file and truncate the file to the end of the appended changeset.
    -    ///
    -    /// The truncation is to avoid the possibility of having a valid but inconsistent changeset
    -    /// directly after the appended changeset.
    -    pub fn append_changeset(
    -        &mut self,
    -        changeset: &KeychainChangeSet<K, P>,
    -    ) -> Result<(), io::Error> {
    -        if changeset.is_empty() {
    -            return Ok(());
    -        }
    -
    -        bincode_options()
    -            .serialize_into(&mut self.db_file, changeset)
    -            .map_err(|e| match *e {
    -                bincode::ErrorKind::Io(inner) => inner,
    -                unexpected_err => panic!("unexpected bincode error: {}", unexpected_err),
    -            })?;
    -
    -        // truncate file after this changeset addition
    -        // if this is not done, data after this changeset may represent valid changesets, however
    -        // applying those changesets on top of this one may result in an inconsistent state
    -        let pos = self.db_file.stream_position()?;
    -        self.db_file.set_len(pos)?;
    -
    -        // We want to make sure that derivation indices changes are written to disk as soon as
    -        // possible, so you know about the write failure before you give out the address in the application.
    -        if !changeset.derivation_indices.is_empty() {
    -            self.db_file.sync_data()?;
    -        }
    -
    -        Ok(())
    -    }
    -}
    -
    -/// Error that occurs due to problems encountered with the file.
    -#[derive(Debug)]
    -pub enum FileError {
    -    /// IO error, this may mean that the file is too short.
    -    Io(io::Error),
    -    /// Magic bytes do not match what is expected.
    -    InvalidMagicBytes([u8; MAGIC_BYTES_LEN]),
    -}
    -
    -impl core::fmt::Display for FileError {
    -    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
    -        match self {
    -            Self::Io(e) => write!(f, "io error trying to read file: {}", e),
    -            Self::InvalidMagicBytes(b) => write!(
    -                f,
    -                "file has invalid magic bytes: expected={:?} got={:?}",
    -                MAGIC_BYTES, b
    -            ),
    -        }
    -    }
    -}
    -
    -impl From<io::Error> for FileError {
    -    fn from(value: io::Error) -> Self {
    -        Self::Io(value)
    -    }
    -}
    -
    -impl std::error::Error for FileError {}
    -
    -#[cfg(test)]
    -mod test {
    -    use super::*;
    -    use bdk_chain::{
    -        keychain::{DerivationAdditions, KeychainChangeSet},
    -        TxHeight,
    -    };
    -    use bincode::DefaultOptions;
    -    use std::{
    -        io::{Read, Write},
    -        vec::Vec,
    -    };
    -    use tempfile::NamedTempFile;
    -    #[derive(
    -        Debug,
    -        Clone,
    -        Copy,
    -        PartialOrd,
    -        Ord,
    -        PartialEq,
    -        Eq,
    -        Hash,
    -        serde::Serialize,
    -        serde::Deserialize,
    -    )]
    -    enum TestKeychain {
    -        External,
    -        Internal,
    -    }
    -
    -    impl core::fmt::Display for TestKeychain {
    -        fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
    -            match self {
    -                Self::External => write!(f, "external"),
    -                Self::Internal => write!(f, "internal"),
    -            }
    -        }
    -    }
    -
    -    #[test]
    -    fn magic_bytes() {
    -        assert_eq!(&MAGIC_BYTES, "bdkfs0000000".as_bytes());
    -    }
    -
    -    #[test]
    -    fn new_fails_if_file_is_too_short() {
    -        let mut file = NamedTempFile::new().unwrap();
    -        file.write_all(&MAGIC_BYTES[..MAGIC_BYTES_LEN - 1])
    -            .expect("should write");
    -
    -        match KeychainStore::<TestKeychain, TxHeight>::new(file.reopen().unwrap()) {
    -            Err(FileError::Io(e)) => assert_eq!(e.kind(), std::io::ErrorKind::UnexpectedEof),
    -            unexpected => panic!("unexpected result: {:?}", unexpected),
    -        };
    -    }
    -
    -    #[test]
    -    fn new_fails_if_magic_bytes_are_invalid() {
    -        let invalid_magic_bytes = "ldkfs0000000";
    -
    -        let mut file = NamedTempFile::new().unwrap();
    -        file.write_all(invalid_magic_bytes.as_bytes())
    -            .expect("should write");
    -
    -        match KeychainStore::<TestKeychain, TxHeight>::new(file.reopen().unwrap()) {
    -            Err(FileError::InvalidMagicBytes(b)) => {
    -                assert_eq!(b, invalid_magic_bytes.as_bytes())
    -            }
    -            unexpected => panic!("unexpected result: {:?}", unexpected),
    -        };
    -    }
    -
    -    #[test]
    -    fn append_changeset_truncates_invalid_bytes() {
    -        // initial data to write to file (magic bytes + invalid data)
    -        let mut data = [255_u8; 2000];
    -        data[..MAGIC_BYTES_LEN].copy_from_slice(&MAGIC_BYTES);
    -
    -        let changeset = KeychainChangeSet {
    -            derivation_indices: DerivationAdditions(
    -                vec![(TestKeychain::External, 42)].into_iter().collect(),
    -            ),
    -            chain_graph: Default::default(),
    -        };
    -
    -        let mut file = NamedTempFile::new().unwrap();
    -        file.write_all(&data).expect("should write");
    -
    -        let mut store = KeychainStore::<TestKeychain, TxHeight>::new(file.reopen().unwrap())
    -            .expect("should open");
    -        match store.iter_changesets().expect("seek should succeed").next() {
    -            Some(Err(IterError::Bincode(_))) => {}
    -            unexpected_res => panic!("unexpected result: {:?}", unexpected_res),
    -        }
    -
    -        store.append_changeset(&changeset).expect("should append");
    -
    -        drop(store);
    -
    -        let got_bytes = {
    -            let mut buf = Vec::new();
    -            file.reopen()
    -                .unwrap()
    -                .read_to_end(&mut buf)
    -                .expect("should read");
    -            buf
    -        };
    -
    -        let expected_bytes = {
    -            let mut buf = MAGIC_BYTES.to_vec();
    -            DefaultOptions::new()
    -                .with_varint_encoding()
    -                .serialize_into(&mut buf, &changeset)
    -                .expect("should encode");
    -            buf
    -        };
    -
    -        assert_eq!(got_bytes, expected_bytes);
    -    }
    -}
    -
    -
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_file_store/lib.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_file_store/lib.rs.html index 2e7ee42797..cdaf8228c2 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_file_store/lib.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_file_store/lib.rs.html @@ -40,50 +40,13 @@ 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
    #![doc = include_str!("../README.md")]
     mod entry_iter;
    -mod keychain_store;
     mod store;
     use std::io;
     
    -use bdk_chain::{
    -    keychain::{KeychainChangeSet, KeychainTracker, PersistBackend},
    -    sparse_chain::ChainPosition,
    -};
     use bincode::{DefaultOptions, Options};
     pub use entry_iter::*;
    -pub use keychain_store::*;
     pub use store::*;
     
     pub(crate) fn bincode_options() -> impl bincode::Options {
    @@ -119,30 +82,5 @@
     }
     
     impl<'a> std::error::Error for FileError<'a> {}
    -
    -impl<K, P> PersistBackend<K, P> for KeychainStore<K, P>
    -where
    -    K: Ord + Clone + core::fmt::Debug,
    -    P: ChainPosition,
    -    KeychainChangeSet<K, P>: serde::Serialize + serde::de::DeserializeOwned,
    -{
    -    type WriteError = std::io::Error;
    -
    -    type LoadError = IterError;
    -
    -    fn append_changeset(
    -        &mut self,
    -        changeset: &KeychainChangeSet<K, P>,
    -    ) -> Result<(), Self::WriteError> {
    -        KeychainStore::append_changeset(self, changeset)
    -    }
    -
    -    fn load_into_keychain_tracker(
    -        &mut self,
    -        tracker: &mut KeychainTracker<K, P>,
    -    ) -> Result<(), Self::LoadError> {
    -        KeychainStore::load_into_keychain_tracker(self, tracker)
    -    }
    -}
     
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/keychain_tracker_example_cli/lib.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/example_cli/lib.rs.html similarity index 62% rename from docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/keychain_tracker_example_cli/lib.rs.html rename to docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/example_cli/lib.rs.html index 4feac7bbd4..c2c0e4593e 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/keychain_tracker_example_cli/lib.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/example_cli/lib.rs.html @@ -1,4 +1,4 @@ -lib.rs - source
    1
    +lib.rs - source
    1
     2
     3
     4
    @@ -690,37 +690,83 @@
     690
     691
     692
    -
    pub extern crate anyhow;
    -use anyhow::{anyhow, Context, Result};
    +693
    +694
    +695
    +696
    +697
    +698
    +699
    +700
    +701
    +702
    +703
    +704
    +705
    +706
    +707
    +708
    +709
    +710
    +711
    +712
    +713
    +714
    +715
    +716
    +717
    +718
    +719
    +720
    +721
    +722
    +723
    +724
    +725
    +726
    +727
    +728
    +729
    +730
    +731
    +732
    +733
    +734
    +735
    +736
    +
    pub use anyhow;
    +use anyhow::Context;
    +use bdk_coin_select::{coin_select_bnb, CoinSelector, CoinSelectorOpt, WeightedValue};
    +use bdk_file_store::Store;
    +use serde::{de::DeserializeOwned, Serialize};
    +use std::{cmp::Reverse, collections::HashMap, path::PathBuf, sync::Mutex, time::Duration};
    +
     use bdk_chain::{
         bitcoin::{
    -        secp256k1::Secp256k1,
    -        util::sighash::{Prevouts, SighashCache},
    -        Address, LockTime, Network, Sequence, Transaction, TxIn, TxOut,
    +        psbt::Prevouts, secp256k1::Secp256k1, util::sighash::SighashCache, Address, LockTime,
    +        Network, Sequence, Transaction, TxIn, TxOut,
         },
    -    chain_graph::InsertTxError,
    -    keychain::{DerivationAdditions, KeychainChangeSet, KeychainTracker},
    +    indexed_tx_graph::{IndexedAdditions, IndexedTxGraph},
    +    keychain::{DerivationAdditions, KeychainTxOutIndex},
         miniscript::{
             descriptor::{DescriptorSecretKey, KeyMap},
             Descriptor, DescriptorPublicKey,
         },
    -    sparse_chain::{self, ChainPosition},
    -    Append, DescriptorExt, FullTxOut,
    -};
    -use bdk_coin_select::{coin_select_bnb, CoinSelector, CoinSelectorOpt, WeightedValue};
    -use bdk_file_store::KeychainStore;
    -use clap::{Parser, Subcommand};
    -use std::{
    -    cmp::Reverse, collections::HashMap, fmt::Debug, path::PathBuf, sync::Mutex, time::Duration,
    +    Anchor, Append, ChainOracle, DescriptorExt, FullTxOut, Persist, PersistBackend,
     };
    -
     pub use bdk_file_store;
     pub use clap;
     
    +use clap::{Parser, Subcommand};
    +
    +pub type KeychainTxGraph<A> = IndexedTxGraph<A, KeychainTxOutIndex<Keychain>>;
    +pub type KeychainAdditions<A> = IndexedAdditions<A, DerivationAdditions<Keychain>>;
    +pub type Database<'m, C> = Persist<Store<'m, C>, C>;
    +
     #[derive(Parser)]
     #[clap(author, version, about, long_about = None)]
     #[clap(propagate_version = true)]
    -pub struct Args<C: clap::Subcommand> {
    +pub struct Args<S: clap::Subcommand> {
         #[clap(env = "DESCRIPTOR")]
         pub descriptor: String,
         #[clap(env = "CHANGE_DESCRIPTOR")]
    @@ -736,13 +782,14 @@
         pub cp_limit: usize,
     
         #[clap(subcommand)]
    -    pub command: Commands<C>,
    +    pub command: Commands<S>,
     }
     
    -#[derive(Subcommand, Debug, Clone)]
    -pub enum Commands<C: clap::Subcommand> {
    +#[allow(clippy::almost_swapped)]
    +#[derive(Subcommand, Debug, Clone)]
    +pub enum Commands<S: clap::Subcommand> {
         #[clap(flatten)]
    -    ChainSpecific(C),
    +    ChainSpecific(S),
         /// Address generation and inspection.
         Address {
             #[clap(subcommand)]
    @@ -760,7 +807,7 @@
         Send {
             value: u64,
             address: Address,
    -        #[clap(short, default_value = "largest-first")]
    +        #[clap(short, default_value = "bnb")]
             coin_select: CoinSelectionAlgo,
         },
     }
    @@ -791,7 +838,12 @@
                 "oldest-first" => OldestFirst,
                 "newest-first" => NewestFirst,
                 "bnb" => BranchAndBound,
    -            unknown => return Err(anyhow!("unknown coin selection algorithm '{}'", unknown)),
    +            unknown => {
    +                return Err(anyhow::anyhow!(
    +                    "unknown coin selection algorithm '{}'",
    +                    unknown
    +                ))
    +            }
             })
         }
     }
    @@ -813,7 +865,8 @@
         }
     }
     
    -#[derive(Subcommand, Debug, Clone)]
    +#[allow(clippy::almost_swapped)]
    +#[derive(Subcommand, Debug, Clone)]
     pub enum AddressCmd {
         /// Get the next unused address.
         Next,
    @@ -862,53 +915,35 @@
         }
     }
     
    -/// A structure defining the output of an [`AddressCmd`]` execution.
    -#[derive(serde::Serialize, serde::Deserialize)]
    -pub struct AddrsOutput {
    -    keychain: String,
    -    index: u32,
    -    addrs: Address,
    -    used: bool,
    -}
    -
    -pub fn run_address_cmd<P>(
    -    tracker: &Mutex<KeychainTracker<Keychain, P>>,
    -    db: &Mutex<KeychainStore<Keychain, P>>,
    -    addr_cmd: AddressCmd,
    +pub fn run_address_cmd<A, C>(
    +    graph: &mut KeychainTxGraph<A>,
    +    db: &Mutex<Database<C>>,
         network: Network,
    -) -> Result<()>
    +    cmd: AddressCmd,
    +) -> anyhow::Result<()>
     where
    -    P: bdk_chain::sparse_chain::ChainPosition,
    -    KeychainChangeSet<Keychain, P>: serde::Serialize + serde::de::DeserializeOwned,
    +    C: Default + Append + DeserializeOwned + Serialize + From<KeychainAdditions<A>>,
     {
    -    let mut tracker = tracker.lock().unwrap();
    -    let txout_index = &mut tracker.txout_index;
    -
    -    let addr_cmmd_output = match addr_cmd {
    -        AddressCmd::Next => Some(txout_index.next_unused_spk(&Keychain::External)),
    -        AddressCmd::New => Some(txout_index.reveal_next_spk(&Keychain::External)),
    -        _ => None,
    -    };
    -
    -    if let Some(((index, spk), additions)) = addr_cmmd_output {
    -        let mut db = db.lock().unwrap();
    -        // update database since we're about to give out a new address
    -        db.append_changeset(&additions.into())?;
    -
    -        let spk = spk.clone();
    -        let address =
    -            Address::from_script(&spk, network).expect("should always be able to derive address");
    -        eprintln!("This is the address at index {}", index);
    -        println!("{}", address);
    -    }
    +    let index = &mut graph.index;
     
    -    match addr_cmd {
    +    match cmd {
             AddressCmd::Next | AddressCmd::New => {
    -            /* covered */
    -            Ok(())
    +            let spk_chooser = match cmd {
    +                AddressCmd::Next => KeychainTxOutIndex::next_unused_spk,
    +                AddressCmd::New => KeychainTxOutIndex::reveal_next_spk,
    +                _ => unreachable!("only these two variants exist in match arm"),
    +            };
    +
    +            let ((spk_i, spk), index_additions) = spk_chooser(index, &Keychain::External);
    +            let db = &mut *db.lock().unwrap();
    +            db.stage(C::from(KeychainAdditions::from(index_additions)));
    +            db.commit()?;
    +            let addr = Address::from_script(spk, network).context("failed to derive address")?;
    +            println!("[address @ {}] {}", spk_i, addr);
    +            Ok(())
             }
             AddressCmd::Index => {
    -            for (keychain, derivation_index) in txout_index.last_revealed_indices() {
    +            for (keychain, derivation_index) in index.last_revealed_indices() {
                     println!("{:?}: {}", keychain, derivation_index);
                 }
                 Ok(())
    @@ -918,14 +953,14 @@
                     true => Keychain::Internal,
                     false => Keychain::External,
                 };
    -            for (index, spk) in txout_index.revealed_spks_of_keychain(&target_keychain) {
    +            for (spk_i, spk) in index.revealed_spks_of_keychain(&target_keychain) {
                     let address = Address::from_script(spk, network)
                         .expect("should always be able to derive address");
                     println!(
                         "{:?} {} used:{}",
    -                    index,
    +                    spk_i,
                         address,
    -                    txout_index.is_used(&(target_keychain, index))
    +                    index.is_used(&(target_keychain, spk_i))
                     );
                 }
                 Ok(())
    @@ -933,88 +968,178 @@
         }
     }
     
    -pub fn run_balance_cmd<P: ChainPosition>(tracker: &Mutex<KeychainTracker<Keychain, P>>) {
    -    let tracker = tracker.lock().unwrap();
    -    let (confirmed, unconfirmed) =
    -        tracker
    -            .full_utxos()
    -            .fold((0, 0), |(confirmed, unconfirmed), (_, utxo)| {
    -                if utxo.chain_position.height().is_confirmed() {
    -                    (confirmed + utxo.txout.value, unconfirmed)
    -                } else {
    -                    (confirmed, unconfirmed + utxo.txout.value)
    -                }
    -            });
    +pub fn run_balance_cmd<A: Anchor, O: ChainOracle>(
    +    graph: &KeychainTxGraph<A>,
    +    chain: &O,
    +) -> Result<(), O::Error> {
    +    fn print_balances<'a>(title_str: &'a str, items: impl IntoIterator<Item = (&'a str, u64)>) {
    +        println!("{}:", title_str);
    +        for (name, amount) in items.into_iter() {
    +            println!("    {:<10} {:>12} sats", name, amount)
    +        }
    +    }
     
    -    println!("confirmed: {}", confirmed);
    -    println!("unconfirmed: {}", unconfirmed);
    +    let balance = graph.graph().try_balance(
    +        chain,
    +        chain.get_chain_tip()?.unwrap_or_default(),
    +        graph.index.outpoints().iter().cloned(),
    +        |(k, _), _| k == &Keychain::Internal,
    +    )?;
    +
    +    let confirmed_total = balance.confirmed + balance.immature;
    +    let unconfirmed_total = balance.untrusted_pending + balance.trusted_pending;
    +
    +    print_balances(
    +        "confirmed",
    +        [
    +            ("total", confirmed_total),
    +            ("spendable", balance.confirmed),
    +            ("immature", balance.immature),
    +        ],
    +    );
    +    print_balances(
    +        "unconfirmed",
    +        [
    +            ("total", unconfirmed_total),
    +            ("trusted", balance.trusted_pending),
    +            ("untrusted", balance.untrusted_pending),
    +        ],
    +    );
    +
    +    Ok(())
     }
     
    -pub fn run_txo_cmd<K: Debug + Clone + Ord, P: ChainPosition>(
    -    txout_cmd: TxOutCmd,
    -    tracker: &Mutex<KeychainTracker<K, P>>,
    +pub fn run_txo_cmd<A: Anchor, O: ChainOracle>(
    +    graph: &KeychainTxGraph<A>,
    +    chain: &O,
         network: Network,
    -) {
    -    match txout_cmd {
    +    cmd: TxOutCmd,
    +) -> anyhow::Result<()>
    +where
    +    O::Error: std::error::Error + Send + Sync + 'static,
    +{
    +    let chain_tip = chain.get_chain_tip()?.unwrap_or_default();
    +    let outpoints = graph.index.outpoints().iter().cloned();
    +
    +    match cmd {
             TxOutCmd::List {
    -            unspent,
                 spent,
    +            unspent,
                 confirmed,
                 unconfirmed,
             } => {
    -            let tracker = tracker.lock().unwrap();
    -            #[allow(clippy::type_complexity)] // FIXME
    -            let txouts: Box<dyn Iterator<Item = (&(K, u32), FullTxOut<P>)>> = match (unspent, spent)
    -            {
    -                (true, false) => Box::new(tracker.full_utxos()),
    -                (false, true) => Box::new(
    -                    tracker
    -                        .full_txouts()
    -                        .filter(|(_, txout)| txout.spent_by.is_some()),
    -                ),
    -                _ => Box::new(tracker.full_txouts()),
    -            };
    -
    -            #[allow(clippy::type_complexity)] // FIXME
    -            let txouts: Box<dyn Iterator<Item = (&(K, u32), FullTxOut<P>)>> =
    -                match (confirmed, unconfirmed) {
    -                    (true, false) => Box::new(
    -                        txouts.filter(|(_, txout)| txout.chain_position.height().is_confirmed()),
    -                    ),
    -                    (false, true) => Box::new(
    -                        txouts.filter(|(_, txout)| !txout.chain_position.height().is_confirmed()),
    -                    ),
    -                    _ => txouts,
    -                };
    -
    -            for (spk_index, full_txout) in txouts {
    -                let address =
    -                    Address::from_script(&full_txout.txout.script_pubkey, network).unwrap();
    -
    +            let txouts = graph
    +                .graph()
    +                .try_filter_chain_txouts(chain, chain_tip, outpoints)
    +                .filter(|r| match r {
    +                    Ok((_, full_txo)) => match (spent, unspent) {
    +                        (true, false) => full_txo.spent_by.is_some(),
    +                        (false, true) => full_txo.spent_by.is_none(),
    +                        _ => true,
    +                    },
    +                    // always keep errored items
    +                    Err(_) => true,
    +                })
    +                .filter(|r| match r {
    +                    Ok((_, full_txo)) => match (confirmed, unconfirmed) {
    +                        (true, false) => full_txo.chain_position.is_confirmed(),
    +                        (false, true) => !full_txo.chain_position.is_confirmed(),
    +                        _ => true,
    +                    },
    +                    // always keep errored items
    +                    Err(_) => true,
    +                })
    +                .collect::<Result<Vec<_>, _>>()?;
    +
    +            for (spk_i, full_txo) in txouts {
    +                let addr = Address::from_script(&full_txo.txout.script_pubkey, network)?;
                     println!(
                         "{:?} {} {} {} spent:{:?}",
    -                    spk_index,
    -                    full_txout.txout.value,
    -                    full_txout.outpoint,
    -                    address,
    -                    full_txout.spent_by
    +                    spk_i, full_txo.txout.value, full_txo.outpoint, addr, full_txo.spent_by
                     )
                 }
    +            Ok(())
             }
         }
     }
     
    -#[allow(clippy::type_complexity)] // FIXME
    -pub fn create_tx<P: ChainPosition>(
    -    value: u64,
    +#[allow(clippy::too_many_arguments)]
    +pub fn run_send_cmd<A: Anchor, O: ChainOracle, C>(
    +    graph: &Mutex<KeychainTxGraph<A>>,
    +    db: &Mutex<Database<'_, C>>,
    +    chain: &O,
    +    keymap: &HashMap<DescriptorPublicKey, DescriptorSecretKey>,
    +    cs_algorithm: CoinSelectionAlgo,
         address: Address,
    -    coin_select: CoinSelectionAlgo,
    -    keychain_tracker: &mut KeychainTracker<Keychain, P>,
    +    value: u64,
    +    broadcast: impl FnOnce(&Transaction) -> anyhow::Result<()>,
    +) -> anyhow::Result<()>
    +where
    +    O::Error: std::error::Error + Send + Sync + 'static,
    +    C: Default + Append + DeserializeOwned + Serialize + From<KeychainAdditions<A>>,
    +{
    +    let (transaction, change_index) = {
    +        let graph = &mut *graph.lock().unwrap();
    +        // take mutable ref to construct tx -- it is only open for a short time while building it.
    +        let (tx, change_info) = create_tx(graph, chain, keymap, cs_algorithm, address, value)?;
    +
    +        if let Some((index_additions, (change_keychain, index))) = change_info {
    +            // We must first persist to disk the fact that we've got a new address from the
    +            // change keychain so future scans will find the tx we're about to broadcast.
    +            // If we're unable to persist this, then we don't want to broadcast.
    +            {
    +                let db = &mut *db.lock().unwrap();
    +                db.stage(C::from(KeychainAdditions::from(index_additions)));
    +                db.commit()?;
    +            }
    +
    +            // We don't want other callers/threads to use this address while we're using it
    +            // but we also don't want to scan the tx we just created because it's not
    +            // technically in the blockchain yet.
    +            graph.index.mark_used(&change_keychain, index);
    +            (tx, Some((change_keychain, index)))
    +        } else {
    +            (tx, None)
    +        }
    +    };
    +
    +    match (broadcast)(&transaction) {
    +        Ok(_) => {
    +            println!("Broadcasted Tx : {}", transaction.txid());
    +
    +            let keychain_additions = graph.lock().unwrap().insert_tx(&transaction, None, None);
    +
    +            // We know the tx is at least unconfirmed now. Note if persisting here fails,
    +            // it's not a big deal since we can always find it again form
    +            // blockchain.
    +            db.lock().unwrap().stage(C::from(keychain_additions));
    +            Ok(())
    +        }
    +        Err(e) => {
    +            if let Some((keychain, index)) = change_index {
    +                // We failed to broadcast, so allow our change address to be used in the future
    +                graph.lock().unwrap().index.unmark_used(&keychain, index);
    +            }
    +            Err(e)
    +        }
    +    }
    +}
    +
    +#[allow(clippy::type_complexity)]
    +pub fn create_tx<A: Anchor, O: ChainOracle>(
    +    graph: &mut KeychainTxGraph<A>,
    +    chain: &O,
         keymap: &HashMap<DescriptorPublicKey, DescriptorSecretKey>,
    -) -> Result<(
    +    cs_algorithm: CoinSelectionAlgo,
    +    address: Address,
    +    value: u64,
    +) -> anyhow::Result<(
         Transaction,
         Option<(DerivationAdditions<Keychain>, (Keychain, u32))>,
    -)> {
    +)>
    +where
    +    O::Error: std::error::Error + Send + Sync + 'static,
    +{
         let mut additions = DerivationAdditions::default();
     
         let assets = bdk_tmp_plan::Assets {
    @@ -1023,10 +1148,10 @@
         };
     
         // TODO use planning module
    -    let mut candidates = planned_utxos(keychain_tracker, &assets).collect::<Vec<_>>();
    +    let mut candidates = planned_utxos(graph, chain, &assets)?;
     
         // apply coin selection algorithm
    -    match coin_select {
    +    match cs_algorithm {
             CoinSelectionAlgo::LargestFirst => {
                 candidates.sort_by_key(|(_, utxo)| Reverse(utxo.txout.value))
             }
    @@ -1057,28 +1182,22 @@
             script_pubkey: address.script_pubkey(),
         }];
     
    -    let internal_keychain = if keychain_tracker
    -        .txout_index
    -        .keychains()
    -        .get(&Keychain::Internal)
    -        .is_some()
    -    {
    +    let internal_keychain = if graph.index.keychains().get(&Keychain::Internal).is_some() {
             Keychain::Internal
         } else {
             Keychain::External
         };
     
    -    let ((change_index, change_script), change_additions) = keychain_tracker
    -        .txout_index
    -        .next_unused_spk(&internal_keychain);
    +    let ((change_index, change_script), change_additions) =
    +        graph.index.next_unused_spk(&internal_keychain);
         additions.append(change_additions);
     
         // Clone to drop the immutable reference.
         let change_script = change_script.clone();
     
         let change_plan = bdk_tmp_plan::plan_satisfaction(
    -        &keychain_tracker
    -            .txout_index
    +        &graph
    +            .index
                 .keychains()
                 .get(&internal_keychain)
                 .expect("must exist")
    @@ -1094,8 +1213,8 @@
     
         let cs_opts = CoinSelectorOpt {
             target_feerate: 0.5,
    -        min_drain_value: keychain_tracker
    -            .txout_index
    +        min_drain_value: graph
    +            .index
                 .keychains()
                 .get(&internal_keychain)
                 .expect("must exist")
    @@ -1113,7 +1232,7 @@
     
         // just select coins in the order provided until we have enough
         // only use the first result (least waste)
    -    let selection = match coin_select {
    +    let selection = match cs_algorithm {
             CoinSelectionAlgo::BranchAndBound => {
                 coin_select_bnb(Duration::from_secs(10), coin_selector.clone())
                     .map_or_else(|| coin_selector.select_until_finished(), |cs| cs.finish())?
    @@ -1133,10 +1252,11 @@
     
         let mut transaction = Transaction {
             version: 0x02,
    -        lock_time: keychain_tracker
    -            .chain()
    -            .latest_checkpoint()
    -            .and_then(|block_id| LockTime::from_height(block_id.height).ok())
    +        // because the temporary planning module does not support timelocks, we can use the chain
    +        // tip as the `lock_time` for anti-fee-sniping purposes
    +        lock_time: chain
    +            .get_chain_tip()?
    +            .and_then(|block_id| LockTime::from_height(block_id.height).ok())
                 .unwrap_or(LockTime::ZERO)
                 .into(),
             input: selected_txos
    @@ -1202,7 +1322,7 @@
                     }
                 }
                 bdk_tmp_plan::PlanState::Incomplete(_) => {
    -                return Err(anyhow!(
    +                return Err(anyhow::anyhow!(
                         "we weren't able to complete the plan with our keys."
                     ));
                 }
    @@ -1218,169 +1338,137 @@
         Ok((transaction, change_info))
     }
     
    -pub fn handle_commands<C: clap::Subcommand, P>(
    -    command: Commands<C>,
    -    broadcast: impl FnOnce(&Transaction) -> Result<()>,
    -    // we Mutex around these not because we need them for a simple CLI app but to demonstrate how
    -    // all the stuff we're doing can be made thread-safe and not keep locks up over an IO bound.
    -    tracker: &Mutex<KeychainTracker<Keychain, P>>,
    -    store: &Mutex<KeychainStore<Keychain, P>>,
    -    network: Network,
    +#[allow(clippy::type_complexity)]
    +pub fn planned_utxos<A: Anchor, O: ChainOracle, K: Clone + bdk_tmp_plan::CanDerive>(
    +    graph: &KeychainTxGraph<A>,
    +    chain: &O,
    +    assets: &bdk_tmp_plan::Assets<K>,
    +) -> Result<Vec<(bdk_tmp_plan::Plan<K>, FullTxOut<A>)>, O::Error> {
    +    let chain_tip = chain.get_chain_tip()?.unwrap_or_default();
    +    let outpoints = graph.index.outpoints().iter().cloned();
    +    graph
    +        .graph()
    +        .try_filter_chain_unspents(chain, chain_tip, outpoints)
    +        .filter_map(
    +            #[allow(clippy::type_complexity)]
    +            |r| -> Option<Result<(bdk_tmp_plan::Plan<K>, FullTxOut<A>), _>> {
    +                let (k, i, full_txo) = match r {
    +                    Err(err) => return Some(Err(err)),
    +                    Ok(((k, i), full_txo)) => (k, i, full_txo),
    +                };
    +                let desc = graph
    +                    .index
    +                    .keychains()
    +                    .get(&k)
    +                    .expect("keychain must exist")
    +                    .at_derivation_index(i);
    +                let plan = bdk_tmp_plan::plan_satisfaction(&desc, assets)?;
    +                Some(Ok((plan, full_txo)))
    +            },
    +        )
    +        .collect()
    +}
    +
    +pub fn handle_commands<S: clap::Subcommand, A: Anchor, O: ChainOracle, C>(
    +    graph: &Mutex<KeychainTxGraph<A>>,
    +    db: &Mutex<Database<C>>,
    +    chain: &Mutex<O>,
         keymap: &HashMap<DescriptorPublicKey, DescriptorSecretKey>,
    -) -> Result<()>
    +    network: Network,
    +    broadcast: impl FnOnce(&Transaction) -> anyhow::Result<()>,
    +    cmd: Commands<S>,
    +) -> anyhow::Result<()>
     where
    -    P: ChainPosition,
    -    KeychainChangeSet<Keychain, P>: serde::Serialize + serde::de::DeserializeOwned,
    +    O::Error: std::error::Error + Send + Sync + 'static,
    +    C: Default + Append + DeserializeOwned + Serialize + From<KeychainAdditions<A>>,
     {
    -    match command {
    -        // TODO: Make these functions return stuffs
    -        Commands::Address { addr_cmd } => run_address_cmd(tracker, store, addr_cmd, network),
    +    match cmd {
    +        Commands::ChainSpecific(_) => unreachable!("example code should handle this!"),
    +        Commands::Address { addr_cmd } => {
    +            let graph = &mut *graph.lock().unwrap();
    +            run_address_cmd(graph, db, network, addr_cmd)
    +        }
             Commands::Balance => {
    -            run_balance_cmd(tracker);
    -            Ok(())
    +            let graph = &*graph.lock().unwrap();
    +            let chain = &*chain.lock().unwrap();
    +            run_balance_cmd(graph, chain).map_err(anyhow::Error::from)
             }
             Commands::TxOut { txout_cmd } => {
    -            run_txo_cmd(txout_cmd, tracker, network);
    -            Ok(())
    +            let graph = &*graph.lock().unwrap();
    +            let chain = &*chain.lock().unwrap();
    +            run_txo_cmd(graph, chain, network, txout_cmd)
             }
             Commands::Send {
                 value,
                 address,
                 coin_select,
             } => {
    -            let (transaction, change_index) = {
    -                // take mutable ref to construct tx -- it is only open for a short time while building it.
    -                let tracker = &mut *tracker.lock().unwrap();
    -                let (transaction, change_info) =
    -                    create_tx(value, address, coin_select, tracker, keymap)?;
    -
    -                if let Some((change_derivation_changes, (change_keychain, index))) = change_info {
    -                    // We must first persist to disk the fact that we've got a new address from the
    -                    // change keychain so future scans will find the tx we're about to broadcast.
    -                    // If we're unable to persist this, then we don't want to broadcast.
    -                    let store = &mut *store.lock().unwrap();
    -                    store.append_changeset(&change_derivation_changes.into())?;
    -
    -                    // We don't want other callers/threads to use this address while we're using it
    -                    // but we also don't want to scan the tx we just created because it's not
    -                    // technically in the blockchain yet.
    -                    tracker.txout_index.mark_used(&change_keychain, index);
    -                    (transaction, Some((change_keychain, index)))
    -                } else {
    -                    (transaction, None)
    -                }
    -            };
    -
    -            match (broadcast)(&transaction) {
    -                Ok(_) => {
    -                    println!("Broadcasted Tx : {}", transaction.txid());
    -                    let mut tracker = tracker.lock().unwrap();
    -                    match tracker.insert_tx(transaction.clone(), P::unconfirmed()) {
    -                        Ok(changeset) => {
    -                            let store = &mut *store.lock().unwrap();
    -                            // We know the tx is at least unconfirmed now. Note if persisting here fails,
    -                            // it's not a big deal since we can always find it again form
    -                            // blockchain.
    -                            store.append_changeset(&changeset)?;
    -                            Ok(())
    -                        }
    -                        Err(e) => match e {
    -                            InsertTxError::Chain(e) => match e {
    -                                // TODO: add insert_unconfirmed_tx to the chaingraph and sparsechain
    -                                sparse_chain::InsertTxError::TxTooHigh { .. } => unreachable!("we are inserting at unconfirmed position"),
    -                                sparse_chain::InsertTxError::TxMovedUnexpectedly { txid, original_pos, ..} => Err(anyhow!("the tx we created {} has already been confirmed at block {:?}", txid, original_pos)),
    -                            },
    -                            InsertTxError::UnresolvableConflict(e) => Err(e).context("another tx that conflicts with the one we tried to create has been confirmed"),
    -                        }
    -                    }
    -                }
    -                Err(e) => {
    -                    let tracker = &mut *tracker.lock().unwrap();
    -                    if let Some((keychain, index)) = change_index {
    -                        // We failed to broadcast, so allow our change address to be used in the future
    -                        tracker.txout_index.unmark_used(&keychain, index);
    -                    }
    -                    Err(e)
    -                }
    -            }
    -        }
    -        Commands::ChainSpecific(_) => {
    -            todo!("example code is meant to handle this!")
    +            let chain = &*chain.lock().unwrap();
    +            run_send_cmd(
    +                graph,
    +                db,
    +                chain,
    +                keymap,
    +                coin_select,
    +                address,
    +                value,
    +                broadcast,
    +            )
             }
         }
     }
     
    -#[allow(clippy::type_complexity)] // FIXME
    -pub fn init<C: clap::Subcommand, P>() -> anyhow::Result<(
    -    Args<C>,
    +#[allow(clippy::type_complexity)]
    +pub fn init<'m, S: clap::Subcommand, C>(
    +    db_magic: &'m [u8],
    +    db_default_path: &str,
    +) -> anyhow::Result<(
    +    Args<S>,
         KeyMap,
    -    // These don't need to have mutexes around them, but we want the cli example code to make it obvious how they
    -    // are thread-safe, forcing the example developers to show where they would lock and unlock things.
    -    Mutex<KeychainTracker<Keychain, P>>,
    -    Mutex<KeychainStore<Keychain, P>>,
    +    KeychainTxOutIndex<Keychain>,
    +    Mutex<Database<'m, C>>,
    +    C,
     )>
     where
    -    P: sparse_chain::ChainPosition,
    -    KeychainChangeSet<Keychain, P>: serde::Serialize + serde::de::DeserializeOwned,
    +    C: Default + Append + Serialize + DeserializeOwned,
     {
    -    let args = Args::<C>::parse();
    +    if std::env::var("BDK_DB_PATH").is_err() {
    +        std::env::set_var("BDK_DB_PATH", db_default_path);
    +    }
    +    let args = Args::<S>::parse();
         let secp = Secp256k1::default();
    -    let (descriptor, mut keymap) =
    -        Descriptor::<DescriptorPublicKey>::parse_descriptor(&secp, &args.descriptor)?;
     
    -    let mut tracker = KeychainTracker::default();
    -    tracker.set_checkpoint_limit(Some(args.cp_limit));
    +    let mut index = KeychainTxOutIndex::<Keychain>::default();
     
    -    tracker
    -        .txout_index
    -        .add_keychain(Keychain::External, descriptor);
    +    let (descriptor, mut keymap) =
    +        Descriptor::<DescriptorPublicKey>::parse_descriptor(&secp, &args.descriptor)?;
    +    index.add_keychain(Keychain::External, descriptor);
     
    -    let internal = args
    +    if let Some((internal_descriptor, internal_keymap)) = args
             .change_descriptor
    -        .clone()
    -        .map(|descriptor| Descriptor::<DescriptorPublicKey>::parse_descriptor(&secp, &descriptor))
    -        .transpose()?;
    -    if let Some((internal_descriptor, internal_keymap)) = internal {
    +        .as_ref()
    +        .map(|desc_str| Descriptor::<DescriptorPublicKey>::parse_descriptor(&secp, desc_str))
    +        .transpose()?
    +    {
             keymap.extend(internal_keymap);
    -        tracker
    -            .txout_index
    -            .add_keychain(Keychain::Internal, internal_descriptor);
    -    };
    -
    -    let mut db = KeychainStore::<Keychain, P>::new_from_path(args.db_path.as_path())?;
    -
    -    if let Err(e) = db.load_into_keychain_tracker(&mut tracker) {
    -        match tracker.chain().latest_checkpoint()  {
    -            Some(checkpoint) => eprintln!("Failed to load all changesets from {}. Last checkpoint was at height {}. Error: {}", args.db_path.display(), checkpoint.height, e),
    -            None => eprintln!("Failed to load any checkpoints from {}: {}", args.db_path.display(), e),
    -
    -        }
    -        eprintln!("⚠ Consider running a rescan of chain data.");
    +        index.add_keychain(Keychain::Internal, internal_descriptor);
         }
     
    -    Ok((args, keymap, Mutex::new(tracker), Mutex::new(db)))
    -}
    +    let mut db_backend = match Store::<'m, C>::new_from_path(db_magic, &args.db_path) {
    +        Ok(db_backend) => db_backend,
    +        // we cannot return `err` directly as it has lifetime `'m`
    +        Err(err) => return Err(anyhow::anyhow!("failed to init db backend: {:?}", err)),
    +    };
     
    -pub fn planned_utxos<'a, AK: bdk_tmp_plan::CanDerive + Clone, P: ChainPosition>(
    -    tracker: &'a KeychainTracker<Keychain, P>,
    -    assets: &'a bdk_tmp_plan::Assets<AK>,
    -) -> impl Iterator<Item = (bdk_tmp_plan::Plan<AK>, FullTxOut<P>)> + 'a {
    -    tracker
    -        .full_utxos()
    -        .filter_map(move |((keychain, derivation_index), full_txout)| {
    -            Some((
    -                bdk_tmp_plan::plan_satisfaction(
    -                    &tracker
    -                        .txout_index
    -                        .keychains()
    -                        .get(keychain)
    -                        .expect("must exist since we have a utxo for it")
    -                        .at_derivation_index(*derivation_index),
    -                    assets,
    -                )?,
    -                full_txout,
    -            ))
    -        })
    +    let init_changeset = db_backend.load_from_persistence()?;
    +
    +    Ok((
    +        args,
    +        keymap,
    +        index,
    +        Mutex::new(Database::new(db_backend)),
    +        init_changeset,
    +    ))
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/keychain_tracker_electrum_example/main.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/example_electrum/main.rs.html similarity index 55% rename from docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/keychain_tracker_electrum_example/main.rs.html rename to docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/example_electrum/main.rs.html index c9c87e06bf..3c1a824214 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/keychain_tracker_electrum_example/main.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/example_electrum/main.rs.html @@ -1,4 +1,4 @@ -main.rs - source
    1
    +main.rs - source
    1
     2
     3
     4
    @@ -243,22 +243,109 @@
     243
     244
     245
    -
    use bdk_chain::bitcoin::{Address, OutPoint, Txid};
    -use bdk_electrum::bdk_chain::{self, bitcoin::Network, TxHeight};
    +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
    +
    use std::{
    +    collections::BTreeMap,
    +    io::{self, Write},
    +    sync::Mutex,
    +};
    +
    +use bdk_chain::{
    +    bitcoin::{Address, BlockHash, Network, OutPoint, Txid},
    +    indexed_tx_graph::{IndexedAdditions, IndexedTxGraph},
    +    keychain::LocalChangeSet,
    +    local_chain::LocalChain,
    +    Append, ConfirmationHeightAnchor,
    +};
     use bdk_electrum::{
         electrum_client::{self, ElectrumApi},
         ElectrumExt, ElectrumUpdate,
     };
    -use keychain_tracker_example_cli::{
    -    self as cli,
    +use example_cli::{
         anyhow::{self, Context},
         clap::{self, Parser, Subcommand},
    +    Keychain,
     };
    -use std::{collections::BTreeMap, fmt::Debug, io, io::Write};
    +
    +const DB_MAGIC: &[u8] = b"bdk_example_electrum";
    +const DB_PATH: &str = ".bdk_electrum_example.db";
    +const ASSUME_FINAL_DEPTH: usize = 10;
     
     #[derive(Subcommand, Debug, Clone)]
     enum ElectrumCommands {
    -    /// Scans the addresses in the wallet using the esplora API.
    +    /// Scans the addresses in the wallet using the electrum API.
         Scan {
             /// When a gap this large has been found for a keychain, it will stop.
             #[clap(long, default_value = "5")]
    @@ -266,7 +353,7 @@
             #[clap(flatten)]
             scan_options: ScanOptions,
         },
    -    /// Scans particular addresses using the esplora API.
    +    /// Scans particular addresses using the electrum API.
         Sync {
             /// Scan all the unused addresses.
             #[clap(long)]
    @@ -292,8 +379,23 @@
         pub batch_size: usize,
     }
     
    +type ChangeSet = LocalChangeSet<Keychain, ConfirmationHeightAnchor>;
    +
     fn main() -> anyhow::Result<()> {
    -    let (args, keymap, tracker, db) = cli::init::<ElectrumCommands, _>()?;
    +    let (args, keymap, index, db, init_changeset) =
    +        example_cli::init::<ElectrumCommands, ChangeSet>(DB_MAGIC, DB_PATH)?;
    +
    +    let graph = Mutex::new({
    +        let mut graph = IndexedTxGraph::new(index);
    +        graph.apply_additions(init_changeset.indexed_additions);
    +        graph
    +    });
    +
    +    let chain = Mutex::new({
    +        let mut chain = LocalChain::default();
    +        chain.apply_changeset(init_changeset.chain_changeset);
    +        chain
    +    });
     
         let electrum_url = match args.network {
             Network::Bitcoin => "ssl://electrum.blockstream.info:50002",
    @@ -307,34 +409,40 @@
     
         let client = electrum_client::Client::from_config(electrum_url, config)?;
     
    -    let electrum_cmd = match args.command.clone() {
    -        cli::Commands::ChainSpecific(electrum_cmd) => electrum_cmd,
    -        general_command => {
    -            return cli::handle_commands(
    -                general_command,
    -                |transaction| {
    -                    let _txid = client.transaction_broadcast(transaction)?;
    -                    Ok(())
    -                },
    -                &tracker,
    +    let electrum_cmd = match &args.command {
    +        example_cli::Commands::ChainSpecific(electrum_cmd) => electrum_cmd,
    +        general_cmd => {
    +            let res = example_cli::handle_commands(
    +                &graph,
                     &db,
    -                args.network,
    +                &chain,
                     &keymap,
    -            )
    +                args.network,
    +                |tx| {
    +                    client
    +                        .transaction_broadcast(tx)
    +                        .map(|_| ())
    +                        .map_err(anyhow::Error::from)
    +                },
    +                general_cmd.clone(),
    +            );
    +
    +            db.lock().unwrap().commit()?;
    +            return res;
             }
         };
     
    -    let response = match electrum_cmd {
    +    let response = match electrum_cmd.clone() {
             ElectrumCommands::Scan {
                 stop_gap,
    -            scan_options: scan_option,
    +            scan_options,
             } => {
    -            let (spk_iterators, local_chain) = {
    -                // Get a short lock on the tracker to get the spks iterators
    -                // and local chain state
    -                let tracker = &*tracker.lock().unwrap();
    -                let spk_iterators = tracker
    -                    .txout_index
    +            let (keychain_spks, local_chain) = {
    +                let graph = &*graph.lock().unwrap();
    +                let chain = &*chain.lock().unwrap();
    +
    +                let keychain_spks = graph
    +                    .index
                         .spks_of_all_keychains()
                         .into_iter()
                         .map(|(keychain, iter)| {
    @@ -351,29 +459,40 @@
                             (keychain, spk_iter)
                         })
                         .collect::<BTreeMap<_, _>>();
    -                let local_chain = tracker.chain().checkpoints().clone();
    -                (spk_iterators, local_chain)
    +
    +                let c = chain
    +                    .blocks()
    +                    .iter()
    +                    .rev()
    +                    .take(ASSUME_FINAL_DEPTH)
    +                    .map(|(k, v)| (*k, *v))
    +                    .collect::<BTreeMap<u32, BlockHash>>();
    +
    +                (keychain_spks, c)
                 };
     
    -            // we scan the spks **without** a lock on the tracker
    -            client.scan(
    -                &local_chain,
    -                spk_iterators,
    -                core::iter::empty(),
    -                core::iter::empty(),
    -                stop_gap,
    -                scan_option.batch_size,
    -            )?
    +            client
    +                .scan(
    +                    &local_chain,
    +                    keychain_spks,
    +                    core::iter::empty(),
    +                    core::iter::empty(),
    +                    stop_gap,
    +                    scan_options.batch_size,
    +                )
    +                .context("scanning the blockchain")?
             }
             ElectrumCommands::Sync {
                 mut unused_spks,
    +            all_spks,
                 mut utxos,
                 mut unconfirmed,
    -            all_spks,
                 scan_options,
             } => {
                 // Get a short lock on the tracker to get the spks we're interested in
    -            let tracker = tracker.lock().unwrap();
    +            let graph = graph.lock().unwrap();
    +            let chain = chain.lock().unwrap();
    +            let chain_tip = chain.tip().unwrap_or_default();
     
                 if !(all_spks || unused_spks || utxos || unconfirmed) {
                     unused_spks = true;
    @@ -386,8 +505,8 @@
                 let mut spks: Box<dyn Iterator<Item = bdk_chain::bitcoin::Script>> =
                     Box::new(core::iter::empty());
                 if all_spks {
    -                let all_spks = tracker
    -                    .txout_index
    +                let all_spks = graph
    +                    .index
                         .all_spks()
                         .iter()
                         .map(|(k, v)| (*k, v.clone()))
    @@ -398,8 +517,8 @@
                     })));
                 }
                 if unused_spks {
    -                let unused_spks = tracker
    -                    .txout_index
    +                let unused_spks = graph
    +                    .index
                         .unused_spks(..)
                         .map(|(k, v)| (*k, v.clone()))
                         .collect::<Vec<_>>();
    @@ -417,10 +536,14 @@
                 let mut outpoints: Box<dyn Iterator<Item = OutPoint>> = Box::new(core::iter::empty());
     
                 if utxos {
    -                let utxos = tracker
    -                    .full_utxos()
    +                let init_outpoints = graph.index.outpoints().iter().cloned();
    +
    +                let utxos = graph
    +                    .graph()
    +                    .filter_chain_unspents(&*chain, chain_tip, init_outpoints)
                         .map(|(_, utxo)| utxo)
                         .collect::<Vec<_>>();
    +
                     outpoints = Box::new(
                         utxos
                             .into_iter()
    @@ -437,56 +560,79 @@
                 let mut txids: Box<dyn Iterator<Item = Txid>> = Box::new(core::iter::empty());
     
                 if unconfirmed {
    -                let unconfirmed_txids = tracker
    -                    .chain()
    -                    .range_txids_by_height(TxHeight::Unconfirmed..)
    -                    .map(|(_, txid)| *txid)
    -                    .collect::<Vec<_>>();
    +                let unconfirmed_txids = graph
    +                    .graph()
    +                    .list_chain_txs(&*chain, chain_tip)
    +                    .filter(|canonical_tx| !canonical_tx.observed_as.is_confirmed())
    +                    .map(|canonical_tx| canonical_tx.node.txid)
    +                    .collect::<Vec<Txid>>();
     
                     txids = Box::new(unconfirmed_txids.into_iter().inspect(|txid| {
                         eprintln!("Checking if {} is confirmed yet", txid);
                     }));
                 }
     
    -            let local_chain = tracker.chain().checkpoints().clone();
    -            // drop lock on tracker
    -            drop(tracker);
    -
    -            // we scan the spks **without** a lock on the tracker
    -            ElectrumUpdate {
    -                chain_update: client
    -                    .scan_without_keychain(
    -                        &local_chain,
    -                        spks,
    -                        txids,
    -                        outpoints,
    -                        scan_options.batch_size,
    -                    )
    -                    .context("scanning the blockchain")?,
    -                ..Default::default()
    +            let c = chain
    +                .blocks()
    +                .iter()
    +                .rev()
    +                .take(ASSUME_FINAL_DEPTH)
    +                .map(|(k, v)| (*k, *v))
    +                .collect::<BTreeMap<u32, BlockHash>>();
    +
    +            // drop lock on graph and chain
    +            drop((graph, chain));
    +
    +            let update = client
    +                .scan_without_keychain(&c, spks, txids, outpoints, scan_options.batch_size)
    +                .context("scanning the blockchain")?;
    +            ElectrumUpdate {
    +                graph_update: update.graph_update,
    +                chain_update: update.chain_update,
    +                keychain_update: BTreeMap::new(),
                 }
             }
         };
     
    -    let missing_txids = response.missing_full_txs(&*tracker.lock().unwrap());
    -
    -    // fetch the missing full transactions **without** a lock on the tracker
    -    let new_txs = client
    -        .batch_transaction_get(missing_txids)
    -        .context("fetching full transactions")?;
    -
    -    {
    -        // Get a final short lock to apply the changes
    -        let mut tracker = tracker.lock().unwrap();
    -        let changeset = {
    -            let scan = response.into_keychain_scan(new_txs, &*tracker)?;
    -            tracker.determine_changeset(&scan)?
    -        };
    -        db.lock().unwrap().append_changeset(&changeset)?;
    -        tracker.apply_changeset(changeset);
    +    let missing_txids = {
    +        let graph = &*graph.lock().unwrap();
    +        response.missing_full_txs(graph.graph())
    +    };
    +
    +    let now = std::time::UNIX_EPOCH
    +        .elapsed()
    +        .expect("must get time")
    +        .as_secs();
    +
    +    let final_update = response.finalize(&client, Some(now), missing_txids)?;
    +
    +    let db_changeset = {
    +        let mut chain = chain.lock().unwrap();
    +        let mut graph = graph.lock().unwrap();
    +
    +        let chain_changeset = chain.apply_update(final_update.chain)?;
    +
    +        let indexed_additions = {
    +            let mut additions = IndexedAdditions::<ConfirmationHeightAnchor, _>::default();
    +            let (_, index_additions) = graph.index.reveal_to_target_multi(&final_update.keychain);
    +            additions.append(IndexedAdditions {
    +                index_additions,
    +                ..Default::default()
    +            });
    +            additions.append(graph.apply_update(final_update.graph));
    +            additions
    +        };
    +
    +        ChangeSet {
    +            indexed_additions,
    +            chain_changeset,
    +        }
         };
     
    +    let mut db = db.lock().unwrap();
    +    db.stage(db_changeset);
    +    db.commit()?;
         Ok(())
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/keychain_tracker_esplora_example/main.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/keychain_tracker_esplora_example/main.rs.html deleted file mode 100644 index 4a2e03436e..0000000000 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/keychain_tracker_esplora_example/main.rs.html +++ /dev/null @@ -1,484 +0,0 @@ -main.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
    -
    use bdk_chain::bitcoin::{Address, OutPoint, Txid};
    -use bdk_chain::{bitcoin::Network, TxHeight};
    -use bdk_esplora::esplora_client;
    -use bdk_esplora::EsploraExt;
    -
    -use std::io::{self, Write};
    -
    -use keychain_tracker_example_cli::{
    -    self as cli,
    -    anyhow::{self, Context},
    -    clap::{self, Parser, Subcommand},
    -};
    -
    -#[derive(Subcommand, Debug, Clone)]
    -enum EsploraCommands {
    -    /// Scans the addresses in the wallet using the esplora API.
    -    Scan {
    -        /// When a gap this large has been found for a keychain, it will stop.
    -        #[clap(long, default_value = "5")]
    -        stop_gap: usize,
    -
    -        #[clap(flatten)]
    -        scan_options: ScanOptions,
    -    },
    -    /// Scans particular addresses using esplora API.
    -    Sync {
    -        /// Scan all the unused addresses.
    -        #[clap(long)]
    -        unused_spks: bool,
    -        /// Scan every address that you have derived.
    -        #[clap(long)]
    -        all_spks: bool,
    -        /// Scan unspent outpoints for spends or changes to confirmation status of residing tx.
    -        #[clap(long)]
    -        utxos: bool,
    -        /// Scan unconfirmed transactions for updates.
    -        #[clap(long)]
    -        unconfirmed: bool,
    -
    -        #[clap(flatten)]
    -        scan_options: ScanOptions,
    -    },
    -}
    -
    -#[derive(Parser, Debug, Clone, PartialEq)]
    -pub struct ScanOptions {
    -    #[clap(long, default_value = "5")]
    -    pub parallel_requests: usize,
    -}
    -
    -fn main() -> anyhow::Result<()> {
    -    let (args, keymap, keychain_tracker, db) = cli::init::<EsploraCommands, _>()?;
    -    let esplora_url = match args.network {
    -        Network::Bitcoin => "https://mempool.space/api",
    -        Network::Testnet => "https://mempool.space/testnet/api",
    -        Network::Regtest => "http://localhost:3002",
    -        Network::Signet => "https://mempool.space/signet/api",
    -    };
    -
    -    let client = esplora_client::Builder::new(esplora_url).build_blocking()?;
    -
    -    let esplora_cmd = match args.command {
    -        cli::Commands::ChainSpecific(esplora_cmd) => esplora_cmd,
    -        general_command => {
    -            return cli::handle_commands(
    -                general_command,
    -                |transaction| Ok(client.broadcast(transaction)?),
    -                &keychain_tracker,
    -                &db,
    -                args.network,
    -                &keymap,
    -            )
    -        }
    -    };
    -
    -    match esplora_cmd {
    -        EsploraCommands::Scan {
    -            stop_gap,
    -            scan_options,
    -        } => {
    -            let (spk_iterators, local_chain) = {
    -                // Get a short lock on the tracker to get the spks iterators
    -                // and local chain state
    -                let tracker = &*keychain_tracker.lock().unwrap();
    -                let spk_iterators = tracker
    -                    .txout_index
    -                    .spks_of_all_keychains()
    -                    .into_iter()
    -                    .map(|(keychain, iter)| {
    -                        let mut first = true;
    -                        (
    -                            keychain,
    -                            iter.inspect(move |(i, _)| {
    -                                if first {
    -                                    eprint!("\nscanning {}: ", keychain);
    -                                    first = false;
    -                                }
    -
    -                                eprint!("{} ", i);
    -                                let _ = io::stdout().flush();
    -                            }),
    -                        )
    -                    })
    -                    .collect();
    -
    -                let local_chain = tracker.chain().checkpoints().clone();
    -                (spk_iterators, local_chain)
    -            };
    -
    -            // we scan the iterators **without** a lock on the tracker
    -            let wallet_scan = client
    -                .scan(
    -                    &local_chain,
    -                    spk_iterators,
    -                    core::iter::empty(),
    -                    core::iter::empty(),
    -                    stop_gap,
    -                    scan_options.parallel_requests,
    -                )
    -                .context("scanning the blockchain")?;
    -            eprintln!();
    -
    -            {
    -                // we take a short lock to apply results to tracker and db
    -                let tracker = &mut *keychain_tracker.lock().unwrap();
    -                let db = &mut *db.lock().unwrap();
    -                let changeset = tracker.apply_update(wallet_scan)?;
    -                db.append_changeset(&changeset)?;
    -            }
    -        }
    -        EsploraCommands::Sync {
    -            mut unused_spks,
    -            mut utxos,
    -            mut unconfirmed,
    -            all_spks,
    -            scan_options,
    -        } => {
    -            // Get a short lock on the tracker to get the spks we're interested in
    -            let tracker = keychain_tracker.lock().unwrap();
    -
    -            if !(all_spks || unused_spks || utxos || unconfirmed) {
    -                unused_spks = true;
    -                unconfirmed = true;
    -                utxos = true;
    -            } else if all_spks {
    -                unused_spks = false;
    -            }
    -
    -            let mut spks: Box<dyn Iterator<Item = bdk_chain::bitcoin::Script>> =
    -                Box::new(core::iter::empty());
    -            if all_spks {
    -                let all_spks = tracker
    -                    .txout_index
    -                    .all_spks()
    -                    .iter()
    -                    .map(|(k, v)| (*k, v.clone()))
    -                    .collect::<Vec<_>>();
    -                spks = Box::new(spks.chain(all_spks.into_iter().map(|(index, script)| {
    -                    eprintln!("scanning {:?}", index);
    -                    script
    -                })));
    -            }
    -            if unused_spks {
    -                let unused_spks = tracker
    -                    .txout_index
    -                    .unused_spks(..)
    -                    .map(|(k, v)| (*k, v.clone()))
    -                    .collect::<Vec<_>>();
    -                spks = Box::new(spks.chain(unused_spks.into_iter().map(|(index, script)| {
    -                    eprintln!(
    -                        "Checking if address {} {:?} has been used",
    -                        Address::from_script(&script, args.network).unwrap(),
    -                        index
    -                    );
    -
    -                    script
    -                })));
    -            }
    -
    -            let mut outpoints: Box<dyn Iterator<Item = OutPoint>> = Box::new(core::iter::empty());
    -
    -            if utxos {
    -                let utxos = tracker
    -                    .full_utxos()
    -                    .map(|(_, utxo)| utxo)
    -                    .collect::<Vec<_>>();
    -                outpoints = Box::new(
    -                    utxos
    -                        .into_iter()
    -                        .inspect(|utxo| {
    -                            eprintln!(
    -                                "Checking if outpoint {} (value: {}) has been spent",
    -                                utxo.outpoint, utxo.txout.value
    -                            );
    -                        })
    -                        .map(|utxo| utxo.outpoint),
    -                );
    -            };
    -
    -            let mut txids: Box<dyn Iterator<Item = Txid>> = Box::new(core::iter::empty());
    -
    -            if unconfirmed {
    -                let unconfirmed_txids = tracker
    -                    .chain()
    -                    .range_txids_by_height(TxHeight::Unconfirmed..)
    -                    .map(|(_, txid)| *txid)
    -                    .collect::<Vec<_>>();
    -
    -                txids = Box::new(unconfirmed_txids.into_iter().inspect(|txid| {
    -                    eprintln!("Checking if {} is confirmed yet", txid);
    -                }));
    -            }
    -
    -            let local_chain = tracker.chain().checkpoints().clone();
    -
    -            // drop lock on tracker
    -            drop(tracker);
    -
    -            // we scan the desired spks **without** a lock on the tracker
    -            let scan = client
    -                .scan_without_keychain(
    -                    &local_chain,
    -                    spks,
    -                    txids,
    -                    outpoints,
    -                    scan_options.parallel_requests,
    -                )
    -                .context("scanning the blockchain")?;
    -
    -            {
    -                // we take a short lock to apply the results to the tracker and db
    -                let tracker = &mut *keychain_tracker.lock().unwrap();
    -                let changeset = tracker.apply_update(scan.into())?;
    -                let db = &mut *db.lock().unwrap();
    -                db.append_changeset(&changeset)?;
    -            }
    -        }
    -    }
    -
    -    Ok(())
    -}
    -
    -
    \ No newline at end of file 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 9c9d731559..6a6a2cc551 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 @@ -91,38 +91,24 @@ 91 92 93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -
    use std::{io::Write, str::FromStr};
    -
    -use bdk::{
    -    bitcoin::{Address, Network},
    -    SignOptions, Wallet,
    -};
    -use bdk_electrum::{
    -    electrum_client::{self, ElectrumApi},
    -    ElectrumExt,
    -};
    -use bdk_file_store::KeychainStore;
    -
    +
    const DB_MAGIC: &str = "bdk_wallet_electrum_example";
     const SEND_AMOUNT: u64 = 5000;
     const STOP_GAP: usize = 50;
     const BATCH_SIZE: usize = 5;
     
    -fn main() -> Result<(), Box<dyn std::error::Error>> {
    -    println!("Hello, world!");
    +use std::io::Write;
    +use std::str::FromStr;
    +
    +use bdk::bitcoin::Address;
    +use bdk::SignOptions;
    +use bdk::{bitcoin::Network, Wallet};
    +use bdk_electrum::electrum_client::{self, ElectrumApi};
    +use bdk_electrum::ElectrumExt;
    +use bdk_file_store::Store;
     
    +fn main() -> Result<(), Box<dyn std::error::Error>> {
         let db_path = std::env::temp_dir().join("bdk-electrum-example");
    -    let db = KeychainStore::new_from_path(db_path)?;
    +    let db = Store::<bdk::wallet::ChangeSet>::new_from_path(DB_MAGIC.as_bytes(), db_path)?;
         let external_descriptor = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/0'/0'/0/*)";
         let internal_descriptor = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/0'/0'/1/*)";
     
    @@ -140,41 +126,33 @@
         println!("Wallet balance before syncing: {} sats", balance.total());
     
         print!("Syncing...");
    -    // Scanning the chain...
    -    let electrum_url = "ssl://electrum.blockstream.info:60002";
    -    let client = electrum_client::Client::new(electrum_url)?;
    +    let client = electrum_client::Client::new("ssl://electrum.blockstream.info:60002")?;
    +
         let local_chain = wallet.checkpoints();
    -    let spks = wallet
    +    let keychain_spks = wallet
             .spks_of_all_keychains()
             .into_iter()
    -        .map(|(k, spks)| {
    -            let mut first = true;
    -            (
    -                k,
    -                spks.inspect(move |(spk_i, _)| {
    -                    if first {
    -                        first = false;
    -                        print!("\nScanning keychain [{:?}]:", k);
    -                    }
    -                    print!(" {}", spk_i);
    -                    let _ = std::io::stdout().flush();
    -                }),
    -            )
    +        .map(|(k, k_spks)| {
    +            let mut once = Some(());
    +            let mut stdout = std::io::stdout();
    +            let k_spks = k_spks
    +                .inspect(move |(spk_i, _)| match once.take() {
    +                    Some(_) => print!("\nScanning keychain [{:?}]", k),
    +                    None => print!(" {:<3}", spk_i),
    +                })
    +                .inspect(move |_| stdout.flush().expect("must flush"));
    +            (k, k_spks)
             })
             .collect();
    -    let electrum_update = client
    -        .scan(
    -            local_chain,
    -            spks,
    -            core::iter::empty(),
    -            core::iter::empty(),
    -            STOP_GAP,
    -            BATCH_SIZE,
    -        )?
    -        .into_confirmation_time_update(&client)?;
    +
    +    let electrum_update =
    +        client.scan(local_chain, keychain_spks, None, None, STOP_GAP, BATCH_SIZE)?;
    +
         println!();
    -    let new_txs = client.batch_transaction_get(electrum_update.missing_full_txs(&wallet))?;
    -    let update = electrum_update.into_keychain_scan(new_txs, &wallet)?;
    +
    +    let missing = electrum_update.missing_full_txs(wallet.as_ref());
    +    let update = electrum_update.finalize_as_confirmation_time(&client, None, missing)?;
    +
         wallet.apply_update(update)?;
         wallet.commit()?;
     
    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_esplora_wallet_example/main.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/wallet_esplora/main.rs.html
    similarity index 75%
    rename from docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_esplora_wallet_example/main.rs.html
    rename to docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/wallet_esplora/main.rs.html
    index ec32456bc9..5531f7f200 100644
    --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/bdk_esplora_wallet_example/main.rs.html
    +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/wallet_esplora/main.rs.html
    @@ -1,4 +1,4 @@
    -main.rs - source
    1
    +main.rs - source
    1
     2
     3
     4
    @@ -92,25 +92,24 @@
     92
     93
     94
    -95
    -96
    -
    use bdk::{
    +
    const DB_MAGIC: &str = "bdk_wallet_esplora_example";
    +const SEND_AMOUNT: u64 = 5000;
    +const STOP_GAP: usize = 50;
    +const PARALLEL_REQUESTS: usize = 5;
    +
    +use std::{io::Write, str::FromStr};
    +
    +use bdk::{
         bitcoin::{Address, Network},
         wallet::AddressIndex,
         SignOptions, Wallet,
     };
    -use bdk_esplora::esplora_client;
    -use bdk_esplora::EsploraExt;
    -use bdk_file_store::KeychainStore;
    -use std::{io::Write, str::FromStr};
    -
    -const SEND_AMOUNT: u64 = 5000;
    -const STOP_GAP: usize = 50;
    -const PARALLEL_REQUESTS: usize = 5;
    +use bdk_esplora::{esplora_client, EsploraExt};
    +use bdk_file_store::Store;
     
     fn main() -> Result<(), Box<dyn std::error::Error>> {
         let db_path = std::env::temp_dir().join("bdk-esplora-example");
    -    let db = KeychainStore::new_from_path(db_path)?;
    +    let db = Store::<bdk::wallet::ChangeSet>::new_from_path(DB_MAGIC.as_bytes(), db_path)?;
         let external_descriptor = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/0'/0'/0/*)";
         let internal_descriptor = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/0'/0'/1/*)";
     
    @@ -128,33 +127,30 @@
         println!("Wallet balance before syncing: {} sats", balance.total());
     
         print!("Syncing...");
    -    // Scanning the chain...
    -    let esplora_url = "https://mempool.space/testnet/api";
    -    let client = esplora_client::Builder::new(esplora_url).build_blocking()?;
    -    let checkpoints = wallet.checkpoints();
    -    let spks = wallet
    +    let client =
    +        esplora_client::Builder::new("https://blockstream.info/testnet/api").build_blocking()?;
    +
    +    let local_chain = wallet.checkpoints();
    +    let keychain_spks = wallet
             .spks_of_all_keychains()
             .into_iter()
    -        .map(|(k, spks)| {
    -            let mut first = true;
    -            (
    -                k,
    -                spks.inspect(move |(spk_i, _)| {
    -                    if first {
    -                        first = false;
    -                        print!("\nScanning keychain [{:?}]:", k);
    -                    }
    -                    print!(" {}", spk_i);
    -                    let _ = std::io::stdout().flush();
    -                }),
    -            )
    +        .map(|(k, k_spks)| {
    +            let mut once = Some(());
    +            let mut stdout = std::io::stdout();
    +            let k_spks = k_spks
    +                .inspect(move |(spk_i, _)| match once.take() {
    +                    Some(_) => print!("\nScanning keychain [{:?}]", k),
    +                    None => print!(" {:<3}", spk_i),
    +                })
    +                .inspect(move |_| stdout.flush().expect("must flush"));
    +            (k, k_spks)
             })
             .collect();
         let update = client.scan(
    -        checkpoints,
    -        spks,
    -        core::iter::empty(),
    -        core::iter::empty(),
    +        local_chain,
    +        keychain_spks,
    +        None,
    +        None,
             STOP_GAP,
             PARALLEL_REQUESTS,
         )?;
    @@ -191,4 +187,4 @@
         Ok(())
     }
     
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/wallet_esplora_async/main.rs.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/wallet_esplora_async/main.rs.html index 38e9e5132b..e7125e532c 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/wallet_esplora_async/main.rs.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/src/wallet_esplora_async/main.rs.html @@ -95,8 +95,6 @@ 95 96 97 -98 -99
    use std::{io::Write, str::FromStr};
     
     use bdk::{
    @@ -105,16 +103,17 @@
         SignOptions, Wallet,
     };
     use bdk_esplora::{esplora_client, EsploraAsyncExt};
    -use bdk_file_store::KeychainStore;
    +use bdk_file_store::Store;
     
    +const DB_MAGIC: &str = "bdk_wallet_esplora_async_example";
     const SEND_AMOUNT: u64 = 5000;
     const STOP_GAP: usize = 50;
     const PARALLEL_REQUESTS: usize = 5;
     
     #[tokio::main]
     async fn main() -> Result<(), Box<dyn std::error::Error>> {
    -    let db_path = std::env::temp_dir().join("bdk-esplora-example");
    -    let db = KeychainStore::new_from_path(db_path)?;
    +    let db_path = std::env::temp_dir().join("bdk-esplora-async-example");
    +    let db = Store::<bdk::wallet::ChangeSet>::new_from_path(DB_MAGIC.as_bytes(), db_path)?;
         let external_descriptor = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/0'/0'/0/*)";
         let internal_descriptor = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/0'/0'/1/*)";
     
    @@ -132,34 +131,31 @@
         println!("Wallet balance before syncing: {} sats", balance.total());
     
         print!("Syncing...");
    -    // Scanning the blockchain
    -    let esplora_url = "https://mempool.space/testnet/api";
    -    let client = esplora_client::Builder::new(esplora_url).build_async()?;
    -    let checkpoints = wallet.checkpoints();
    -    let spks = wallet
    +    let client =
    +        esplora_client::Builder::new("https://blockstream.info/testnet/api").build_async()?;
    +
    +    let local_chain = wallet.checkpoints();
    +    let keychain_spks = wallet
             .spks_of_all_keychains()
             .into_iter()
    -        .map(|(k, spks)| {
    -            let mut first = true;
    -            (
    -                k,
    -                spks.inspect(move |(spk_i, _)| {
    -                    if first {
    -                        first = false;
    -                        print!("\nScanning keychain [{:?}]:", k);
    -                    }
    -                    print!(" {}", spk_i);
    -                    let _ = std::io::stdout().flush();
    -                }),
    -            )
    +        .map(|(k, k_spks)| {
    +            let mut once = Some(());
    +            let mut stdout = std::io::stdout();
    +            let k_spks = k_spks
    +                .inspect(move |(spk_i, _)| match once.take() {
    +                    Some(_) => print!("\nScanning keychain [{:?}]", k),
    +                    None => print!(" {:<3}", spk_i),
    +                })
    +                .inspect(move |_| stdout.flush().expect("must flush"));
    +            (k, k_spks)
             })
             .collect();
         let update = client
             .scan(
    -            checkpoints,
    -            spks,
    -            std::iter::empty(),
    -            std::iter::empty(),
    +            local_chain,
    +            keychain_spks,
    +            [],
    +            [],
                 STOP_GAP,
                 PARALLEL_REQUESTS,
             )
    diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/all.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/all.html
    index 4e9dd4930b..09535c45cd 100644
    --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/all.html
    +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/all.html
    @@ -1 +1 @@
    -List of all items in this crate

    List of all items

    Functions

    Constants

    \ No newline at end of file +List of all items in this crate

    List of all items

    Functions

    Constants

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/constant.BATCH_SIZE.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/constant.BATCH_SIZE.html index 7605952745..c506256ef3 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/constant.BATCH_SIZE.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/constant.BATCH_SIZE.html @@ -1 +1 @@ -BATCH_SIZE in wallet_electrum_example - Rust
    pub(crate) const BATCH_SIZE: usize = 5;
    \ No newline at end of file +BATCH_SIZE in wallet_electrum_example - Rust
    pub(crate) const BATCH_SIZE: usize = 5;
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/constant.DB_MAGIC.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/constant.DB_MAGIC.html new file mode 100644 index 0000000000..72c43a4398 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/constant.DB_MAGIC.html @@ -0,0 +1 @@ +DB_MAGIC in wallet_electrum_example - Rust
    pub(crate) const DB_MAGIC: &str = "bdk_wallet_electrum_example";
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/constant.SEND_AMOUNT.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/constant.SEND_AMOUNT.html index ca91b78769..972d4cbc93 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/constant.SEND_AMOUNT.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/constant.SEND_AMOUNT.html @@ -1 +1 @@ -SEND_AMOUNT in wallet_electrum_example - Rust
    pub(crate) const SEND_AMOUNT: u64 = 5000;
    \ No newline at end of file +SEND_AMOUNT in wallet_electrum_example - Rust
    pub(crate) const SEND_AMOUNT: u64 = 5000;
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/constant.STOP_GAP.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/constant.STOP_GAP.html index 243cfd5525..ea64fdade3 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/constant.STOP_GAP.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/constant.STOP_GAP.html @@ -1 +1 @@ -STOP_GAP in wallet_electrum_example - Rust
    pub(crate) const STOP_GAP: usize = 50;
    \ No newline at end of file +STOP_GAP in wallet_electrum_example - Rust
    pub(crate) const STOP_GAP: usize = 50;
    \ 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 14b2305115..facc9c8fb9 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<(), Box<dyn Error>>
    \ No newline at end of file +main in wallet_electrum_example - Rust

    Function wallet_electrum_example::main

    source ·
    pub(crate) fn main() -> Result<(), Box<dyn 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 3e4e162fad..e31c3d1043 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

    Constants

    BATCH_SIZE ðŸ”’
    SEND_AMOUNT ðŸ”’
    STOP_GAP ðŸ”’

    Functions

    main ðŸ”’
    \ No newline at end of file +wallet_electrum_example - Rust

    Constants

    BATCH_SIZE ðŸ”’
    DB_MAGIC ðŸ”’
    SEND_AMOUNT ðŸ”’
    STOP_GAP ðŸ”’

    Functions

    main ðŸ”’
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/sidebar-items.js index d15c08356e..1f51f99cf3 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/sidebar-items.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_electrum_example/sidebar-items.js @@ -1 +1 @@ -window.SIDEBAR_ITEMS = {"constant":[["BATCH_SIZE",""],["SEND_AMOUNT",""],["STOP_GAP",""]],"fn":[["main",""]]}; \ No newline at end of file +window.SIDEBAR_ITEMS = {"constant":[["BATCH_SIZE",""],["DB_MAGIC",""],["SEND_AMOUNT",""],["STOP_GAP",""]],"fn":[["main",""]]}; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/all.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/all.html similarity index 54% rename from docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/all.html rename to docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/all.html index 87be85a1d2..aedacebdfc 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/keychain_tracker_electrum_example/all.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/all.html @@ -1 +1 @@ -List of all items in this crate

    List of all items

    Structs

    Enums

    Functions

    \ No newline at end of file +List of all items in this crate

    List of all items

    Functions

    Constants

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/constant.DB_MAGIC.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/constant.DB_MAGIC.html new file mode 100644 index 0000000000..e89158e1c8 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/constant.DB_MAGIC.html @@ -0,0 +1 @@ +DB_MAGIC in wallet_esplora - Rust

    Constant wallet_esplora::DB_MAGIC

    source ·
    pub(crate) const DB_MAGIC: &str = "bdk_wallet_esplora_example";
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/constant.PARALLEL_REQUESTS.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/constant.PARALLEL_REQUESTS.html new file mode 100644 index 0000000000..c6d3bd3e08 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/constant.PARALLEL_REQUESTS.html @@ -0,0 +1 @@ +PARALLEL_REQUESTS in wallet_esplora - Rust
    pub(crate) const PARALLEL_REQUESTS: usize = 5;
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/constant.SEND_AMOUNT.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/constant.SEND_AMOUNT.html new file mode 100644 index 0000000000..5832319a00 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/constant.SEND_AMOUNT.html @@ -0,0 +1 @@ +SEND_AMOUNT in wallet_esplora - Rust

    Constant wallet_esplora::SEND_AMOUNT

    source ·
    pub(crate) const SEND_AMOUNT: u64 = 5000;
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/constant.STOP_GAP.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/constant.STOP_GAP.html new file mode 100644 index 0000000000..a6d60ab3e9 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/constant.STOP_GAP.html @@ -0,0 +1 @@ +STOP_GAP in wallet_esplora - Rust

    Constant wallet_esplora::STOP_GAP

    source ·
    pub(crate) const STOP_GAP: usize = 50;
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/fn.main.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/fn.main.html new file mode 100644 index 0000000000..11105f6066 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/fn.main.html @@ -0,0 +1 @@ +main in wallet_esplora - Rust

    Function wallet_esplora::main

    source ·
    pub(crate) fn main() -> Result<(), Box<dyn Error>>
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/index.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/index.html new file mode 100644 index 0000000000..5520f2a7e9 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/index.html @@ -0,0 +1 @@ +wallet_esplora - Rust

    Crate wallet_esplora

    source ·

    Constants

    DB_MAGIC ðŸ”’
    SEND_AMOUNT ðŸ”’
    STOP_GAP ðŸ”’

    Functions

    main ðŸ”’
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/sidebar-items.js new file mode 100644 index 0000000000..2c754b0761 --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":[["DB_MAGIC",""],["PARALLEL_REQUESTS",""],["SEND_AMOUNT",""],["STOP_GAP",""]],"fn":[["main",""]]}; \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/all.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/all.html index ff45e31bb4..1845365458 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/all.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/all.html @@ -1 +1 @@ -List of all items in this crate

    List of all items

    Functions

    Constants

    \ No newline at end of file +List of all items in this crate

    List of all items

    Functions

    Constants

    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/constant.DB_MAGIC.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/constant.DB_MAGIC.html new file mode 100644 index 0000000000..101a9161ff --- /dev/null +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/constant.DB_MAGIC.html @@ -0,0 +1 @@ +DB_MAGIC in wallet_esplora_async - Rust
    pub(crate) const DB_MAGIC: &str = "bdk_wallet_esplora_async_example";
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/constant.PARALLEL_REQUESTS.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/constant.PARALLEL_REQUESTS.html index 67ef1a001d..137d4d9713 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/constant.PARALLEL_REQUESTS.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/constant.PARALLEL_REQUESTS.html @@ -1 +1 @@ -PARALLEL_REQUESTS in wallet_esplora_async - Rust
    pub(crate) const PARALLEL_REQUESTS: usize = 5;
    \ No newline at end of file +PARALLEL_REQUESTS in wallet_esplora_async - Rust
    pub(crate) const PARALLEL_REQUESTS: usize = 5;
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/constant.SEND_AMOUNT.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/constant.SEND_AMOUNT.html index 440502731a..5934fd7137 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/constant.SEND_AMOUNT.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/constant.SEND_AMOUNT.html @@ -1 +1 @@ -SEND_AMOUNT in wallet_esplora_async - Rust
    pub(crate) const SEND_AMOUNT: u64 = 5000;
    \ No newline at end of file +SEND_AMOUNT in wallet_esplora_async - Rust
    pub(crate) const SEND_AMOUNT: u64 = 5000;
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/constant.STOP_GAP.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/constant.STOP_GAP.html index 36afeec8d7..1ff7ae69e4 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/constant.STOP_GAP.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/constant.STOP_GAP.html @@ -1 +1 @@ -STOP_GAP in wallet_esplora_async - Rust
    pub(crate) const STOP_GAP: usize = 50;
    \ No newline at end of file +STOP_GAP in wallet_esplora_async - Rust
    pub(crate) const STOP_GAP: usize = 50;
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/fn.main.html b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/fn.main.html index 36a9b410c4..aca61f0b83 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/fn.main.html +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/fn.main.html @@ -1 +1 @@ -main in wallet_esplora_async - Rust

    Function wallet_esplora_async::main

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

    Function wallet_esplora_async::main

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

    Constants

    SEND_AMOUNT ðŸ”’
    STOP_GAP ðŸ”’

    Functions

    main ðŸ”’
    \ No newline at end of file +wallet_esplora_async - Rust

    Constants

    DB_MAGIC ðŸ”’
    SEND_AMOUNT ðŸ”’
    STOP_GAP ðŸ”’

    Functions

    main ðŸ”’
    \ No newline at end of file diff --git a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/sidebar-items.js b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/sidebar-items.js index a6121128e9..2c754b0761 100644 --- a/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/sidebar-items.js +++ b/docs/.vuepress/public/docs-rs/bdk/nightly/latest/wallet_esplora_async/sidebar-items.js @@ -1 +1 @@ -window.SIDEBAR_ITEMS = {"constant":[["PARALLEL_REQUESTS",""],["SEND_AMOUNT",""],["STOP_GAP",""]],"fn":[["main",""]]}; \ No newline at end of file +window.SIDEBAR_ITEMS = {"constant":[["DB_MAGIC",""],["PARALLEL_REQUESTS",""],["SEND_AMOUNT",""],["STOP_GAP",""]],"fn":[["main",""]]}; \ No newline at end of file -- 2.49.0