from functools import cache import json from flask import ( Flask, make_response, redirect, request, jsonify, render_template, send_from_directory, send_file, ) import os import json import requests from datetime import datetime import dotenv import hsd dotenv.load_dotenv() app = Flask(__name__) def find(name, path): for root, dirs, files in os.walk(path): if name in files: return os.path.join(root, name) # Assets routes @app.route("/assets/") def send_assets(path): if path.endswith(".json"): return send_from_directory( "templates/assets", path, mimetype="application/json" ) if os.path.isfile("templates/assets/" + path): return send_from_directory("templates/assets", path) # Try looking in one of the directories filename: str = path.split("/")[-1] if ( filename.endswith(".png") or filename.endswith(".jpg") or filename.endswith(".jpeg") or filename.endswith(".svg") ): if os.path.isfile("templates/assets/img/" + filename): return send_from_directory("templates/assets/img", filename) if os.path.isfile("templates/assets/img/favicon/" + filename): return send_from_directory("templates/assets/img/favicon", filename) return render_template("404.html"), 404 # region Special routes @app.route("/favicon.png") def faviconPNG(): return send_from_directory("templates/assets/img", "favicon.png") @app.route("/.well-known/") def wellknown(path): # Try to proxy to https://nathan.woodburn.au/.well-known/ req = requests.get(f"https://nathan.woodburn.au/.well-known/{path}") return make_response( req.content, 200, {"Content-Type": req.headers["Content-Type"]} ) # endregion # region Main routes @app.route("/") def index(): txs = hsd.get_mempool() mempool_info = hsd.get_mempool_info() if mempool_info['result']: mempool_info = mempool_info['result'] mempool = f"Total Transactions: {len(txs)}

" for txid in txs: tx = hsd.get_tx(txid) mempool += f"{txid}: {len(tx['inputs'])} inputs, {len(tx['outputs'])} outputs, fee: {tx['fee']/1000000}, Total Value: {sum([output['value']/1000000 for output in tx['outputs']]):,.2f} HNS

" return render_template("index.html",mempool=mempool) @app.route("/name") def name(): if request.args.get("name"): name = request.args.get("name") data = hsd.get_name(name) dns = hsd.get_name_resource(name) data = json.dumps(data, indent=4) + "

" + json.dumps(dns, indent=4) return render_template("data.html", data=data) else: return render_template("index.html") @app.route("/tx") def tx(): if request.args.get("tx"): tx = hsd.get_tx(request.args.get("tx")) return render_template("data.html", data=json.dumps(tx, indent=4)) else: return render_template("index.html") @app.route("/block") def block(): if request.args.get("block"): block = hsd.get_block(request.args.get("block")) return render_template("data.html", data=json.dumps(block, indent=4)) else: return render_template("index.html") @app.route("/") def catch_all(path: str): if os.path.isfile("templates/" + path): return render_template(path) # Try with .html if os.path.isfile("templates/" + path + ".html"): return render_template(path + ".html") if os.path.isfile("templates/" + path.strip("/") + ".html"): return render_template(path.strip("/") + ".html") # Try to find a file matching if path.count("/") < 1: # Try to find a file matching filename = find(path, "templates") if filename: return send_file(filename) return render_template("404.html"), 404 # endregion # region API routes @app.route("/api/v1/version") def api_version(): return jsonify({"version": "1.0.0"}) @app.route("/api/v1/tx/") def api_tx(txid): tx = hsd.get_tx(txid) if tx: return jsonify(tx) else: return jsonify({"error": "tx not found"}), 404 @app.route("/api/v1/block/") def api_block(blockhash): block = hsd.get_block(blockhash) if block: return jsonify(block) else: return jsonify({"error": "block not found"}), 404 @app.route("/api/v1/name/") def api_name(name): name = hsd.get_name(name) if name: return jsonify(name) else: return jsonify({"error": "name not found"}), 404 @app.route("/api/v1/name//resource") @app.route("/api/v1/name//dns") @app.route("/api/v1/resource/") @app.route("/api/v1/dns/") def api_name_resource(name): name = hsd.get_name_resource(name) if name: return jsonify(name) else: return jsonify({"error": "name not found"}), 404 @app.route("/api/v1/address/
") def api_address(address): address = hsd.get_address(address) if address: return jsonify(address) else: return jsonify({"error": "address not found"}), 404 @app.route("/api/v1/mempool") def api_mempool(): mempool = hsd.get_mempool() if mempool: return jsonify(mempool) else: return jsonify({"error": "mempool not found"}), 404 @app.route("/api/v1/mempool/info") def api_mempool_info(): mempool_info = hsd.get_mempool_info() if mempool_info: return jsonify(mempool_info) else: return jsonify({"error": "mempool info not found"}), 404 # endregion # region Error Catching # 404 catch all @app.errorhandler(404) def not_found(e): return render_template("404.html"), 404 # endregion if __name__ == "__main__": app.run(debug=True, port=5000, host="0.0.0.0")