Merge bitcoindevkit/bdk#1412: Add new crate bdk-persist
				
					
				
			81de8f60516899fad2ec99cbd15d6b8d02385ebb feat(bdk-persist): extract persistence traits to new crate (Rob N) Pull request description: ### Description #1387 introduced `anyhow` as a dependency to remove generics from `Wallet`. Introducing a new crate for persistence types removes the dependency on `anyhow` for `bdk_chain`. Resolves #1409, as well as removing the old documentation for "tracker". ### Notes to the reviewers Open for any comments. ### Changelog notice - Introduce `bdk-persist` crate ### Checklists #### All Submissions: * [x] I've signed all my commits * [x] I followed the [contribution guidelines](https://github.com/bitcoindevkit/bdk/blob/master/CONTRIBUTING.md) * [x] I ran `cargo fmt` and `cargo clippy` before committing #### New Features: * [ ] I've added tests for the new feature * [ ] I've added docs for the new feature #### Bugfixes: * [ ] This pull request breaks the existing API * [ ] I've added tests to reproduce the issue which are now passing * [x] I'm linking the issue being fixed by this PR ACKs for top commit: evanlinjin: ACK 81de8f60516899fad2ec99cbd15d6b8d02385ebb Tree-SHA512: 29b192b13f3951cc67c06bec7f788d8d7a4aeaf2ffcbf9476d4a6567529d284a93594c8d94b69741a68a9aadfdc9f6c4178084a2298c505e8e0d505219400382
This commit is contained in:
		
						commit
						ed3ccc1a9d
					
				| @ -8,6 +8,7 @@ members = [ | |||||||
|     "crates/esplora", |     "crates/esplora", | ||||||
|     "crates/bitcoind_rpc", |     "crates/bitcoind_rpc", | ||||||
|     "crates/hwi", |     "crates/hwi", | ||||||
|  |     "crates/persist", | ||||||
|     "crates/testenv", |     "crates/testenv", | ||||||
|     "example-crates/example_cli", |     "example-crates/example_cli", | ||||||
|     "example-crates/example_electrum", |     "example-crates/example_electrum", | ||||||
|  | |||||||
| @ -41,6 +41,7 @@ The project is split up into several crates in the `/crates` directory: | |||||||
| 
 | 
 | ||||||
| - [`bdk`](./crates/bdk): Contains the central high level `Wallet` type that is built from the low-level mechanisms provided by the other components | - [`bdk`](./crates/bdk): Contains the central high level `Wallet` type that is built from the low-level mechanisms provided by the other components | ||||||
| - [`chain`](./crates/chain): Tools for storing and indexing chain data | - [`chain`](./crates/chain): Tools for storing and indexing chain data | ||||||
|  | - [`persist`](./crates/persist): Types that define data persistence of a BDK wallet | ||||||
| - [`file_store`](./crates/file_store): A (experimental) persistence backend for storing chain data in a single file. | - [`file_store`](./crates/file_store): A (experimental) persistence backend for storing chain data in a single file. | ||||||
| - [`esplora`](./crates/esplora): Extends the [`esplora-client`] crate with methods to fetch chain data from an esplora HTTP server in the form that [`bdk_chain`] and `Wallet` can consume. | - [`esplora`](./crates/esplora): Extends the [`esplora-client`] crate with methods to fetch chain data from an esplora HTTP server in the form that [`bdk_chain`] and `Wallet` can consume. | ||||||
| - [`electrum`](./crates/electrum): Extends the [`electrum-client`] crate with methods to fetch chain data from an electrum server in the form that [`bdk_chain`] and `Wallet` can consume. | - [`electrum`](./crates/electrum): Extends the [`electrum-client`] crate with methods to fetch chain data from an electrum server in the form that [`bdk_chain`] and `Wallet` can consume. | ||||||
|  | |||||||
| @ -20,6 +20,7 @@ bitcoin = { version = "0.31.0", features = ["serde", "base64", "rand-std"], defa | |||||||
| serde = { version = "^1.0", features = ["derive"] } | serde = { version = "^1.0", features = ["derive"] } | ||||||
| serde_json = { version = "^1.0" } | serde_json = { version = "^1.0" } | ||||||
| bdk_chain = { path = "../chain", version = "0.12.0", features = ["miniscript", "serde"], default-features = false } | bdk_chain = { path = "../chain", version = "0.12.0", features = ["miniscript", "serde"], default-features = false } | ||||||
|  | bdk_persist = { path = "../persist", version = "0.1.0" } | ||||||
| 
 | 
 | ||||||
| # Optional dependencies | # Optional dependencies | ||||||
| bip39 = { version = "2.0", optional = true } | bip39 = { version = "2.0", optional = true } | ||||||
|  | |||||||
| @ -219,7 +219,7 @@ license, shall be dual licensed as above, without any additional terms or | |||||||
| conditions. | conditions. | ||||||
| 
 | 
 | ||||||
| [`Wallet`]: https://docs.rs/bdk/1.0.0-alpha.7/bdk/wallet/struct.Wallet.html | [`Wallet`]: https://docs.rs/bdk/1.0.0-alpha.7/bdk/wallet/struct.Wallet.html | ||||||
| [`PersistBackend`]: https://docs.rs/bdk_chain/latest/bdk_chain/trait.PersistBackend.html | [`PersistBackend`]: https://docs.rs/bdk_persist/latest/bdk_persist/trait.PersistBackend.html | ||||||
| [`bdk_chain`]: https://docs.rs/bdk_chain/latest | [`bdk_chain`]: https://docs.rs/bdk_chain/latest | ||||||
| [`bdk_file_store`]: https://docs.rs/bdk_file_store/latest | [`bdk_file_store`]: https://docs.rs/bdk_file_store/latest | ||||||
| [`bdk_electrum`]: https://docs.rs/bdk_electrum/latest | [`bdk_electrum`]: https://docs.rs/bdk_electrum/latest | ||||||
|  | |||||||
| @ -28,7 +28,7 @@ | |||||||
| //! # use bitcoin::*;
 | //! # use bitcoin::*;
 | ||||||
| //! # use bdk::wallet::{self, ChangeSet, coin_selection::*, coin_selection};
 | //! # use bdk::wallet::{self, ChangeSet, coin_selection::*, coin_selection};
 | ||||||
| //! # use bdk::wallet::error::CreateTxError;
 | //! # use bdk::wallet::error::CreateTxError;
 | ||||||
| //! # use bdk_chain::PersistBackend;
 | //! # use bdk_persist::PersistBackend;
 | ||||||
| //! # use bdk::*;
 | //! # use bdk::*;
 | ||||||
| //! # use bdk::wallet::coin_selection::decide_change;
 | //! # use bdk::wallet::coin_selection::decide_change;
 | ||||||
| //! # use anyhow::Error;
 | //! # use anyhow::Error;
 | ||||||
|  | |||||||
| @ -28,8 +28,9 @@ use bdk_chain::{ | |||||||
|     }, |     }, | ||||||
|     tx_graph::{CanonicalTx, TxGraph}, |     tx_graph::{CanonicalTx, TxGraph}, | ||||||
|     Append, BlockId, ChainPosition, ConfirmationTime, ConfirmationTimeHeightAnchor, FullTxOut, |     Append, BlockId, ChainPosition, ConfirmationTime, ConfirmationTimeHeightAnchor, FullTxOut, | ||||||
|     IndexedTxGraph, Persist, PersistBackend, |     IndexedTxGraph, | ||||||
| }; | }; | ||||||
|  | use bdk_persist::{Persist, PersistBackend}; | ||||||
| use bitcoin::constants::genesis_block; | use bitcoin::constants::genesis_block; | ||||||
| use bitcoin::secp256k1::{All, Secp256k1}; | use bitcoin::secp256k1::{All, Secp256k1}; | ||||||
| use bitcoin::sighash::{EcdsaSighashType, TapSighashType}; | use bitcoin::sighash::{EcdsaSighashType, TapSighashType}; | ||||||
| @ -1167,7 +1168,7 @@ impl Wallet { | |||||||
|     /// # use bdk::*;
 |     /// # use bdk::*;
 | ||||||
|     /// # use bdk::wallet::ChangeSet;
 |     /// # use bdk::wallet::ChangeSet;
 | ||||||
|     /// # use bdk::wallet::error::CreateTxError;
 |     /// # use bdk::wallet::error::CreateTxError;
 | ||||||
|     /// # use bdk_chain::PersistBackend;
 |     /// # use bdk_persist::PersistBackend;
 | ||||||
|     /// # use anyhow::Error;
 |     /// # use anyhow::Error;
 | ||||||
|     /// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";
 |     /// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";
 | ||||||
|     /// # let mut wallet = doctest_wallet!();
 |     /// # let mut wallet = doctest_wallet!();
 | ||||||
| @ -1549,7 +1550,7 @@ impl Wallet { | |||||||
|     /// # use bdk::*;
 |     /// # use bdk::*;
 | ||||||
|     /// # use bdk::wallet::ChangeSet;
 |     /// # use bdk::wallet::ChangeSet;
 | ||||||
|     /// # use bdk::wallet::error::CreateTxError;
 |     /// # use bdk::wallet::error::CreateTxError;
 | ||||||
|     /// # use bdk_chain::PersistBackend;
 |     /// # use bdk_persist::PersistBackend;
 | ||||||
|     /// # use anyhow::Error;
 |     /// # use anyhow::Error;
 | ||||||
|     /// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";
 |     /// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";
 | ||||||
|     /// # let mut wallet = doctest_wallet!();
 |     /// # let mut wallet = doctest_wallet!();
 | ||||||
| @ -1724,7 +1725,7 @@ impl Wallet { | |||||||
|     /// # use bdk::*;
 |     /// # use bdk::*;
 | ||||||
|     /// # use bdk::wallet::ChangeSet;
 |     /// # use bdk::wallet::ChangeSet;
 | ||||||
|     /// # use bdk::wallet::error::CreateTxError;
 |     /// # use bdk::wallet::error::CreateTxError;
 | ||||||
|     /// # use bdk_chain::PersistBackend;
 |     /// # use bdk_persist::PersistBackend;
 | ||||||
|     /// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";
 |     /// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";
 | ||||||
|     /// # let mut wallet = doctest_wallet!();
 |     /// # let mut wallet = doctest_wallet!();
 | ||||||
|     /// # let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap().assume_checked();
 |     /// # let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap().assume_checked();
 | ||||||
|  | |||||||
| @ -20,7 +20,7 @@ | |||||||
| //! # use bdk::wallet::ChangeSet;
 | //! # use bdk::wallet::ChangeSet;
 | ||||||
| //! # use bdk::wallet::error::CreateTxError;
 | //! # use bdk::wallet::error::CreateTxError;
 | ||||||
| //! # use bdk::wallet::tx_builder::CreateTx;
 | //! # use bdk::wallet::tx_builder::CreateTx;
 | ||||||
| //! # use bdk_chain::PersistBackend;
 | //! # use bdk_persist::PersistBackend;
 | ||||||
| //! # use anyhow::Error;
 | //! # use anyhow::Error;
 | ||||||
| //! # let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap().assume_checked();
 | //! # let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap().assume_checked();
 | ||||||
| //! # let mut wallet = doctest_wallet!();
 | //! # let mut wallet = doctest_wallet!();
 | ||||||
| @ -84,7 +84,7 @@ impl TxBuilderContext for BumpFee {} | |||||||
| /// # use core::str::FromStr;
 | /// # use core::str::FromStr;
 | ||||||
| /// # use bdk::wallet::ChangeSet;
 | /// # use bdk::wallet::ChangeSet;
 | ||||||
| /// # use bdk::wallet::error::CreateTxError;
 | /// # use bdk::wallet::error::CreateTxError;
 | ||||||
| /// # use bdk_chain::PersistBackend;
 | /// # use bdk_persist::PersistBackend;
 | ||||||
| /// # use anyhow::Error;
 | /// # use anyhow::Error;
 | ||||||
| /// # let mut wallet = doctest_wallet!();
 | /// # let mut wallet = doctest_wallet!();
 | ||||||
| /// # let addr1 = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap().assume_checked();
 | /// # let addr1 = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap().assume_checked();
 | ||||||
| @ -758,7 +758,7 @@ impl<'a, Cs: CoinSelectionAlgorithm> TxBuilder<'a, Cs, CreateTx> { | |||||||
|     /// # use bdk::wallet::ChangeSet;
 |     /// # use bdk::wallet::ChangeSet;
 | ||||||
|     /// # use bdk::wallet::error::CreateTxError;
 |     /// # use bdk::wallet::error::CreateTxError;
 | ||||||
|     /// # use bdk::wallet::tx_builder::CreateTx;
 |     /// # use bdk::wallet::tx_builder::CreateTx;
 | ||||||
|     /// # use bdk_chain::PersistBackend;
 |     /// # use bdk_persist::PersistBackend;
 | ||||||
|     /// # use anyhow::Error;
 |     /// # use anyhow::Error;
 | ||||||
|     /// # let to_address =
 |     /// # let to_address =
 | ||||||
|     /// Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt")
 |     /// Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt")
 | ||||||
|  | |||||||
| @ -14,7 +14,6 @@ readme = "README.md" | |||||||
| 
 | 
 | ||||||
| [dependencies] | [dependencies] | ||||||
| # For no-std, remember to enable the bitcoin/no-std feature | # For no-std, remember to enable the bitcoin/no-std feature | ||||||
| anyhow = { version = "1", default-features = false } |  | ||||||
| bitcoin = { version = "0.31.0", default-features = false } | bitcoin = { version = "0.31.0", default-features = false } | ||||||
| serde_crate = { package = "serde", version = "1", optional = true, features = ["derive", "rc"] } | serde_crate = { package = "serde", version = "1", optional = true, features = ["derive", "rc"] } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -35,8 +35,6 @@ pub use tx_data_traits::*; | |||||||
| pub use tx_graph::TxGraph; | pub use tx_graph::TxGraph; | ||||||
| mod chain_oracle; | mod chain_oracle; | ||||||
| pub use chain_oracle::*; | pub use chain_oracle::*; | ||||||
| mod persist; |  | ||||||
| pub use persist::*; |  | ||||||
| 
 | 
 | ||||||
| #[doc(hidden)] | #[doc(hidden)] | ||||||
| pub mod example_utils; | pub mod example_utils; | ||||||
|  | |||||||
| @ -13,6 +13,7 @@ readme = "README.md" | |||||||
| [dependencies] | [dependencies] | ||||||
| anyhow = { version = "1", default-features = false } | anyhow = { version = "1", default-features = false } | ||||||
| bdk_chain = { path = "../chain", version = "0.12.0", features = [ "serde", "miniscript" ] } | bdk_chain = { path = "../chain", version = "0.12.0", features = [ "serde", "miniscript" ] } | ||||||
|  | bdk_persist = { path = "../persist", version = "0.1.0"} | ||||||
| bincode = { version = "1" } | bincode = { version = "1" } | ||||||
| serde = { version = "1", features = ["derive"] } | serde = { version = "1", features = ["derive"] } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,10 +1,10 @@ | |||||||
| # BDK File Store | # BDK File Store | ||||||
| 
 | 
 | ||||||
| This is a simple append-only flat file implementation of | This is a simple append-only flat file implementation of | ||||||
| [`Persist`](`bdk_chain::Persist`). | [`PersistBackend`](bdk_persist::PersistBackend). | ||||||
| 
 | 
 | ||||||
| The main structure is [`Store`](`crate::Store`), which can be used with [`bdk`]'s | The main structure is [`Store`](crate::Store), which can be used with [`bdk`]'s | ||||||
| `Wallet` to persist wallet data into a flat file. | `Wallet` to persist wallet data into a flat file. | ||||||
| 
 | 
 | ||||||
| [`bdk`]: https://docs.rs/bdk/latest | [`bdk`]: https://docs.rs/bdk/latest | ||||||
| [`bdk_chain`]: https://docs.rs/bdk_chain/latest | [`bdk_persist`]: https://docs.rs/bdk_persist/latest | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| use crate::{bincode_options, EntryIter, FileError, IterError}; | use crate::{bincode_options, EntryIter, FileError, IterError}; | ||||||
| use anyhow::anyhow; | use anyhow::anyhow; | ||||||
| use bdk_chain::{Append, PersistBackend}; | use bdk_chain::Append; | ||||||
|  | use bdk_persist::PersistBackend; | ||||||
| use bincode::Options; | use bincode::Options; | ||||||
| use std::{ | use std::{ | ||||||
|     fmt::{self, Debug}, |     fmt::{self, Debug}, | ||||||
| @ -11,8 +12,6 @@ use std::{ | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /// Persists an append-only list of changesets (`C`) to a single file.
 | /// Persists an append-only list of changesets (`C`) to a single file.
 | ||||||
| ///
 |  | ||||||
| /// The changesets are the results of altering a tracker implementation (`T`).
 |  | ||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| pub struct Store<C> | pub struct Store<C> | ||||||
| where | where | ||||||
| @ -152,7 +151,7 @@ where | |||||||
|     ///
 |     ///
 | ||||||
|     /// You should usually check the error. In many applications, it may make sense to do a full
 |     /// 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
 |     /// 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.
 |     /// changesets was unable to read changes of the derivation indices of a keychain.
 | ||||||
|     ///
 |     ///
 | ||||||
|     /// **WARNING**: This method changes the write position of the underlying file. The next
 |     /// **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).
 |     /// changeset will be written over the erroring entry (or the end of the file if none existed).
 | ||||||
| @ -240,9 +239,6 @@ mod test { | |||||||
| 
 | 
 | ||||||
|     type TestChangeSet = BTreeSet<String>; |     type TestChangeSet = BTreeSet<String>; | ||||||
| 
 | 
 | ||||||
|     #[derive(Debug)] |  | ||||||
|     struct TestTracker; |  | ||||||
| 
 |  | ||||||
|     /// Check behavior of [`Store::create_new`] and [`Store::open`].
 |     /// Check behavior of [`Store::create_new`] and [`Store::open`].
 | ||||||
|     #[test] |     #[test] | ||||||
|     fn construct_store() { |     fn construct_store() { | ||||||
|  | |||||||
							
								
								
									
										19
									
								
								crates/persist/Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								crates/persist/Cargo.toml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | |||||||
|  | [package] | ||||||
|  | name = "bdk_persist" | ||||||
|  | homepage = "https://bitcoindevkit.org" | ||||||
|  | version = "0.1.0" | ||||||
|  | repository = "https://github.com/bitcoindevkit/bdk" | ||||||
|  | documentation = "https://docs.rs/bdk_persist" | ||||||
|  | description = "Types that define data persistence of a BDK wallet" | ||||||
|  | keywords = ["bitcoin", "wallet", "persistence", "database"] | ||||||
|  | readme = "README.md" | ||||||
|  | license = "MIT OR Apache-2.0" | ||||||
|  | authors = ["Bitcoin Dev Kit Developers"] | ||||||
|  | edition = "2021" | ||||||
|  | rust-version = "1.63" | ||||||
|  | 
 | ||||||
|  | [dependencies] | ||||||
|  | anyhow = { version = "1", default-features = false } | ||||||
|  | bdk_chain = { path = "../chain", version = "0.12.0", default-features = false } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
							
								
								
									
										3
									
								
								crates/persist/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								crates/persist/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | # BDK Persist | ||||||
|  | 
 | ||||||
|  | This crate is home to the [`PersistBackend`](crate::PersistBackend) trait which defines the behavior of a database to perform the task of persisting changes made to BDK data structures. The [`Persist`](crate::Persist) type provides a convenient wrapper around a `PersistBackend` that allows staging changes before committing them. | ||||||
							
								
								
									
										5
									
								
								crates/persist/src/lib.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								crates/persist/src/lib.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | |||||||
|  | #![doc = include_str!("../README.md")] | ||||||
|  | #![no_std] | ||||||
|  | #![warn(missing_docs)] | ||||||
|  | mod persist; | ||||||
|  | pub use persist::*; | ||||||
| @ -1,5 +1,6 @@ | |||||||
| use crate::Append; | extern crate alloc; | ||||||
| use alloc::boxed::Box; | use alloc::boxed::Box; | ||||||
|  | use bdk_chain::Append; | ||||||
| use core::fmt; | use core::fmt; | ||||||
| 
 | 
 | ||||||
| /// `Persist` wraps a [`PersistBackend`] to create a convenient staging area for changes (`C`)
 | /// `Persist` wraps a [`PersistBackend`] to create a convenient staging area for changes (`C`)
 | ||||||
| @ -7,6 +7,7 @@ edition = "2021" | |||||||
| 
 | 
 | ||||||
| [dependencies] | [dependencies] | ||||||
| bdk_chain = { path = "../../crates/chain", features = ["serde", "miniscript"]} | bdk_chain = { path = "../../crates/chain", features = ["serde", "miniscript"]} | ||||||
|  | bdk_persist = { path = "../../crates/persist" } | ||||||
| bdk_file_store = { path = "../../crates/file_store" } | bdk_file_store = { path = "../../crates/file_store" } | ||||||
| bdk_tmp_plan = { path = "../../nursery/tmp_plan" } | bdk_tmp_plan = { path = "../../nursery/tmp_plan" } | ||||||
| bdk_coin_select = { path = "../../nursery/coin_select" } | bdk_coin_select = { path = "../../nursery/coin_select" } | ||||||
|  | |||||||
| @ -19,9 +19,10 @@ use bdk_chain::{ | |||||||
|         descriptor::{DescriptorSecretKey, KeyMap}, |         descriptor::{DescriptorSecretKey, KeyMap}, | ||||||
|         Descriptor, DescriptorPublicKey, |         Descriptor, DescriptorPublicKey, | ||||||
|     }, |     }, | ||||||
|     Anchor, Append, ChainOracle, DescriptorExt, FullTxOut, Persist, PersistBackend, |     Anchor, Append, ChainOracle, DescriptorExt, FullTxOut, | ||||||
| }; | }; | ||||||
| pub use bdk_file_store; | pub use bdk_file_store; | ||||||
|  | use bdk_persist::{Persist, PersistBackend}; | ||||||
| pub use clap; | pub use clap; | ||||||
| 
 | 
 | ||||||
| use clap::{Parser, Subcommand}; | use clap::{Parser, Subcommand}; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user