From 9362130fba5001021c2061150e1e28c33883f7bf Mon Sep 17 00:00:00 2001
From: ThomasV <thomasv@electrum.org>
Date: Sat, 13 Oct 2018 14:12:30 +0200
Subject: [PATCH] fix race between network and lnwatcher (network.add_job does
 not always work)

---
 electrum/daemon.py    | 6 ++++--
 electrum/lnwatcher.py | 5 ++++-
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/electrum/daemon.py b/electrum/daemon.py
index 0bbccb040..be88486f8 100644
--- a/electrum/daemon.py
+++ b/electrum/daemon.py
@@ -155,8 +155,6 @@ class Daemon(DaemonThread):
             self.network = Network(config)
             self.network._loop_thread = self._loop_thread
         self.fx = FxThread(config, self.network)
-        if self.network:
-            self.network.start([self.fx.run])
         self.gui = None
         # path -> wallet;   make sure path is standardized.
         self.wallets = {}  # type: Dict[str, Abstract_Wallet]
@@ -164,7 +162,11 @@ class Daemon(DaemonThread):
         self.server = None
         if listen_jsonrpc:
             self.init_server(config, fd)
+        # server-side watchtower
         self.watchtower = WatchTower(self.config, self.network.lnwatcher) if self.config.get('watchtower_host') else None
+        # client-side
+        if self.network:
+            self.network.start([self.fx.run, self.network.lnwatcher.watchtower_task])
         self.start()
 
     def init_server(self, config: SimpleConfig, fd):
diff --git a/electrum/lnwatcher.py b/electrum/lnwatcher.py
index 32b0d7387..0e91617fa 100644
--- a/electrum/lnwatcher.py
+++ b/electrum/lnwatcher.py
@@ -19,6 +19,7 @@ class LNWatcher(PrintError):
     # TODO if verifier gets an incorrect merkle proof, that tx will never verify!!
     # similarly, what if server ignores request for merkle proof?
     # maybe we should disconnect from server in these cases
+    verbosity_filter = 'W'
 
     def __init__(self, network):
         self.network = network
@@ -47,7 +48,6 @@ class LNWatcher(PrintError):
         watchtower_url = self.config.get('watchtower_url')
         self.watchtower = jsonrpclib.Server(watchtower_url) if watchtower_url else None
         self.watchtower_queue = asyncio.Queue()
-        asyncio.run_coroutine_threadsafe(self.network.add_job(self.watchtower_task), self.network.asyncio_loop)
 
     def with_watchtower(func):
         def wrapper(self, *args, **kwargs):
@@ -59,8 +59,11 @@ class LNWatcher(PrintError):
     @ignore_exceptions
     @log_exceptions
     async def watchtower_task(self):
+        self.print_error('watchtower task started')
         while True:
             name, args, kwargs = await self.watchtower_queue.get()
+            if self.watchtower is None:
+                continue
             func = getattr(self.watchtower, name)
             try:
                 r = func(*args, **kwargs)