electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 2a06a5b493dbfb275c25746f708a980c222f7d8e
parent 46eabd1dab6bcaa3dfca5729116df58a201fda11
Author: ThomasV <thomasv@gitorious>
Date:   Fri, 26 Oct 2012 00:40:19 +0200

tie confirmation icons to payment verifier

Diffstat:
Melectrum | 5++++-
Mlib/gui.py | 18++++++------------
Mlib/gui_lite.py | 2--
Mlib/gui_qt.py | 14++++----------
Mlib/simple_config.py | 8++++++--
Mlib/verifier.py | 23+++++++++++++----------
Mlib/wallet.py | 6------
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