consensus/cmd/web/views/miners.qtpl

100 lines
4.3 KiB
Plaintext

{% import "git.gammaspectra.live/P2Pool/p2pool-observer/monero/address" %}
{% import cmdutils "git.gammaspectra.live/P2Pool/p2pool-observer/cmd/utils" %}
{% import types "git.gammaspectra.live/P2Pool/p2pool-observer/types" %}
{% import p2pooltypes "git.gammaspectra.live/P2Pool/p2pool-observer/p2pool/types" %}
{% code
type MinersPage struct {
// inherit from base page, so its' title is used in error page.
BasePage
Refresh int
Weekly bool
Miners []*MinersPageMinerEntry
WindowWeight types.Difficulty
}
%}
{% code
type MinersPageMinerEntry struct {
Address *address.Address
Alias string
SoftwareId p2pooltypes.SoftwareId
SoftwareVersion p2pooltypes.SoftwareVersion
Weight types.Difficulty
Shares *cmdutils.PositionChart
Uncles *cmdutils.PositionChart
}
%}
{% func (p *MinersPage) Title() %}
{% if p.Weekly %}
{%= p.BasePage.Title() %} - Current Window Miners
{% else %}
{%= p.BasePage.Title() %} - Weekly Miners
{% endif %}
{% endfunc %}
{% func (p *MinersPage) Content() %}
{% if p.Weekly %}
<div style="text-align: center; font-weight: bold;">
{% if p.Refresh > 0 %}
<a href="/miners?week">Autorefresh is ON ({%d p.Refresh %} s)</a>
{% else %}
<a href="/blocks?week&refresh">Autorefresh is OFF</a>
{% endif %}
</div>
{% else %}
<div style="text-align: center; font-weight: bold;">
{% if p.Refresh > 0 %}
<a href="/miners">Autorefresh is ON ({%d p.Refresh %} s)</a>
{% else %}
<a href="/blocks?refresh">Autorefresh is OFF</a>
{% endif %}
</div>
{% endif %}
<div style="text-align: center">
{% if p.Weekly %}
<h2>Weekly Miners</h2>
<p>This is a list of the miners that have shares in the last 28 full windows, or about seven days.</p>
<p class="small">Entries are sorted by current window "weight". There are more total miners currently active, but without a share to show at the moment.</p>
<p class="small">Pool share % is relative to whole pool hashrate. Miners can join or leave anytime and there is no ceiling limit. </p>
<table class="center datatable" style="border-collapse: collapse; max-width: calc(4em + 12em + 10em + 8em + 8em + 12em + 32em)">
{% else %}
<h2>Current Window Miners</h2>
<p>This is a list of the miners that have shares in the current window, and would be rewarded when a Monero block is found within the window.</p>
<p class="small">Entries are sorted by current window "weight". There are more total miners currently active, but without a share to show at the moment.</p>
<p class="small">Pool share % is relative to whole pool hashrate. Miners can join or leave anytime and there is no ceiling limit. </p>
<table class="center datatable" style="border-collapse: collapse; max-width: calc(4em + 12em + 10em + 8em + 8em + 12em + 24em)">
{% endif %}
<tr>
<th style="width: 4em;">#</th>
<th style="width: 12em;">Miner</th>
<th style="width: 10em;">Software</th>
<th style="width: 8em;">Pool share %</th>
<th style="width: 8em;">Estimated Hashrate</th>
<th style="width: 12em;">Shares found</th>
<th style="width: {% if p.Weekly %}32{% else %}24{% endif %}em;">Shares position</th>
</tr>
{% for i, m := range p.Miners %}
<tr style="padding-bottom: 10px; border-bottom: solid #aaa 1px">
<td style="vertical-align: middle">{%d i+1 %}</td>
{%= TemplateRowMinerWithTag(p.Context(), m.Address, m.Alias, "th") %}
<td style="vertical-align: middle">{%= software_info(m.SoftwareId, m.SoftwareVersion) %}</td>
{% code minerRatio := float64(m.Weight.Lo) / float64(p.WindowWeight.Lo) %}
<td style="vertical-align: middle">{%f.3 minerRatio*100 %}%</td>
<td style="vertical-align: middle">{%s si_units(minerRatio * (float64(p.Context().Pool.SideChain.LastBlock.Difficulty) / float64(p.Context().Consensus.TargetBlockTime)), 3) %}H/s</td>
<td style="vertical-align: middle">{%dul m.Shares.Total() %} block(s) +{%dul m.Uncles.Total() %} uncle(s)</td>
<td>
<code class="mono small">{%s m.Shares.String() %}</code>
<br/>
<code class="mono small">{%s m.Uncles.String() %}</code>
</td>
</tr>
{% endfor %}
</table>
</div>
{% endfunc %}