forked from hush/hnomp
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
8.6 KiB
174 lines
8.6 KiB
<style>
|
|
#topCharts{
|
|
padding: 18px;
|
|
}
|
|
#topCharts > div > div > svg{
|
|
display: block;
|
|
height: 280px;
|
|
}
|
|
.chartWrapper{
|
|
background-color: #0d0d0d;
|
|
border: 1px solid #1a1a1a;
|
|
padding: 15px;
|
|
color: #999999;
|
|
}
|
|
.chartLabel{
|
|
font-size: 1.2em;
|
|
text-align: center;
|
|
padding: 4px;
|
|
color:#FFF;
|
|
}
|
|
#boxesLower {
|
|
margin: 0 9px;
|
|
}
|
|
#boxesLower > div {
|
|
display: flex;
|
|
}
|
|
#boxesLower > div > div {
|
|
flex: 1 1 auto;
|
|
margin: 0 9px 18px 9px;
|
|
padding: 10px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
.boxLowerHeader{
|
|
font-size: 1.3em;
|
|
margin: 0 0 5px 10px;
|
|
}
|
|
.nvtooltip table td.legend-color-guide div {
|
|
background-color:#FF0000 !important;
|
|
}
|
|
|
|
td{border:0px !important}
|
|
|
|
</style>
|
|
<div id="topCharts">
|
|
<div class="chartWrapper">
|
|
<div class="chartLabel">Pool Historical Hashrate</div>
|
|
<div class="chartHolder"><svg id="poolHashrate"/></div>
|
|
</div>
|
|
</div>
|
|
|
|
{{ function capitalizeFirstLetter(t){return t.charAt(0).toUpperCase()+t.slice(1)} }}
|
|
{{ function readableDate(a){ return new Date(parseInt(a)).toISOString().substring(0, 16).replace('T', ' ') + ' UTC'; } }}
|
|
|
|
<div class="pure-g-r" id="boxesLower">
|
|
{{ for(var pool in it.stats.pools) { }}
|
|
<div class="pure-u-1-2">
|
|
<div class="boxStats" id="boxStatsLeft">
|
|
<div class="boxLowerHeader">{{=capitalizeFirstLetter(it.stats.pools[pool].name)}} Pool Stats</div>
|
|
<div class="boxStatsList">
|
|
<div>
|
|
<div><i class="fa fa-users"></i><span id="statsMiners{{=pool}}">{{=it.stats.pools[pool].minerCount}}</span> Miners</div>
|
|
<div><i class="fa fa-rocket"></i><span id="statsWorkers{{=pool}}">{{=it.stats.pools[pool].workerCount}}</span> Workers</div>
|
|
<div><i class="fa fa-tachometer"></i><span id="statsHashrate{{=pool}}">{{=it.stats.pools[pool].hashrateString}}</span> (Now)</div>
|
|
<div><i class="fa fa-tachometer"></i><span id="statsHashrateAvg{{=pool}}">...</span> (Avg)</div>
|
|
<div><i class="fa fa-gavel"></i>Luck <span id="statsLuckDays{{=pool}}">{{=it.stats.pools[pool].luckDays}}</span> Days</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="pure-u-1-2">
|
|
<div class="boxStats" id="boxStatsRight">
|
|
<div class="boxLowerHeader">{{=capitalizeFirstLetter(it.stats.pools[pool].name)}} Network Stats</div>
|
|
<div class="boxStatsList">
|
|
<div>
|
|
<div><i class="fa fa-bars" aria-hidden="true"></i><small>Block Height:</small> <span id="statsNetworkBlocks{{=pool}}">{{=it.stats.pools[pool].poolStats.networkBlocks}}</span></div>
|
|
<div><i class="fa fa-tachometer"></i><small>Network Hash/s:</small> <span id="statsNetworkSols{{=pool}}">{{=it.stats.pools[pool].poolStats.networkSolsString}}</span></div>
|
|
<div><i class="fa fa-unlock-alt" aria-hidden="true"></i><small>Difficulty:</small> <span id="statsNetworkDiff{{=pool}}">{{=it.stats.pools[pool].poolStats.networkDiff}}</span></div>
|
|
<div><i class="fa fa-users"></i><small>Node Connections:</small> <span id="statsNetworkConnections{{=pool}}">{{=it.stats.pools[pool].poolStats.networkConnections}}</span></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{ } }}
|
|
</div>
|
|
|
|
{{ for(var pool in it.stats.pools) { }}
|
|
<div class="pure-g-r" id="boxesLower">
|
|
<div class="pure-u-1-1">
|
|
<div class="boxStats" id="boxStatsRight">
|
|
<div class="boxLowerHeader">{{=capitalizeFirstLetter(it.stats.pools[pool].name)}} Blocks Found
|
|
</div>
|
|
|
|
<div class="boxStatsList" style="margin-top: 9px;">
|
|
{{ for(var b in it.stats.pools[pool].pending.blocks) { }}
|
|
{{ var block = it.stats.pools[pool].pending.blocks[b].split(":"); }}
|
|
<div style="margin-bottom: 9px; background-color: #000000; min-width:600px;" title="{{if (it.stats.pools[pool].pending.confirms && it.stats.pools[pool].pending.confirms[block[0]]) { }}{{if (it.stats.pools[pool].pending.confirms[block[0]] == 1) { }}Waiting for for payment processor to review {{} else if (it.stats.pools[pool].pending.confirms[block[0]] < it.poolsConfigs[pool].paymentProcessing.minConf*2) { }}Waiting for min confirmations{{ } else { }}Queued for payment{{ } }}{{ } else { }}Waiting for payment processor to review{{ } }}">
|
|
<div style="float:left">
|
|
<i class="fa fa-bars"></i>
|
|
<small>Block:</small>
|
|
<a href="https://explorer.hush.is/block/{{=block[2]}}" target="_blank" class="mainlink">{{=block[2]}}</a>
|
|
|
|
{{if (block[4] != null) { }}
|
|
<span style="padding-left: 18px;"><small>{{=readableDate(block[4])}}</small></span></div>
|
|
{{ } }}
|
|
{{if (it.stats.pools[pool].pending.confirms && it.stats.pools[pool].pending.confirms[block[0]]) { }}
|
|
{{if (it.stats.pools[pool].pending.confirms[block[0]] == 1) { }}
|
|
<span style="float:right; color: white;"><small>*NEW*</small></span>
|
|
{{ } else { }}
|
|
<span style="float:right; color: red;"><small>*IMMATURE*</small></span>
|
|
{{ } }}
|
|
{{ } else { }}
|
|
<span style="float:right; color: white;"><small>*NEW*</small></span>
|
|
{{ } }}
|
|
</div>
|
|
{{ } }}
|
|
|
|
{{ var i=0; for(var b in it.stats.pools[pool].confirmed.blocks) { }}
|
|
{{ if (i < 8) { i++; }}
|
|
{{ var block = it.stats.pools[pool].confirmed.blocks[b].split(":"); }}
|
|
<div style="margin-bottom: 9px; background-color: #000000; min-width:600px;">
|
|
<div style="float:left"><i class="fa fa-bars"></i>
|
|
<small>Block:</small>
|
|
<a href="https://explorer.hush.is/block/{{=block[2]}}" target="_blank" class="mainlink">{{=block[2]}}</a>
|
|
|
|
{{if (block[4] != null) { }}
|
|
<span style="padding-left: 18px;"><small>{{=readableDate(block[4])}}</small></span></div>
|
|
{{ } }}
|
|
<span style="float:right; padding-left: 18px; color: green;"><small>*PAID*</small></span>
|
|
</div>
|
|
{{ } }}
|
|
{{ } }}
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{{ } }}
|
|
|
|
<script>
|
|
document.querySelector('main').appendChild(document.createElement('script')).src = '/static/stats.js';
|
|
|
|
$(function() {
|
|
window.statsSource = new EventSource("/api/live_stats");
|
|
|
|
statsSource.addEventListener('message', function (e) {
|
|
var stats = JSON.parse(e.data);
|
|
for (var pool in stats.pools) {
|
|
$('#statsMiners' + pool).text(stats.pools[pool].minerCount);
|
|
$('#statsWorkers' + pool).text(stats.pools[pool].workerCount);
|
|
$('#statsHashrate' + pool).text(stats.pools[pool].hashrateString);
|
|
$('#statsHashrateAvg' + pool).text(getReadableHashRateString(calculateAverageHashrate(pool)));
|
|
$('#statsLuckDays' + pool).text(stats.pools[pool].luckDays);
|
|
$('#statsValidBlocks' + pool).text(stats.pools[pool].poolStats.validBlocks);
|
|
$('#statsTotalPaid' + pool).text((parseFloat(stats.pools[pool].poolStats.totalPaid)).toFixed(8));
|
|
$('#statsNetworkBlocks' + pool).text(stats.pools[pool].poolStats.networkBlocks);
|
|
$('#statsNetworkDiff' + pool).text(stats.pools[pool].poolStats.networkDiff);
|
|
$('#statsNetworkSols' + pool).text(getReadableNetworkHashRateString(stats.pools[pool].poolStats.networkSols));
|
|
$('#statsNetworkConnections' + pool).text(stats.pools[pool].poolStats.networkConnections);
|
|
}
|
|
});
|
|
});
|
|
|
|
function getReadableNetworkHashRateString(hashrate){
|
|
hashrate = (hashrate * 1000000);
|
|
if (hashrate < 1000000)
|
|
return '0 Sol';
|
|
var byteUnits = [ ' Sol/s', ' KSol/s', ' MSol/s', ' GSol/s', ' TSol/s', ' PSol/s' ];
|
|
var i = Math.floor((Math.log(hashrate/1000) / Math.log(1000)) - 1);
|
|
hashrate = (hashrate/1000) / Math.pow(1000, i + 1);
|
|
return hashrate.toFixed(2) + byteUnits[i];
|
|
}
|
|
</script>
|
|
|