import gradio as gr import requests import time from typing import Any from communex.client import CommuneClient from communex.balance import from_nano import json netuid = 0 node_url = "wss://commune.api.onfinality.io/public-ws" def get_com_price() -> Any: retries = 5 for i in range(0, retries): try: return float(requests.get("https://api.mexc.com/api/v3/avgPrice?symbol=COMAIUSDT").json()["price"]) except Exception as e: print(e) if i == retries - 1: raise time.sleep(retries) raise RuntimeError() def get_score(): com_price = get_com_price() blocks_in_day = 10_800 client = CommuneClient(node_url) emission = client.query("Emission", params=[netuid]) distribution_dict: dict[int, float] = {} for uid, emi in enumerate(emission): distribution_dict[uid] = ((emi / 10**11) * blocks_in_day) * com_price return distribution_dict def load_leaderboard(): with open("leaderboard.json", "r") as f: leaderboard_data = json.load(f) return leaderboard_data def save_leaderboard(): scores = get_score() sorted_scores = sorted(scores.items(), key=lambda x: x[1], reverse=True) leaderboard_data = [] for rank, (uid, score) in enumerate(sorted_scores, start=1): leaderboard_data.append({"rank": rank, "uid": uid, "score": score}) with open("leaderboard.json", "w") as f: json.dump(leaderboard_data, f) with gr.Blocks() as demo: gr.Markdown("# Commune Leaderboard") leaderboard_data = load_leaderboard() leaderboard_table = gr.components.DataFrame( value=leaderboard_data, headers=["rank", "uid", "score"], datatype=["number", "number", "number"], interactive=False, visible=True ) refresh_button = gr.Button("Refresh Leaderboard") def refresh_leaderboard(): save_leaderboard() updated_data = load_leaderboard() return gr.components.DataFrame.update(value=updated_data) refresh_button.click(fn=refresh_leaderboard, outputs=leaderboard_table) if __name__ == "__main__": demo.launch()