From 191bdb154e99de616c2409fbfcab3ef5e2257262 Mon Sep 17 00:00:00 2001 From: +Sharon <+wanjiku.kahira@gmail.com> Date: Fri, 1 Aug 2025 03:59:10 +0300 Subject: [PATCH] feat(electrum): Add `populate_anchor_cache` method Also updates the `example_electrum` example and `populate_tx_cache` documentation to be consistent with `populate_anchor_cache`. --- crates/electrum/src/bdk_electrum_client.rs | 21 +++++++++++++++++++-- examples/example_electrum/src/main.rs | 17 +++++++---------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/crates/electrum/src/bdk_electrum_client.rs b/crates/electrum/src/bdk_electrum_client.rs index 5962a5ec7..d7a26b95e 100644 --- a/crates/electrum/src/bdk_electrum_client.rs +++ b/crates/electrum/src/bdk_electrum_client.rs @@ -7,6 +7,7 @@ use bdk_core::{ 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. @@ -37,8 +38,24 @@ impl BdkElectrumClient { } } - /// 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)>, + ) { + 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>>) { let mut tx_cache = self.tx_cache.lock().unwrap(); for tx in txs { diff --git a/examples/example_electrum/src/main.rs b/examples/example_electrum/src/main.rs index 01d11e78b..bc76776a6 100644 --- a/examples/example_electrum/src/main.rs +++ b/examples/example_electrum/src/main.rs @@ -126,16 +126,13 @@ fn main() -> anyhow::Result<()> { 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 {