qml: fix paying bip70 invoices
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import threading
|
import threading
|
||||||
|
from typing import TYPE_CHECKING
|
||||||
import asyncio
|
import asyncio
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
@@ -17,11 +18,13 @@ from electrum.util import (parse_URI, InvalidBitcoinURI, InvoiceError,
|
|||||||
maybe_extract_lightning_payment_identifier)
|
maybe_extract_lightning_payment_identifier)
|
||||||
from electrum.lnurl import decode_lnurl, request_lnurl, callback_lnurl
|
from electrum.lnurl import decode_lnurl, request_lnurl, callback_lnurl
|
||||||
from electrum.bitcoin import COIN
|
from electrum.bitcoin import COIN
|
||||||
|
from electrum.paymentrequest import PaymentRequest
|
||||||
|
|
||||||
from .qetypes import QEAmount
|
from .qetypes import QEAmount
|
||||||
from .qewallet import QEWallet
|
from .qewallet import QEWallet
|
||||||
from .util import status_update_timer_interval
|
from .util import status_update_timer_interval
|
||||||
|
|
||||||
|
|
||||||
class QEInvoice(QObject):
|
class QEInvoice(QObject):
|
||||||
class Type:
|
class Type:
|
||||||
Invalid = -1
|
Invalid = -1
|
||||||
@@ -131,6 +134,8 @@ class QEInvoiceParser(QEInvoice):
|
|||||||
lnurlRetrieved = pyqtSignal()
|
lnurlRetrieved = pyqtSignal()
|
||||||
lnurlError = pyqtSignal([str,str], arguments=['code', 'message'])
|
lnurlError = pyqtSignal([str,str], arguments=['code', 'message'])
|
||||||
|
|
||||||
|
_bip70PrResolvedSignal = pyqtSignal([PaymentRequest], arguments=['request'])
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
|
|
||||||
@@ -144,6 +149,8 @@ class QEInvoiceParser(QEInvoice):
|
|||||||
self._timer.setSingleShot(True)
|
self._timer.setSingleShot(True)
|
||||||
self._timer.timeout.connect(self.updateStatusString)
|
self._timer.timeout.connect(self.updateStatusString)
|
||||||
|
|
||||||
|
self._bip70PrResolvedSignal.connect(self._bip70_payment_request_resolved)
|
||||||
|
|
||||||
self.clear()
|
self.clear()
|
||||||
|
|
||||||
@pyqtProperty(int, notify=invoiceChanged)
|
@pyqtProperty(int, notify=invoiceChanged)
|
||||||
@@ -364,6 +371,13 @@ class QEInvoiceParser(QEInvoice):
|
|||||||
URI=uri
|
URI=uri
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _bip70_payment_request_resolved(self, request: 'PaymentRequest'):
|
||||||
|
self._logger.debug('resolved payment request')
|
||||||
|
outputs = request.get_outputs()
|
||||||
|
invoice = self.create_onchain_invoice(outputs, None, request, None)
|
||||||
|
self.setValidOnchainInvoice(invoice)
|
||||||
|
self.validationSuccess.emit()
|
||||||
|
|
||||||
def validateRecipient(self, recipient):
|
def validateRecipient(self, recipient):
|
||||||
if not recipient:
|
if not recipient:
|
||||||
self.setInvoiceType(QEInvoice.Type.Invalid)
|
self.setInvoiceType(QEInvoice.Type.Invalid)
|
||||||
@@ -371,14 +385,8 @@ class QEInvoiceParser(QEInvoice):
|
|||||||
|
|
||||||
maybe_lightning_invoice = recipient
|
maybe_lightning_invoice = recipient
|
||||||
|
|
||||||
def _payment_request_resolved(request):
|
|
||||||
self._logger.debug('resolved payment request')
|
|
||||||
outputs = request.get_outputs()
|
|
||||||
invoice = self.create_onchain_invoice(outputs, None, request, None)
|
|
||||||
self.setValidOnchainInvoice(invoice)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self._bip21 = parse_URI(recipient, _payment_request_resolved)
|
self._bip21 = parse_URI(recipient, lambda pr: self._bip70PrResolvedSignal.emit(pr))
|
||||||
if self._bip21:
|
if self._bip21:
|
||||||
if 'r' in self._bip21 or ('name' in self._bip21 and 'sig' in self._bip21): # TODO set flag in util?
|
if 'r' in self._bip21 or ('name' in self._bip21 and 'sig' in self._bip21): # TODO set flag in util?
|
||||||
# let callback handle state
|
# let callback handle state
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ if TYPE_CHECKING:
|
|||||||
from .network import Network
|
from .network import Network
|
||||||
from .interface import Interface
|
from .interface import Interface
|
||||||
from .simple_config import SimpleConfig
|
from .simple_config import SimpleConfig
|
||||||
|
from .paymentrequest import PaymentRequest
|
||||||
|
|
||||||
|
|
||||||
_logger = get_logger(__name__)
|
_logger = get_logger(__name__)
|
||||||
@@ -966,7 +967,12 @@ class InvalidBitcoinURI(Exception): pass
|
|||||||
|
|
||||||
|
|
||||||
# TODO rename to parse_bip21_uri or similar
|
# TODO rename to parse_bip21_uri or similar
|
||||||
def parse_URI(uri: str, on_pr: Callable = None, *, loop=None) -> dict:
|
def parse_URI(
|
||||||
|
uri: str,
|
||||||
|
on_pr: Callable[['PaymentRequest'], None] = None,
|
||||||
|
*,
|
||||||
|
loop: asyncio.AbstractEventLoop = None,
|
||||||
|
) -> dict:
|
||||||
"""Raises InvalidBitcoinURI on malformed URI."""
|
"""Raises InvalidBitcoinURI on malformed URI."""
|
||||||
from . import bitcoin
|
from . import bitcoin
|
||||||
from .bitcoin import COIN, TOTAL_COIN_SUPPLY_LIMIT_IN_BTC
|
from .bitcoin import COIN, TOTAL_COIN_SUPPLY_LIMIT_IN_BTC
|
||||||
|
|||||||
Reference in New Issue
Block a user