@@ -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
@@ -215,6 +216,7 @@ const WALLET_KEYS_SEED_LEN: usize = 64;
215216/// | `default_cltv_expiry_delta` | 144 |
216217/// | `onchain_wallet_sync_interval_secs` | 60 |
217218/// | `wallet_sync_interval_secs` | 20 |
219+ /// | `fee_rate_cache_update_interval_secs` | 3600 |
218220/// | `log_level` | `Debug` |
219221///
220222pub struct Config {
@@ -234,6 +236,10 @@ pub struct Config {
234236 ///
235237 /// **Note:** A minimum of 10 seconds is always enforced.
236238 pub wallet_sync_interval_secs : u64 ,
239+ /// The time in-between background update attempts to our fee rate cache, in seconds.
240+ ///
241+ /// **Note:** A minimum of 10 seconds is always enforced.
242+ pub fee_rate_cache_update_interval_secs : u64 ,
237243 /// The level at which we log messages.
238244 ///
239245 /// Any messages below this level will be excluded from the logs.
@@ -249,6 +255,7 @@ impl Default for Config {
249255 default_cltv_expiry_delta : DEFAULT_CLTV_EXPIRY_DELTA ,
250256 onchain_wallet_sync_interval_secs : DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS ,
251257 wallet_sync_interval_secs : DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS ,
258+ fee_rate_cache_update_interval_secs : DEFAULT_FEE_RATE_CACHE_UPDATE_INTERVAL_SECS ,
252259 log_level : DEFAULT_LOG_LEVEL ,
253260 }
254261 }
@@ -782,12 +789,35 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
782789
783790 let runtime = tokio:: runtime:: Builder :: new_multi_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) ;
784791
792+ // Block to ensure we update our fee rate cache once on startup
793+ let wallet = Arc :: clone ( & self . wallet ) ;
794+ let sync_logger = Arc :: clone ( & self . logger ) ;
795+ runtime. block_on ( async move {
796+ let now = Instant :: now ( ) ;
797+ match wallet. update_fee_estimates ( ) . await {
798+ Ok ( ( ) ) => {
799+ log_info ! (
800+ sync_logger,
801+ "Initial fee rate cache update finished in {}ms." ,
802+ now. elapsed( ) . as_millis( )
803+ ) ;
804+ Ok ( ( ) )
805+ }
806+ Err ( e) => {
807+ log_error ! ( sync_logger, "Initial fee rate cache update failed: {}" , e, ) ;
808+ Err ( e)
809+ }
810+ }
811+ } ) ?;
812+
785813 // Setup wallet sync
786814 let wallet = Arc :: clone ( & self . wallet ) ;
787815 let sync_logger = Arc :: clone ( & self . logger ) ;
788816 let mut stop_sync = self . stop_receiver . clone ( ) ;
789817 let onchain_wallet_sync_interval_secs =
790818 self . config . onchain_wallet_sync_interval_secs . max ( 10 ) ;
819+ let fee_rate_cache_update_interval_secs =
820+ self . config . fee_rate_cache_update_interval_secs . max ( 10 ) ;
791821 std:: thread:: spawn ( move || {
792822 tokio:: runtime:: Builder :: new_current_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) . block_on (
793823 async move {
@@ -796,6 +826,11 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
796826 ) ;
797827 onchain_wallet_sync_interval
798828 . set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
829+ let mut fee_rate_update_interval = tokio:: time:: interval ( Duration :: from_secs (
830+ fee_rate_cache_update_interval_secs,
831+ ) ) ;
832+ // We just blocked on updating, so skip the first tick.
833+ fee_rate_update_interval. reset ( ) ;
799834 loop {
800835 let now = Instant :: now ( ) ;
801836 tokio:: select! {
@@ -818,6 +853,22 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
818853 }
819854 }
820855 }
856+ _ = fee_rate_update_interval. tick( ) => {
857+ match wallet. update_fee_estimates( ) . await {
858+ Ok ( ( ) ) => log_trace!(
859+ sync_logger,
860+ "Background update of fee rate cache finished in {}ms." ,
861+ now. elapsed( ) . as_millis( )
862+ ) ,
863+ Err ( err) => {
864+ log_error!(
865+ sync_logger,
866+ "Background update of fee rate cache failed: {}" ,
867+ err
868+ )
869+ }
870+ }
871+ }
821872 }
822873 }
823874 } ,
0 commit comments