diff --git a/electrum/gui/qt/invoice_list.py b/electrum/gui/qt/invoice_list.py index cd5d59bbf..785a73f9d 100644 --- a/electrum/gui/qt/invoice_list.py +++ b/electrum/gui/qt/invoice_list.py @@ -179,7 +179,10 @@ class InvoiceList(MyTreeView): copy_menu.addAction(_("Address"), lambda: self.main_window.do_copy(invoice.get_address(), title='Bitcoin Address')) status = wallet.get_invoice_status(invoice) if status == PR_UNPAID: - menu.addAction(_("Pay") + "...", lambda: self.send_tab.do_pay_invoice(invoice)) + if bool(invoice.get_amount_sat()): + menu.addAction(_("Pay") + "...", lambda: self.send_tab.do_pay_invoice(invoice)) + else: + menu.addAction(_("Edit amount") + "...", lambda: self.send_tab.do_edit_invoice(invoice)) if status == PR_FAILED: menu.addAction(_("Retry"), lambda: self.send_tab.do_pay_invoice(invoice)) if self.wallet.lnworker: diff --git a/electrum/gui/qt/paytoedit.py b/electrum/gui/qt/paytoedit.py index c0796f4f3..4b60598ee 100644 --- a/electrum/gui/qt/paytoedit.py +++ b/electrum/gui/qt/paytoedit.py @@ -364,9 +364,7 @@ class PayToEdit(Logger, GenericInputHandler): if is_max: amount = '!' else: - amount = self.amount_edit.get_amount() - if amount is None: - return [] + amount = self.amount_edit.get_amount() or 0 self.outputs = [PartialTxOutput(scriptpubkey=self.payto_scriptpubkey, value=amount)] return self.outputs[:] diff --git a/electrum/gui/qt/send_tab.py b/electrum/gui/qt/send_tab.py index 9146e0aed..6b42168ae 100644 --- a/electrum/gui/qt/send_tab.py +++ b/electrum/gui/qt/send_tab.py @@ -500,9 +500,6 @@ class SendTab(QWidget, MessageBoxMixin, Logger): amount_sat = self.amount_e.get_amount() if amount_sat: invoice.amount_msat = int(amount_sat * 1000) - else: - self.show_error(_('No amount')) - return if not self.wallet.has_lightning() and not invoice.can_be_paid_onchain(): self.show_error(_('Lightning is disabled')) return @@ -582,7 +579,16 @@ class SendTab(QWidget, MessageBoxMixin, Logger): outputs += invoice.outputs self.pay_onchain_dialog(outputs) + def do_edit_invoice(self, invoice: 'Invoice'): + assert not bool(invoice.get_amount_sat()) + text = invoice.lightning_invoice if invoice.is_lightning() else invoice.get_address() + self.payto_e._on_input_btn(text) + self.amount_e.setFocus() + def do_pay_invoice(self, invoice: 'Invoice'): + if not bool(invoice.get_amount_sat()): + self.show_error(_('No amount')) + return if invoice.is_lightning(): self.pay_lightning_invoice(invoice) else: diff --git a/electrum/invoices.py b/electrum/invoices.py index 7aa2e0488..aa1d06f23 100644 --- a/electrum/invoices.py +++ b/electrum/invoices.py @@ -161,7 +161,8 @@ class BaseInvoice(StoredObject): Returns an integer satoshi amount, or '!' or None. Callers who need msat precision should call get_amount_msat() """ - amount_msat = self.amount_msat + # return strictly positive value or None + amount_msat = self.amount_msat or None if amount_msat in [None, "!"]: return amount_msat return int(amount_msat // 1000)