Browse Source

qml: fix paying bip70 invoices

master
SomberNight 3 years ago
parent
commit
e14ed717a8
No known key found for this signature in database
GPG Key ID: B33B5F232C6271E9
  1. 22
      electrum/gui/qml/qeinvoice.py
  2. 8
      electrum/util.py

22
electrum/gui/qml/qeinvoice.py

@ -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

8
electrum/util.py

@ -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

Loading…
Cancel
Save