wallet: factor out "what key to use for invoice"
fix: qt request list was not using the correct key
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user