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.
master
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 !pool_configs/solo-wsb.json
redis-data/ redis-data/
.vscode/ .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.'); logger.error(logSystem, logComponent, 'Error checking pool balance before processing payments.');
return callback(true); return callback(true);
} else if (tBalance < totalOwed) { } 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; performPayment = false;
} else if (tBalance > totalOwed) { } else if (tBalance > totalOwed) {
performPayment = true; performPayment = true;

4
libs/stats.js

@ -344,7 +344,7 @@ module.exports = function(logger, portalConfig, poolConfigs){
balances.push({ balances.push({
worker:String(w), worker:String(w),
balance:workers[w].balance, balance:workers[w].balance,
paid:workers[w].paid, //paid:workers[w].paid,
immature:workers[w].immature immature:workers[w].immature
}); });
} }
@ -425,7 +425,7 @@ module.exports = function(logger, portalConfig, poolConfigs){
validShares: replies[i + 2] ? (replies[i + 2].validShares || 0) : 0, validShares: replies[i + 2] ? (replies[i + 2].validShares || 0) : 0,
validBlocks: replies[i + 2] ? (replies[i + 2].validBlocks || 0) : 0, validBlocks: replies[i + 2] ? (replies[i + 2].validBlocks || 0) : 0,
invalidShares: replies[i + 2] ? (replies[i + 2].invalidShares || 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, networkBlocks: replies[i + 2] ? (replies[i + 2].networkBlocks || 0) : 0,
networkSols: replies[i + 2] ? (replies[i + 2].networkSols || 0) : 0, networkSols: replies[i + 2] ? (replies[i + 2].networkSols || 0) : 0,
networkSolsString: getReadableNetworkHashRateString(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': '', 'home.html': '',
'getting_started.html': 'getting_started', 'getting_started.html': 'getting_started',
'stats.html': 'stats', 'stats.html': 'stats',
'tbs.html': 'tbs', // 'tbs.html': 'tbs',
'workers.html': 'workers', 'workers.html': 'workers',
'api.html': 'api', 'api.html': 'api',
// 'admin.html': 'admin', // 'admin.html': 'admin',

19
website/hush/index.html

@ -5,18 +5,15 @@
<meta charset="utf-8"> <meta charset="utf-8">
<link rel="shortcut icon" type="image/png" href="/static/hushfavicon.ico"/> <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/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/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/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/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/d3/3.4.5/d3.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/nvd3/1.8.6/nv.d3.min.js"></script>
<script src="/static/nvd3.js"></script>
<link rel="stylesheet" href="/static/nvd3.css">
<script src="/static/main.js"></script> <script src="/static/main.js"></script>
<link rel="stylesheet" href="/static/style.css"> <link rel="stylesheet" href="/static/style.css">
@ -67,6 +64,12 @@
<footer> <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> &lt;3&#128056; &middot; <a href="https://git.hush.is/hush/hnomp" target="_blank">hnomp on our own Gitea</a>
</footer> </footer>

20
website/hush/pages/api.html

@ -1,11 +1,11 @@
<div style="margin: 18px;"> <div style="margin: 18px;" align="left">
API - The API is work in progress and is subject to change during development. <p style="color:white" align="center">API - The API is work in progress and is subject to change during development.</p>
<ul> <div>
<li><a href="/api/stats">/api/stats</a> global pool stats</li> <a href="/api/stats" class="mainlink">/api/stats</a> - global pool stats<br/>
<li><a href="/api/blocks">/api/blocks</a> global block stats</li> <a href="/api/blocks" class="mainlink">/api/blocks</a> - global block stats<br/>
<li><a href="/api/pool_stats">/api/pool_stats</a> - historical stats</li> <a href="/api/pool_stats" class="mainlink">/api/pool_stats</a> - historical stats<br/>
<li><a href="/api/payments">/api/payments</a> - payment history</li> <a href="/api/payments" class="mainlink">/api/payments</a> - payment history<br/>
<li><a href="/api/worker_stats?taddr">/api/worker_stats?taddr</a> - historical time per pool json </li> <a href="/api/worker_stats?zaddr" class="mainlink">/api/worker_stats?zaddr</a> - historical time per pool json <br/>
<li><a href="/api/live_stats">/api/live_stats</a> - live stats (websocket)</li> <a href="/api/live_stats" class="mainlink">/api/live_stats</a> - live stats (websocket)<br/>
</ul> </div>
</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"> <div style="text-align:center">
<h2 style="color:#FFFFFF">ASIC Miner configuration</h2> <h2 style="color:#FFFFFF">ASIC Miner configuration</h2>
</div> </div>
<div id="holder"> <div id="holder">
<div id="coinInfoRows"> <div id="coinInfoRows">
<div id="coinInfoRowKeys"> <div id="coinInfoRowKeys" style="text-align:right">
<div>Username:</div> <div>Username:</div>
<div>Password:</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>
<div id="coinInfoRowValues"> <div id="coinInfoRowValues">
<div>your hush wallet z-address</div> <div>your hush wallet z-address</div>
<div>anything</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> </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> 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. Mining to any other addresses and invalid addresses will result in wasting electricity and no funds received for your work.
</font> </font>
<table> <table>
<tbody <tbody
<tr> <tr>
<td colspan="2"><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/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/SilentDragon/releases" target="_blank">Full Node Wallet</a></td>
</tr> </tr>
</tbody></table><br/> </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>Pool Fee:</div>
</div> </div>
<div id="coinInfoRowValues"> <div id="coinInfoRowValues">
<div>1 HUSH</div> <div>30 HUSH</div>
<div>Every 3 Hours</div> <div>Every 4 Hours</div>
<div>0.5%</div> <div>0.5%</div>
</div> </div>
</div> </div>

33
website/hush/pages/home.html

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

57
website/hush/pages/miner_stats.html

@ -1,19 +1,17 @@
<style> <style>
#topCharts{ #topCharts{
padding-left: 18px; padding-left: 18px;
padding-right: 18px; padding-right: 18px;
padding-top: 18px; padding-top: 18px;
padding-bottom: 0px; padding-bottom: 0px;
} }
#topCharts > div > div > svg{ #topCharts > div > div > svg{
display: block; display: block;
height: 280px; height: 280px;
} }
.chartWrapper{ .chartWrapper{
border: solid 1px #c7c7c7; padding: 10px;
border-radius: 5px; margin: 18px;
padding: 5px;
margin-bottom: 18px;
} }
.chartLabel{ .chartLabel{
font-size: 1.2em; font-size: 1.2em;
@ -21,40 +19,23 @@
padding: 4px; padding: 4px;
} }
.chartHolder{ .chartHolder{
padding:10px;
} height:300px;
#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;
} }
td{border:0px !important}
</style> </style>
<div style="padding-top:18px">
<div id="topCharts"> <div class="chartWrapper">
<div class="chartWrapper"> <div style="margin-right: 9px; color:white">{{=String(it.stats.address).split(".")[0]}}</div>
<div class="chartLabel"> <div align="center">
<!--<div style="float:left; padding-right: 18px;"><i class="fa fa-users"></i><span id="statsWorkers">...</span></div>--> <small><i class="fa fa-tachometer"></i> <span id="statsHashrateAvg">...</span> (Avg)</small>
<div style="float:left; margin-right: 9px;">{{=String(it.stats.address).split(".")[0]}}</div> <small><i class="fa fa-tachometer"></i> <span id="statsHashrate">...</span> (Now)</small>
<div style="float:right; padding-left: 18px;"><small><i class="fa fa-tachometer"></i> <span id="statsHashrateAvg">...</span> (Avg)</small></div> <small><i class="fa fa-gavel"></i> Luck <span id="statsLuckDays">...</span> Days</small>
<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> </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: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> 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> <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; var _workerCount = 0;
window.statsSource = new EventSource("/api/live_stats"); window.statsSource = new EventSource("/api/live_stats");
document.querySelector('main').appendChild(document.createElement('script')).src = '/static/miner_stats.js'; 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"> <script type="text/javascript">
$(function () { $(function () {
$(document).tooltip({ $(document).tooltip({
@ -60,27 +23,24 @@
</script> </script>
{{ function readableDate(a){ return new Date(parseInt(a)).toISOString().substring(0, 16).replace('T', ' ') + ' UTC'; } }} {{ function readableDate(a){ return new Date(parseInt(a)).toISOString().substring(0, 16).replace('T', ' ') + ' UTC'; } }}
{{ for(var pool in it.stats.pools) { }} {{ for(var pool in it.stats.pools) { }}
<table class="puretable">
<table class="puretable" style="padding-top:18px">
<thead> <thead>
<tr style="color:white"> <tr style="color:white">
<th>Blocks</th> <th>Transaction</th>
<th>Time</th> <th>Time</th>
<th>Miners</th>
<th>Shares</th>
</tr> </tr>
</thead> </thead>
{{ for(var p in it.stats.pools[pool].payments) { }} {{ for(var p in it.stats.pools[pool].payments) { }}
<tr> <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') { }} {{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 { }} {{ } else { }}
{{=it.stats.pools[pool].payments[p].blocks}} {{=it.stats.pools[pool].payments[p].blocks}}
{{ } }} {{ } }}
</td> </td>
<td>{{=readableDate(it.stats.pools[pool].payments[p].time)}}</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> </tr>
{{ } }} {{ } }}
</table> </table>

57
website/hush/pages/stats.html

@ -7,16 +7,16 @@
height: 280px; height: 280px;
} }
.chartWrapper{ .chartWrapper{
background-color: #0d0d0d; background-color: #0d0d0d;
border: 1px solid #1a1a1a; border: 1px solid #1a1a1a;
padding: 15px; padding: 15px;
color: #999999; color: #999999;
} }
.chartLabel{ .chartLabel{
font-size: 1.2em; font-size: 1.2em;
text-align: center; text-align: center;
padding: 4px; padding: 4px;
color:#FFF; color:#FFF;
} }
#boxesLower { #boxesLower {
margin: 0 9px; margin: 0 9px;
@ -35,25 +35,13 @@
font-size: 1.3em; font-size: 1.3em;
margin: 0 0 5px 10px; 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> </style>
<div id="topCharts"> <div id="topCharts">
<div class="chartWrapper"> <div class="chartWrapper">
<div class="chartLabel">Pool Historical Hashrate</div> <div class="chartLabel">Pool Historical Hashrate</div>
@ -106,18 +94,18 @@
<div class="boxStatsList" style="margin-top: 9px;"> <div class="boxStatsList" style="margin-top: 9px;">
{{ for(var b in it.stats.pools[pool].pending.blocks) { }} {{ for(var b in it.stats.pools[pool].pending.blocks) { }}
{{ var block = it.stats.pools[pool].pending.blocks[b].split(":"); }} {{ 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"> <div style="float:left">
<i class="fa fa-bars"></i> <i class="fa fa-bars"></i>
<small>Block:</small> <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) { }} {{if (block[4] != null) { }}
<span style="padding-left: 18px;"><small>{{=readableDate(block[4])}}</small></span></div> <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 && it.stats.pools[pool].pending.confirms[block[0]]) { }}
{{if (it.stats.pools[pool].pending.confirms[block[0]] == 1) { }} {{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 { }} {{ } else { }}
<span style="float:right; color: red;"><small>*IMMATURE*</small></span> <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="margin-bottom: 9px; background-color: #000000; min-width:600px;">
<div style="float:left"><i class="fa fa-bars"></i> <div style="float:left"><i class="fa fa-bars"></i>
<small>Block:</small> <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) { }} {{if (block[4] != null) { }}
<span style="padding-left: 18px;"><small>{{=readableDate(block[4])}}</small></span></div> <span style="padding-left: 18px;"><small>{{=readableDate(block[4])}}</small></span></div>
@ -142,6 +130,7 @@
</div> </div>
{{ } }} {{ } }}
{{ } }} {{ } }}
</div> </div>
</div> </div>
</div> </div>
@ -158,17 +147,17 @@
statsSource.addEventListener('message', function (e) { statsSource.addEventListener('message', function (e) {
var stats = JSON.parse(e.data); var stats = JSON.parse(e.data);
for (var pool in stats.pools) { 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); $('#statsWorkers' + pool).text(stats.pools[pool].workerCount);
$('#statsHashrate' + pool).text(stats.pools[pool].hashrateString); $('#statsHashrate' + pool).text(stats.pools[pool].hashrateString);
$('#statsHashrateAvg' + pool).text(getReadableHashRateString(calculateAverageHashrate(pool))); $('#statsHashrateAvg' + pool).text(getReadableHashRateString(calculateAverageHashrate(pool)));
$('#statsLuckDays' + pool).text(stats.pools[pool].luckDays); $('#statsLuckDays' + pool).text(stats.pools[pool].luckDays);
$('#statsValidBlocks' + pool).text(stats.pools[pool].poolStats.validBlocks); $('#statsValidBlocks' + pool).text(stats.pools[pool].poolStats.validBlocks);
$('#statsTotalPaid' + pool).text((parseFloat(stats.pools[pool].poolStats.totalPaid)).toFixed(8)); $('#statsTotalPaid' + pool).text((parseFloat(stats.pools[pool].poolStats.totalPaid)).toFixed(8));
$('#statsNetworkBlocks' + pool).text(stats.pools[pool].poolStats.networkBlocks); $('#statsNetworkBlocks' + pool).text(stats.pools[pool].poolStats.networkBlocks);
$('#statsNetworkDiff' + pool).text(stats.pools[pool].poolStats.networkDiff); $('#statsNetworkDiff' + pool).text(stats.pools[pool].poolStats.networkDiff);
$('#statsNetworkSols' + pool).text(getReadableNetworkHashRateString(stats.pools[pool].poolStats.networkSols)); $('#statsNetworkSols' + pool).text(getReadableNetworkHashRateString(stats.pools[pool].poolStats.networkSols));
$('#statsNetworkConnections' + pool).text(stats.pools[pool].poolStats.networkConnections); $('#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"> <script type="text/javascript">
function searchKeyPress(e) function searchKeyPress(e)
{ {
@ -46,32 +12,35 @@ function searchKeyPress(e)
} }
$(document).ready(function(){ $(document).ready(function(){
$('.btn-lg').click(function(){ $('.btn-lg').click(function(){
window.location = "workers/" + $('.input-lg').val(); window.location = "https://hushpool.is/workers/" + $('.input-lg').val();
}); });
}); });
</script> </script>
{{ function capitalizeFirstLetter(t){return t.charAt(0).toUpperCase()+t.slice(1)} }} {{ function capitalizeFirstLetter(t){return t.charAt(0).toUpperCase()+t.slice(1)} }}
{{ var i=0; for(var pool in it.stats.pools) { }} {{ var i=0; for(var pool in it.stats.pools) { }}
<div id="topPool"> <div style="padding-top:18px">
<div class="poolWrapper"> <div>
<div class="poolLabel"> <div>
<span style="float:right; margin-bottom: 8px;"> <span style="float:right; margin-bottom: 8px;">
<small>Miner Lookup: <small><span style="color:white">Miner Lookup:</span>
<input type="text" class="form-control input-lg" onkeypress="return searchKeyPress(event);"> <input type="text" class="form-control input-lg" style="width:200px" placeholder="z-address" onkeypress="return searchKeyPress(event);">
<span class="input-group-btn"> <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> </span>
</small> </small>
</span> </span>
{{=capitalizeFirstLetter(it.stats.pools[pool].name)}} Top Miners &nbsp;&nbsp; <span style="color:white">{{=capitalizeFirstLetter(it.stats.pools[pool].name)}} Miners</span>
<small><i class="fa fa-users"></i> <span id="statsMiners{{=pool}}">{{=it.stats.pools[pool].minerCount}}</span> Miners &nbsp;&nbsp; <div>
<i class="fa fa-rocket"></i> <span id="statsWorkers{{=pool}}">{{=it.stats.pools[pool].workerCount}}</span> Workers &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-cog"></i> <span id="statsWorkers{{=pool}}">{{=it.stats.pools[pool].shareCount}}</span> Shares </small> <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>
<div class="poolMinerTable"> <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>
<table class="pure-table"> <div>
<table>
<thead> <thead>
<tr> <tr style="color:white">
<th>Miner</th> <th>Miner</th>
<th>Shares</th> <th>Shares</th>
<th>Efficiency</th> <th>Efficiency</th>
@ -82,7 +51,7 @@ function searchKeyPress(e)
{{ for(var worker in it.stats.pools[pool].miners) { }} {{ for(var worker in it.stats.pools[pool].miners) { }}
{{ minerindex++; }} {{ minerindex++; }}
{{var workerstat = it.stats.pools[pool].miners[worker];}} {{var workerstat = it.stats.pools[pool].miners[worker];}}
<tr class="pure-table-odd"> <tr>
<td>Miner #{{=minerindex}}</td> <td>Miner #{{=minerindex}}</td>
<td>{{=Math.round(workerstat.currRoundShares * 100) / 100}}</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> <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() { function displayCharts() {
nv.addGraph(function() { nv.addGraph(function() {
workerHashrateChart = nv.models.lineChart() 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] }) .x(function(d){ return d[0] })
.y(function(d){ return d[1] }) .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); workerHashrateChart.xAxis.tickFormat(timeOfDayFormat);
@ -141,6 +144,9 @@ function displayCharts() {
} }
function updateStats() { function updateStats() {
console.log(JSON.stringify(statData));
totalHash = statData.totalHash; totalHash = statData.totalHash;
totalPaid = statData.paid; totalPaid = statData.paid;
totalBal = statData.balance; 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-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-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-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>'; htmlToAdd+='</div></div></div>';
$("#boxesWorkers").html($("#boxesWorkers").html()+htmlToAdd); $("#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 statData;
var poolKeys; var poolKeys;
nv.utils.windowResize(triggerChartUpdates);
function buildChartData(){ function buildChartData(){
var pools = {}; var pools = {};
@ -81,6 +83,7 @@ function displayCharts(){
nv.addGraph(function() { nv.addGraph(function() {
poolHashrateChart = nv.models.lineChart() poolHashrateChart = nv.models.lineChart()
.margin({left: 80, right: 30}) .margin({left: 80, right: 30})
.showLegend(false)
.x(function(d){ return d[0] }) .x(function(d){ return d[0] })
.y(function(d){ return d[1] }) .y(function(d){ return d[1] })
.useInteractiveGuideline(true); .useInteractiveGuideline(true);
@ -101,7 +104,6 @@ function triggerChartUpdates(){
poolHashrateChart.update(); poolHashrateChart.update();
} }
nv.utils.windowResize(triggerChartUpdates);
$.getJSON('/api/pool_stats', function(data){ $.getJSON('/api/pool_stats', function(data){
statData = data; statData = data;
@ -140,4 +142,4 @@ statsSource.addEventListener('message', function(e){
} }
triggerChartUpdates(); 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