Skip to content

Commit 848e605

Browse files
committed
fee_policy: instead of checking has_data, handle "eta_to_fee() is None"
1 parent 92bdf70 commit 848e605

File tree

2 files changed

+18
-14
lines changed

2 files changed

+18
-14
lines changed

electrum/fee_policy.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -224,12 +224,12 @@ def fee_per_kb(self, network: 'Network') -> Optional[int]:
224224
if self.method == FeeMethod.FEERATE:
225225
fee_rate = self.value
226226
elif self.method == FeeMethod.MEMPOOL:
227-
if network and network.mempool_fees.has_data():
227+
if network:
228228
fee_rate = network.mempool_fees.depth_to_fee(self.get_slider_pos())
229229
else:
230230
fee_rate = None
231231
elif self.method == FeeMethod.ETA:
232-
if network and network.fee_estimates.has_data():
232+
if network:
233233
fee_rate = network.fee_estimates.eta_to_fee(self.get_slider_pos())
234234
else:
235235
fee_rate = None
@@ -372,8 +372,13 @@ def __init__(self):
372372
def get_data(self):
373373
return self.data
374374

375-
def has_data(self):
376-
# we do not request estimate for next block fee
375+
def has_data(self) -> bool:
376+
"""Returns if we have estimates for *all* targets requested.
377+
Note: if wanting an estimate for a specific target, instead of checking has_data(),
378+
just try to do the estimate and handle a potential None result. That way,
379+
estimation works for targets we have, even if some targets are missing.
380+
"""
381+
# we do not request estimate for next block fee, hence -1
377382
return len(self.data) == len(FEE_ETA_TARGETS) - 1
378383

379384
def set_data(self, nblock_target: int, fee_per_kb: int):

electrum/lnworker.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3072,28 +3072,27 @@ async def reestablish_peers_and_channels(self):
30723072
await self.taskgroup.spawn(self.reestablish_peer_for_given_channel(chan))
30733073

30743074
def current_target_feerate_per_kw(self, *, has_anchors: bool) -> Optional[int]:
3075-
if self.network.fee_estimates.has_data():
3076-
target: int = FEE_LN_MINIMUM_ETA_TARGET if has_anchors else FEE_LN_ETA_TARGET
3077-
feerate_per_kvbyte = self.network.fee_estimates.eta_target_to_fee(target)
3078-
if has_anchors:
3079-
# set a floor of 5 sat/vb to have some safety margin in case the mempool
3080-
# grows quickly
3081-
feerate_per_kvbyte = max(feerate_per_kvbyte, 5000)
3082-
else:
3075+
target: int = FEE_LN_MINIMUM_ETA_TARGET if has_anchors else FEE_LN_ETA_TARGET
3076+
feerate_per_kvbyte = self.network.fee_estimates.eta_target_to_fee(target)
3077+
if feerate_per_kvbyte is None:
30833078
if constants.net is constants.BitcoinRegtest:
30843079
feerate_per_kvbyte = FEERATE_REGTEST_STATIC_FEE
30853080
else:
30863081
return None
3082+
if has_anchors:
3083+
# set a floor of 5 sat/vb to have some safety margin in case the mempool
3084+
# grows quickly
3085+
feerate_per_kvbyte = max(feerate_per_kvbyte, 5000)
30873086
return max(FEERATE_PER_KW_MIN_RELAY_LIGHTNING, feerate_per_kvbyte // 4)
30883087

30893088
def current_low_feerate_per_kw_srk_channel(self) -> Optional[int]:
30903089
"""Gets low feerate for static remote key channels."""
30913090
if constants.net is constants.BitcoinRegtest:
30923091
feerate_per_kvbyte = 0
30933092
else:
3094-
if not self.network.fee_estimates.has_data():
3093+
feerate_per_kvbyte = self.network.fee_estimates.eta_target_to_fee(FEE_LN_LOW_ETA_TARGET)
3094+
if feerate_per_kvbyte is None:
30953095
return None
3096-
feerate_per_kvbyte = self.network.fee_estimates.eta_target_to_fee(FEE_LN_LOW_ETA_TARGET) or 0
30973096
low_feerate_per_kw = max(FEERATE_PER_KW_MIN_RELAY_LIGHTNING, feerate_per_kvbyte // 4)
30983097
# make sure this is never higher than the target feerate:
30993098
current_target_feerate = self.current_target_feerate_per_kw(has_anchors=False)

0 commit comments

Comments
 (0)