import json import asyncio import requests class Block: def __init__(self, data): if isinstance(data, dict): self.hash = data["hash"] self.height = data["height"] self.depth = data["depth"] self.version = data["version"] self.prevBlock = data["prevBlock"] self.merkleRoot = data["merkleRoot"] self.witnessRoot = data["witnessRoot"] self.treeRoot = data["treeRoot"] self.reservedRoot = data["reservedRoot"] self.time = data["time"] self.bits = data["bits"] self.nonce = data["nonce"] self.extraNonce = data["extraNonce"] self.mask = data["mask"] self.txs = data["txs"] elif isinstance(data, list) or isinstance(data, tuple): self.hash = data[0] self.height = data[1] self.depth = data[2] self.version = data[3] self.prevBlock = data[4] self.merkleRoot = data[5] self.witnessRoot = data[6] self.treeRoot = data[7] self.reservedRoot = data[8] self.time = data[9] self.bits = data[10] self.nonce = data[11] self.extraNonce = data[12] self.mask = data[13] self.txs = json.loads(data[14]) else: raise ValueError("Invalid data type") def __str__(self): return f"Block {self.height}" class Transaction: def __init__(self, data): if isinstance(data, dict): self.hash = data["hash"] self.witnessHash = data["witnessHash"] self.fee = data["fee"] self.rate = data["rate"] self.mtime = data["mtime"] self.block = data["block"] self.index = data["index"] self.version = data["version"] self.inputs = data["inputs"] self.outputs = data["outputs"] self.locktime = data["locktime"] self.hex = data["hex"] elif isinstance(data, list) or isinstance(data, tuple): self.hash = data[0] self.witnessHash = data[1] self.fee = data[2] self.rate = data[3] self.mtime = data[4] self.block = data[5] self.index = data[6] self.version = data[7] # Load inputs with Input class self.inputs = [] for input in json.loads(data[8]): self.inputs.append(Input(input)) self.outputs = [] for output in json.loads(data[9]): self.outputs.append(Output(output)) self.locktime = data[10] self.hex = data[11] else: raise ValueError("Invalid data type") def __str__(self): return f"Transaction {self.hash}" class Input: def __init__(self, data): if isinstance(data, dict): self.prevout = data["prevout"] self.witness = data["witness"] self.sequence = data["sequence"] self.coin = Coin(data["coin"]) else: raise ValueError("Invalid data type") def __str__(self): return f"Input {self.prevout['hash']} {self.coin}" class Output: def __init__(self, data): if isinstance(data, dict): self.value = data["value"] self.address = data["address"] self.covenant = Covenant(data["covenant"]) else: raise ValueError("Invalid data type") def __str__(self): return f"Output {self.value} {self.address} {self.covenant}" class Covenant: def __init__(self, data): if isinstance(data, dict): self.type = data["type"] self.action = data["action"] self.items = data["items"] else: raise ValueError("Invalid data type") def __str__(self): return f"Covenant {self.type} {self.action}" class Coin: def __init__(self, data): if isinstance(data, dict): self.version = data["version"] self.height = data["height"] self.value = data["value"] self.address = data["address"] self.covenant = Covenant(data["covenant"]) self.coinbase = data["coinbase"] else: raise ValueError("Invalid data type") def __str__(self): return f"Coin {self.value} {self.address} {self.covenant}"