Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 3 additions & 10 deletions bittensor_cli/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,6 @@
prompt_for_identity,
validate_uri,
prompt_for_subnet_identity,
print_linux_dependency_message,
is_linux,
validate_rate_tolerance,
)

Expand Down Expand Up @@ -4875,9 +4873,6 @@ def subnets_price(
if all_netuids and not json_output:
html_output = True

if html_output and is_linux():
print_linux_dependency_message()

return self._run_command(
price.price(
self.initialize_chain(network),
Expand Down Expand Up @@ -5655,7 +5650,7 @@ def view_dashboard(
help="Coldkey SS58 address to view dashboard for",
),
use_wry: bool = typer.Option(
False, "--use-wry", help="Use PyWry instead of browser window"
False, "--use-wry", "--html", help="Display output in browser window."
),
save_file: bool = typer.Option(
False, "--save-file", "--save", help="Save the dashboard HTML file"
Expand All @@ -5668,12 +5663,10 @@ def view_dashboard(
Display html dashboard with subnets list, stake, and neuron information.
"""
self.verbosity_handler(quiet, verbose)
if use_wry and is_linux():
print_linux_dependency_message()

if use_wry and save_file:
print_error("Cannot save file when using PyWry.")
raise typer.Exit()
print_error("Cannot save file when using browser output.")
return

if save_file:
if not dashboard_path:
Expand Down
24 changes: 24 additions & 0 deletions bittensor_cli/src/bittensor/templates/main-filters.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<div class="filters-section">
<div class="search-box">
<input type="text" id="subnet-search" placeholder="search for name, or netuid..." onkeyup="filterSubnets()">
</div>
<div class="filter-toggles">
<label>
<input type="checkbox" id="show-verbose" onchange="toggleVerboseNumbers()">
Precise Numbers
</label>
<label>
<input type="checkbox" id="show-staked" onchange="filterSubnets()">
Show Only Staked
</label>
<label>
<input type="checkbox" id="show-tiles" onchange="toggleTileView()" checked>
Tile View
</label>
<label class="disabled-label" title="Coming soon">
<input type="checkbox" id="live-mode" disabled>
Live Mode (coming soon)
</label>
</div>
</div>
<div id="subnet-tiles-container" class="subnet-tiles-container"></div>
36 changes: 36 additions & 0 deletions bittensor_cli/src/bittensor/templates/main-header.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{#
vars:
wallet_info.coldkey, truncated_coldkey, wallet_info.balance, root_symbol_html, wallet_info.total_ideal_stake_value,
slippage_percentage, wallet_info.total_slippage_value, block_number
#}

<div class="header">
<meta charset="UTF-8">
<div class="wallet-info">
<span class="wallet-name">{{ wallet_info.name }}</span>
<div class="wallet-address-container" onclick="copyToClipboard('{{ coldkey }}', this)">
<span class="wallet-address" title="Click to copy">{{ truncated_coldkey }}}</span>
<span class="copy-indicator">Copy</span>
</div>
</div>
<div class="stake-metrics">
<div class="stake-metric">
<span class="metric-label">Block</span>
<span class="metric-value" style="color: #FF9900;">{{ block_number }}</span>
</div>
<div class="stake-metric">
<span class="metric-label">Balance</span>
<span class="metric-value">{{ "%.4f"|format(wallet_info.balance) }} {{ root_symbol_html }}</span>
</div>
<div class="stake-metric">
<span class="metric-label">Total Stake Value</span>
<span class="metric-value">{{ "%.4f"|format(wallet_info.total_ideal_stake_value) }} {{ root_symbol_html }}</span>
</div>
<div class="stake-metric">
<span class="metric-label">Slippage Impact</span>
<span class="metric-value slippage-value">
{{ "%.2f"|format(slippage_percentage) }}% <span class="slippage-detail">({{ "%.4f"|format(wallet_info.total_slippage_value) }} {{ root_symbol_html }})</span>
</span>
</div>
</div>
</div>
111 changes: 111 additions & 0 deletions bittensor_cli/src/bittensor/templates/neuron-details.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
<div id="neuron-detail-container" style="display: none;">
<div class="neuron-detail-header">
<button class="back-button neuron-detail-back" onclick="closeNeuronDetails()">&larr; Back</button>
</div>
<div class="neuron-detail-content">
<div class="neuron-info-top">
<h2 class="neuron-name" id="neuron-name"></h2>
<div class="neuron-keys">
<div class="hotkey-label">
<span style="color: #FF9900;">Hotkey:</span>
<span id="neuron-hotkey" class="truncated-address"></span>
</div>
<div class="coldkey-label">
<span style="color: #FF9900;">Coldkey:</span>
<span id="neuron-coldkey" class="truncated-address"></span>
</div>
</div>
</div>
<div class="neuron-cards-container">
<!-- First row: Stakes, Dividends, Incentive, Emissions -->
<div class="neuron-metrics-row">
<div class="metric-card">
<div class="metric-label">Stake Weight</div>
<div id="neuron-stake-total" class="metric-value formatted-number"
data-value="0" data-symbol=""></div>
</div>

<div class="metric-card">
<div class="metric-label">Stake (Alpha)</div>
<div id="neuron-stake-token" class="metric-value formatted-number"
data-value="0" data-symbol=""></div>
</div>

<div class="metric-card">
<div class="metric-label">Stake (Root)</div>
<div id="neuron-stake-root" class="metric-value formatted-number"
data-value="0" data-symbol="&#x03C4;"></div>
</div>

<div class="metric-card">
<div class="metric-label">Dividends</div>
<div id="neuron-dividends" class="metric-value formatted-number"
data-value="0" data-symbol=""></div>
</div>

<div class="metric-card">
<div class="metric-label">Incentive</div>
<div id="neuron-incentive" class="metric-value formatted-number"
data-value="0" data-symbol=""></div>
</div>

<div class="metric-card">
<div class="metric-label">Emissions</div>
<div id="neuron-emissions" class="metric-value formatted-number"
data-value="0" data-symbol=""></div>
</div>
</div>

<!-- Second row: Rank, Trust, Pruning Score, Validator Permit, Consensus, Last Update -->
<div class="neuron-metrics-row">
<div class="metric-card">
<div class="metric-label">Rank</div>
<div id="neuron-rank" class="metric-value"></div>
</div>

<div class="metric-card">
<div class="metric-label">Trust</div>
<div id="neuron-trust" class="metric-value"></div>
</div>

<div class="metric-card">
<div class="metric-label">Pruning Score</div>
<div id="neuron-pruning-score" class="metric-value"></div>
</div>

<div class="metric-card">
<div class="metric-label">Validator Permit</div>
<div id="neuron-validator-permit" class="metric-value"></div>
</div>

<div class="metric-card">
<div class="metric-label">Consensus</div>
<div id="neuron-consensus" class="metric-value"></div>
</div>

<div class="metric-card">
<div class="metric-label">Last Update</div>
<div id="neuron-last-update" class="metric-value"></div>
</div>
</div>

<!-- Third row: Reg Block, IP Info, Active -->
<div class="neuron-metrics-row last-row">
<div class="metric-card">
<div class="metric-label">Reg Block</div>
<div id="neuron-reg-block" class="metric-value"></div>
</div>

<div class="metric-card">
<div class="metric-label">IP Info</div>
<div id="neuron-ipinfo" class="metric-value"></div>
</div>

<div class="metric-card">
<div class="metric-label">Active</div>
<div id="neuron-active" class="metric-value"></div>
</div>
</div>
</div>
</div>
</div>
113 changes: 113 additions & 0 deletions bittensor_cli/src/bittensor/templates/price-multi.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
<style>
body {
background-color: #000;
color: #fff;
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
}
.container {
display: flex;
flex-direction: column;
gap: 60px;
}
#multi-subnet-chart {
width: 90vw;
height: 70vh;
margin-bottom: 40px;
}
.subnet-buttons {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(80px, 1fr));
gap: 8px;
max-height: 120px;
overflow-y: auto;
padding-right: 10px;
margin-top: 50px;
border-top: 1px solid rgba(255,255,255,0.1);
padding-top: 50px;
position: relative;
bottom: 0;
}
.subnet-buttons::-webkit-scrollbar {
width: 8px;
}
.subnet-buttons::-webkit-scrollbar-track {
background: rgba(50,50,50,0.3);
border-radius: 4px;
}
.subnet-buttons::-webkit-scrollbar-thumb {
background: rgba(100,100,100,0.8);
border-radius: 4px;
}
.subnet-button {
background-color: rgba(50,50,50,0.8);
border: 1px solid rgba(70,70,70,0.9);
color: white;
padding: 8px 16px;
cursor: pointer;
border-radius: 4px;
font-size: 14px;
transition: background-color 0.2s;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.subnet-button:hover {
background-color: rgba(70,70,70,0.9);
}
.subnet-button.active {
background-color: rgba(100,100,100,0.9);
border-color: rgba(120,120,120,1);
}
</style>
</head>
<body>
<div class="container">
<div id="multi-subnet-chart"></div>
<div class="subnet-buttons">
<button class="subnet-button active" onclick="setAll()">All</button>
{% for netuid in sorted_subnet_keys %}
<button class="subnet-button" onclick="setSubnet({{ netuid }})">S{{ netuid }}</button>
{% endfor %}
</div>
</div>
<script>
const figData = {{ fig_json|safe }};
const allVisibility = {{ all_visibility|tojson|safe }};
const allAnnotations = {{ all_annotations|tojson|safe }};

const subnetModes = {{ subnet_modes|tojson|safe }};

Plotly.newPlot('multi-subnet-chart', figData.data, figData.layout);

function clearActiveButtons() {
document.querySelectorAll('.subnet-button').forEach(btn => btn.classList.remove('active'));
}

function setAll() {
clearActiveButtons();
event.currentTarget.classList.add('active');
Plotly.update('multi-subnet-chart',
{visible: allVisibility},
{annotations: allAnnotations}
);
}

function setSubnet(netuid) {
clearActiveButtons();
event.currentTarget.classList.add('active');
const mode = subnetModes[netuid];
Plotly.update('multi-subnet-chart',
{visible: mode.visible},
{annotations: mode.annotations}
);
}
</script>
</body>
</html>
Loading
Loading