#! /usr/bin/env python3 import base64, socket, sys def get_transaction(s, i): request = b"\0\0\0\0\x05" + i.to_bytes(2, "big") for _ in range(10): s.sendto(request, ("::1", 62039)) try: while True: msg, sender = s.recvfrom(4096) if sender[0:2] == ("::1", 62039) and len(msg) == 156 and msg[0:5] == b"\0\0\0\0\x06" and msg[5:7] == i.to_bytes(2, "big"): return msg[7:156] except TimeoutError: pass return None def format_addr(raw_addr): return base64.b64encode(raw_addr).decode() def format_amount(raw_amount): int_amount = int.from_bytes(raw_amount, "big") coins = int_amount // 100 cents = int_amount % 100 return f"{coins},{cents:02} cc" def main(): s = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) s.settimeout(1) for i in range(1024): transaction = get_transaction(s, i) if transaction is None: print("- no response from local node -", file=sys.stderr) exit(1) if transaction == 149 * b"\0": return if transaction[0] == 1: sender = format_addr(transaction[5:37]) receiver = format_addr(transaction[37:69]) amount = format_amount(transaction[69:77]) fee = format_amount(transaction[77:85]) elif transaction[0] == 2: sender = format_addr(transaction[5:37]) receiver = "(gambling)" + 33 * " " amount = format_amount(transaction[37:45]) fee = format_amount(transaction[45:53]) elif transaction[0] == 3: print("- reveal transaction -") sender = None else: sender = None if sender is not None: print(f"{sender} {receiver} {amount:>13} {fee:>10}") if __name__ == '__main__': main()