@@ -175,6 +175,7 @@ const DEFAULT_LISTENING_ADDR: &str = "0.0.0.0:9735";
175175const DEFAULT_CLTV_EXPIRY_DELTA : u32 = 144 ;
176176const DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS : u64 = 60 ;
177177const DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS : u64 = 20 ;
178+ const DEFAULT_FEE_RATE_CACHE_UPDATE_INTERVAL_SECS : u64 = 60 * 60 ;
178179const DEFAULT_LOG_LEVEL : LogLevel = LogLevel :: Debug ;
179180
180181// The 'stop gap' parameter used by BDK's wallet sync. This seems to configure the threshold
@@ -218,6 +219,7 @@ const WALLET_KEYS_SEED_LEN: usize = 64;
218219/// | `default_cltv_expiry_delta` | 144 |
219220/// | `onchain_wallet_sync_interval_secs` | 60 |
220221/// | `wallet_sync_interval_secs` | 20 |
222+ /// | `fee_rate_cache_update_interval_secs` | 3600 |
221223/// | `log_level` | `Debug` |
222224///
223225pub struct Config {
@@ -237,6 +239,10 @@ pub struct Config {
237239 ///
238240 /// **Note:** A minimum of 10 seconds is always enforced.
239241 pub wallet_sync_interval_secs : u64 ,
242+ /// The time in-between background update attempts to our fee rate cache, in seconds.
243+ ///
244+ /// **Note:** A minimum of 10 seconds is always enforced.
245+ pub fee_rate_cache_update_interval_secs : u64 ,
240246 /// The level at which we log messages.
241247 ///
242248 /// Any messages below this level will be excluded from the logs.
@@ -252,6 +258,7 @@ impl Default for Config {
252258 default_cltv_expiry_delta : DEFAULT_CLTV_EXPIRY_DELTA ,
253259 onchain_wallet_sync_interval_secs : DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS ,
254260 wallet_sync_interval_secs : DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS ,
261+ fee_rate_cache_update_interval_secs : DEFAULT_FEE_RATE_CACHE_UPDATE_INTERVAL_SECS ,
255262 log_level : DEFAULT_LOG_LEVEL ,
256263 }
257264 }
@@ -785,12 +792,35 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
785792
786793 let runtime = tokio:: runtime:: Builder :: new_multi_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) ;
787794
795+ // Block to ensure we update our fee rate cache once on startup
796+ let wallet = Arc :: clone ( & self . wallet ) ;
797+ let sync_logger = Arc :: clone ( & self . logger ) ;
798+ runtime. block_on ( async move {
799+ let now = Instant :: now ( ) ;
800+ match wallet. update_fee_estimates ( ) . await {
801+ Ok ( ( ) ) => {
802+ log_info ! (
803+ sync_logger,
804+ "Initial fee rate cache update finished in {}ms." ,
805+ now. elapsed( ) . as_millis( )
806+ ) ;
807+ Ok ( ( ) )
808+ }
809+ Err ( e) => {
810+ log_error ! ( sync_logger, "Initial fee rate cache update failed: {}" , e, ) ;
811+ Err ( e)
812+ }
813+ }
814+ } ) ?;
815+
788816 // Setup wallet sync
789817 let wallet = Arc :: clone ( & self . wallet ) ;
790818 let sync_logger = Arc :: clone ( & self . logger ) ;
791819 let mut stop_sync = self . stop_receiver . clone ( ) ;
792820 let onchain_wallet_sync_interval_secs =
793821 self . config . onchain_wallet_sync_interval_secs . max ( WALLET_SYNC_INTERVAL_MINIMUM_SECS ) ;
822+ let fee_rate_cache_update_interval_secs =
823+ self . config . fee_rate_cache_update_interval_secs . max ( WALLET_SYNC_INTERVAL_MINIMUM_SECS ) ;
794824 std:: thread:: spawn ( move || {
795825 tokio:: runtime:: Builder :: new_current_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) . block_on (
796826 async move {
@@ -799,6 +829,11 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
799829 ) ;
800830 onchain_wallet_sync_interval
801831 . set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
832+ let mut fee_rate_update_interval = tokio:: time:: interval ( Duration :: from_secs (
833+ fee_rate_cache_update_interval_secs,
834+ ) ) ;
835+ // We just blocked on updating, so skip the first tick.
836+ fee_rate_update_interval. reset ( ) ;
802837 loop {
803838 let now = Instant :: now ( ) ;
804839 tokio:: select! {
@@ -821,6 +856,22 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
821856 }
822857 }
823858 }
859+ _ = fee_rate_update_interval. tick( ) => {
860+ match wallet. update_fee_estimates( ) . await {
861+ Ok ( ( ) ) => log_trace!(
862+ sync_logger,
863+ "Background update of fee rate cache finished in {}ms." ,
864+ now. elapsed( ) . as_millis( )
865+ ) ,
866+ Err ( err) => {
867+ log_error!(
868+ sync_logger,
869+ "Background update of fee rate cache failed: {}" ,
870+ err
871+ )
872+ }
873+ }
874+ }
824875 }
825876 }
826877 } ,
0 commit comments