diff --git a/bdk-ffi/src/bdk.udl b/bdk-ffi/src/bdk.udl index 7239d11..bae6d75 100644 --- a/bdk-ffi/src/bdk.udl +++ b/bdk-ffi/src/bdk.udl @@ -498,6 +498,9 @@ interface ElectrumClient { [Throws=ElectrumClientError] Update full_scan(FullScanRequest full_scan_request, u64 stop_gap, u64 batch_size, boolean fetch_prev_txouts); + + [Throws=ElectrumClientError] + Update sync(SyncRequest sync_request, u64 batch_size, boolean fetch_prev_txouts); }; // ------------------------------------------------------------------------ diff --git a/bdk-ffi/src/electrum.rs b/bdk-ffi/src/electrum.rs index 3bcd9c3..d25ccf4 100644 --- a/bdk-ffi/src/electrum.rs +++ b/bdk-ffi/src/electrum.rs @@ -1,12 +1,15 @@ use crate::error::ElectrumClientError; -use crate::types::FullScanRequest; +use crate::types::{FullScanRequest, SyncRequest}; use crate::wallet::Update; +use std::collections::BTreeMap; use bdk::chain::spk_client::FullScanRequest as BdkFullScanRequest; use bdk::chain::spk_client::FullScanResult as BdkFullScanResult; -use bdk_electrum::{ElectrumExt, ElectrumFullScanResult}; +use bdk::chain::spk_client::SyncRequest as BdkSyncRequest; +use bdk::chain::spk_client::SyncResult as BdkSyncResult; use bdk::KeychainKind; use bdk_electrum::electrum_client::Client as BdkBlockingClient; +use bdk_electrum::{ElectrumExt, ElectrumFullScanResult, ElectrumSyncResult}; use std::sync::Arc; @@ -33,16 +36,14 @@ impl ElectrumClient { .take() .ok_or(ElectrumClientError::RequestAlreadyConsumed)?; - let electrum_result: ElectrumFullScanResult = - self.0 - .full_scan( - request, - stop_gap as usize, - batch_size as usize, - fetch_prev_txouts, - )?; - let full_scan_result: BdkFullScanResult = electrum_result - .with_confirmation_time_height_anchor(&self.0)?; + let electrum_result: ElectrumFullScanResult = self.0.full_scan( + request, + stop_gap as usize, + batch_size as usize, + fetch_prev_txouts, + )?; + let full_scan_result: BdkFullScanResult = + electrum_result.with_confirmation_time_height_anchor(&self.0)?; let update = bdk::wallet::Update { last_active_indices: full_scan_result.last_active_indices, @@ -52,4 +53,33 @@ impl ElectrumClient { Ok(Arc::new(Update(update))) } -} \ No newline at end of file + + pub fn sync( + &self, + request: Arc, + batch_size: u64, + fetch_prev_txouts: bool, + ) -> Result, ElectrumClientError> { + // using option and take is not ideal but the only way to take full ownership of the request + let request: BdkSyncRequest = request + .0 + .lock() + .unwrap() + .take() + .ok_or(ElectrumClientError::RequestAlreadyConsumed)?; + + let electrum_result: ElectrumSyncResult = + self.0 + .sync(request, batch_size as usize, fetch_prev_txouts)?; + let sync_result: BdkSyncResult = + electrum_result.with_confirmation_time_height_anchor(&self.0)?; + + let update = bdk::wallet::Update { + last_active_indices: BTreeMap::default(), + graph: sync_result.graph_update, + chain: Some(sync_result.chain_update), + }; + + Ok(Arc::new(Update(update))) + } +} diff --git a/bdk-ffi/src/error.rs b/bdk-ffi/src/error.rs index 1d108e2..3b62316 100644 --- a/bdk-ffi/src/error.rs +++ b/bdk-ffi/src/error.rs @@ -1077,7 +1077,12 @@ impl From for WalletCreationError { #[cfg(test)] mod test { - use crate::error::{AddressError, Bip32Error, Bip39Error, CannotConnectError, CreateTxError, DescriptorError, DescriptorKeyError, ElectrumClientError, EsploraError, ExtractTxError, FeeRateError, ParseAmountError, PersistenceError, PsbtParseError, TransactionError, TxidParseError, WalletCreationError}; + use crate::error::{ + AddressError, Bip32Error, Bip39Error, CannotConnectError, CreateTxError, DescriptorError, + DescriptorKeyError, ElectrumClientError, EsploraError, ExtractTxError, FeeRateError, + ParseAmountError, PersistenceError, PsbtParseError, TransactionError, TxidParseError, + WalletCreationError, + }; use crate::CalculateFeeError; use crate::OutPoint; use crate::SignerError;