bittensor-cli 9.4.4__tar.gz → 9.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. bittensor_cli-9.5.1/MANIFEST.in +1 -0
  2. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/PKG-INFO +5 -5
  3. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/cli.py +3 -10
  4. bittensor_cli-9.5.1/bittensor_cli/src/bittensor/templates/main-filters.j2 +24 -0
  5. bittensor_cli-9.5.1/bittensor_cli/src/bittensor/templates/main-header.j2 +36 -0
  6. bittensor_cli-9.5.1/bittensor_cli/src/bittensor/templates/neuron-details.j2 +111 -0
  7. bittensor_cli-9.5.1/bittensor_cli/src/bittensor/templates/price-multi.j2 +113 -0
  8. bittensor_cli-9.5.1/bittensor_cli/src/bittensor/templates/price-single.j2 +99 -0
  9. bittensor_cli-9.5.1/bittensor_cli/src/bittensor/templates/subnet-details-header.j2 +49 -0
  10. bittensor_cli-9.5.1/bittensor_cli/src/bittensor/templates/subnet-details.j2 +32 -0
  11. bittensor_cli-9.5.1/bittensor_cli/src/bittensor/templates/subnet-metrics.j2 +57 -0
  12. bittensor_cli-9.5.1/bittensor_cli/src/bittensor/templates/subnets-table.j2 +28 -0
  13. bittensor_cli-9.5.1/bittensor_cli/src/bittensor/templates/table.j2 +267 -0
  14. bittensor_cli-9.5.1/bittensor_cli/src/bittensor/templates/view.css +1058 -0
  15. bittensor_cli-9.5.1/bittensor_cli/src/bittensor/templates/view.j2 +43 -0
  16. bittensor_cli-9.5.1/bittensor_cli/src/bittensor/templates/view.js +1053 -0
  17. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/bittensor/utils.py +8 -38
  18. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/commands/stake/add.py +1 -1
  19. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/commands/stake/remove.py +1 -1
  20. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/commands/subnets/price.py +48 -289
  21. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/commands/sudo.py +10 -6
  22. bittensor_cli-9.5.1/bittensor_cli/src/commands/view.py +354 -0
  23. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/commands/wallets.py +1 -7
  24. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli.egg-info/PKG-INFO +5 -5
  25. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli.egg-info/SOURCES.txt +14 -0
  26. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli.egg-info/requires.txt +5 -4
  27. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/pyproject.toml +8 -6
  28. bittensor_cli-9.4.4/bittensor_cli/src/commands/view.py +0 -2945
  29. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/README.md +0 -0
  30. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/__init__.py +0 -0
  31. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/doc_generation_helper.py +0 -0
  32. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/__init__.py +0 -0
  33. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/bittensor/__init__.py +0 -0
  34. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/bittensor/balances.py +0 -0
  35. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/bittensor/chain_data.py +0 -0
  36. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/bittensor/extrinsics/__init__.py +0 -0
  37. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/bittensor/extrinsics/registration.py +0 -0
  38. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/bittensor/extrinsics/root.py +0 -0
  39. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/bittensor/extrinsics/transfer.py +0 -0
  40. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/bittensor/minigraph.py +0 -0
  41. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/bittensor/networking.py +0 -0
  42. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/bittensor/subtensor_interface.py +0 -0
  43. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/commands/__init__.py +0 -0
  44. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/commands/stake/__init__.py +0 -0
  45. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/commands/stake/children_hotkeys.py +0 -0
  46. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/commands/stake/list.py +0 -0
  47. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/commands/stake/move.py +0 -0
  48. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/commands/subnets/__init__.py +0 -0
  49. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/commands/subnets/subnets.py +0 -0
  50. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/src/commands/weights.py +0 -0
  51. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli/version.py +0 -0
  52. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli.egg-info/dependency_links.txt +0 -0
  53. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli.egg-info/entry_points.txt +0 -0
  54. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/bittensor_cli.egg-info/top_level.txt +0 -0
  55. {bittensor_cli-9.4.4 → bittensor_cli-9.5.1}/setup.cfg +0 -0
@@ -0,0 +1 @@
1
+ recursive-include bittensor_cli/src/bittensor/templates *
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bittensor-cli
3
- Version: 9.4.4
3
+ Version: 9.5.1
4
4
  Summary: Bittensor CLI
5
5
  Author: bittensor.com
6
6
  Project-URL: homepage, https://github.com/opentensor/btcli
@@ -13,23 +13,23 @@ Requires-Dist: aiohttp~=3.10.2
13
13
  Requires-Dist: backoff~=2.2.1
14
14
  Requires-Dist: click<8.2.0
15
15
  Requires-Dist: GitPython>=3.0.0
16
- Requires-Dist: fuzzywuzzy~=0.18.0
17
16
  Requires-Dist: netaddr~=1.3.0
18
17
  Requires-Dist: numpy<3.0.0,>=2.0.1
19
18
  Requires-Dist: Jinja2
20
19
  Requires-Dist: pycryptodome<4.0.0,>=3.0.0
21
20
  Requires-Dist: PyYAML~=6.0.1
22
- Requires-Dist: pytest
23
- Requires-Dist: python-Levenshtein
24
21
  Requires-Dist: rich<15.0,>=13.7
25
22
  Requires-Dist: scalecodec==1.2.11
26
23
  Requires-Dist: typer<0.16,>=0.12
27
24
  Requires-Dist: bittensor-wallet>=3.0.7
28
25
  Requires-Dist: plotille>=5.0.0
29
- Requires-Dist: pywry>=0.6.2
30
26
  Requires-Dist: plotly>=6.0.0
31
27
  Provides-Extra: cuda
32
28
  Requires-Dist: torch<3.0,>=1.13.1; extra == "cuda"
29
+ Provides-Extra: dev
30
+ Requires-Dist: pytest; extra == "dev"
31
+ Requires-Dist: pytest-asyncio; extra == "dev"
32
+ Requires-Dist: ruff==0.11.5; extra == "dev"
33
33
 
34
34
  <div align="center">
35
35
 
@@ -67,8 +67,6 @@ from bittensor_cli.src.bittensor.utils import (
67
67
  prompt_for_identity,
68
68
  validate_uri,
69
69
  prompt_for_subnet_identity,
70
- print_linux_dependency_message,
71
- is_linux,
72
70
  validate_rate_tolerance,
73
71
  )
74
72
 
@@ -4875,9 +4873,6 @@ class CLIManager:
4875
4873
  if all_netuids and not json_output:
4876
4874
  html_output = True
4877
4875
 
4878
- if html_output and is_linux():
4879
- print_linux_dependency_message()
4880
-
4881
4876
  return self._run_command(
4882
4877
  price.price(
4883
4878
  self.initialize_chain(network),
@@ -5655,7 +5650,7 @@ class CLIManager:
5655
5650
  help="Coldkey SS58 address to view dashboard for",
5656
5651
  ),
5657
5652
  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."
5659
5654
  ),
5660
5655
  save_file: bool = typer.Option(
5661
5656
  False, "--save-file", "--save", help="Save the dashboard HTML file"
@@ -5668,12 +5663,10 @@ class CLIManager:
5668
5663
  Display html dashboard with subnets list, stake, and neuron information.
5669
5664
  """
5670
5665
  self.verbosity_handler(quiet, verbose)
5671
- if use_wry and is_linux():
5672
- print_linux_dependency_message()
5673
5666
 
5674
5667
  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
5677
5670
 
5678
5671
  if save_file:
5679
5672
  if not dashboard_path:
@@ -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>
@@ -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>
@@ -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>
@@ -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,0 +1,99 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>{{ title }}</title>
6
+ <script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
7
+ <style>
8
+ body {
9
+ background-color: #000;
10
+ color: #fff;
11
+ font-family: Arial, sans-serif;
12
+ margin: 0;
13
+ padding: 20px;
14
+ }
15
+ .header-container {
16
+ display: flex;
17
+ align-items: flex-start;
18
+ justify-content: space-between;
19
+ margin-bottom: 20px;
20
+ }
21
+ .price-info {
22
+ max-width: 60%;
23
+ }
24
+ .main-price {
25
+ font-size: 36px;
26
+ font-weight: 600;
27
+ margin-bottom: 5px;
28
+ }
29
+ .price-change {
30
+ font-size: 18px;
31
+ margin-left: 8px;
32
+ font-weight: 500;
33
+ }
34
+ .text-green { color: #00FF00; }
35
+ .text-red { color: #FF5555; }
36
+ .text-blue { color: #87CEEB; }
37
+ .text-steel { color: #4682B4; }
38
+ .text-purple{ color: #DDA0DD; }
39
+ .text-gold { color: #FFD700; }
40
+
41
+ .sub-stats-row {
42
+ display: flex;
43
+ flex-wrap: wrap;
44
+ margin-top: 10px;
45
+ }
46
+ .stat-item {
47
+ margin-right: 20px;
48
+ margin-bottom: 6px;
49
+ font-size: 14px;
50
+ }
51
+ .side-stats {
52
+ min-width: 220px;
53
+ display: flex;
54
+ flex-direction: column;
55
+ align-items: flex-start;
56
+ }
57
+ .side-stats div {
58
+ margin-bottom: 6px;
59
+ font-size: 14px;
60
+ }
61
+ #chart-container {
62
+ margin-top: 20px;
63
+ width: 100%;
64
+ height: 600px;
65
+ }
66
+ </style>
67
+ </head>
68
+ <body>
69
+ <div class="header-container">
70
+ <div class="price-info">
71
+ <div class="main-price">
72
+ {{ "%.6f"|format(stats.current_price) }} {{ stats.symbol }}
73
+ <span class="price-change {{ "text-green" if stats.change_pct > 0 else "text-red" }}">
74
+ {{ "▲" if stats.change_pct > 0 else "▼" }} {{ "%.2f"|format(change_pct) }}%
75
+ </span>
76
+ </div>
77
+ <div class="sub-stats-row">
78
+ <div class="stat-item">
79
+ {{ interval_hours }}h High: <span class="text-green">{{ "%.6f"|format(stats.high) }} {{ stats.symbol }}</span>
80
+ </div>
81
+ <div class="stat-item">
82
+ {{ interval_hours }}h Low: <span class="text-red">{{ "%.6f"|format(stats.low) }} {{ stats.symbol }}</span>
83
+ </div>
84
+ </div>
85
+ </div>
86
+ <div class="side-stats">
87
+ <div>Supply: <span class="text-blue">{{ "%.2f"|format(stats.supply) }} {{ stats.symbol }}</span></div>
88
+ <div>Market Cap: <span class="text-steel">{{ "%.2f"|format(stats.market_cap) }} τ</span></div>
89
+ <div>Emission: <span class="text-purple">{{ "%.2f"|format(stats.emission) }} {{ stats.symbol }}</span></div>
90
+ <div>Stake: <span class="text-gold">{{ "%.2f"|format(stats.stake) }} {{ stats.symbol }}</span></div>
91
+ </div>
92
+ </div>
93
+ <div id="chart-container"></div>
94
+ <script>
95
+ var figData = {{ fig_json|safe }};
96
+ Plotly.newPlot('chart-container', figData.data, figData.layout);
97
+ </script>
98
+ </body>
99
+ </html>
@@ -0,0 +1,49 @@
1
+ <div class="subnet-header">
2
+ <div class="header-row">
3
+ <button class="back-button">&larr; Back</button>
4
+ <div class="toggle-group">
5
+ <label class="toggle-label">
6
+ <input type="checkbox" id="stake-toggle" onchange="toggleStakeView()">
7
+ Show Stakes
8
+ </label>
9
+ <label class="toggle-label">
10
+ <input type="checkbox" id="verbose-toggle" onchange="toggleVerboseNumbers()">
11
+ Precise Numbers
12
+ </label>
13
+ </div>
14
+ </div>
15
+
16
+ <div class="subnet-title-row">
17
+ <div class="title-price">
18
+ <h2 id="subnet-title"></h2>
19
+ <div class="subnet-price" id="subnet-price"></div>
20
+ </div>
21
+ <div class="network-visualization-container">
22
+ <div class="network-visualization">
23
+ <canvas id="network-canvas" width="700" height="80"></canvas>
24
+ </div>
25
+ </div>
26
+ </div>
27
+ <div class="network-metrics">
28
+ <div class="metric-card network-card">
29
+ <div class="metric-label">Moving Price</div>
30
+ <div id="network-moving-price" class="metric-value"></div>
31
+ </div>
32
+ <div class="metric-card network-card">
33
+ <div class="metric-label">Registration</div>
34
+ <div id="network-registration" class="metric-value registration-status"></div>
35
+ </div>
36
+ <div class="metric-card network-card">
37
+ <div class="metric-label">CR Weights</div>
38
+ <div id="network-cr" class="metric-value cr-status"></div>
39
+ </div>
40
+ <div class="metric-card network-card">
41
+ <div class="metric-label">Neurons</div>
42
+ <div id="network-neurons" class="metric-value"></div>
43
+ </div>
44
+ <div class="metric-card network-card">
45
+ <div class="metric-label">Blocks Since Step</div>
46
+ <div id="network-blocks-since-step" class="metric-value"></div>
47
+ </div>
48
+ </div>
49
+ </div>
@@ -0,0 +1,32 @@
1
+ {# TODO: This may be unused. #}
2
+
3
+ <div id="subnet-modal" class="modal hidden">
4
+ <div class="modal-content">
5
+ <div class="modal-header">
6
+ <h2 class="subnet-title"></h2>
7
+ <button class="close-button" onclick="closeSubnetModal()">&times;</button>
8
+ </div>
9
+ <div class="subnet-overview">
10
+ <div class="overview-item">
11
+ <span class="label">Price</span>
12
+ <span class="value price"></span>
13
+ </div>
14
+ <div class="overview-item">
15
+ <span class="label">Market Cap</span>
16
+ <span class="value market-cap"></span>
17
+ </div>
18
+ <div class="overview-item">
19
+ <span class="label">Emission Rate</span>
20
+ <span class="value emission"></span>
21
+ </div>
22
+ <div class="overview-item">
23
+ <span class="label">Your Total Stake</span>
24
+ <span class="value total-stake"></span>
25
+ </div>
26
+ </div>
27
+ <div class="stakes-section">
28
+ <h3>Your Stakes</h3>
29
+ <div class="stakes-list"></div>
30
+ </div>
31
+ </div>
32
+ </div>
@@ -0,0 +1,57 @@
1
+ <div class="metrics-section">
2
+ <div class="metrics-group market-metrics">
3
+ <div class="metric-card">
4
+ <div class="metric-label">Market Cap</div>
5
+ <div id="subnet-market-cap" class="metric-value"></div>
6
+ </div>
7
+ <div class="metric-card">
8
+ <div class="metric-label">Total Stake</div>
9
+ <div id="subnet-total-stake" class="metric-value"></div>
10
+ </div>
11
+ <div class="metric-card">
12
+ <div class="metric-label">Alpha Reserves</div>
13
+ <div id="network-alpha-in" class="metric-value"></div>
14
+ </div>
15
+ <div class="metric-card">
16
+ <div class="metric-label">Tao Reserves</div>
17
+ <div id="network-tau-in" class="metric-value"></div>
18
+ </div>
19
+ <div class="metric-card">
20
+ <div class="metric-label">Emission</div>
21
+ <div id="subnet-emission" class="metric-value"></div>
22
+ </div>
23
+ </div>
24
+
25
+ <div class="stakes-container">
26
+ <div class="stakes-header">
27
+ <h3 class="view-header">Metagraph</h3>
28
+ <div class="button-group">
29
+ <button class="manage-button add-stake-button" disabled title="Coming soon">
30
+ Add Stake (Coming soon)
31
+ </button>
32
+ <button class="manage-button export-csv-button" disabled title="Coming soon">
33
+ Export CSV (Coming soon)
34
+ </button>
35
+ </div>
36
+ </div>
37
+
38
+ <div class="stakes-table-container">
39
+ <table class="stakes-table">
40
+ <thead>
41
+ <tr>
42
+ <th>Hotkey</th>
43
+ <th>Amount</th>
44
+ <th>Value</th>
45
+ <th>Value (w/ slippage)</th>
46
+ <th>Alpha emission</th>
47
+ <th>Tao emission</th>
48
+ <th>Registered</th>
49
+ <th>Actions</th>
50
+ </tr>
51
+ </thead>
52
+ <tbody id="stakes-table-body">
53
+ </tbody>
54
+ </table>
55
+ </div>
56
+ </div>
57
+ </div>
@@ -0,0 +1,28 @@
1
+ <div class="subnets-table-container">
2
+ <table class="subnets-table">
3
+ <thead>
4
+ <tr>
5
+ <th class="sortable" onclick="sortMainTable(0)">Subnet</th>
6
+ <th class="sortable" onclick="sortMainTable(1)">Price</th>
7
+ <th class="sortable" onclick="sortMainTable(2)" data-sort="desc">Market Cap</th>
8
+ <th class="sortable" onclick="sortMainTable(3)">Your Stake</th>
9
+ <th class="sortable" onclick="sortMainTable(4)">Emission</th>
10
+ <th>Status</th>
11
+ </tr>
12
+ </thead>
13
+ <tbody>
14
+ {% for subnet in subnets %}
15
+ {% set total_your_stake = subnet.your_stakes|sum(attribute="amount") %}
16
+ {% set stake_status = 'Staked' if total_your_stake > 0 else 'Not Staked' %}
17
+ <tr class="subnet-row" onclick="showSubnetPage({{subnet.netuid}})">
18
+ <td class="subnet-name" data-value="{{subnet.netuid}}"><span style="color: #FF9900">{{subnet.netuid}}</span> - {{subnet.name}}</td>
19
+ <td class="price" data-value="{{subnet.price}}"><span class="formatted-number" data-value="{{subnet.price}}" data-symbol="{{subnet.symbol}}"></span></td>
20
+ <td class="market-cap" data-value="{{subnet.market_cap}}"><span class="formatted-number" data-value="{{subnet.market_cap}}" data-symbol="{{root_symbol_html}}"></span></td>
21
+ <td class="your-stake" data-value="{{total_your_stake}}"><span class="formatted-number" data-value="{{total_your_stake}}" data-symbol="{{subnet.symbol}}"></span></td>
22
+ <td class="emission" data-value="{{subnet.emission}}"><span class="formatted-number" data-value="{{subnet.emission}}" data-symbol="{{root_symbol_html}}"></span></td>
23
+ <td class="stake-status-cell"><span class="stake-status {{'staked' if total_your_stake > 0 else 'unstaked'}}">{{stake_status}}</span></td>
24
+ </tr>
25
+ {% endfor %}
26
+ </tbody>
27
+ </table>
28
+ </div>