tlnpeer: handle cooperative close edge-case - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit ea3e3ddbb8280f499bf2535d2a8a63dd174e2e44 DIR parent 261ad804cad9c8a4f9dbc6595727a35cadc0204e HTML Author: SomberNight <somber.night@protonmail.com> Date: Sun, 13 Sep 2020 16:55:37 +0200 lnpeer: handle cooperative close edge-case fix #6317 Diffstat: M electrum/address_synchronizer.py | 10 +--------- M electrum/gui/qt/main_window.py | 4 ++-- M electrum/lnpeer.py | 8 ++++++-- M electrum/util.py | 9 +++++++++ 4 files changed, 18 insertions(+), 13 deletions(-) --- DIR diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py t@@ -30,7 +30,7 @@ from typing import TYPE_CHECKING, Dict, Optional, Set, Tuple, NamedTuple, Sequen from . import bitcoin, util from .bitcoin import COINBASE_MATURITY -from .util import profiler, bfh, TxMinedInfo +from .util import profiler, bfh, TxMinedInfo, UnrelatedTransactionException from .transaction import Transaction, TxOutput, TxInput, PartialTxInput, TxOutpoint, PartialTransaction from .synchronizer import Synchronizer from .verifier import SPV t@@ -48,14 +48,6 @@ TX_HEIGHT_LOCAL = -2 TX_HEIGHT_UNCONF_PARENT = -1 TX_HEIGHT_UNCONFIRMED = 0 -class AddTransactionException(Exception): - pass - - -class UnrelatedTransactionException(AddTransactionException): - def __str__(self): - return _("Transaction is unrelated to this wallet.") - class HistoryItem(NamedTuple): txid: str DIR diff --git a/electrum/gui/qt/main_window.py b/electrum/gui/qt/main_window.py t@@ -60,12 +60,12 @@ from electrum.util import (format_time, UserFacingException, get_new_wallet_name, send_exception_to_crash_reporter, InvalidBitcoinURI, maybe_extract_bolt11_invoice, NotEnoughFunds, - NoDynamicFeeEstimates, MultipleSpendMaxTxOutputs) + NoDynamicFeeEstimates, MultipleSpendMaxTxOutputs, + AddTransactionException) from electrum.invoices import PR_TYPE_ONCHAIN, PR_TYPE_LN, PR_DEFAULT_EXPIRATION_WHEN_CREATING, Invoice from electrum.invoices import PR_PAID, PR_FAILED, pr_expiration_values, LNInvoice, OnchainInvoice from electrum.transaction import (Transaction, PartialTxInput, PartialTransaction, PartialTxOutput) -from electrum.address_synchronizer import AddTransactionException from electrum.wallet import (Multisig_Wallet, CannotBumpFee, Abstract_Wallet, sweep_preparations, InternalAddressCorruption) from electrum.version import ELECTRUM_VERSION DIR diff --git a/electrum/lnpeer.py b/electrum/lnpeer.py t@@ -23,7 +23,8 @@ from . import bitcoin, util from . import ecc from .ecc import sig_string_from_r_and_s, get_r_and_s_from_sig_string, der_sig_from_sig_string from . import constants -from .util import bh2u, bfh, log_exceptions, ignore_exceptions, chunks, SilentTaskGroup +from .util import (bh2u, bfh, log_exceptions, ignore_exceptions, chunks, SilentTaskGroup, + UnrelatedTransactionException) from . import transaction from .transaction import Transaction, TxOutput, PartialTxOutput, match_script_against_template from .logging import Logger t@@ -1518,7 +1519,10 @@ class Peer(Logger): signing_pubkey=chan.config[REMOTE].multisig_key.pubkey.hex(), sig=bh2u(der_sig_from_sig_string(their_sig) + b'\x01')) # save local transaction and set state - self.lnworker.wallet.add_transaction(closing_tx) + try: + self.lnworker.wallet.add_transaction(closing_tx) + except UnrelatedTransactionException: + pass # this can happen if (~all the balance goes to REMOTE) chan.set_state(ChannelState.CLOSING) # broadcast await self.network.try_broadcasting(closing_tx, 'closing') DIR diff --git a/electrum/util.py b/electrum/util.py t@@ -119,6 +119,15 @@ class InvalidPassword(Exception): return _("Incorrect password") +class AddTransactionException(Exception): + pass + + +class UnrelatedTransactionException(AddTransactionException): + def __str__(self): + return _("Transaction is unrelated to this wallet.") + + class FileImportFailed(Exception): def __init__(self, message=''): self.message = str(message)