Browse Source

updated README.md

dev
jahway603 3 years ago
parent
commit
4d90585f72
  1. 40
      README.md
  2. 19
      misc/example_nginx
  3. 3
      website/default/index.html
  4. 102
      website/piratepool.io/index.html
  5. 2798
      website/piratepool.io/key.html
  6. 50
      website/piratepool.io/pages/admin.html
  7. 11
      website/piratepool.io/pages/api.html
  8. 219
      website/piratepool.io/pages/getting_started.html
  9. 98
      website/piratepool.io/pages/home.html
  10. 34
      website/piratepool.io/pages/miner_stats.html
  11. 25
      website/piratepool.io/pages/mining_key.html
  12. 68
      website/piratepool.io/pages/payments.html
  13. 112
      website/piratepool.io/pages/stats.html
  14. 30
      website/piratepool.io/pages/tbs.html
  15. 56
      website/piratepool.io/pages/workers.html
  16. 100
      website/piratepool.io/static/admin.js
  17. BIN
      website/piratepool.io/static/favicon.png
  18. BIN
      website/piratepool.io/static/favicon/android-icon-144x144.png
  19. BIN
      website/piratepool.io/static/favicon/android-icon-192x192.png
  20. BIN
      website/piratepool.io/static/favicon/android-icon-36x36.png
  21. BIN
      website/piratepool.io/static/favicon/android-icon-48x48.png
  22. BIN
      website/piratepool.io/static/favicon/android-icon-72x72.png
  23. BIN
      website/piratepool.io/static/favicon/android-icon-96x96.png
  24. BIN
      website/piratepool.io/static/favicon/apple-icon-114x114.png
  25. BIN
      website/piratepool.io/static/favicon/apple-icon-120x120.png
  26. BIN
      website/piratepool.io/static/favicon/apple-icon-144x144.png
  27. BIN
      website/piratepool.io/static/favicon/apple-icon-152x152.png
  28. BIN
      website/piratepool.io/static/favicon/apple-icon-180x180.png
  29. BIN
      website/piratepool.io/static/favicon/apple-icon-57x57.png
  30. BIN
      website/piratepool.io/static/favicon/apple-icon-60x60.png
  31. BIN
      website/piratepool.io/static/favicon/apple-icon-72x72.png
  32. BIN
      website/piratepool.io/static/favicon/apple-icon-76x76.png
  33. BIN
      website/piratepool.io/static/favicon/apple-icon-precomposed.png
  34. BIN
      website/piratepool.io/static/favicon/apple-icon.png
  35. 2
      website/piratepool.io/static/favicon/browserconfig.xml
  36. BIN
      website/piratepool.io/static/favicon/favicon-16x16.png
  37. BIN
      website/piratepool.io/static/favicon/favicon-32x32.png
  38. BIN
      website/piratepool.io/static/favicon/favicon-96x96.png
  39. BIN
      website/piratepool.io/static/favicon/favicon.ico
  40. 41
      website/piratepool.io/static/favicon/manifest.json
  41. BIN
      website/piratepool.io/static/favicon/ms-icon-144x144.png
  42. BIN
      website/piratepool.io/static/favicon/ms-icon-150x150.png
  43. BIN
      website/piratepool.io/static/favicon/ms-icon-310x310.png
  44. BIN
      website/piratepool.io/static/favicon/ms-icon-70x70.png
  45. 3
      website/piratepool.io/static/home.js
  46. 13
      website/piratepool.io/static/kmdfavicon.svg
  47. BIN
      website/piratepool.io/static/komodo-logo-horizontal-01.png
  48. 13
      website/piratepool.io/static/logo.svg
  49. 208
      website/piratepool.io/static/main.js
  50. 237
      website/piratepool.io/static/miner_stats.js
  51. 83
      website/piratepool.io/static/payments.js
  52. BIN
      website/piratepool.io/static/pirate128.png
  53. BIN
      website/piratepool.io/static/skull.png
  54. BIN
      website/piratepool.io/static/skull256.png
  55. 149
      website/piratepool.io/static/stats.js
  56. 557
      website/piratepool.io/static/style.css
  57. 79
      website/piratepool.io/static/workers.js

40
README.md

@ -2,6 +2,7 @@
## Table of Contents
* [Differences between this and Z-NOMP](#differences-between-this-and-z-nomp)
* [Pre Steps](#pre-steps)
* [Using Docker (easy)](#using-docker-easy)
* [Bare metal installation](#bare-metal-installation)
* [Continued Installation on either setup](#continued-installation-on-either-setup)
@ -13,6 +14,30 @@
* This is meant for Hush and Hush smartchain mining
* ZEC/ZEN specific stuff is removed
## Pre Steps
1. Build and run the HUSH Daemon (hushd). In order to not duplicate documentation, please follow the instructions in the [hush3 repository here](https://git.hush.is/hush/hush3/src/branch/master/INSTALL.md) before proceeding.
1. Next, start up hushd which should start downloading the HUSH blockchain. This might take a couple of hours or longer, depending on system speed/network connection.
_If you are setting up a single chain to mine and/or don't know what pubkey is, skip this step and use the startup params for the hushd daemon as provided by the individual coin's team._
```shell
cd ~/hush3/src
./smartchains
```
### Configure Stratum
Once all the blockchains you want on your pool have synced up we can configure the stratum. We need node and npm installed to start and recommend you install them via your Linux OS's package manager.
```shell
cd ~
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
```
Now, let's build our stratum and run it. This will install the pool and configure it for all the smartchains on your system automatically. It must be run from the same user as the coin deamons were launched, as it pulls the rpcuser/pass from the conf file in the home directory.
```shell
git clone https://git.hush.is/hush/hnomp.git
```
## Using Docker (easy)
This method sets up 2 docker containers, one with hnomp and one with redis.
@ -23,7 +48,8 @@ The ports it listens on must not be in use, this includes 8080 for the website,
It is currently untested, but config.json has the ports as line items, so perhaps they can be changed in that file.
### Requirements
[Install Docker](https://docs.docker.com/engine/install/) and [docker-compose](https://docs.docker.com/compose/install/)
[Install Docker](https://docs.docker.com/engine/install/) and [docker-compose](https://docs.docker.com/compose/install/).
I always install thru my Linux OS Package manager (apt install docker docker-compose) instead. Find what works for you.
### Docker Install
```
@ -32,7 +58,7 @@ cd ./hnomp
cp config_example.json config.json
```
* **Next follow this [new config document](CONFIGURE.md) and then come back to this one & start to get Docker up and running.**
**Next follow this [new config document](CONFIGURE.md) and then come back to this one & start to get Docker up and running.**
Then run the following command in the hnomp directory.
```
@ -47,7 +73,7 @@ docker-compose down
### To rebuild and update Docker version
```
docker-compose down
docker rmi knomp_knomp
docker rmi hnomp_hnomp
git pull
docker-compose up &
```
@ -70,19 +96,13 @@ npm install
npm start
```
## Continued Installation on either setup
**Note: This setup from here-on applies to both Docker and bare-metal installations.**
### Install Daemon
### Install Stratum
```shell
# The following packages are needed to build both Hush and this stratum:
sudo apt-get update
sudo apt-get install build-essential pkg-config libc6-dev m4 g++-multilib autoconf libtool ncurses-dev unzip git python python-zmq zlib1g-dev wget libcurl4-openssl-dev bsdmainutils automake curl libboost-dev libboost-system-dev libsodium-dev jq redis-server nano -y
```
Now, let's build the Hush daemon. In order to not duplicate documentation, please follow the instructions in the [hush3 repository here](https://git.hush.is/hush/hush3/src/branch/master/INSTALL.md) before proceeding.
Now, start up the Hush deamon which should start downloading its blockchain. This might take a couple of hours to a day to sync, depending on system speed/network connection.
_If you are setting up a single chain to mine and/or don't know what pubkey is, skip this step and use the startup params for the hushd daemon as provided by the individual coin's team._
```shell

19
misc/example_nginx

@ -0,0 +1,19 @@
server {
listen 80;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ =404;
}
location ~ .$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
}

3
website/default/index.html

@ -22,7 +22,6 @@
<link rel="stylesheet" href="/static/style.css">
<title>hnomp</title>
</head>
<body>
@ -42,7 +41,7 @@
<li class="{{? it.selected === 'stats' }}pure-menu-selected{{?}}">
<a class="hot-swapper" href="/stats">
<i class="fa fa-bar-chart-o"></i>&nbsp;
Graph Stats
Pool Stats
</a>
</li>
<li class="{{? it.selected === 'tbs' }}pure-menu-selected{{?}}">

102
website/piratepool.io/index.html

@ -1,102 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>piratepool.io - mining pool for PirateChain (ARRR) - the most private and anonymous mineable cryptocurrency - Pirate</title>
<meta name="description" content="The first and largest mining pool for PirateChain (ARRR). Low fees with 66% of proceeds donated to development and marketing efforts. The most private and anonymous cryptocurrency in existence is mineable here on the Equihash algorithm by CPU, GPU, ASIC, NiceHash. - Pirate">
<meta name="keywords" content="PirateChain,Pirate,ARRR,mining,pool,equihash,komodo,dpow,privacy,private,freedom">
<meta name="robots" content="index, follow">
<meta property="og:locale" content="en_EN">
<meta property="og:type" content="website">
<meta property="og:title" content="PiratePool.io - mining pool for PirateChain (ARRR) - the most private mineable cryptocurrency - Pirate">
<meta property="og:site_name" content="PiratePool.io - mining pool for PirateChain (ARRR)">
<meta property="og:description" content="The first and largest mining pool for PirateChain (ARRR). Low fees with 66% of proceeds donated to development and marketing efforts. The most private and anonymous cryptocurrency in existence is mineable here on the Equihash algorithm by CPU, GPU, ASIC, NiceHash. - Pirate">
<meta property="og:url" content="https://piratepool.io">
<meta property="og:image" content="https://piratepool.io/static/pirate128.png">
<meta property="og:image:secure_url" content="https://piratepool.io/static/pirate128.png">
<meta property="og:image:width" content="128">
<meta property="og:image:height" content="128">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:description" content="The first and largest mining pool for PirateChain (ARRR). Low fees with 66% of proceeds donated to development and marketing efforts. The most private and anonymous cryptocurrency in existence is mineable here on the Equihash algorithm by CPU, GPU, ASIC, NiceHash. - Pirate">
<meta name="twitter:title" content="PiratePool.io - mining pool for PirateChain (ARRR) - the most private mineable cryptocurrency - Pirate">
<meta name="twitter:site" content="@webworker01">
<meta name="twitter:image" content="https://piratepool.io/static/pirate128.png">
<meta name="twitter:creator" content="@webworker01">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Bai+Jamjuree|Roboto" />
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.3.1/css/all.css" integrity="sha384-mzrmE5qonljUremFsqc01SB46JvROS7bZs3IO2EmfFsd15uHvIt+Y8vEf7N7fWAU" crossorigin="anonymous" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/pure/1.0.0/base-min.css" integrity="sha256-XsW+lsCsaHybdLLnHWsTuwb9A2NuD2hVVlsxtiipTZQ=" crossorigin="anonymous" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/pure/1.0.0/pure-min.css" integrity="sha256-Q0zCrUs2IfXWYx0uMKJfG93CvF6oVII21waYsAV4/8Q=" crossorigin="anonymous" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/nvd3/1.8.6/nv.d3.min.css" integrity="sha256-bmrwGjHOoD7azP+ZpGcOOitUNUGNRjwzjK1bZeTK6fI=" crossorigin="anonymous" />
<link rel="stylesheet" href="/static/style.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js" integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.min.js" integrity="sha256-dsOXGNHAo/syFnazt+KTBsCQeRmlcW1XKL0bCK4Baec=" crossorigin="anonymous"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/nvd3/1.8.6/nv.d3.min.js" integrity="sha256-Eg29ohiE9Hzc/t5whG/QK/B8MGmrO4wkF6WGuSsx0VU=" crossorigin="anonymous"></script>
<script src="/static/main.js"></script>
<link rel="shortcut icon" type="image/png" href="/static/pirate128.png"/>
<link rel="apple-touch-icon" sizes="57x57" href="/static/favicon/apple-icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/static/favicon/apple-icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/static/favicon/apple-icon-72x72.png">
<link rel="apple-touch-icon" sizes="76x76" href="/static/favicon/apple-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="/static/favicon/apple-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="/static/favicon/apple-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/static/favicon/apple-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/static/favicon/apple-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/static/favicon/apple-icon-180x180.png">
<link rel="icon" type="image/png" sizes="192x192" href="/static/favicon/android-icon-192x192.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/favicon/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="96x96" href="/static/favicon/favicon-96x96.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/favicon/favicon-16x16.png">
<link rel="manifest" href="/static/favicon/manifest.json">
<meta name="msapplication-TileColor" content="#BB9645">
<meta name="msapplication-TileImage" content="/static/favicon/ms-icon-144x144.png">
<meta name="theme-color" content="#BB9645">
<meta name="google-site-verification" content="JxkbxOT-aLGRVzTv8ES0RQ7EaWdSGZvOfZOUVmF1Xm8" />
</head>
<body>
<header>
<div class="home-menu pure-menu pure-menu-horizontal">
<ul class="pure-menu-list">
<li class="pure-menu-item {{? it.selected.length < 1 }}pure-menu-selected{{?}}">
<a class="pure-menu-link hot-swapper" href="/"><i class="fa fa-home"></i>Home</a>
</li>
<li class="pure-menu-item {{? it.selected === 'getting_started' }}pure-menu-selected{{?}}">
<a class="pure-menu-link hot-swapper" href="/getting_started"><i class="fas fa-rocket fa-fw"></i>Getting Started</a>
</li>
<li class="pure-menu-item {{? it.selected === 'stats' }}pure-menu-selected{{?}}">
<a class="pure-menu-link hot-swapper" href="/stats"><i class="fas fa-chart-bar fa-fw"></i>Pool Stats</a>
</li>
<!-- <li class="pure-menu-item {{? it.selected === 'tbs' }}pure-menu-selected{{?}}">
<a class="hot-swapper" href="/tbs"><i class="fas fa-table fa-fw"></i>Tab Stats</a>
</li> -->
<li class="pure-menu-item {{? it.selected === 'workers' }}pure-menu-selected{{?}}">
<a class="pure-menu-link hot-swapper" href="/workers"><i class="fas fa-cogs fa-fw"></i>Workers</a>
</li>
<li class="pure-menu-item {{? it.selected === 'payments' }}pure-menu-selected{{?}}">
<a class="pure-menu-link hot-swapper" href="/payments"><i class="fab fa-btc fa-fw"></i>Payments</a>
</li>
<li class="pure-menu-item {{? it.selected === 'api' }}pure-menu-selected{{?}}">
<a class="pure-menu-link hot-swapper" href="/api"><i class="fas fa-code fa-fw"></i>API</a>
</li>
</ul>
</div>
</header>
<main>
{{=it.page}}
</main>
<footer>
No warranties matey! If ye be 'aving any troubles, invoke yarrr right t' parlay at <!-- <a href="https://discord.gg/rZCXtCC" target="_blank" rel="noopener noreferrer" class="highlight">#pirate</a> --> <a href="https://discord.gg/ASMfX7B" target="_blank" rel="nofollow noreferrer noopener" class="highlight">#piratepool</a>
<br>
&lt;3 <a href="https://webworker.sh" alt="webworker01" target="_blank" rel="noopener noreferrer">🕷️</a> &middot; Built with <a href="https://github.com/webworker01/knomp" target="_blank" rel="noopener noreferrer" class="highlight">knomp</a>
</footer>
</body>
</html>

2798
website/piratepool.io/key.html

File diff suppressed because it is too large

50
website/piratepool.io/pages/admin.html

@ -1,50 +0,0 @@
<div>
<style>
#passwordForm, #adminCenter{
display: none;
}
#adminCenter{
display: flex;
flex-flow: row;
}
#leftMenu{
flex: 0 0 200px;
}
#editForm{
flex: 1 1 auto;
}
</style>
<form class="pure-form pure-form-stacked" id="passwordForm">
<fieldset>
<legend>Password</legend>
<input id="password" type="password" placeholder="Password">
<label for="remember" class="pure-checkbox">
<input id="remember" type="checkbox"> Stay Logged In
</label>
<button type="submit" class="pure-button pure-button-primary">Log In</button>
</fieldset>
</form>
<div id="adminCenter">
<div class="pure-menu pure-menu-open" id="leftMenu">
<a class="pure-menu-heading">Administration</a>
<ul>
<li id="addPool"><a href="#">Add Pool</a></li>
<li class="pure-menu-heading" id="poolList">Current Pools</li>
</ul>
</div>
<div id="editForm"></div>
</div>
<script src="/static/admin.js"></script>
</div>

11
website/piratepool.io/pages/api.html

@ -1,11 +0,0 @@
<div style="padding: 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?addr">/api/worker_stats?&lt;replace address here&gt;</a> - historical time per pool json </li>
<li><a href="/api/live_stats">/api/live_stats</a> - live stats (eventsource)</li>
</ul>
</div>

219
website/piratepool.io/pages/getting_started.html

@ -1,219 +0,0 @@
<div class="pure-g gettingStarted">
<div class="pure-u-1-4" style="display:flex; flex:2;">
<div class="pure-menu pure-menu-open gettingStartedMenu">
<h1 class="pure-menu-heading">Getting Started</h1>
<ul class="pure-menu-list">
<li class="pure-menu-item"><a href="#poolDetails" class="pure-menu-link">Pool Details</a></li>
<li class="pure-menu-item"><a href="#payments" class="pure-menu-link">Payout Information</a></li>
<li class="pure-menu-item"><a href="#createWallet" class="pure-menu-link">Create Wallet</a></li>
<li class="pure-menu-item"><a href="#gpuMining" class="pure-menu-link">GPU Mining Software</a></li>
<li class="pure-menu-item"><a href="#cpuMining" class="pure-menu-link">CPU Mining Software</a></li>
</ul>
</div>
</div>
<div class="pure-u-3-4 pure-responsive-disable">
{{? (function(){
if (!it.portalConfig.switching) return false;
for (var p in it.portalConfig.switching){
if (it.portalConfig.switching[p].enabled)
return true;
}
return false;
})()
}}
<div class="menuHeader">Coin-Switching Ports</div>
{{?}}
<div class="menuList">
{{ for (var p in it.portalConfig.switching){
if (!it.portalConfig.switching[p].enabled) continue;
var info = {
algo: p,
ports: {},
host: it.portalConfig.website.stratumHost
};
info.ports[it.portalConfig.switching[p].port] = {diff: it.portalConfig.switching[p].diff};
info = JSON.stringify(info).replace(/"/g, '&quot;');
}}
<a href="#" class="poolOption" data-info="{{=info}}">{{=p}}</a>
{{ } }}
</div>
<h1 class="menuHeader" id="poolDetails">Miner Configuration</h1>
<div class="menuList" id="coinList">
{{ if (it.portalConfig.gettingStartedPopups) { }}
{{ for (var pool in it.poolsConfigs) {
var info = JSON.stringify({
coin: it.poolsConfigs[pool].coin,
algo: it.poolsConfigs[pool].coin.algorithm,
ports: it.poolsConfigs[pool].ports,
host: it.portalConfig.website.stratumHost
}).replace(/"/g, '&quot;');
}}
<a href="#" class="poolOption" data-info="{{=info}}">{{=pool}}</a>
{{ } }}
{{ } else { }}
{{ for (var pool in it.poolsConfigs) { }}
{{if (String(pool) == 'pirate') { continue; } }}
<code>
<h2 class="coinInfoHeader">{{=it.poolsConfigs[pool].coin.name}} Configuration:</h2>
<p class="highlight">&#161;&#161;&#161;Do not mine to an exchange address!!! <a href="#createWallet">Create a wallet to mine to!</a></p>
<table style="margin-top:10px;">
<tr>
<td>Username: </td>
<td>{{ if (it.poolsConfigs[pool].coin && it.poolsConfigs[pool].coin.privateChain) { }}
your {{=it.poolsConfigs[pool].coin.name}} <span class="highlight">zs1</span> sapling address
{{ } else if (it.poolsConfigs[pool].coin) { }}
your {{=it.poolsConfigs[pool].coin.name}} wallet address
{{ } else { }}
your public key
{{ } }}
</td>
</tr>
<tr>
<td>Password: </td>
<td>anything</td>
</tr>
<tr>
<td>Algorithm: </td>
<td>{{=it.poolsConfigs[pool].coin.algorithm}}</td>
</tr>
{{ for (var port in it.poolsConfigs[pool].ports) { }}
<tr>
<td class="coinInfoData">{{= it.poolsConfigs[pool].ports[port].label ? it.poolsConfigs[pool].ports[port].label : 'URL'}} <span class="muted">(diff {{=it.poolsConfigs[pool].ports[port].diff}})</span>: </td>
<td>stratum+tcp://{{=it.portalConfig.website.stratumHost}}:{{=port}}</td>
</tr>
{{ } }}
</table>
</code>
{{ } }}
<div class="gettingStartedContent">
If you have multiple mining rigs you can add a label at the end of your username to see stats broken down by rig on the worker stats page.
</div>
<code>
<h3 class="coinInfoHeader">DSTM</h3>
zm --server {{=it.portalConfig.website.stratumHost}} --port {{= Object.keys(it.poolsConfigs[Object.keys(it.poolsConfigs)[0]].ports)[0] }} --user zs1nrn7h684wq4429pz8a20r49dmmhd3ey07u38f8m2n9du33ashd0xcnls3lfz0spdvn26z3r4jrv<span class="highlight">.myrigname</span> --pass x -dev 0 1 --temp-target=0:70,1:70 --intensity=0:0.5,1:0.5 --color --time
</code>
<code>
<h3 class="coinInfoHeader">EWBF</h3>
miner --server {{=it.portalConfig.website.stratumHost}} --user zs1nrn7h684wq4429pz8a20r49dmmhd3ey07u38f8m2n9du33ashd0xcnls3lfz0spdvn26z3r4jrv<span class="highlight">.myrigname</span> --pass x --port {{= Object.keys(it.poolsConfigs[Object.keys(it.poolsConfigs)[0]].ports)[0] }} --fee 0 --pec --templimit 70 --intensity 50
</code>
<code>
<h3 class="coinInfoHeader">Bminer</h3>
bminer -uri stratum://zs1nrn7h684wq4429pz8a20r49dmmhd3ey07u38f8m2n9du33ashd0xcnls3lfz0spdvn26z3r4jrv<span class="highlight">.myrigname</span>@{{=it.portalConfig.website.stratumHost}}:{{= Object.keys(it.poolsConfigs[Object.keys(it.poolsConfigs)[0]].ports)[0] }} -max-temperature 70 -nofee
</code>
<code>
<h3 class="coinInfoHeader">Claymore's</h3>
ZecMiner64.exe -zpool {{=it.portalConfig.website.stratumHost}}:{{= Object.keys(it.poolsConfigs[Object.keys(it.poolsConfigs)[0]].ports)[0] }} -zwal zs1nrn7h684wq4429pz8a20r49dmmhd3ey07u38f8m2n9du33ashd0xcnls3lfz0spdvn26z3r4jrv<span class="highlight">.myrigname</span> -zpsw x -allpools 1
</code>
<code>
<h3 class="coinInfoHeader">Optiminer</h3>
optiminer-zcash -s {{=it.portalConfig.website.stratumHost}}:{{= Object.keys(it.poolsConfigs[Object.keys(it.poolsConfigs)[0]].ports)[0] }} -u zs1nrn7h684wq4429pz8a20r49dmmhd3ey07u38f8m2n9du33ashd0xcnls3lfz0spdvn26z3r4jrv<span class="highlight">.myrigname</span> -p x
</code>
{{ } }}
</div>
<h1 class="menuHeader" id="payments">Payments</h1>
<div class="gettingStartedContent">
<p>Payouts are currently scheduled once every 4 hours with a minimum payout of 21 ARRR.</p>
<p>There is a limit of ~200 recipients that can be included in a single payout, so the pool payouts are monitored and the min payout adjusted accordingly to ensure a constant flow of payments.</p>
<p>If payments stop going out, do not worry! Funds are safu! Blocks can still be found and will be credited to your worker! Please check <!-- the <a href="https://discord.gg/rZCXtCC">#pools-and-operators channel in discord</a>--><a href="https://discord.gg/ASMfX7B" target="_blank" rel="nofollow noreferrer noopener" class="highlight">#piratepool in discord</a> to see if it's already being worked on.</p>
<p>Pending blocks have not yet been scanned by the payment processor. After being scanned, blocks will need to receive both <a href="https://komodoplatform.com/security-delayed-proof-of-work-dpow/" target="_blank" rel="noopener noreferrer">dPoW notarization</a> and 10 confirmations before being actually paid out.</p>
<p>On your worker stats page, <em class="highlight">pending</em> balance is the remaining estimated amount to be paid for blocks that
were scanned but not yet eligible for payout either because of
<a href="https://komodoplatform.com/new-feature-to-verify-dpow-notarizations/" target="_blank" rel="noopener noreferrer">dPoW</a> or min confirmations.
<em class="highlight">Balance</em> includes blocks that were scanned and already paid out but you have not yet met the min payout.<em class="highlight">*</em></p>
<p><em class="highlight">*Please note these 2 stats will only update when the payment processor runs which is currently every 4 hours.</em></p>
<p>Payments that show up on the payments page initially are in the process of constructing the z transaction. Once the transaction actually broadcasts to the network, the blocks paid out will become hyperlinked to the explorer and then should arrive in your wallet in the next block or two.</p>
</div>
<h1 class="menuHeader" id="createWallet">Generate Wallet and Address</h1>
<div class="gettingStartedContent">
<p><a href="https://medium.com/piratechain/pirateocean-wallet-guide-1cb80f70364c" target="_blank" rel="noopener noreferrer">The PirateOceanQT for PIRATE</a> is available. For wallet support please visit <a href="https://discord.gg/qReShun">#newpirates on Discord</a></p>
<h4>CLI Wallet:</h4>
<ol>
<li><a href="https://docs.komodoplatform.com/komodo/install-Komodo-manually.html" target="_blank">Build Komodo</a></li>
<li>Launch PIRATE chain:
<code>
./komodod -ac_name=PIRATE -ac_supply=0 -ac_reward=25600000000 -ac_halving=77777 -ac_private=1 -addnode=136.243.102.225
</code>
</li>
<li>Generate Z address:
<code>
./komodo-cli -ac_name=PIRATE z_getnewaddress
</code>
</li>
<li>Securely backup your private key:
<code>
./komodo-cli -ac_name=PIRATE z_exportkey "zaddr"
</code>
</li>
<li>Check your balance:
<code>
./komodo-cli -ac_name=PIRATE z_gettotalbalance
</code>
</li>
<li>
For more information visit the <a href="https://pirate.black/" target="_blank">project website</a>
</li>
</ol>
</div>
<h1 class="menuHeader" id="gpuMining">GPU Mining</h1>
<div class="gettingStartedContent">
<p>There are a few decent GPU miners available. You will need to experiment to find which one works best for you. DYOR on this and be sure to virus scan all the things!</p>
<p>Here are a couple well-known GPU miners:</p>
<ul>
<li><a href="https://bitcointalk.org/index.php?topic=2021765.0" target="_blank" rel="noopener noreferrer">dstm's ZCash / Equihash Nvidia Miner</a></li>
<li><a href="https://bitcointalk.org/index.php?topic=1707546.0" target="_blank" rel="noopener noreferrer">EWBF's CUDA Zcash miner 0.3.4b</a></li>
<li><a href="https://www.bminer.me/releases/" target="_blank" rel="noopener noreferrer">Bminer Lite</a></li>
<li><a href="https://bitcointalk.org/index.php?topic=1670733.0" target="_blank" rel="noopener noreferrer">Claymore's ZCash/BTG AMD GPU Miner</a></li>
<li><a href="https://github.com/Optiminer/OptiminerZcash" target="_blank" rel="noopener noreferrer">Optiminer AMD</a></li>
</ul>
</div>
<h1 class="menuHeader" id="cpuMining">CPU Mining</h1>
<div class="gettingStartedContent">
<p>While it is possible to CPU mine with <b>komodod</b> directly like so:</p>
<code>
./komodo-cli -ac_name=PIRATE setgenerate true
</code>
<p>The chances to find a block solo with CPU mining only are already fairly low and most likely the reason you are here at all 🐸</p>
<p>The well-known CPU miner that can be used with the pool is <b>nheqminer</b>. This does <i>not</i> require a Nicehash account and can be used to connect to any equihash stratum.</p>
<h4>Linux</h4>
<p>It is suggested that you attempt to build the CPU miner instead of using the pre-compiled binary so that optimizations for your CPU can be made during the build process</p>
<code>
sudo apt-get install cmake build-essential libboost-all-dev<br />
cd ~<br />
git clone -b Linux https://github.com/nicehash/nheqminer.git<br />
cd ~/nheqminer/cpu_xenoncat/Linux/asm/<br />
sh assemble.sh<br />
cd ~/nheqminer/Linux_cmake/nheqminer_cpu<br />
cmake . &amp;&amp; make<br />
sudo ln -s ~/nheqminer/Linux_cmake/nheqminer_cpu/nheqminer_cpu /usr/local/bin/nheqminer_cpu
</code>
<p>Now you can launch your miner! (replace the values as indicated changing the number of threads (-t) and your address for payouts (-u)</p>
<code>
nheqminer_cpu -t <i>numberofthreads</i> -l <i>stratumhost</i>:<i>stratumport</i> -u <i>youraddress</i>
</code>
<h4>Windows</h4>
<p>Download and install the latest release for windows from <a href="https://github.com/nicehash/nheqminer/releases" target="_blank" rel="noopener noreferrer">the github repo</a></p>
<p>Replace the placeholders below as needed and start mining!</p>
<code>
nheqminer -t <i>numberofthreads</i> -l <i>stratumhost</i>:<i>stratumport</i> -u <i>youraddress</i>
</code>
<h4>Additional Resources</h4>
<ul>
<li><a href="https://github.com/nicehash/nheqminer" target="_blank" rel="noopener noreferrer">nheqminer repo</a></li>
<li><a href="https://steemit.com/mining/@bobinson/zcash-cpu-mining-setup-on-linux" target="_blank" rel="noopener noreferrer">CPU Mining</a></li>
</ul>
</div>
</div>
</div>

98
website/piratepool.io/pages/home.html

@ -1,98 +0,0 @@
{{ function bigNumber(x){ return (x > 1000000000000) ? (x / 1000000000000).toFixed(1) + 'T' : (x > 1000000000) ? (x / 1000000000).toFixed(1) + 'B' : (x > 1000000) ? (x / 1000000).toFixed(1) + 'M' : (x > 1000) ? (x / 1000).toFixed(1) + 'K' : x.toFixed(1); } }}
<div>
<div class="alertbar">
<!-- Stop mining to exchange addresses&#8230; -->
<!-- 300K+ ARRR donated to Onboarding/Dev and Marketing funds, made possible via KMD notary node income.<br>
Thank you for all who voted me into KMD notary node for 2019 in SH! ❤ 🐸-->
<!-- New piratepool.io discord support and discussion channel created! <a href="https://discord.gg/ASMfX7B" target="_blank" rel="nofollow noreferrer noopener" class="highlight">join #piratepool</a> 🐸 -->
<!-- Payout strategy changed to PPLNT with 1 hour payout frequency! Join <a href="https://discord.gg/ASMfX7B" target="_blank" rel="nofollow noreferrer noopener" class="highlight">#piratepool</a> for support and discussion! 🐸 -->
Miner Privacy Enabled! Search for your miner with Miner Lookup. Join <a href="https://discord.gg/ASMfX7B" target="_blank" rel="nofollow noreferrer noopener" class="highlight">#piratepool</a> for support and discussion! 🐸
</div>
<div class="pure-g boxWelcome">
<div class="pure-u-1-3 pure-responsive-disable" style="display:flex; justify-content:center; align-items:center;">
<img src="/static/pirate128.png" style="width:128px; -webkit-filter: drop-shadow(-1px -1px 0 #000); filter: drop-shadow(-1px -1px 0 #000);" alt="piratepool.io - knomp" />
</div>
<div class="pure-u-2-3 pure-responsive-disable">
<h1 style="font-size: 2em; text-align:left; font-weight:900; color:#BB9645; margin:5px 0 10px;" class="textshadow">piratepool.io</h1>
<h2 style="color:#FFF; font-weight:900; font-size:1.5em; margin:0 0 10px;">Mining Pool For PirateChain (ARRR)</h2>
<p>
Donating 66% of the pool fee to the PirateChain project!<br>
<em>33% to PIRATE dev and <a href="https://dexstats.info/onboarding.php" target="_blank" rel="noopener noreferrer">onboarding</a> <a href="https://explorer.pirate.black/address/RAzq6y7dsUKgfuzNjpzyGiuFzvrwuDheQw" target="_blank" rel="noopener noreferrer">fund</a>
<br />
33% to <a href="https://explorer.pirate.black/address/RD5PhyAUhapsvj5ps2cCHozsXZfQSvDdrZ" target="_blank" rel="noopener noreferrer">PIRATE Marketing</a>!</em>
</p>
<table style="width: 100%; margin: 15px auto; text-align: left;">
<tr><td style="width:50%;">Algorithm: </td><td>Equihash</td></tr>
<tr><td>Payout Strategy: </td><td>PPLNT</td></tr>
<tr><td>Payout Frequency: </td><td>{{=it.poolsConfigs['arrr'].paymentProcessing.paymentInterval/60/60}} Hours</td></tr>
<tr><td>Min Payout: </td><td>{{=it.poolsConfigs['arrr'].paymentProcessing.minimumPayment}} ARRR</td></tr>
<tr><td>Pool Fee: </td><td>1%</td></tr>
</table>
<p>Pirate chain, the most private and anonymous cryptocurrency, is mineable here. Learn more:</p>
<div class="pure-g">
<div class="pure-u-1-2 pure-responsive-disable">
<a href="https://pirate.black/" target="_blank" rel="noopener noreferrer"><i class="fa fa-globe fa-fw"></i> Website</a><br />
<a href="https://github.com/PirateNetwork" target="_blank" rel="noopener noreferrer"><i class="fab fa-github fa-fw"></i> Github</a><br />
<a href="https://bitcointalk.org/index.php?topic=4979549" target="_blank" rel="noopener noreferrer"><i class="fab fa-bitcoin fa-fw"></i> Bitcoin Talk</a><br />
<a href="https://miningpoolstats.stream/piratechain" target="_blank" rel="noopener noreferrer"><i class="fas fa-swimmer"></i> Alternative Pools</a>
</div>
<div class="pure-u-1-2 pure-responsive-disable">
<a href="https://explorer.pirate.black" target="_blank" rel="noopener noreferrer"><i class="fas fa-map fa-fw"></i> Explorer</a><br />
<a href="https://discord.gg/qReShun" target="_blank" rel="noopener noreferrer"><i class="fab fa-discord fa-fw"></i> Discord</a><br />
<a href="https://twitter.com/PirateChain" target="_blank" rel="noopener noreferrer"><i class="fab fa-twitter fa-fw"></i> Twitter</a><br />
<a href="https://digitalprice.io/?inviter=4fdaf7" target="_blank" rel="noopener noreferrer"><i class="fas fa-chart-line fa-fw"></i> Trading at DigitalPrice.io</a>
</div>
</div>
</div>
</div>
<div style="max-width:640px; margin:10px auto; padding: 10px 10px 0;">
<p>
<a href="https://medium.com/piratechain/pirateocean-wallet-guide-1cb80f70364c" target="_blank" rel="noopener noreferrer">Download the latest PirateOcean wallet</a> and create a sapling address (<span class="highlight">starts with zs1</span>) and connect to the new stratum ports labeled as <strong><em>arrr</em></strong> on <a href="/getting_started" class="hot-swapper">Getting Started</a>.
</p>
<p>
{{ /* <span style="font-weight:900;">Sprout stratum has been retired! <a href="https://piratepool.io/static/sproutfinal.txt" target="_blank" style=" text-decoration:underline; text-decoration-color:#BB9645">Final Sprout Payouts Report</a></span> */ }}
</p>
<!-- <p>
You need to migrate sprout funds in your own zc wallet address by <span class="highlight">2019-02-01</span>. A quick guide on how to migrate can be <a href="https://github.com/PirateNetwork/docs/wiki/How-to-Migrate-Pirate-(ARRR)-from-sprout-address-to-sapling-address" target="_blank" rel="noopener noreferrer">found here</a>.
You could also try <a href="https://dexstats.info/pirateswap.php" target="_blank" rel="noopener noreferrer">this service to swap your coins</a>.
</p> -->
</div>
<div class="pure-g boxStats">
{{ for(var pool in it.stats.pools) { }}
<div class="pure-u-1-2 pure-responsive-disable">
<div class="l-box">
<h3>{{=it.stats.pools[pool].name}} Pool Stats</h3>
<div class="boxStatsList">
<ul>
<li><i class="fas fa-users fa-fw"></i> <span id="statsMiners{{=pool}}">{{=it.stats.pools[pool].minerCount}}</span> Miners</li>
<li><i class="fas fa-rocket fa-fw"></i> <span id="statsWorkers{{=pool}}">{{=it.stats.pools[pool].workerCount}}</span> Workers</li>
<li><i class="fas fa-tachometer-alt fa-fw"></i> <span id="statsHashrate{{=pool}}">{{=it.stats.pools[pool].hashrateString}}</span> (Now)</li>
<li><i class="fas fa-tachometer-alt fa-fw"></i> <span id="statsHashrateAvg{{=pool}}">...</span> (Avg)</li>
<li><i class="fas fa-dice fa-fw"></i> Luck <span id="statsLuckDays{{=pool}}">{{=it.stats.pools[pool].luckDays}}</span> Days</li>
</ul>
</div>
</div>
</div>
<div class="pure-u-1-2 pure-responsive-disable">
<div class="l-box">
<h3>{{=it.stats.pools[pool].name}} Network Stats</h3>
<div class="boxStatsList">
<ul>
<li><i class="fas fa-link fa-fw" aria-hidden="true"></i> Block Height: <span id="statsNetworkBlocks{{=pool}}">{{=it.stats.pools[pool].poolStats.networkBlocks}}</span></li>
<li><i class="fas fa-tachometer-alt fa-fw"></i> Network Hash/s: <span id="statsNetworkSols{{=pool}}">{{=it.stats.pools[pool].poolStats.networkSolsString}}</span></li>
<li><i class="fas fa-unlock-alt fa-fw" aria-hidden="true"></i> Difficulty: <span id="statsNetworkDiff{{=pool}}">{{=bigNumber(it.stats.pools[pool].poolStats.networkDiff)}}</span></li>
<!-- <li><i class="fas fa-coins fa-fw"></i> Total Supply: <span id="statsNetworkCoins{{=pool}}">{{=(it.stats.pools[pool].poolStats.networkBlocks*256).toLocaleString('en')}}</span></li> -->
<li><i class="fas fa-coins fa-fw"></i> Total Supply: <span id="statsNetworkCoins{{=pool}}">200,000,000</span></li>
<li><i class="fas fa-users fa-fw"></i> Node Connections: <span id="statsNetworkConnections{{=pool}}">{{=it.stats.pools[pool].poolStats.networkConnections}}</span></li>
</ul>
</div>
</div>
</div>
{{ } }}
</div>
<script>
document.querySelector('main').appendChild(document.createElement('script')).src = '/static/home.js';
</script>
</div>

34
website/piratepool.io/pages/miner_stats.html

@ -1,34 +0,0 @@
{{ function middleEllipsis(x) { return x.length > 40 ? x.substring(0, 20) + '...' + x.substring(x.length-20, x.length): x; } }}
{{ function checkCompromised(m) { var compromised = ['zs10jprfefpt2ra88u2ml96nzh3dmlqqqfeha5l7g0x0s0d2awme0eqfyt4w7r7pee0na8tcz6ezzj', 'zs12urwtysy5rkqzy3xgaxeu9g3ezf4fr0wfq44xrnf48uq6ug8qfxp059lms06khekppquvzadxyf', 'zs16sk9n6lyc8ulzkrf5xc72cr07hkyjvvj2emeqjel7xmn90qaf9mj2m8vt34yw45l7syqxlmfe5v', 'zs16xlsu48grwgsr29c9ztcn8jl0s47rtyucv3dw0n2e6y00w0wtt3d4ukqk4sq4sycrdhtxxg7g3k', 'zs19whs7s29a2kn5d4s8mpdad0m4setz86sq64kpv0t2v263mrqvuducp6nlmlwvynltam9zm9mr0p', 'zs1au66ft2gyu8ylgkw70vy4we2ktzum52esl94875w44mu8cmw2dcwfc29kahgmvfwcagwy39ctee', 'zs1c83zjak7ealmn92hejmqmjc7h3ysvglc9n95z79dhajth4fmhmrnv5zxdkufzg6l489y6hwf694', 'zs1d9myt9rpvu6grsl3ntg9wv0dfuj4vhp4rr0m3f940tt6fpxy8adpx4uzs7hgtclqtqe4wq2sjr8', 'zs1df3t2wpdmsjmzd7pwet67grfgr900fg6hjy97hl9vv0tkf7w5eye2zur6xhhzhfxdceu740g04g', 'zs1g342mavfn70xf5pycn8xwu2zsc4vq3fe8zzg99dfkdsdr39rqszvnuzxdp238d3uaqg96mmrclq', 'zs1gp9egrus6zrjqmea23nae7pzpxdy9jt3w65j8netsrcctl3g9e0lrag4tgvctw3r7rhryj4f4ua', 'zs1jttxxfwurarqw3cmkf94ygfs8skh7xxjf83wuh4awq6zjcee9p804p6aurmxv5q02f2uxc3qm93', 'zs1kqaakh9tw8uj039e9hzkh0444rw533uh8r5http8mfjuakmglqyqrjvd2ertnk8j9jlvvnzne9r', 'zs1lpp9qdtj9tkqjfj64wkcprvp2kflpu8cxz8fgclx80uuu4ajsmslkxkx0fh49cpw2yyhxwk0yzg', 'zs1pd047rvjf6es3ypx6vnl7vgnngmt3mkegn4vjtymfy26rxzp97mpjw5y2gkmyljmk99qs2wa4c0', 'zs1qsr5r8fp9scdz4wt08h4uxnlmefl0dmukuzxzs3f8wx6tk6ged399c9taphhx0asagryjkqgya7', 'zs1r4kfr08dm5yx60yg535dzhnpg8m8s4dl8ap42exkwm6699prpw9zu8sgj6xjd5efmrnj6p4u0an', 'zs1sfj20kyt95sfvll20lraw5q22q2aagw2r3pcdgtlaw4epc9sdwymxzdsge8c84f707ytqpjlnx4', 'zs1stzrmj7rfwr8g0hcsgs7aln0vxwcss6h7qfvzkyf9f6vuupeq6eqhrx7kwa0kmm5dawf7f9j8hr', 'zs1u7sy6prj270ucxwcwh9sh7vr33lnlgs6a95nt4hzgwxwvtcesu240px90822mffc0epf2kjlrjq', 'zs1ued52v4gv83yrguw4gpp4j85mtz9euedmwlszqmldl99cgefz8tz4y60ttjgm4avpqegyhnesns', 'zs1uhnyckurr2x4e8ak6ffqes4ggth8n2vxlzyksd8ufv9zltdhggdnxcx4q2jfn8tuea3f7w4yevs', 'zs1v569xvf7klgw8ylgf0dvtd92dtmu669xcqv05qvxud78nt4zwwcjdz046ghq7lvs4r0d227sgrv', 'zs1xl7l6sn0r5nsa6cex87yp3z7j2mj9jgf32dng6qqp7ym66s8wkx9lykmd896uq62e5xlq2mkaqq', 'zs1yxspuhm7fd5ffrjlmxtsyuryaj983paurt794rg87ln98ekdsugexl7kfvjw97ejhv66ytd3454', 'zs1yyeyhf856aag8vxlq4mkhjs8qjrlxfzz67s4jgjazpedrqfj62tr4zkp3tsj6cgc3hggq4t5raf', 'zs1z4aqxzy2krpvu45mfqes74a20yjmeuxlj0s4x89zr932panatzsfh8wf90qulh5683cgg9q0u2v']; return compromised.indexOf(m) > -1; } }}
<div id="pageMiner">
{{ if (checkCompromised(it.stats.address)) { }}
<div class="alertbar">
Your wallet address was possibly comporomised! Please visit <a href="https://discord.gg/ASMfX7B" target="_blank" rel="noopener noreferrer">discord</a> for more details!
</div>
{{ } }}
<div id="topCharts">
<div class="chartWrapper">
<div class="chartLabel">
<div class="workerStatsChartHeaderLeft" title="{{=String(it.stats.address)}}">{{=middleEllipsis(String(it.stats.address).split(".")[0])}}</div>
<div class="workerStatsChartHeaderRight"><i class="fas fa-tachometer-alt fa-fw"></i> <span id="statsHashrateAvg">...</span> (Avg)</div>
<div class="workerStatsChartHeaderRight"><i class="fas fa-tachometer-alt fa-fw"></i> <span id="statsHashrate">...</span> (Now)</div>
<div class="workerStatsChartHeaderRight"><i class="fas fa-dice fa-fw"></i> Luck <span id="statsLuckDays">...</span> Days</div>
</div>
<div class="chartHolder"><svg id="workerHashrate"></svg></div>
<div class="workerStatsChartFooter">
<div title="Lifetime Amount Paid"><i class="fas fa-money-bill-wave fa-fw"></i> Paid: <span id="statsTotalPaid">...</span></div>
<div title="Accrued Balance Waiting for Min-Payout"><i class="fas fa-piggy-bank fa-fw"></i> Balance: <span id="statsTotalBal">...</span></div>
<div title="Estimated Balance Waiting for dPoW/Min Confirmations"><i class="far fa-clock fa-fw"></i> Pending: <span id="statsTotalImmature">...</span></div>
<div title="Current Mining Round Shares"><i class="fas fa-cog fa-fw"></i> Shares: <span id="statsTotalShares">...</span></div>
</div>
</div>
</div>
<div id="boxesWorkers" class="pure-g boxStats"> </div>
<script>
var _miner = "{{=String(it.stats.address).split('.')[0]}}";
var _workerCount = 0;
document.querySelector('main').appendChild(document.createElement('script')).src = '/static/miner_stats.js';
</script>
</div>

25
website/piratepool.io/pages/mining_key.html

@ -1,25 +0,0 @@
<style>
#miningKeyPage{
margin: 15px;
}
#keyFrame{
padding: 0;
border: 0;
width: 100%;
height: 750px;
display: block;
}
</style>
<div id="miningKeyPage">
<p>
This script run client-side (in your browser). For maximum security <a href="/key.html" download="key.html">download</a> the script and run it locally and
offline in a modern web browser.
</p>
<iframe id="keyFrame" src="/key.html">
</iframe>
</div>

68
website/piratepool.io/pages/payments.html

@ -1,68 +0,0 @@
{{
function readableDate(a){
return new Date(parseInt(a)).toISOString().substring(0, 16).replace('T', ' ') + ' UTC';
}
function bigNumber(x){
return (x > 1000000000000) ? (x / 1000000000000).toFixed(1) + 'T' : (x > 1000000000) ? (x / 1000000000).toFixed(1) + 'B' : (x > 1000000) ? (x / 1000000).toFixed(1) + 'M' : (x > 1000) ? (x / 1000).toFixed(1) + 'K' : x.toFixed(1);
}
function timeTil(x){
return (x < 0) ? 'Now' : (x > 86400) ? (x/86400).toFixed(1) + ' Days' : (x > 3600) ? (x/3600).toFixed(1) + ' Hours' : (x > 60) ? (x / 60).toFixed(1) + ' Minutes' : x + ' Seconds';
}
function timeTilNumbers(timestamp) {
return new Date(timestamp * 1000).toISOString().substr(11, 8);
}
}}
<div id="pagePayments">
<div class="alertbar">
<!-- Payout frequency has been changed to 4 hours because miners have been mining to exchange addresses&#8230;-->
<!-- Block Reward Halving occured at block <a href="https://explorer.pirate.black/block/00000000004332fdca73719414e6e595c5f9f909bf39df5ff68f56b008b29790" target="_blank" rel="nofollow noreferrer noopener">388,885</a>!! Join <a href="https://discord.gg/ASMfX7B" target="_blank" rel="nofollow noreferrer noopener" class="highlight">#piratepool</a> for support and discussion! 🐸 -->
Payout strategy changed to PPLNT with 1 hour payout frequency! Join <a href="https://discord.gg/ASMfX7B" target="_blank" rel="nofollow noreferrer noopener" class="highlight">#piratepool</a> for support and discussion! 🐸
</div>
{{ for(var pool in it.stats.pools) { }}
<div class="poolLabel">
{{=it.stats.pools[pool].name}} Payments<span class="responsivehide"> &#160;&#160;</span><br class="responsiveonly" />
<small>
Lifetime<br class="responsiveonly" />
<i class="fas fa-link fa-fw"></i> <span id="statsValidBlocks{{=pool}}">{{=parseInt(it.stats.pools[pool].poolStats.validBlocks).toLocaleString('en')}}</span> Blocks Found<span class="responsivehide"> &#160;&#160;</span><br class="responsiveonly" />
<i class="fas fa-money-bill-wave fa-fw"></i> <span id="statsTotalPaid{{=pool}}">{{=parseInt(it.stats.pools[pool].poolStats.totalPaid).toLocaleString('en')}}</span> {{=it.stats.pools[pool].symbol}} Paid<span class="responsivehide"> &#160;&#160;</span><br class="responsiveonly" />
<i class="far fa-clock fa-fw"></i> Next Payment ETA <span id="statsNextPayment{{=pool}}" class="countdownTimer">{{=timeTil(it.poolsConfigs[pool].paymentProcessing.paymentInterval-parseInt((new Date().getTime() - parseInt(it.stats.pools[pool].payments[0].time))/1000))}}</span>
</small>
</div>
<table class="pure-table" id="paymentTable{{=pool}}">
<thead>
<tr>
<th>Blocks</th>
<th>Time</th>
<th>Miners</th>
<th>Shares</th>
<th>Amount</th>
</tr>
</thead>
<tbody>
{{ for(var p in it.stats.pools[pool].payments) { }}
<tr id="payment{{=pool}}{{=it.stats.pools[pool].payments[p].time}}">
<td class="paymentblocks{{if (it.stats.pools[pool].payments[p].blocks.length > 9) { }} paymentblocksexpand{{ } }}" title="Blocks:{{=it.stats.pools[pool].payments[p].blocks.length}} {{=it.stats.pools[pool].payments[p].opid}}">
<span class="responsiveTableLabel"><i class="fas fa-link fa-fw"></i></span> <span>Blocks: [{{=it.stats.pools[pool].payments[p].blocks.length}}] </span>
{{if (String(it.stats.pools[pool].name) == "KMD") { }}
<a href="https://kmdexplorer.io/tx/{{=it.stats.pools[pool].payments[p].txid}}" target="_blank" rel="noopener noreferrer">{{=it.stats.pools[pool].payments[p].blocks}}</a>
{{ } else if (typeof it.stats.pools[pool].payments[p].txid !== 'undefined' && (String(it.stats.pools[pool].name).startsWith("pirate") || String(it.stats.pools[pool].name).startsWith("arrr")) ) { }}
<a href="https://explorer.pirate.black/tx/{{=it.stats.pools[pool].payments[p].txid}}" target="_blank" rel="noopener noreferrer">{{=it.stats.pools[pool].payments[p].blocks}}</a>
{{ } else { }}
<a>{{=it.stats.pools[pool].payments[p].blocks}}</a>
{{ } }}
<div class="fade">&#9660;</div>
</td>
<td><span class="responsiveTableLabel"><i class="far fa-clock fa-fw"></i> Time: </span>{{=readableDate(it.stats.pools[pool].payments[p].time)}}</td>
<td><span class="responsiveTableLabel"><i class="fas fa-users fa-fw"></i> Miners: </span>{{=it.stats.pools[pool].payments[p].miners}}</td>
<td><span class="responsiveTableLabel"><i class="fas fa-cog fa-fw"></i> Shares: </span>{{=bigNumber(it.stats.pools[pool].payments[p].shares)}}</td>
<td><span class="responsiveTableLabel"><i class="fas fa-money-bill-wave fa-fw"></i> Amount: </span>{{=it.stats.pools[pool].payments[p].paid}} {{=it.stats.pools[pool].symbol}}</td>
</tr>
{{ } }}
</tbody>
</table>
{{ } }}
<script>
document.querySelector('main').appendChild(document.createElement('script')).src = '/static/payments.js';
</script>
</div>

112
website/piratepool.io/pages/stats.html

@ -1,112 +0,0 @@
{{ 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'; } }}
{{ function bigNumber(x){ return (x > 1000000000000) ? (x / 1000000000000).toFixed(1) + 'T' : (x > 1000000000) ? (x / 1000000000).toFixed(1) + 'B' : (x > 1000000) ? (x / 1000000).toFixed(1) + 'M' : (x > 1000) ? (x / 1000).toFixed(1) + 'K' : x.toFixed(1); } }}
{{ function middleEllipsis(x) { return x.length > 40 ? x.substring(0, 15) + '...' + x.substring(x.length-15, x.length): x; } }}
<div id="pageStats">
<div class="alertbar">
<!-- New piratepool.io discord support and discussion channel created! <a href="https://discord.gg/ASMfX7B" target="_blank" rel="nofollow noreferrer noopener" class="highlight">join #piratepool</a> 🐸 -->
<!-- Payout strategy changed to PPLNT with 1 hour payout frequency! Join <a href="https://discord.gg/ASMfX7B" target="_blank" rel="nofollow noreferrer noopener" class="highlight">#piratepool</a> for support and discussion! 🐸 -->
Miner Privacy Enabled! Search for your miner with Miner Lookup. Join <a href="https://discord.gg/ASMfX7B" target="_blank" rel="nofollow noreferrer noopener" class="highlight">#piratepool</a> for support and discussion! 🐸
</div>
<div id="topCharts">
<div class="chartWrapper">
<h1 class="chartLabel">Pool Hashrate</h1>
<div class="chartHolder"><svg id="poolHashrate"></svg></div>
</div>
</div>
<div class="pure-g boxStats">
{{ for(var pool in it.stats.pools) { }}
<div class="pure-u-1-2 pure-responsive-disable">
<div class="l-box">
<h3>{{=it.stats.pools[pool].name}} Pool Stats</h3>
<div class="boxStatsList">
<ul>
<li><i class="fas fa-users fa-fw"></i> <span id="statsMiners{{=pool}}">{{=it.stats.pools[pool].minerCount}}</span> Miners</li>
<li><i class="fas fa-rocket fa-fw"></i> <span id="statsWorkers{{=pool}}">{{=it.stats.pools[pool].workerCount}}</span> Workers</li>
<li><i class="fas fa-tachometer-alt fa-fw"></i> <span id="statsHashrate{{=pool}}">{{=it.stats.pools[pool].hashrateString}}</span> (Now)</li>
<li><i class="fas fa-tachometer-alt fa-fw"></i> <span id="statsHashrateAvg{{=pool}}">...</span> (Avg)</li>
<li><i class="fas fa-dice fa-fw"></i> Luck <span id="statsLuckDays{{=pool}}">{{=it.stats.pools[pool].luckDays}}</span> Days</li>
</ul>
</div>
</div>
</div>
<div class="pure-u-1-2 pure-responsive-disable">
<div class="l-box">
<h3>{{=it.stats.pools[pool].name}} Network Stats</h3>
<div class="boxStatsList">
<ul>
<li><i class="fas fa-link fa-fw" aria-hidden="true"></i> Block Height: <span id="statsNetworkBlocks{{=pool}}">{{=it.stats.pools[pool].poolStats.networkBlocks}}</span></li>
<li><i class="fas fa-tachometer-alt fa-fw"></i> Network Hash/s: <span id="statsNetworkSols{{=pool}}">{{=it.stats.pools[pool].poolStats.networkSolsString}}</span></li>
<li><i class="fas fa-unlock-alt fa-fw" aria-hidden="true"></i> Difficulty: <span id="statsNetworkDiff{{=pool}}">{{=bigNumber(it.stats.pools[pool].poolStats.networkDiff)}}</span></li>
<!-- <li><i class="fas fa-coins fa-fw"></i> Total Supply: <span id="statsNetworkCoins{{=pool}}">{{=(99554304+(it.stats.pools[pool].poolStats.networkBlocks-388884)*128).toLocaleString('en')}}</span></li> -->
<li><i class="fas fa-coins fa-fw"></i> Total Supply: <span id="statsNetworkCoins{{=pool}}">200,000,000</span></li>
<li><i class="fas fa-users fa-fw"></i> Node Connections: <span id="statsNetworkConnections{{=pool}}">{{=it.stats.pools[pool].poolStats.networkConnections}}</span></li>
</ul>
</div>
</div>
</div>
{{ } }}
</div>
{{ for(var pool in it.stats.pools) { }}
<div class="blocksFound" id="blocksFound{{=it.stats.pools[pool].name}}">
<div class="blocksFoundHeader">
<div>
{{=it.stats.pools[pool].name}} Recent Blocks Found (<span id="blocksFoundHeaderCount{{=it.stats.pools[pool].name}}">{{=it.stats.pools[pool].pending.blocks.length}}</span>)
</div>
<div>
Lifetime<span class="responsivehide"> &#160;&#160;</span><br class="responsiveonly" />
<i class="fas fa-link fa-fw"></i> <span id="statsValidBlocks{{=pool}}">{{=parseInt(it.stats.pools[pool].poolStats.validBlocks).toLocaleString('en')}}</span> Blocks Found<span class="responsivehide"> &#160;&#160;</span><br class="responsiveonly" />
<i class="fas fa-money-bill-wave fa-fw"></i> <span id="statsTotalPaid{{=pool}}">{{=parseInt(it.stats.pools[pool].poolStats.totalPaid).toLocaleString('en')}}</span> {{=it.stats.pools[pool].symbol}} Paid
</div>
</div>
<div class="blocksFoundList">
{{ for (var b in it.stats.pools[pool].pending.blocks) { }}
{{ var block = it.stats.pools[pool].pending.blocks[b].split(":"); }}
<div class="blocksFoundPending" id="blocksFoundPending{{=block[0]}}" 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>
<i class="fas fa-link fa-fw"></i>
<small>Block:</small>
<a href="https://explorer.pirate.black/block/{{=block[0]}}" target="_blank" rel="noopener noreferrer">{{=block[2]}}</a>
{{if (block[4] != null) { }}
<span><small>{{=readableDate(block[4])}}</small></span>
{{ } }}
{{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 class="countLabel">Need dPoW</span>
{{ } else { }}
<span class="countLabel">{{=it.stats.pools[pool].pending.confirms[block[0]]}}/{{=it.poolsConfigs[pool].paymentProcessing.minConf*2}}</span>
{{ } }}
{{ } else { }}
<span class="countLabel">Pending</span>
{{ } }}
</div>
</div>
{{ } }}
{{ for(var i=0; i < 8; i++) { }}
{{ var block = it.stats.pools[pool].confirmed.blocks[i].split(":"); }}
<div class="blocksFoundPaid" id="blocksFoundPaid{{=block[0]}}" title="Payment sent, please check payments page">
<div>
<i class="fas fa-link fa-fw"></i>
<small>Block:</small>
<a href="https://explorer.pirate.black/block/{{=block[0]}}" target="_blank" rel="noopener noreferrer">{{=block[2]}}</a>
{{if (block[4] != null) { }}
<span><small>{{=readableDate(block[4])}}</small></span>
{{ } }}
<span class="countLabel">Paid</span>
</div>
</div>
{{ } }}
</div>
</div>
{{ } }}
<script>
document.querySelector('main').appendChild(document.createElement('script')).src = '/static/stats.js';
</script>
</div>

30
website/piratepool.io/pages/tbs.html

@ -1,30 +0,0 @@
<table class="pure-table">
<thead>
<tr>
<th>Pool</th>
<th>Algo</th>
<th>Workers</th>
<th>Valid Shares</th>
<th>Invalid Shares</th>
<th>Total Blocks</th>
<th>Pending</th>
<th>Confirmed</th>
<th>Orphaned</th>
<th>Hashrate</th>
</tr>
</thead>
{{ for(var pool in it.stats.pools) { }}
<tr>
<td>{{=it.stats.pools[pool].name}}</td>
<td>{{=it.stats.pools[pool].algorithm}}</td>
<td>{{=Object.keys(it.stats.pools[pool].workers).length}}</td>
<td>{{=it.stats.pools[pool].poolStats.validShares}}</td>
<td>{{=it.stats.pools[pool].poolStats.invalidShares}}</td>
<td>{{=it.stats.pools[pool].poolStats.validBlocks}}</td>
<td>{{=it.stats.pools[pool].blocks.pending}}</td>
<td>{{=it.stats.pools[pool].blocks.confirmed}}</td>
<td>{{=it.stats.pools[pool].blocks.orphaned}}</td>
<td>{{=it.stats.pools[pool].hashrateString}}</td>
</tr>
{{ } }}
</table>

56
website/piratepool.io/pages/workers.html

@ -1,56 +0,0 @@
{{ function capitalizeFirstLetter(t){return t.charAt(0).toUpperCase()+t.slice(1)} }}
{{ function bigNumber(x){ return (x > 1000000000000) ? (x / 1000000000000).toFixed(1) + 'T' : (x > 1000000000) ? (x / 1000000000).toFixed(1) + 'B' : (x > 1000000) ? (x / 1000000).toFixed(1) + 'M' : (x > 1000) ? (x / 1000).toFixed(1) + 'K' : x.toFixed(1); } }}
{{ function middleEllipsis(x) { return x.length > 40 ? x.substring(0, 20) + '...' + x.substring(x.length-20, x.length): x; } }}
<div id="pageWorkers">
<div class="alertbar">
Miner Privacy Enabled! Search for your miner with Miner Lookup. Join <a href="https://discord.gg/ASMfX7B" target="_blank" rel="nofollow noreferrer noopener" class="highlight">#piratepool</a> for support and discussion! 🐸
</div>
{{ var i=0; for(var pool in it.stats.pools) { }}
<div id="workers{{=pool}}">
<div class="poolLabel">
<span style="float:right;">
<small>Miner Lookup:
<input type="text" class="form-control input-lg" onkeypress="return searchKeyPress(event);" />
<span class="input-group-btn">
<button class="btn btn-default btn-lg" type="button">Lookup</button>
</span>
</small>
</span>
{{=capitalizeFirstLetter(it.stats.pools[pool].name)}} Top Miners<span class="responsivehide"> &#160;&#160;</span><br class="responsiveonly" />
<small>
<span title="Total number of miners"><i class="fas fa-users fa-fw"></i> <span id="statsMiners{{=pool}}">{{=it.stats.pools[pool].minerCount}}</span> Miners</span><span class="responsivehide"> &#160;&#160;</span>
<span title="Total number of workers"><i class="fas fa-rocket fa-fw"></i> <span id="statsWorkers{{=pool}}">{{=it.stats.pools[pool].workerCount}}</span> Workers</span><span class="responsivehide"> &#160;&#160;</span><br class="responsiveonly" />
<span title="Current Hashrate"><i class="fas fa-tachometer-alt fa-fw"></i> <span id="statsHashrate{{=pool}}">{{=it.stats.pools[pool].hashrateString}}</span></span><span class="responsivehide"> &#160;&#160;</span>
<span title="Current round total shares"><i class="fas fa-cog fa-fw"></i> <span id="statsShares{{=pool}}">{{=bigNumber(it.stats.pools[pool].shareCount)}}</span> Shares</span>
</small>
</div>
<table class="pure-table poolMinerTable">
<thead>
<tr>
<th>Miner</th>
<th>Shares</th>
<th>Efficiency</th>
<th>Hashrate</th>
</tr>
</thead>
<tbody>
{{ var minerindex = 0; }}
{{ for(var worker in it.stats.pools[pool].miners) { }}
{{ minerindex++; }}
{{var workerstat = it.stats.pools[pool].miners[worker];}}
<tr id="miner-{{=minerindex}}" data-hashrate="{{=workerstat.hashrate}}">
<td><span class="responsiveTableLabel"><i class="far fa-address-card fa-fw"></i></span>Miner #{{=minerindex}}</td>
<td><span class="responsiveTableLabel"><i class="fas fa-cog fa-fw"></i> Shares: </span><span>{{=bigNumber(workerstat.currRoundShares)}}</span></td>
<td><span class="responsiveTableLabel"><i class="fas fa-bullseye fa-fw"></i> Efficiency: </span><span>{{? workerstat.shares > 0}} {{=Math.floor(10000 * workerstat.shares / (workerstat.shares + workerstat.invalidshares)) / 100}}% {{??}} 0% {{?}}</span></td>
<td><span class="responsiveTableLabel"><i class="fas fa-tachometer-alt fa-fw"></i> Hashrate: </span><span>{{=workerstat.hashrateString}}</span></td>
</tr>
{{ } }}
</tbody>
</table>
</div>
{{ } }}
<script>
document.querySelector('main').appendChild(document.createElement('script')).src = '/static/workers.js';
</script>
</div>

100
website/piratepool.io/static/admin.js

@ -1,100 +0,0 @@
var docCookies = {
getItem: function (sKey) {
return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
},
setItem: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) {
if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return false; }
var sExpires = "";
if (vEnd) {
switch (vEnd.constructor) {
case Number:
sExpires = vEnd === Infinity ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT" : "; max-age=" + vEnd;
break;
case String:
sExpires = "; expires=" + vEnd;
break;
case Date:
sExpires = "; expires=" + vEnd.toUTCString();
break;
}
}
document.cookie = encodeURIComponent(sKey) + "=" + encodeURIComponent(sValue) + sExpires + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "") + (bSecure ? "; secure" : "");
return true;
},
removeItem: function (sKey, sPath, sDomain) {
if (!sKey || !this.hasItem(sKey)) { return false; }
document.cookie = encodeURIComponent(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + ( sDomain ? "; domain=" + sDomain : "") + ( sPath ? "; path=" + sPath : "");
return true;
},
hasItem: function (sKey) {
return (new RegExp("(?:^|;\\s*)" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie);
}
};
var password = docCookies.getItem('password');
function showLogin(){
$('#adminCenter').hide();
$('#passwordForm').show();
}
function showAdminCenter(){
$('#passwordForm').hide();
$('#adminCenter').show();
}
function tryLogin(){
apiRequest('pools', {}, function(response){
showAdminCenter();
displayMenu(response.result)
});
}
function displayMenu(pools){
$('#poolList').after(Object.keys(pools).map(function(poolName){
return '<li class="poolMenuItem"><a href="#">' + poolName + '</a></li>';
}).join(''));
}
function apiRequest(func, data, callback){
var httpRequest = new XMLHttpRequest();
httpRequest.onreadystatechange = function(){
if (httpRequest.readyState === 4 && httpRequest.responseText){
if (httpRequest.status === 401){
docCookies.removeItem('password');
$('#password').val('');
showLogin();
alert('Incorrect Password');
}
else{
var response = JSON.parse(httpRequest.responseText);
callback(response);
}
}
};
httpRequest.open('POST', '/api/admin/' + func);
data.password = password;
httpRequest.setRequestHeader('Content-Type', 'application/json');
httpRequest.send(JSON.stringify(data));
}
if (password){
tryLogin();
}
else{
showLogin();
}
$('#passwordForm').submit(function(event){
event.preventDefault();
password = $('#password').val();
if (password){
if ($('#remember').is(':checked'))
docCookies.setItem('password', password, Infinity);
else
docCookies.setItem('password', password);
tryLogin();
}
return false;
});

BIN
website/piratepool.io/static/favicon.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 413 B

BIN
website/piratepool.io/static/favicon/android-icon-144x144.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

BIN
website/piratepool.io/static/favicon/android-icon-192x192.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

BIN
website/piratepool.io/static/favicon/android-icon-36x36.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

BIN
website/piratepool.io/static/favicon/android-icon-48x48.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

BIN
website/piratepool.io/static/favicon/android-icon-72x72.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

BIN
website/piratepool.io/static/favicon/android-icon-96x96.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

BIN
website/piratepool.io/static/favicon/apple-icon-114x114.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

BIN
website/piratepool.io/static/favicon/apple-icon-120x120.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

BIN
website/piratepool.io/static/favicon/apple-icon-144x144.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

BIN
website/piratepool.io/static/favicon/apple-icon-152x152.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

BIN
website/piratepool.io/static/favicon/apple-icon-180x180.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

BIN
website/piratepool.io/static/favicon/apple-icon-57x57.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

BIN
website/piratepool.io/static/favicon/apple-icon-60x60.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

BIN
website/piratepool.io/static/favicon/apple-icon-72x72.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

BIN
website/piratepool.io/static/favicon/apple-icon-76x76.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

BIN
website/piratepool.io/static/favicon/apple-icon-precomposed.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

BIN
website/piratepool.io/static/favicon/apple-icon.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

2
website/piratepool.io/static/favicon/browserconfig.xml

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig><msapplication><tile><square70x70logo src="/static/favicon/ms-icon-70x70.png"/><square150x150logo src="/static/favicon/ms-icon-150x150.png"/><square310x310logo src="/static/favicon/ms-icon-310x310.png"/><TileColor>#BB9645</TileColor></tile></msapplication></browserconfig>

BIN
website/piratepool.io/static/favicon/favicon-16x16.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 641 B

BIN
website/piratepool.io/static/favicon/favicon-32x32.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

BIN
website/piratepool.io/static/favicon/favicon-96x96.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

BIN
website/piratepool.io/static/favicon/favicon.ico

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

41
website/piratepool.io/static/favicon/manifest.json

@ -1,41 +0,0 @@
{
"name": "App",
"icons": [
{
"src": "\/static\/favicon\/android-icon-36x36.png",
"sizes": "36x36",
"type": "image\/png",
"density": "0.75"
},
{
"src": "\/static\/favicon\/android-icon-48x48.png",
"sizes": "48x48",
"type": "image\/png",
"density": "1.0"
},
{
"src": "\/static\/favicon\/android-icon-72x72.png",
"sizes": "72x72",
"type": "image\/png",
"density": "1.5"
},
{
"src": "\/static\/favicon\/android-icon-96x96.png",
"sizes": "96x96",
"type": "image\/png",
"density": "2.0"
},
{
"src": "\/static\/favicon\/android-icon-144x144.png",
"sizes": "144x144",
"type": "image\/png",
"density": "3.0"
},
{
"src": "\/static\/favicon\/android-icon-192x192.png",
"sizes": "192x192",
"type": "image\/png",
"density": "4.0"
}
]
}

BIN
website/piratepool.io/static/favicon/ms-icon-144x144.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

BIN
website/piratepool.io/static/favicon/ms-icon-150x150.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

BIN
website/piratepool.io/static/favicon/ms-icon-310x310.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

BIN
website/piratepool.io/static/favicon/ms-icon-70x70.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

3
website/piratepool.io/static/home.js

@ -1,3 +0,0 @@
$(function() {
initStatData();
});

13
website/piratepool.io/static/kmdfavicon.svg

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 72 72" style="enable-background:new 0 0 72 72;" xml:space="preserve">
<style type="text/css">
.st0{fill:#316565;}
.st1{fill:#FFFFFF;}
</style>
<rect x="0" y="0" class="st0" width="72" height="72"/>
<path class="st1" d="M35.9,65.4l20.8-8.5l8.7-20.8l-8.5-21L36.1,6.6l-20.8,8.5v0.2L6.6,36.1l8.5,20.8L35.9,65.4z M23,22.9L23,22.9
l13.1-5.5l13.1,5.5l5.5,13.1l-5.5,13.1l-13.1,5.5L23,49.2l-5.5-13.1L23,22.9z"/>
<polygon class="st1" points="36,46.9 43.7,43.7 46.9,35.9 43.7,28.3 36,25.1 28.4,28.3 25.2,35.9 28.2,43.7 "/>
</svg>

Before

Width:  |  Height:  |  Size: 797 B

BIN
website/piratepool.io/static/komodo-logo-horizontal-01.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

13
website/piratepool.io/static/logo.svg

@ -1,13 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" width="350px" height="350px" viewBox="0 0 350 350" enable-background="new 0 0 350 350" xml:space="preserve" xmlns:xml="http://www.w3.org/XML/1998/namespace">
<g>
<path fill="#F48438" d="M138,346H93c0,0-9,0-9-9s0-18,0-18h63c0,0,0,9,0,18S138,346,138,346z"/>
<path fill="#F48438" d="M255,346h-45c0,0-9,0-9-9s0-18,0-18h63c0,0,0,9,0,18S255,346,255,346z"/>
<path fill="#F48438" d="M30,139c0-63,105.099-79.872,143.186-80C210.458,58.875,318,76,318,139c0,0,0,84.71,0,153c0,27-27,27-27,27 H57c0,0-27,0-27-27V139z"/>
<path fill="#FFFFFF" d="M246,264.056c0,4.643-3.428,8.944-9.12,8.944H112.805c-5.691,0-10.805-4.301-10.805-8.944v-65.15 c0-4.643,5.114-7.906,10.805-7.906H236.88c5.691,0,9.12,3.264,9.12,7.906V264.056z"/>
<circle fill="#FFFFFF" cx="94.667" cy="141.667" r="20.333"/>
<circle fill="#FFFFFF" cx="252.667" cy="141.667" r="20.333"/>
<path fill="#F48438" d="M174.24,45.664c24.69-30.635,70.778-25.601,70.778-25.601l6.603,13.863c0,0-48.596-0.658-62.896,24.075 S149.551,76.3,174.24,45.664z"/>
<circle fill="#F48438" cx="259.083" cy="24.083" r="21.083"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

208
website/piratepool.io/static/main.js

@ -1,208 +0,0 @@
//Set this to match config for payment countdown
var explorerURL = 'https://explorer.pirate.black/';
var minConfirmations = 10;
var paymentInterval = 14400;
var nextPaymentTimer;
var paymentTimerOn = false;
var poolHashrateData;
var poolHashrateChart;
var lastHashrateUpdate = {};
var statData;
var poolKeys;
$(function(){
initStatData();
var hotSwap = function(page, pushSate){
if (pushSate) history.pushState(null, null, '/' + page);
$('.pure-menu-selected').removeClass('pure-menu-selected');
$('a[href="/' + page + '"]').parent().addClass('pure-menu-selected');
$.get("/get_page", {id: page}, function(data){
$('main').html(data);
}, 'html')
};
$('body').on('click', '.hot-swapper', function(event) {
if (event.which !== 1) return;
var pageId = $(this).attr('href').slice(1);
hotSwap(pageId, true);
event.preventDefault();
return false;
});
window.addEventListener('load', function() {
setTimeout(function() {
window.addEventListener("popstate", function(e) {
if (location.hash.length == 0) {
hotSwap(location.pathname.slice(1));
}
});
}, 0);
});
window.statsSource = new EventSource("/api/live_stats");
statsSource.addEventListener('message', function (e) {
var stats = JSON.parse(e.data);
var statpush = {};
//Slim down the data we save to statData
for (var pool in stats.pools) {
statpush[pool] = {hashrate: stats.pools[pool].hashrate, workerCount: stats.pools[pool].workerCount, blocks: stats.pools[pool].blocks};
}
statData.push({time:stats.time, pools: statpush});
statData.shift(); // remove old unused record
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(parseInt(stats.pools[pool].poolStats.validBlocks).toLocaleString('en'));
$('#statsTotalPaid' + pool).text(parseInt(stats.pools[pool].poolStats.totalPaid).toLocaleString('en'));
$('#statsNetworkBlocks' + pool).text(stats.pools[pool].poolStats.networkBlocks);
$('#statsNetworkDiff' + pool).text(bigNumber(stats.pools[pool].poolStats.networkDiff));
$('#statsNetworkSols' + pool).text(getReadableNetworkHashRateString(stats.pools[pool].poolStats.networkSols));
$('#statsNetworkConnections' + pool).text(stats.pools[pool].poolStats.networkConnections);
}
for (algo in stats.algos) {
$('#statsMiners' + algo).text(stats.algos[algo].workers);
$('#statsHashrate' + algo).text(stats.algos[algo].hashrateString);
}
});
});
function initStatData(callback) {
clearInterval(nextPaymentTimer);
paymentTimerOn = false;
document.querySelectorAll('.nvtooltip').forEach(function(element) {
element.remove();
});
if ( statData === undefined || statData.length == 0 ) {
$.getJSON('/api/pool_stats', function(data){
statData = data;
buildChartData();
if (typeof callback === "function") {
callback();
}
});
} else {
buildChartData();
if (typeof callback === "function") {
callback();
}
}
}
function bigNumber(x) {
return (x > 1000000000000) ? (x / 1000000000000).toFixed(1) + 'T' : (x > 1000000000) ? (x / 1000000000).toFixed(1) + 'B' : (x > 1000000) ? (x / 1000000).toFixed(1) + 'M' : (x > 1000) ? (x / 1000).toFixed(1) + 'K' : x.toFixed(1);
}
function buildChartData() {
var pools = {};
poolKeys = [];
for (var i = 0; i < statData.length; i++){
for (var pool in statData[i].pools){
if (poolKeys.indexOf(pool) === -1) {
poolKeys.push(pool);
lastHashrateUpdate[pool] = 0;
}
}
}
for (var i = 0; i < statData.length; i++) {
var time = statData[i].time * 1000;
for (var f = 0; f < poolKeys.length; f++){
var pName = poolKeys[f];
var a = pools[pName] = (pools[pName] || {
hashrate: []
});
if (pName in statData[i].pools){
a.hashrate.push([time, statData[i].pools[pName].hashrate]);
} else {
a.hashrate.push([time, 0]);
}
}
}
poolHashrateData = [];
for (var pool in pools){
poolHashrateData.push({
key: pool,
values: pools[pool].hashrate
});
$('#statsHashrateAvg' + pool).text(getReadableHashRateString(calculateAverageHashrate(pool)));
}
}
function calculateAverageHashrate(pool) {
var count = 0;
var total = 1;
var avg = 0;
for (var i = 0; i < poolHashrateData.length; i++) {
count = 0;
for (var ii = 0; ii < poolHashrateData[i].values.length; ii++) {
if (pool == null || poolHashrateData[i].key === pool) {
count++;
avg += parseFloat(poolHashrateData[i].values[ii][1]);
}
}
if (count > total)
total = count;
}
avg = avg / total;
return avg;
}
function getReadableHashRateString(hashrate){
hashrate = (hashrate * 2);
if (hashrate < 1000000) {
return (Math.round(hashrate / 1000) / 1000 ).toFixed(2)+' Sol/s';
}
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];
}
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];
}
function middleEllipsis(x, cutlength) {
if (typeof cutlength == 'undefined') {
var cutlength=15;
}
return x.length > 40 ? x.substring(0, cutlength) + '...' + x.substring(x.length-cutlength, x.length): x;
}
function readableDate(a){
return new Date(parseInt(a)).toISOString().substring(0, 16).replace('T', ' ') + ' UTC';
}
function timeOfDayFormat(timestamp){
return new Date(parseInt(timestamp)).toISOString().substring(11, 16);
}
function timeTil(timestamp) {
return (timestamp > 86400) ? (timestamp/86400).toFixed(1) + ' Days' : (timestamp > 3600) ? (timestamp/3600).toFixed(1) + ' Hours' : (timestamp > 60) ? (timestamp / 60).toFixed(1) + ' Minutes' : timestamp + ' Seconds';
}
function timeTilNumbers(timestamp) {
return new Date(timestamp * 1000).toISOString().substr(11, 8);
}
function zeroOrGreater(value) {
return (value < 0) ? 0 : value;
}

237
website/piratepool.io/static/miner_stats.js

@ -1,237 +0,0 @@
var workerHashrateData;
var workerHashrateChart;
var workerHistoryMax = 160;
var minerStatData;
var totalHash;
var totalImmature;
var totalBal;
var totalPaid;
var totalShares;
$(function() {
// resize chart on window resize
nv.utils.windowResize(triggerMinerChartUpdates);
// grab initial stats
$.getJSON('/api/worker_stats?'+_miner, function(data){
minerStatData = data;
for (var w in minerStatData.workers) { _workerCount++; }
buildMinerChartData();
displayMinerCharts();
rebuildWorkerDisplay();
updateMinerStats();
});
// live stat updates
statsSource.addEventListener('message', function(e){
if (document.querySelector('#pageMiner') !== null) {
// TODO, create miner_live_stats...
// miner_live_stats will return the same josn except without the worker history
// FOR NOW, use this to grab updated stats
$.getJSON('/api/worker_stats?'+_miner, function(data){
minerStatData = data;
// check for missing workers
var wc = 0;
var rebuilt = false;
// update worker stats
for (var w in minerStatData.workers) { wc++; }
// TODO, this isn't 100% fool proof!
if (_workerCount != wc) {
if (_workerCount > wc) {
rebuildWorkerDisplay();
rebuilt = true;
}
_workerCount = wc;
}
rebuilt = (rebuilt || updateMinerChartData());
updateMinerStats();
if (!rebuilt) {
updateWorkerStats();
}
});
var stats = JSON.parse(e.data);
}
});
});
function getWorkerNameFromAddress(w) {
var worker = w;
if (w.split(".").length > 1) {
worker = w.split(".")[1];
if (worker == null || worker.length < 1) {
worker = "noname";
}
} else {
worker = "noname";
}
return worker;
}
function buildMinerChartData(){
var workers = {};
for (var w in minerStatData.history) {
var worker = getWorkerNameFromAddress(w);
var a = workers[worker] = (workers[worker] || {
hashrate: []
});
for (var wh in minerStatData.history[w]) {
a.hashrate.push([minerStatData.history[w][wh].time * 1000, minerStatData.history[w][wh].hashrate]);
}
if (a.hashrate.length > workerHistoryMax) {
workerHistoryMax = a.hashrate.length;
}
}
var i=0;
workerHashrateData = [];
for (var worker in workers){
workerHashrateData.push({
key: worker,
//disabled: (i > Math.min((_workerCount-1), 3)),
disabled: false,
values: workers[worker].hashrate
});
i++;
}
}
function updateMinerChartData(){
var workers = {};
for (var w in minerStatData.history) {
var worker = getWorkerNameFromAddress(w);
// get a reference to lastest workerhistory
for (var wh in minerStatData.history[w]) { }
//var wh = minerStatData.history[w][minerStatData.history[w].length - 1];
var foundWorker = false;
for (var i = 0; i < workerHashrateData.length; i++) {
if (workerHashrateData[i].key === worker) {
foundWorker = true;
if (workerHashrateData[i].values.length >= workerHistoryMax) {
workerHashrateData[i].values.shift();
}
workerHashrateData[i].values.push([minerStatData.history[w][wh].time * 1000, minerStatData.history[w][wh].hashrate]);
break;
}
}
if (!foundWorker) {
var hashrate = [];
hashrate.push([minerStatData.history[w][wh].time * 1000, minerStatData.history[w][wh].hashrate]);
workerHashrateData.push({
key: worker,
values: hashrate
});
rebuildWorkerDisplay();
return true;
}
}
triggerMinerChartUpdates();
return false;
}
function calculateAverageMinerHashrate(worker) {
var count = 0;
var total = 1;
var avg = 0;
for (var i = 0; i < workerHashrateData.length; i++) {
count = 0;
for (var ii = 0; ii < workerHashrateData[i].values.length; ii++) {
if (worker == null || workerHashrateData[i].key === worker) {
count++;
avg += parseFloat(workerHashrateData[i].values[ii][1]);
}
}
if (count > total)
total = count;
}
avg = avg / total;
return avg;
}
function triggerMinerChartUpdates(){
workerHashrateChart.update();
}
function displayMinerCharts() {
nv.addGraph(function() {
workerHashrateChart = nv.models.lineChart()
.margin({left: 80, right: 30})
.x(function(d){ return d[0] })
.y(function(d){ return d[1] })
.useInteractiveGuideline(true);
workerHashrateChart.xAxis.tickFormat(timeOfDayFormat);
workerHashrateChart.yAxis.tickFormat(function(d){
return getReadableHashRateString(d);
});
d3.select('#workerHashrate').datum(workerHashrateData).call(workerHashrateChart);
return workerHashrateChart;
});
}
function updateMinerStats() {
totalHash = minerStatData.totalHash;
totalPaid = minerStatData.paid;
totalBal = minerStatData.balance;
totalImmature = minerStatData.immature;
totalShares = minerStatData.totalShares;
// do some calculations
var _blocktime = 250;
var _networkHashRate = parseFloat(minerStatData.networkSols) * 1.2;
var _myHashRate = (totalHash / 1000000) * 2;
var luckDays = ((_networkHashRate / _myHashRate * _blocktime) / (24 * 60 * 60)).toFixed(3);
// update miner stats
$("#statsHashrate").text(getReadableHashRateString(totalHash));
$("#statsHashrateAvg").text(getReadableHashRateString(calculateAverageMinerHashrate(null)));
$("#statsLuckDays").text(luckDays);
$("#statsTotalImmature").text(totalImmature);
$("#statsTotalBal").text(totalBal);
$("#statsTotalPaid").text(totalPaid);
$("#statsTotalShares").text(bigNumber(totalShares));
}
function updateWorkerStats() {
// update worker stats
var i=0;
for (var w in minerStatData.workers) { i++;
var htmlSafeWorkerName = w.split('.').join('_').replace(/[^\w\s]/gi, '');
var saneWorkerName = getWorkerNameFromAddress(w);
$("#statsHashrate"+htmlSafeWorkerName).text(getReadableHashRateString(minerStatData.workers[w].hashrate));
$("#statsHashrateAvg"+htmlSafeWorkerName).text(getReadableHashRateString(calculateAverageMinerHashrate(saneWorkerName)));
$("#statsLuckDays"+htmlSafeWorkerName).text(minerStatData.workers[w].luckDays);
$("#statsPaid"+htmlSafeWorkerName).text(minerStatData.workers[w].paid);
$("#statsBalance"+htmlSafeWorkerName).text(minerStatData.workers[w].balance);
$("#statsShares"+htmlSafeWorkerName).text(bigNumber(minerStatData.workers[w].currRoundShares));
$("#statsDiff"+htmlSafeWorkerName).text(bigNumber(zeroOrGreater(minerStatData.workers[w].diff)));
}
}
function addWorkerToDisplay(name, htmlSafeName, workerObj) {
var htmlToAdd = "";
htmlToAdd ='<div class="pure-u-1-4 pure-responsive-disable"><div class="l-box">';
htmlToAdd+='<h3 class="boxLowerHeader">';
htmlToAdd+=(htmlSafeName.indexOf("_") >= 0) ? htmlSafeName.substr(htmlSafeName.indexOf("_")+1,htmlSafeName.length) : 'noname';
htmlToAdd+='</h3>';
htmlToAdd+='<div class="boxStatsList"><ul>';
htmlToAdd+='<li><i class="fas fa-tachometer-alt fa-fw"></i> <span id="statsHashrate'+htmlSafeName+'">'+getReadableHashRateString(workerObj.hashrate)+'</span> (Now)</li>';
htmlToAdd+='<li><i class="fas fa-tachometer-alt fa-fw"></i> <span id="statsHashrateAvg'+htmlSafeName+'">'+getReadableHashRateString(calculateAverageMinerHashrate(name))+'</span> (Avg)</li>';
htmlToAdd+='<li><i class="fas fa-unlock-alt fa-fw"></i> Diff: <span id="statsDiff'+htmlSafeName+'">'+bigNumber(zeroOrGreater(workerObj.diff))+'</span></li>';
htmlToAdd+='<li><i class="fas fa-cog fa-fw"></i> Shares: <span id="statsShares'+htmlSafeName+'">'+bigNumber(workerObj.currRoundShares)+'</span></li>';
htmlToAdd+='<li><i class="fas fa-dice fa-fw"></i> Luck <span id="statsLuckDays'+htmlSafeName+'">'+workerObj.luckDays+'</span> Days</li>';
htmlToAdd+='<li><i class="fas fa-piggy-bank fa-fw"></i> Bal: <span id="statsBalance'+htmlSafeName+'">'+workerObj.balance+'</span></li>';
htmlToAdd+='<li><i class="fas fa-money-bill-wave fa-fw"></i> Paid: <span id="statsPaid'+htmlSafeName+'">'+workerObj.paid+'</span></li>';
htmlToAdd+='</ul></div></div></div>';
$("#boxesWorkers").html($("#boxesWorkers").html()+htmlToAdd);
}
function rebuildWorkerDisplay() {
$("#boxesWorkers").html("");
var i=0;
for (var w in minerStatData.workers) { i++;
var htmlSafeWorkerName = w.split('.').join('_').replace(/[^\w\s]/gi, '');
var saneWorkerName = getWorkerNameFromAddress(w);
addWorkerToDisplay(saneWorkerName, htmlSafeWorkerName, minerStatData.workers[w]);
}
}

83
website/piratepool.io/static/payments.js

@ -1,83 +0,0 @@
$(function() {
initStatData();
statsSource.addEventListener('message', function (e) {
if (document.querySelector('#pagePayments') !== null) {
var stats = JSON.parse(e.data);
for (var f = 0; f < poolKeys.length; f++) {
var pool = poolKeys[f];
for (var i = 0; i < stats.pools[pool].payments.length; i++) {
var paymentstat = stats.pools[pool].payments[i];
var existingRow = document.querySelector('#payment' + pool + paymentstat.time);
if (existingRow == null) {
clearInterval(nextPaymentTimer);
paymentTimerOn = false;
//Add new
var insertPaymentTr = document.createElement('tr');
insertPaymentTr.id = 'payment' + pool + paymentstat.time;
insertPaymentTr.setAttribute('class', 'dynamicallyInserted');
insertPaymentTr.style.opacity = 0;
insertPaymentTr.style.transition = 'opacity 1s ease-in';
if (typeof paymentstat.txid !== 'undefined') {
var explorerlink = '<a href="' + explorerURL + 'tx/' + paymentstat.txid + '" target="_blank" rel="noopener noreferrer">' + paymentstat.blocks + '</a>';
} else {
var explorerlink = '<a>' + paymentstat.blocks + '</a>';
}
insertPaymentTr.innerHTML = '<td class="paymentblocks" title="Blocks:' + paymentstat.blocks.length + ' ' + paymentstat.opid + '">'
+ '<span class="responsiveTableLabel"><i class="fas fa-link fa-fw"></i></span> <span>Blocks: [' + paymentstat.blocks.length + '] </span>'
+ explorerlink + '<div class="fade">&#9660;</div></td>';
insertPaymentTr.innerHTML += '<td><span class="responsiveTableLabel"><i class="far fa-clock fa-fw"></i> Time: </span>' + readableDate(paymentstat.time) + '</td>';
insertPaymentTr.innerHTML += '<td><span class="responsiveTableLabel"><i class="fas fa-users fa-fw"></i> Miners: </span>' + paymentstat.miners + '</td>';
insertPaymentTr.innerHTML += '<td><span class="responsiveTableLabel"><i class="fas fa-cog fa-fw"></i> Shares: </span>' + bigNumber(paymentstat.shares) + '</td>';
insertPaymentTr.innerHTML += '<td><span class="responsiveTableLabel"><i class="fas fa-money-bill-wave fa-fw"></i> Amount: </span>' + paymentstat.paid + ' ' + stats.pools[pool].symbol + '</td>';
var paymentTable = document.querySelector('#paymentTable' + pool + ' tbody');
if (paymentTable != null) {
paymentTable.insertBefore(insertPaymentTr, paymentTable.firstChild);
setTimeout(() => {
document.querySelectorAll('.dynamicallyInserted').forEach(function(newPayment) {
newPayment.style.opacity = 1;
});
}, 25);
console.log('Added new payment!');
}
} else {
//Update existing (txid) for private chains
if (typeof paymentstat.txid !== 'undefined' && (String(stats.pools[pool].name).startsWith("pirate") || String(stats.pools[pool].name).startsWith("arrr")) ) {
var paymentblock = document.querySelector('#payment' + pool + paymentstat.time + ' .paymentblocks a');
paymentblock.setAttribute('href', explorerURL + 'tx/' + paymentstat.txid);
paymentblock.setAttribute('target', '_blank');
paymentblock.setAttribute('rel', 'noopener noreferrer');
}
}
}
//Global var from main.js - cleared on initStatData(), this needs to be started after the loop in case a new payment was added and old timer needs to be reset
if (!paymentTimerOn) {
nextPaymentTimer = setInterval(function() {
var timeElement = document.querySelector('#statsNextPayment' + pool);
if (timeElement !== null) {
var timeleft=(paymentInterval-parseInt((new Date().getTime() - parseInt(stats.pools[pool].payments[0].time))/1000));
if (timeleft > 0) {
timeElement.innerHTML = timeTil(timeleft);
timeElement.setAttribute('title', timeTilNumbers(timeleft));
} else {
timeElement.innerHTML = 'Now';
timeElement.setAttribute('title', '00:00:00');
}
}
}, 1000);
paymentTimerOn = true;
}
}
}
});
});

BIN
website/piratepool.io/static/pirate128.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

BIN
website/piratepool.io/static/skull.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

BIN
website/piratepool.io/static/skull256.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

149
website/piratepool.io/static/stats.js

@ -1,149 +0,0 @@
$(function() {
initStatData(displayCharts);
nv.utils.windowResize(triggerChartUpdates);
statsSource.addEventListener('message', function (e) {
if (document.querySelector('#pageStats') !== null) {
var stats = JSON.parse(e.data);
var newPoolAdded = (function(){
for (var p in stats.pools){
if (poolKeys.indexOf(p) === -1)
return true;
}
return false;
})();
if (newPoolAdded || Object.keys(stats.pools).length > poolKeys.length) {
buildChartData();
displayCharts();
} else {
var time = stats.time * 1000;
for (var f = 0; f < poolKeys.length; f++) {
var pool = poolKeys[f];
for (var i = 0; i < poolHashrateData.length; i++) {
if (poolHashrateData[i].key === pool) {
if (time > lastHashrateUpdate[pool]) {
poolHashrateData[i].values.push([time, pool in stats.pools ? stats.pools[pool].hashrate : 0]);
poolHashrateData[i].values.shift();
$('#statsHashrateAvg' + pool).text(getReadableHashRateString(calculateAverageHashrate(pool)));
lastHashrateUpdate[pool] = time;
}
break;
}
}
/* Handle new found blocks */
var poolFoundList = document.querySelector('#blocksFound' + pool + ' .blocksFoundList');
if (poolFoundList != null) {
var pendingblocks = stats.pools[pool].pending.blocks;
var confirmedblocks = stats.pools[pool].confirmed.blocks;
var legitpending = [];
var legitconfirmed = [];
var prevHeight = 0;
document.querySelector('#blocksFoundHeaderCount' + pool).innerHTML = pendingblocks.length;
//Add new pending blocks
//@todo list starts from the heighest to lowest, if multiple blocks found in the same tick it inserts them backwards
for ( var block in pendingblocks ) {
var checkblock = pendingblocks[block].split(':');
legitpending.push(checkblock[0]);
var pendingBlockElement = document.querySelector('#blocksFoundPending' + checkblock[0]);
if (pendingBlockElement == null) {
var insertPendingBlock = document.createElement('div');
insertPendingBlock.id = 'blocksFoundPending' + checkblock[0];
insertPendingBlock.setAttribute('class', 'blocksFoundPending dynamicallyInserted');
insertPendingBlock.setAttribute('title', 'Waiting for payment processor to review');
insertPendingBlock.style.opacity = 0;
insertPendingBlock.style.transition = 'opacity 1s ease-in';
insertPendingBlock.innerHTML = '<div><i class="fas fa-link fa-fw"></i> <small>Block:</small> <a href="' + explorerURL + 'block/' + checkblock[0] + '" target="_blank" rel="noopener noreferrer">' + checkblock[2] + '</a><span style="padding-left: 10px;"><small>' + readableDate(checkblock[4]) + '</small></span><span class="countLabel">Pending</span></div>';
if (parseInt(checkblock[2]) > prevHeight) {
poolFoundList.insertBefore(insertPendingBlock, poolFoundList.firstChild);
} else {
poolFoundList.insertBefore(insertPendingBlock, poolFoundList.firstChild.nextSibling);
}
prevHeight = parseInt(checkblock[2]);
setTimeout(() => {
document.querySelectorAll('.dynamicallyInserted').forEach(function(newBlock) {
newBlock.style.opacity = 1;
});
}, 25);
}
}
//Add new confirmed blocks
//@todo simplify duplicate logic
for ( var i = 7; i >= 0; i-- ) {
var checkblock = confirmedblocks[i].split(':');
legitconfirmed.push(checkblock[0]);
var confirmedBlockElement = document.querySelector('#blocksFoundPaid' + checkblock[0]);
if (confirmedBlockElement == null) {
var insertPendingBlock = document.createElement('div');
insertPendingBlock.id = 'blocksFoundPaid' + checkblock[0];
insertPendingBlock.setAttribute('class', 'blocksFoundPaid');
insertPendingBlock.setAttribute('title', 'Payment sent, please check payments page');
insertPendingBlock.innerHTML = '<div><i class="fas fa-link fa-fw"></i> <small>Block:</small> <a href="' + explorerURL + 'block/' + checkblock[0] + '" target="_blank" rel="noopener noreferrer">' + checkblock[2] + '</a><span style="padding-left: 10px;"><small>' + readableDate(checkblock[4]) + '</small></span><span class="countLabel">Pending</span></div>';
poolFoundList.insertBefore(insertPendingBlock, document.querySelectorAll('.blocksFoundList .blocksFoundPaid')[0]);
}
}
//Update confirms
var confirmblocks = stats.pools[pool].pending.confirms;
for ( var confirm in confirmblocks ) {
var labelElement = document.querySelector('#blocksFoundPending' + confirm + ' .countLabel');
labelElement.innerHTML = (confirmblocks[confirm] == "1") ? 'Need dPoW' : confirmblocks[confirm] + "/" + minConfirmations;
}
//Remove blocks no longer in pending/confirmed list
//Reselect found list because of possible inserts above
//Loop in reverse so there's no "confusion"
var poolFoundListChildren = document.querySelectorAll('#blocksFound' + pool + ' .blocksFoundList > div');
for ( var i = poolFoundListChildren.length-1; i >= 0; i--) {
var blockDivID = poolFoundListChildren[i].id
var blockDivCheckPending = blockDivID.replace('blocksFoundPending', '');
var blockDivCheckPaid = blockDivID.replace('blocksFoundPaid', '');
var blockDivElement = document.getElementById(blockDivID);
if (blockDivElement.classList.contains("blocksFoundPending") && legitpending.indexOf(blockDivCheckPending) < 0) {
document.getElementById(blockDivID).parentNode.removeChild(document.getElementById(blockDivID));
}
if (blockDivElement.classList.contains("blocksFoundPaid") && ( legitconfirmed.indexOf(blockDivCheckPaid) < 0 || legitconfirmed.indexOf(blockDivCheckPaid) > 7 ) ) {
document.getElementById(blockDivID).parentNode.removeChild(document.getElementById(blockDivID));
}
}
}
}
triggerChartUpdates();
}
}
});
});
function displayCharts(){
nv.addGraph(function() {
poolHashrateChart = nv.models.lineChart()
.margin({top:0, right: 30, bottom:15, left: 80})
.x(function(d){ return d[0] })
.y(function(d){ return d[1] })
.useInteractiveGuideline(true);
poolHashrateChart.xAxis.tickFormat(timeOfDayFormat);
poolHashrateChart.yAxis.tickFormat(function(d){
return getReadableHashRateString(d);
});
d3.select('#poolHashrate').datum(poolHashrateData).call(poolHashrateChart);
return poolHashrateChart;
});
}
function triggerChartUpdates(){
poolHashrateChart.update();
}

557
website/piratepool.io/static/style.css

@ -1,557 +0,0 @@
:root {
--gold: #BB9645;
--blue: #082DB2;
--grey: #2f2f2f;
--dark-blue: #071642;
--dark-grey: #141414;
--light-grey: #6d6d6d;
--blood: #690015;
}
* {
box-sizing: border-box;
}
html, body, button, input, select, textarea,
.pure-g [class *= "pure-u"] {
font-family: 'Roboto', sans-serif;
line-height: 1.4em;
}
footer,
h1, h2, h3, h4, h5, h6, h7,
.home-menu,
.chartLabel,
.blocksFoundHeader,
.poolLabel,
.coinInfoHeader,
.workerStatsChartFooter,
.nv-axis text,
.countLabel {
font-family: 'Bai Jamjuree', sans-serif;
line-height:1em;
}
body {
background-color:#000;
display: flex;
flex-direction: column;
max-width: 1160px;
margin: 0 auto;
}
header {
margin-top:5px;
}
main {
background-color: var(--dark-grey);
color:#FFF;
position: relative;
}
a, a:link, a:visited {
color:#FFF;
}
a:hover {
color:var(--gold);
}
code {
font-family: monospace, serif;
display:block;
margin:15px;
padding:20px;
background-color: var(--dark-blue);
word-break:break-all;
box-shadow: -1px -1px 0 #000;
}
input {
color:#000;
}
button {
color:#FFF;
background-color: var(--gold);
border:none;
border-radius: 2px;
padding: 3px 10px;
}
table {
width: 100%;
}
footer{
text-align: center;
color: #FFF;
text-decoration: none;
font-size: 0.8em;
padding: 15px;
line-height: 24px;
}
footer a {
color: #fff;
text-decoration: none;
}
.highlight {
color:var(--gold);
font-weight:900;
}
.muted {
font-size:0.8em;
color:var(--light-grey);
}
.textshadow {
text-shadow: -3px -3px 0px #000;
}
br.responsiveonly {
display:none;
}
.alertbar {
color:var(--gold);
font-weight:900;
text-shadow: -3px -3px 0px #000;
text-align:center;
padding:10px 0;
background-color:var(--dark-blue);
}
/* Menus */
header .home-menu,
header .pure-menu {
background:transparent;
padding: 0;
margin: 5px 0;
}
header .home-menu,
header .home-menu .pure-menu-list,
header .home-menu .pure-menu-list li {
display: flex;
align-items: center;
justify-content: center;
line-height: normal !important;
flex-wrap:wrap;
}
header .home-menu a {
color: var(--gold);
font-weight:900;
font-size:1.2em;
outline: none;
transition:background-color 0.33s ease-out, color 0.33s ease-out;
}
header .home-menu a:hover,
header .home-menu .pure-menu-selected a {
color: #FFF!important;
background-color: var(--gold);
border-radius: 2px;
}
header .home-menu li a i {
margin-right:5px;
}
.pure-menu.pure-menu-open,
.pure-menu.pure-menu-horizontal li .pure-menu-children {
border:none;
}
.pure-menu .pure-menu-heading {
color: #FFF;
font-size: 1.2em;
border-bottom: 1px solid var(--grey);
margin:0;
padding: 16px 16px 12px 15px;
}
.pure-menu li a:hover {
background-color:var(--dark-blue);
color:#FFF;
}
/* PURE TABLE */
.pure-table {
border: none;
}
.pure-table thead {
background-color:var(--gold);
}
.pure-table td {
vertical-align:top;
}
.pure-table-odd td,
.pure-table-even td {
background-color: transparent;
}
.responsiveTableLabel {
display:none;
visibility:hidden;
}
/* HOME */
.boxWelcome{
background-color: var(--dark-blue);
color: white;
max-width:640px;
margin:15px auto 10px auto;
padding:5px 10px 10px;
box-shadow: -1px -1px 0 #000;
}
/* Stats Boxes */
.boxStats .l-box {
background-color: var(--dark-blue);
margin:10px;
padding:10px;
box-shadow: -1px -1px 0 #000;
}
.boxStats h3 {
margin:0;
color: var(--gold);
text-shadow: -2px -2px 0px #000;
}
.boxStatsList {
text-align:center;
}
.boxStatsList ul {
display:inline-block;
margin: 0 auto;
padding:0;
text-align: left;
}
.boxStatsList li {
list-style-type: none;
margin: 5px 0;
}
/* Stats Page */
.blocksFoundList {
clear:both;
display:flex;
flex-wrap:wrap;
justify-content: space-around;
}
.blocksFoundList > div {
margin: 5px;
padding: 5px;
text-overflow: ellipsis;
box-shadow: -1px -1px 0 #000;
flex: 1;
min-width: 150px;
max-width: 150px;
}
.blocksFoundPending {
color: #FFF;
background-color: var(--grey);
}
.blocksFoundList .countLabel {
float:right;
font-size:0.8em;
line-height:1em;
}
.blocksFoundPending .countLabel {
background-color: var(--blood);
border-radius:1px;
padding:1px;
}
.blocksFoundPaid {
background-color: var(--dark-blue);
}
.blocksFoundPaid .countLabel {
color: var(--gold);
font-weight:900;
}
.blocksFoundHeader {
font-size: 1.3em;
margin: 10px 10px 20px 10px;
display: flex;
flex-wrap: wrap;
align-items: center;
}
.blocksFoundHeader > div {
flex: 1;
}
.blocksFoundHeader > div:nth-child(2) {
font-size:0.8em;
text-align:right;
}
.minerAddress {
font-family: monospace;
}
/* GETTING STARTED */
.gettingStartedMenu,
.gettingStartedMenu.pure-menu-open {
width:100%;
display: inline-block;
background-color: var(--gold);
background: linear-gradient(to right, var(--gold) 0%,var(--dark-grey) 100%);
}
.gettingStarted .menuHeader {
color: #FFF;
font-weight:900;
border-bottom: 1px solid var(--grey);
font-size: 1.2em;
padding: 16px 16px 12px 15px;
margin:0;
text-transform:uppercase;
}
.gettingStartedMenu ul {
position: -webkit-sticky;
position:sticky;
top: 10px;
}
.gettingStartedContent {
margin: 15px;
}
.coinInfoHeader {
color: var(--gold);
margin:0;
text-shadow: -2px -2px 0px #000;
}
/* PAYMENTS */
.paymentblocks {
max-width:500px;
word-wrap:break-word;
position:relative;
}
.paymentblocks .fade {
display:none;
}
.paymentblocksexpand .fade {
display:block;
z-index: 10;
background-image: linear-gradient(to bottom, rgba(20, 20, 20, 0), rgba(20, 20, 20, 1) 90%);
width: 95%;
height: 10px;
position: absolute;
bottom: 7px;
pointer-events: none;
text-align: center;
font-size: 14px;
color: var(--gold);
transition: opacity 0.2s ease 0.33s;
}
.paymentblocks a {
display: block;
max-height: 36px;
overflow: hidden;
text-overflow: ellipsis;
transition: max-height 0.2s ease-out 0.33s;
}
.paymentblocksexpand a:hover {
max-height: 1000px;
}
.paymentblocksexpand a:hover + .fade {
opacity:0;
}
/* WORKER STATS */
.workerStatsChartHeaderLeft {
float:left;
max-width:100%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.workerStatsChartHeaderRight {
float:right;
padding-left: 18px;
font-size: .8em;
}
.workerStatsChartFooter {
display:flex;
}
.workerStatsChartFooter > div {
flex:1;
text-align:center;
}
.poolLabel {
font-size: 1.2em;
line-height: 1.5em;
text-align: center;
padding: 5px;
}
/* CHARTS */
#topCharts > div > div > svg {
display: block;
height: 280px;
}
.chartWrapper{
padding: 5px;
margin-bottom: 18px;
}
.chartLabel {
font-size: 1.2em;
line-height: 1.2em;
text-align: center;
padding: 4px;
margin:0;
}
.nvd3 .nv-axis path,
.nvd3 .nv-axis line {
fill: none;
stroke: #333333;
shape-rendering: crispEdges;
}
.nv-axis text,
.nv-legend text {
font-size: 11px;
fill: #FFFFFF;
stroke: none;
}
.nv-group.nv-series-0,
.nv-series:first-of-type .nv-legend-symbol {
stroke-opacity: 1;
fill-opacity: 0.5;
fill: var(--gold)!important;
stroke: var(--gold)!important;
}
.nvtooltip {
color:#000;
}
.nvtooltip .legend-color-guide div:first-of-type {
background-color: var(--gold)!important;
}
@media only screen and (max-width: 760px), (min-device-width: 768px) and (max-device-width: 1024px) {
.home-menu li {
margin: 0 5px;
}
.home-menu li a {
padding: 5px;
font-size: 1em;
line-height: 1em;
}
.home-menu li a i {
margin-right:0;
}
.pure-table {
border-top: 1px solid var(--grey);
}
table, thead, tbody, th, td, tr {
display: block;
}
thead tr {
display:none;
visiblity:hidden;
}
tr {
border-bottom: 1px solid var(--grey);
}
td {
border: none;
position: relative;
}
.pure-table td {
border-left:none;
padding: 5px;
max-width:100%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
br.responsiveonly {
display:initial;
}
.responsivehide {
display:none;
}
.boxWelcome h1,
.boxWelcome h2 {
text-align:center!important;
}
.blocksFoundHeader {
display:block;
}
.blocksFoundHeader > div {
text-align:center!important;
}
.blocksFoundList > div {
flex: 1;
}
.responsiveTableLabel {
display:inline-block;
visibility:visible;
}
.pure-responsive-disable,
.flex-responsive-disable {
width: 100%;
}
.paymentblocks a {
display:inline;
}
.paymentblocks .fade {
display:none;
}
}

79
website/piratepool.io/static/workers.js

@ -1,79 +0,0 @@
$(function() {
initStatData();
$('.btn-lg').click(function(){
window.location = "workers/" + $('.input-lg').val();
});
statsSource.addEventListener('message', function (e) {
if (document.querySelector('#pageWorkers') !== null) {
var stats = JSON.parse(e.data);
for (var f = 0; f < poolKeys.length; f++) {
var pool = poolKeys[f];
var sharesTotal = 0;
var minerIndex = 0;
for (var addr in stats.pools[pool].miners) {
minerIndex++;
var workerstat = stats.pools[pool].miners[addr];
sharesTotal += parseFloat(workerstat.shares);
var existingRow = document.querySelector('#workers' + pool + ' #miner-' + minerIndex);
var minerEfficiency = ( workerstat.shares > 0 ) ? Math.floor(10000 * workerstat.shares / (workerstat.shares + workerstat.invalidshares)) / 100 : 0;
if (existingRow == null) {
//Add new
var insertMinerTr = document.createElement('tr');
insertMinerTr.id = 'miner-' + minerIndex;
insertMinerTr.setAttribute('data-hashrate', workerstat.hashrate);
insertMinerTr.innerHTML = '<td><span class="responsiveTableLabel"><i class="far fa-address-card fa-fw"></i></span>Miner #'+ minerIndex +'</td>';
insertMinerTr.innerHTML += '<td><span class="responsiveTableLabel"><i class="fas fa-cog fa-fw"></i> Shares: </span><span>' + bigNumber(workerstat.shares) + '</span></td>';
insertMinerTr.innerHTML += '<td><span class="responsiveTableLabel"><i class="fas fa-bullseye fa-fw"></i> Efficiency: </span><span> ' + minerEfficiency + '%</span></td>';
insertMinerTr.innerHTML += '<td><span class="responsiveTableLabel"><i class="fas fa-tachometer-alt fa-fw"></i> Hashrate: </span><span>' + workerstat.hashrateString + '</span></td>';
document.querySelector('#workers' + pool + ' .poolMinerTable tbody').appendChild(insertMinerTr);
console.log('Added new miner! [' + minerIndex + ']');
} else {
//Update existing
document.querySelector('#workers' + pool + ' #miner-' + minerIndex + ' td:nth-child(2) span:nth-child(2)').innerHTML = bigNumber(workerstat.shares);
document.querySelector('#workers' + pool + ' #miner-' + minerIndex + ' td:nth-child(3) span:nth-child(2)').innerHTML = minerEfficiency + '%';
document.querySelector('#workers' + pool + ' #miner-' + minerIndex + ' td:nth-child(4) span:nth-child(2)').innerHTML = workerstat.hashrateString;
document.querySelector('#workers' + pool + ' #miner-' + minerIndex).setAttribute('data-hashrate', workerstat.hashrate);
}
}
document.querySelector('#statsShares' + pool).innerHTML = bigNumber(sharesTotal);
//Remove inactive
var workerList = document.querySelectorAll('#workers' + pool + ' .poolMinerTable tbody tr');
for ( var i = workerList.length-1; i >= 0; i--) {
if( typeof stats.pools[pool].miners[workerList[i].id] == 'undefined') {
console.log('Removing miner :( [' + workerTrID + ']');
workerList[i].parentNode.removeChild(workerList[i]);
}
}
//Resort table
var table = document.querySelector('#workers' + pool + ' table.poolMinerTable tbody');
var rows = document.querySelectorAll('#workers' + pool + ' table.poolMinerTable tbody tr');
var rowsArr = [].slice.call(rows).sort(function (a, b) {
return (parseFloat(a.dataset.hashrate) == parseFloat(b.dataset.hashrate)) ? 0 : ((parseFloat(a.dataset.hashrate) < parseFloat(b.dataset.hashrate)) ? 1 : -1);
});
for (var i = 0; i < rowsArr.length; i++){ table.append(rowsArr[i]); }
}
}
});
});
function searchKeyPress(e)
{
// look for window.event in case event isn't passed in
e = e || window.event;
if (e.keyCode == 13)
{
document.getElementById('btnSearch').click();
return false;
}
return true;
}
Loading…
Cancel
Save