Browse Source

hushpool.is changes and JS updates

Theme updates thanks to onryo. Some older updates never committed related to newer versions of NVD3 and jQuery that fixed a potential memory leak.
pull/4/head
fekt 2 years ago
parent
commit
6006ac6abf
  1. 2
      .gitignore
  2. 2
      libs/api.js
  3. 2
      libs/paymentProcessor.js
  4. 4
      libs/stats.js
  5. 2
      libs/website.js
  6. 19
      website/hush/index.html
  7. 20
      website/hush/pages/api.html
  8. 145
      website/hush/pages/getting_started.html
  9. 33
      website/hush/pages/home.html
  10. 57
      website/hush/pages/miner_stats.html
  11. 50
      website/hush/pages/payments.html
  12. 57
      website/hush/pages/stats.html
  13. 67
      website/hush/pages/workers.html
  14. 12
      website/hush/static/miner_stats.js
  15. 462
      website/hush/static/nvd3.css
  16. 14
      website/hush/static/nvd3.js
  17. 6
      website/hush/static/stats.js
  18. 4
      website/hush/static/style.css

2
.gitignore

@ -7,3 +7,5 @@ pool_configs/*
!pool_configs/solo-wsb.json
redis-data/
.vscode/
website/hush/static/nvd3-old.js
libs/paymentProcessor-orig.js

2
libs/api.js

@ -151,4 +151,4 @@ module.exports = function(logger, portalConfig, poolConfigs){
}
};
*/
};
};

2
libs/paymentProcessor.js

@ -969,7 +969,7 @@ function SetupForPool(logger, poolOptions, setupFinished) {
logger.error(logSystem, logComponent, 'Error checking pool balance before processing payments.');
return callback(true);
} else if (tBalance < totalOwed) {
logger.error(logSystem, logComponent, 'Insufficient [' + listunspenttype + '] funds ('+satoshisToCoins(tBalance) + ') to process payments (' + satoshisToCoins(totalOwed)+'); possibly waiting for txs.');
logger.error(logSystem, logComponent, 'Insufficient [' + listunspenttype + '] funds ('+satoshisToCoins(tBalance) + ') in ('+ poolOptions.zAddress + ') to process payments (' + satoshisToCoins(totalOwed)+'); possibly waiting for txs.');
performPayment = false;
} else if (tBalance > totalOwed) {
performPayment = true;

4
libs/stats.js

@ -344,7 +344,7 @@ module.exports = function(logger, portalConfig, poolConfigs){
balances.push({
worker:String(w),
balance:workers[w].balance,
paid:workers[w].paid,
//paid:workers[w].paid,
immature:workers[w].immature
});
}
@ -425,7 +425,7 @@ module.exports = function(logger, portalConfig, poolConfigs){
validShares: replies[i + 2] ? (replies[i + 2].validShares || 0) : 0,
validBlocks: replies[i + 2] ? (replies[i + 2].validBlocks || 0) : 0,
invalidShares: replies[i + 2] ? (replies[i + 2].invalidShares || 0) : 0,
totalPaid: replies[i + 2] ? (replies[i + 2].totalPaid || 0) : 0,
//totalPaid: replies[i + 2] ? (replies[i + 2].totalPaid || 0) : 0,
networkBlocks: replies[i + 2] ? (replies[i + 2].networkBlocks || 0) : 0,
networkSols: replies[i + 2] ? (replies[i + 2].networkSols || 0) : 0,
networkSolsString: getReadableNetworkHashRateString(replies[i + 2] ? (replies[i + 2].networkSols || 0) : 0),

2
libs/website.js

@ -38,7 +38,7 @@ module.exports = function(logger){
'home.html': '',
'getting_started.html': 'getting_started',
'stats.html': 'stats',
'tbs.html': 'tbs',
// 'tbs.html': 'tbs',
'workers.html': 'workers',
'api.html': 'api',
// 'admin.html': 'admin',

19
website/hush/index.html

@ -5,18 +5,15 @@
<meta charset="utf-8">
<link rel="shortcut icon" type="image/png" href="/static/hushfavicon.ico"/>
<link href='http://fonts.googleapis.com/css?family=Open+Sans' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.0.3/css/font-awesome.min.css">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/normalize/3.0.1/normalize.min.css">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/pure/0.4.2/pure-min.css">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/nvd3/1.8.6/nv.d3.min.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/d3/3.4.5/d3.min.js"></script>
<script src="/static/nvd3.js"></script>
<link rel="stylesheet" href="/static/nvd3.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/nvd3/1.8.6/nv.d3.min.js"></script>
<script src="/static/main.js"></script>
<link rel="stylesheet" href="/static/style.css">
@ -67,6 +64,12 @@
<footer>
<div class="links">
<a href="https://hush.is/matrix"><span style="color: #262626">[</span> matrix <span style="color: #262626">]</span></a>
<a href="https://hush.is/mastodon"><span style="color: #262626">[</span> mastodon <span style="color: #262626">]</span></a>
<a href="https://videos.hush.is"><span style="color: #262626">[</span> peertube <span style="color: #262626">]</span></a>
<a href="https://t.me/hush_main"><span style="color: #262626">[</span> telegram <span style="color: #262626">]</span></a>
</div>
&lt;3&#128056; &middot; <a href="https://git.hush.is/hush/hnomp" target="_blank">hnomp on our own Gitea</a>
</footer>

20
website/hush/pages/api.html

@ -1,11 +1,11 @@
<div style="margin: 18px;">
API - The API is work in progress and is subject to change during development.
<ul>
<li><a href="/api/stats">/api/stats</a> global pool stats</li>
<li><a href="/api/blocks">/api/blocks</a> global block stats</li>
<li><a href="/api/pool_stats">/api/pool_stats</a> - historical stats</li>
<li><a href="/api/payments">/api/payments</a> - payment history</li>
<li><a href="/api/worker_stats?taddr">/api/worker_stats?taddr</a> - historical time per pool json </li>
<li><a href="/api/live_stats">/api/live_stats</a> - live stats (websocket)</li>
</ul>
<div style="margin: 18px;" align="left">
<p style="color:white" align="center">API - The API is work in progress and is subject to change during development.</p>
<div>
<a href="/api/stats" class="mainlink">/api/stats</a> - global pool stats<br/>
<a href="/api/blocks" class="mainlink">/api/blocks</a> - global block stats<br/>
<a href="/api/pool_stats" class="mainlink">/api/pool_stats</a> - historical stats<br/>
<a href="/api/payments" class="mainlink">/api/payments</a> - payment history<br/>
<a href="/api/worker_stats?zaddr" class="mainlink">/api/worker_stats?zaddr</a> - historical time per pool json <br/>
<a href="/api/live_stats" class="mainlink">/api/live_stats</a> - live stats (websocket)<br/>
</div>
</div>

145
website/hush/pages/getting_started.html

@ -1,153 +1,34 @@
<style>
#holder{
display: flex;
flex-direction: row;
}
.glow{
box-shadow: inset 0 0 12px 4px #ff6c00;
}
.hidden{
display: none !important;
}
#menu{
background-color: #3d3d3d;
min-width: 170px;
}
#menu > .menuHeader{
color: #e3f7ff;
border-bottom: 1px solid #7f878b;
font-size: 1.2em;
padding: 16px 16px 4px 15px;
}
.menuList{
transition-duration: 200ms;
}
.menuList > a:first-child{
margin-top: 10px;
}
.menuList > a{
display: inline-block;
color: #e3f7ff;
text-decoration: none;
padding: 7px;
padding-left: 25px;
width:40px;
}
.menuList > a:hover{
color: #777777;
}
#main{
flex: 1 1 auto;
display: flex;
flex-direction: column;
margin: 18px;
}
.miningOption{
color: white;
/* display: flex;
flex: 1 1 auto;
flex-direction: row;
flex-wrap: wrap; */
min-height: 215px;
justify-content: center;
align-items: center;
text-decoration: none;
}
a.miningOption:hover{
color: #777777;
}
.miningOption:first-child{
background-color: #0d0d0d;
border: 1px solid #1a1a1a;
}
.miningOption:last-child{
background-color: #0d0d0d;
border: 1px solid #1a1a1a;
}
.miningOptionNum{
font-size: 6em;
padding-right: 20px;
width: 140px;
text-align: center;
}
.miningOptionInstructions{
flex: 1 1 auto;
padding:10px;
}
.miningOptionInstructions > div:first-child{
font-size: 2.4em;
}
.miningOptionInstructions > div:last-child{
margin-top: 20px;
font-size: 1.3em;
}
#orHolder{
height: 37px;
text-align: center;
}
#orLine{
border-bottom: 1px solid #c2cacf;
height: 19px;
margin-bottom: -13px;
}
#orText{
background-color: #ebf4fa;
color: #5c5c5c;
display: inline-block;
width: 35px;
font-style: italic;
}
#coinInfoBackground{
transition-duration: 400ms;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: black;
opacity: 0.0;
}
</style>
<div style="text-align:center">
<h2 style="color:#FFFFFF">ASIC Miner configuration</h2>
</div>
<div id="holder">
<div id="coinInfoRows">
<div id="coinInfoRowKeys">
<div id="coinInfoRowKeys" style="text-align:right">
<div>Username:</div>
<div>Password:</div>
<div>URL:</div>
<div>GPU/Medium Diff Port <small style="color:#999999">(var diff 0.5-68)</small>:</div>
<div>ASIC/Hi Diff Port <small style="color:#999999">(var diff 68-272)</small>:</div>
<div>Extra Hi Diff Port <small style="color:#999999">(var diff 272+)</small>:</div>
</div>
<div id="coinInfoRowValues">
<div>your hush wallet z-address</div>
<div>anything</div>
<div>stratum+tcp://{{=it.portalConfig.website.stratumHost}}:{{= Object.keys(it.poolsConfigs[Object.keys(it.poolsConfigs)[0]].ports)[0] }}</div>
<div>stratum+tcp://{{=it.portalConfig.website.stratumHost}}:3332</div>
<div>stratum+tcp://{{=it.portalConfig.website.stratumHost}}:3333</div>
<div>stratum+tcp://{{=it.portalConfig.website.stratumHost}}:3334</div>
</div>
</div>
</div>
<font color="white"><strong>Do not mine to an exchange address!</strong><br/><br/>
<font color="white">Choose the appropriate difficulty port based on your rigs.<br/>Port 3333 is recommended for most hobbyists mining with ASICs.<br/>Other ports are for low/medium difficulty mining or extra high difficulty.<br/><br/>
<strong>Do not mine to an exchange address!</strong><br/><br/>
Download a Hush wallet and create a z-address to mine to. Hush wallet addresses start with a <strong>zs1</strong>
Mining to any other addresses and invalid addresses will result in wasting electricity and no funds received for your work.
</font>
<table>
<tbody
<tr>
<td colspan="2"><a href="https://git.hush.is/hush/SilentDragonLite/releases" target="_blank">Lite Wallet</a></td>
<td colspan="2"><a href="https://git.hush.is/hush/SilentDragon/releases" target="_blank">Full Node Wallet</a></td>
<td colspan="2" width="50%"><a href="https://git.hush.is/hush/SilentDragonLite/releases" target="_blank">Lite Wallet</a></td>
<td colspan="2" width="50%"><a href="https://git.hush.is/hush/SilentDragon/releases" target="_blank">Full Node Wallet</a></td>
</tr>
</tbody></table><br/>
@ -158,8 +39,8 @@ Mining to any other addresses and invalid addresses will result in wasting elect
<div>Pool Fee:</div>
</div>
<div id="coinInfoRowValues">
<div>1 HUSH</div>
<div>Every 3 Hours</div>
<div>30 HUSH</div>
<div>Every 4 Hours</div>
<div>0.5%</div>
</div>
</div>

33
website/hush/pages/home.html

@ -1,6 +1,6 @@
<style>
body{
color:#808080;
color:#B3B3B3;
}
#logoImg{
height: 285px;
@ -19,20 +19,9 @@
#welcomeItems > li{
margin: 30px !important;
}
#boxesLower > div {
display: flex;
}
#boxesLower > div > div {
flex: 1 1 auto;
display: flex;
flex-direction: column;
}
.boxLowerHeader{
font-size: 1.3em;
margin: 0 0 5px 10px;
}
</style>
{{ function capitalizeFirstLetter(t){return t.charAt(0).toUpperCase()+t.slice(1)} }}
<div style="text-align:center">
<h1 style="color:#FFFFFF">hushpool.is - Mining Pool For Hush</h1>
@ -65,14 +54,16 @@
</div>
<table>
<tbody><tr>
<td><a href="https://explorer.hush.land" target="_blank">Explorer</a></td>
<td><a href="https://git.hush.is/hush" target="_blank">Gitea</a></td>
<td><a href="https://hush.land/faq.html" target="_blank">F.A.Q</a></td>
<td><a href="https://hush.land/team.html" target="_blank">Team</a></td>
<td><a href="https://hush.land">Why Hush</a></td>
<td><a href="https://hush.land/hushchat.html">HushChat</a></td>
<td><a href="https://hushpool.is">HushPool</a></td>
<td><a href="https://git.hush.is/onryo/hush-box">HushBox</a></td>
</tr>
<tr>
<td colspan="2"><a href="https://git.hush.is/hush/SilentDragonLite/releases" target="_blank">Lite Wallet</a></td>
<td colspan="2"><a href="https://git.hush.is/hush/SilentDragon/releases" target="_blank">Full Node Wallet</a></td>
<td><a href="https://explorer.hush.land">Explorer</a></td>
<td><a href="https://git.hush.is/hush">Gitea</a></td>
<td><a href="https://hush.land/faq.html">F.A.Q</a></td>
<td><a href="https://hush.land/team.html">Team</a></td>
</tr>
</tbody></table>
<br/>
@ -85,8 +76,8 @@
<div>Pool Fee:</div>
</div>
<div id="coinInfoRowValues">
<div>1 HUSH</div>
<div>Every 3 Hours</div>
<div>30 HUSH</div>
<div>Every 4 Hours</div>
<div>0.5%</div>
</div>
</div>

57
website/hush/pages/miner_stats.html

@ -1,19 +1,17 @@
<style>
#topCharts{
padding-left: 18px;
padding-right: 18px;
padding-top: 18px;
padding-bottom: 0px;
padding-right: 18px;
padding-top: 18px;
padding-bottom: 0px;
}
#topCharts > div > div > svg{
display: block;
height: 280px;
}
.chartWrapper{
border: solid 1px #c7c7c7;
border-radius: 5px;
padding: 5px;
margin-bottom: 18px;
padding: 10px;
margin: 18px;
}
.chartLabel{
font-size: 1.2em;
@ -21,40 +19,23 @@
padding: 4px;
}
.chartHolder{
}
#boxesWorkers {
margin: 0 9px;
}
#boxesWorkers > div {
display: flex;
}
#boxesWorkers > 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;
padding:10px;
height:300px;
}
td{border:0px !important}
</style>
<div id="topCharts">
<div class="chartWrapper">
<div class="chartLabel">
<!--<div style="float:left; padding-right: 18px;"><i class="fa fa-users"></i><span id="statsWorkers">...</span></div>-->
<div style="float:left; margin-right: 9px;">{{=String(it.stats.address).split(".")[0]}}</div>
<div style="float:right; padding-left: 18px;"><small><i class="fa fa-tachometer"></i> <span id="statsHashrateAvg">...</span> (Avg)</small></div>
<div style="float:right; padding-left: 18px;"><small><i class="fa fa-tachometer"></i> <span id="statsHashrate">...</span> (Now)</small></div>
<div style="float:right; padding-left: 18px;"><small><i class="fa fa-gavel"></i> Luck <span id="statsLuckDays">...</span> Days</small></div>
<div style="padding-top:18px">
<div class="chartWrapper">
<div style="margin-right: 9px; color:white">{{=String(it.stats.address).split(".")[0]}}</div>
<div align="center">
<small><i class="fa fa-tachometer"></i> <span id="statsHashrateAvg">...</span> (Avg)</small>
<small><i class="fa fa-tachometer"></i> <span id="statsHashrate">...</span> (Now)</small>
<small><i class="fa fa-gavel"></i> Luck <span id="statsLuckDays">...</span> Days</small>
</div>
<div class="chartHolder"><svg id="workerHashrate" /></div>
<div>
<div class="chartHolder"><svg id="workerHashrate" style="padding:10px"/></div>
<div style="color:white">
<div style="float:right; padding-top: 9px; padding-right: 18px;"><i class="fa fa-cog"></i> Shares: <span id="statsTotalShares">...</span></div>
<div style="float:left; padding-top: 9px; padding-left: 18px; padding-right: 18px;"><i class="fa fa-money"></i> Immature: <span id="statsTotalImmature">...</span> </div>
<div style="float:left; padding-top: 9px; padding-left: 18px; padding-right: 18px;"><i class="fa fa-money"></i> Bal: <span id="statsTotalBal">...</span> </div>
@ -70,4 +51,4 @@
var _workerCount = 0;
window.statsSource = new EventSource("/api/live_stats");
document.querySelector('main').appendChild(document.createElement('script')).src = '/static/miner_stats.js';
</script>
</script>

50
website/hush/pages/payments.html

@ -1,40 +1,3 @@
<style>
#bottomNotes {
display: block;
padding-left: 18px;
padding-right: 18px;
padding-bottom: 18px;
}
#topPool {
padding-top: 18px;
padding-left: 18px;
padding-right: 18px;
}
#topPool > div > div > svg {
display: block;
height: 280px;
}
.poolWrapper {
border: solid 1px #c7c7c7;
border-radius: 5px;
padding: 5px;
margin-bottom: 18px;
}
.poolLabel {
font-size: 1.2em;
text-align: center;
padding: 4px;
}
.poolMinerTable {
}
table {
width: 100%;
}
table td {
padding: 6px 12px;
}
</style>
<script type="text/javascript">
$(function () {
$(document).tooltip({
@ -60,27 +23,24 @@
</script>
{{ function readableDate(a){ return new Date(parseInt(a)).toISOString().substring(0, 16).replace('T', ' ') + ' UTC'; } }}
{{ for(var pool in it.stats.pools) { }}
<table class="puretable">
<table class="puretable" style="padding-top:18px">
<thead>
<tr style="color:white">
<th>Blocks</th>
<th>Transaction</th>
<th>Time</th>
<th>Miners</th>
<th>Shares</th>
</tr>
</thead>
{{ for(var p in it.stats.pools[pool].payments) { }}
<tr>
<td style="max-width: 275px; word-wrap: break-word;">
<td style="max-width: 315px; word-wrap: break-word;">
{{if (String(it.stats.pools[pool].name) == 'hush') { }}
<a href="https://explorer.hush.is/tx/{{=it.stats.pools[pool].payments[p].txid}}" title="View transaction" target="_blank" rel="noopener noreferrer">{{=it.stats.pools[pool].payments[p].blocks}}</a>
<a href="https://explorer.hush.is/tx/{{=it.stats.pools[pool].payments[p].txid}}" title="View transaction" target="_blank" rel="noopener noreferrer" class="mainlink">{{=it.stats.pools[pool].payments[p].txid}}</a>
{{ } else { }}
{{=it.stats.pools[pool].payments[p].blocks}}
{{ } }}
</td>
<td>{{=readableDate(it.stats.pools[pool].payments[p].time)}}</td>
<td>{{=it.stats.pools[pool].payments[p].miners}}</td>
<td>{{=Math.round(it.stats.pools[pool].payments[p].shares)}}</td>
</tr>
{{ } }}
</table>

57
website/hush/pages/stats.html

@ -7,16 +7,16 @@
height: 280px;
}
.chartWrapper{
background-color: #0d0d0d;
border: 1px solid #1a1a1a;
padding: 15px;
color: #999999;
background-color: #0d0d0d;
border: 1px solid #1a1a1a;
padding: 15px;
color: #999999;
}
.chartLabel{
font-size: 1.2em;
text-align: center;
padding: 4px;
color:#FFF;
color:#FFF;
}
#boxesLower {
margin: 0 9px;
@ -35,25 +35,13 @@
font-size: 1.3em;
margin: 0 0 5px 10px;
}
.nvtooltip table td.legend-color-guide div {
background-color:#FF0000 !important;
}
td{border:0px !important}
div.tooltip {
position: absolute;
text-align: center;
width: 60px;
height: 28px;
padding: 2px;
font: 12px sans-serif;
background: lightsteelblue;
border: 0px;
border-radius: 8px;
pointer-events: none;
}
#tooltip.hidden {
opacity: 0;
}
</style>
<div id="topCharts">
<div class="chartWrapper">
<div class="chartLabel">Pool Historical Hashrate</div>
@ -106,18 +94,18 @@
<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 dPoW notarization{{} 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="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">{{=block[2]}}</a>
<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: red;"><small>Waiting for Notarization</small></span>
<span style="float:right; color: white;"><small>*NEW*</small></span>
{{ } else { }}
<span style="float:right; color: red;"><small>*IMMATURE*</small></span>
{{ } }}
@ -133,7 +121,7 @@
<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">{{=block[2]}}</a>
<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>
@ -142,6 +130,7 @@
</div>
{{ } }}
{{ } }}
</div>
</div>
</div>
@ -158,17 +147,17 @@
statsSource.addEventListener('message', function (e) {
var stats = JSON.parse(e.data);
for (var pool in stats.pools) {
$('#statsMiners' + pool).text(stats.pools[pool].minerCount);
$('#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);
$('#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);
}
});
});

67
website/hush/pages/workers.html

@ -1,37 +1,3 @@
<style>
#bottomNotes {
display: block;
padding-left: 18px;
padding-right: 18px;
padding-bottom: 18px;
}
#topPool {
padding-top: 18px;
padding-left: 18px;
padding-right: 18px;
}
#topPool > div > div > svg {
display: block;
height: 280px;
}
.poolWrapper {
border: solid 1px #c7c7c7;
border-radius: 5px;
padding: 5px;
margin-bottom: 18px;
}
.poolLabel {
font-size: 1.2em;
text-align: center;
padding: 4px;
}
.poolMinerTable {
}
table {
width: 100%;
}
</style>
<script type="text/javascript">
function searchKeyPress(e)
{
@ -46,32 +12,35 @@ function searchKeyPress(e)
}
$(document).ready(function(){
$('.btn-lg').click(function(){
window.location = "workers/" + $('.input-lg').val();
window.location = "https://hushpool.is/workers/" + $('.input-lg').val();
});
});
</script>
{{ function capitalizeFirstLetter(t){return t.charAt(0).toUpperCase()+t.slice(1)} }}
{{ var i=0; for(var pool in it.stats.pools) { }}
<div id="topPool">
<div class="poolWrapper">
<div class="poolLabel">
<div style="padding-top:18px">
<div>
<div>
<span style="float:right; margin-bottom: 8px;">
<small>Miner Lookup:
<input type="text" class="form-control input-lg" onkeypress="return searchKeyPress(event);">
<small><span style="color:white">Miner Lookup:</span>
<input type="text" class="form-control input-lg" style="width:200px" placeholder="z-address" onkeypress="return searchKeyPress(event);">
<span class="input-group-btn">
<button class="btn btn-default btn-lg" type="button">Lookup</button>
<button class="btn btn-default btn-lg" type="button">Search</button>
</span>
</small>
</span>
{{=capitalizeFirstLetter(it.stats.pools[pool].name)}} Top Miners &nbsp;&nbsp;
<small><i class="fa fa-users"></i> <span id="statsMiners{{=pool}}">{{=it.stats.pools[pool].minerCount}}</span> Miners &nbsp;&nbsp;
<i class="fa fa-rocket"></i> <span id="statsWorkers{{=pool}}">{{=it.stats.pools[pool].workerCount}}</span> Workers &nbsp;&nbsp;
<i class="fa fa-cog"></i> <span id="statsWorkers{{=pool}}">{{=it.stats.pools[pool].shareCount}}</span> Shares </small>
<span style="color:white">{{=capitalizeFirstLetter(it.stats.pools[pool].name)}} Miners</span>
<div>
<small><i class="fa fa-users"></i> <span id="statsMiners{{=pool}}">{{=it.stats.pools[pool].minerCount}}</span> Miners &nbsp;&nbsp;
<i class="fa fa-rocket"></i> <span id="statsWorkers{{=pool}}">{{=it.stats.pools[pool].workerCount}}</span> Workers &nbsp;&nbsp;
<i class="fa fa-cog"></i> <span id="statsWorkers{{=pool}}">{{=it.stats.pools[pool].shareCount}}</span> Shares </small>
</div>
</div>
<div class="poolMinerTable">
<table class="pure-table">
<div style="color:white; padding:25px"><strong>Miner addresses are hidden for extreme privacy.</strong><br/><strong>Miner stats:</strong> https://hushpool.is/workers/z-address</div>
<div>
<table>
<thead>
<tr>
<tr style="color:white">
<th>Miner</th>
<th>Shares</th>
<th>Efficiency</th>
@ -82,7 +51,7 @@ function searchKeyPress(e)
{{ for(var worker in it.stats.pools[pool].miners) { }}
{{ minerindex++; }}
{{var workerstat = it.stats.pools[pool].miners[worker];}}
<tr class="pure-table-odd">
<tr>
<td>Miner #{{=minerindex}}</td>
<td>{{=Math.round(workerstat.currRoundShares * 100) / 100}}</td>
<td>{{? workerstat.shares > 0}} {{=Math.floor(10000 * workerstat.shares / (workerstat.shares + workerstat.invalidshares)) / 100}}% {{??}} 0% {{?}}</td>

12
website/hush/static/miner_stats.js

@ -125,10 +125,13 @@ function triggerChartUpdates(){
function displayCharts() {
nv.addGraph(function() {
workerHashrateChart = nv.models.lineChart()
.margin({left: 80, right: 30})
.margin({left: 80, right: 30, bottom:30, top:30})
.height(300)
.showLegend(false)
.x(function(d){ return d[0] })
.y(function(d){ return d[1] })
.useInteractiveGuideline(true);
.useInteractiveGuideline(true)
.color(["red","tomato", "Aquamarine", "greenyellow", "cyan", "darkseagreen", "deeppink", "fuchsia", "orange", "wheat", "hotpink", "indianred", "lightcoral", "lightpink", "lightsalmon", "lime"]);
workerHashrateChart.xAxis.tickFormat(timeOfDayFormat);
@ -141,6 +144,9 @@ function displayCharts() {
}
function updateStats() {
console.log(JSON.stringify(statData));
totalHash = statData.totalHash;
totalPaid = statData.paid;
totalBal = statData.balance;
@ -188,8 +194,6 @@ function addWorkerToDisplay(name, htmlSafeName, workerObj) {
htmlToAdd+='<div><i class="fa fa-shield"></i> <small>Diff:</small> <span id="statsDiff'+htmlSafeName+'">'+workerObj.diff+'</span></div>';
htmlToAdd+='<div><i class="fa fa-cog"></i> <small>Shares:</small> <span id="statsShares'+htmlSafeName+'">'+(Math.round(workerObj.currRoundShares * 100) / 100)+'</span></div>';
htmlToAdd+='<div><i class="fa fa-gavel"></i> <small>Luck <span id="statsLuckDays'+htmlSafeName+'">'+workerObj.luckDays+'</span> Days</small></div>';
htmlToAdd+='<div><i class="fa fa-money"></i> <small>Bal: <span id="statsBalance'+htmlSafeName+'">'+workerObj.balance+'</span></small></div>';
htmlToAdd+='<div><i class="fa fa-money"></i> <small>Paid: <span id="statsPaid'+htmlSafeName+'">'+workerObj.paid+'</span></small></div>';
htmlToAdd+='</div></div></div>';
$("#boxesWorkers").html($("#boxesWorkers").html()+htmlToAdd);
}

462
website/hush/static/nvd3.css

File diff suppressed because one or more lines are too long

14
website/hush/static/nvd3.js

File diff suppressed because one or more lines are too long

6
website/hush/static/stats.js

@ -4,6 +4,8 @@ var poolHashrateChart;
var statData;
var poolKeys;
nv.utils.windowResize(triggerChartUpdates);
function buildChartData(){
var pools = {};
@ -81,6 +83,7 @@ function displayCharts(){
nv.addGraph(function() {
poolHashrateChart = nv.models.lineChart()
.margin({left: 80, right: 30})
.showLegend(false)
.x(function(d){ return d[0] })
.y(function(d){ return d[1] })
.useInteractiveGuideline(true);
@ -101,7 +104,6 @@ function triggerChartUpdates(){
poolHashrateChart.update();
}
nv.utils.windowResize(triggerChartUpdates);
$.getJSON('/api/pool_stats', function(data){
statData = data;
@ -140,4 +142,4 @@ statsSource.addEventListener('message', function(e){
}
triggerChartUpdates();
}
});
});

4
website/hush/static/style.css

@ -1,3 +1 @@
html{background:#101010;overflow-y:scroll}body{display:flex;flex-direction:column;max-width:1160px;margin:0 auto;color:#fff}header>.home-menu{background:inherit!important;height:54px;display:flex}header>.home-menu>a.pure-menu-heading,header>.home-menu>ul,header>.home-menu>ul>li{display:flex!important;align-items:center;justify-content:center;line-height:normal!important}header>.home-menu>a.pure-menu-heading{color:#fff;font-size:1.5em}header>.home-menu>ul>li>a{color:#ced4d9}header>.home-menu>ul>li>a:focus,header>.home-menu>ul>li>a:hover{background:inherit!important}header>.home-menu>ul>li.pure-menu-selected>a,header>.home-menu>ul>li>a:hover{color:#fff}main{background-color:#101010;position:relative}footer{text-align:center;color:#b3b3b3;text-decoration:none;font-size:.8em;padding:15px;line-height:24px}footer a{color:#fff;text-decoration:none}footer iframe{vertical-align:middle}body{background-color:#101010;max-width:820px;margin:auto;color:grey;text-align:center}table{width:100%;border-collapse:collapse;margin-top:15px}td{border:1px solid #1a1a1a;font-size:16px;padding:.5em}td:hover{background-color:#1a1a1a}pre{background-color:#0d0d0d;border:1px solid #1a1a1a;font-size:6px;padding:15px;color:#999}details{cursor:pointer;background-color:#0d0d0d;text-align:left;margin-top:15px;padding:.5em;border:1px solid #1a1a1a;font-size:13px;word-wrap:break-word}summary{outline:0;padding:.4em}.blockt{border:1px solid #1a1a1a;padding:.15em;background-color:#0d0d0d;margin-top:15px;text-align:left;font-size:13px;word-wrap:break-word}.blockt p{padding-left:.7em;padding-right:.7em}.button:link{float:right;font-size:10px}.mainlink:link{text-decoration:dotted underline;text-underline-position:under}.mainlink:hover{text-decoration:none;color:#595959}.links{margin:15px;font-size:13px}a:link{color:grey;text-decoration:none}a:visited{color:grey}a:hover{color:grey}*{scrollbar-width:thin;scrollbar-color:#333333 #101010}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-thumb{background:#333}@font-face{font-family:'Ubuntu Mono';src:url('UbuntuMono.ttf') format('truetype')}.pure-g-r [class*=pure-u]{font-family:'Ubuntu Mono'}button,html,input,select,svg text,textarea{font-family:'Ubuntu Mono'}text{fill:#808080}#boxStatsLeft{background-color:#0d0d0d;border:1px solid #1a1a1a;padding:15px;color:#999}#boxStatsRight{background-color:#0d0d0d;border:1px solid #1a1a1a;padding:15px;color:#999}.boxStatsList{display:flex;flex-flow:row wrap;justify-content:space-around;opacity:.77;margin-bottom:5px;flex:1 1 auto}.boxStatsList i.fa{height:15px;width:33px;text-align:center}.boxStatsList>div{padding:5px 20px}.boxStatsList>div>div{padding:3px}.nv-group.nv-series-0,.nv-series:first-of-type .nv-legend-symbol{stroke-opacity:1;fill-opacity:0.5;fill:#FF0000!important;stroke:#FF0000!important}pre{background-color:#0d0d0d;border:1px solid #1a1a1a;padding:15px;font-size:6px;color:#999}#coinInfo{display:flex;flex-direction:column;color:#fff;width:750px;min-height:400px;top:50px;left:50%;margin-left:-375px;position:absolute}#coinInfo .coinInfoName{text-transform:capitalize}#coinInfo>div:first-of-type{font-size:1.8em;text-align:center;margin-top:40px;margin-bottom:35px}#coinInfoRows{display:flex;flex-direction:row;justify-content:center;flex:1 1 auto;margin-bottom:20px;background-color:#0d0d0d;border:1px solid #1a1a1a;padding:15px;color:#999}#coinInfoRows>div{display:flex;flex-direction:column;justify-content:center}#coinInfoRows>div>div{padding:3px}#coinInfoRowKeys{font-weight:700;padding-right:30px;color:#FFFFFF;}#coinInfoRowKeys .coinInfoSubtle{font-weight:400}#coinInfoClose{position:absolute;font-size:3em;top:0;right:0;width:60px;height:60px;text-align:center;color:#fff;text-decoration:none}#coinInfoClose:hover{color:#50f0e3}.standardBox{background-color:#0d0d0d;border:1px solid #1a1a1a;padding:15px;color:#999}.boxLowerHeader{color:#FFF}
html{background:#101010;overflow-y:scroll}body{display:flex;flex-direction:column;max-width:1160px;margin:0 auto;color:#fff}header>.home-menu{background:inherit!important;height:54px;display:flex}header>.home-menu>a.pure-menu-heading,header>.home-menu>ul,header>.home-menu>ul>li{display:flex!important;align-items:center;justify-content:center;line-height:normal!important}header>.home-menu>a.pure-menu-heading{color:#fff;font-size:1.5em}header>.home-menu>ul>li>a{color:#ced4d9}header>.home-menu>ul>li>a:focus,header>.home-menu>ul>li>a:hover{background:inherit!important}header>.home-menu>ul>li.pure-menu-selected>a,header>.home-menu>ul>li>a:hover{color:#fff}main{background-color:#101010;position:relative}footer{text-align:center;color:#b3b3b3;text-decoration:none;font-size:.8em;padding:15px;line-height:24px}footer a{color:#fff;text-decoration:none}footer iframe{vertical-align:middle}body{background-color:#101010;max-width:820px;margin:auto;color:grey;text-align:center}table{width:100%;border-collapse:collapse;margin-top:15px}td{border:1px solid #1a1a1a;font-size:16px;padding:.5em}td:hover{background-color:#1a1a1a}pre{background-color:#0d0d0d;border:1px solid #1a1a1a;font-size:6px;padding:15px;color:#e6e6e6}details{cursor:pointer;background-color:#0d0d0d;text-align:left;margin-top:15px;padding:.5em;border:1px solid #1a1a1a;font-size:13px;word-wrap:break-word}summary{outline:0;padding:.4em}.blockt{border:1px solid #1a1a1a;padding:.15em;background-color:#0d0d0d;margin-top:15px;text-align:left;font-size:13px;word-wrap:break-word}.blockt p{padding-left:.7em;padding-right:.7em}.button:link{float:right;font-size:10px}.mainlink:link{text-decoration:dotted underline;text-underline-position:under}.mainlink:hover{text-decoration:none;color:#595959}.links{margin:15px;font-size:13px}a:link{color:#b3b3b3;text-decoration:none}a:visited{color:#b3b3b3}a:hover{color:#b3b3b3}*{scrollbar-width:thin;scrollbar-color:#333333 #101010}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-thumb{background:#333}@font-face{font-family:'Ubuntu Mono';src:url('UbuntuMono.ttf') format('truetype')}.pure-g-r [class*=pure-u]{font-family:'Ubuntu Mono'}button,html,input,select,svg text,textarea{font-family:'Ubuntu Mono'}text{fill:#B3B3B3}#boxStatsLeft{background-color:#0d0d0d;border:1px solid #1a1a1a;padding:15px;color:#999}#boxStatsRight{background-color:#0d0d0d;border:1px solid #1a1a1a;padding:15px;color:#999}.boxStatsList{display:flex;flex-flow:row wrap;justify-content:space-around;opacity:.77;margin-bottom:5px;flex:1 1 auto}.boxStatsList i.fa{height:15px;width:33px;text-align:center}.boxStatsList>div{padding:5px 20px}.boxStatsList>div>div{padding:3px}.nv-group.nv-series-0,.nv-series:first-of-type .nv-legend-symbol{stroke-opacity:1;fill-opacity:0.5;fill:#FF0000!important;stroke:#FF0000!important}#coinInfo{display:flex;flex-direction:column;color:#fff;width:750px;min-height:400px;top:50px;left:50%;margin-left:-375px;position:absolute}#coinInfo .coinInfoName{text-transform:capitalize}#coinInfo>div:first-of-type{font-size:1.8em;text-align:center;margin-top:40px;margin-bottom:35px}#coinInfoRows{display:flex;flex-direction:row;justify-content:center;flex:1 1 auto;margin-bottom:20px;background-color:#0d0d0d;border:1px solid #1a1a1a;padding:15px;color:#999}#coinInfoRows>div{display:flex;flex-direction:column;justify-content:center}#coinInfoRows>div>div{padding:3px}#coinInfoRowKeys{font-weight:700;padding-right:30px;color:#fff}#coinInfoRowKeys .coinInfoSubtle{font-weight:400}#coinInfoClose{position:absolute;font-size:3em;top:0;right:0;width:60px;height:60px;text-align:center;color:#fff;text-decoration:none}#coinInfoClose:hover{color:#50f0e3}.standardBox{background-color:#0d0d0d;border:1px solid #1a1a1a;padding:15px;color:#999}.boxLowerHeader{color:#fff}#boxesLower>div{display:flex}#boxesLower>div>div{flex:1 1 auto;display:flex;flex-direction:column}.boxLowerHeader{font-size:1.3em;margin:0 0 5px 10px}.mainlink:link { text-decoration: dotted underline; text-underline-position: under }.nvtooltip{color: #FFF;background-color: #000;}
Loading…
Cancel
Save