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 c6c922d557..ed90c87343 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; @@ -2485,6 +2486,70 @@ impl Wallet { .batch_insert_relevant_unconfirmed(unconfirmed_txs); self.persist.stage(ChangeSet::from(indexed_graph_changeset)); } + + /// Create a [`SyncRequest`] for this wallet. + /// + /// This is the first step when performing a spk-based wallet sync, the returned [`SyncRequest`] collects + /// the wallet keychain all or unused script pub keys, unconfirmed transaction id, UTXOs and local + /// chain checkpoint data needed to start a blockchain sync with a blockchain client. For a faster + /// sync set `unused_spks_only` to true to only get updates for unused wallet script pub keys (addresses). + pub fn sync_request(&self, unused_spks_only: bool) -> SyncRequest { + let local_chain = self.local_chain().clone(); + + // Sync only unused SPKs + let spks = if unused_spks_only { + self.spk_index() + .unused_spks() + .map(|(_keychain, _index, script)| ScriptBuf::from(script)) + .collect::>() + } + // Sync all SPKs + else { + self.spk_index() + .revealed_spks() + .map(|(_keychain, _index, script)| ScriptBuf::from(script)) + .collect::>() + }; + + // Sync UTXOs + // We want to search for whether our UTXOs are spent, and spent by which transaction. + let outpoints: Vec = self.list_unspent().map(|utxo| utxo.outpoint).collect(); + + // Sync unconfirmed TX + // We want to search for whether our unconfirmed transactions are now confirmed. + let txids: Vec = self + .transactions() + .filter(|canonical_tx| !canonical_tx.chain_position.is_confirmed()) + .map(|canonical_tx| canonical_tx.tx_node.txid) + .collect(); + + SyncRequest { + spks, + txids, + outpoints, + local_chain, + } + } + + /// 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, and local chain checkpoint + /// data needed to start a blockchain full scan with a 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 spks_by_keychain = self.all_unbounded_spk_iters(); + let local_chain = self.local_chain().clone(); + + FullScanRequest { + spks_by_keychain, + local_chain, + } + } } impl AsRef> for Wallet {