From 420cd1e5ed127077200759fe1d73fb3d160c50cd Mon Sep 17 00:00:00 2001 From: ThomasV Date: Thu, 5 Jun 2025 18:50:17 +0200 Subject: [PATCH] make wallet stop and restart-able --- electrum/address_synchronizer.py | 1 + electrum/wallet.py | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py index 002c12340..8ec7f3290 100644 --- a/electrum/address_synchronizer.py +++ b/electrum/address_synchronizer.py @@ -218,6 +218,7 @@ class AddressSynchronizer(Logger, EventListener): self.synchronizer = None self.verifier = None self.unregister_callbacks() + self.network = None def add_address(self, address): if address not in self.db.history: diff --git a/electrum/wallet.py b/electrum/wallet.py index 998bef6a5..23c978d65 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -405,7 +405,7 @@ class Abstract_Wallet(ABC, Logger, EventListener): self._default_labels = {} self._accounting_addresses = set() # addresses counted as ours after successful sweep - self.taskgroup = OldTaskGroup() + self.taskgroup = None # saved fields self.use_change = db.get('use_change', True) @@ -449,7 +449,7 @@ class Abstract_Wallet(ABC, Logger, EventListener): self.lnworker = None async def main_loop(self): - self.logger.info("starting taskgroup.") + self.logger.info(f"starting taskgroup ({hex(id(self.taskgroup))}).") try: async with self.taskgroup as group: await group.spawn(asyncio.Event().wait) # run forever (until cancel) @@ -547,8 +547,10 @@ class Abstract_Wallet(ABC, Logger, EventListener): if self.lnworker: await self.lnworker.stop() self.lnworker = None + self.network = None + await self.taskgroup.cancel_remaining() + self.taskgroup = None await self.adb.stop() - await self.taskgroup.cancel_remaining() finally: # even if we get cancelled if any([ks.is_requesting_to_be_rewritten_to_wallet_file for ks in self.get_keystores()]): self.save_keystore() @@ -556,7 +558,7 @@ class Abstract_Wallet(ABC, Logger, EventListener): self.save_db() def is_up_to_date(self) -> bool: - if self.taskgroup.joined: # either stop() was called, or the taskgroup died + if self.taskgroup and self.taskgroup.joined: # either stop() was called, or the taskgroup died return False return self._up_to_date @@ -633,6 +635,7 @@ class Abstract_Wallet(ABC, Logger, EventListener): def start_network(self, network: 'Network'): assert self.network is None, "already started" + self.taskgroup = OldTaskGroup() self.network = network if network: asyncio.run_coroutine_threadsafe(self.main_loop(), self.network.asyncio_loop)