From ec8500bd553939b991bf2be4dd5f5e1af7c79fc0 Mon Sep 17 00:00:00 2001 From: Sander van Grieken Date: Wed, 1 Nov 2023 12:47:28 +0100 Subject: [PATCH] payment_identifier: if a bip21 uri contains a lightning invoice without fallback address, and an address is present in the bip21 uri path, register the on-chain address in the Invoice.outputs field to allow paying onchain from a saved Invoice later (when the PI is unavailable). Fixes #8654 --- electrum/invoices.py | 2 +- electrum/payment_identifier.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/electrum/invoices.py b/electrum/invoices.py index 39e2dad43..306dafcf1 100644 --- a/electrum/invoices.py +++ b/electrum/invoices.py @@ -304,7 +304,7 @@ class Invoice(BaseInvoice): def can_be_paid_onchain(self) -> bool: if self.is_lightning(): - return bool(self._lnaddr.get_fallback_address()) + return bool(self._lnaddr.get_fallback_address()) or (bool(self.outputs)) else: return True diff --git a/electrum/payment_identifier.py b/electrum/payment_identifier.py index 4d618b41c..ad7b9221a 100644 --- a/electrum/payment_identifier.py +++ b/electrum/payment_identifier.py @@ -257,6 +257,11 @@ class PaymentIdentifier(Logger): if bolt11: try: self.bolt11 = Invoice.from_bech32(bolt11) + # carry BIP21 onchain address in Invoice.outputs in case bolt11 doesn't contain a fallback + # address but the BIP21 URI has one. + if bip21_address := self.bip21.get('address'): + amount = self.bip21.get('amount', 0) + self.bolt11.outputs = [PartialTxOutput.from_address_and_value(bip21_address, amount)] except InvoiceError as e: self.logger.debug(self._get_error_from_invoiceerror(e)) self.set_state(PaymentIdentifierState.AVAILABLE)