@@ -174,6 +174,7 @@ const DEFAULT_LISTENING_ADDR: &str = "0.0.0.0:9735";
174174const DEFAULT_CLTV_EXPIRY_DELTA : u32 = 144 ;
175175const DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS : u64 = 60 ;
176176const DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS : u64 = 20 ;
177+ const DEFAULT_FEE_RATE_CACHE_UPDATE_INTERVAL_SECS : u64 = 60 * 10 ;
177178const DEFAULT_LOG_LEVEL : LogLevel = LogLevel :: Debug ;
178179
179180// The 'stop gap' parameter used by BDK's wallet sync. This seems to configure the threshold
@@ -217,6 +218,7 @@ const WALLET_KEYS_SEED_LEN: usize = 64;
217218/// | `default_cltv_expiry_delta` | 144 |
218219/// | `onchain_wallet_sync_interval_secs` | 60 |
219220/// | `wallet_sync_interval_secs` | 20 |
221+ /// | `fee_rate_cache_update_interval_secs` | 600 |
220222/// | `log_level` | `Debug` |
221223///
222224pub struct Config {
@@ -236,6 +238,10 @@ pub struct Config {
236238 ///
237239 /// **Note:** A minimum of 10 seconds is always enforced.
238240 pub wallet_sync_interval_secs : u64 ,
241+ /// The time in-between background update attempts to our fee rate cache, in seconds.
242+ ///
243+ /// **Note:** A minimum of 10 seconds is always enforced.
244+ pub fee_rate_cache_update_interval_secs : u64 ,
239245 /// The level at which we log messages.
240246 ///
241247 /// Any messages below this level will be excluded from the logs.
@@ -251,6 +257,7 @@ impl Default for Config {
251257 default_cltv_expiry_delta : DEFAULT_CLTV_EXPIRY_DELTA ,
252258 onchain_wallet_sync_interval_secs : DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS ,
253259 wallet_sync_interval_secs : DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS ,
260+ fee_rate_cache_update_interval_secs : DEFAULT_FEE_RATE_CACHE_UPDATE_INTERVAL_SECS ,
254261 log_level : DEFAULT_LOG_LEVEL ,
255262 }
256263 }
@@ -784,12 +791,35 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
784791
785792 let runtime = tokio:: runtime:: Builder :: new_multi_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) ;
786793
794+ // Block to ensure we update our fee rate cache once on startup
795+ let wallet = Arc :: clone ( & self . wallet ) ;
796+ let sync_logger = Arc :: clone ( & self . logger ) ;
797+ runtime. block_on ( async move {
798+ let now = Instant :: now ( ) ;
799+ match wallet. update_fee_estimates ( ) . await {
800+ Ok ( ( ) ) => {
801+ log_info ! (
802+ sync_logger,
803+ "Initial fee rate cache update finished in {}ms." ,
804+ now. elapsed( ) . as_millis( )
805+ ) ;
806+ Ok ( ( ) )
807+ }
808+ Err ( e) => {
809+ log_error ! ( sync_logger, "Initial fee rate cache update failed: {}" , e, ) ;
810+ Err ( e)
811+ }
812+ }
813+ } ) ?;
814+
787815 // Setup wallet sync
788816 let wallet = Arc :: clone ( & self . wallet ) ;
789817 let sync_logger = Arc :: clone ( & self . logger ) ;
790818 let mut stop_sync = self . stop_receiver . clone ( ) ;
791819 let onchain_wallet_sync_interval_secs =
792820 self . config . onchain_wallet_sync_interval_secs . max ( WALLET_SYNC_INTERVAL_MINIMUM_SECS ) ;
821+ let fee_rate_cache_update_interval_secs =
822+ self . config . fee_rate_cache_update_interval_secs . max ( WALLET_SYNC_INTERVAL_MINIMUM_SECS ) ;
793823 std:: thread:: spawn ( move || {
794824 tokio:: runtime:: Builder :: new_current_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) . block_on (
795825 async move {
@@ -798,6 +828,11 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
798828 ) ;
799829 onchain_wallet_sync_interval
800830 . set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
831+ let mut fee_rate_update_interval = tokio:: time:: interval ( Duration :: from_secs (
832+ fee_rate_cache_update_interval_secs,
833+ ) ) ;
834+ // We just blocked on updating, so skip the first tick.
835+ fee_rate_update_interval. reset ( ) ;
801836 loop {
802837 tokio:: select! {
803838 _ = stop_sync. changed( ) => {
@@ -820,6 +855,23 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
820855 }
821856 }
822857 }
858+ _ = fee_rate_update_interval. tick( ) => {
859+ let now = Instant :: now( ) ;
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+ }
823875 }
824876 }
825877 } ,
0 commit comments