ThomasV
12 years ago
1 changed files with 90 additions and 0 deletions
@ -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 <bitcoin_address>" |
||||
|
sys.exit(1) |
||||
|
main(address) |
Loading…
Reference in new issue