BlockId, CheckPoint, ConfirmationBlockTime, TxUpdate,
};
use electrum_client::{ElectrumApi, Error, HeaderNotification};
+use std::convert::TryInto;
use std::sync::{Arc, Mutex};
/// We include a chain suffix of a certain length for the purpose of robustness.
}
}
- /// Inserts transactions into the transaction cache so that the client will not fetch these
- /// transactions.
+ /// Insert anchors into the anchor cache so that the client will not re-fetch them.
+ ///
+ /// Typically used to pre-populate the cache from an existing `TxGraph`.
+ pub fn populate_anchor_cache(
+ &self,
+ tx_anchors: impl IntoIterator<Item = (Txid, impl IntoIterator<Item = ConfirmationBlockTime>)>,
+ ) {
+ let mut cache = self.anchor_cache.lock().unwrap();
+ for (txid, anchors) in tx_anchors {
+ for anchor in anchors {
+ cache.insert((txid, anchor.block_id.hash), anchor);
+ }
+ }
+ }
+
+ /// Insert transactions into the transaction cache so that the client will not re-fetch them.
+ ///
+ /// Typically used to pre-populate the cache from an existing `TxGraph`.
pub fn populate_tx_cache(&self, txs: impl IntoIterator<Item = impl Into<Arc<Transaction>>>) {
let mut tx_cache = self.tx_cache.lock().unwrap();
for tx in txs {
let client = BdkElectrumClient::new(electrum_cmd.electrum_args().client(network)?);
- // Tell the electrum client about the txs we've already got locally so it doesn't re-download
- // them
- client.populate_tx_cache(
- graph
- .lock()
- .unwrap()
- .graph()
- .full_txs()
- .map(|tx_node| tx_node.tx),
- );
+ // Tell the electrum client about the txs and anchors we've already got locally so it doesn't
+ // re-download .them
+ {
+ let graph = graph.lock().unwrap();
+ client.populate_tx_cache(graph.graph().full_txs().map(|tx_node| tx_node.tx));
+ client.populate_anchor_cache(graph.graph().all_anchors().clone());
+ }
let (chain_update, tx_update, keychain_update) = match electrum_cmd.clone() {
ElectrumCommands::Scan {