@@ -174,6 +174,7 @@ const DEFAULT_LISTENING_ADDR: &str = "0.0.0.0:9735";
174
174
const DEFAULT_CLTV_EXPIRY_DELTA : u32 = 144 ;
175
175
const DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS : u64 = 60 ;
176
176
const DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS : u64 = 20 ;
177
+ const DEFAULT_FEE_RATE_CACHE_UPDATE_INTERVAL_SECS : u64 = 60 * 60 ;
177
178
const DEFAULT_LOG_LEVEL : LogLevel = LogLevel :: Debug ;
178
179
179
180
// 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;
217
218
/// | `default_cltv_expiry_delta` | 144 |
218
219
/// | `onchain_wallet_sync_interval_secs` | 60 |
219
220
/// | `wallet_sync_interval_secs` | 20 |
221
+ /// | `fee_rate_cache_update_interval_secs` | 3600 |
220
222
/// | `log_level` | `Debug` |
221
223
///
222
224
pub struct Config {
@@ -236,6 +238,10 @@ pub struct Config {
236
238
///
237
239
/// **Note:** A minimum of 10 seconds is always enforced.
238
240
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 ,
239
245
/// The level at which we log messages.
240
246
///
241
247
/// Any messages below this level will be excluded from the logs.
@@ -251,6 +257,7 @@ impl Default for Config {
251
257
default_cltv_expiry_delta : DEFAULT_CLTV_EXPIRY_DELTA ,
252
258
onchain_wallet_sync_interval_secs : DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS ,
253
259
wallet_sync_interval_secs : DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS ,
260
+ fee_rate_cache_update_interval_secs : DEFAULT_FEE_RATE_CACHE_UPDATE_INTERVAL_SECS ,
254
261
log_level : DEFAULT_LOG_LEVEL ,
255
262
}
256
263
}
@@ -784,12 +791,35 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
784
791
785
792
let runtime = tokio:: runtime:: Builder :: new_multi_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) ;
786
793
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
+
787
815
// Setup wallet sync
788
816
let wallet = Arc :: clone ( & self . wallet ) ;
789
817
let sync_logger = Arc :: clone ( & self . logger ) ;
790
818
let mut stop_sync = self . stop_receiver . clone ( ) ;
791
819
let onchain_wallet_sync_interval_secs =
792
820
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 ) ;
793
823
std:: thread:: spawn ( move || {
794
824
tokio:: runtime:: Builder :: new_current_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) . block_on (
795
825
async move {
@@ -798,6 +828,11 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
798
828
) ;
799
829
onchain_wallet_sync_interval
800
830
. 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 ( ) ;
801
836
loop {
802
837
let now = Instant :: now ( ) ;
803
838
tokio:: select! {
@@ -820,6 +855,22 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
820
855
}
821
856
}
822
857
}
858
+ _ = fee_rate_update_interval. tick( ) => {
859
+ match wallet. update_fee_estimates( ) . await {
860
+ Ok ( ( ) ) => log_trace!(
861
+ sync_logger,
862
+ "Background update of fee rate cache finished in {}ms." ,
863
+ now. elapsed( ) . as_millis( )
864
+ ) ,
865
+ Err ( err) => {
866
+ log_error!(
867
+ sync_logger,
868
+ "Background update of fee rate cache failed: {}" ,
869
+ err
870
+ )
871
+ }
872
+ }
873
+ }
823
874
}
824
875
}
825
876
} ,
0 commit comments