From c51c93b0ffde3fa697e6a94a8ffc0dec03a933c3 Mon Sep 17 00:00:00 2001 From: Maxime Biais Date: Tue, 6 Aug 2013 16:03:03 +0200 Subject: [PATCH 1/2] new script: get_balance --- scripts/get_balance | 79 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100755 scripts/get_balance diff --git a/scripts/get_balance b/scripts/get_balance new file mode 100755 index 000000000..f747d5a3e --- /dev/null +++ b/scripts/get_balance @@ -0,0 +1,79 @@ +#!/usr/bin/env python + +import sys +from electrum import Interface +from electrum import bitcoin, Transaction + +def get_transaction(interface, tx_hash, tx_height): + raw_tx = interface.synchronous_get([ ('blockchain.transaction.get',[tx_hash, tx_height]) ])[0] + tx = Transaction(raw_tx) + return tx + +def get_history(interface, addr): + transactions = interface.synchronous_get([ ('blockchain.address.get_history',[addr]) ])[0] + transactions.sort(key=lambda x:x["height"]) + return [(i["tx_hash"],i["height"]) for i in transactions] + +def get_addr_balance(interface, address): + prevout_values = {} + h = get_history(interface, address) + if h == ['*']: return 0, 0 + c = u = 0 + received_coins = [] # list of coins received at address + transactions = {} + + # fetch transactions + for tx_hash, tx_height in h: + transactions[(tx_hash, tx_height)] = get_transaction(interface, tx_hash, tx_height) + + for tx_hash, tx_height in h: + tx = transactions[(tx_hash, tx_height)] + if not tx: continue + update_tx_outputs(tx, prevout_values) + for i, (addr, value) in enumerate(tx.outputs): + if addr == address: + key = tx_hash + ':%d'%i + received_coins.append(key) + + for tx_hash, tx_height in h: + tx = transactions[(tx_hash, tx_height)] + if not tx: continue + v = 0 + + for item in tx.inputs: + addr = item.get('address') + if addr == address: + key = item['prevout_hash'] + ':%d'%item['prevout_n'] + value = prevout_values.get(key) + if key in received_coins: + v -= value + for i, (addr, value) in enumerate(tx.outputs): + key = tx_hash + ':%d'%i + if addr == address: + v += value + if tx_height: + c += v + else: + u += v + return c, u + +def update_tx_outputs(tx, prevout_values): + for i, (addr, value) in enumerate(tx.outputs): + key = tx.hash() + ':%d' % i + prevout_values[key] = value + +def main(address): + interface = Interface() + interface.start() + c, u = get_addr_balance(interface, address) + + print("Final balance: confirmed: %d (%.8f BTC), unconfirmed: %d (%.8f BTC)" % + (c, c / 100000000., u, u / 100000000.)) + +if __name__ == "__main__": + try: + address = sys.argv[1] + except: + print "usage: get_balance " + sys.exit(1) + main(address) From 6075f8ece5be1c2c424c5363cd1a709270ee1426 Mon Sep 17 00:00:00 2001 From: Maxime Biais Date: Tue, 6 Aug 2013 16:06:57 +0200 Subject: [PATCH 2/2] pep8 --- scripts/get_balance | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/scripts/get_balance b/scripts/get_balance index f747d5a3e..496931b38 100755 --- a/scripts/get_balance +++ b/scripts/get_balance @@ -4,51 +4,60 @@ import sys from electrum import Interface from electrum import bitcoin, Transaction + def get_transaction(interface, tx_hash, tx_height): - raw_tx = interface.synchronous_get([ ('blockchain.transaction.get',[tx_hash, tx_height]) ])[0] + raw_tx = interface.synchronous_get([( + 'blockchain.transaction.get', [tx_hash, tx_height])])[0] tx = Transaction(raw_tx) return tx + def get_history(interface, addr): - transactions = interface.synchronous_get([ ('blockchain.address.get_history',[addr]) ])[0] - transactions.sort(key=lambda x:x["height"]) - return [(i["tx_hash"],i["height"]) for i in transactions] + transactions = interface.synchronous_get([( + 'blockchain.address.get_history', [addr])])[0] + transactions.sort(key=lambda x: x["height"]) + return [(i["tx_hash"], i["height"]) for i in transactions] + def get_addr_balance(interface, address): prevout_values = {} h = get_history(interface, address) - if h == ['*']: return 0, 0 + if h == ['*']: + return 0, 0 c = u = 0 received_coins = [] # list of coins received at address transactions = {} # fetch transactions for tx_hash, tx_height in h: - transactions[(tx_hash, tx_height)] = get_transaction(interface, tx_hash, tx_height) + transactions[(tx_hash, tx_height)] = get_transaction( + interface, tx_hash, tx_height) for tx_hash, tx_height in h: tx = transactions[(tx_hash, tx_height)] - if not tx: continue + if not tx: + continue update_tx_outputs(tx, prevout_values) for i, (addr, value) in enumerate(tx.outputs): if addr == address: - key = tx_hash + ':%d'%i + key = tx_hash + ':%d' % i received_coins.append(key) for tx_hash, tx_height in h: tx = transactions[(tx_hash, tx_height)] - if not tx: continue + if not tx: + continue v = 0 for item in tx.inputs: addr = item.get('address') if addr == address: - key = item['prevout_hash'] + ':%d'%item['prevout_n'] + key = item['prevout_hash'] + ':%d' % item['prevout_n'] value = prevout_values.get(key) if key in received_coins: v -= value for i, (addr, value) in enumerate(tx.outputs): - key = tx_hash + ':%d'%i + key = tx_hash + ':%d' % i if addr == address: v += value if tx_height: @@ -57,17 +66,19 @@ def get_addr_balance(interface, address): u += v return c, u + def update_tx_outputs(tx, prevout_values): for i, (addr, value) in enumerate(tx.outputs): key = tx.hash() + ':%d' % i prevout_values[key] = value + def main(address): interface = Interface() interface.start() c, u = get_addr_balance(interface, address) - print("Final balance: confirmed: %d (%.8f BTC), unconfirmed: %d (%.8f BTC)" % + print("Balance - confirmed: %d (%.8f BTC), unconfirmed: %d (%.8f BTC)" % (c, c / 100000000., u, u / 100000000.)) if __name__ == "__main__":