Skip to content

Commit 11b87a2

Browse files
authored
Merge pull request #472 from opentensor/feat/thewhaleking/replace-pywry
Replace PyWry
2 parents 39260c0 + e471071 commit 11b87a2

File tree

17 files changed

+2784
-2947
lines changed

17 files changed

+2784
-2947
lines changed

bittensor_cli/cli.py

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,6 @@
6767
prompt_for_identity,
6868
validate_uri,
6969
prompt_for_subnet_identity,
70-
print_linux_dependency_message,
71-
is_linux,
7270
validate_rate_tolerance,
7371
)
7472

@@ -4875,9 +4873,6 @@ def subnets_price(
48754873
if all_netuids and not json_output:
48764874
html_output = True
48774875

4878-
if html_output and is_linux():
4879-
print_linux_dependency_message()
4880-
48814876
return self._run_command(
48824877
price.price(
48834878
self.initialize_chain(network),
@@ -5655,7 +5650,7 @@ def view_dashboard(
56555650
help="Coldkey SS58 address to view dashboard for",
56565651
),
56575652
use_wry: bool = typer.Option(
5658-
False, "--use-wry", help="Use PyWry instead of browser window"
5653+
False, "--use-wry", "--html", help="Display output in browser window."
56595654
),
56605655
save_file: bool = typer.Option(
56615656
False, "--save-file", "--save", help="Save the dashboard HTML file"
@@ -5668,12 +5663,10 @@ def view_dashboard(
56685663
Display html dashboard with subnets list, stake, and neuron information.
56695664
"""
56705665
self.verbosity_handler(quiet, verbose)
5671-
if use_wry and is_linux():
5672-
print_linux_dependency_message()
56735666

56745667
if use_wry and save_file:
5675-
print_error("Cannot save file when using PyWry.")
5676-
raise typer.Exit()
5668+
print_error("Cannot save file when using browser output.")
5669+
return
56775670

56785671
if save_file:
56795672
if not dashboard_path:
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<div class="filters-section">
2+
<div class="search-box">
3+
<input type="text" id="subnet-search" placeholder="search for name, or netuid..." onkeyup="filterSubnets()">
4+
</div>
5+
<div class="filter-toggles">
6+
<label>
7+
<input type="checkbox" id="show-verbose" onchange="toggleVerboseNumbers()">
8+
Precise Numbers
9+
</label>
10+
<label>
11+
<input type="checkbox" id="show-staked" onchange="filterSubnets()">
12+
Show Only Staked
13+
</label>
14+
<label>
15+
<input type="checkbox" id="show-tiles" onchange="toggleTileView()" checked>
16+
Tile View
17+
</label>
18+
<label class="disabled-label" title="Coming soon">
19+
<input type="checkbox" id="live-mode" disabled>
20+
Live Mode (coming soon)
21+
</label>
22+
</div>
23+
</div>
24+
<div id="subnet-tiles-container" class="subnet-tiles-container"></div>
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{#
2+
vars:
3+
wallet_info.coldkey, truncated_coldkey, wallet_info.balance, root_symbol_html, wallet_info.total_ideal_stake_value,
4+
slippage_percentage, wallet_info.total_slippage_value, block_number
5+
#}
6+
7+
<div class="header">
8+
<meta charset="UTF-8">
9+
<div class="wallet-info">
10+
<span class="wallet-name">{{ wallet_info.name }}</span>
11+
<div class="wallet-address-container" onclick="copyToClipboard('{{ coldkey }}', this)">
12+
<span class="wallet-address" title="Click to copy">{{ truncated_coldkey }}}</span>
13+
<span class="copy-indicator">Copy</span>
14+
</div>
15+
</div>
16+
<div class="stake-metrics">
17+
<div class="stake-metric">
18+
<span class="metric-label">Block</span>
19+
<span class="metric-value" style="color: #FF9900;">{{ block_number }}</span>
20+
</div>
21+
<div class="stake-metric">
22+
<span class="metric-label">Balance</span>
23+
<span class="metric-value">{{ "%.4f"|format(wallet_info.balance) }} {{ root_symbol_html }}</span>
24+
</div>
25+
<div class="stake-metric">
26+
<span class="metric-label">Total Stake Value</span>
27+
<span class="metric-value">{{ "%.4f"|format(wallet_info.total_ideal_stake_value) }} {{ root_symbol_html }}</span>
28+
</div>
29+
<div class="stake-metric">
30+
<span class="metric-label">Slippage Impact</span>
31+
<span class="metric-value slippage-value">
32+
{{ "%.2f"|format(slippage_percentage) }}% <span class="slippage-detail">({{ "%.4f"|format(wallet_info.total_slippage_value) }} {{ root_symbol_html }})</span>
33+
</span>
34+
</div>
35+
</div>
36+
</div>
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
<div id="neuron-detail-container" style="display: none;">
2+
<div class="neuron-detail-header">
3+
<button class="back-button neuron-detail-back" onclick="closeNeuronDetails()">&larr; Back</button>
4+
</div>
5+
<div class="neuron-detail-content">
6+
<div class="neuron-info-top">
7+
<h2 class="neuron-name" id="neuron-name"></h2>
8+
<div class="neuron-keys">
9+
<div class="hotkey-label">
10+
<span style="color: #FF9900;">Hotkey:</span>
11+
<span id="neuron-hotkey" class="truncated-address"></span>
12+
</div>
13+
<div class="coldkey-label">
14+
<span style="color: #FF9900;">Coldkey:</span>
15+
<span id="neuron-coldkey" class="truncated-address"></span>
16+
</div>
17+
</div>
18+
</div>
19+
<div class="neuron-cards-container">
20+
<!-- First row: Stakes, Dividends, Incentive, Emissions -->
21+
<div class="neuron-metrics-row">
22+
<div class="metric-card">
23+
<div class="metric-label">Stake Weight</div>
24+
<div id="neuron-stake-total" class="metric-value formatted-number"
25+
data-value="0" data-symbol=""></div>
26+
</div>
27+
28+
<div class="metric-card">
29+
<div class="metric-label">Stake (Alpha)</div>
30+
<div id="neuron-stake-token" class="metric-value formatted-number"
31+
data-value="0" data-symbol=""></div>
32+
</div>
33+
34+
<div class="metric-card">
35+
<div class="metric-label">Stake (Root)</div>
36+
<div id="neuron-stake-root" class="metric-value formatted-number"
37+
data-value="0" data-symbol="&#x03C4;"></div>
38+
</div>
39+
40+
<div class="metric-card">
41+
<div class="metric-label">Dividends</div>
42+
<div id="neuron-dividends" class="metric-value formatted-number"
43+
data-value="0" data-symbol=""></div>
44+
</div>
45+
46+
<div class="metric-card">
47+
<div class="metric-label">Incentive</div>
48+
<div id="neuron-incentive" class="metric-value formatted-number"
49+
data-value="0" data-symbol=""></div>
50+
</div>
51+
52+
<div class="metric-card">
53+
<div class="metric-label">Emissions</div>
54+
<div id="neuron-emissions" class="metric-value formatted-number"
55+
data-value="0" data-symbol=""></div>
56+
</div>
57+
</div>
58+
59+
<!-- Second row: Rank, Trust, Pruning Score, Validator Permit, Consensus, Last Update -->
60+
<div class="neuron-metrics-row">
61+
<div class="metric-card">
62+
<div class="metric-label">Rank</div>
63+
<div id="neuron-rank" class="metric-value"></div>
64+
</div>
65+
66+
<div class="metric-card">
67+
<div class="metric-label">Trust</div>
68+
<div id="neuron-trust" class="metric-value"></div>
69+
</div>
70+
71+
<div class="metric-card">
72+
<div class="metric-label">Pruning Score</div>
73+
<div id="neuron-pruning-score" class="metric-value"></div>
74+
</div>
75+
76+
<div class="metric-card">
77+
<div class="metric-label">Validator Permit</div>
78+
<div id="neuron-validator-permit" class="metric-value"></div>
79+
</div>
80+
81+
<div class="metric-card">
82+
<div class="metric-label">Consensus</div>
83+
<div id="neuron-consensus" class="metric-value"></div>
84+
</div>
85+
86+
<div class="metric-card">
87+
<div class="metric-label">Last Update</div>
88+
<div id="neuron-last-update" class="metric-value"></div>
89+
</div>
90+
</div>
91+
92+
<!-- Third row: Reg Block, IP Info, Active -->
93+
<div class="neuron-metrics-row last-row">
94+
<div class="metric-card">
95+
<div class="metric-label">Reg Block</div>
96+
<div id="neuron-reg-block" class="metric-value"></div>
97+
</div>
98+
99+
<div class="metric-card">
100+
<div class="metric-label">IP Info</div>
101+
<div id="neuron-ipinfo" class="metric-value"></div>
102+
</div>
103+
104+
<div class="metric-card">
105+
<div class="metric-label">Active</div>
106+
<div id="neuron-active" class="metric-value"></div>
107+
</div>
108+
</div>
109+
</div>
110+
</div>
111+
</div>
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>{{ title }}</title>
5+
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
6+
<style>
7+
body {
8+
background-color: #000;
9+
color: #fff;
10+
font-family: Arial, sans-serif;
11+
margin: 0;
12+
padding: 20px;
13+
}
14+
.container {
15+
display: flex;
16+
flex-direction: column;
17+
gap: 60px;
18+
}
19+
#multi-subnet-chart {
20+
width: 90vw;
21+
height: 70vh;
22+
margin-bottom: 40px;
23+
}
24+
.subnet-buttons {
25+
display: grid;
26+
grid-template-columns: repeat(auto-fill, minmax(80px, 1fr));
27+
gap: 8px;
28+
max-height: 120px;
29+
overflow-y: auto;
30+
padding-right: 10px;
31+
margin-top: 50px;
32+
border-top: 1px solid rgba(255,255,255,0.1);
33+
padding-top: 50px;
34+
position: relative;
35+
bottom: 0;
36+
}
37+
.subnet-buttons::-webkit-scrollbar {
38+
width: 8px;
39+
}
40+
.subnet-buttons::-webkit-scrollbar-track {
41+
background: rgba(50,50,50,0.3);
42+
border-radius: 4px;
43+
}
44+
.subnet-buttons::-webkit-scrollbar-thumb {
45+
background: rgba(100,100,100,0.8);
46+
border-radius: 4px;
47+
}
48+
.subnet-button {
49+
background-color: rgba(50,50,50,0.8);
50+
border: 1px solid rgba(70,70,70,0.9);
51+
color: white;
52+
padding: 8px 16px;
53+
cursor: pointer;
54+
border-radius: 4px;
55+
font-size: 14px;
56+
transition: background-color 0.2s;
57+
white-space: nowrap;
58+
overflow: hidden;
59+
text-overflow: ellipsis;
60+
}
61+
.subnet-button:hover {
62+
background-color: rgba(70,70,70,0.9);
63+
}
64+
.subnet-button.active {
65+
background-color: rgba(100,100,100,0.9);
66+
border-color: rgba(120,120,120,1);
67+
}
68+
</style>
69+
</head>
70+
<body>
71+
<div class="container">
72+
<div id="multi-subnet-chart"></div>
73+
<div class="subnet-buttons">
74+
<button class="subnet-button active" onclick="setAll()">All</button>
75+
{% for netuid in sorted_subnet_keys %}
76+
<button class="subnet-button" onclick="setSubnet({{ netuid }})">S{{ netuid }}</button>
77+
{% endfor %}
78+
</div>
79+
</div>
80+
<script>
81+
const figData = {{ fig_json|safe }};
82+
const allVisibility = {{ all_visibility|tojson|safe }};
83+
const allAnnotations = {{ all_annotations|tojson|safe }};
84+
85+
const subnetModes = {{ subnet_modes|tojson|safe }};
86+
87+
Plotly.newPlot('multi-subnet-chart', figData.data, figData.layout);
88+
89+
function clearActiveButtons() {
90+
document.querySelectorAll('.subnet-button').forEach(btn => btn.classList.remove('active'));
91+
}
92+
93+
function setAll() {
94+
clearActiveButtons();
95+
event.currentTarget.classList.add('active');
96+
Plotly.update('multi-subnet-chart',
97+
{visible: allVisibility},
98+
{annotations: allAnnotations}
99+
);
100+
}
101+
102+
function setSubnet(netuid) {
103+
clearActiveButtons();
104+
event.currentTarget.classList.add('active');
105+
const mode = subnetModes[netuid];
106+
Plotly.update('multi-subnet-chart',
107+
{visible: mode.visible},
108+
{annotations: mode.annotations}
109+
);
110+
}
111+
</script>
112+
</body>
113+
</html>

0 commit comments

Comments
 (0)