diff --git a/electrum/lnaddr.py b/electrum/lnaddr.py index decc5be6a..e37fc7f27 100644 --- a/electrum/lnaddr.py +++ b/electrum/lnaddr.py @@ -8,6 +8,7 @@ from binascii import hexlify from decimal import Decimal from typing import Optional +import random import bitstring from .bitcoin import hash160_to_b58_address, b58_address_to_hash160 @@ -282,6 +283,16 @@ class LnAddr(object): return None return self.amount * COIN + def get_routing_info(self, tag): + # note: tag will be 't' for trampoline + r_tags = list(filter(lambda x: x[0] == tag, self.tags)) + # strip the tag type, it's implicitly 'r' now + r_tags = list(map(lambda x: x[1], r_tags)) + # if there are multiple hints, we will use the first one that works, + # from a random permutation + random.shuffle(r_tags) + return r_tags + def get_amount_msat(self) -> Optional[int]: if self.amount is None: return None diff --git a/electrum/lnworker.py b/electrum/lnworker.py index 8c42bd0f7..667de1ed5 100644 --- a/electrum/lnworker.py +++ b/electrum/lnworker.py @@ -1144,15 +1144,8 @@ class LNWallet(LNWorker): # TODO: return multiples routes if we know that a single one will not work # initially, try with less htlcs invoice_pubkey = decoded_invoice.pubkey.serialize() - # use 'r' field from invoice + r_tags = decoded_invoice.get_routing_info('r') route = None # type: Optional[LNPaymentRoute] - # only want 'r' tags - r_tags = list(filter(lambda x: x[0] == 'r', decoded_invoice.tags)) - # strip the tag type, it's implicitly 'r' now - r_tags = list(map(lambda x: x[1], r_tags)) - # if there are multiple hints, we will use the first one that works, - # from a random permutation - random.shuffle(r_tags) channels = list(self.channels.values()) scid_to_my_channels = {chan.short_channel_id: chan for chan in channels if chan.short_channel_id is not None}