From aad4fd6d483cc7fe5ad61246fa73a1e7390cc15d Mon Sep 17 00:00:00 2001 From: ThomasV Date: Sun, 15 Oct 2023 10:58:31 +0200 Subject: [PATCH] Fix sending of 'channel_ready': - send only once - in channel_reestablish, do not send it if we are not funded. - lnworker: do not send channel_ready before channel_reestablish --- electrum/lnpeer.py | 12 +++++++----- electrum/lnworker.py | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/electrum/lnpeer.py b/electrum/lnpeer.py index 88e1f9e4d..2d84fdcc1 100644 --- a/electrum/lnpeer.py +++ b/electrum/lnpeer.py @@ -1273,11 +1273,10 @@ class Peer(Logger): resend_revoke_and_ack() chan.peer_state = PeerState.GOOD - chan_just_became_ready = False - if chan.is_funded() and their_next_local_ctn == next_local_ctn == 1: - chan_just_became_ready = True - if chan_just_became_ready or self.features.supports(LnFeatures.OPTION_SCID_ALIAS_OPT): - self.send_channel_ready(chan) + if chan.is_funded(): + chan_just_became_ready = (their_next_local_ctn == next_local_ctn == 1) + if chan_just_became_ready or self.features.supports(LnFeatures.OPTION_SCID_ALIAS_OPT): + self.send_channel_ready(chan) # checks done util.trigger_callback('channel', self.lnworker.wallet, chan) # if we have sent a previous shutdown, it must be retransmitted (Bolt2) @@ -1285,6 +1284,9 @@ class Peer(Logger): await self.send_shutdown(chan) def send_channel_ready(self, chan: Channel): + assert chan.is_funded() + if chan.sent_channel_ready: + return channel_id = chan.channel_id per_commitment_secret_index = RevocationStore.START_INDEX - 1 second_per_commitment_point = secret_to_pubkey(int.from_bytes( diff --git a/electrum/lnworker.py b/electrum/lnworker.py index dc074536f..ede719d2c 100644 --- a/electrum/lnworker.py +++ b/electrum/lnworker.py @@ -1199,7 +1199,7 @@ class LNWallet(LNWorker): elif chan.get_state() == ChannelState.FUNDED: peer = self._peers.get(chan.node_id) - if peer and peer.is_initialized(): + if peer and peer.is_initialized() and chan.peer_state == PeerState.GOOD: peer.send_channel_ready(chan) elif chan.get_state() == ChannelState.OPEN: