Skip to content

Commit

Permalink
feat: add sync method on electrum client
Browse files Browse the repository at this point in the history
  • Loading branch information
thunderbiscuit committed May 15, 2024
1 parent e3b9ed4 commit 551c5bf
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 14 deletions.
3 changes: 3 additions & 0 deletions bdk-ffi/src/bdk.udl
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,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);
};

// ------------------------------------------------------------------------
Expand Down
56 changes: 43 additions & 13 deletions bdk-ffi/src/electrum.rs
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -33,16 +36,14 @@ impl ElectrumClient {
.take()
.ok_or(ElectrumClientError::RequestAlreadyConsumed)?;

let electrum_result: ElectrumFullScanResult<KeychainKind> =
self.0
.full_scan(
request,
stop_gap as usize,
batch_size as usize,
fetch_prev_txouts,
)?;
let full_scan_result: BdkFullScanResult<KeychainKind> = electrum_result
.with_confirmation_time_height_anchor(&self.0)?;
let electrum_result: ElectrumFullScanResult<KeychainKind> = self.0.full_scan(
request,
stop_gap as usize,
batch_size as usize,
fetch_prev_txouts,
)?;
let full_scan_result: BdkFullScanResult<KeychainKind> =
electrum_result.with_confirmation_time_height_anchor(&self.0)?;

let update = bdk::wallet::Update {
last_active_indices: full_scan_result.last_active_indices,
Expand All @@ -52,4 +53,33 @@ impl ElectrumClient {

Ok(Arc::new(Update(update)))
}
}

pub fn sync(
&self,
request: Arc<SyncRequest>,
batch_size: u64,
fetch_prev_txouts: bool,
) -> Result<Arc<Update>, 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)))
}
}
7 changes: 6 additions & 1 deletion bdk-ffi/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1077,7 +1077,12 @@ impl From<NewOrLoadError> 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;
Expand Down

0 comments on commit 551c5bf

Please sign in to comment.