twallet: log when saving already paid invoice - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit a041a0c0755159a7dfe0fd9ca6f30fe50545c8ff DIR parent 34612c671e0c37418c0aab02dbeb90402b195193 HTML Author: SomberNight <somber.night@protonmail.com> Date: Tue, 21 Jan 2020 16:50:45 +0100 wallet: log when saving already paid invoice (maybe it should not be allowed?) Diffstat: M electrum/wallet.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) --- DIR diff --git a/electrum/wallet.py b/electrum/wallet.py t@@ -614,6 +614,8 @@ class Abstract_Wallet(AddressSynchronizer, ABC): if invoice_type == PR_TYPE_LN: key = invoice['rhash'] elif invoice_type == PR_TYPE_ONCHAIN: + if self.is_onchain_invoice_paid(invoice): + self.logger.info("saving invoice... but it is already paid!") key = bh2u(sha256(repr(invoice))[0:16]) invoice['id'] = key outputs = invoice['outputs'] # type: List[PartialTxOutput] t@@ -643,7 +645,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): item = copy.copy(self.invoices[key]) request_type = item.get('type') if request_type == PR_TYPE_ONCHAIN: - item['status'] = PR_PAID if self._is_onchain_invoice_paid(item)[0] else PR_UNPAID + item['status'] = PR_PAID if self.is_onchain_invoice_paid(item) else PR_UNPAID elif self.lnworker and request_type == PR_TYPE_LN: item['status'] = self.lnworker.get_payment_status(bfh(item['rhash'])) else: t@@ -666,7 +668,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): for txout in outputs: self._invoices_from_scriptpubkey_map[txout.scriptpubkey].add(invoice_key) - def _is_onchain_invoice_paid(self, invoice) -> Tuple[bool, Sequence[str]]: + def _is_onchain_invoice_paid(self, invoice: dict) -> Tuple[bool, Sequence[str]]: """Returns whether on-chain invoice is satisfied, and list of relevant TXIDs.""" assert invoice.get('type') == PR_TYPE_ONCHAIN invoice_amounts = defaultdict(int) # type: Dict[bytes, int] # scriptpubkey -> value_sats t@@ -687,6 +689,9 @@ class Abstract_Wallet(AddressSynchronizer, ABC): return False, [] return True, relevant_txs + def is_onchain_invoice_paid(self, invoice: dict) -> bool: + return self._is_onchain_invoice_paid(invoice)[0] + def _maybe_set_tx_label_based_on_invoices(self, tx: Transaction) -> bool: tx_hash = tx.txid() with self.transaction_lock: