diff --git a/electrum/fee_policy.py b/electrum/fee_policy.py index 6c5e53962..078ce5b48 100644 --- a/electrum/fee_policy.py +++ b/electrum/fee_policy.py @@ -224,12 +224,12 @@ class FeePolicy(Logger): if self.method == FeeMethod.FEERATE: fee_rate = self.value elif self.method == FeeMethod.MEMPOOL: - if network and network.mempool_fees.has_data(): + if network: fee_rate = network.mempool_fees.depth_to_fee(self.get_slider_pos()) else: fee_rate = None elif self.method == FeeMethod.ETA: - if network and network.fee_estimates.has_data(): + if network: fee_rate = network.fee_estimates.eta_to_fee(self.get_slider_pos()) else: fee_rate = None @@ -372,8 +372,13 @@ class FeeTimeEstimates: def get_data(self): return self.data - def has_data(self): - # we do not request estimate for next block fee + def has_data(self) -> bool: + """Returns if we have estimates for *all* targets requested. + Note: if wanting an estimate for a specific target, instead of checking has_data(), + just try to do the estimate and handle a potential None result. That way, + estimation works for targets we have, even if some targets are missing. + """ + # we do not request estimate for next block fee, hence -1 return len(self.data) == len(FEE_ETA_TARGETS) - 1 def set_data(self, nblock_target: int, fee_per_kb: int): diff --git a/electrum/lnworker.py b/electrum/lnworker.py index e732cd29c..862d9d5a7 100644 --- a/electrum/lnworker.py +++ b/electrum/lnworker.py @@ -3072,18 +3072,17 @@ class LNWallet(LNWorker): await self.taskgroup.spawn(self.reestablish_peer_for_given_channel(chan)) def current_target_feerate_per_kw(self, *, has_anchors: bool) -> Optional[int]: - if self.network.fee_estimates.has_data(): - target: int = FEE_LN_MINIMUM_ETA_TARGET if has_anchors else FEE_LN_ETA_TARGET - feerate_per_kvbyte = self.network.fee_estimates.eta_target_to_fee(target) - if has_anchors: - # set a floor of 5 sat/vb to have some safety margin in case the mempool - # grows quickly - feerate_per_kvbyte = max(feerate_per_kvbyte, 5000) - else: + target: int = FEE_LN_MINIMUM_ETA_TARGET if has_anchors else FEE_LN_ETA_TARGET + feerate_per_kvbyte = self.network.fee_estimates.eta_target_to_fee(target) + if feerate_per_kvbyte is None: if constants.net is constants.BitcoinRegtest: feerate_per_kvbyte = FEERATE_REGTEST_STATIC_FEE else: return None + if has_anchors: + # set a floor of 5 sat/vb to have some safety margin in case the mempool + # grows quickly + feerate_per_kvbyte = max(feerate_per_kvbyte, 5000) return max(FEERATE_PER_KW_MIN_RELAY_LIGHTNING, feerate_per_kvbyte // 4) def current_low_feerate_per_kw_srk_channel(self) -> Optional[int]: @@ -3091,9 +3090,9 @@ class LNWallet(LNWorker): if constants.net is constants.BitcoinRegtest: feerate_per_kvbyte = 0 else: - if not self.network.fee_estimates.has_data(): + feerate_per_kvbyte = self.network.fee_estimates.eta_target_to_fee(FEE_LN_LOW_ETA_TARGET) + if feerate_per_kvbyte is None: return None - feerate_per_kvbyte = self.network.fee_estimates.eta_target_to_fee(FEE_LN_LOW_ETA_TARGET) or 0 low_feerate_per_kw = max(FEERATE_PER_KW_MIN_RELAY_LIGHTNING, feerate_per_kvbyte // 4) # make sure this is never higher than the target feerate: current_target_feerate = self.current_target_feerate_per_kw(has_anchors=False)