diff --git a/scripts/get_balance b/scripts/get_balance new file mode 100755 index 000000000..496931b38 --- /dev/null +++ b/scripts/get_balance @@ -0,0 +1,90 @@ +#!/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("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)