tie confirmation icons to payment verifier
This commit is contained in:
parent
46eabd1dab
commit
2a06a5b493
5
electrum
5
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
|
||||
|
|
18
lib/gui.py
18
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:
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -104,7 +104,11 @@ 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
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue