@@ -13,10 +13,10 @@ use crate::chain::bitcoind_rpc::{
1313} ;
1414use crate :: chain:: electrum:: ElectrumRuntimeClient ;
1515use 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} ;
2121use 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