Qt pay_lightning_invoice: handle NoDynamicFeeEstimates
`wallet.make_unsigned_transaction` can raise NotEnoughFunds or NoDynamicFeeEstimates. These are "expected" exceptions that need to be handled or worked around. Added a note of this in the docstring now. We now handle NoDynamicFeeEstimates by allowing a static fallback fee in `wallet.can_pay_onchain` and `lnworker.suggest_funding_amount`. It should be fine to have a static fallback in these cases, as the user still has a chance to set their own fee later in the flow. (though ofc the static fallback might be too high in some mempool conditions, in which case e.g. can_pay_onchain might return a false-negative, but this is still an improvement over raising I believe) fixes https://github.com/spesmilo/electrum/issues/5784
This commit is contained in:
@@ -686,7 +686,7 @@ class SendTab(QWidget, MessageBoxMixin, Logger):
|
|||||||
choices[3] = msg
|
choices[3] = msg
|
||||||
msg = _('You cannot pay that invoice using Lightning.')
|
msg = _('You cannot pay that invoice using Lightning.')
|
||||||
if self.wallet.lnworker.channels:
|
if self.wallet.lnworker.channels:
|
||||||
msg += '\n' + _('Your channels can send {}.').format(self.format_amount(num_sats_can_send) + self.base_unit())
|
msg += '\n' + _('Your channels can send {}.').format(self.format_amount(num_sats_can_send) + ' ' + self.base_unit())
|
||||||
if not choices:
|
if not choices:
|
||||||
self.window.show_error(msg)
|
self.window.show_error(msg)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -1097,15 +1097,16 @@ class LNWallet(LNWorker):
|
|||||||
min_funding_sat = max(min_funding_sat, 100_000) # at least 1mBTC
|
min_funding_sat = max(min_funding_sat, 100_000) # at least 1mBTC
|
||||||
if min_funding_sat > LN_MAX_FUNDING_SAT:
|
if min_funding_sat > LN_MAX_FUNDING_SAT:
|
||||||
return
|
return
|
||||||
|
fee_est = partial(self.config.estimate_fee, allow_fallback_to_static_rates=True) # to avoid NoDynamicFeeEstimates
|
||||||
try:
|
try:
|
||||||
self.mktx_for_open_channel(coins=coins, funding_sat=min_funding_sat, node_id=bytes(32), fee_est=None)
|
self.mktx_for_open_channel(coins=coins, funding_sat=min_funding_sat, node_id=bytes(32), fee_est=fee_est)
|
||||||
funding_sat = min_funding_sat
|
funding_sat = min_funding_sat
|
||||||
except NotEnoughFunds:
|
except NotEnoughFunds:
|
||||||
return
|
return
|
||||||
# if available, suggest twice that amount:
|
# if available, suggest twice that amount:
|
||||||
if 2 * min_funding_sat <= LN_MAX_FUNDING_SAT:
|
if 2 * min_funding_sat <= LN_MAX_FUNDING_SAT:
|
||||||
try:
|
try:
|
||||||
self.mktx_for_open_channel(coins=coins, funding_sat=2*min_funding_sat, node_id=bytes(32), fee_est=None)
|
self.mktx_for_open_channel(coins=coins, funding_sat=2*min_funding_sat, node_id=bytes(32), fee_est=fee_est)
|
||||||
funding_sat = 2 * min_funding_sat
|
funding_sat = 2 * min_funding_sat
|
||||||
except NotEnoughFunds:
|
except NotEnoughFunds:
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -1548,11 +1548,12 @@ class Abstract_Wallet(ABC, Logger, EventListener):
|
|||||||
return selected_addr
|
return selected_addr
|
||||||
|
|
||||||
def can_pay_onchain(self, outputs, coins=None):
|
def can_pay_onchain(self, outputs, coins=None):
|
||||||
|
fee = partial(self.config.estimate_fee, allow_fallback_to_static_rates=True) # to avoid NoDynamicFeeEstimates
|
||||||
try:
|
try:
|
||||||
self.make_unsigned_transaction(
|
self.make_unsigned_transaction(
|
||||||
coins=coins,
|
coins=coins,
|
||||||
outputs=outputs,
|
outputs=outputs,
|
||||||
fee=None)
|
fee=fee)
|
||||||
except NotEnoughFunds:
|
except NotEnoughFunds:
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
@@ -1565,6 +1566,7 @@ class Abstract_Wallet(ABC, Logger, EventListener):
|
|||||||
change_addr: str = None,
|
change_addr: str = None,
|
||||||
is_sweep=False,
|
is_sweep=False,
|
||||||
rbf=False) -> PartialTransaction:
|
rbf=False) -> PartialTransaction:
|
||||||
|
"""Can raise NotEnoughFunds or NoDynamicFeeEstimates."""
|
||||||
|
|
||||||
if not coins: # any bitcoin tx must have at least 1 input by consensus
|
if not coins: # any bitcoin tx must have at least 1 input by consensus
|
||||||
raise NotEnoughFunds()
|
raise NotEnoughFunds()
|
||||||
|
|||||||
Reference in New Issue
Block a user