Skip to content

Commit 6ead9be

Browse files
committed
Implement continuously_sync_wallets for ChainSource::Electrum
1 parent 70014d6 commit 6ead9be

File tree

1 file changed

+94
-61
lines changed

1 file changed

+94
-61
lines changed

src/chain/mod.rs

Lines changed: 94 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ use crate::chain::bitcoind_rpc::{
1313
};
1414
use crate::chain::electrum::ElectrumRuntimeClient;
1515
use crate::config::{
16-
Config, ElectrumSyncConfig, EsploraSyncConfig, BDK_CLIENT_CONCURRENCY, BDK_CLIENT_STOP_GAP,
17-
BDK_WALLET_SYNC_TIMEOUT_SECS, FEE_RATE_CACHE_UPDATE_TIMEOUT_SECS, LDK_WALLET_SYNC_TIMEOUT_SECS,
18-
RESOLVED_CHANNEL_MONITOR_ARCHIVAL_INTERVAL, TX_BROADCAST_TIMEOUT_SECS,
19-
WALLET_SYNC_INTERVAL_MINIMUM_SECS,
16+
BackgroundSyncConfig, Config, ElectrumSyncConfig, EsploraSyncConfig, BDK_CLIENT_CONCURRENCY,
17+
BDK_CLIENT_STOP_GAP, BDK_WALLET_SYNC_TIMEOUT_SECS, FEE_RATE_CACHE_UPDATE_TIMEOUT_SECS,
18+
LDK_WALLET_SYNC_TIMEOUT_SECS, RESOLVED_CHANNEL_MONITOR_ARCHIVAL_INTERVAL,
19+
TX_BROADCAST_TIMEOUT_SECS, WALLET_SYNC_INTERVAL_MINIMUM_SECS,
2020
};
2121
use crate::fee_estimator::{
2222
apply_post_estimation_adjustments, get_all_conf_targets, get_num_block_defaults_for_target,
@@ -346,71 +346,45 @@ impl ChainSource {
346346
) {
347347
match self {
348348
Self::Esplora { sync_config, logger, .. } => {
349-
// Setup syncing intervals if enabled
350-
if let Some(background_sync_config) = sync_config.background_sync_config {
351-
let onchain_wallet_sync_interval_secs = background_sync_config
352-
.onchain_wallet_sync_interval_secs
353-
.max(WALLET_SYNC_INTERVAL_MINIMUM_SECS);
354-
let mut onchain_wallet_sync_interval = tokio::time::interval(
355-
Duration::from_secs(onchain_wallet_sync_interval_secs),
356-
);
357-
onchain_wallet_sync_interval
358-
.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip);
359-
360-
let fee_rate_cache_update_interval_secs = background_sync_config
361-
.fee_rate_cache_update_interval_secs
362-
.max(WALLET_SYNC_INTERVAL_MINIMUM_SECS);
363-
let mut fee_rate_update_interval = tokio::time::interval(Duration::from_secs(
364-
fee_rate_cache_update_interval_secs,
365-
));
366-
// When starting up, we just blocked on updating, so skip the first tick.
367-
fee_rate_update_interval.reset();
368-
fee_rate_update_interval
369-
.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip);
370-
371-
let lightning_wallet_sync_interval_secs = background_sync_config
372-
.lightning_wallet_sync_interval_secs
373-
.max(WALLET_SYNC_INTERVAL_MINIMUM_SECS);
374-
let mut lightning_wallet_sync_interval = tokio::time::interval(
375-
Duration::from_secs(lightning_wallet_sync_interval_secs),
349+
if let Some(background_sync_config) = sync_config.background_sync_config.as_ref() {
350+
self.start_tx_based_sync_loop(
351+
stop_sync_receiver,
352+
channel_manager,
353+
chain_monitor,
354+
output_sweeper,
355+
background_sync_config,
356+
Arc::clone(&logger),
357+
)
358+
.await
359+
} else {
360+
// Background syncing is disabled
361+
log_info!(
362+
logger,
363+
"Background syncing is disabled. Manual syncing required for onchain wallet, lightning wallet, and fee rate updates.",
376364
);
377-
lightning_wallet_sync_interval
378-
.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip);
379-
380-
// Start the syncing loop.
381-
loop {
382-
tokio::select! {
383-
_ = stop_sync_receiver.changed() => {
384-
log_trace!(
385-
logger,
386-
"Stopping background syncing on-chain wallet.",
387-
);
388-
return;
389-
}
390-
_ = onchain_wallet_sync_interval.tick() => {
391-
let _ = self.sync_onchain_wallet().await;
392-
}
393-
_ = fee_rate_update_interval.tick() => {
394-
let _ = self.update_fee_rate_estimates().await;
395-
}
396-
_ = lightning_wallet_sync_interval.tick() => {
397-
let _ = self.sync_lightning_wallet(
398-
Arc::clone(&channel_manager),
399-
Arc::clone(&chain_monitor),
400-
Arc::clone(&output_sweeper),
401-
).await;
402-
}
403-
}
404-
}
365+
return;
366+
}
367+
},
368+
Self::Electrum { sync_config, logger, .. } => {
369+
if let Some(background_sync_config) = sync_config.background_sync_config.as_ref() {
370+
self.start_tx_based_sync_loop(
371+
stop_sync_receiver,
372+
channel_manager,
373+
chain_monitor,
374+
output_sweeper,
375+
background_sync_config,
376+
Arc::clone(&logger),
377+
)
378+
.await
405379
} else {
406380
// Background syncing is disabled
407381
log_info!(
408-
logger, "Background syncing disabled. Manual syncing required for onchain wallet, lightning wallet, and fee rate updates.",
382+
logger,
383+
"Background syncing is disabled. Manual syncing required for onchain wallet, lightning wallet, and fee rate updates.",
409384
);
410385
return;
411386
}
412387
},
413-
Self::Electrum { .. } => todo!(),
414388
Self::BitcoindRpc {
415389
bitcoind_rpc_client,
416390
header_cache,
@@ -561,6 +535,65 @@ impl ChainSource {
561535
}
562536
}
563537

538+
async fn start_tx_based_sync_loop(
539+
&self, mut stop_sync_receiver: tokio::sync::watch::Receiver<()>,
540+
channel_manager: Arc<ChannelManager>, chain_monitor: Arc<ChainMonitor>,
541+
output_sweeper: Arc<Sweeper>, background_sync_config: &BackgroundSyncConfig,
542+
logger: Arc<Logger>,
543+
) {
544+
// Setup syncing intervals
545+
let onchain_wallet_sync_interval_secs = background_sync_config
546+
.onchain_wallet_sync_interval_secs
547+
.max(WALLET_SYNC_INTERVAL_MINIMUM_SECS);
548+
let mut onchain_wallet_sync_interval =
549+
tokio::time::interval(Duration::from_secs(onchain_wallet_sync_interval_secs));
550+
onchain_wallet_sync_interval
551+
.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip);
552+
553+
let fee_rate_cache_update_interval_secs = background_sync_config
554+
.fee_rate_cache_update_interval_secs
555+
.max(WALLET_SYNC_INTERVAL_MINIMUM_SECS);
556+
let mut fee_rate_update_interval =
557+
tokio::time::interval(Duration::from_secs(fee_rate_cache_update_interval_secs));
558+
// When starting up, we just blocked on updating, so skip the first tick.
559+
fee_rate_update_interval.reset();
560+
fee_rate_update_interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip);
561+
562+
let lightning_wallet_sync_interval_secs = background_sync_config
563+
.lightning_wallet_sync_interval_secs
564+
.max(WALLET_SYNC_INTERVAL_MINIMUM_SECS);
565+
let mut lightning_wallet_sync_interval =
566+
tokio::time::interval(Duration::from_secs(lightning_wallet_sync_interval_secs));
567+
lightning_wallet_sync_interval
568+
.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip);
569+
570+
// Start the syncing loop.
571+
loop {
572+
tokio::select! {
573+
_ = stop_sync_receiver.changed() => {
574+
log_trace!(
575+
logger,
576+
"Stopping background syncing on-chain wallet.",
577+
);
578+
return;
579+
}
580+
_ = onchain_wallet_sync_interval.tick() => {
581+
let _ = self.sync_onchain_wallet().await;
582+
}
583+
_ = fee_rate_update_interval.tick() => {
584+
let _ = self.update_fee_rate_estimates().await;
585+
}
586+
_ = lightning_wallet_sync_interval.tick() => {
587+
let _ = self.sync_lightning_wallet(
588+
Arc::clone(&channel_manager),
589+
Arc::clone(&chain_monitor),
590+
Arc::clone(&output_sweeper),
591+
).await;
592+
}
593+
}
594+
}
595+
}
596+
564597
// Synchronize the onchain wallet via transaction-based protocols (i.e., Esplora, Electrum,
565598
// etc.)
566599
pub(crate) async fn sync_onchain_wallet(&self) -> Result<(), Error> {

0 commit comments

Comments
 (0)