Browse Source

wallet: factor out "what key to use for invoice"

fix: qt request list was not using the correct key
patch-4
SomberNight 4 years ago
parent
commit
897f90d6e8
No known key found for this signature in database GPG Key ID: B33B5F232C6271E9
  1. 8
      electrum/gui/kivy/uix/screens.py
  2. 3
      electrum/gui/qt/invoice_list.py
  3. 11
      electrum/gui/qt/request_list.py
  4. 46
      electrum/wallet.py

8
electrum/gui/kivy/uix/screens.py

@ -237,10 +237,10 @@ class SendScreen(CScreen, Logger):
status = self.app.wallet.get_invoice_status(item)
status_str = item.get_status_str(status)
is_lightning = item.type == PR_TYPE_LN
key = self.app.wallet.get_key_for_outgoing_invoice(item)
if is_lightning:
assert isinstance(item, LNInvoice)
key = item.rhash
address = key
address = item.rhash
if self.app.wallet.lnworker:
log = self.app.wallet.lnworker.logs.get(key)
if status == PR_INFLIGHT and log:
@ -248,7 +248,6 @@ class SendScreen(CScreen, Logger):
is_bip70 = False
else:
assert isinstance(item, OnchainInvoice)
key = item.id
address = item.get_address()
is_bip70 = bool(item.bip70)
return {
@ -467,11 +466,10 @@ class ReceiveScreen(CScreen):
if not is_lightning:
assert isinstance(req, OnchainInvoice)
address = req.get_address()
key = address
else:
assert isinstance(req, LNInvoice)
key = req.rhash
address = req.invoice
key = self.app.wallet.get_key_for_receive_request(req)
amount = req.get_amount_sat()
description = req.message
status = self.app.wallet.get_request_status(key)

3
electrum/gui/qt/invoice_list.py

@ -99,11 +99,10 @@ class InvoiceList(MyTreeView):
self.std_model.clear()
self.update_headers(self.__class__.headers)
for idx, item in enumerate(self.parent.wallet.get_unpaid_invoices()):
key = self.parent.wallet.get_key_for_outgoing_invoice(item)
if item.is_lightning():
key = item.rhash
icon_name = 'lightning.png'
else:
key = item.id
icon_name = 'bitcoin.png'
if item.bip70:
icon_name = 'seal.png'

11
electrum/gui/qt/request_list.py

@ -148,12 +148,7 @@ class RequestList(MyTreeView):
self.std_model.clear()
self.update_headers(self.__class__.headers)
for req in self.wallet.get_unpaid_requests():
if req.is_lightning():
assert isinstance(req, LNInvoice)
key = req.rhash
else:
assert isinstance(req, OnchainInvoice)
key = req.id
key = self.wallet.get_key_for_receive_request(req)
status = self.parent.wallet.get_request_status(key)
status_str = req.get_status_str(status)
request_type = req.type
@ -164,13 +159,9 @@ class RequestList(MyTreeView):
amount_str = self.parent.format_amount(amount) if amount else ""
labels = [date, message, amount_str, status_str]
if req.is_lightning():
assert isinstance(req, LNInvoice)
key = req.rhash
icon = read_QIcon("lightning.png")
tooltip = 'lightning request'
else:
assert isinstance(req, OnchainInvoice)
key = req.get_address()
icon = read_QIcon("bitcoin.png")
tooltip = 'onchain request'
items = [QStandardItem(e) for e in labels]

46
electrum/wallet.py

@ -766,20 +766,14 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
return invoice
def save_invoice(self, invoice: Invoice) -> None:
invoice_type = invoice.type
if invoice_type == PR_TYPE_LN:
assert isinstance(invoice, LNInvoice)
key = invoice.rhash
elif invoice_type == PR_TYPE_ONCHAIN:
key = self.get_key_for_outgoing_invoice(invoice)
if not invoice.is_lightning():
assert isinstance(invoice, OnchainInvoice)
key = invoice.id
if self.is_onchain_invoice_paid(invoice, 0):
self.logger.info("saving invoice... but it is already paid!")
with self.transaction_lock:
for txout in invoice.outputs:
self._invoices_from_scriptpubkey_map[txout.scriptpubkey].add(key)
else:
raise Exception('Unsupported invoice type')
self.invoices[key] = invoice
self.save_db()
@ -2073,12 +2067,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
return self.export_request(x)
def export_request(self, x: Invoice) -> Dict[str, Any]:
if x.is_lightning():
assert isinstance(x, LNInvoice)
key = x.rhash
else:
assert isinstance(x, OnchainInvoice)
key = x.get_address()
key = self.get_key_for_receive_request(x)
status = self.get_request_status(key)
status_str = x.get_status_str(status)
is_lightning = x.is_lightning()
@ -2188,21 +2177,38 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
req['sig'] = bh2u(pr.signature)
self.receive_requests[key] = req
def add_payment_request(self, req: Invoice):
@classmethod
def get_key_for_outgoing_invoice(cls, invoice: Invoice) -> str:
"""Return the key to use for this invoice in self.invoices."""
if invoice.is_lightning():
assert isinstance(invoice, LNInvoice)
key = invoice.rhash
else:
assert isinstance(invoice, OnchainInvoice)
key = invoice.id
return key
def get_key_for_receive_request(self, req: Invoice, *, sanity_checks: bool = False) -> str:
"""Return the key to use for this invoice in self.receive_requests."""
if not req.is_lightning():
assert isinstance(req, OnchainInvoice)
addr = req.get_address()
if not bitcoin.is_address(addr):
raise Exception(_('Invalid Bitcoin address.'))
if not self.is_mine(addr):
raise Exception(_('Address not in wallet.'))
if sanity_checks:
if not bitcoin.is_address(addr):
raise Exception(_('Invalid Bitcoin address.'))
if not self.is_mine(addr):
raise Exception(_('Address not in wallet.'))
key = addr
else:
assert isinstance(req, LNInvoice)
key = req.rhash
return key
def add_payment_request(self, req: Invoice):
key = self.get_key_for_receive_request(req, sanity_checks=True)
message = req.message
self.receive_requests[key] = req
self.set_label(key, message) # should be a default label
self.set_label(key, message) # should be a default label
return req
def delete_request(self, key):

Loading…
Cancel
Save