Trireme commited on
Commit
bd12326
·
verified ·
1 Parent(s): e581069

Upload folder using huggingface_hub

Browse files
Files changed (5) hide show
  1. .DS_Store +0 -0
  2. .gradio/certificate.pem +31 -0
  3. README.md +3 -9
  4. app.py +163 -0
  5. requirements.txt +4 -0
.DS_Store ADDED
Binary file (6.15 kB). View file
 
.gradio/certificate.pem ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
3
+ TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
4
+ cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
5
+ WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
6
+ ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
7
+ MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
8
+ h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
9
+ 0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
10
+ A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
11
+ T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
12
+ B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
13
+ B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
14
+ KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
15
+ OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
16
+ jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
17
+ qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
18
+ rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
19
+ HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
20
+ hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
21
+ ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
22
+ 3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
23
+ NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
24
+ ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
25
+ TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
26
+ jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
27
+ oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
28
+ 4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
29
+ mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
30
+ emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
31
+ -----END CERTIFICATE-----
README.md CHANGED
@@ -1,12 +1,6 @@
1
  ---
2
- title: Hyper Dashboard
3
- emoji: 💻
4
- colorFrom: indigo
5
- colorTo: indigo
6
- sdk: gradio
7
- sdk_version: 5.47.2
8
  app_file: app.py
9
- pinned: false
 
10
  ---
11
-
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: hyper_dashboard
 
 
 
 
 
3
  app_file: app.py
4
+ sdk: gradio
5
+ sdk_version: 5.31.0
6
  ---
 
 
app.py ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # -*- coding: utf-8 -*-
2
+ import asyncio
3
+ from pymongo import MongoClient
4
+ import aiohttp
5
+ import pandas as pd
6
+ import requests
7
+ import json
8
+ import urllib.parse
9
+ import gradio as gr
10
+ import datetime
11
+ import os
12
+
13
+ wallets = [
14
+ "41KL7hbeA2dDuX6gCUFhVaozACnx2hLvGBuY4tgrpJ31",
15
+ "5Xihd2FdAXZnER7HWjT8GiZm14hyPiUpGfqLLL86yaa9",
16
+ "fYYLvdb82NkUQ6EgT7U6N52A2cN6V1dBKEJuvDwwjKj"
17
+ ]
18
+
19
+ def parse_solscan_results(results):
20
+ if isinstance(results, dict):
21
+ results = [results]
22
+
23
+ records = []
24
+
25
+ for entry in results:
26
+ data = entry.get("data", {})
27
+ if not data or not data.get("success"):
28
+ continue
29
+
30
+ payload = data.get("data", {})
31
+
32
+ # Native SOL
33
+ native = payload.get("native_balance", {})
34
+ if native:
35
+ records.append({
36
+ "symbol": native.get("token_symbol", "SOL"),
37
+ "balance": native.get("balance", 0),
38
+ "value": native.get("value", 0)
39
+ })
40
+
41
+ # Tokens
42
+ for token in payload.get("tokens", []):
43
+ records.append({
44
+ "symbol": token.get("token_symbol"),
45
+ "balance": token.get("balance", 0),
46
+ "value": token.get("value", 0)
47
+ })
48
+
49
+ df = pd.DataFrame(records, columns=["address","symbol", "balance", "value"])
50
+
51
+ if not df.empty:
52
+ df = df.groupby(["symbol"], as_index=False).agg({
53
+ "balance": "sum",
54
+ "value": "sum"
55
+ })
56
+
57
+ return df
58
+
59
+ def parse_solscan_results_addresses(results):
60
+ if isinstance(results, dict):
61
+ results = [results]
62
+
63
+ records = []
64
+
65
+ for entry in results:
66
+ address = entry.get("address")
67
+ data = entry.get("data", {})
68
+
69
+ if not data or not data.get("success"):
70
+ continue
71
+
72
+ payload = data.get("data", {})
73
+
74
+ # Native SOL
75
+ native = payload.get("native_balance", {})
76
+ if native:
77
+ records.append({
78
+ "address": address,
79
+ "symbol": native.get("token_symbol", "SOL"),
80
+ "balance": native.get("balance", 0),
81
+ "value": native.get("value", 0)
82
+ })
83
+
84
+ # Tokens
85
+ for token in payload.get("tokens", []):
86
+ records.append({
87
+ "address": address,
88
+ "symbol": token.get("token_symbol"),
89
+ "balance": token.get("balance", 0),
90
+ "value": token.get("value", 0)
91
+ })
92
+
93
+ # Make sure DataFrame has the expected columns even if empty
94
+ df = pd.DataFrame(records, columns=["address", "symbol", "balance", "value"])
95
+
96
+ # Only group if DataFrame is not empty
97
+ if not df.empty:
98
+ df = df.groupby(["address", "symbol"], as_index=False).agg({
99
+ "balance": "sum",
100
+ "value": "sum"
101
+ })
102
+
103
+ return df
104
+
105
+
106
+ async def get_sol_balances(sol_addresses):
107
+ SOLSCAN_KEY = os.getenv('SOLSCAN_KEY')
108
+ headers = {
109
+ "token": SOLSCAN_KEY
110
+ }
111
+
112
+ async def fetch_wallet(session, wallet_address):
113
+ url = f"https://pro-api.solscan.io/v2.0/account/portfolio?address={wallet_address}&exclude_low_score_tokens=false"
114
+ async with session.get(url, headers=headers) as response:
115
+ if response.status != 200:
116
+ return {"address": wallet_address, "error": f"HTTP {response.status}"}
117
+ try:
118
+ data = await response.json()
119
+ except Exception as e:
120
+ return {"address": wallet_address, "error": str(e)}
121
+ res = {"address": wallet_address, "data": data}
122
+ return parse_solscan_results_addresses([res])
123
+
124
+ async with aiohttp.ClientSession() as session:
125
+ tasks = [fetch_wallet(session, addr) for addr in sol_addresses]
126
+ results = await asyncio.gather(*tasks)
127
+ final_df = pd.concat(results, ignore_index=True)
128
+ final_df = final_df.groupby(["address","symbol"], as_index=False).agg({
129
+ "balance": "sum",
130
+ "value": "sum"
131
+ })
132
+ final_df = final_df[final_df['symbol'].isin(['SOL', 'WSOL','HYPER'])]
133
+ return final_df.groupby('symbol').agg({"balance":"sum","value":"sum"}).reset_index()
134
+
135
+
136
+ async def get_all_dfs():
137
+ starting_df = pd.DataFrame([{"symbol":"HYPER","balance":5000000,"value":68500},{"symbol":"SOL","balance":240,"value":42960}])
138
+ final_df = await get_sol_balances(wallets)
139
+ hyper_price = float(final_df.loc[final_df['symbol']=='HYPER','value'] / final_df.loc[final_df['symbol']=='HYPER','balance'])
140
+ lp_df = pd.DataFrame([{"symbol":"HYPER","balance":2_800_000,"value":2_800_000*hyper_price}])
141
+ total_balances = pd.concat([final_df,lp_df]).groupby('symbol').agg({"balance":"sum","value":"sum"}).reset_index()
142
+ pnl = total_balances['value'].sum() - starting_df['value'].sum()
143
+ pnl = f"{pnl:,.2f}"
144
+ return starting_df,lp_df,final_df,total_balances,pnl
145
+
146
+
147
+ with gr.Blocks() as demo:
148
+ gr.Markdown("## HYPER Balances ")
149
+
150
+ starting = gr.DataFrame(label= "Starting Balances ")
151
+ lp = gr.DataFrame(label="LP Position Balances")
152
+ final = gr.DataFrame(label = "Wallet Balances")
153
+ total_balances = gr.DataFrame(label="Total")
154
+ pnl = gr.Textbox(label="PnL ($) (AUM)")
155
+
156
+ demo.load(
157
+ fn= get_all_dfs,
158
+ inputs = [],
159
+ outputs=[starting,lp,final,total_balances,pnl]
160
+ )
161
+
162
+ demo.launch(debug=True, share=True)
163
+
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ pandas
2
+ requests
3
+ gradio
4
+ pymongo[srv]