@@ -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
@@ -215,6 +216,7 @@ const WALLET_KEYS_SEED_LEN: usize = 64;
215
216
/// | `default_cltv_expiry_delta` | 144 |
216
217
/// | `onchain_wallet_sync_interval_secs` | 60 |
217
218
/// | `wallet_sync_interval_secs` | 20 |
219
+ /// | `fee_rate_cache_update_interval_secs` | 3600 |
218
220
/// | `log_level` | `Debug` |
219
221
///
220
222
pub struct Config {
@@ -234,6 +236,10 @@ pub struct Config {
234
236
///
235
237
/// **Note:** A minimum of 10 seconds is always enforced.
236
238
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 ,
237
243
/// The level at which we log messages.
238
244
///
239
245
/// Any messages below this level will be excluded from the logs.
@@ -249,6 +255,7 @@ impl Default for Config {
249
255
default_cltv_expiry_delta : DEFAULT_CLTV_EXPIRY_DELTA ,
250
256
onchain_wallet_sync_interval_secs : DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS ,
251
257
wallet_sync_interval_secs : DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS ,
258
+ fee_rate_cache_update_interval_secs : DEFAULT_FEE_RATE_CACHE_UPDATE_INTERVAL_SECS ,
252
259
log_level : DEFAULT_LOG_LEVEL ,
253
260
}
254
261
}
@@ -782,12 +789,35 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
782
789
783
790
let runtime = tokio:: runtime:: Builder :: new_multi_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) ;
784
791
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
+
785
813
// Setup wallet sync
786
814
let wallet = Arc :: clone ( & self . wallet ) ;
787
815
let sync_logger = Arc :: clone ( & self . logger ) ;
788
816
let mut stop_sync = self . stop_receiver . clone ( ) ;
789
817
let onchain_wallet_sync_interval_secs =
790
818
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 ) ;
791
821
std:: thread:: spawn ( move || {
792
822
tokio:: runtime:: Builder :: new_current_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) . block_on (
793
823
async move {
@@ -796,6 +826,11 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
796
826
) ;
797
827
onchain_wallet_sync_interval
798
828
. 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 ( ) ;
799
834
loop {
800
835
let now = Instant :: now ( ) ;
801
836
tokio:: select! {
@@ -818,6 +853,22 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
818
853
}
819
854
}
820
855
}
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
+ }
821
872
}
822
873
}
823
874
} ,
0 commit comments