diff --git a/electrum/lnworker.py b/electrum/lnworker.py index 9d9a33cf3..c0260a839 100644 --- a/electrum/lnworker.py +++ b/electrum/lnworker.py @@ -1242,28 +1242,8 @@ class LNWallet(LNWorker): self.logger.info(f'could not decode channel_update for failed htlc: {channel_update_as_received.hex()}') blacklist = True else: - r = self.channel_db.add_channel_update(payload) - short_channel_id = ShortChannelID(payload['short_channel_id']) - if r == UpdateStatus.GOOD: - self.logger.info(f"applied channel update to {short_channel_id}") - # TODO: test this - for chan in self.channels.values(): - if chan.short_channel_id == short_channel_id: - chan.set_remote_update(payload['raw']) - update = True - elif r == UpdateStatus.ORPHANED: - # maybe it is a private channel (and data in invoice was outdated) - self.logger.info(f"Could not find {short_channel_id}. maybe update is for private channel?") - start_node_id = route[sender_idx].node_id - update = self.channel_db.add_channel_update_for_private_channel(payload, start_node_id) - blacklist = not update - elif r == UpdateStatus.EXPIRED: - blacklist = True - elif r == UpdateStatus.DEPRECATED: - self.logger.info(f'channel update is not more recent.') - blacklist = True - elif r == UpdateStatus.UNCHANGED: - blacklist = True + blacklist, update = self._handle_chanupd_from_failed_htlc( + payload, route=route, sender_idx=sender_idx) else: blacklist = True @@ -1286,6 +1266,33 @@ class LNWallet(LNWorker): if not (blacklist or update): raise PaymentFailure(failure_msg.code_name()) + def _handle_chanupd_from_failed_htlc(self, payload, *, route, sender_idx) -> Tuple[bool, bool]: + blacklist = False + update = False + r = self.channel_db.add_channel_update(payload) + short_channel_id = ShortChannelID(payload['short_channel_id']) + if r == UpdateStatus.GOOD: + self.logger.info(f"applied channel update to {short_channel_id}") + # TODO: test this + for chan in self.channels.values(): + if chan.short_channel_id == short_channel_id: + chan.set_remote_update(payload['raw']) + update = True + elif r == UpdateStatus.ORPHANED: + # maybe it is a private channel (and data in invoice was outdated) + self.logger.info(f"Could not find {short_channel_id}. maybe update is for private channel?") + start_node_id = route[sender_idx].node_id + update = self.channel_db.add_channel_update_for_private_channel(payload, start_node_id) + blacklist = not update + elif r == UpdateStatus.EXPIRED: + blacklist = True + elif r == UpdateStatus.DEPRECATED: + self.logger.info(f'channel update is not more recent.') + blacklist = True + elif r == UpdateStatus.UNCHANGED: + blacklist = True + return blacklist, update + @classmethod def _decode_channel_update_msg(cls, chan_upd_msg: bytes) -> Optional[Dict[str, Any]]: channel_update_as_received = chan_upd_msg