tie confirmation icons to payment verifier
authorThomasV <thomasv@gitorious>
Thu, 25 Oct 2012 22:40:19 +0000 (00:40 +0200)
committerThomasV <thomasv@gitorious>
Thu, 25 Oct 2012 22:40:19 +0000 (00:40 +0200)
electrum
lib/gui.py
lib/gui_lite.py
lib/gui_qt.py
lib/simple_config.py
lib/verifier.py
lib/wallet.py

index 326310c..7367cdf 100755 (executable)
--- a/electrum
+++ b/electrum
@@ -191,7 +191,10 @@ if __name__ == '__main__':
 
         interface.start()
         WalletSynchronizer(wallet, config).start()
-        WalletVerifier(interface, config, wallet.get_tx_hashes).start()
+
+        verifier = WalletVerifier(interface, config, wallet.get_tx_hashes)
+        verifier.start()
+        wallet.verifier = verifier
 
         try:
             found = config.wallet_file_exists
index 131ee8c..d13205f 100644 (file)
@@ -325,7 +325,7 @@ def run_network_dialog( wallet, parent ):
     interface = wallet.interface
     if parent:
         if interface.is_connected:
-            status = "Connected to %s:%d\n%d blocks"%(interface.host, interface.port, wallet.blocks)
+            status = "Connected to %s:%d\n%d blocks"%(interface.host, interface.port, wallet.verifier.height)
         else:
             status = "Not connected"
     else:
@@ -1164,25 +1164,19 @@ class ElectrumWindow:
         if self.funds_error:
             text = "Not enough funds"
         elif interface and interface.is_connected:
-            self.network_button.set_tooltip_text("Connected to %s:%d.\n%d blocks"%(interface.host, interface.port, self.wallet.blocks))
-            if self.wallet.blocks == -1:
-                self.status_image.set_from_stock(gtk.STOCK_NO, gtk.ICON_SIZE_MENU)
-                text = "Connecting..."
-            elif self.wallet.blocks == 0:
-                self.status_image.set_from_stock(gtk.STOCK_NO, gtk.ICON_SIZE_MENU)
-                text = "Server not ready"
-            elif not self.wallet.up_to_date:
+            self.network_button.set_tooltip_text("Connected to %s:%d.\n%d blocks"%(interface.host, interface.port, self.wallet.verifier.height))
+            if not self.wallet.up_to_date:
                 self.status_image.set_from_stock(gtk.STOCK_REFRESH, gtk.ICON_SIZE_MENU)
                 text = "Synchronizing..."
             else:
                 self.status_image.set_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_MENU)
-                self.network_button.set_tooltip_text("Connected to %s:%d.\n%d blocks"%(interface.host, interface.port, self.wallet.blocks))
+                self.network_button.set_tooltip_text("Connected to %s:%d.\n%d blocks"%(interface.host, interface.port, self.wallet.verifier.height))
                 c, u = self.wallet.get_balance()
                 text =  "Balance: %s "%( format_satoshis(c,False,self.wallet.num_zeros) )
                 if u: text +=  "[%s unconfirmed]"%( format_satoshis(u,True,self.wallet.num_zeros).strip() )
         else:
             self.status_image.set_from_stock(gtk.STOCK_NO, gtk.ICON_SIZE_MENU)
-            self.network_button.set_tooltip_text("Trying to contact %s.\n%d blocks"%(interface.server, self.wallet.blocks))
+            self.network_button.set_tooltip_text("Not connected.")
             text = "Not connected"
 
         self.status_bar.pop(self.context_id) 
@@ -1231,7 +1225,7 @@ class ElectrumWindow:
         for tx in self.wallet.get_tx_history():
             tx_hash = tx['tx_hash']
             if tx['height']:
-                conf = self.wallet.blocks - tx['height'] + 1
+                conf = self.wallet.verifier.get_confirmations(tx_hash)
                 time_str = datetime.datetime.fromtimestamp( tx['timestamp']).isoformat(' ')[:-3]
                 conf_icon = gtk.STOCK_APPLY
             else:
index 2971978..d94620e 100644 (file)
@@ -821,8 +821,6 @@ class MiniDriver(QObject):
             self.initializing()
         elif not self.wallet.interface.is_connected:
             self.connecting()
-        elif not self.wallet.blocks == -1:
-            self.connecting()
         elif not self.wallet.up_to_date:
             self.synchronizing()
         else:
index 116c90b..e7fbde6 100644 (file)
@@ -277,13 +277,7 @@ class ElectrumWindow(QMainWindow):
 
     def update_wallet(self):
         if self.wallet.interface and self.wallet.interface.is_connected:
-            if self.wallet.blocks == -1:
-                text = _( "Connecting..." )
-                icon = QIcon(":icons/status_disconnected.png")
-            elif self.wallet.blocks == 0:
-                text = _( "Server not ready" )
-                icon = QIcon(":icons/status_disconnected.png")
-            elif not self.wallet.up_to_date:
+            if not self.wallet.up_to_date:
                 text = _( "Synchronizing..." )
                 icon = QIcon(":icons/status_waiting.png")
             else:
@@ -339,7 +333,7 @@ class ElectrumWindow(QMainWindow):
         tx = self.wallet.tx_history.get(tx_hash)
 
         if tx['height']:
-            conf = self.wallet.blocks - tx['height'] + 1
+            conf = self.wallet.verifier.get_confirmations(tx_hash)
             time_str = datetime.datetime.fromtimestamp( tx['timestamp']).isoformat(' ')[:-3]
         else:
             conf = 0
@@ -441,7 +435,7 @@ class ElectrumWindow(QMainWindow):
         for tx in self.wallet.get_tx_history():
             tx_hash = tx['tx_hash']
             if tx['height']:
-                conf = self.wallet.blocks - tx['height'] + 1
+                conf = self.wallet.verifier.get_confirmations(tx_hash)
                 time_str = datetime.datetime.fromtimestamp( tx['timestamp']).isoformat(' ')[:-3]
                 if conf < 6:
                     icon = QIcon(":icons/clock%d.png"%conf)
@@ -1367,7 +1361,7 @@ class ElectrumWindow(QMainWindow):
         interface = wallet.interface
         if parent:
             if interface.is_connected:
-                status = _("Connected to")+" %s\n%d blocks"%(interface.host, wallet.blocks)
+                status = _("Connected to")+" %s\n%d blocks"%(interface.host, wallet.verifier.height)
             else:
                 status = _("Not connected")
         else:
index a8cd4b5..eacdf5c 100644 (file)
@@ -104,8 +104,12 @@ class SimpleConfig:
         # try to fix the type
         if default is not None and type(out) != type(default):
             import ast
-            out = ast.literal_eval(out)
-            
+            try:
+                out = ast.literal_eval(out)
+            except:
+                print "type error, using default value"
+                out = default
+
         return out
 
 
index 095b5e8..341e845 100644 (file)
@@ -33,17 +33,17 @@ class WalletVerifier(threading.Thread):
         self.interface = interface
         self.get_transactions = get_transactions
         self.interface.register_channel('verifier')
-        self.verified_tx     = config.get('verified_tx',[])
+        self.verified_tx     = config.get('verified_tx',{})
         self.merkle_roots    = config.get('merkle_roots',{})      # hashed by me
         self.targets         = config.get('targets',{})           # compute targets
         self.lock = threading.Lock()
         self.pending_headers = [] # headers that have not been verified
         self.height = 0
         self.local_height = 0
-        self.set_local_numblocks()
+        self.set_local_height()
 
-
-        
+    def get_confirmations(self, tx):
+        return (self.local_height - self.verified_tx[tx] + 1) if tx in self.verified_tx else None
 
     def run(self):
         requested_merkle = []
@@ -138,7 +138,7 @@ class WalletVerifier(threading.Thread):
         header = self.read_header(tx_height)
         if header:
             assert header.get('merkle_root') == self.merkle_roots[tx_hash]
-            self.verified_tx.append(tx_hash)
+            self.verified_tx[tx_hash] = tx_height
             print "verified", tx_hash
             self.config.set_key('verified_tx', self.verified_tx, True)
 
@@ -257,7 +257,7 @@ class WalletVerifier(threading.Thread):
         f.seek(index*2016*80)
         h = f.write(chunk)
         f.close()
-        self.set_local_numblocks()
+        self.set_local_height()
 
     def save_header(self, header):
         data = self.header_to_string(header).decode('hex')
@@ -268,13 +268,16 @@ class WalletVerifier(threading.Thread):
         f.seek(height*80)
         h = f.write(data)
         f.close()
-        self.set_local_numblocks()
+        self.set_local_height()
+
 
-    def set_local_numblocks(self):
+    def set_local_height(self):
         name = self.path()
         if os.path.exists(name):
-            self.local_height = os.path.getsize(name)/80 - 1
-            # print "local height", self.local_height, os.path.getsize(name)/80.
+            h = os.path.getsize(name)/80 - 1
+            if self.local_height != h:
+                self.local_height = h
+                self.interface.trigger_callback('updated')
 
 
     def read_header(self, block_height):
index c3f5984..7c2b840 100644 (file)
@@ -78,7 +78,6 @@ class Wallet:
         self.receipt = None          # next receipt
         self.tx_history = {}
         self.was_updated = True
-        self.blocks = -1
         self.banner = ''
 
         # there is a difference between wallet.up_to_date and interface.is_up_to_date()
@@ -868,7 +867,6 @@ class WalletSynchronizer(threading.Thread):
         self.interface.send([('server.banner',[])],'synchronizer')
 
         # subscriptions
-        self.interface.send([('blockchain.numblocks.subscribe',[])], 'synchronizer')
         self.interface.send([('server.peers.subscribe',[])],'synchronizer')
         self.subscribe_to_addresses(self.wallet.all_addresses())
 
@@ -903,10 +901,6 @@ class WalletSynchronizer(threading.Thread):
                 self.wallet.tx_result = result
                 self.wallet.tx_event.set()
 
-            elif method == 'blockchain.numblocks.subscribe':
-                self.wallet.blocks = result
-                self.wallet.was_updated = True
-
             elif method == 'server.version':
                 pass