From 9c200c3137c62f6f90d4ecaf10b8877313826696 Mon Sep 17 00:00:00 2001 From: Steve Myers Date: Thu, 21 Dec 2023 11:44:31 -0600 Subject: [PATCH] feat(wallet): add sync_request and full_scan_request functions --- crates/bdk/src/wallet/error.rs | 8 +++----- crates/bdk/src/wallet/mod.rs | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/crates/bdk/src/wallet/error.rs b/crates/bdk/src/wallet/error.rs index db58fef06f..a90083fa12 100644 --- a/crates/bdk/src/wallet/error.rs +++ b/crates/bdk/src/wallet/error.rs @@ -44,9 +44,9 @@ impl fmt::Display for MiniscriptPsbtError { impl std::error::Error for MiniscriptPsbtError {} #[derive(Debug)] -/// Error returned from [`TxBuilder::finish`] +/// Error returned by [`TxBuilder::finish`] /// -/// [`TxBuilder::finish`]: crate::wallet::tx_builder::TxBuilder::finish +/// [`TxBuilder::finish`]: super::tx_builder::TxBuilder::finish pub enum CreateTxError

{ /// There was a problem with the descriptors passed in Descriptor(DescriptorError), @@ -246,9 +246,7 @@ impl

From for CreateTxError

{ impl std::error::Error for CreateTxError

{} #[derive(Debug)] -/// Error returned from [`Wallet::build_fee_bump`] -/// -/// [`Wallet::build_fee_bump`]: super::Wallet::build_fee_bump +/// Error returned by [`Wallet::build_fee_bump`] pub enum BuildFeeBumpError { /// Happens when trying to spend an UTXO that is not in the internal database UnknownUtxo(OutPoint), diff --git a/crates/bdk/src/wallet/mod.rs b/crates/bdk/src/wallet/mod.rs index 4db035fb6c..3790945452 100644 --- a/crates/bdk/src/wallet/mod.rs +++ b/crates/bdk/src/wallet/mod.rs @@ -43,6 +43,7 @@ use core::ops::Deref; use descriptor::error::Error as DescriptorError; use miniscript::psbt::{PsbtExt, PsbtInputExt, PsbtInputSatisfier}; +use bdk_chain::spk_client::{FullScanRequest, SyncRequest}; use bdk_chain::tx_graph::CalculateFeeError; pub mod coin_selection; @@ -2488,6 +2489,31 @@ impl Wallet { .batch_insert_relevant_unconfirmed(unconfirmed_txs); self.persist.stage(ChangeSet::from(indexed_graph_changeset)); } + + /// Create a [`SyncRequest`] for this wallet for all revealed spks. + /// + /// This is the first step when performing a spk-based wallet sync, the returned [`SyncRequest`] collects + /// all revealed script pub keys from the wallet keychain needed to start a blockchain sync with a spk based + /// blockchain client. + pub fn sync_revealed_spks_request(&self) -> SyncRequest { + let chain_tip = self.local_chain().tip(); + self.spk_index().sync_revealed_spks_request(chain_tip) + } + + /// Create a [`FullScanRequest] for this wallet. + /// + /// This is the first step when performing a spk-based wallet full scan, the returned [`FullScanRequest] + /// collects iterators for the wallet's keychain script pub keys needed to start a blockchain full scan + /// with a spk based blockchain client. + /// + /// This operation is generally only used when importing or restoring a previously used wallet + /// in which the list of used scripts is not known. + pub fn full_scan_request( + &self, + ) -> FullScanRequest + Clone> { + let chain_tip = self.local_chain().tip(); + self.spk_index().full_scan_request(chain_tip) + } } impl AsRef> for Wallet {