From 06ea06f7d37a02d7d242d84eca89da3d85191c1b Mon Sep 17 00:00:00 2001 From: SomberNight Date: Mon, 1 Mar 2021 21:55:41 +0100 Subject: [PATCH] _calc_routing_hints_for_invoice: incl max 15 chans to avoid qr overflow Prioritise channels that are likely to be able to receive the payment. --- electrum/lnworker.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/electrum/lnworker.py b/electrum/lnworker.py index e9d4247aa..1f07fb378 100644 --- a/electrum/lnworker.py +++ b/electrum/lnworker.py @@ -1797,15 +1797,17 @@ class LNWallet(LNWorker): """calculate routing hints (BOLT-11 'r' field)""" routing_hints = [] channels = list(self.channels.values()) - random.shuffle(channels) # not sure this has any benefit but let's not leak channel order + # do minimal filtering of channels. + # we include channels that cannot *right now* receive (e.g. peer disconnected or balance insufficient) + channels = [chan for chan in channels + if (chan.is_open() and not chan.is_frozen_for_receiving())] + # cap max channels to include to keep QR code reasonably scannable + channels = sorted(channels, key=lambda chan: (not chan.is_active(), -chan.available_to_spend(REMOTE))) + channels = channels[:15] + random.shuffle(channels) # let's not leak channel order scid_to_my_channels = {chan.short_channel_id: chan for chan in channels if chan.short_channel_id is not None} - # note: currently we add *all* our channels; but this might be a privacy leak? for chan in channels: - # do minimal filtering of channels. - # we include channels that cannot *right now* receive (e.g. peer disconnected or balance insufficient) - if not (chan.is_open() and not chan.is_frozen_for_receiving()): - continue chan_id = chan.short_channel_id assert isinstance(chan_id, bytes), chan_id channel_info = get_mychannel_info(chan_id, scid_to_my_channels)