def transaction_spent(thash): data = Transaction().spent(thash) outputs = [] if data["error"] is None: result = data["result"] for output in result: item = {"spent": output["spent"]} if output["spent"]: block = Block().height(output["height"])["result"] item["txid"] = output["txid"] item["vin"] = output["vin"] item["status"] = { "confirmed": True, "block_height": block["height"], "block_hash": block["hash"], "block_time": block["time"] } outputs.append(item) return jsonify(outputs) else: return Response("Transaction not found", mimetype="text/plain", status=404)
def subscription_loop(): bestblockhash = None mempool = [] while True: data = General().info() if "result" in data: if "bestblockhash" in data["result"]: if data["result"]["bestblockhash"] != bestblockhash: bestblockhash = data["result"]["bestblockhash"] sio.emit("block.update", utils.response({ "height": data["result"]["blocks"], "hash": bestblockhash }), room="blocks") updates = Block().inputs(bestblockhash) for address in updates: mempool = list(set(mempool) - set(updates[address])) sio.emit("address.update", utils.response({ "address": address, "tx": updates[address], "height": data["result"]["blocks"], "hash": bestblockhash }), room=address) data = General().mempool() temp_mempool = [] if not data["error"]: updates = Transaction.addresses(data["result"]["tx"]) for address in updates: updates[address] = list( set(updates[address]) - set(mempool)) temp_mempool += updates[address] if len(updates[address]) > 0: sio.emit("address.update", utils.response({ "address": address, "tx": updates[address], "height": None, "hash": None }), room=address) mempool = list(set(mempool + temp_mempool)) sio.sleep(0)
def broadcast_tx(): raw = request.data.decode("utf-8") data = Transaction().broadcast(raw) if data["error"] is None: return Response(data["result"], mimetype="text/plain") return Response(data["error"]["message"], mimetype="text/plain", status=400)
def transaction_info(thash): data = Transaction().info(thash) if data["error"] is None: result = data["result"] return Esplora().transaction(result) else: return Response("Transaction not found", mimetype="text/plain", status=404)
def mempool_recent(): data = General().mempool() result = [] for txid in data["result"]["tx"]: transaction = Transaction().info(txid)["result"] item = Esplora().transaction(transaction) result.append({ "txid": item["txid"], "fee": item["fee"], "vsize": item["weight"], "value": item["value"] }) return jsonify(result)
def init(): bestblockhash = None while True: data = General().info() if data['result']['bestblockhash'] != bestblockhash: bestblockhash = data['result']['bestblockhash'] sio.emit('block.update', utils.response({ 'height': data['result']['blocks'], 'hash': bestblockhash }), room='blocks') updates = Block().inputs(bestblockhash) for address in updates: mempool = list(set(state.mempool) - set(updates[address])) if address in state.rooms: sio.emit('address.update', utils.response({ 'address': address, 'tx': updates[address], 'height': data['result']['blocks'], 'hash': bestblockhash }), room=address) data = General().mempool() updates = Transaction().addresses(data['result']['tx']) temp_mempool = [] for address in updates: updates[address] = list(set(updates[address]) - set(mempool)) temp_mempool += updates[address] if address in state.rooms: if len(updates[address]) > 0: sio.emit('address.update', utils.response({ 'address': address, 'tx': updates[address], 'height': None, 'hash': None }), room=address) mempool = list(set(mempool + temp_mempool))
def address_transactions(address, thash): data = Address().history(address) transactions = [] start = 0 if data["error"] is None: result = data["result"] if thash in result["tx"]: start = result["tx"].index(thash) + 1 for thash in result["tx"][start:start + config.tx_page]: transaction = Transaction().info(thash)["result"] transactions.append(Esplora().transaction(transaction)) return jsonify(transactions) else: return Response("Invalid Bitcoin address", mimetype="text/plain", status=400)
def block_transactions(bhash, start=0): data = Block().hash(bhash) transactions = [] if start % config.tx_page != 0: return Response( f"start index must be a multipication of {config.tx_page}", mimetype="text/plain", status=400) if data["error"] is None: result = data["result"] for thash in result["tx"][start:start + config.tx_page]: transaction = Transaction().info(thash)["result"] transactions.append(Esplora().transaction(transaction)) return jsonify(transactions) else: return Response("Block not found", mimetype="text/plain", status=404)
def inputs(cls, bhash: str): data = cls.hash(bhash) return Transaction().addresses(data["result"]["tx"])
def TransactionInfo(thash=None): return Transaction.info(thash)
def post(self): parser = reqparse.RequestParser() parser.add_argument('raw', type=str, default="") args = parser.parse_args() return Transaction().broadcast(args['raw'])
def get(self, thash): return Transaction().info(thash)
def inputs(cls, bhash: str): data = cls.hash(bhash) return Transaction().addresses(data['result']['tx'])
def get(self, raw): return Transaction().decode(raw)
def transaction_info(thash): return jsonify(Transaction().info(thash))
def broadcast(): raw = request.values.get("raw") return Transaction().broadcast(raw)
def TransactionInfo(thash: str): return Transaction().info(thash)
def Broadcast(raw=None): return Transaction.broadcast(raw)
def Broadcast(raw: str): return Transaction().broadcast(raw)
def TransactionBatch(hashes=[]): result = [] for thash in hashes: result.append(Transaction.info(thash)) return utils.response(result)
def decode_raw_tx(raw): return jsonify(Transaction().decode(raw))