@@ -175,6 +175,7 @@ const DEFAULT_LISTENING_ADDR: &str = "0.0.0.0:9735";
175
175
const DEFAULT_CLTV_EXPIRY_DELTA : u32 = 144 ;
176
176
const DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS : u64 = 60 ;
177
177
const DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS : u64 = 20 ;
178
+ const DEFAULT_FEE_RATE_CACHE_UPDATE_INTERVAL_SECS : u64 = 60 * 60 ;
178
179
const DEFAULT_LOG_LEVEL : LogLevel = LogLevel :: Debug ;
179
180
180
181
// 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;
218
219
/// | `default_cltv_expiry_delta` | 144 |
219
220
/// | `onchain_wallet_sync_interval_secs` | 60 |
220
221
/// | `wallet_sync_interval_secs` | 20 |
222
+ /// | `fee_rate_cache_update_interval_secs` | 3600 |
221
223
/// | `log_level` | `Debug` |
222
224
///
223
225
pub struct Config {
@@ -237,6 +239,10 @@ pub struct Config {
237
239
///
238
240
/// **Note:** A minimum of 10 seconds is always enforced.
239
241
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 ,
240
246
/// The level at which we log messages.
241
247
///
242
248
/// Any messages below this level will be excluded from the logs.
@@ -252,6 +258,7 @@ impl Default for Config {
252
258
default_cltv_expiry_delta : DEFAULT_CLTV_EXPIRY_DELTA ,
253
259
onchain_wallet_sync_interval_secs : DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS ,
254
260
wallet_sync_interval_secs : DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS ,
261
+ fee_rate_cache_update_interval_secs : DEFAULT_FEE_RATE_CACHE_UPDATE_INTERVAL_SECS ,
255
262
log_level : DEFAULT_LOG_LEVEL ,
256
263
}
257
264
}
@@ -785,12 +792,35 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
785
792
786
793
let runtime = tokio:: runtime:: Builder :: new_multi_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) ;
787
794
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
+
788
816
// Setup wallet sync
789
817
let wallet = Arc :: clone ( & self . wallet ) ;
790
818
let sync_logger = Arc :: clone ( & self . logger ) ;
791
819
let mut stop_sync = self . stop_receiver . clone ( ) ;
792
820
let onchain_wallet_sync_interval_secs =
793
821
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 ) ;
794
824
std:: thread:: spawn ( move || {
795
825
tokio:: runtime:: Builder :: new_current_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) . block_on (
796
826
async move {
@@ -799,6 +829,11 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
799
829
) ;
800
830
onchain_wallet_sync_interval
801
831
. 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 ( ) ;
802
837
loop {
803
838
let now = Instant :: now ( ) ;
804
839
tokio:: select! {
@@ -821,6 +856,22 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
821
856
}
822
857
}
823
858
}
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
+ }
824
875
}
825
876
}
826
877
} ,
0 commit comments