From 2a7b5081c911a4679d3fa34469aea786a20d1c61 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Fri, 14 Feb 2020 13:25:04 +0100 Subject: [PATCH] channel states: make sure that closing_txid is saved if channel is closed --- electrum/lnchannel.py | 6 +++++- electrum/lnworker.py | 11 +++++++---- electrum/wallet.py | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/electrum/lnchannel.py b/electrum/lnchannel.py index dbed0411b..12f6cc4fb 100644 --- a/electrum/lnchannel.py +++ b/electrum/lnchannel.py @@ -218,8 +218,12 @@ class Channel(Logger): def get_state(self): return self._state + def is_closing(self): + return self.get_state() in [channel_states.CLOSING, channel_states.FORCE_CLOSING] + def is_closed(self): - return self.get_state() > channel_states.OPEN + # the closing txid has been saved + return self.get_state() >= channel_states.CLOSED def _check_can_pay(self, amount_msat: int) -> None: # TODO check if this method uses correct ctns (should use "latest" + 1) diff --git a/electrum/lnworker.py b/electrum/lnworker.py index 29093cc78..adb90893f 100644 --- a/electrum/lnworker.py +++ b/electrum/lnworker.py @@ -562,6 +562,7 @@ class LNWallet(LNWorker): out.append(item) if not chan.is_closed(): continue + assert closing_txid item = { 'channel_id': bh2u(chan.channel_id), 'txid': closing_txid, @@ -657,6 +658,10 @@ class LNWallet(LNWorker): if not chan: return + # return early to prevent overwriting closing_txid with None + if chan.is_closed(): + return + # save timestamp regardless of state, so that funding tx is returned in get_history self.channel_timestamps[bh2u(chan.channel_id)] = chan.funding_outpoint.txid, funding_height.height, funding_height.timestamp, None, None, None @@ -701,14 +706,12 @@ class LNWallet(LNWorker): if not chan: return - # fixme: this is wasteful - self.channel_timestamps[bh2u(chan.channel_id)] = funding_txid, funding_height.height, funding_height.timestamp, closing_txid, closing_height.height, closing_height.timestamp - # remove from channel_db if chan.short_channel_id is not None: self.channel_db.remove_channel(chan.short_channel_id) if chan.get_state() < channel_states.CLOSED: + self.channel_timestamps[bh2u(chan.channel_id)] = funding_txid, funding_height.height, funding_height.timestamp, closing_txid, closing_height.height, closing_height.timestamp chan.set_state(channel_states.CLOSED) if chan.get_state() == channel_states.CLOSED and not keep_watching: @@ -1309,7 +1312,7 @@ class LNWallet(LNWorker): with self.lock: channels = list(self.channels.values()) for chan in channels: - if chan.is_closed(): + if chan.is_closed() or chan.is_closing(): continue if constants.net is not constants.BitcoinRegtest: chan_feerate = chan.get_latest_feerate(LOCAL) diff --git a/electrum/wallet.py b/electrum/wallet.py index fbed86eec..6543e5498 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -729,7 +729,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): tx_item['lightning'] = True tx_item['ln_value'] = Satoshis(ln_value) tx_item['txpos'] = i # for sorting - key = tx_item['payment_hash'] if 'payment_hash' in tx_item else tx_item['type'] + tx_item['channel_id'] + key = tx_item.get('txid') or tx_item['payment_hash'] transactions[key] = tx_item now = time.time() balance = 0