URI: 
       tfix #4026 - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 81666bf9ac8b42d0ac25415ee3815d899c8adda6
   DIR parent e971bd849868122135012b836ece86aeb591efb7
  HTML Author: SomberNight <somber.night@protonmail.com>
       Date:   Mon,  5 Mar 2018 11:44:03 +0100
       
       fix #4026
       
       Diffstat:
         M lib/synchronizer.py                 |       6 ++++++
         M lib/verifier.py                     |       5 ++++-
         M lib/wallet.py                       |       3 ++-
       
       3 files changed, 12 insertions(+), 2 deletions(-)
       ---
   DIR diff --git a/lib/synchronizer.py b/lib/synchronizer.py
       t@@ -84,6 +84,8 @@ class Synchronizer(ThreadJob):
                return bh2u(hashlib.sha256(status.encode('ascii')).digest())
        
            def on_address_status(self, response):
       +        if self.wallet.synchronizer is None:
       +            return  # we have been killed, this was just an orphan callback
                params, result = self.parse_response(response)
                if not params:
                    return
       t@@ -98,6 +100,8 @@ class Synchronizer(ThreadJob):
                    self.requested_addrs.remove(addr)
        
            def on_address_history(self, response):
       +        if self.wallet.synchronizer is None:
       +            return  # we have been killed, this was just an orphan callback
                params, result = self.parse_response(response)
                if not params:
                    return
       t@@ -127,6 +131,8 @@ class Synchronizer(ThreadJob):
                self.requested_histories.pop(addr)
        
            def tx_response(self, response):
       +        if self.wallet.synchronizer is None:
       +            return  # we have been killed, this was just an orphan callback
                params, result = self.parse_response(response)
                if not params:
                    return
   DIR diff --git a/lib/verifier.py b/lib/verifier.py
       t@@ -65,6 +65,8 @@ class SPV(ThreadJob):
                    self.undo_verifications()
        
            def verify_merkle(self, r):
       +        if self.wallet.verifier is None:
       +            return  # we have been killed, this was just an orphan callback
                if r.get('error'):
                    self.print_error('received an error:', r)
                    return
       t@@ -95,7 +97,8 @@ class SPV(ThreadJob):
                self.print_error("verified %s" % tx_hash)
                self.wallet.add_verified_tx(tx_hash, (tx_height, header.get('timestamp'), pos))
        
       -    def hash_merkle_root(self, merkle_s, target_hash, pos):
       +    @classmethod
       +    def hash_merkle_root(cls, merkle_s, target_hash, pos):
                h = hash_decode(target_hash)
                for i in range(len(merkle_s)):
                    item = merkle_s[i]
   DIR diff --git a/lib/wallet.py b/lib/wallet.py
       t@@ -912,7 +912,8 @@ class Abstract_Wallet(PrintError):
                            # make tx local
                            self.unverified_tx.pop(tx_hash, None)
                            self.verified_tx.pop(tx_hash, None)
       -                    self.verifier.merkle_roots.pop(tx_hash, None)
       +                    if self.verifier:
       +                        self.verifier.merkle_roots.pop(tx_hash, None)
                            # but remove completely if not is_mine
                            if self.txi[tx_hash] == {}:
                                # FIXME the test here should be for "not all is_mine"; cannot detect conflict in some cases