commit 2a06a5b493dbfb275c25746f708a980c222f7d8e
parent 46eabd1dab6bcaa3dfca5729116df58a201fda11
Author: ThomasV <thomasv@gitorious>
Date: Fri, 26 Oct 2012 00:40:19 +0200
tie confirmation icons to payment verifier
Diffstat:
7 files changed, 33 insertions(+), 43 deletions(-)
diff --git 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
diff --git a/lib/gui.py b/lib/gui.py
@@ -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:
diff --git a/lib/gui_lite.py b/lib/gui_lite.py
@@ -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:
diff --git a/lib/gui_qt.py b/lib/gui_qt.py
@@ -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:
diff --git a/lib/simple_config.py b/lib/simple_config.py
@@ -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
diff --git a/lib/verifier.py b/lib/verifier.py
@@ -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):
diff --git a/lib/wallet.py b/lib/wallet.py
@@ -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