From 5a72df2bb41b7306d360c7918597810b9f5d1974 Mon Sep 17 00:00:00 2001
From: bitromortac <bitromortac@protonmail.com>
Date: Sat, 19 Dec 2020 21:10:52 +0100
Subject: [PATCH] lnrater: suggest nodes compatible with our LN features

---
 electrum/lnrater.py | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/electrum/lnrater.py b/electrum/lnrater.py
index d08461d7c..3073a708b 100644
--- a/electrum/lnrater.py
+++ b/electrum/lnrater.py
@@ -10,7 +10,7 @@ from collections import defaultdict
 from pprint import pformat
 from random import choices
 from statistics import mean, median, stdev
-from typing import TYPE_CHECKING, Dict, NamedTuple, Tuple, List
+from typing import TYPE_CHECKING, Dict, NamedTuple, Tuple, List, Optional
 import sys
 import time
 
@@ -22,10 +22,11 @@ else:
 from .logging import Logger
 from .util import profiler
 from .lnrouter import fee_for_edge_msat
+from .lnutil import LnFeatures, ln_compare_features, IncompatibleLightningFeatures
 
 if TYPE_CHECKING:
     from .network import Network
-    from .channel_db import Policy
+    from .channel_db import Policy, NodeInfo
     from .lnchannel import ShortChannelID
     from .lnworker import LNWallet
 
@@ -243,16 +244,24 @@ class LNRater(Logger):
         node_keys = list(self._node_stats.keys())
         node_ratings = list(self._node_ratings.values())
         channel_peers = self.lnworker.channel_peers()
+        node_info: Optional["NodeInfo"] = None
 
         while True:
             # randomly pick nodes weighted by node_rating
             pk = choices(node_keys, weights=node_ratings, k=1)[0]
+            # node should have compatible features
+            node_info = self.channel_db.get_node_infos().get(pk, None)
+            peer_features = LnFeatures(node_info.features)
+            try:
+                ln_compare_features(self.lnworker.features, peer_features)
+            except IncompatibleLightningFeatures as e:
+                self.logger.info("suggested node is incompatible")
+                continue
 
             # don't want to connect to nodes we are already connected to
             if pk not in channel_peers:
                 break
 
-        node_info = self.channel_db.get_node_infos().get(pk)
         alias = node_info.alias if node_info else 'unknown node alias'
         self.logger.info(
             f"node rating for {alias}:\n"