feat: add sync method on electrum client
This commit is contained in:
parent
815fe5f62d
commit
1913c45ef9
@ -498,6 +498,9 @@ interface ElectrumClient {
|
|||||||
|
|
||||||
[Throws=ElectrumClientError]
|
[Throws=ElectrumClientError]
|
||||||
Update full_scan(FullScanRequest full_scan_request, u64 stop_gap, u64 batch_size, boolean fetch_prev_txouts);
|
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);
|
||||||
};
|
};
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
@ -1,12 +1,15 @@
|
|||||||
use crate::error::ElectrumClientError;
|
use crate::error::ElectrumClientError;
|
||||||
use crate::types::FullScanRequest;
|
use crate::types::{FullScanRequest, SyncRequest};
|
||||||
use crate::wallet::Update;
|
use crate::wallet::Update;
|
||||||
|
use std::collections::BTreeMap;
|
||||||
|
|
||||||
use bdk::chain::spk_client::FullScanRequest as BdkFullScanRequest;
|
use bdk::chain::spk_client::FullScanRequest as BdkFullScanRequest;
|
||||||
use bdk::chain::spk_client::FullScanResult as BdkFullScanResult;
|
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::KeychainKind;
|
||||||
use bdk_electrum::electrum_client::Client as BdkBlockingClient;
|
use bdk_electrum::electrum_client::Client as BdkBlockingClient;
|
||||||
|
use bdk_electrum::{ElectrumExt, ElectrumFullScanResult, ElectrumSyncResult};
|
||||||
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
@ -33,16 +36,14 @@ impl ElectrumClient {
|
|||||||
.take()
|
.take()
|
||||||
.ok_or(ElectrumClientError::RequestAlreadyConsumed)?;
|
.ok_or(ElectrumClientError::RequestAlreadyConsumed)?;
|
||||||
|
|
||||||
let electrum_result: ElectrumFullScanResult<KeychainKind> =
|
let electrum_result: ElectrumFullScanResult<KeychainKind> = self.0.full_scan(
|
||||||
self.0
|
|
||||||
.full_scan(
|
|
||||||
request,
|
request,
|
||||||
stop_gap as usize,
|
stop_gap as usize,
|
||||||
batch_size as usize,
|
batch_size as usize,
|
||||||
fetch_prev_txouts,
|
fetch_prev_txouts,
|
||||||
)?;
|
)?;
|
||||||
let full_scan_result: BdkFullScanResult<KeychainKind> = electrum_result
|
let full_scan_result: BdkFullScanResult<KeychainKind> =
|
||||||
.with_confirmation_time_height_anchor(&self.0)?;
|
electrum_result.with_confirmation_time_height_anchor(&self.0)?;
|
||||||
|
|
||||||
let update = bdk::wallet::Update {
|
let update = bdk::wallet::Update {
|
||||||
last_active_indices: full_scan_result.last_active_indices,
|
last_active_indices: full_scan_result.last_active_indices,
|
||||||
@ -52,4 +53,33 @@ impl ElectrumClient {
|
|||||||
|
|
||||||
Ok(Arc::new(Update(update)))
|
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)))
|
||||||
|
}
|
||||||
}
|
}
|
@ -1077,7 +1077,12 @@ impl From<NewOrLoadError> for WalletCreationError {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod 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::CalculateFeeError;
|
||||||
use crate::OutPoint;
|
use crate::OutPoint;
|
||||||
use crate::SignerError;
|
use crate::SignerError;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user