├── website
├── static
│ ├── favicon.png
│ ├── main.js
│ ├── style.css
│ ├── admin.js
│ └── stats.js
├── pages
│ ├── api.html
│ ├── mining_key.html
│ ├── admin.html
│ ├── tbs.html
│ ├── payments.html
│ ├── workers.html
│ ├── miner_stats.html
│ └── home.html
└── index.html
├── .gitignore
├── coins
├── testnet
│ ├── btcp.json
│ ├── anon.json
│ ├── ltz.json
│ ├── safe.json
│ ├── zel.json
│ ├── xsg.json
│ ├── genx.json
│ ├── zer.json
│ ├── zec.json
│ ├── yec.json
│ ├── zen.json
│ └── btcz.json
├── kmd.json
├── zcl.json
├── hush.json
├── btcp.json
├── vot.json
├── safe.json
├── vdl.json
├── xsg.json
├── bze.json
├── ltz.json
├── zerc.json
├── zel.json
├── genx.json
├── zer.json
├── bzc.json
├── zec.json
├── yec.json
├── zen.json
└── btcz.json
├── .editorconfig
├── CHANGELOG.md
├── examples
└── example_nginx
├── Dockerfile
├── ecosystem.config.js
├── libs
├── createRedisClient.js
├── workerapi.js
├── cliListener.js
├── logUtil.js
├── apiCoinWarz.js
├── shareProcessor.js
├── mposCompatibility.js
├── api.js
├── apiCryptsy.js
└── apiPoloniex.js
├── docker-compose.yml
├── scripts
├── cli.js
└── blocknotify.c
├── package.json
├── pool_configs
└── examples
│ ├── vdl.json
│ ├── vot.json
│ ├── xsg.json
│ ├── zel.json
│ ├── zer.json
│ ├── zerc.json
│ ├── zel.testnet.json
│ ├── zer.testnet.json
│ ├── yec.json
│ ├── zcl.json
│ ├── zec.json
│ ├── zen.json
│ ├── btcp.json
│ ├── yec_testnet.json
│ ├── xsg.testnet.json
│ ├── anon_testnet.json
│ ├── zen.testnet.json
│ ├── zec.testnet.json
│ ├── btcp.testnet.json
│ ├── btcz.json
│ ├── ltz.json
│ ├── ltz_testnet.json
│ ├── kmd.json
│ ├── safe.json
│ ├── genx.json
│ ├── safe.testnet.json
│ ├── genx.testnet.json
│ ├── bzc.json
│ └── bze.json
└── config_example.json
/website/static/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EasyX-Community/s-nomp/master/website/static/favicon.png
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | config.json
2 | docker-compose.override.yml
3 | .idea/
4 | node_modules/
5 | pool_configs/*.json
6 | .vs/
7 |
--------------------------------------------------------------------------------
/coins/testnet/btcp.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "btcprivate_testnet",
3 | "symbol": "btcpt",
4 | "algorithm": "equihash",
5 | "requireShielding": true,
6 | "peerMagic": "f61bf6d6",
7 | "txfee": 0.0004
8 | }
9 |
10 |
--------------------------------------------------------------------------------
/coins/testnet/anon.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "anon_testnet",
3 | "symbol": "anont",
4 | "algorithm": "equihash",
5 | "parameters": {
6 | "N": 144,
7 | "K": 5,
8 | "personalization": "AnonyPoW"
9 | },
10 | "requireShielding": true,
11 | "peerMagic": "7a748d38",
12 | "txfee": 0.0004
13 | }
14 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # EditorConfig is awesome: https://EditorConfig.org
2 |
3 | # top-most EditorConfig file
4 | root = true
5 |
6 | # Unix-style newlines with a newline ending every file
7 | [*]
8 | end_of_line = unset
9 | insert_final_newline = true
10 |
11 | #charset
12 | charset = utf-8
13 |
14 | #space indentation
15 | indent_style = space
16 | indent_size = 4
17 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | ### 20161127
4 | * Fixed payment processor crashes
5 | * Fixed varDiff and set default to 0.125
6 | * Fixed merkleRoot issue with multiple transactions in each block
7 | * Fixed incorrect hashrates
8 | * Begin compatibility testing with Node 7+
9 | * Added t_address -> z_address -> t_address coin transfer function
10 |
11 |
12 |
--------------------------------------------------------------------------------
/coins/testnet/ltz.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "litecoinz_testnet",
3 | "symbol": "ltzt",
4 | "algorithm": "equihash",
5 | "sapling": true,
6 | "parameters": {
7 | "N": 144,
8 | "K": 5,
9 | "personalization": "ZcashPoW"
10 | },
11 | "requireShielding": true,
12 | "peerMagicTestnet": "fe90865d",
13 | "peerMagic": "fe90865d",
14 | "txfee": 0.0001
15 | }
16 |
--------------------------------------------------------------------------------
/examples/example_nginx:
--------------------------------------------------------------------------------
1 | server {
2 | listen 80;
3 |
4 | root /var/www/html;
5 |
6 | index index.html index.htm index.nginx-debian.html;
7 |
8 | location / {
9 | try_files $uri $uri/ =404;
10 | }
11 |
12 | location ~ .$ {
13 | proxy_set_header X-Real-IP $remote_addr;
14 | proxy_set_header X-Forwarded-For $remote_addr;
15 | proxy_set_header Host $host;
16 | proxy_pass http://127.0.0.1:8080;
17 | }
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM keymetrics/pm2:8-stretch
2 |
3 | RUN apt-get -yqq update && \
4 | apt-get -yqq upgrade && \
5 | apt-get -yqq install libboost-all-dev libsodium-dev
6 |
7 | RUN apt-get -yqq install vim git zsh tmux silversearcher-ag && \
8 | curl -Lo- http://bit.ly/2pztvLf | bash
9 |
10 | ENV SHELL /bin/zsh
11 | ENV NPM_CONFIG_LOGLEVEL warn
12 |
13 | CMD ["pm2-runtime", "start", "ecosystem.config.js", "--only", "site"]
14 |
--------------------------------------------------------------------------------
/ecosystem.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | /**
3 | * Application configuration section
4 | * http://pm2.keymetrics.io/docs/usage/application-declaration/
5 | */
6 | apps: [{
7 | name: 'site',
8 | script: 'init.js',
9 | node_args: '--max_old_space_size=2048',
10 | max_memory_restart : "4G",
11 | env_production: {
12 | NODE_ENV: 'production'
13 | }
14 | }]
15 | }
16 |
--------------------------------------------------------------------------------
/coins/kmd.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "komodo",
3 | "symbol": "kmd",
4 | "algorithm": "equihash",
5 | "txfee": 0.00005,
6 |
7 | "explorer": {
8 | "txURL": "https://kmdexplorer.io/tx/",
9 | "blockURL": "https://kmdexplorer.io/block/",
10 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/libs/createRedisClient.js:
--------------------------------------------------------------------------------
1 | var redis = require('redis');
2 |
3 | module.exports = function createRedisClient(redisConfig) {
4 |
5 | var bSocket = ((typeof redisConfig.socket !== "undefined") && (redisConfig.socket != ""));
6 | var client = bSocket ?
7 | redis.createClient(redisConfig.socket) :
8 | redis.createClient(redisConfig.port, redisConfig.host);
9 |
10 | client.snompEndpoint = bSocket ? redisConfig.socket : redisConfig.host + ':' + redisConfig.port;
11 |
12 | return client;
13 | };
14 |
--------------------------------------------------------------------------------
/coins/zcl.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "zclassic",
3 | "symbol": "zcl",
4 | "algorithm": "equihash",
5 | "requireShielding": true,
6 | "peerMagic": "24e92764",
7 | "txfee": 0.0004,
8 | "sapling": true,
9 |
10 | "explorer": {
11 | "txURL": "",
12 | "blockURL": "",
13 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/coins/hush.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "zdash",
3 | "symbol": "zdash",
4 | "algorithm": "equihash",
5 | "requireShielding": true,
6 | "txfee": 0.0004,
7 |
8 | "explorer": {
9 | "txURL": "https://explorer.myhush.org/tx/",
10 | "blockURL": "https://explorer.myhush.org/block/",
11 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '3'
2 |
3 | services:
4 | site:
5 | build:
6 | context: .
7 | working_dir: /site
8 | ports:
9 | - 80
10 | volumes:
11 | - ./:/site
12 | - ../.zsh_history:/root/.zsh_history
13 | ulimits:
14 | nofile:
15 | soft: 999999
16 | hard: 999999
17 | command: ["pm2-runtime", "start", "ecosystem.config.js", "--only", "site"]
18 |
19 | redis:
20 | image: redis:latest
21 | volumes:
22 | - ../.redis:/data
23 |
24 | # vim:set ts=2 sw=2 smarttab:
25 |
--------------------------------------------------------------------------------
/coins/btcp.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "btcprivate",
3 | "symbol": "btcp",
4 | "algorithm": "equihash",
5 | "requireShielding": true,
6 | "peerMagic": "a8eaa2cd",
7 | "txfee": 0.0004,
8 | "explorer": {
9 | "txURL": "https://explorer.btcprivate.org/tx/",
10 | "blockURL": "https://explorer.btcprivate.org/block/",
11 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.btcprivate.org/tx/). The pool will automatically add the transaction id or block id at the end."
12 | }
13 | }
14 |
15 |
--------------------------------------------------------------------------------
/coins/testnet/safe.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "safecoin_testnet",
3 | "symbol": "safet",
4 | "algorithm": "equihash",
5 | "parameters": {
6 | "N": 192,
7 | "K": 7,
8 | "personalization": "Safecoin"
9 | },
10 | "peerMagic": "5b1e7f63",
11 |
12 | "explorer": {
13 | "txURL": "#",
14 | "blockURL": "#",
15 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/website/pages/api.html:
--------------------------------------------------------------------------------
1 |
2 | API - The API is work in progress and is subject to change during development.
3 |
4 |
13 |
14 |
--------------------------------------------------------------------------------
/coins/vot.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "votecoin",
3 | "symbol": "vot",
4 | "algorithm": "equihash",
5 | "sapling": true,
6 | "overwinter": true,
7 | "requireShielding": true,
8 | "txfee": 0.0004,
9 | "peerMagic": "24e92764",
10 |
11 | "explorer": {
12 | "txURL": "https://explorer.votecoin.site/tx/",
13 | "blockURL": "https://explorer.votecoin.site/block/",
14 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/website/pages/mining_key.html:
--------------------------------------------------------------------------------
1 |
13 |
14 |
15 |
16 |
17 | This script run client-side (in your browser). For maximum security download the script and run it locally and
18 | offline in a modern web browser.
19 |
20 |
21 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/coins/safe.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "safecoin",
3 | "symbol": "safe",
4 | "algorithm": "equihash",
5 | "parameters": {
6 | "N": 192,
7 | "K": 7,
8 | "personalization": "Safecoin"
9 | },
10 | "peerMagic": "f1ede28f",
11 | "sapling": true,
12 | "explorer": {
13 | "txURL": "https://explorer.safecoin.org/tx/",
14 | "blockURL": "https://explorer.safecoin.org/block/",
15 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/coins/vdl.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vidulum",
3 | "symbol": "vdl",
4 | "algorithm": "equihash",
5 | "requireShielding": true,
6 | "peerMagic": "deadc001",
7 | "parameters": {
8 | "N": 192,
9 | "K": 7,
10 | "personalization": "EquivPoW"
11 | },
12 | "explorer": {
13 | "txURL": "https://explorer.vidulum.app/tx/",
14 | "blockURL": "https://explorer.vidulum.app/block/",
15 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/coins/xsg.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "snowgem",
3 | "symbol": "xsg",
4 | "algorithm": "equihash",
5 | "parameters": {
6 | "N": 144,
7 | "K": 5,
8 | "personalization": "sngemPoW"
9 | },
10 | "requireShielding": true,
11 | "payFoundersReward": true,
12 | "peerMagic": "24c82764",
13 | "sapling": true,
14 |
15 | "explorer": {
16 | "txURL": "https://insight.snowgem.org/tx/",
17 | "blockURL": "https://insight.snowgem.org/block/",
18 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/coins/bze.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "bzedge",
3 | "symbol": "bze",
4 | "algorithm": "equihash",
5 | "parameters": {
6 | "N": 144,
7 | "K": 5,
8 | "personalization": "BZEZhash"
9 | },
10 | "sapling": true,
11 | "requireShielding": true,
12 | "txfee": 0.0001,
13 | "peerMagic": "24e92764",
14 | "explorer": {
15 | "txURL": "https://explorer.getbze.com/tx/",
16 | "blockURL": "https://explorer.getbze.com/block/",
17 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/coins/ltz.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "litecoinz",
3 | "symbol": "ltz",
4 | "algorithm": "equihash",
5 | "sapling": 190000,
6 | "parameters": {
7 | "N": 144,
8 | "K": 5,
9 | "personalization": "ZcashPoW"
10 | },
11 | "requireShielding": true,
12 | "txfee": 0.0001,
13 | "peerMagic": "d8cfcd93",
14 | "explorer": {
15 | "txURL": "https://insight.litecoinz.org/tx/",
16 | "blockURL": "https://insight.litecoinz.org/block/",
17 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/coins/zerc.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "zeroclassic",
3 | "symbol": "zerc",
4 | "algorithm": "equihash",
5 | "parameters": {
6 | "N": 192,
7 | "K": 7,
8 | "personalization": "ZERO_PoW"
9 | },
10 | "sapling": true,
11 | "requireShielding": true,
12 | "peerMagic": "5A455243",
13 | "txfee": 0.0004,
14 | "explorer": {
15 | "txURL": "http://explorer.zeroclassic.org/tx/",
16 | "blockURL": "http://explorer.zeroclassic.org/block/",
17 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/coins/zel.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "zelcash",
3 | "symbol": "zel",
4 | "algorithm": "equihash",
5 | "parameters": {
6 | "N": 125,
7 | "K": 4,
8 | "personalization": "ZelProof"
9 | },
10 | "requireShielding": true,
11 | "txfee": 0.0001,
12 | "peerMagic": "24e92764",
13 | "sapling": true,
14 | "payZelNodes": 1550952000,
15 | "explorer": {
16 | "txURL": "https://explorer.zel.cash/tx/",
17 | "blockURL": "https://explorer.zel.cash/block/",
18 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/coins/testnet/zel.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "zelcash",
3 | "symbol": "zel",
4 | "algorithm": "equihash",
5 | "parameters": {
6 | "N": 125,
7 | "K": 4,
8 | "personalization": "ZelProof"
9 | },
10 | "requireShielding": true,
11 | "txfee": 0.0001,
12 | "peerMagic": "fa1af9bf",
13 | "sapling": true,
14 | "payZelNodes": 1560812290,
15 | "explorer": {
16 | "txURL": "https://testnet.zel.cash/tx/",
17 | "blockURL": "https://testnet.zel.cash/block/",
18 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/coins/testnet/xsg.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "snowgem_testnet",
3 | "symbol": "xsgt",
4 | "algorithm": "equihash",
5 | "parameters": {
6 | "N": 144,
7 | "K": 5,
8 | "personalization": "sngemPoW"
9 | },
10 | "requireShielding": true,
11 | "payFoundersReward": true,
12 | "peerMagic": "24c82764",
13 | "sapling": true,
14 | "txfee": 0.0004,
15 |
16 | "explorer": {
17 | "txURL": "http://testnet.explorer.snowgem.org/tx/",
18 | "blockURL": "http://testnet.explorer.snowgem.org/block/",
19 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/website/static/main.js:
--------------------------------------------------------------------------------
1 | $(function(){
2 |
3 | var hotSwap = function(page, pushSate){
4 | if (pushSate) history.pushState(null, null, '/' + page);
5 | $('.pure-menu-selected').removeClass('pure-menu-selected');
6 | $('a[href="/' + page + '"]').parent().addClass('pure-menu-selected');
7 | $.get("/get_page", {id: page}, function(data){
8 | $('main').html(data);
9 | }, 'html')
10 | };
11 |
12 | $('.hot-swapper').click(function(event){
13 | if (event.which !== 1) return;
14 | var pageId = $(this).attr('href').slice(1);
15 | hotSwap(pageId, true);
16 | event.preventDefault();
17 | return false;
18 | });
19 |
20 | window.addEventListener('load', function() {
21 | setTimeout(function() {
22 | window.addEventListener("popstate", function(e) {
23 | hotSwap(location.pathname.slice(1));
24 | });
25 | }, 0);
26 | });
27 |
28 | window.statsSource = new EventSource("/api/live_stats");
29 |
30 | });
31 |
--------------------------------------------------------------------------------
/scripts/cli.js:
--------------------------------------------------------------------------------
1 | var net = require('net');
2 |
3 | var defaultPort = 17117;
4 | var defaultHost = '127.0.0.1';
5 |
6 | var args = process.argv.slice(2);
7 | var params = [];
8 | var options = {};
9 |
10 | for(var i = 0; i < args.length; i++){
11 | if (args[i].indexOf('-') === 0 && args[i].indexOf('=') !== -1){
12 | var s = args[i].substr(1).split('=');
13 | options[s[0]] = s[1];
14 | }
15 | else
16 | params.push(args[i]);
17 | }
18 |
19 | var command = params.shift();
20 |
21 |
22 |
23 | var client = net.connect(options.port || defaultPort, options.host || defaultHost, function () {
24 | client.write(JSON.stringify({
25 | command: command,
26 | params: params,
27 | options: options
28 | }) + '\n');
29 | }).on('error', function(error){
30 | if (error.code === 'ECONNREFUSED')
31 | console.log('Could not connect to NOMP instance at ' + defaultHost + ':' + defaultPort);
32 | else
33 | console.log('Socket error ' + JSON.stringify(error));
34 | }).on('data', function(data) {
35 | console.log(data.toString());
36 | }).on('close', function () {
37 | });
--------------------------------------------------------------------------------
/coins/genx.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "genesis",
3 | "symbol": "genx",
4 | "algorithm": "equihash",
5 | "parameters": {
6 | "N": 192,
7 | "K": 7,
8 | "personalization": "GENX_PoW"
9 | },
10 | "requireShielding": false,
11 | "txfee": 0.0001,
12 | "peerMagic": "6b17a4bf",
13 | "payFoundersReward": true,
14 | "payAllFounders": true,
15 | "supportsSegwit": true,
16 | "foundersRewardAddresses": [
17 | "SPfqCriDDxsaH854z3YHigCNUPfSdN3sr1",
18 | "SaSmUn7LkjmV2WUH1dKFK1xZR1FMRT4qrn",
19 | "SbfnZN1rPdFq4WsfUUjxphGFcfEits7JXH",
20 | "SSW62dCjdCxNbKiZdmJh5GLepauY1J1rXU",
21 | "SW9GN4tZVfPftAQvGmZQLbK6NqePSs8fX1"
22 | ],
23 | "infrastructureAddresses": [
24 | "SYSaqv2yChvf462gqmVX8VLrh3m6mXiPLd"
25 | ],
26 | "giveawayAddresses": [
27 | "SQnWFjgxMJyyMQK97gjdF8gYBUUH3kSWEA"
28 | ],
29 | "explorer": {
30 | "txURL": "http://explorer.genesisnetwork.io/tx/",
31 | "blockURL": "http://explorer.genesisnetwork.io/block/",
32 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
33 | }
34 | }
35 |
36 |
--------------------------------------------------------------------------------
/coins/testnet/genx.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "genesis_testnet",
3 | "symbol": "genxt",
4 | "algorithm": "equihash",
5 | "parameters": {
6 | "N": 192,
7 | "K": 7,
8 | "personalization": "GENX_PoW"
9 | },
10 | "requireShielding": false,
11 | "txfee": 0.0001,
12 | "peerMagic": "c654aac3",
13 | "payFoundersReward": true,
14 | "payAllFounders": true,
15 | "supportsSegwit": true,
16 | "foundersRewardAddresses": [
17 | "cHTa12xmjeDt4PykhVQLe9F1NGfayGfiC7",
18 | "c43Dy1h4Smp5EKjeF5sZew9SECVVUfkNnV",
19 | "c8wETLX6n3xbeNz4SAyf64E9vHPs3gNR2f",
20 | "c4wozCPLGwvuSXngEHaE8P9xMNzoaRU8Ss",
21 | "cAbEZ8P6b5a1HbC5LDksMifnGvgrgRrND6"
22 | ],
23 | "infrastructureAddresses": [
24 | "cFDCRyLcXFWCPMMyxUJajGCPdJLoyAzck6"
25 | ],
26 | "giveawayAddresses": [
27 | "c4NjsSBF4NGXbzxAJUiK1P1KfmxpxXiaaP"
28 | ],
29 | "explorer": {
30 | "txURL": "https://testnet.genesisnetwork.io/tx/",
31 | "blockURL": "https://testnet.genesisnetwork.io/block/",
32 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
33 | }
34 | }
35 |
36 |
--------------------------------------------------------------------------------
/libs/workerapi.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var os = require('os');
3 |
4 |
5 | function workerapi(listen) {
6 | var _this = this;
7 | var app = express();
8 | var counters = {
9 | validShares : 0,
10 | validBlocks : 0,
11 | invalidShares : 0
12 | };
13 |
14 | var lastEvents = {
15 | lastValidShare : 0 ,
16 | lastValidBlock : 0,
17 | lastInvalidShare : 0
18 | };
19 |
20 | app.get('/stats', function (req, res) {
21 | res.send({
22 | "clients" : Object.keys(_this.poolObj.stratumServer.getStratumClients()).length,
23 | "counters" : counters,
24 | "lastEvents" : lastEvents
25 | });
26 | });
27 |
28 |
29 | this.start = function (poolObj) {
30 | this.poolObj = poolObj;
31 | this.poolObj.once('started', function () {
32 | app.listen(listen, function (lol) {
33 | console.log("LISTENING ");
34 | });
35 | })
36 | .on('share', function(isValidShare, isValidBlock, shareData) {
37 | var now = Date.now();
38 | if (isValidShare) {
39 | counters.validShares ++;
40 | lastEvents.lastValidShare = now;
41 | if (isValidBlock) {
42 | counters.validBlocks ++;
43 | lastEvents.lastValidBlock = now;
44 | }
45 | } else {
46 | counters.invalidShares ++;
47 | lastEvents.lastInvalidShare = now;
48 | }
49 | });
50 | }
51 | }
52 |
53 |
54 |
55 | module.exports = workerapi;
56 |
57 |
--------------------------------------------------------------------------------
/libs/cliListener.js:
--------------------------------------------------------------------------------
1 | var events = require('events');
2 | var net = require('net');
3 |
4 | var listener = module.exports = function listener(server, port){
5 |
6 | var _this = this;
7 |
8 | var emitLog = function(text){
9 | _this.emit('log', text);
10 | };
11 |
12 |
13 | this.start = function(){
14 | net.createServer(function(c) {
15 |
16 | var data = '';
17 | try {
18 | c.on('data', function (d) {
19 | data += d;
20 | if (data.slice(-1) === '\n') {
21 | var message = JSON.parse(data);
22 | _this.emit('command', message.command, message.params, message.options, function(message){
23 | c.end(message);
24 | });
25 | }
26 | });
27 | c.on('end', function () {
28 |
29 | });
30 | c.on('error', function () {
31 |
32 | });
33 | }
34 | catch(e){
35 | emitLog('CLI listener failed to parse message ' + data);
36 | }
37 |
38 | }).listen(port, server, function() {
39 | emitLog('CLI listening on ' + server + ":" + port)
40 | });
41 | }
42 |
43 | };
44 |
45 | listener.prototype.__proto__ = events.EventEmitter.prototype;
46 |
--------------------------------------------------------------------------------
/website/pages/admin.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
18 |
19 |
32 |
33 |
34 |
35 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/website/static/style.css:
--------------------------------------------------------------------------------
1 | html, button, input, select, textarea, .pure-g [class *= "pure-u"], .pure-g-r [class *= "pure-u"]{
2 | font-family: 'Open Sans', sans-serif;
3 | }
4 |
5 | html{
6 | background: #2d2d2d;
7 | overflow-y: scroll;
8 | }
9 |
10 | body{
11 | display: flex;
12 | flex-direction: column;
13 | max-width: 1160px;
14 | margin: 0 auto;
15 | }
16 |
17 | header > .home-menu{
18 | background: inherit !important;
19 | height: 54px;
20 | display: flex;
21 | }
22 |
23 | header > .home-menu > a.pure-menu-heading, header > .home-menu > ul, header > .home-menu > ul > li{
24 | display: flex !important;
25 | align-items: center;
26 | justify-content: center;
27 | line-height: normal !important;
28 | }
29 |
30 | header > .home-menu > a.pure-menu-heading{
31 | color: white;
32 | font-size: 1.5em;
33 | }
34 |
35 | header > .home-menu > ul > li > a{
36 | color: #ced4d9;
37 | }
38 |
39 | header > .home-menu > ul > li > a:hover, header > .home-menu > ul > li > a:focus{
40 | background: inherit !important;
41 | }
42 |
43 | header > .home-menu > ul > li > a:hover, header > .home-menu > ul > li.pure-menu-selected > a{
44 | color: white;
45 | }
46 |
47 | main{
48 | background-color: #ebf4fa;
49 | position: relative;
50 | }
51 |
52 | footer{
53 | text-align: center;
54 | color: #b3b3b3;
55 | text-decoration: none;
56 | font-size: 0.8em;
57 | padding: 15px;
58 | line-height: 24px;
59 | }
60 |
61 | footer a{
62 | color: #fff;
63 | text-decoration: none;
64 | }
65 |
66 | footer iframe{
67 | vertical-align: middle;
68 | }
--------------------------------------------------------------------------------
/website/pages/tbs.html:
--------------------------------------------------------------------------------
1 |
34 |
35 |
36 |
37 |
38 | Pool
39 | Algo
40 | Workers
41 | Valid Shares
42 | Invalid Shares
43 | Total Blocks
44 | Pending
45 | Confirmed
46 | Orphaned
47 | Hashrate
48 |
49 |
50 | {{ for(var pool in it.stats.pools) { }}
51 |
52 | {{=it.stats.pools[pool].name}}
53 | {{=it.stats.pools[pool].algorithm}}
54 | {{=Object.keys(it.stats.pools[pool].workers).length}}
55 | {{=it.stats.pools[pool].poolStats.validShares}}
56 | {{=it.stats.pools[pool].poolStats.invalidShares}}
57 | {{=it.stats.pools[pool].poolStats.validBlocks}}
58 | {{=it.stats.pools[pool].blocks.pending}}
59 | {{=it.stats.pools[pool].blocks.confirmed}}
60 | {{=it.stats.pools[pool].blocks.orphaned}}
61 | {{=it.stats.pools[pool].hashrateString}}
62 |
63 | {{ } }}
64 |
65 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "s-nomp",
3 | "version": "0.0.9",
4 | "description": "zero-proof (Equihash) node stratum mining pool based on NOMP",
5 | "keywords": [
6 | "stratum",
7 | "mining",
8 | "pool",
9 | "server",
10 | "poolserver",
11 | "equihash"
12 | ],
13 | "homepage": "https://github.com/s-nomp/s-nomp",
14 | "bugs": {
15 | "url": "https://github.com/s-nomp/s-nomp/issues"
16 | },
17 | "license": "MIT",
18 | "author": "s-nomp dev team",
19 | "contributors": [
20 | "aayanl",
21 | "egyptianbman",
22 | "Matthew Little",
23 | "sennevb",
24 | "TheSeven",
25 | "vekexasia"
26 | ],
27 | "main": "init.js",
28 | "bin": {
29 | "block-notify": "./scripts/blockNotify.js"
30 | },
31 | "repository": {
32 | "type": "git",
33 | "url": "https://github.com/s-nomp/s-nomp.git"
34 | },
35 | "dependencies": {
36 | "async": "^2.6.1",
37 | "bignum": "^0.13.0",
38 | "body-parser": "^1.18.3",
39 | "colors": "^1.3.1",
40 | "compression": "^1.7.3",
41 | "dateformat": "^3.0.3",
42 | "dot": "^1.1.2",
43 | "express": "^4.16.3",
44 | "extend": "^3.0.2",
45 | "mysql": "^2.16.0",
46 | "node-json-minify": "^1.0.0",
47 | "node-watch": "^0.5.8",
48 | "nonce": "^1.0.4",
49 | "redis": "^2.8.0",
50 | "request": "^2.88.0",
51 | "stratum-pool": "git+https://github.com/s-nomp/node-stratum-pool.git"
52 | },
53 | "engines": {
54 | "node": ">=8.11"
55 | },
56 | "scripts": {
57 | "start": "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/node_modules/stratum-pool/node_modules/equihashverify/build/Release/:$PWD/node_modules/equihashverify/build/Release/ node init.js"
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/coins/testnet/zer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "zero_testnet",
3 | "symbol": "zert",
4 | "algorithm": "equihash",
5 | "parameters": {
6 | "N": 192,
7 | "K": 7,
8 | "personalization": "ZERO_PoW"
9 | },
10 | "sapling": true,
11 | "overwinter": true,
12 | "requireShielding": true,
13 | "payFoundersReward": true,
14 | "percentFoundersReward": 7.5,
15 | "maxFoundersRewardBlockHeight": 7999999,
16 | "foundersRewardAddressChangeInterval": 800000,
17 | "vFoundersRewardAddress": [
18 | "t2BEnZwurNtPyhyWdZ82zTdS93rKyoUpgMJ",
19 | "t2AwNRubry4rQrEvHwAdpYve4Gz5cSmjGXA",
20 | "t2FM2EZqQZANA18rbhBGLWbxKcpGk9soAvS",
21 | "t2TBZfnXRCmFPc3nSrQcNtnR6AGWNzF9hzz",
22 | "t2QMyS1C3jXJ5hcR7zJTPSbWFvMWQEyjVTE",
23 | "t2SxA3E34aZJDDxnUxC2gZXBVrXWuoH5v7W",
24 | "t2FhR8STLvuKTUPgM586T1LMUG4JAHV2XSt",
25 | "t2NScRwr3FHPN8fNSgMKn8ngZG2kgfC8JNt",
26 | "t2LYZj3LiCDaCGUXQNXH1ZFPmHiC46wB9se",
27 | "t28azskSALVTtgbW63CqDwzXgtWQ56GVVXa"
28 | ],
29 | "txfee": 0.0001,
30 | "peerMagic": "5a45524f",
31 | "explorer": {
32 | "txURL": "#",
33 | "blockURL": "#",
34 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.btcprivate.org/tx/). The pool will automatically add the transaction id or block id at the end."
35 | },
36 | "network": {
37 | "messagePrefix": "\u0018ZCash Signed Message:\n",
38 | "bech32": "bc",
39 | "bip32": {
40 | "public": 70617039,
41 | "private": 70615956
42 | },
43 | "pubKeyHash": 7461,
44 | "scriptHash": 7354,
45 | "wif": 239,
46 | "consensusBranchId": {
47 | "1": 0,
48 | "2": 0,
49 | "3": 1870033530,
50 | "4": 1935765626
51 | },
52 | "isZcash": true
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/coins/zer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "zero",
3 | "symbol": "zer",
4 | "algorithm": "equihash",
5 | "parameters": {
6 | "N": 192,
7 | "K": 7,
8 | "personalization": "ZERO_PoW"
9 | },
10 | "sapling": true,
11 | "requireShielding": true,
12 | "payFoundersReward": true,
13 | "percentFoundersReward": 7.5,
14 | "maxFoundersRewardBlockHeight": 7999999,
15 | "foundersRewardAddressChangeInterval": 800000,
16 | "vFoundersRewardAddress": [
17 | "t3hmg6WApjqVFw9oPWTDy4JLEqXcUWthg5v",
18 | "t3hrh5M7eaGA5zXCitPXz2pbe146GkVPWHs",
19 | "t3aWmHqBGS7watoKQLa7uykeTaYHoYqM361",
20 | "t3hsi89hPsZzmnbs3pny6cfAxMxV5TJLErj",
21 | "t3TdGxPVUdMXd6qDrDCEuJETLadZ9Ki3s9r",
22 | "t3cb5ZjKmbGbqDaYk97Auam9kXXikGQBmyY",
23 | "t3V1YovGUPW9WSBoAHS48FDdUfUTo6LDpZR",
24 | "t3KB9n28MVg31oo856t1tQGfJuYq8usTvSi",
25 | "t3dqSV4YGj5V3WjQhqFGrKTMUf9Tgc6xnJM",
26 | "t3aJkYT1i6tyytq8J6khPaDNtgZsBSXgfBf"
27 | ],
28 | "txfee": 0.0001,
29 | "peerMagic": "5a45524f",
30 | "explorer": {
31 | "txURL": "https://insight.zerocurrency.io/insight/tx/",
32 | "blockURL": "https://insight.zerocurrency.io/insight/block/",
33 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://zeroexplorer.forgetop.com/tx/). The pool will automatically add the transaction id or block id at the end."
34 | },
35 | "network": {
36 | "messagePrefix": "\u0018ZCash Signed Message:\n",
37 | "bech32": "bc",
38 | "bip32": {
39 | "public": 76067358,
40 | "private": 76066276
41 | },
42 | "pubKeyHash": 7352,
43 | "scriptHash": 7357,
44 | "wif": 128,
45 | "consensusBranchId": {
46 | "1": 0,
47 | "2": 0,
48 | "3": 1870033530,
49 | "4": 1935765626
50 | },
51 | "isZcash": true
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/scripts/blocknotify.c:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 | #include
6 | #include
7 | #include
8 |
9 | /*
10 |
11 | Contributed by Alex Petrov aka SysMan at sysman.net
12 | Updated by Alejandro Reyero - TodoJuegos.com
13 |
14 | Part of NOMP project
15 | Simple lightweight & fast - a more efficient block notify script in pure C.
16 |
17 | (may also work as coin switch)
18 |
19 | Platforms : Linux, BSD, Solaris (mostly OS independent)
20 |
21 | Build with:
22 | gcc blocknotify.c -o blocknotify
23 |
24 |
25 | Example usage in daemon coin.conf using default NOMP CLI port of 17117
26 | blocknotify="/bin/blocknotify 127.0.0.1:17117 dogecoin %s"
27 |
28 |
29 |
30 | */
31 |
32 |
33 | int main(int argc, char **argv)
34 | {
35 | int sockfd,n;
36 | struct sockaddr_in servaddr, cliaddr;
37 | char sendline[1000];
38 | char recvline[1000];
39 | char host[200];
40 | char *p, *arg, *errptr;
41 | int port;
42 |
43 | if (argc < 3)
44 | {
45 | // print help
46 | printf("NOMP pool block notify\n usage: \n");
47 | exit(1);
48 | }
49 |
50 | strncpy(host, argv[1], (sizeof(host)-1));
51 | p = host;
52 |
53 | if ( (arg = strchr(p,':')) )
54 | {
55 | *arg = '\0';
56 |
57 | errno = 0; // reset errno
58 | port = strtol(++arg, &errptr, 10);
59 |
60 | if ( (errno != 0) || (errptr == arg) )
61 | {
62 | fprintf(stderr, "port number fail [%s]\n", errptr);
63 | }
64 |
65 | }
66 |
67 | snprintf(sendline, sizeof(sendline) - 1, "{\"command\":\"blocknotify\",\"params\":[\"%s\",\"%s\"]}\n", argv[2], argv[3]);
68 |
69 | sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
70 | bzero(&servaddr, sizeof(servaddr));
71 | servaddr.sin_family = AF_INET;
72 | servaddr.sin_addr.s_addr = inet_addr(host);
73 | servaddr.sin_port = htons(port);
74 | connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
75 |
76 | int result = send(sockfd, sendline, strlen(sendline), 0);
77 | close(sockfd);
78 |
79 | if(result == -1) {
80 | printf("Error sending: %i\n", errno);
81 | exit(-1);
82 | }
83 | exit(0);
84 | }
85 |
--------------------------------------------------------------------------------
/libs/logUtil.js:
--------------------------------------------------------------------------------
1 | var dateFormat = require('dateformat');
2 | var colors = require('colors');
3 |
4 |
5 | var severityToColor = function(severity, text) {
6 | switch(severity) {
7 | case 'special':
8 | return text.cyan.underline;
9 | case 'debug':
10 | return text.green;
11 | case 'warning':
12 | return text.yellow;
13 | case 'error':
14 | return text.red;
15 | default:
16 | console.log("Unknown severity " + severity);
17 | return text.italic;
18 | }
19 | };
20 |
21 | var severityValues = {
22 | 'debug': 1,
23 | 'warning': 2,
24 | 'error': 3,
25 | 'special': 4
26 | };
27 |
28 |
29 | var PoolLogger = function (configuration) {
30 |
31 |
32 | var logLevelInt = severityValues[configuration.logLevel];
33 | var logColors = configuration.logColors;
34 |
35 |
36 |
37 | var log = function(severity, system, component, text, subcat) {
38 |
39 | if (severityValues[severity] < logLevelInt) return;
40 |
41 | if (subcat){
42 | var realText = subcat;
43 | var realSubCat = text;
44 | text = realText;
45 | subcat = realSubCat;
46 | }
47 |
48 | var entryDesc = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss') + ' [' + system + ']\t';
49 | if (logColors) {
50 | entryDesc = severityToColor(severity, entryDesc);
51 |
52 | var logString =
53 | entryDesc +
54 | ('[' + component + '] ').italic;
55 |
56 | if (subcat)
57 | logString += ('(' + subcat + ') ').bold.grey;
58 |
59 | logString += text.grey;
60 | }
61 | else {
62 | var logString =
63 | entryDesc +
64 | '[' + component + '] ';
65 |
66 | if (subcat)
67 | logString += '(' + subcat + ') ';
68 |
69 | logString += text;
70 | }
71 |
72 | console.log(logString);
73 |
74 |
75 | };
76 |
77 | // public
78 |
79 | var _this = this;
80 | Object.keys(severityValues).forEach(function(logType){
81 | _this[logType] = function(){
82 | var args = Array.prototype.slice.call(arguments, 0);
83 | args.unshift(logType);
84 | log.apply(this, args);
85 | };
86 | });
87 | };
88 |
89 | module.exports = PoolLogger;
--------------------------------------------------------------------------------
/pool_configs/examples/vdl.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "vdl.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress": "",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 |
19 | "rewardRecipients": {
20 | "": 0.2
21 | },
22 |
23 | "paymentProcessing": {
24 | "enabled": true,
25 | "minConf": 10,
26 | "paymentMode": "prop",
27 | "_comment_paymentMode": "prop, pplnt",
28 | "paymentInterval": 20,
29 | "minimumPayment": 0.05,
30 | "maxBlocksPerPayment": 3,
31 | "daemon": {
32 | "host": "127.0.0.1",
33 | "port": 17676,
34 | "user": "rpcuser",
35 | "password": "rpcpassword"
36 | }
37 | },
38 |
39 | "tlsOptions": {
40 | "enabled": false,
41 | "serverKey": "",
42 | "serverCert": "",
43 | "ca": ""
44 | },
45 |
46 | "ports": {
47 | "1234": {
48 | "diff": 0.05,
49 | "tls": false,
50 | "varDiff": {
51 | "minDiff": 0.04,
52 | "maxDiff": 36,
53 | "targetTime": 15,
54 | "retargetTime": 60,
55 | "variancePercent": 30
56 | }
57 | }
58 | },
59 |
60 | "poolId": "main",
61 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
62 |
63 | "daemons": [
64 | {
65 | "host": "127.0.0.1",
66 | "port": 17676,
67 | "user": "rpcuser",
68 | "password": "rpcpassword"
69 | }
70 | ],
71 |
72 | "p2p": {
73 | "enabled": false,
74 | "host": "127.0.0.1",
75 | "port": 7676,
76 | "disableTransactions": true
77 | },
78 |
79 | "mposMode": {
80 | "enabled": false,
81 | "host": "127.0.0.1",
82 | "port": 3306,
83 | "user": "me",
84 | "password": "mypass",
85 | "database": "xsg",
86 | "checkPassword": true,
87 | "autoCreateWorker": false
88 | }
89 | }
90 |
--------------------------------------------------------------------------------
/pool_configs/examples/vot.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "vot.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress": "",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 |
19 | "rewardRecipients": {
20 | "": 0.2
21 | },
22 |
23 | "paymentProcessing": {
24 | "enabled": true,
25 | "minConf": 10,
26 | "paymentMode": "prop",
27 | "_comment_paymentMode": "prop, pplnt",
28 | "paymentInterval": 20,
29 | "minimumPayment": 0.05,
30 | "maxBlocksPerPayment": 3,
31 | "daemon": {
32 | "host": "127.0.0.1",
33 | "port": 8242,
34 | "user": "rpcuser",
35 | "password": "rpcpassword"
36 | }
37 | },
38 |
39 | "tlsOptions": {
40 | "enabled": false,
41 | "serverKey": "",
42 | "serverCert": "",
43 | "ca": ""
44 | },
45 |
46 | "ports": {
47 | "1234": {
48 | "diff": 0.05,
49 | "tls": false,
50 | "varDiff": {
51 | "minDiff": 0.04,
52 | "maxDiff": 36,
53 | "targetTime": 15,
54 | "retargetTime": 60,
55 | "variancePercent": 30
56 | }
57 | }
58 | },
59 |
60 | "poolId": "main",
61 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
62 |
63 | "daemons": [
64 | {
65 | "host": "127.0.0.1",
66 | "port": 8242,
67 | "user": "rpcuser",
68 | "password": "rpcpassword"
69 | }
70 | ],
71 |
72 | "p2p": {
73 | "enabled": false,
74 | "host": "127.0.0.1",
75 | "port": 8144,
76 | "disableTransactions": true
77 | },
78 |
79 | "mposMode": {
80 | "enabled": false,
81 | "host": "127.0.0.1",
82 | "port": 3306,
83 | "user": "me",
84 | "password": "mypass",
85 | "database": "vot",
86 | "checkPassword": true,
87 | "autoCreateWorker": false
88 | }
89 |
90 | }
91 |
--------------------------------------------------------------------------------
/pool_configs/examples/xsg.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "xsg.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress": "",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 |
19 | "rewardRecipients": {
20 | "": 0.2
21 | },
22 |
23 | "paymentProcessing": {
24 | "enabled": true,
25 | "minConf": 10,
26 | "paymentMode": "prop",
27 | "_comment_paymentMode": "prop, pplnt",
28 | "paymentInterval": 20,
29 | "minimumPayment": 0.05,
30 | "maxBlocksPerPayment": 3,
31 | "daemon": {
32 | "host": "127.0.0.1",
33 | "port": 16112,
34 | "user": "rpcuser",
35 | "password": "rpcpassword"
36 | }
37 | },
38 |
39 | "tlsOptions": {
40 | "enabled": false,
41 | "serverKey": "",
42 | "serverCert": "",
43 | "ca": ""
44 | },
45 |
46 | "ports": {
47 | "1234": {
48 | "diff": 0.05,
49 | "tls": false,
50 | "varDiff": {
51 | "minDiff": 0.04,
52 | "maxDiff": 36,
53 | "targetTime": 15,
54 | "retargetTime": 60,
55 | "variancePercent": 30
56 | }
57 | }
58 | },
59 |
60 | "poolId": "main",
61 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
62 |
63 | "daemons": [
64 | {
65 | "host": "127.0.0.1",
66 | "port": 16112,
67 | "user": "rpcuser",
68 | "password": "rpcpassword"
69 | }
70 | ],
71 |
72 | "p2p": {
73 | "enabled": false,
74 | "host": "127.0.0.1",
75 | "port": 16113,
76 | "disableTransactions": true
77 | },
78 |
79 | "mposMode": {
80 | "enabled": false,
81 | "host": "127.0.0.1",
82 | "port": 3306,
83 | "user": "me",
84 | "password": "mypass",
85 | "database": "xsg",
86 | "checkPassword": true,
87 | "autoCreateWorker": false
88 | }
89 | }
90 |
--------------------------------------------------------------------------------
/pool_configs/examples/zel.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "zel.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress": "",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 |
19 | "rewardRecipients": {
20 | "": 0.2
21 | },
22 |
23 | "paymentProcessing": {
24 | "enabled": true,
25 | "minConf": 10,
26 | "paymentMode": "prop",
27 | "_comment_paymentMode": "prop, pplnt",
28 | "paymentInterval": 20,
29 | "minimumPayment": 0.05,
30 | "maxBlocksPerPayment": 3,
31 | "daemon": {
32 | "host": "127.0.0.1",
33 | "port": 16124,
34 | "user": "rpcuser",
35 | "password": "rpcpassword"
36 | }
37 | },
38 |
39 | "tlsOptions": {
40 | "enabled": false,
41 | "serverKey": "",
42 | "serverCert": "",
43 | "ca": ""
44 | },
45 |
46 | "ports": {
47 | "1234": {
48 | "diff": 0.05,
49 | "tls": false,
50 | "varDiff": {
51 | "minDiff": 0.04,
52 | "maxDiff": 36,
53 | "targetTime": 15,
54 | "retargetTime": 60,
55 | "variancePercent": 30
56 | }
57 | }
58 | },
59 |
60 | "poolId": "main",
61 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
62 |
63 | "daemons": [
64 | {
65 | "host": "127.0.0.1",
66 | "port": 16124,
67 | "user": "rpcuser",
68 | "password": "rpcpassword"
69 | }
70 | ],
71 |
72 | "p2p": {
73 | "enabled": false,
74 | "host": "127.0.0.1",
75 | "port": 16125,
76 | "disableTransactions": true
77 | },
78 |
79 | "mposMode": {
80 | "enabled": false,
81 | "host": "127.0.0.1",
82 | "port": 3306,
83 | "user": "me",
84 | "password": "mypass",
85 | "database": "zel",
86 | "checkPassword": true,
87 | "autoCreateWorker": false
88 | }
89 |
90 | }
91 |
--------------------------------------------------------------------------------
/pool_configs/examples/zer.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "zer.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress": "",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 |
19 | "rewardRecipients": {
20 | "": 0.2
21 | },
22 |
23 | "paymentProcessing": {
24 | "enabled": true,
25 | "minConf": 10,
26 | "paymentMode": "prop",
27 | "_comment_paymentMode": "prop, pplnt",
28 | "paymentInterval": 20,
29 | "minimumPayment": 0.05,
30 | "maxBlocksPerPayment": 3,
31 | "daemon": {
32 | "host": "127.0.0.1",
33 | "port": 23811,
34 | "user": "rpcuser",
35 | "password": "rpcpassword"
36 | }
37 | },
38 |
39 | "tlsOptions": {
40 | "enabled": false,
41 | "serverKey": "",
42 | "serverCert": "",
43 | "ca": ""
44 | },
45 |
46 | "ports": {
47 | "1234": {
48 | "diff": 0.05,
49 | "tls": false,
50 | "varDiff": {
51 | "minDiff": 0.04,
52 | "maxDiff": 36,
53 | "targetTime": 15,
54 | "retargetTime": 60,
55 | "variancePercent": 30
56 | }
57 | }
58 | },
59 |
60 | "poolId": "main",
61 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
62 |
63 | "daemons": [
64 | {
65 | "host": "127.0.0.1",
66 | "port": 23811,
67 | "user": "rpcuser",
68 | "password": "rpcpassword"
69 | }
70 | ],
71 |
72 | "p2p": {
73 | "enabled": false,
74 | "host": "127.0.0.1",
75 | "port": 23801,
76 | "disableTransactions": true
77 | },
78 |
79 | "mposMode": {
80 | "enabled": false,
81 | "host": "127.0.0.1",
82 | "port": 3306,
83 | "user": "me",
84 | "password": "mypass",
85 | "database": "zer",
86 | "checkPassword": true,
87 | "autoCreateWorker": false
88 | }
89 |
90 | }
91 |
--------------------------------------------------------------------------------
/pool_configs/examples/zerc.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "zerc.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress": "",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 |
19 | "rewardRecipients": {
20 | "": 0.2
21 | },
22 |
23 | "paymentProcessing": {
24 | "enabled": true,
25 | "minConf": 10,
26 | "paymentMode": "prop",
27 | "_comment_paymentMode": "prop, pplnt",
28 | "paymentInterval": 20,
29 | "minimumPayment": 0.05,
30 | "maxBlocksPerPayment": 3,
31 | "daemon": {
32 | "host": "127.0.0.1",
33 | "port": 23800,
34 | "user": "rpcuser",
35 | "password": "rpcpassword"
36 | }
37 | },
38 |
39 | "tlsOptions": {
40 | "enabled": false,
41 | "serverKey": "",
42 | "serverCert": "",
43 | "ca": ""
44 | },
45 |
46 | "ports": {
47 | "1234": {
48 | "diff": 0.05,
49 | "tls": false,
50 | "varDiff": {
51 | "minDiff": 0.04,
52 | "maxDiff": 36,
53 | "targetTime": 15,
54 | "retargetTime": 60,
55 | "variancePercent": 30
56 | }
57 | }
58 | },
59 |
60 | "poolId": "main",
61 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
62 |
63 | "daemons": [
64 | {
65 | "host": "127.0.0.1",
66 | "port": 23800,
67 | "user": "rpcuser",
68 | "password": "rpcpassword"
69 | }
70 | ],
71 |
72 | "p2p": {
73 | "enabled": false,
74 | "host": "127.0.0.1",
75 | "port": 23801,
76 | "disableTransactions": true
77 | },
78 |
79 | "mposMode": {
80 | "enabled": false,
81 | "host": "127.0.0.1",
82 | "port": 3306,
83 | "user": "me",
84 | "password": "mypass",
85 | "database": "zerc",
86 | "checkPassword": true,
87 | "autoCreateWorker": false
88 | }
89 |
90 | }
91 |
--------------------------------------------------------------------------------
/pool_configs/examples/zel.testnet.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "testnet/zel.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress": "",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 |
19 | "rewardRecipients": {
20 | "": 0.2
21 | },
22 |
23 | "paymentProcessing": {
24 | "enabled": true,
25 | "minConf": 10,
26 | "paymentMode": "prop",
27 | "_comment_paymentMode": "prop, pplnt",
28 | "paymentInterval": 20,
29 | "minimumPayment": 0.05,
30 | "maxBlocksPerPayment": 3,
31 | "daemon": {
32 | "host": "127.0.0.1",
33 | "port": 16124,
34 | "user": "rpcuser",
35 | "password": "rpcpassword"
36 | }
37 | },
38 |
39 | "tlsOptions": {
40 | "enabled": false,
41 | "serverKey": "",
42 | "serverCert": "",
43 | "ca": ""
44 | },
45 |
46 | "ports": {
47 | "1234": {
48 | "diff": 0.05,
49 | "tls": false,
50 | "varDiff": {
51 | "minDiff": 0.04,
52 | "maxDiff": 36,
53 | "targetTime": 15,
54 | "retargetTime": 60,
55 | "variancePercent": 30
56 | }
57 | }
58 | },
59 |
60 | "poolId": "main",
61 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
62 |
63 | "daemons": [
64 | {
65 | "host": "127.0.0.1",
66 | "port": 26124,
67 | "user": "rpcuser",
68 | "password": "rpcpassword"
69 | }
70 | ],
71 |
72 | "p2p": {
73 | "enabled": false,
74 | "host": "127.0.0.1",
75 | "port": 26125,
76 | "disableTransactions": true
77 | },
78 |
79 | "mposMode": {
80 | "enabled": false,
81 | "host": "127.0.0.1",
82 | "port": 3306,
83 | "user": "me",
84 | "password": "mypass",
85 | "database": "zel_testnet",
86 | "checkPassword": true,
87 | "autoCreateWorker": false
88 | }
89 |
90 | }
91 |
--------------------------------------------------------------------------------
/pool_configs/examples/zer.testnet.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "testnet/zer.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress": "",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 |
19 | "rewardRecipients": {
20 | "": 0.2
21 | },
22 |
23 | "paymentProcessing": {
24 | "enabled": true,
25 | "minConf": 10,
26 | "paymentMode": "prop",
27 | "_comment_paymentMode": "prop, pplnt",
28 | "paymentInterval": 20,
29 | "minimumPayment": 0.05,
30 | "maxBlocksPerPayment": 3,
31 | "daemon": {
32 | "host": "127.0.0.1",
33 | "port": 23812,
34 | "user": "rpcuser",
35 | "password": "rpcpassword"
36 | }
37 | },
38 |
39 | "tlsOptions": {
40 | "enabled": false,
41 | "serverKey": "",
42 | "serverCert": "",
43 | "ca": ""
44 | },
45 |
46 | "ports": {
47 | "1234": {
48 | "diff": 0.05,
49 | "tls": false,
50 | "varDiff": {
51 | "minDiff": 0.04,
52 | "maxDiff": 36,
53 | "targetTime": 15,
54 | "retargetTime": 60,
55 | "variancePercent": 30
56 | }
57 | }
58 | },
59 |
60 | "poolId": "main",
61 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
62 |
63 | "daemons": [
64 | {
65 | "host": "127.0.0.1",
66 | "port": 23812,
67 | "user": "rpcuser",
68 | "password": "rpcpassword"
69 | }
70 | ],
71 |
72 | "p2p": {
73 | "enabled": false,
74 | "host": "127.0.0.1",
75 | "port": 23802,
76 | "disableTransactions": true
77 | },
78 |
79 | "mposMode": {
80 | "enabled": false,
81 | "host": "127.0.0.1",
82 | "port": 3306,
83 | "user": "me",
84 | "password": "mypass",
85 | "database": "zer_testnet",
86 | "checkPassword": true,
87 | "autoCreateWorker": false
88 | }
89 |
90 | }
91 |
--------------------------------------------------------------------------------
/pool_configs/examples/yec.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "yec.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress":"",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 | "_comment_walletInterval": "Used to cache coin stats",
19 |
20 | "rewardRecipients": {
21 | "": 1.0
22 | },
23 |
24 | "tlsOptions": {
25 | "enabled": false,
26 | "serverKey": "",
27 | "serverCert": "",
28 | "ca": ""
29 | },
30 |
31 | "paymentProcessing": {
32 | "enabled": true,
33 | "minConf": 10,
34 | "paymentMode": "prop",
35 | "_comment_paymentMode": "prop, pplnt",
36 | "paymentInterval": 120,
37 | "minimumPayment": 0.1,
38 | "maxBlocksPerPayment": 3,
39 | "daemon": {
40 | "host": "",
41 | "port": 8832 ,
42 | "user": "rpcuser",
43 | "password": "rpcpassword"
44 | }
45 | },
46 |
47 | "ports": {
48 | "1234": {
49 | "tls": false,
50 | "diff": 0.05,
51 | "varDiff": {
52 | "minDiff": 0.04,
53 | "maxDiff": 36,
54 | "targetTime": 15,
55 | "retargetTime": 60,
56 | "variancePercent": 30
57 | }
58 | }
59 | },
60 |
61 | "poolId": "main",
62 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
63 |
64 | "daemons": [
65 | {
66 | "host": "",
67 | "port": 8832,
68 | "user": "rpcuser",
69 | "password": "rpcpassword"
70 | }
71 | ],
72 |
73 | "p2p": {
74 | "enabled": false,
75 | "host": "127.0.0.1",
76 | "port": 8833,
77 | "disableTransactions": true
78 | },
79 |
80 | "mposMode": {
81 | "enabled": false,
82 | "host": "127.0.0.1",
83 | "port": 3306,
84 | "user": "me",
85 | "password": "mypass",
86 | "database": "xsg_testnet",
87 | "checkPassword": true,
88 | "autoCreateWorker": false
89 | }
90 |
91 | }
92 |
--------------------------------------------------------------------------------
/pool_configs/examples/zcl.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "zcl.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress":"",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 | "_comment_walletInterval": "Used to cache coin stats",
19 |
20 | "rewardRecipients": {
21 | "": 0.2
22 | },
23 |
24 | "tlsOptions": {
25 | "enabled": false,
26 | "serverKey": "",
27 | "serverCert": "",
28 | "ca": ""
29 | },
30 |
31 | "paymentProcessing": {
32 | "enabled": true,
33 | "minConf": 10,
34 | "paymentMode": "prop",
35 | "_comment_paymentMode": "prop, pplnt",
36 | "paymentInterval": 120,
37 | "minimumPayment": 0.1,
38 | "maxBlocksPerPayment": 3,
39 | "daemon": {
40 | "host": "127.0.0.1",
41 | "port": 8033,
42 | "user": "rpcuser",
43 | "password": "rpcpassword"
44 | }
45 | },
46 |
47 | "ports": {
48 | "1234": {
49 | "tls": false,
50 | "diff": 0.5,
51 | "varDiff": {
52 | "minDiff": 0.04,
53 | "maxDiff": 36,
54 | "targetTime": 15,
55 | "retargetTime": 60,
56 | "variancePercent": 30
57 | }
58 | }
59 | },
60 |
61 | "poolId": "main",
62 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
63 |
64 | "daemons": [
65 | {
66 | "host": "127.0.0.1",
67 | "port": 8033,
68 | "user": "rpcuser",
69 | "password": "rpcpassword"
70 | }
71 | ],
72 |
73 | "p2p": {
74 | "enabled": false,
75 | "host": "127.0.0.1",
76 | "port": 19333,
77 | "disableTransactions": true
78 | },
79 |
80 | "mposMode": {
81 | "enabled": false,
82 | "host": "127.0.0.1",
83 | "port": 3306,
84 | "user": "me",
85 | "password": "mypass",
86 | "database": "zcl",
87 | "checkPassword": true,
88 | "autoCreateWorker": false
89 | }
90 |
91 | }
92 |
--------------------------------------------------------------------------------
/pool_configs/examples/zec.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "zec.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress":"",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 | "_comment_walletInterval": "Used to cache coin stats",
19 |
20 | "rewardRecipients": {
21 | "": 0.2
22 | },
23 |
24 | "tlsOptions": {
25 | "enabled": false,
26 | "serverKey": "",
27 | "serverCert": "",
28 | "ca": ""
29 | },
30 |
31 | "paymentProcessing": {
32 | "enabled": true,
33 | "minConf": 10,
34 | "paymentMode": "prop",
35 | "_comment_paymentMode": "prop, pplnt",
36 | "paymentInterval": 120,
37 | "minimumPayment": 0.05,
38 | "maxBlocksPerPayment": 3,
39 | "daemon": {
40 | "host": "127.0.0.1",
41 | "port": 8233,
42 | "user": "rpcuser",
43 | "password": "rpcpassword"
44 | }
45 | },
46 |
47 | "ports": {
48 | "1234": {
49 | "diff": 0.5,
50 | "tls": false,
51 | "varDiff": {
52 | "minDiff": 0.04,
53 | "maxDiff": 36,
54 | "targetTime": 15,
55 | "retargetTime": 60,
56 | "variancePercent": 30
57 | }
58 | }
59 | },
60 |
61 | "poolId": "main",
62 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
63 |
64 | "daemons": [
65 | {
66 | "host": "127.0.0.1",
67 | "port": 8233,
68 | "user": "rpcuser",
69 | "password": "rpcpassword"
70 | }
71 | ],
72 |
73 | "p2p": {
74 | "enabled": false,
75 | "host": "127.0.0.1",
76 | "port": 19333,
77 | "disableTransactions": true
78 | },
79 |
80 | "mposMode": {
81 | "enabled": false,
82 | "host": "127.0.0.1",
83 | "port": 3306,
84 | "user": "me",
85 | "password": "mypass",
86 | "database": "zec",
87 | "checkPassword": true,
88 | "autoCreateWorker": false
89 | }
90 |
91 | }
92 |
--------------------------------------------------------------------------------
/pool_configs/examples/zen.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "zen.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress":"",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 | "_comment_walletInterval": "Used to cache coin stats",
19 |
20 | "rewardRecipients": {
21 | "": 0.2
22 | },
23 |
24 | "tlsOptions": {
25 | "enabled": false,
26 | "serverKey": "",
27 | "serverCert": "",
28 | "ca": ""
29 | },
30 |
31 | "paymentProcessing": {
32 | "enabled": true,
33 | "minConf": 10,
34 | "paymentMode": "prop",
35 | "_comment_paymentMode": "prop, pplnt",
36 | "paymentInterval": 120,
37 | "minimumPayment": 0.1,
38 | "maxBlocksPerPayment": 3,
39 | "daemon": {
40 | "host": "127.0.0.1",
41 | "port": 9033,
42 | "user": "rpcuser",
43 | "password": "rpcpassword"
44 | }
45 | },
46 |
47 | "ports": {
48 | "1234": {
49 | "tls": false,
50 | "diff": 0.5,
51 | "varDiff": {
52 | "minDiff": 0.04,
53 | "maxDiff": 36,
54 | "targetTime": 15,
55 | "retargetTime": 60,
56 | "variancePercent": 30
57 | }
58 | }
59 | },
60 |
61 | "poolId": "main",
62 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
63 |
64 | "daemons": [
65 | {
66 | "host": "127.0.0.1",
67 | "port": 9033,
68 | "user": "rpcuser",
69 | "password": "rpcpassword"
70 | }
71 | ],
72 |
73 | "p2p": {
74 | "enabled": false,
75 | "host": "127.0.0.1",
76 | "port": 19333,
77 | "disableTransactions": true
78 | },
79 |
80 | "mposMode": {
81 | "enabled": false,
82 | "host": "127.0.0.1",
83 | "port": 3306,
84 | "user": "me",
85 | "password": "mypass",
86 | "database": "zen",
87 | "checkPassword": true,
88 | "autoCreateWorker": false
89 | }
90 |
91 | }
92 |
--------------------------------------------------------------------------------
/pool_configs/examples/btcp.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "btcp.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress":"",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 | "_comment_walletInterval": "Used to cache coin stats",
19 |
20 | "rewardRecipients": {
21 | "": 0.2
22 | },
23 |
24 | "tlsOptions": {
25 | "enabled": false,
26 | "serverKey": "",
27 | "serverCert": "",
28 | "ca": ""
29 | },
30 |
31 | "paymentProcessing": {
32 | "enabled": true,
33 | "minConf": 10,
34 | "paymentMode": "prop",
35 | "_comment_paymentMode": "prop, pplnt",
36 | "paymentInterval": 120,
37 | "minimumPayment": 0.1,
38 | "maxBlocksPerPayment": 3,
39 | "daemon": {
40 | "host": "127.0.0.1",
41 | "port": 7932,
42 | "user": "rpcuser",
43 | "password": "rpcpassword"
44 | }
45 | },
46 |
47 | "ports": {
48 | "1234": {
49 | "tls": false,
50 | "diff": 0.5,
51 | "varDiff": {
52 | "minDiff": 0.04,
53 | "maxDiff": 36,
54 | "targetTime": 15,
55 | "retargetTime": 60,
56 | "variancePercent": 30
57 | }
58 | }
59 | },
60 |
61 | "poolId": "main",
62 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
63 |
64 | "daemons": [
65 | {
66 | "host": "127.0.0.1",
67 | "port": 7932,
68 | "user": "rpcuser",
69 | "password": "rpcpassword"
70 | }
71 | ],
72 |
73 | "p2p": {
74 | "enabled": false,
75 | "host": "127.0.0.1",
76 | "port": 7933,
77 | "disableTransactions": true
78 | },
79 |
80 | "mposMode": {
81 | "enabled": false,
82 | "host": "127.0.0.1",
83 | "port": 3306,
84 | "user": "me",
85 | "password": "mypass",
86 | "database": "btcp",
87 | "checkPassword": true,
88 | "autoCreateWorker": false
89 | }
90 |
91 | }
92 |
93 |
--------------------------------------------------------------------------------
/pool_configs/examples/yec_testnet.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "testnet/yec.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress":"",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 | "_comment_walletInterval": "Used to cache coin stats",
19 |
20 | "rewardRecipients": {
21 | "": 1.0
22 | },
23 |
24 | "tlsOptions": {
25 | "enabled": false,
26 | "serverKey": "",
27 | "serverCert": "",
28 | "ca": ""
29 | },
30 |
31 | "paymentProcessing": {
32 | "enabled": true,
33 | "minConf": 10,
34 | "paymentMode": "prop",
35 | "_comment_paymentMode": "prop, pplnt",
36 | "paymentInterval": 120,
37 | "minimumPayment": 0.1,
38 | "maxBlocksPerPayment": 3,
39 | "daemon": {
40 | "host": "",
41 | "port": 18832 ,
42 | "user": "rpcuser",
43 | "password": "rpcpassword"
44 | }
45 | },
46 |
47 | "ports": {
48 | "1234": {
49 | "tls": false,
50 | "diff": 0.05,
51 | "varDiff": {
52 | "minDiff": 0.04,
53 | "maxDiff": 36,
54 | "targetTime": 15,
55 | "retargetTime": 60,
56 | "variancePercent": 30
57 | }
58 | }
59 | },
60 |
61 | "poolId": "main",
62 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
63 |
64 | "daemons": [
65 | {
66 | "host": "",
67 | "port": 18832,
68 | "user": "rpcuser",
69 | "password": "rpcpassword"
70 | }
71 | ],
72 |
73 | "p2p": {
74 | "enabled": false,
75 | "host": "127.0.0.1",
76 | "port": 18833,
77 | "disableTransactions": true
78 | },
79 |
80 | "mposMode": {
81 | "enabled": false,
82 | "host": "127.0.0.1",
83 | "port": 3306,
84 | "user": "me",
85 | "password": "mypass",
86 | "database": "xsg_testnet",
87 | "checkPassword": true,
88 | "autoCreateWorker": false
89 | }
90 |
91 | }
92 |
--------------------------------------------------------------------------------
/pool_configs/examples/xsg.testnet.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "testnet/xsg.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress":"",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 | "_comment_walletInterval": "Used to cache coin stats",
19 |
20 | "rewardRecipients": {
21 | "": 1.0
22 | },
23 |
24 | "tlsOptions": {
25 | "enabled": false,
26 | "serverKey": "",
27 | "serverCert": "",
28 | "ca": ""
29 | },
30 |
31 | "paymentProcessing": {
32 | "enabled": true,
33 | "minConf": 10,
34 | "paymentMode": "prop",
35 | "_comment_paymentMode": "prop, pplnt",
36 | "paymentInterval": 120,
37 | "minimumPayment": 0.1,
38 | "maxBlocksPerPayment": 3,
39 | "daemon": {
40 | "host": "",
41 | "port": 26112 ,
42 | "user": "rpcuser",
43 | "password": "rpcpassword"
44 | }
45 | },
46 |
47 | "ports": {
48 | "1234": {
49 | "tls": false,
50 | "diff": 0.05,
51 | "varDiff": {
52 | "minDiff": 0.04,
53 | "maxDiff": 36,
54 | "targetTime": 15,
55 | "retargetTime": 60,
56 | "variancePercent": 30
57 | }
58 | }
59 | },
60 |
61 | "poolId": "main",
62 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
63 |
64 | "daemons": [
65 | {
66 | "host": "",
67 | "port": 26112,
68 | "user": "rpcuser",
69 | "password": "rpcpassword"
70 | }
71 | ],
72 |
73 | "p2p": {
74 | "enabled": false,
75 | "host": "127.0.0.1",
76 | "port": 26113,
77 | "disableTransactions": true
78 | },
79 |
80 | "mposMode": {
81 | "enabled": false,
82 | "host": "127.0.0.1",
83 | "port": 3306,
84 | "user": "me",
85 | "password": "mypass",
86 | "database": "xsg_testnet",
87 | "checkPassword": true,
88 | "autoCreateWorker": false
89 | }
90 |
91 | }
92 |
93 |
--------------------------------------------------------------------------------
/pool_configs/examples/anon_testnet.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": true,
3 | "coin": "testnet/anon.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress":"",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 | "_comment_walletInterval": "Used to cache coin stats",
19 |
20 | "rewardRecipients": {
21 | "": 0.2
22 | },
23 |
24 | "tlsOptions": {
25 | "enabled": false,
26 | "serverKey": "",
27 | "serverCert": "",
28 | "ca": ""
29 | },
30 |
31 | "paymentProcessing": {
32 | "enabled": true,
33 | "minConf": 10,
34 | "paymentMode": "prop",
35 | "_comment_paymentMode": "prop, pplnt",
36 | "paymentInterval": 120,
37 | "minimumPayment": 0.1,
38 | "maxBlocksPerPayment": 3,
39 | "daemon": {
40 | "host": "127.0.0.1",
41 | "port": 3127,
42 | "user": "rpcuser",
43 | "password": "rpcpassword"
44 | }
45 | },
46 |
47 | "ports": {
48 | "3333": {
49 | "tls": false,
50 | "diff": 0.5,
51 | "varDiff": {
52 | "minDiff": 0.04,
53 | "maxDiff": 36,
54 | "targetTime": 15,
55 | "retargetTime": 60,
56 | "variancePercent": 30
57 | }
58 | }
59 | },
60 |
61 | "poolId": "main",
62 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
63 |
64 | "daemons": [
65 | {
66 | "host": "127.0.0.1",
67 | "port": 3127,
68 | "user": "rpcuser",
69 | "password": "rpcpassword"
70 | }
71 | ],
72 |
73 | "p2p": {
74 | "enabled": false,
75 | "host": "127.0.0.1",
76 | "port": 19333,
77 | "disableTransactions": true
78 | },
79 |
80 | "mposMode": {
81 | "enabled": false,
82 | "host": "127.0.0.1",
83 | "port": 3306,
84 | "user": "me",
85 | "password": "mypass",
86 | "database": "anon_testnet",
87 | "checkPassword": true,
88 | "autoCreateWorker": false
89 | }
90 |
91 | }
92 |
--------------------------------------------------------------------------------
/pool_configs/examples/zen.testnet.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "testnet/zen.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress":"",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 | "_comment_walletInterval": "Used to cache coin stats",
19 |
20 | "rewardRecipients": {
21 | "": 0.2
22 | },
23 |
24 | "tlsOptions": {
25 | "enabled": false,
26 | "serverKey": "",
27 | "serverCert": "",
28 | "ca": ""
29 | },
30 |
31 | "paymentProcessing": {
32 | "enabled": true,
33 | "minConf": 10,
34 | "paymentMode": "prop",
35 | "_comment_paymentMode": "prop, pplnt",
36 | "paymentInterval": 120,
37 | "minimumPayment": 0.1,
38 | "maxBlocksPerPayment": 3,
39 | "daemon": {
40 | "host": "127.0.0.1",
41 | "port": 19033,
42 | "user": "rpcuser",
43 | "password": "rpcpassword"
44 | }
45 | },
46 |
47 | "ports": {
48 | "1234": {
49 | "tls": false,
50 | "diff": 0.5,
51 | "varDiff": {
52 | "minDiff": 0.04,
53 | "maxDiff": 36,
54 | "targetTime": 15,
55 | "retargetTime": 60,
56 | "variancePercent": 30
57 | }
58 | }
59 | },
60 |
61 | "poolId": "main",
62 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
63 |
64 | "daemons": [
65 | {
66 | "host": "127.0.0.1",
67 | "port": 19033,
68 | "user": "rpcuser",
69 | "password": "rpcpassword"
70 | }
71 | ],
72 |
73 | "p2p": {
74 | "enabled": false,
75 | "host": "127.0.0.1",
76 | "port": 19333,
77 | "disableTransactions": true
78 | },
79 |
80 | "mposMode": {
81 | "enabled": false,
82 | "host": "127.0.0.1",
83 | "port": 3306,
84 | "user": "me",
85 | "password": "mypass",
86 | "database": "zen_testnet",
87 | "checkPassword": true,
88 | "autoCreateWorker": false
89 | }
90 |
91 | }
92 |
--------------------------------------------------------------------------------
/pool_configs/examples/zec.testnet.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "testnet/zec.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress":"",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 | "_comment_walletInterval": "Used to cache coin stats",
19 |
20 | "rewardRecipients": {
21 | "": 0.2
22 | },
23 |
24 | "paymentProcessing": {
25 | "enabled": true,
26 | "minConf": 10,
27 | "paymentMode": "prop",
28 | "_comment_paymentMode": "prop, pplnt",
29 | "paymentInterval": 120,
30 | "minimumPayment": 0.05,
31 | "maxBlocksPerPayment": 3,
32 | "daemon": {
33 | "host": "127.0.0.1",
34 | "port": 18233,
35 | "user": "rpcuser",
36 | "password": "rpcpassword"
37 | }
38 | },
39 |
40 | "tlsOptions": {
41 | "enabled": false,
42 | "serverKey": "",
43 | "serverCert": "",
44 | "ca": ""
45 | },
46 |
47 | "ports": {
48 | "1234": {
49 | "diff": 0.05,
50 | "tls": false,
51 | "varDiff": {
52 | "minDiff": 0.04,
53 | "maxDiff": 36,
54 | "targetTime": 15,
55 | "retargetTime": 60,
56 | "variancePercent": 30
57 | }
58 | }
59 | },
60 |
61 | "poolId": "main",
62 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
63 |
64 | "daemons": [
65 | {
66 | "host": "127.0.0.1",
67 | "port": 18233,
68 | "user": "rpcuser",
69 | "password": "rpcpassword"
70 | }
71 | ],
72 |
73 | "p2p": {
74 | "enabled": false,
75 | "host": "127.0.0.1",
76 | "port": 19333,
77 | "disableTransactions": true
78 | },
79 |
80 | "mposMode": {
81 | "enabled": false,
82 | "host": "127.0.0.1",
83 | "port": 3306,
84 | "user": "me",
85 | "password": "mypass",
86 | "database": "zec_testnet",
87 | "checkPassword": true,
88 | "autoCreateWorker": false
89 | }
90 |
91 | }
92 |
--------------------------------------------------------------------------------
/pool_configs/examples/btcp.testnet.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "testnet/btcp.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress":"",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 | "_comment_walletInterval": "Used to cache coin stats",
19 |
20 | "rewardRecipients": {
21 | "": 0.2
22 | },
23 |
24 | "tlsOptions": {
25 | "enabled": false,
26 | "serverKey": "",
27 | "serverCert": "",
28 | "ca": ""
29 | },
30 |
31 | "paymentProcessing": {
32 | "enabled": true,
33 | "minConf": 10,
34 | "paymentMode": "prop",
35 | "_comment_paymentMode": "prop, pplnt",
36 | "paymentInterval": 120,
37 | "minimumPayment": 0.1,
38 | "maxBlocksPerPayment": 3,
39 | "daemon": {
40 | "host": "127.0.0.1",
41 | "port": 17932,
42 | "user": "rpcuser",
43 | "password": "rpcpassword"
44 | }
45 | },
46 |
47 | "ports": {
48 | "1234": {
49 | "tls": false,
50 | "diff": 0.5,
51 | "varDiff": {
52 | "minDiff": 0.04,
53 | "maxDiff": 36,
54 | "targetTime": 15,
55 | "retargetTime": 60,
56 | "variancePercent": 30
57 | }
58 | }
59 | },
60 |
61 | "poolId": "main",
62 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
63 |
64 | "daemons": [
65 | {
66 | "host": "127.0.0.1",
67 | "port": 17932,
68 | "user": "rpcuser",
69 | "password": "rpcpassword"
70 | }
71 | ],
72 |
73 | "p2p": {
74 | "enabled": false,
75 | "host": "127.0.0.1",
76 | "port": 19333,
77 | "disableTransactions": true
78 | },
79 |
80 | "mposMode": {
81 | "enabled": false,
82 | "host": "127.0.0.1",
83 | "port": 3306,
84 | "user": "me",
85 | "password": "mypass",
86 | "database": "btcp_testnet",
87 | "checkPassword": true,
88 | "autoCreateWorker": false
89 | }
90 |
91 | }
92 |
93 |
--------------------------------------------------------------------------------
/pool_configs/examples/btcz.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "btcz.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress": "",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 |
19 | "rewardRecipients": {
20 | "": 0.2
21 | },
22 |
23 | "tlsOptions": {
24 | "enabled": false,
25 | "serverKey": "",
26 | "serverCert": "",
27 | "ca": ""
28 | },
29 |
30 | "paymentProcessing": {
31 | "enabled": true,
32 | "minConf": 10,
33 | "paymentMode": "prop",
34 | "_comment_paymentMode": "prop, pplnt",
35 | "paymentInterval": 90,
36 | "_comment_paymentInterval": "Interval in seconds to check and perform payments.",
37 | "minimumPayment": 0.1,
38 | "maxBlocksPerPayment": 3,
39 | "daemon": {
40 | "host": "127.0.0.1",
41 | "port": 1979,
42 | "user": "rpcuser",
43 | "password": "rpcpassword"
44 | }
45 | },
46 |
47 | "ports": {
48 | "1234": {
49 | "tls": false,
50 | "diff": 0.5,
51 | "varDiff": {
52 | "minDiff": 0.04,
53 | "maxDiff": 36,
54 | "targetTime": 15,
55 | "retargetTime": 60,
56 | "variancePercent": 30
57 | }
58 | }
59 | },
60 |
61 | "poolId": "main",
62 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
63 |
64 | "daemons": [
65 | {
66 | "host": "127.0.0.1",
67 | "port": 1979,
68 | "user": "rpcuser",
69 | "password": "rpcpassword"
70 | }
71 | ],
72 |
73 | "p2p": {
74 | "enabled": false,
75 | "host": "127.0.0.1",
76 | "port": 1989,
77 | "disableTransactions": true
78 | },
79 |
80 | "mposMode": {
81 | "enabled": false,
82 | "host": "127.0.0.1",
83 | "port": 3306,
84 | "user": "me",
85 | "password": "mypass",
86 | "database": "btcz",
87 | "checkPassword": true,
88 | "autoCreateWorker": false
89 | }
90 |
91 | }
92 |
--------------------------------------------------------------------------------
/pool_configs/examples/ltz.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "ltz.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress": "",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 |
19 | "rewardRecipients": {
20 | "": 0.2
21 | },
22 |
23 | "tlsOptions": {
24 | "enabled": false,
25 | "serverKey": "",
26 | "serverCert": "",
27 | "ca": ""
28 | },
29 |
30 | "paymentProcessing": {
31 | "enabled": true,
32 | "minConf": 10,
33 | "paymentMode": "prop",
34 | "_comment_paymentMode": "prop, pplnt",
35 | "paymentInterval": 90,
36 | "_comment_paymentInterval": "Interval in seconds to check and perform payments.",
37 | "minimumPayment": 0.1,
38 | "maxBlocksPerPayment": 3,
39 | "daemon": {
40 | "host": "127.0.0.1",
41 | "port": 29332,
42 | "user": "rpcuser",
43 | "password": "rpcpassword"
44 | }
45 | },
46 |
47 | "ports": {
48 | "1234": {
49 | "tls": false,
50 | "diff": 0.5,
51 | "varDiff": {
52 | "minDiff": 0.04,
53 | "maxDiff": 36,
54 | "targetTime": 15,
55 | "retargetTime": 60,
56 | "variancePercent": 30
57 | }
58 | }
59 | },
60 |
61 | "poolId": "main",
62 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
63 |
64 | "daemons": [
65 | {
66 | "host": "127.0.0.1",
67 | "port": 29332,
68 | "user": "rpcuser",
69 | "password": "rpcpassword"
70 | }
71 | ],
72 |
73 | "p2p": {
74 | "enabled": false,
75 | "host": "127.0.0.1",
76 | "port": 29333,
77 | "disableTransactions": true
78 | },
79 |
80 | "mposMode": {
81 | "enabled": false,
82 | "host": "127.0.0.1",
83 | "port": 3306,
84 | "user": "me",
85 | "password": "mypass",
86 | "database": "ltz",
87 | "checkPassword": true,
88 | "autoCreateWorker": false
89 | }
90 |
91 | }
92 |
--------------------------------------------------------------------------------
/pool_configs/examples/ltz_testnet.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "testnet/ltz.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress": "",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 |
19 | "rewardRecipients": {
20 | "": 0.2
21 | },
22 |
23 | "tlsOptions": {
24 | "enabled": false,
25 | "serverKey": "",
26 | "serverCert": "",
27 | "ca": ""
28 | },
29 |
30 | "paymentProcessing": {
31 | "enabled": true,
32 | "minConf": 10,
33 | "paymentMode": "prop",
34 | "_comment_paymentMode": "prop, pplnt",
35 | "paymentInterval": 90,
36 | "_comment_paymentInterval": "Interval in seconds to check and perform payments.",
37 | "minimumPayment": 0.1,
38 | "maxBlocksPerPayment": 3,
39 | "daemon": {
40 | "host": "127.0.0.1",
41 | "port": 39332,
42 | "user": "rpcuser",
43 | "password": "rpcpassword"
44 | }
45 | },
46 |
47 | "ports": {
48 | "1234": {
49 | "tls": false,
50 | "diff": 0.5,
51 | "varDiff": {
52 | "minDiff": 0.04,
53 | "maxDiff": 36,
54 | "targetTime": 15,
55 | "retargetTime": 60,
56 | "variancePercent": 30
57 | }
58 | }
59 | },
60 |
61 | "poolId": "main",
62 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
63 |
64 | "daemons": [
65 | {
66 | "host": "127.0.0.1",
67 | "port": 39332,
68 | "user": "rpcuser",
69 | "password": "rpcpassword"
70 | }
71 | ],
72 |
73 | "p2p": {
74 | "enabled": false,
75 | "host": "127.0.0.1",
76 | "port": 39333,
77 | "disableTransactions": true
78 | },
79 |
80 | "mposMode": {
81 | "enabled": false,
82 | "host": "127.0.0.1",
83 | "port": 3306,
84 | "user": "me",
85 | "password": "mypass",
86 | "database": "ltz_testnet",
87 | "checkPassword": true,
88 | "autoCreateWorker": false
89 | }
90 |
91 | }
92 |
--------------------------------------------------------------------------------
/pool_configs/examples/kmd.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "kmd.json",
4 |
5 | "address": "",
6 | "_comment_address": "pools komodo address; ex, RSXGTHQSqwcMw1vowKfEE7sQ8fAmv1tmso",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "shielding not required in komodo, not used",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "set to same as pools komodo address; ex, RSXGTHQSqwcMw1vowKfEE7sQ8fAmv1tmso",
13 |
14 | "invalidAddress":"",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 1,
18 | "_comment_walletInterval": "Used to cache komodo coin stats, shielding not performed.",
19 |
20 | "rewardRecipients": {
21 | "": 0.2
22 | },
23 |
24 | "tlsOptions": {
25 | "enabled": false,
26 | "serverKey": "",
27 | "serverCert": "",
28 | "ca": ""
29 | },
30 |
31 | "paymentProcessing": {
32 | "enabled": true,
33 | "minConf": 10,
34 | "paymentMode": "prop",
35 | "_comment_paymentMode": "prop, pplnt",
36 | "paymentInterval": 90,
37 | "_comment_paymentInterval": "Interval in seconds to check and perform payments.",
38 | "minimumPayment": 0.1,
39 | "maxBlocksPerPayment": 3,
40 | "daemon": {
41 | "host": "127.0.0.1",
42 | "port": 7770,
43 | "user": "rpcuser",
44 | "password": "rpcpassword"
45 | }
46 | },
47 |
48 | "ports": {
49 | "1234": {
50 | "tls": false,
51 | "diff": 0.5,
52 | "varDiff": {
53 | "minDiff": 0.04,
54 | "maxDiff": 36,
55 | "targetTime": 15,
56 | "retargetTime": 60,
57 | "variancePercent": 30
58 | }
59 | }
60 | },
61 |
62 | "poolId": "main",
63 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
64 |
65 | "daemons": [
66 | {
67 | "host": "127.0.0.1",
68 | "port": 7770,
69 | "user": "rpcuser",
70 | "password": "rpcpassword"
71 | }
72 | ],
73 |
74 | "p2p": {
75 | "enabled": false,
76 | "host": "127.0.0.1",
77 | "port": 19333,
78 | "disableTransactions": true
79 | },
80 |
81 | "mposMode": {
82 | "enabled": false,
83 | "host": "127.0.0.1",
84 | "port": 3306,
85 | "user": "me",
86 | "password": "mypass",
87 | "database": "kmd",
88 | "checkPassword": true,
89 | "autoCreateWorker": false
90 | }
91 |
92 | }
93 |
--------------------------------------------------------------------------------
/pool_configs/examples/safe.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "safe.json",
4 |
5 | "address": "",
6 | "_comment_address": "pool's safecoin address; ex, RSXGTHQSqwcMw1vowKfEE7sQ8fAmv1tmso",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "shielding not required in safecoin, not used",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "set to same as pools safecoin address; ex, RSXGTHQSqwcMw1vowKfEE7sQ8fAmv1tmso",
13 |
14 | "invalidAddress":"",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 1,
18 | "_comment_walletInterval": "Used to cache safecoin coin stats, shielding not performed.",
19 |
20 | "rewardRecipients": {
21 | "": 0.2
22 | },
23 |
24 | "tlsOptions": {
25 | "enabled": false,
26 | "serverKey": "",
27 | "serverCert": "",
28 | "ca": ""
29 | },
30 |
31 | "paymentProcessing": {
32 | "enabled": true,
33 | "minConf": 10,
34 | "paymentMode": "prop",
35 | "_comment_paymentMode": "prop, pplnt",
36 | "paymentInterval": 90,
37 | "_comment_paymentInterval": "Interval in seconds to check and perform payments.",
38 | "minimumPayment": 0.1,
39 | "maxBlocksPerPayment": 3,
40 | "daemon": {
41 | "host": "127.0.0.1",
42 | "port": 8771,
43 | "user": "rpcuser",
44 | "password": "rpcpassword"
45 | }
46 | },
47 |
48 | "ports": {
49 | "1234": {
50 | "tls": false,
51 | "diff": 0.5,
52 | "varDiff": {
53 | "minDiff": 0.04,
54 | "maxDiff": 36,
55 | "targetTime": 15,
56 | "retargetTime": 60,
57 | "variancePercent": 30
58 | }
59 | }
60 | },
61 |
62 | "poolId": "main",
63 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
64 |
65 | "daemons": [
66 | {
67 | "host": "127.0.0.1",
68 | "port": 8771,
69 | "user": "rpcuser",
70 | "password": "rpcpassword"
71 | }
72 | ],
73 |
74 | "p2p": {
75 | "enabled": false,
76 | "host": "127.0.0.1",
77 | "port": 8770,
78 | "disableTransactions": true
79 | },
80 |
81 | "mposMode": {
82 | "enabled": false,
83 | "host": "127.0.0.1",
84 | "port": 3306,
85 | "user": "me",
86 | "password": "mypass",
87 | "database": "safe",
88 | "checkPassword": true,
89 | "autoCreateWorker": false
90 | }
91 |
92 | }
93 |
--------------------------------------------------------------------------------
/pool_configs/examples/genx.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "genx.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress. Use the legacy options when using getnewaddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send. Use the legacy options when using getnewaddress.",
13 |
14 | "invalidAddress": "",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above. Use the legacy options when using getnewaddress.",
16 |
17 | "walletInterval": 2.5,
18 |
19 | "rewardRecipients": {
20 | "": 0.2
21 | },
22 |
23 | "paymentProcessing": {
24 | "enabled": true,
25 | "minConf": 10,
26 | "paymentMode": "prop",
27 | "_comment_paymentMode": "prop, pplnt",
28 | "paymentInterval": 120,
29 | "minimumPayment": 0.05,
30 | "maxBlocksPerPayment": 3,
31 | "daemon": {
32 | "host": "127.0.0.1",
33 | "port": 7234,
34 | "user": "rpcuser",
35 | "password": "rpcpassword"
36 | }
37 | },
38 |
39 | "tlsOptions": {
40 | "enabled": false,
41 | "serverKey": "",
42 | "serverCert": "",
43 | "ca": ""
44 | },
45 |
46 | "ports": {
47 | "1234": {
48 | "diff": 0.05,
49 | "tls": false,
50 | "varDiff": {
51 | "minDiff": 0.04,
52 | "maxDiff": 36,
53 | "targetTime": 15,
54 | "retargetTime": 60,
55 | "variancePercent": 30
56 | }
57 | }
58 | },
59 |
60 | "poolId": "main",
61 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
62 |
63 | "daemons": [
64 | {
65 | "host": "127.0.0.1",
66 | "port": 7234,
67 | "user": "rpcuser",
68 | "password": "rpcpassword"
69 | }
70 | ],
71 |
72 | "p2p": {
73 | "enabled": false,
74 | "host": "127.0.0.1",
75 | "port": 23803,
76 | "disableTransactions": true
77 | },
78 |
79 | "mposMode": {
80 | "enabled": false,
81 | "host": "127.0.0.1",
82 | "port": 3306,
83 | "user": "me",
84 | "password": "mypass",
85 | "database": "genx",
86 | "checkPassword": true,
87 | "autoCreateWorker": false
88 | }
89 |
90 | }
91 |
--------------------------------------------------------------------------------
/pool_configs/examples/safe.testnet.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "testnet/safe.json",
4 |
5 | "address": "",
6 | "_comment_address": "pool's safecoin address; ex, RSXGTHQSqwcMw1vowKfEE7sQ8fAmv1tmso",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "shielding not required in safecoin, not used",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "set to same as pools safecoin address; ex, RSXGTHQSqwcMw1vowKfEE7sQ8fAmv1tmso",
13 |
14 | "invalidAddress":"",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 1,
18 | "_comment_walletInterval": "Used to cache safecoin coin stats, shielding not performed.",
19 |
20 | "rewardRecipients": {
21 | "": 0.2
22 | },
23 |
24 | "tlsOptions": {
25 | "enabled": false,
26 | "serverKey": "",
27 | "serverCert": "",
28 | "ca": ""
29 | },
30 |
31 | "paymentProcessing": {
32 | "enabled": true,
33 | "minConf": 10,
34 | "paymentMode": "prop",
35 | "_comment_paymentMode": "prop, pplnt",
36 | "paymentInterval": 90,
37 | "_comment_paymentInterval": "Interval in seconds to check and perform payments.",
38 | "minimumPayment": 0.1,
39 | "maxBlocksPerPayment": 3,
40 | "daemon": {
41 | "host": "127.0.0.1",
42 | "port": 18771,
43 | "user": "rpcuser",
44 | "password": "rpcpassword"
45 | }
46 | },
47 |
48 | "ports": {
49 | "1234": {
50 | "tls": false,
51 | "diff": 0.5,
52 | "varDiff": {
53 | "minDiff": 0.04,
54 | "maxDiff": 36,
55 | "targetTime": 15,
56 | "retargetTime": 60,
57 | "variancePercent": 30
58 | }
59 | }
60 | },
61 |
62 | "poolId": "main",
63 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
64 |
65 | "daemons": [
66 | {
67 | "host": "127.0.0.1",
68 | "port": 18771,
69 | "user": "rpcuser",
70 | "password": "rpcpassword"
71 | }
72 | ],
73 |
74 | "p2p": {
75 | "enabled": false,
76 | "host": "127.0.0.1",
77 | "port": 18770,
78 | "disableTransactions": true
79 | },
80 |
81 | "mposMode": {
82 | "enabled": false,
83 | "host": "127.0.0.1",
84 | "port": 3306,
85 | "user": "me",
86 | "password": "mypass",
87 | "database": "safe_testnet",
88 | "checkPassword": true,
89 | "autoCreateWorker": false
90 | }
91 |
92 | }
93 |
--------------------------------------------------------------------------------
/pool_configs/examples/genx.testnet.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "testnet/genx.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress. Use the legacy options when using getnewaddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send. Use the legacy options when using getnewaddress.",
13 |
14 | "invalidAddress": "",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above. Use the legacy options when using getnewaddress.",
16 |
17 | "walletInterval": 2.5,
18 |
19 | "rewardRecipients": {
20 | "": 0.2
21 | },
22 |
23 | "paymentProcessing": {
24 | "enabled": false,
25 | "minConf": 100,
26 | "paymentMode": "prop",
27 | "_comment_paymentMode": "prop, pplnt",
28 | "paymentInterval": 300,
29 | "minimumPayment": 0.05,
30 | "maxBlocksPerPayment": 3,
31 | "daemon": {
32 | "host": "127.0.0.1",
33 | "port": 17234,
34 | "user": "rpcuser",
35 | "password": "rpcpassword"
36 | }
37 | },
38 |
39 | "tlsOptions": {
40 | "enabled": false,
41 | "serverKey": "",
42 | "serverCert": "",
43 | "ca": ""
44 | },
45 |
46 | "ports": {
47 | "1234": {
48 | "diff": 0.05,
49 | "tls": false,
50 | "varDiff": {
51 | "minDiff": 0.04,
52 | "maxDiff": 36,
53 | "targetTime": 15,
54 | "retargetTime": 60,
55 | "variancePercent": 30
56 | }
57 | }
58 | },
59 |
60 | "poolId": "main",
61 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
62 |
63 | "daemons": [
64 | {
65 | "host": "127.0.0.1",
66 | "port": 17234,
67 | "user": "rpcuser",
68 | "password": "rpcpassword"
69 | }
70 | ],
71 |
72 | "p2p": {
73 | "enabled": false,
74 | "host": "127.0.0.1",
75 | "port": 23803,
76 | "disableTransactions": true
77 | },
78 |
79 | "mposMode": {
80 | "enabled": false,
81 | "host": "127.0.0.1",
82 | "port": 3306,
83 | "user": "me",
84 | "password": "mypass",
85 | "database": "genx_testnet",
86 | "checkPassword": true,
87 | "autoCreateWorker": false
88 | }
89 |
90 | }
91 |
--------------------------------------------------------------------------------
/website/pages/payments.html:
--------------------------------------------------------------------------------
1 |
34 |
35 |
56 | {{ function readableDate(a){ return new Date(parseInt(a)).toString(); } }}
57 | {{ for(var pool in it.stats.pools) { }}
58 |
59 |
60 |
61 | Blocks
62 | Time
63 | Miners
64 | Shares
65 | Amount
66 |
67 |
68 | {{ for(var p in it.stats.pools[pool].payments) { }}
69 |
70 |
71 | {{ if (it.poolsConfigs[pool].coin.explorer && it.poolsConfigs[pool].coin.explorer.txURL) { }}
72 | {{=it.stats.pools[pool].payments[p].blocks}}
73 | {{ } else { }}
74 | {{=it.stats.pools[pool].payments[p].blocks}}
75 | {{ } }}
76 |
77 | {{=readableDate(it.stats.pools[pool].payments[p].time)}}
78 | {{=it.stats.pools[pool].payments[p].miners}}
79 | {{=Math.round(it.stats.pools[pool].payments[p].shares)}}
80 | {{=it.stats.pools[pool].payments[p].paid}} {{=it.stats.pools[pool].symbol}}
81 |
82 | {{ } }}
83 |
84 |
85 | {{ } }}
86 |
--------------------------------------------------------------------------------
/coins/testnet/zec.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "zcash_testnet",
3 | "symbol": "zect",
4 | "algorithm": "equihash",
5 | "overwinter": true,
6 | "sapling": true,
7 | "requireShielding": true,
8 | "payFoundersReward": true,
9 | "percentFoundersReward": 20,
10 | "maxFoundersRewardBlockHeight": 849999,
11 | "foundersRewardAddressChangeInterval": 17709.3125,
12 | "vFoundersRewardAddress": [
13 | "t2UNzUUx8mWBCRYPRezvA363EYXyEpHokyi", "t2N9PH9Wk9xjqYg9iin1Ua3aekJqfAtE543", "t2NGQjYMQhFndDHguvUw4wZdNdsssA6K7x2", "t2ENg7hHVqqs9JwU5cgjvSbxnT2a9USNfhy",
14 | "t2BkYdVCHzvTJJUTx4yZB8qeegD8QsPx8bo", "t2J8q1xH1EuigJ52MfExyyjYtN3VgvshKDf", "t2Crq9mydTm37kZokC68HzT6yez3t2FBnFj", "t2EaMPUiQ1kthqcP5UEkF42CAFKJqXCkXC9",
15 | "t2F9dtQc63JDDyrhnfpzvVYTJcr57MkqA12", "t2LPirmnfYSZc481GgZBa6xUGcoovfytBnC", "t26xfxoSw2UV9Pe5o3C8V4YybQD4SESfxtp", "t2D3k4fNdErd66YxtvXEdft9xuLoKD7CcVo",
16 | "t2DWYBkxKNivdmsMiivNJzutaQGqmoRjRnL", "t2C3kFF9iQRxfc4B9zgbWo4dQLLqzqjpuGQ", "t2MnT5tzu9HSKcppRyUNwoTp8MUueuSGNaB", "t2AREsWdoW1F8EQYsScsjkgqobmgrkKeUkK",
17 | "t2Vf4wKcJ3ZFtLj4jezUUKkwYR92BLHn5UT", "t2K3fdViH6R5tRuXLphKyoYXyZhyWGghDNY", "t2VEn3KiKyHSGyzd3nDw6ESWtaCQHwuv9WC", "t2F8XouqdNMq6zzEvxQXHV1TjwZRHwRg8gC",
18 | "t2BS7Mrbaef3fA4xrmkvDisFVXVrRBnZ6Qj", "t2FuSwoLCdBVPwdZuYoHrEzxAb9qy4qjbnL", "t2SX3U8NtrT6gz5Db1AtQCSGjrpptr8JC6h", "t2V51gZNSoJ5kRL74bf9YTtbZuv8Fcqx2FH",
19 | "t2FyTsLjjdm4jeVwir4xzj7FAkUidbr1b4R", "t2EYbGLekmpqHyn8UBF6kqpahrYm7D6N1Le", "t2NQTrStZHtJECNFT3dUBLYA9AErxPCmkka", "t2GSWZZJzoesYxfPTWXkFn5UaxjiYxGBU2a",
20 | "t2RpffkzyLRevGM3w9aWdqMX6bd8uuAK3vn", "t2JzjoQqnuXtTGSN7k7yk5keURBGvYofh1d", "t2AEefc72ieTnsXKmgK2bZNckiwvZe3oPNL", "t2NNs3ZGZFsNj2wvmVd8BSwSfvETgiLrD8J",
21 | "t2ECCQPVcxUCSSQopdNquguEPE14HsVfcUn", "t2JabDUkG8TaqVKYfqDJ3rqkVdHKp6hwXvG", "t2FGzW5Zdc8Cy98ZKmRygsVGi6oKcmYir9n", "t2DUD8a21FtEFn42oVLp5NGbogY13uyjy9t",
22 | "t2UjVSd3zheHPgAkuX8WQW2CiC9xHQ8EvWp", "t2TBUAhELyHUn8i6SXYsXz5Lmy7kDzA1uT5", "t2Tz3uCyhP6eizUWDc3bGH7XUC9GQsEyQNc", "t2NysJSZtLwMLWEJ6MH3BsxRh6h27mNcsSy",
23 | "t2KXJVVyyrjVxxSeazbY9ksGyft4qsXUNm9", "t2J9YYtH31cveiLZzjaE4AcuwVho6qjTNzp", "t2QgvW4sP9zaGpPMH1GRzy7cpydmuRfB4AZ", "t2NDTJP9MosKpyFPHJmfjc5pGCvAU58XGa4",
24 | "t29pHDBWq7qN4EjwSEHg8wEqYe9pkmVrtRP", "t2Ez9KM8VJLuArcxuEkNRAkhNvidKkzXcjJ", "t2D5y7J5fpXajLbGrMBQkFg2mFN8fo3n8cX", "t2UV2wr1PTaUiybpkV3FdSdGxUJeZdZztyt"
25 | ],
26 | "txfee": 0.0004,
27 |
28 | "explorer": {
29 | "txURL": "https://explorer.testnet.z.cash/tx/",
30 | "blockURL": "https://explorer.testnet.z.cash/block/",
31 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/coins/bzc.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "bitzec",
3 | "symbol": "bzc",
4 | "algorithm": "equihash",
5 | "sapling": true,
6 | "requireShielding": true,
7 | "payFoundersReward": true,
8 | "percentFoundersReward": 20,
9 | "maxFoundersRewardBlockHeight": 13000004,
10 | "foundersRewardAddressChangeInterval": 270833,
11 | "vFoundersRewardAddress": [
12 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
13 | "t3ZwokSicGHQhF7nuPVzKxTfm5qHVbXV5vS",
14 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
15 | "t3MpjbqV1f6dQcnXjBbdYCzDa87XQYuTbWz",
16 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
17 | "t3NdSKHyB7siGWGzXy6NLWNMdjF6wwWZjxy",
18 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
19 | "t3dYeSR5bNsCXtGwythocQGxfvChetbBbXj",
20 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
21 | "t3bTvatHrv7CgtNY8ZVtqeYrRsHcDGUBqSg",
22 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
23 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
24 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
25 | "t3fTavgWgerUopjuYyJLPi8mQDhcFhDRvDa",
26 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
27 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
28 | "t3MpjbqV1f6dQcnXjBbdYCzDa87XQYuTbWz",
29 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
30 | "t3fHgXgwhP4UjxCLZwyiaBNPVWrzYL1GffL",
31 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
32 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
33 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
34 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
35 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
36 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
37 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
38 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
39 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
40 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
41 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
42 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
43 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
44 | "t3aaW4aTdP7a8d1VTE1Bod2yhbeggHgMajR",
45 | "t3PPMGfYJ7FXzvRxNefS21Hgh8Fqp8Es93e",
46 | "t3NTfpUNJ1au66E1hvqNwFzL4qdvZp2Rwfk",
47 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
48 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
49 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
50 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
51 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
52 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
53 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
54 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
55 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
56 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
57 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
58 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
59 | "t3SAe5q2qTaZyFvQwGDTRLYGVtNpzhi9EyG",
60 | ],
61 | "txfee": 0.0004,
62 |
63 | "explorer": {
64 | "txURL": "http://35.204.174.237:3001/insight/tx/",
65 | "blockURL": "http://35.204.174.237:3001/insight/block/",
66 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/coins/zec.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "zcash",
3 | "symbol": "zec",
4 | "algorithm": "equihash",
5 | "overwinter": true,
6 | "sapling": true,
7 | "requireShielding": true,
8 | "payFoundersReward": true,
9 | "percentFoundersReward": 20,
10 | "maxFoundersRewardBlockHeight": 849999,
11 | "foundersRewardAddressChangeInterval": 17709,
12 | "vFoundersRewardAddress": [
13 | "t3Vz22vK5z2LcKEdg16Yv4FFneEL1zg9ojd",
14 | "t3cL9AucCajm3HXDhb5jBnJK2vapVoXsop3",
15 | "t3fqvkzrrNaMcamkQMwAyHRjfDdM2xQvDTR",
16 | "t3TgZ9ZT2CTSK44AnUPi6qeNaHa2eC7pUyF",
17 | "t3SpkcPQPfuRYHsP5vz3Pv86PgKo5m9KVmx",
18 | "t3Xt4oQMRPagwbpQqkgAViQgtST4VoSWR6S",
19 | "t3ayBkZ4w6kKXynwoHZFUSSgXRKtogTXNgb",
20 | "t3adJBQuaa21u7NxbR8YMzp3km3TbSZ4MGB",
21 | "t3K4aLYagSSBySdrfAGGeUd5H9z5Qvz88t2",
22 | "t3RYnsc5nhEvKiva3ZPhfRSk7eyh1CrA6Rk",
23 | "t3Ut4KUq2ZSMTPNE67pBU5LqYCi2q36KpXQ",
24 | "t3ZnCNAvgu6CSyHm1vWtrx3aiN98dSAGpnD",
25 | "t3fB9cB3eSYim64BS9xfwAHQUKLgQQroBDG",
26 | "t3cwZfKNNj2vXMAHBQeewm6pXhKFdhk18kD",
27 | "t3YcoujXfspWy7rbNUsGKxFEWZqNstGpeG4",
28 | "t3bLvCLigc6rbNrUTS5NwkgyVrZcZumTRa4",
29 | "t3VvHWa7r3oy67YtU4LZKGCWa2J6eGHvShi",
30 | "t3eF9X6X2dSo7MCvTjfZEzwWrVzquxRLNeY",
31 | "t3esCNwwmcyc8i9qQfyTbYhTqmYXZ9AwK3X",
32 | "t3M4jN7hYE2e27yLsuQPPjuVek81WV3VbBj",
33 | "t3gGWxdC67CYNoBbPjNvrrWLAWxPqZLxrVY",
34 | "t3LTWeoxeWPbmdkUD3NWBquk4WkazhFBmvU",
35 | "t3P5KKX97gXYFSaSjJPiruQEX84yF5z3Tjq",
36 | "t3f3T3nCWsEpzmD35VK62JgQfFig74dV8C9",
37 | "t3Rqonuzz7afkF7156ZA4vi4iimRSEn41hj",
38 | "t3fJZ5jYsyxDtvNrWBeoMbvJaQCj4JJgbgX",
39 | "t3Pnbg7XjP7FGPBUuz75H65aczphHgkpoJW",
40 | "t3WeKQDxCijL5X7rwFem1MTL9ZwVJkUFhpF",
41 | "t3Y9FNi26J7UtAUC4moaETLbMo8KS1Be6ME",
42 | "t3aNRLLsL2y8xcjPheZZwFy3Pcv7CsTwBec",
43 | "t3gQDEavk5VzAAHK8TrQu2BWDLxEiF1unBm",
44 | "t3Rbykhx1TUFrgXrmBYrAJe2STxRKFL7G9r",
45 | "t3aaW4aTdP7a8d1VTE1Bod2yhbeggHgMajR",
46 | "t3YEiAa6uEjXwFL2v5ztU1fn3yKgzMQqNyo",
47 | "t3g1yUUwt2PbmDvMDevTCPWUcbDatL2iQGP",
48 | "t3dPWnep6YqGPuY1CecgbeZrY9iUwH8Yd4z",
49 | "t3QRZXHDPh2hwU46iQs2776kRuuWfwFp4dV",
50 | "t3enhACRxi1ZD7e8ePomVGKn7wp7N9fFJ3r",
51 | "t3PkLgT71TnF112nSwBToXsD77yNbx2gJJY",
52 | "t3LQtHUDoe7ZhhvddRv4vnaoNAhCr2f4oFN",
53 | "t3fNcdBUbycvbCtsD2n9q3LuxG7jVPvFB8L",
54 | "t3dKojUU2EMjs28nHV84TvkVEUDu1M1FaEx",
55 | "t3aKH6NiWN1ofGd8c19rZiqgYpkJ3n679ME",
56 | "t3MEXDF9Wsi63KwpPuQdD6by32Mw2bNTbEa",
57 | "t3WDhPfik343yNmPTqtkZAoQZeqA83K7Y3f",
58 | "t3PSn5TbMMAEw7Eu36DYctFezRzpX1hzf3M",
59 | "t3R3Y5vnBLrEn8L6wFjPjBLnxSUQsKnmFpv",
60 | "t3Pcm737EsVkGTbhsu2NekKtJeG92mvYyoN"
61 | ],
62 | "txfee": 0.0004,
63 |
64 | "explorer": {
65 | "txURL": "https://explorer.z.cash/tx/",
66 | "blockURL": "https://explorer.z.cash/block/",
67 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/coins/yec.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ycash",
3 | "symbol": "yec",
4 | "algorithm": "equihash",
5 | "parameters": {
6 | "N": 192,
7 | "K": 7,
8 | "personalization": "ZcashPoW"
9 | },
10 | "requireShielding": true,
11 | "payFoundersReward": true,
12 | "percentFoundersReward": 5,
13 | "maxFoundersRewardBlockHeight": 849999,
14 | "foundersRewardAddressChangeInterval": 17917,
15 | "vYcashFoundersRewardAddress": [
16 | "s1hfWJ4ej1H3s8XCUb7YnrU68K64AsGVUHE",
17 | "s1iZaRoYtafWspcieQxg6hhaU4DfZyAdGQf",
18 | "s1RSr6xec6Cc98emM4cdq45rkVekHMjRWbw",
19 | "s1RsqYeweoKVepivLPLsiajE8c6khu5UKhS",
20 | "s1MNmqMWyV4nMWE4oDb1nqJs7haJrv9QTKp",
21 | "s1RP95ESdcu33gMtU7deLW9TP6yDZncjRQ7",
22 | "s1h8W7xQbiU8Zxu21Zcg82NByjkWMcEbNtX",
23 | "s1PVcdfcrJrDCmXxgSTGuKGSNhwSYZ51XKJ",
24 | "s1PkV5nFkgQN4EGuTtEcmm4CxeBVx2L5HHv",
25 | "s1jiVSTfMaFUrWnf17BGc416oomHbut58Ue",
26 | "s1Zr2KdHtnK2zNSMQDrAVv3KU51mgDbqgwe",
27 | "s1QkY6tmBHPZacXPMPmsjP37Kxgs5mcgcAn",
28 | "s1Xu76ZmGDENdLFAiuj5iMdp1RA4hWSNieq",
29 | "s1bdiEnfBYaEgrt2TmnY3ZHmdhg5AEw9tjN",
30 | "s1asM9Ui4U13GjmLoAhvfK6J5QihemQR9Pk",
31 | "s1QhTSXYu4K1cTNomN27wiep9WC9HBZjrxJ",
32 | "s1j3Ef2qCNjwRAM18BgwsPAZFzZ475BWM5S",
33 | "s1QZibiN7iqVCfVBES9Gn7e3o5psxRKtpwE",
34 | "s1fdiDZHkzp8K8UajpVwYUdyFeb6jNVyoKv",
35 | "s1iMShbVRH1eCGxK2ZoLMDn5o9NcwXkNPVF",
36 | "s1YtUXAMt8m31gGeP5m3Y53B1wrMk3FFigJ",
37 | "s1gy9aqWUihGRjZa3vqc7136vqTGNAWyefF",
38 | "s1NNozrex18HZqcHCGpGoSRkj8hqHLEPaVC",
39 | "s1NYNDdqthMf7D7sZbnLGuecDtXb48Ne2bf",
40 | "s1P7UJ9Wp7jstJPUbvMSRVFjN8tfQueQSK3",
41 | "s1RDeyH7xg8y9veb9XfAmtKzrMTjFS14c4T",
42 | "s1NmH6MNXU19xoHjUfpQpb4dEMSy1Wbs9tC",
43 | "s1UnFL2yrZapMKmB5EqaBKpogZmnXLUgELB",
44 | "s1XT3W1sLFdgmGoecQbPdJbjUDMurW8CFA2",
45 | "s1gyVwgangQxLCAcm8VS4SWqXDqeohNg7hd",
46 | "s1k3eWbqnbVM1xtZEDc81UbFdwXgXNnbtdH",
47 | "s1Wr6eAh3gZWwBVRZcND9YCzdNfR9cARkD4",
48 | "s1dtjp2KHWZ6qF2LvgNiEwjJV2dA2c6y75V",
49 | "s1cjQf9kmjQdTmnn6mbBaesHMNLt2JqjyEV",
50 | "s1URQeusSoi7fkgyAwCshFzobUzmLGH4U3b",
51 | "s1Z9YqM2h48HUf8kcSHS89q4Z6Bg9xua3kA",
52 | "s1TLmZzMDsDhYfh4vpY7NpRB4kao2UEEqKu",
53 | "s1QEWvfC1uifDfi78NY7cArw9xLEja7QAZR",
54 | "s1b4kfW9WMUtd2H7X4C64KLzqPWdMPXRMtS",
55 | "s1cHTXzCXhKYAX7sY7D8YGcmopjN8Yngoju",
56 | "s1QKjMQDeF9FLVo2sL8m11VC4ZA18s61s2K",
57 | "s1gV8D561ZpmaZVxG176cQM1bMFMnHLvujE",
58 | "s1caQmLCYVDZegcMoBckHD2RXjBh7ikpj2j",
59 | "s1Y63AsWsJTk5t5nSZfaFcFWmtfnFUUAu2V",
60 | "s1Y2U4GsfZdP9LAbC97GAmSdihBX5FU9gQn",
61 | "s1bPYWZMXzyN2ML2vswDiCckmas775QFs2Q",
62 | "s1erG25RcWYCiBPbT7khTU4ULhzm8jJZ7pv",
63 | "s1kYEiPdFZ3oV389q2MmSYY932qPF1ygVtx"
64 | ],
65 |
66 | "txfee": 0.0001,
67 | "sapling": true,
68 | "peerMagic": "24e92764",
69 | "explorer": {
70 | "txURL": "",
71 | "blockURL": "",
72 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/coins/testnet/yec.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ycash_testnet",
3 | "symbol": "yec",
4 | "algorithm": "equihash",
5 | "parameters": {
6 | "N": 192,
7 | "K": 7,
8 | "personalization": "ZcashPoW"
9 | },
10 | "requireShielding": true,
11 | "payFoundersReward": true,
12 | "percentFoundersReward": 5,
13 | "maxFoundersRewardBlockHeight": 849999,
14 | "foundersRewardAddressChangeInterval": 17917,
15 | "vYcashFoundersRewardAddress": [
16 | "smDw2LWkeuJ1NGBDDZvdNbzY8A9D1mkkDZm",
17 | "smDxM6WPpz3HcK6m9cCnhQkBXMLnUf3cryA",
18 | "smEKdQPcZHYTmcTbVkqfWryRbEZWMrapjMo",
19 | "smEVfJmuGErW6ZM3XSNwbJR6cPU3iPABAqY",
20 | "smEkWMsbV1CBZosu9wtq69f2vNXBT1owNKe",
21 | "smFd3Dh5MjEttRHd9S8kx153Vzesefzjc2d",
22 | "smGBXB9SrjnEDf7ASQxvnujBRc1qBb58o5q",
23 | "smGLTYjSriA3n8EMf4JTiHLGUCzUYjau3WV",
24 | "smGVF2kDywxhjfzBqoFDE1AyXZEafTLSjbH",
25 | "smGVrxUHUzd2gaURPw2ASoE3L5WMFcxJcp1",
26 | "smHTCd59Q9pFzrzA73f6het1ozDzeQaA8E3",
27 | "smHy6JaGM9gkaGBJ4DF4p5FbFvoUbpAusWd",
28 | "smJ1fpQdKNuchkxuVUMBkcCWoBcWFmyDAyZ",
29 | "smJ2j3Gea5XH7ERpyYzvo6YQKaoYfzkMUS3",
30 | "smJ8gtE5EX5oFSp4c5cCDpxoajXTQu73VSC",
31 | "smJyGxvwpCxPaFJM6TwZ6cwT1qz5PMPPBeL",
32 | "smKEt1iVgCDY9V4915HnGpFK3zyTPyQixMa",
33 | "smKXxXsNLUVE8Qro6R9EyaEZmvgxqjbsFX9",
34 | "smLTH7FEiXUVpWjhoL91ToMoSZPU8xAvEh9",
35 | "smLo65rNyiEYiVHxWZHNNP9QU1HsQu3QX7b",
36 | "smMDUN36MqFE4thY54CQnWBpU4ePuayF9TV",
37 | "smMWmoipQ7YVuRAJaQHKqhHbbTg28mS6ET5",
38 | "smMtCCZsR3s7ZiEYskFietNPfSb1eVHNoZi",
39 | "smMuh9QVkpQg93Gb54ucaVykbk9FgjZBN3D",
40 | "smNM44GrsbMWHQRhhayqieCadzURNDLkxkW",
41 | "smNhJLQs3LmHWtVscrnJmrLhhjPcDD3unJZ",
42 | "smPHxC1438rANivn1omntbRF5Nf2wSZfFhs",
43 | "smSAidYKoFY2fmi2efcoJPSeBpdVC2vyHvj",
44 | "smShCYXefsx8RcnW2b7duPKBcD5TXWY5K2A",
45 | "smTRxVMtveLrdzVb1B9rLKfDZ3Qp8kAna7r",
46 | "smTnar3ernxTG5voae2bUC185EicBdSKVux",
47 | "smUmPeP8VwuPsNTcJcB7YZY1b1HJJsJfkYp",
48 | "smVSGTzPP4dbj3HXRR84WoBFWw4EVuuyVi2",
49 | "smW8AA9LAKGMj4EXxNtfJQFLFaiuzTyGwYa",
50 | "smWAgHkGiQ1fZHF9ZBjYzKS7ZX8JtjvWbaU",
51 | "smX1HT3n9mtPGeK7qMBETCEGL5UG8eC8nmy",
52 | "smX3udkLyb3qZ2z2muEinbvNuSi5M2JiiE5",
53 | "smXEcB2QZaZgevkB7CS1Tz2BZNQ9cnNwXBj",
54 | "smXddMXWZvpRDq4FjuTGxLWYTtwbNwc36g5",
55 | "smXfPS6G7aiVECG8qFvZc9oFe1bzEvCKECG",
56 | "smXxQi63m9x2WfhdBYogWdKzavVpbnnGyJq",
57 | "smZ53EtRafyjGZyjiNDb1FiGbwXbtE3aqTB",
58 | "smZJPM9KsKAdfotD6Woh2nb8wLedvhf4Nw5",
59 | "smZyciv3CGZLAFU8d2yKff33FU8f2nek5yx",
60 | "smZzRpCLENnxN5JgMHaKtMruTCi7jsa7Tak",
61 | "smaWKSqvUJvajRquGbaHBdNbL78fDf6hdwE",
62 | "smazMQ9G7NLJXAzX4ZMKc8x6DigyeoEucgk",
63 | "smbTaZmsKNEVstoQVyZcJAMJExiytfnwaMU"
64 | ],
65 |
66 | "txfee": 0.0001,
67 | "sapling": true,
68 | "peerMagic": "fa1af9bf",
69 | "explorer": {
70 | "txURL": "",
71 | "blockURL": "",
72 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/website/pages/workers.html:
--------------------------------------------------------------------------------
1 |
35 |
53 | {{ function capitalizeFirstLetter(t){return t.charAt(0).toUpperCase()+t.slice(1)} }}
54 | {{ var i=0; for(var pool in it.stats.pools) { }}
55 |
56 |
57 |
58 |
59 | Miner Lookup:
60 |
61 |
62 | Lookup
63 |
64 |
65 |
66 | {{=capitalizeFirstLetter(it.stats.pools[pool].name)}} Top Miners
67 | {{=it.stats.pools[pool].minerCount}} Miners
68 | {{=it.stats.pools[pool].workerCount}} Workers
69 | {{=it.stats.pools[pool].shareCount}} Shares
70 |
71 |
72 |
73 |
74 |
75 | Address
76 | Shares
77 | Efficiency
78 | Hashrate
79 |
80 |
81 | {{ for(var worker in it.stats.pools[pool].miners) { }}
82 | {{var workerstat = it.stats.pools[pool].miners[worker];}}
83 |
84 | {{=worker}}
85 | {{=Math.round(workerstat.currRoundShares * 100) / 100}}
86 | {{? workerstat.shares > 0}} {{=Math.floor(10000 * workerstat.shares / (workerstat.shares + workerstat.invalidshares)) / 100}}% {{??}} 0% {{?}}
87 | {{=workerstat.hashrateString}}
88 |
89 | {{ } }}
90 |
91 |
92 |
93 |
94 | {{ } }}
95 |
--------------------------------------------------------------------------------
/pool_configs/examples/bzc.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "bzc.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress":"",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 | "_comment_walletInterval": "Used to cache coin stats",
19 |
20 | "rewardRecipients": {
21 | "": 0.2
22 | },
23 |
24 | "tlsOptions": {
25 | "enabled": false,
26 | "serverKey": "",
27 | "serverCert": "",
28 | "ca": ""
29 | },
30 |
31 | "paymentProcessing": {
32 | "enabled": true,
33 | "minConf": 6,
34 | "paymentMode": "prop",
35 | "_comment_paymentMode": "prop, pplnt",
36 | "paymentInterval": 120,
37 | "minimumPayment": 0.05,
38 | "maxBlocksPerPayment": 3,
39 | "daemon": {
40 | "host": "127.0.0.1",
41 | "port": 8732,
42 | "user": "rpcuser",
43 | "password": "rpcpassword"
44 | }
45 | },
46 |
47 | "ports": {
48 | "1234": {
49 | "tls":false,
50 | "diff": 0.5,
51 | "varDiff": {
52 | "minDiff": 0.04,
53 | "maxDiff": 16,
54 | "targetTime": 15,
55 | "retargetTime": 80,
56 | "variancePercent": 30
57 | }
58 | },
59 | "1234": {
60 | "tls":false,
61 | "diff": 16,
62 | "varDiff": {
63 | "minDiff": 6,
64 | "maxDiff": 20,
65 | "targetTime": 15,
66 | "retargetTime": 80,
67 | "variancePercent": 30
68 | }
69 | },
70 | "1234": {
71 | "tls":false,
72 | "diff": 0.25,
73 | "varDiff": {
74 | "minDiff": 0.1,
75 | "maxDiff": 10,
76 | "targetTime": 15,
77 | "retargetTime": 80,
78 | "variancePercent": 30
79 | }
80 | },
81 | "1234": {
82 | "tls":false,
83 | "diff": 4,
84 | "varDiff": {
85 | "minDiff": 0.5,
86 | "maxDiff": 20,
87 | "targetTime": 15,
88 | "retargetTime": 80,
89 | "variancePercent": 30
90 | }
91 | }
92 | },
93 |
94 | "poolId": "main",
95 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
96 |
97 | "daemons": [
98 | {
99 | "host": "127.0.0.1",
100 | "port": 8732,
101 | "user": "rpcuser",
102 | "password": "rpcpassword"
103 | }
104 | ],
105 |
106 | "p2p": {
107 | "enabled": false,
108 | "host": "127.0.0.1",
109 | "port": 8733,
110 | "disableTransactions": true
111 | },
112 |
113 | "mposMode": {
114 | "enabled": false,
115 | "host": "127.0.0.1",
116 | "port": 3306,
117 | "user": "me",
118 | "password": "mypass",
119 | "database": "bzc",
120 | "checkPassword": true,
121 | "autoCreateWorker": false
122 | }
123 |
124 | }
125 |
--------------------------------------------------------------------------------
/pool_configs/examples/bze.json:
--------------------------------------------------------------------------------
1 | {
2 | "enabled": false,
3 | "coin": "bze.json",
4 |
5 | "address": "",
6 | "_comment_address": "a transparent address to send coinbase rewards to and to transfer to zAddress.",
7 |
8 | "zAddress": "",
9 | "_comment_zAddress": "a private address used to send coins to tAddress.",
10 |
11 | "tAddress": "",
12 | "_comment_tAddress": "transparent address used to send payments, make this a different address, otherwise payments will not send",
13 |
14 | "invalidAddress":"",
15 | "_comment_invalidAddress": "Invalid addresses will be converted to the above",
16 |
17 | "walletInterval": 2.5,
18 | "_comment_walletInterval": "Used to cache coin stats",
19 |
20 | "rewardRecipients": {
21 | "": 0.2
22 | },
23 |
24 | "tlsOptions": {
25 | "enabled": false,
26 | "serverKey": "",
27 | "serverCert": "",
28 | "ca": ""
29 | },
30 |
31 | "paymentProcessing": {
32 | "enabled": true,
33 | "minConf": 6,
34 | "paymentMode": "prop",
35 | "_comment_paymentMode": "prop, pplnt",
36 | "paymentInterval": 120,
37 | "minimumPayment": 0.05,
38 | "maxBlocksPerPayment": 3,
39 | "daemon": {
40 | "host": "127.0.0.1",
41 | "port": 1980,
42 | "user": "rpcuser",
43 | "password": "rpcpassword"
44 | }
45 | },
46 |
47 | "ports": {
48 | "1234": {
49 | "tls":false,
50 | "diff": 0.5,
51 | "varDiff": {
52 | "minDiff": 0.04,
53 | "maxDiff": 16,
54 | "targetTime": 15,
55 | "retargetTime": 80,
56 | "variancePercent": 30
57 | }
58 | },
59 | "1234": {
60 | "tls":false,
61 | "diff": 16,
62 | "varDiff": {
63 | "minDiff": 6,
64 | "maxDiff": 20,
65 | "targetTime": 15,
66 | "retargetTime": 80,
67 | "variancePercent": 30
68 | }
69 | },
70 | "1234": {
71 | "tls":false,
72 | "diff": 0.25,
73 | "varDiff": {
74 | "minDiff": 0.1,
75 | "maxDiff": 10,
76 | "targetTime": 15,
77 | "retargetTime": 80,
78 | "variancePercent": 30
79 | }
80 | },
81 | "1234": {
82 | "tls":false,
83 | "diff": 4,
84 | "varDiff": {
85 | "minDiff": 0.5,
86 | "maxDiff": 20,
87 | "targetTime": 15,
88 | "retargetTime": 80,
89 | "variancePercent": 30
90 | }
91 | }
92 | },
93 |
94 | "poolId": "main",
95 | "_comment_poolId": "use it for region identification: eu, us, asia or keep default if you have one stratum instance for one coin",
96 |
97 | "daemons": [
98 | {
99 | "host": "127.0.0.1",
100 | "port": 1980,
101 | "user": "rpcuser",
102 | "password": "rpcpassword"
103 | }
104 | ],
105 |
106 | "p2p": {
107 | "enabled": false,
108 | "host": "127.0.0.1",
109 | "port": 1990,
110 | "disableTransactions": true
111 | },
112 |
113 | "mposMode": {
114 | "enabled": false,
115 | "host": "127.0.0.1",
116 | "port": 3306,
117 | "user": "me",
118 | "password": "mypass",
119 | "database": "bzc",
120 | "checkPassword": true,
121 | "autoCreateWorker": false
122 | }
123 |
124 | }
125 |
--------------------------------------------------------------------------------
/libs/apiCoinWarz.js:
--------------------------------------------------------------------------------
1 | var request = require('request');
2 | var nonce = require('nonce');
3 |
4 | module.exports = function() {
5 | 'use strict';
6 |
7 | // Module dependencies
8 |
9 | // Constants
10 | var version = '0.0.1',
11 | PUBLIC_API_URL = 'http://www.coinwarz.com/v1/api/profitability/?apikey=YOUR_API_KEY&algo=all',
12 | USER_AGENT = 'nomp/node-open-mining-portal'
13 |
14 | // Constructor
15 | function Cryptsy(key, secret){
16 | // Generate headers signed by this user's key and secret.
17 | // The secret is encapsulated and never exposed
18 | this._getPrivateHeaders = function(parameters){
19 | var paramString, signature;
20 |
21 | if (!key || !secret){
22 | throw 'CoinWarz: Error. API key and secret required';
23 | }
24 |
25 | // Sort parameters alphabetically and convert to `arg1=foo&arg2=bar`
26 | paramString = Object.keys(parameters).sort().map(function(param){
27 | return encodeURIComponent(param) + '=' + encodeURIComponent(parameters[param]);
28 | }).join('&');
29 |
30 | signature = crypto.createHmac('sha512', secret).update(paramString).digest('hex');
31 |
32 | return {
33 | Key: key,
34 | Sign: signature
35 | };
36 | };
37 | }
38 |
39 | // If a site uses non-trusted SSL certificates, set this value to false
40 | Cryptsy.STRICT_SSL = true;
41 |
42 | // Helper methods
43 | function joinCurrencies(currencyA, currencyB){
44 | return currencyA + '_' + currencyB;
45 | }
46 |
47 | // Prototype
48 | CoinWarz.prototype = {
49 | constructor: CoinWarz,
50 |
51 | // Make an API request
52 | _request: function(options, callback){
53 | if (!('headers' in options)){
54 | options.headers = {};
55 | }
56 |
57 | options.headers['User-Agent'] = USER_AGENT;
58 | options.json = true;
59 | options.strictSSL = CoinWarz.STRICT_SSL;
60 |
61 | request(options, function(err, response, body) {
62 | callback(err, body);
63 | });
64 |
65 | return this;
66 | },
67 |
68 | // Make a public API request
69 | _public: function(parameters, callback){
70 | var options = {
71 | method: 'GET',
72 | url: PUBLIC_API_URL,
73 | qs: parameters
74 | };
75 |
76 | return this._request(options, callback);
77 | },
78 |
79 |
80 | /////
81 |
82 |
83 | // PUBLIC METHODS
84 |
85 | getTicker: function(callback){
86 | var parameters = {
87 | method: 'marketdatav2'
88 | };
89 |
90 | return this._public(parameters, callback);
91 | },
92 |
93 | getOrderBook: function(currencyA, currencyB, callback){
94 | var parameters = {
95 | command: 'returnOrderBook',
96 | currencyPair: joinCurrencies(currencyA, currencyB)
97 | };
98 |
99 | return this._public(parameters, callback);
100 | },
101 |
102 | getTradeHistory: function(currencyA, currencyB, callback){
103 | var parameters = {
104 | command: 'returnTradeHistory',
105 | currencyPair: joinCurrencies(currencyA, currencyB)
106 | };
107 |
108 | return this._public(parameters, callback);
109 | },
110 |
111 |
112 | ////
113 |
114 | return CoinWarz;
115 | }();
116 |
--------------------------------------------------------------------------------
/website/pages/miner_stats.html:
--------------------------------------------------------------------------------
1 |
78 |
79 |
80 |
81 |
82 |
83 |
{{=String(it.stats.address).split(".")[0]}}
84 |
... (Avg)
85 |
... (Now)
86 |
Luck ... Days
87 |
88 |
89 |
90 |
Shares: ...
91 |
Immature: ...
92 |
Bal: ...
93 |
Paid: ...
94 |
95 |
96 |
97 |
98 |
99 |
100 |
106 |
--------------------------------------------------------------------------------
/website/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 | s-nomp
25 |
26 |
27 |
28 |
29 |
30 |
69 |
70 |
71 | {{=it.page}}
72 |
73 |
74 |
75 |
76 |
77 |
78 | This site is powered by the open source
s-nomp
79 | project created by Joshua Yabut and the Zclassic Community and is licensed under the
MIT License
80 |
81 |
82 | Support this project by donating BTC: 18vHMxVzotQ9EPyESrf7Z1hNM9AwJeVHgD
83 |
84 |
89 |
90 |
91 |
92 |
93 |
94 |
--------------------------------------------------------------------------------
/website/static/admin.js:
--------------------------------------------------------------------------------
1 | var docCookies = {
2 | getItem: function (sKey) {
3 | return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
4 | },
5 | setItem: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) {
6 | if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return false; }
7 | var sExpires = "";
8 | if (vEnd) {
9 | switch (vEnd.constructor) {
10 | case Number:
11 | sExpires = vEnd === Infinity ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT" : "; max-age=" + vEnd;
12 | break;
13 | case String:
14 | sExpires = "; expires=" + vEnd;
15 | break;
16 | case Date:
17 | sExpires = "; expires=" + vEnd.toUTCString();
18 | break;
19 | }
20 | }
21 | document.cookie = encodeURIComponent(sKey) + "=" + encodeURIComponent(sValue) + sExpires + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "") + (bSecure ? "; secure" : "");
22 | return true;
23 | },
24 | removeItem: function (sKey, sPath, sDomain) {
25 | if (!sKey || !this.hasItem(sKey)) { return false; }
26 | document.cookie = encodeURIComponent(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + ( sDomain ? "; domain=" + sDomain : "") + ( sPath ? "; path=" + sPath : "");
27 | return true;
28 | },
29 | hasItem: function (sKey) {
30 | return (new RegExp("(?:^|;\\s*)" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie);
31 | }
32 | };
33 |
34 | var password = docCookies.getItem('password');
35 |
36 |
37 | function showLogin(){
38 | $('#adminCenter').hide();
39 | $('#passwordForm').show();
40 | }
41 |
42 | function showAdminCenter(){
43 | $('#passwordForm').hide();
44 | $('#adminCenter').show();
45 | }
46 |
47 | function tryLogin(){
48 | apiRequest('pools', {}, function(response){
49 | showAdminCenter();
50 | displayMenu(response.result)
51 | });
52 | }
53 |
54 | function displayMenu(pools){
55 | $('#poolList').after(Object.keys(pools).map(function(poolName){
56 | return '';
57 | }).join(''));
58 | }
59 |
60 | function apiRequest(func, data, callback){
61 | var httpRequest = new XMLHttpRequest();
62 | httpRequest.onreadystatechange = function(){
63 | if (httpRequest.readyState === 4 && httpRequest.responseText){
64 | if (httpRequest.status === 401){
65 | docCookies.removeItem('password');
66 | $('#password').val('');
67 | showLogin();
68 | alert('Incorrect Password');
69 | }
70 | else{
71 | var response = JSON.parse(httpRequest.responseText);
72 | callback(response);
73 | }
74 | }
75 | };
76 | httpRequest.open('POST', '/api/admin/' + func);
77 | data.password = password;
78 | httpRequest.setRequestHeader('Content-Type', 'application/json');
79 | httpRequest.send(JSON.stringify(data));
80 | }
81 |
82 | if (password){
83 | tryLogin();
84 | }
85 | else{
86 | showLogin();
87 | }
88 |
89 | $('#passwordForm').submit(function(event){
90 | event.preventDefault();
91 | password = $('#password').val();
92 | if (password){
93 | if ($('#remember').is(':checked'))
94 | docCookies.setItem('password', password, Infinity);
95 | else
96 | docCookies.setItem('password', password);
97 | tryLogin();
98 | }
99 | return false;
100 | });
101 |
--------------------------------------------------------------------------------
/config_example.json:
--------------------------------------------------------------------------------
1 | {
2 | "logLevel": "debug",
3 | "logColors": true,
4 |
5 | "cliPort": 17117,
6 | "cliServer": "127.0.0.1",
7 |
8 | "clustering": {
9 | "enabled": true,
10 | "forks": "auto"
11 | },
12 |
13 | "defaultPoolConfigs": {
14 | "blockRefreshInterval": 500,
15 | "jobRebroadcastTimeout": 55,
16 | "connectionTimeout": 600,
17 | "emitInvalidBlockHashes": false,
18 | "validateWorkerUsername": true,
19 | "tcpProxyProtocol": false,
20 | "banning": {
21 | "enabled": true,
22 | "time": 600,
23 | "invalidPercent": 50,
24 | "checkThreshold": 500,
25 | "purgeInterval": 300
26 | },
27 | "redis": {
28 | "_disabled_socket": "/var/run/redis/redis.sock",
29 | "_socket": "Set socket to enable UNIX domain sockets, otherwise leave unset and set host and port."
30 | "host": "127.0.0.1",
31 | "port": 6379,
32 | "password": ""
33 | },
34 | "poolHex": "",
35 | "_poolHex_comment": "Set this HEX value using a template of ' ' and provide it to various explorer webmasters."
36 | },
37 |
38 | "website": {
39 | "enabled": true,
40 | "host": "0.0.0.0",
41 | "port": 8080,
42 | "stratumHost": "cryppit.com",
43 | "stats": {
44 | "updateInterval": 30,
45 | "historicalRetention": 14400,
46 | "hashrateWindow": 300
47 | },
48 | "adminCenter": {
49 | "enabled": false,
50 | "password": "password"
51 | },
52 | "tlsOptions" : {
53 | "enabled": false,
54 | "cert": "",
55 | "key": ""
56 | }
57 | },
58 |
59 | "redis": {
60 | "_disabled_socket": "/var/run/redis/redis.sock",
61 | "_socket": "Set socket to enable UNIX domain sockets, otherwise leave unset and set host and port."
62 | "host": "127.0.0.1",
63 | "port": 6379,
64 | "password": ""
65 | },
66 |
67 | "switching": {
68 | "switch1": {
69 | "enabled": false,
70 | "algorithm": "sha256",
71 | "ports": {
72 | "3333": {
73 | "diff": 10,
74 | "varDiff": {
75 | "minDiff": 16,
76 | "maxDiff": 512,
77 | "targetTime": 15,
78 | "retargetTime": 90,
79 | "variancePercent": 30
80 | }
81 | }
82 | }
83 | },
84 | "switch2": {
85 | "enabled": false,
86 | "algorithm": "scrypt",
87 | "ports": {
88 | "4444": {
89 | "diff": 10,
90 | "varDiff": {
91 | "minDiff": 16,
92 | "maxDiff": 512,
93 | "targetTime": 15,
94 | "retargetTime": 90,
95 | "variancePercent": 30
96 | }
97 | }
98 | }
99 | },
100 | "switch3": {
101 | "enabled": false,
102 | "algorithm": "x11",
103 | "ports": {
104 | "5555": {
105 | "diff": 0.001,
106 | "varDiff": {
107 | "minDiff": 0.001,
108 | "maxDiff": 1,
109 | "targetTime": 15,
110 | "retargetTime": 60,
111 | "variancePercent": 30
112 | }
113 | }
114 | }
115 | }
116 | },
117 |
118 | "profitSwitch": {
119 | "enabled": false,
120 | "updateInterval": 600,
121 | "depth": 0.90,
122 | "usePoloniex": true,
123 | "useCryptsy": true,
124 | "useMintpal": true,
125 | "useBittrex": true
126 | }
127 | }
128 |
--------------------------------------------------------------------------------
/coins/testnet/zen.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "zen_testnet",
3 | "symbol": "zent",
4 | "algorithm": "equihash",
5 | "requireShielding": true,
6 | "payFoundersReward": true,
7 | "percentFoundersReward": 8.5,
8 | "maxFoundersRewardBlockHeight": 839999,
9 | "foundersRewardAddressChangeInterval": 17500,
10 | "vFoundersRewardAddress": [
11 | "zrH8KT8KUcpKKNBu3fjH4hA84jZBCawErqn", "zrGsMC4ou1r5Vxy7Dnxg4PfKpansx83BM8g", "zr6sB2Az36D8CqzeZNavB11WbovsGtJSAZG", "zrBAG3pXCTDq14nivNK9mW8SfwMNcdmMQpb",
12 | "zrRLwpYRYky4wsvwLVrDp8fs89EBTRhNMB1", "zrLozMfptTmE3zLP5SrTLyB8TXqH84Agjrr", "zrMckkaLtVTEUvxj4ouU7BPDGa8xmdTZSVE", "zrFc897wJXmF7BcEdbvi2mS1bLrcuWYK6hm",
13 | "zrHEnni486u9SNcLWacroSgcdyMA33tfM92", "zrJ3ymPV3R8Xk4N3BdNb898xvZvARm5K7mq", "zrDj3P6trx73291krxU51U9QnfkbGxkyJ6E", "zrJs3vMGFJi9pQCireeSLckJonamBnwTSrY",
14 | "zrKFdXQoAkkycy52EFoWARyzZWx6Kat2Som", "zrEXbSe79FXA9KRMnJTZUWZdZhNnjcnAdrq", "zr7iAwfNgJsMpSCmijK3TuVDuNvSmLr1rUz", "zrDEK7K6cftqSjeyVUH1WqJtBUkXN7GidxH",
15 | "zrRennuq75hyBVU4JymtZk8UcQ1vRPKpmpj", "zr9HRTL79pKmn5R8fvkC9kucZ4u1bQruLTD", "zrML8KXpJsa1NVnbJuawX86ZvAn543tWdTT", "zrLBAkQoxpEtnztSUEcdxnEvuwtgxyAMGX7",
16 | "zr6kPnVzFBYmcBDsWoTrPHRuBxLq21o4zvT", "zrMY3vdvqs9KSvx9TawvcyuVurt1Jj6GPVo", "zr9WB1qBpM4nwi1mudUFfjtMNmqzaBQDsXn", "zrAHbtHDPAqmzWJMQqSYzGyFnDWN3oELZRs",
17 | "zrH1f5K3z7EQ6RWWZ7StCDWHTZwFChBVA2W", "zrNTacAid9LS4kAqzM4sw1YcF7gLFrzVM7U", "zrFyZpMVKMeDqbn6A2uUiL9mZmgxuR1pUBg", "zrD1cqGFGzBcPogFHJvnN4XegvvmbTjA43t",
18 | "zr5A1D7czWkB4pAWfGC5Pux5Ek7anYybdPK", "zr8yTAxCy6jAdsc6qPvmVEQHbYo25AJKhy9", "zrFW2YjQw4cABim5kEDwapbSqTz3wW7cWkk", "zr9nJvNbsrvUTZD41fhqAQeUcgMfqZmAweN",
19 | "zrCx4dXZd5b2tD483Ds4diHpo1QxBMJ76Jr", "zr6eVeRwU6Puob3K1RfWtva1R458oj8pzkL", "zr7B92iHtQcobZjGCXo3DAqMQjsn7ka31wE", "zr8bcemLWAjYuphXSVqtqZWEnJipCB9F5oC",
20 | "zrFzsuPXb7HsFd3srBqtVqnC9GQ94DQubV2", "zr4yiBobiHjHnCYi75NmYtyoqCV4A3kpHDL", "zrGVdR4K4F8MfmWxhUiTypK7PTsvHi8uTAh", "zr7WiCDqCMvUdH1xmMu8YrBMFb2x2E6BX3z",
21 | "zrEFrGWLX4hPHuHRUD3TPbMAJyeSpMSctUc", "zr5c3f8PTnW8qBFX1GvK2LhyLBBCb1WDdGG", "zrGkAZkZLqC9QKJR3XomgxNizCpNuAupTeg", "zrM7muDowiun9tCHhu5K9vcDGfUptuYorfZ",
22 | "zrCsWfwKotWnQmFviqAHAPAJ2jXqZYW966P", "zrLLB3JB3jozUoMGFEGhjqyVXTpngVQ8c4T", "zrAEa8YjJ2f3m2VsM1Xa9EwibZxEnRoSLUx", "zrAdJgp7Cx35xTvB7ABWP8YLTNDArMjP1s3"
23 | ],
24 | "percentTreasuryReward": 12.0,
25 | "treasuryRewardStartBlockHeight": 85500,
26 | "treasuryRewardAddressChangeInterval": 10000,
27 | "vTreasuryRewardAddress": [
28 | "zrRBQ5heytPMN5nY3ssPf3cG4jocXeD8fm1", "zrRBQ5heytPMN5nY3ssPf3cG4jocXeD8fm1", "zrRBQ5heytPMN5nY3ssPf3cG4jocXeD8fm1", "zrRBQ5heytPMN5nY3ssPf3cG4jocXeD8fm1"
29 | ],
30 | "percentTreasuryUpdateReward": 10.0,
31 | "treasuryRewardUpdateStartBlockHeight": 260500,
32 | "treasuryRewardUpdateAddressChangeInterval": 10000,
33 | "vTreasuryRewardUpdateAddress": [
34 | "zrFzxutppvxEdjyu4QNjogBMjtC1py9Hp1S",
35 | "zrFzxutppvxEdjyu4QNjogBMjtC1py9Hp1S",
36 | "zrFzxutppvxEdjyu4QNjogBMjtC1py9Hp1S",
37 | "zrFzxutppvxEdjyu4QNjogBMjtC1py9Hp1S"
38 | ],
39 | "percentSecureNodesReward": 10.0,
40 | "vSecureNodesRewardAddress": [
41 | "zrS7QUB2eDbbKvyP43VJys3t7RpojW8GdxH",
42 | "zrS7QUB2eDbbKvyP43VJys3t7RpojW8GdxH",
43 | "zrS7QUB2eDbbKvyP43VJys3t7RpojW8GdxH",
44 | "zrS7QUB2eDbbKvyP43VJys3t7RpojW8GdxH"
45 | ],
46 | "percentSuperNodesReward": 10.0,
47 | "vSuperNodesRewardAddress": [
48 | "zrFr5HVm7woVq3oFzkMEdJdbfBchfPAPDsP",
49 | "zrFr5HVm7woVq3oFzkMEdJdbfBchfPAPDsP",
50 | "zrFr5HVm7woVq3oFzkMEdJdbfBchfPAPDsP",
51 | "zrFr5HVm7woVq3oFzkMEdJdbfBchfPAPDsP"
52 | ],
53 | "percentTreasury20pctUpdateReward": 20.0,
54 | "treasuryReward20pctUpdateStartBlockHeight":369900,
55 | "peerMagic": "bff2cde6",
56 | "txfee": 0.0004,
57 |
58 | "explorer": {
59 | "txURL": "https://explorer-testnet.horizen.global/tx/",
60 | "blockURL": "https://explorer-testnet.horizen.global/block/",
61 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/website/pages/home.html:
--------------------------------------------------------------------------------
1 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
Welcome to the future of mining
83 |
84 | Low fees
85 | High performance Node.js backend
86 | User friendly mining client
87 | Multi-coin / multi-pool
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 | {{ for(var algo in it.stats.algos) { }}
99 |
100 |
{{=algo}}
101 |
{{=it.stats.algos[algo].workers}} Miners
102 |
{{=it.stats.algos[algo].hashrateString}}
103 |
104 | {{ } }}
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 | {{ for(var pool in it.stats.pools) { }}
114 |
115 |
{{=pool}}
116 |
{{=it.stats.pools[pool].workerCount}} Miners
117 |
{{=it.stats.pools[pool].hashrateString}}
118 |
119 | {{ } }}
120 |
121 |
122 |
123 |
124 |
125 |
126 |
--------------------------------------------------------------------------------
/libs/shareProcessor.js:
--------------------------------------------------------------------------------
1 | var redis = require('redis');
2 | var Stratum = require('stratum-pool');
3 | var CreateRedisClient = require('./createRedisClient.js');
4 |
5 |
6 |
7 | /*
8 | This module deals with handling shares when in internal payment processing mode. It connects to a redis
9 | database and inserts shares with the database structure of:
10 |
11 | key: coin_name + ':' + block_height
12 | value: a hash with..
13 | key:
14 |
15 | */
16 |
17 |
18 |
19 | module.exports = function(logger, poolConfig){
20 |
21 | var redisConfig = poolConfig.redis;
22 | var coin = poolConfig.coin.name;
23 |
24 |
25 | var forkId = process.env.forkId;
26 | var logSystem = 'Pool';
27 | var logComponent = coin;
28 | var logSubCat = 'Thread ' + (parseInt(forkId) + 1);
29 |
30 | var connection = CreateRedisClient(redisConfig);
31 | if (redisConfig.password) {
32 | connection.auth(redisConfig.password);
33 | }
34 | connection.on('ready', function(){
35 | logger.debug(logSystem, logComponent, logSubCat, 'Share processing setup with redis (' + connection.snompEndpoint + ')');
36 | });
37 | connection.on('error', function(err){
38 | logger.error(logSystem, logComponent, logSubCat, 'Redis client had an error: ' + JSON.stringify(err))
39 | });
40 | connection.on('end', function(){
41 | logger.error(logSystem, logComponent, logSubCat, 'Connection to redis database has been ended');
42 | });
43 | connection.info(function(error, response){
44 | if (error){
45 | logger.error(logSystem, logComponent, logSubCat, 'Redis version check failed');
46 | return;
47 | }
48 | var parts = response.split('\r\n');
49 | var version;
50 | var versionString;
51 | for (var i = 0; i < parts.length; i++){
52 | if (parts[i].indexOf(':') !== -1){
53 | var valParts = parts[i].split(':');
54 | if (valParts[0] === 'redis_version'){
55 | versionString = valParts[1];
56 | version = parseFloat(versionString);
57 | break;
58 | }
59 | }
60 | }
61 | if (!version){
62 | logger.error(logSystem, logComponent, logSubCat, 'Could not detect redis version - but be super old or broken');
63 | }
64 | else if (version < 2.6){
65 | logger.error(logSystem, logComponent, logSubCat, "You're using redis version " + versionString + " the minimum required version is 2.6. Follow the damn usage instructions...");
66 | }
67 | });
68 |
69 | this.handleShare = function(isValidShare, isValidBlock, shareData) {
70 |
71 | var redisCommands = [];
72 |
73 | if (isValidShare) {
74 | redisCommands.push(['hincrbyfloat', coin + ':shares:roundCurrent', shareData.worker, shareData.difficulty]);
75 | redisCommands.push(['hincrby', coin + ':stats', 'validShares', 1]);
76 | } else {
77 | redisCommands.push(['hincrby', coin + ':stats', 'invalidShares', 1]);
78 | }
79 |
80 | /* Stores share diff, worker, and unique value with a score that is the timestamp. Unique value ensures it
81 | doesn't overwrite an existing entry, and timestamp as score lets us query shares from last X minutes to
82 | generate hashrate for each worker and pool. */
83 | var dateNow = Date.now();
84 | var hashrateData = [ isValidShare ? shareData.difficulty : -shareData.difficulty, shareData.worker, dateNow];
85 | redisCommands.push(['zadd', coin + ':hashrate', dateNow / 1000 | 0, hashrateData.join(':')]);
86 |
87 | if (isValidBlock){
88 | redisCommands.push(['rename', coin + ':shares:roundCurrent', coin + ':shares:round' + shareData.height]);
89 | redisCommands.push(['rename', coin + ':shares:timesCurrent', coin + ':shares:times' + shareData.height]);
90 | redisCommands.push(['sadd', coin + ':blocksPending', [shareData.blockHash, shareData.txHash, shareData.height, shareData.worker, dateNow].join(':')]);
91 | redisCommands.push(['hincrby', coin + ':stats', 'validBlocks', 1]);
92 | }
93 | else if (shareData.blockHash){
94 | redisCommands.push(['hincrby', coin + ':stats', 'invalidBlocks', 1]);
95 | }
96 |
97 | connection.multi(redisCommands).exec(function(err, replies){
98 | if (err)
99 | logger.error(logSystem, logComponent, logSubCat, 'Error with share processor multi ' + JSON.stringify(err));
100 | });
101 | };
102 |
103 | };
104 |
--------------------------------------------------------------------------------
/website/static/stats.js:
--------------------------------------------------------------------------------
1 | var poolHashrateData;
2 | var poolHashrateChart;
3 |
4 | var statData;
5 | var poolKeys;
6 |
7 | function buildChartData(){
8 | var pools = {};
9 |
10 | poolKeys = [];
11 | for (var i = 0; i < statData.length; i++){
12 | for (var pool in statData[i].pools){
13 | if (poolKeys.indexOf(pool) === -1)
14 | poolKeys.push(pool);
15 | }
16 | }
17 |
18 | for (var i = 0; i < statData.length; i++) {
19 | var time = statData[i].time * 1000;
20 | for (var f = 0; f < poolKeys.length; f++){
21 | var pName = poolKeys[f];
22 | var a = pools[pName] = (pools[pName] || {
23 | hashrate: []
24 | });
25 | if (pName in statData[i].pools){
26 | a.hashrate.push([time, statData[i].pools[pName].hashrate]);
27 | }
28 | else{
29 | a.hashrate.push([time, 0]);
30 | }
31 | }
32 | }
33 |
34 | poolHashrateData = [];
35 | for (var pool in pools){
36 | poolHashrateData.push({
37 | key: pool,
38 | values: pools[pool].hashrate
39 | });
40 | $('#statsHashrateAvg' + pool).text(getReadableHashRateString(calculateAverageHashrate(pool)));
41 | }
42 | }
43 |
44 | function calculateAverageHashrate(pool) {
45 | var count = 0;
46 | var total = 1;
47 | var avg = 0;
48 | for (var i = 0; i < poolHashrateData.length; i++) {
49 | count = 0;
50 | for (var ii = 0; ii < poolHashrateData[i].values.length; ii++) {
51 | if (pool == null || poolHashrateData[i].key === pool) {
52 | count++;
53 | avg += parseFloat(poolHashrateData[i].values[ii][1]);
54 | }
55 | }
56 | if (count > total)
57 | total = count;
58 | }
59 | avg = avg / total;
60 | return avg;
61 | }
62 |
63 | function getReadableHashRateString(hashrate){
64 | hashrate = (hashrate * 2);
65 | if (hashrate < 1000000) {
66 | return (Math.round(hashrate / 1000) / 1000 ).toFixed(2)+' Sol/s';
67 | }
68 | var byteUnits = [ ' Sol/s', ' KSol/s', ' MSol/s', ' GSol/s', ' TSol/s', ' PSol/s' ];
69 | var i = Math.floor((Math.log(hashrate/1000) / Math.log(1000)) - 1);
70 | hashrate = (hashrate/1000) / Math.pow(1000, i + 1);
71 | return hashrate.toFixed(2) + byteUnits[i];
72 | }
73 |
74 | function timeOfDayFormat(timestamp){
75 | var dStr = d3.time.format('%I:%M %p')(new Date(timestamp));
76 | if (dStr.indexOf('0') === 0) dStr = dStr.slice(1);
77 | return dStr;
78 | }
79 |
80 | function displayCharts(){
81 | nv.addGraph(function() {
82 | poolHashrateChart = nv.models.lineChart()
83 | .margin({left: 80, right: 30})
84 | .x(function(d){ return d[0] })
85 | .y(function(d){ return d[1] })
86 | .useInteractiveGuideline(true);
87 |
88 | poolHashrateChart.xAxis.tickFormat(timeOfDayFormat);
89 |
90 | poolHashrateChart.yAxis.tickFormat(function(d){
91 | return getReadableHashRateString(d);
92 | });
93 |
94 | d3.select('#poolHashrate').datum(poolHashrateData).call(poolHashrateChart);
95 |
96 | return poolHashrateChart;
97 | });
98 | }
99 |
100 | function triggerChartUpdates(){
101 | poolHashrateChart.update();
102 | }
103 |
104 | nv.utils.windowResize(triggerChartUpdates);
105 |
106 | $.getJSON('/api/pool_stats', function(data){
107 | statData = data;
108 | buildChartData();
109 | displayCharts();
110 | });
111 |
112 | statsSource.addEventListener('message', function(e){
113 | var stats = JSON.parse(e.data);
114 | statData.push(stats);
115 |
116 | var newPoolAdded = (function(){
117 | for (var p in stats.pools){
118 | if (poolKeys.indexOf(p) === -1)
119 | return true;
120 | }
121 | return false;
122 | })();
123 |
124 | if (newPoolAdded || Object.keys(stats.pools).length > poolKeys.length){
125 | buildChartData();
126 | displayCharts();
127 | }
128 | else {
129 | var time = stats.time * 1000;
130 | for (var f = 0; f < poolKeys.length; f++) {
131 | var pool = poolKeys[f];
132 | for (var i = 0; i < poolHashrateData.length; i++) {
133 | if (poolHashrateData[i].key === pool) {
134 | poolHashrateData[i].values.shift();
135 | poolHashrateData[i].values.push([time, pool in stats.pools ? stats.pools[pool].hashrate : 0]);
136 | $('#statsHashrateAvg' + pool).text(getReadableHashRateString(calculateAverageHashrate(pool)));
137 | break;
138 | }
139 | }
140 | }
141 | triggerChartUpdates();
142 | }
143 | });
144 |
--------------------------------------------------------------------------------
/coins/zen.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "horizen",
3 | "symbol": "zen",
4 | "algorithm": "equihash",
5 | "requireShielding": true,
6 | "payFoundersReward": true,
7 | "percentFoundersReward": 8.5,
8 | "maxFoundersRewardBlockHeight": 839999,
9 | "foundersRewardAddressChangeInterval": 17500,
10 | "vFoundersRewardAddress": [
11 | "zssEdGnZCQ9G86LZFtbynMn1hYTVhn6eYCL",
12 | "zsrCsXXmUf8k59NLasEKfxA7us3iNvaPATz",
13 | "zsnLPsWMXW2s4w9EmFSwtSLRxL2LhPcfdby",
14 | "zshdovbcPfUAfkPeEE2qLbKnoue9RsbVokU",
15 | "zsqmq97JAKCCBFRGvxgv6FiJgQLCZBDp62S",
16 | "zskyFVFA7VRYX8EGdXmYN75WaBB25FmiL3g",
17 | "zsmncLmwEUdVmAGPUrUnNKmPGXyej7mbmdM",
18 | "zsfa9VVJCEdjfPbku4XrFcRR8kTDm2T64rz",
19 | "zsjdMnfWuFi46VeN2HSXVQWEGsnGHgVxayY",
20 | "zseb8wRQ8rZ722oLX5B8rx7qwZiBRb9mdig",
21 | "zsjxkovhqiMVggoW7jvSRi3NTSD3a6b6qfd",
22 | "zsokCCSU3wvZrS2G6mEDpJ5cH49E7sDyNr1",
23 | "zt12EsFgkABHLMRXA7JNnpMqLrxsgCLnVEV",
24 | "zt39mvuG9gDTHX8A8Qk45rbk3dSdQoJ8ZAv",
25 | "zssTQZs5YxDGijKC86dvcDxzWogWcK7n5AK",
26 | "zsywuMoQK7Bved2nrXs56AEtWBhpb88rMzS",
27 | "zsxVS2w7h1fHFX2nQtGm4372pd4DSHzq9ee",
28 | "zsupGi7ro3uC8CEVwm9r7vrdVUZaXQnHF6T",
29 | "zshVZvW47dA5AB3Sqk1h7ytwWJeUJUJxxaE",
30 | "zsubBCjvDx252MKFsL4Dcf5rJU9Z9Upqr1N",
31 | "zsweaST3NcU4hfgkVULfCsfEq41pjgMDgcW",
32 | "zswz6Rxb1S33fUpftETZwtGiVSeYxNKq2xc",
33 | "zswnpHtiBbrvYDzbhPQshkgvLSfYhDMRJ4S",
34 | "zsjSYAWaEYj35Ht7aXrRJUGY6Dc8qCmgYqu",
35 | "zsvMv8fGroWR8epbSiGDCJHmfe6ec2uFQrt",
36 | "zsujxCT56BExQDAwKwktBjtnopYnw8BiKbg",
37 | "zsxeXc2FTAzmUmeZmqVsKVdwTMSvzyns4rT",
38 | "zsuLqgABNudD8bVPbVGeUjGqapuoXp68i7F",
39 | "zsoc39J1dCFK1U8kckZznvQkv8As7sajYLz",
40 | "zt21NFdu1KRPJ7VRKtrWugM2Jqe5ePNmU4T",
41 | "zsp15qbVcbx9ifcjKe6XZEJTvzsFUZ2BHLT",
42 | "zso2KvqH6yxLQEYggHdmfL3Tcd5V6E9tqhp",
43 | "zsnFG2W5ZHRYh3QucNze4mp31tBkemtfxdj",
44 | "zsex2CGJtxHyHbpLXm7kESBmp3vWRqUkJMy",
45 | "zsvtFv96nrgrXKUbtNe2BpCt8aQEp5oJ7F8",
46 | "zsk5KitThmhK9KBa1KDybPgEmGSFTHzhMVA",
47 | "zsuy4n48c4NsJyaCZEzwdAKULM1FqbB6Y4z",
48 | "zsgtQVMpX2zNMLvHHG2NDwfqKoaebvVectJ",
49 | "zszQqXRSPGdqsWw4iaMTNN6aJz4JjEzSdCF",
50 | "zst6dBLrTtaMQBX7BLMNjKLTGcP11PBmgTV",
51 | "zshD9r6Eb6dZGdzYW2HCb9CzkMokCT1NGJR",
52 | "zswUaj1TboEGmvSfF7fdoxWyH3RMx7MBHHo",
53 | "zsv8s4Poi5GxCsbBrRJ97Vsvazp84nrz5AN",
54 | "zsmmxrKU6dqWFwUKow1iyovg3gxrgXpEivr",
55 | "zskh1221aRC9WEfb5a59WxffeW34McmZZsw",
56 | "zssAhuj57NnVm4yNFT6o8muRctABkUaBu3L",
57 | "zsi5Yr4Z8HwBvdBqQE8gk7ahExDu95J4oqZ",
58 | "zsy6ryEaxfk8emJ8bGVB7tmwRwBL8cfSqBW"
59 | ],
60 | "percentTreasuryReward": 12.0,
61 | "treasuryRewardStartBlockHeight": 139200,
62 | "treasuryRewardAddressChangeInterval": 50000,
63 | "vTreasuryRewardAddress": [
64 | "zsyF68hcYYNLPj5i4PfQJ1kUY6nsFnZkc82",
65 | "zsfULrmbX7xbhqhAFRffVqCw9RyGv2hqNNG",
66 | "zsoemTfqjicem2QVU8cgBHquKb1o9JR5p4Z",
67 | "zt339oiGL6tTgc9Q71f5g1sFTZf6QiXrRUr"
68 | ],
69 | "percentTreasuryUpdateReward": 10.0,
70 | "treasuryRewardUpdateStartBlockHeight": 344700,
71 | "treasuryRewardUpdateAddressChangeInterval": 50000,
72 | "vTreasuryRewardUpdateAddress": [
73 | "zszpcLB6C5B8QvfDbF2dYWXsrpac5DL9WRk",
74 | "zszpcLB6C5B8QvfDbF2dYWXsrpac5DL9WRk",
75 | "zszpcLB6C5B8QvfDbF2dYWXsrpac5DL9WRk",
76 | "zszpcLB6C5B8QvfDbF2dYWXsrpac5DL9WRk"
77 | ],
78 | "percentSecureNodesReward": 10.0,
79 | "vSecureNodesRewardAddress": [
80 | "zsxWnyDbU8pk2Vp98Uvkx5Nh33RFzqnCpWN",
81 | "zsxWnyDbU8pk2Vp98Uvkx5Nh33RFzqnCpWN",
82 | "zsxWnyDbU8pk2Vp98Uvkx5Nh33RFzqnCpWN",
83 | "zsxWnyDbU8pk2Vp98Uvkx5Nh33RFzqnCpWN"
84 | ],
85 | "percentSuperNodesReward": 10.0,
86 | "vSuperNodesRewardAddress": [
87 | "zsnL6pKdzvZ1BPVzALUoqw2KsY966XFs5CE",
88 | "zsnL6pKdzvZ1BPVzALUoqw2KsY966XFs5CE",
89 | "zsnL6pKdzvZ1BPVzALUoqw2KsY966XFs5CE",
90 | "zsnL6pKdzvZ1BPVzALUoqw2KsY966XFs5CE"
91 | ],
92 | "percentTreasury20pctUpdateReward": 20.0,
93 | "treasuryReward20pctUpdateStartBlockHeight": 455555,
94 | "peerMagic": "63617368",
95 | "txfee": 0.0004,
96 |
97 | "explorer": {
98 | "txURL": "https://explorer.horizen.global/tx/",
99 | "blockURL": "https://explorer.horizen.global/block/",
100 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
101 | }
102 | }
103 |
--------------------------------------------------------------------------------
/libs/mposCompatibility.js:
--------------------------------------------------------------------------------
1 | var mysql = require('mysql');
2 | var cluster = require('cluster');
3 | module.exports = function(logger, poolConfig){
4 |
5 | var mposConfig = poolConfig.mposMode;
6 | var coin = poolConfig.coin.name;
7 |
8 | var connection = mysql.createPool({
9 | host: mposConfig.host,
10 | port: mposConfig.port,
11 | user: mposConfig.user,
12 | password: mposConfig.password,
13 | database: mposConfig.database
14 | });
15 |
16 |
17 | var logIdentify = 'MySQL';
18 | var logComponent = coin;
19 |
20 |
21 |
22 | this.handleAuth = function(workerName, password, authCallback){
23 |
24 | if (poolConfig.validateWorkerUsername !== true && mposConfig.autoCreateWorker !== true){
25 | authCallback(true);
26 | return;
27 | }
28 |
29 | connection.query(
30 | 'SELECT password FROM pool_worker WHERE username = LOWER(?)',
31 | [workerName.toLowerCase()],
32 | function(err, result){
33 | if (err){
34 | logger.error(logIdentify, logComponent, 'Database error when authenticating worker: ' +
35 | JSON.stringify(err));
36 | authCallback(false);
37 | }
38 | else if (!result[0]){
39 | if(mposConfig.autoCreateWorker){
40 | var account = workerName.split('.')[0];
41 | connection.query(
42 | 'SELECT id,username FROM accounts WHERE username = LOWER(?)',
43 | [account.toLowerCase()],
44 | function(err, result){
45 | if (err){
46 | logger.error(logIdentify, logComponent, 'Database error when authenticating account: ' +
47 | JSON.stringify(err));
48 | authCallback(false);
49 | }else if(!result[0]){
50 | authCallback(false);
51 | }else{
52 | connection.query(
53 | "INSERT INTO `pool_worker` (`account_id`, `username`, `password`) VALUES (?, ?, ?);",
54 | [result[0].id,workerName.toLowerCase(),password],
55 | function(err, result){
56 | if (err){
57 | logger.error(logIdentify, logComponent, 'Database error when insert worker: ' +
58 | JSON.stringify(err));
59 | authCallback(false);
60 | }else {
61 | authCallback(true);
62 | }
63 | })
64 | }
65 | }
66 | );
67 | }
68 | else{
69 | authCallback(false);
70 | }
71 | }
72 | else if (mposConfig.checkPassword && result[0].password !== password)
73 | authCallback(false);
74 | else
75 | authCallback(true);
76 | }
77 | );
78 |
79 | };
80 |
81 | this.handleShare = function(isValidShare, isValidBlock, shareData){
82 |
83 | var dbData = [
84 | shareData.ip,
85 | shareData.worker,
86 | isValidShare ? 'Y' : 'N',
87 | isValidBlock ? 'Y' : 'N',
88 | shareData.difficulty * (poolConfig.coin.mposDiffMultiplier || 1),
89 | typeof(shareData.error) === 'undefined' ? null : shareData.error,
90 | shareData.blockHash ? shareData.blockHash : (shareData.blockHashInvalid ? shareData.blockHashInvalid : '')
91 | ];
92 | connection.query(
93 | 'INSERT INTO `shares` SET time = NOW(), rem_host = ?, username = ?, our_result = ?, upstream_result = ?, difficulty = ?, reason = ?, solution = ?',
94 | dbData,
95 | function(err, result) {
96 | if (err)
97 | logger.error(logIdentify, logComponent, 'Insert error when adding share: ' + JSON.stringify(err));
98 | else
99 | logger.debug(logIdentify, logComponent, 'Share inserted');
100 | }
101 | );
102 | };
103 |
104 | this.handleDifficultyUpdate = function(workerName, diff){
105 |
106 | connection.query(
107 | 'UPDATE `pool_worker` SET `difficulty` = ' + diff + ' WHERE `username` = ' + connection.escape(workerName),
108 | function(err, result){
109 | if (err)
110 | logger.error(logIdentify, logComponent, 'Error when updating worker diff: ' +
111 | JSON.stringify(err));
112 | else if (result.affectedRows === 0){
113 | connection.query('INSERT INTO `pool_worker` SET ?', {username: workerName, difficulty: diff});
114 | }
115 | else
116 | console.log('Updated difficulty successfully', result);
117 | }
118 | );
119 | };
120 |
121 |
122 | };
123 |
--------------------------------------------------------------------------------
/coins/btcz.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "bitcoinz",
3 | "symbol": "btcz",
4 | "algorithm": "equihash",
5 | "parameters": {
6 | "N": 144,
7 | "K": 5,
8 | "personalization": "BitcoinZ"
9 | },
10 | "requireShielding": true,
11 | "payFoundersReward": true,
12 | "percentFoundersReward": 5,
13 | "foundersRewardAddressChangeInterval": 14000,
14 | "maxFoundersRewardBlockHeight": 1400000,
15 | "vFoundersRewardAddress": [
16 | "t3eC2B44yVkyj7Q7RMkfBhkDisc4ieYtv5d",
17 | "t3cwTuGvHTkQc5ym8K39HkQRqgUeovcVXTy",
18 | "t3TxoqRtAytbfkBP7FrUPbSsLVLJAYXzLT7",
19 | "t3dghVnkqR8fqKhBipV2ggb4hoHnuWsHA6J",
20 | "t3LdFm55TvejDv823296TCMaxP1bDDSKQCQ",
21 | "t3UfK69A7EJCxpDoGFon3LJ5snLP3n1vDKC",
22 | "t3beERSviug8ardPTZnA2kPSmTQcaJNfL8y",
23 | "t3QRFq83FBJBJMg6HDgazjUWeStnsT9222x",
24 | "t3eJppdTuMLyYAKFXR1PEz1caonFW2RmJBB",
25 | "t3fWX6Tb6oxozvXwikCUV3s6E5uRHom7tEx",
26 | "t3ZKRdZPBFk3YNPR6ZfDWj82giBqkUqF2hX",
27 | "t3MkQ4ccb4q1Mz7Jzi8XKuQSxuae7PZzTLh",
28 | "t3ZyAJzpM8FKiQZZnqzGRB6LyQUYMQyvHMc",
29 | "t3Ur38PYZer2qHh9S9s5jiqkf7oe5bbtDVg",
30 | "t3f34ZKtaLZKMeRrPkjMVoGyZRBQGLxXL3t",
31 | "t3JpszYL1aLDVdhzVGPwSR3DZLGLKrxRLsU",
32 | "t3XSxsjYsRQG3SqyhURzthbK8KeTAAJdAMc",
33 | "t3euzVctNvQbqeEpn2xNR82PtgYwQ6qYRjf",
34 | "t3RG4E22bZfxKc5898VLbaXNHf6ThSJRFib",
35 | "t3SgMvNMhc8KhHFWN6YYG4de52PnG98HbnY",
36 | "t3NPGwdKqnixFQKrm9gUi6EezaCmscw1FcQ",
37 | "t3RzJ8w7pm8N5TiXBwmRu2nhkKfcqrEGCTy",
38 | "t3ajEu7N81EDAneDBucYNtg6Nc8U1kh9krT",
39 | "t3fKRecuPaUCJqUa5YbFxN6swETy1wTVqrH",
40 | "t3cLpLDoAts2Q7s3NsgRBnA2tARDyU6jo32",
41 | "t3UPnVmdHZjk3ASSzTCihZyvMy9PXGyd6q7",
42 | "t3KLY8t3HEKx3eKbbMSzKToKBZgVAyCiFhs",
43 | "t3QsMwSJEkQCgo3sXej5UjQCL3jHmpBHJip",
44 | "t3ZLJ81cBfUnqJ4s4yG9Ki4TTCq7Bd9eVut",
45 | "t3UDeoqzJUg9Fr5zwsqGwqhYHKgr36L4RJc",
46 | "t3SQTn4JtTXu8GurZsCzQx5xxH8MqJQ7iii",
47 | "t3Rh7iw8Pw4SJZrRwTnoTBv8eV3GwSF2hy9",
48 | "t3N9p9vVZTpc8reeuAZ9zGx1zoBjH4SjanH",
49 | "t3gqTdfwB1TiwN2ZCRcf9uEyrZKyXL5ccza",
50 | "t3gnsKHic8ne96pjx8nrFSJ643whhzcoyeE",
51 | "t3gsHcGLN3r35yEB59iNhCJw2iHuQKMZRie",
52 | "t3XxfcJQiy18Ex6jjuUX5k48K94EkqDagQN",
53 | "t3ZDGsmra5Cqk3bTvXWfsV4vYXXXSNKB9AE",
54 | "t3Y1YmUwa5LWQ1rTpzePN7EaNJsjb3pqK7J",
55 | "t3UzzHe2jeZua46RWL9bGuqkKs5STcoqPBJ",
56 | "t3MUQ1wGzC1977gSGzcoys4wt8d4JCdcuLv",
57 | "t3TA5fhiZn5AUQwyvL8WMdvySdoeq9wXvCT",
58 | "t3QKJnR4mrsGN4FyrdCHwoGC5LsEiYzRxKi",
59 | "t3Zw9p7MymABQDCUAkGbJKbw36Q3yZziwoe",
60 | "t3e73KWV7uY6rr2WoB1s2MCkkPjRxwGeCpt",
61 | "t3No3teH29dUJDcvQjLMPMZGoWN7vxU21LN",
62 | "t3VqnNUwzfrNkyDQoV3eBhcxQAQD3AXFFEZ",
63 | "t3KwL1ai4HvNaCcvnSYMkow9ywrXpvfz6Rr",
64 | "t3c72hsWG8SSMmMEwgS4BhVLEbaxS3PuHY4",
65 | "t3e7m74PF6yzW3zF5zAFYPCK7uVriykHoLu",
66 | "t3SausNGUC2vU6WkAN63khGL8axYFNYCQDg",
67 | "t3YPPSp668pSCQRrACgzTPoLuVaRTFFoeus",
68 | "t3cESR3q2Hh6mJbyC6ZBu4Jz8Dp1t7mbHLY",
69 | "t3WdLNKb194Ta3JRHxiip5ov83bFdLEwT91",
70 | "t3RixV5JL3Dr8B3sLZNWKokTWtVgnVMZZqM",
71 | "t3QKuKTub5vSRmWY6ExZqnUB3q5xLU1Lhp4",
72 | "t3U2X6AvUMWGWqFc1JxzsmeqDQq7G4Bcw3P",
73 | "t3Muezje93XcbjcWXKAeiPkACvADqZ4sed5",
74 | "t3S2fQysABXFxQJHGiE5tonFGRsuJkCYeRh",
75 | "t3PjeLxNmvbeSra4fURNKJazJDFwYdwSoA4",
76 | "t3VRFH5L43EbfTdnPwXRPvv3enRiAuvCJyG",
77 | "t3Tf22bky4tgR1wWKXKaKrtvZuLnuuh1dqM",
78 | "t3NKkGpiaUAX424KcPmX5UQ5xDx5scmKszz",
79 | "t3RFL3GARoko4vcPz1kvMpTBBrCUdwUiTM6",
80 | "t3eWEXExkTwNS4rFAMPKVA4CGVYQcJgbmdR",
81 | "t3VgtNUJLg1XDva3uMzVs8ZWsfmcneCwBoL",
82 | "t3Szm7fpJGzHnjxp1oSLciWHvVBNH3JBRg2",
83 | "t3USbLxCgLD5PzyDEy3bukoMZikiURRSL3S",
84 | "t3dZSEiB5p6y5WRZtCvz9CXRxnJSGoF9xp7",
85 | "t3YUjNigA9iD9gcJijy2X7qLvodMQaPwXYv",
86 | "t3MMfDtoysWMuhSa9wNTyjCvT3PtZ12UbeH",
87 | "t3KkanhBkRgJWTPckBHJazjasfnNi9DDCKe",
88 | "t3V3xqLmyjcSi1s6cJshCqP1Cf27x9DE2AB",
89 | "t3LgvwqUzsBGe9cPLqz2E2SXMxfPqSj6vh8",
90 | "t3VWw4ZRHHYZPgFMkEjBxdVCrUjJQtEHqah",
91 | "t3VWzRA9uP7c9zNiuBeB1V45c41ntDYdUQ6",
92 | "t3UHQzHwBXtb2SL823eVBVVeJiLhS1iL6Jm",
93 | "t3LhjLqqKKs4yvq1umm9MxpXj7FYuuiiYtm",
94 | "t3bnF3z7Z2DXc4p2tm5v5wtPQZQh7KFKjAK",
95 | "t3aLaR9GNpCoFF1HAKUCGzaR1wEEEK8G4vF",
96 | "t3YvmLwEBtYxLbRNQcMcqmHuSF7MAgRo1Dg",
97 | "t3ZCuv9FAYFzJBHVXWiGRmdXmE75WfPvi1J",
98 | "t3gn9cFxcnhuLpbBRX83Vt85EsWWh7t53co",
99 | "t3UdNuyX5u1ZSp38rsxyWtSYwHkrSd5xcut",
100 | "t3cotrT3GSzEqyKreNJmmS6kdzpCg6DafWW",
101 | "t3KBUuKs9LbfaNZRXWVAYcKynXiYR3Ega93",
102 | "t3duamHU9FHanjbhr2C5PUSUctRP2bujdut",
103 | "t3KxdJqVTTTVBcjCfcvbHipb4uLRM8WYo8H",
104 | "t3RzdWNacywKryT31xRvSpv79Viag87cCYG",
105 | "t3XdEptUkTXQLkiigBzCzzEsNSqHbgo37WT",
106 | "t3gqDqSuEWbYHxNcsagn44jRySjMHC2z5T2",
107 | "t3XCxm4jLmqwc4wLBrPhRkoHvp3nCJCqioX",
108 | "t3b1e9rURGhwAbpKfs9wHJD5qVxZsf44ZTR",
109 | "t3KP9rhDrCH8V8LzGRx9up281rsPg4tdv1Y",
110 | "t3XXxYXXnx2PiZSGbzmr9rmEXDvY9yYBvTb",
111 | "t3LHTCBkpq3b22wjuHT1usGsGSBJ3CdJhSJ",
112 | "t3PycyM8zzm9zptQ14QV7TT45uGsf3dsEPP",
113 | "t3fUhKH2G5TYbmuZrkq4a6GJon51D6Qiyss",
114 | "t3gGLesWeA25QKbb1QFNMw6NN33T6hcQAAE",
115 | "t3bi7pnM4mQ6RbQZwufGDt9m2uNnxHNBk37"
116 | ],
117 |
118 | "txfee": 0.0001,
119 | "sapling": true,
120 | "peerMagic": "24e92764",
121 | "explorer": {
122 | "txURL": "https://explorer.btcz.rocks/tx/",
123 | "blockURL": "https://explorer.btcz.rocks/block/",
124 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
125 | }
126 | }
127 |
--------------------------------------------------------------------------------
/libs/api.js:
--------------------------------------------------------------------------------
1 | var redis = require('redis');
2 | var async = require('async');
3 |
4 | var stats = require('./stats.js');
5 |
6 | module.exports = function(logger, portalConfig, poolConfigs){
7 |
8 | var _this = this;
9 |
10 | var portalStats = this.stats = new stats(logger, portalConfig, poolConfigs);
11 |
12 | this.liveStatConnections = {};
13 |
14 | this.handleApiRequest = function(req, res, next){
15 |
16 | switch(req.params.method){
17 | case 'stats':
18 | res.header('Content-Type', 'application/json');
19 | res.end(portalStats.statsString);
20 | return;
21 | case 'pool_stats':
22 | res.header('Content-Type', 'application/json');
23 | res.end(JSON.stringify(portalStats.statPoolHistory));
24 | return;
25 | case 'blocks':
26 | case 'getblocksstats':
27 | portalStats.getBlocks(function(data){
28 | res.header('Content-Type', 'application/json');
29 | res.end(JSON.stringify(data));
30 | });
31 | break;
32 | case 'payments':
33 | var poolBlocks = [];
34 | for(var pool in portalStats.stats.pools) {
35 | poolBlocks.push({name: pool, pending: portalStats.stats.pools[pool].pending, payments: portalStats.stats.pools[pool].payments});
36 | }
37 | res.header('Content-Type', 'application/json');
38 | res.end(JSON.stringify(poolBlocks));
39 | return;
40 | case 'worker_stats':
41 | res.header('Content-Type', 'application/json');
42 | if (req.url.indexOf("?")>0) {
43 | var url_parms = req.url.split("?");
44 | if (url_parms.length > 0) {
45 | var history = {};
46 | var workers = {};
47 | var address = url_parms[1] || null;
48 | //res.end(portalStats.getWorkerStats(address));
49 | if (address != null && address.length > 0) {
50 | // make sure it is just the miners address
51 | address = address.split(".")[0];
52 | // get miners balance along with worker balances
53 | portalStats.getBalanceByAddress(address, function(balances) {
54 | // get current round share total
55 | portalStats.getTotalSharesByAddress(address, function(shares) {
56 | var totalHash = parseFloat(0.0);
57 | var totalShares = shares;
58 | var networkSols = 0;
59 | for (var h in portalStats.statHistory) {
60 | for(var pool in portalStats.statHistory[h].pools) {
61 | for(var w in portalStats.statHistory[h].pools[pool].workers){
62 | if (w.startsWith(address)) {
63 | if (history[w] == null) {
64 | history[w] = [];
65 | }
66 | if (portalStats.statHistory[h].pools[pool].workers[w].hashrate) {
67 | history[w].push({time: portalStats.statHistory[h].time, hashrate:portalStats.statHistory[h].pools[pool].workers[w].hashrate});
68 | }
69 | }
70 | }
71 | // order check...
72 | //console.log(portalStats.statHistory[h].time);
73 | }
74 | }
75 | for(var pool in portalStats.stats.pools) {
76 | for(var w in portalStats.stats.pools[pool].workers){
77 | if (w.startsWith(address)) {
78 | workers[w] = portalStats.stats.pools[pool].workers[w];
79 | for (var b in balances.balances) {
80 | if (w == balances.balances[b].worker) {
81 | workers[w].paid = balances.balances[b].paid;
82 | workers[w].balance = balances.balances[b].balance;
83 | }
84 | }
85 | workers[w].balance = (workers[w].balance || 0);
86 | workers[w].paid = (workers[w].paid || 0);
87 | totalHash += portalStats.stats.pools[pool].workers[w].hashrate;
88 | networkSols = portalStats.stats.pools[pool].poolStats.networkSols;
89 | }
90 | }
91 | }
92 | res.end(JSON.stringify({miner: address, totalHash: totalHash, totalShares: totalShares, networkSols: networkSols, immature: balances.totalImmature, balance: balances.totalHeld, paid: balances.totalPaid, workers: workers, history: history}));
93 | });
94 | });
95 | } else {
96 | res.end(JSON.stringify({result: "error"}));
97 | }
98 | } else {
99 | res.end(JSON.stringify({result: "error"}));
100 | }
101 | } else {
102 | res.end(JSON.stringify({result: "error"}));
103 | }
104 | return;
105 | case 'live_stats':
106 | res.writeHead(200, {
107 | 'Content-Type': 'text/event-stream',
108 | 'Cache-Control': 'no-cache',
109 | 'Connection': 'keep-alive'
110 | });
111 | res.write('\n');
112 | var uid = Math.random().toString();
113 | _this.liveStatConnections[uid] = res;
114 | res.flush();
115 | req.on("close", function() {
116 | delete _this.liveStatConnections[uid];
117 | });
118 | return;
119 | default:
120 | next();
121 | }
122 | };
123 |
124 | this.handleAdminApiRequest = function(req, res, next){
125 | switch(req.params.method){
126 | case 'pools': {
127 | res.end(JSON.stringify({result: poolConfigs}));
128 | return;
129 | }
130 | default:
131 | next();
132 | }
133 | };
134 |
135 | };
136 |
--------------------------------------------------------------------------------
/coins/testnet/btcz.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "bitcoinz",
3 | "symbol": "btcz",
4 | "algorithm": "equihash",
5 | "parameters": {
6 | "N": 144,
7 | "K": 5,
8 | "personalization": "BitcoinZ"
9 | },
10 | "requireShielding": true,
11 | "payFoundersReward": true,
12 | "percentFoundersReward": 5,
13 | "foundersRewardAddressChangeInterval": 14000,
14 | "maxFoundersRewardBlockHeight": 849999,
15 | "vFoundersRewardAddress": [
16 | "t2FpKCWt95LAPVRed61YbBny9yz5nqexLGN",
17 | "t2RqJNenxiDjC5NiVo84xgfHcYuwsPcpCie",
18 | "t2MsHkAug2oEiqj4L5ZGZH1vHmdogTSb9km",
19 | "t2EwBFfC96DCiCAcJuEqGUbUes8rTNmaD6Q",
20 | "t2JqYXRoTsKb9r1rTLLwDs5jMXzsRBV317k",
21 | "t2RocidGU4ReKPK2uTPYfNFgeZEWDCd3jsj",
22 | "t2Mu8ToNiVow92PfETBk5Z6HWuAEG7RVXVD",
23 | "t2MSLT1n4eQ87QC2FAxMvuTZ84zDzEj7FhQ",
24 | "t2JZNFrWv1c4RqkCmDN9iRkPsG8xAZFdyGS",
25 | "t2AyjEVUCf5jthGHZjwfbztDBHQbztkJB5v",
26 | "t2Gs6dTYCzaFdHSeT91zaFLKmYzyqYY3NnP",
27 | "t2FXfNK7iQhTdMFcGUyrizqXQE5qbmPK6zc",
28 | "t2UqLwQ85pR1fdFMoUzXadXRB97JxP6vTWY",
29 | "t2BocGBq7iBXQP8UQiousNVwU8M6AqUtaRx",
30 | "t2VGGdXhspjF3iQvbWZW2zPNSDRSYauBcM3",
31 | "t2HTNHicoeEXxsX1wVhsqsX3LgzRq2pYgWH",
32 | "t2UiVSyM1vuvs6xP3157ytuYMKN6MuqmgJE",
33 | "t2UmPyNoWSVUgyPzEXzFGN5GS96jMH2kreW",
34 | "t2MQWZJHxZF5zSw6LbZ3S7jqoLX1y6SWLHQ",
35 | "t2VUR1c1aFaTUo93uhi7rfFVRRZaT1aQYbv",
36 | "t2NgLU6QCJhCKgBsR5uX6R4ds82jymzMoMJ",
37 | "t2RorFwMUEb7NamvXFi3jCXitAdRoQtU1Hs",
38 | "t2FFtmwePBnYaRVRVg1wsoBPxDzGMLrz3Jv",
39 | "t2GH3734fKEhPo3NvvAZQazsFf3V51oR4c2",
40 | "t2Ev3twAmUmono3gM2Q6RsfhRiryy7TnX5E",
41 | "t2EmhhAjh6cLpyw6Yc9QEXvsjm7qdKpgFQP",
42 | "t2Gy5N7DYbEZmiHqm3m8Re25a8Bxu7e36ju",
43 | "t2LVSaxizciFWfc5gr1xccHXT115RSnQ13r",
44 | "t28zy3Qiq3FtMeB2PCEysF7R5TgW5UfZN1N",
45 | "t2FcN7o26gRCc8ZuSZcc7X7APPRqWQ5a3W2",
46 | "t27QTHP9qoi5HkiTqx4JV86MGG37aikK51s",
47 | "t2CwQ6H9GPT77nqRwkHCuVcyGvtbhxWHfAk",
48 | "t2HLUDaoimaaSpQhHnvbqpKg6Fi37rAo6cx",
49 | "t2Ebuq1FX7Qzi3ur1FnwsDMvfNBFjqVqDGX",
50 | "t2Bca3HbSbwgQp1ZhzheNvGfpwBoU6Syt8G",
51 | "t2EurfAqyJMsCyx6ujYecQSxrPPY7xxTqcB",
52 | "t2R1kJGeNhLpKx1dKNCnBUq1BkxBVJjQdcp",
53 | "t2M3x9koBJWJS1F9bGtWXTsVfr5pesWSTbR",
54 | "t2La4mEMruVTtBqhndS7zRvmi2WsqWUjPQz",
55 | "t29GwTHLXxYgF5k7SSj7XFaHB7JsocM9bDU",
56 | "t2Awpdv7yG2QFeHeq17J1qCSXRw1AM3mfmz",
57 | "t2BfotpLdNhhewRp9nXpBBYViBaq4y1Lnj5",
58 | "t2F4CH89prySyGZHUiPYJUjnZk9UPXgLBbf",
59 | "t2DNx1KzP8a2S3kZgAPngso9ptva5gE7Jbn",
60 | "t2Eb7orwhjGcu4wYwHBzN5BoXzroPGq3CoM",
61 | "t2BXYmM21WCdHiC1KiwQVHxaTvLQJpqXTvH",
62 | "t27Y6774dwAcCFvYrhDKTXgaxtUewAdZdtz",
63 | "t2JvmRjZnViBZXJJBekDygdvGTCRNWgFEK2",
64 | "t2PL5W7qy1DKNRPWECbaZ6gV9GEzMn8h97Z",
65 | "t2S1JaefdSNwaUexdr6ZtNJhqZS8uDGSNFg",
66 | "t2BTunj4VB44Q22crWpT1ykoBvNGFKMnD7N",
67 | "t2G7DkSoEUJGaEBH6erKsXemoHFqqTRaSiZ",
68 | "t2Ldg8Bc6AWDuESqPgUoumWfCYw3zqKF8s9",
69 | "t2Ft4QMMiJfKXVbhyGBrkwjnfn5ua73VuLo",
70 | "t26xLxd4Fabbotkc9gfFwpCVHoZG1W9rmN7",
71 | "t2DyghJMpK6rRKPEAL3DBKmCntUcj8bUiHg",
72 | "t2RSYhCsgw2AdBiUUyXBCkFf2xE9ddwyESD",
73 | "t26fv5NLiFYXMmfQnvqcJXcYnt5NY41eqrv",
74 | "t2Ppht55eXKC1BX7pfusJxZqbHnkp9oWbBW",
75 | "t2P4AWJ5C4ySU3KzfehAeppH2BV4Y87w34z",
76 | "t28zjDUH2Gkvt8Ytb8UrW7L6G5U1QMwJFM3",
77 | "t2JXDd9pumryTAXqDD98vDLS2ZLSQCNQrYZ",
78 | "t2BNuNGnGq49MZzr7SH8WtEE7sSwZ9n3bsz",
79 | "t2QumKdHZhkFD6ntrzJ9zJAga2QemEgqc9r",
80 | "t2UKz2L7V3C6GTeBPDXmQnwMyqKEbgMpuXg",
81 | "t2CyVugoafiDYpeSNd9DGZEng6Bpr4tqa3d",
82 | "t2GR9eEen8KUDjhQG1opC1aFt27zxdtufnF",
83 | "t2JKYuSRNupdHdTR91tqR4xsaU6friVJJgv",
84 | "t2D2yMZEM3K8ap6iLo3FX2g1Ch9coPSVq2R",
85 | "t2SeFu34eiE2rCPFpxrN8im6ZvcwMpdKnit",
86 | "t2KH46EXQy5wnZHDGVDA7Q13FdRkdQ3LUou",
87 | "t2UsTpuVqP6ZubtN8tQGPnh7Cqjjf1hoefd",
88 | "t2Dd119xiqDbF9QzWwYfnYWUPfqgnL1CNFu",
89 | "t29PjecMhv6EygD8W6smcMHAB8MSHQY3YnQ",
90 | "t2BDZpxgcMRzqgKbDBiXRXrvL3VwD7G8cLc",
91 | "t2MwiKqfCMdy7o96bXvbZ5aGCrRmVfVWVfA",
92 | "t2Vhkny4jNjy6ZD53jeQzsdgZiZyejwRsgY",
93 | "t2K3ouBrLAbYwZv6beoHjzfsE1AbYVa6PuE",
94 | "t2DskMSpWs8i9vK2PhNpi9Mu2qJSvEDi8UZ",
95 | "t2JB2Uz3eVWrxFhas1B1cSXLP22JHbRNYtL",
96 | "t2ArYKW1L8hRoCDK9odNmD4piRwFheErWL1",
97 | "t2K1zKGHrkibiFoYJ5GtfHe5xJecJPEvFwQ",
98 | "t2VnABknMprtMk8y5AdDCBr2R9QZnMhfqSm",
99 | "t2FbjEsP9eeQr5PmP7yC3fopPTuYS9E9VgN",
100 | "t2Sn2XUPZEnFcggB77jvxBqX6LcjdCzcJUs",
101 | "t2SEK3Tw5FYYUaeZcF5QemfeG3tiorrxNKp",
102 | "t2D78THpHVodnhiREjF22A3KRznor5pPnR1",
103 | "t2GyqFdkf6FoQTShEhLGsNrTxAWqmeq4pui",
104 | "t2HnNgFLznEqaokYq8PBV44uzRwAmJXQeKd",
105 | "t2PpHVStdHvWkzXsyuyPYQQq96ZRQu7ALpE",
106 | "t2FHbHM9rKKHZe74HRBNozwNdRsExug8tCw",
107 | "t29tM6DkMPSVp9R3g7UjZjvsobKhsbsRqFL",
108 | "t2K2KixLVJo19phPJMv9ApSiFmxQCSQUvc9",
109 | "t2AWJcGVUMWFC8A9KC3PL7qoCb1vxSzxbJP",
110 | "t26p8FyjHmhqZ6duzhRFLCQcExh1TuCD1sC",
111 | "t27x5n41uRNF3tJkb3Lg1CMomUjTNZwtUfm",
112 | "t2VhRQJ9xeVkVVk7ic21CtDePKmHnrDyF8Z",
113 | "t27hL1iAsTHBPWrdc1qYGSSTc3pTyBqohd4",
114 | "t2RqLYWG8Eo4hopDsn1m8GUoAWtjZQEPE9s",
115 | "t2V1osVDkcwYFL4PF9qG8t9Ez1XRVMAkAb6"
116 | ],
117 |
118 | "txfee": 0.0001,
119 | "sapling": true,
120 | "peerMagicTestnet": "fa1af9bf",
121 | "explorer": {
122 | "txURL": "https://explorer.btcz.rocks/tx/",
123 | "blockURL": "https://explorer.btcz.rocks/block/",
124 | "_comment_explorer": "This is the coin's explorer full base url for transaction and blocks i.e. (https://explorer.coin.com/tx/). The pool will automatically add the transaction id or block id at the end."
125 | }
126 | }
127 |
--------------------------------------------------------------------------------
/libs/apiCryptsy.js:
--------------------------------------------------------------------------------
1 | var request = require('request');
2 | var nonce = require('nonce');
3 |
4 | module.exports = function() {
5 | 'use strict';
6 |
7 | // Module dependencies
8 |
9 | // Constants
10 | var version = '0.1.0',
11 | PUBLIC_API_URL = 'http://pubapi.cryptsy.com/api.php',
12 | PRIVATE_API_URL = 'https://api.cryptsy.com/api',
13 | USER_AGENT = 'nomp/node-open-mining-portal'
14 |
15 | // Constructor
16 | function Cryptsy(key, secret){
17 | // Generate headers signed by this user's key and secret.
18 | // The secret is encapsulated and never exposed
19 | this._getPrivateHeaders = function(parameters){
20 | var paramString, signature;
21 |
22 | if (!key || !secret){
23 | throw 'Cryptsy: Error. API key and secret required';
24 | }
25 |
26 | // Sort parameters alphabetically and convert to `arg1=foo&arg2=bar`
27 | paramString = Object.keys(parameters).sort().map(function(param){
28 | return encodeURIComponent(param) + '=' + encodeURIComponent(parameters[param]);
29 | }).join('&');
30 |
31 | signature = crypto.createHmac('sha512', secret).update(paramString).digest('hex');
32 |
33 | return {
34 | Key: key,
35 | Sign: signature
36 | };
37 | };
38 | }
39 |
40 | // If a site uses non-trusted SSL certificates, set this value to false
41 | Cryptsy.STRICT_SSL = true;
42 |
43 | // Helper methods
44 | function joinCurrencies(currencyA, currencyB){
45 | return currencyA + '_' + currencyB;
46 | }
47 |
48 | // Prototype
49 | Cryptsy.prototype = {
50 | constructor: Cryptsy,
51 |
52 | // Make an API request
53 | _request: function(options, callback){
54 | if (!('headers' in options)){
55 | options.headers = {};
56 | }
57 |
58 | options.headers['User-Agent'] = USER_AGENT;
59 | options.json = true;
60 | options.strictSSL = Cryptsy.STRICT_SSL;
61 |
62 | request(options, function(err, response, body) {
63 | callback(err, body);
64 | });
65 |
66 | return this;
67 | },
68 |
69 | // Make a public API request
70 | _public: function(parameters, callback){
71 | var options = {
72 | method: 'GET',
73 | url: PUBLIC_API_URL,
74 | qs: parameters
75 | };
76 |
77 | return this._request(options, callback);
78 | },
79 |
80 | // Make a private API request
81 | _private: function(parameters, callback){
82 | var options;
83 |
84 | parameters.nonce = nonce();
85 | options = {
86 | method: 'POST',
87 | url: PRIVATE_API_URL,
88 | form: parameters,
89 | headers: this._getPrivateHeaders(parameters)
90 | };
91 |
92 | return this._request(options, callback);
93 | },
94 |
95 |
96 | /////
97 |
98 |
99 | // PUBLIC METHODS
100 |
101 | getTicker: function(callback){
102 | var parameters = {
103 | method: 'marketdatav2'
104 | };
105 |
106 | return this._public(parameters, callback);
107 | },
108 |
109 | getOrderBook: function(currencyA, currencyB, callback){
110 | var parameters = {
111 | command: 'returnOrderBook',
112 | currencyPair: joinCurrencies(currencyA, currencyB)
113 | };
114 |
115 | return this._public(parameters, callback);
116 | },
117 |
118 | getTradeHistory: function(currencyA, currencyB, callback){
119 | var parameters = {
120 | command: 'returnTradeHistory',
121 | currencyPair: joinCurrencies(currencyA, currencyB)
122 | };
123 |
124 | return this._public(parameters, callback);
125 | },
126 |
127 |
128 | /////
129 |
130 |
131 | // PRIVATE METHODS
132 |
133 | myBalances: function(callback){
134 | var parameters = {
135 | command: 'returnBalances'
136 | };
137 |
138 | return this._private(parameters, callback);
139 | },
140 |
141 | myOpenOrders: function(currencyA, currencyB, callback){
142 | var parameters = {
143 | command: 'returnOpenOrders',
144 | currencyPair: joinCurrencies(currencyA, currencyB)
145 | };
146 |
147 | return this._private(parameters, callback);
148 | },
149 |
150 | myTradeHistory: function(currencyA, currencyB, callback){
151 | var parameters = {
152 | command: 'returnTradeHistory',
153 | currencyPair: joinCurrencies(currencyA, currencyB)
154 | };
155 |
156 | return this._private(parameters, callback);
157 | },
158 |
159 | buy: function(currencyA, currencyB, rate, amount, callback){
160 | var parameters = {
161 | command: 'buy',
162 | currencyPair: joinCurrencies(currencyA, currencyB),
163 | rate: rate,
164 | amount: amount
165 | };
166 |
167 | return this._private(parameters, callback);
168 | },
169 |
170 | sell: function(currencyA, currencyB, rate, amount, callback){
171 | var parameters = {
172 | command: 'sell',
173 | currencyPair: joinCurrencies(currencyA, currencyB),
174 | rate: rate,
175 | amount: amount
176 | };
177 |
178 | return this._private(parameters, callback);
179 | },
180 |
181 | cancelOrder: function(currencyA, currencyB, orderNumber, callback){
182 | var parameters = {
183 | command: 'cancelOrder',
184 | currencyPair: joinCurrencies(currencyA, currencyB),
185 | orderNumber: orderNumber
186 | };
187 |
188 | return this._private(parameters, callback);
189 | },
190 |
191 | withdraw: function(currency, amount, address, callback){
192 | var parameters = {
193 | command: 'withdraw',
194 | currency: currency,
195 | amount: amount,
196 | address: address
197 | };
198 |
199 | return this._private(parameters, callback);
200 | }
201 | };
202 |
203 | return Cryptsy;
204 | }();
205 |
--------------------------------------------------------------------------------
/libs/apiPoloniex.js:
--------------------------------------------------------------------------------
1 | var request = require('request');
2 | var nonce = require('nonce');
3 |
4 | module.exports = function() {
5 | 'use strict';
6 |
7 | // Module dependencies
8 |
9 | // Constants
10 | var version = '0.1.0',
11 | PUBLIC_API_URL = 'https://poloniex.com/public',
12 | PRIVATE_API_URL = 'https://poloniex.com/tradingApi',
13 | USER_AGENT = 'npm-crypto-apis/' + version
14 |
15 | // Constructor
16 | function Poloniex(key, secret){
17 | // Generate headers signed by this user's key and secret.
18 | // The secret is encapsulated and never exposed
19 | this._getPrivateHeaders = function(parameters){
20 | var paramString, signature;
21 |
22 | if (!key || !secret){
23 | throw 'Poloniex: Error. API key and secret required';
24 | }
25 |
26 | // Sort parameters alphabetically and convert to `arg1=foo&arg2=bar`
27 | paramString = Object.keys(parameters).sort().map(function(param){
28 | return encodeURIComponent(param) + '=' + encodeURIComponent(parameters[param]);
29 | }).join('&');
30 |
31 | signature = crypto.createHmac('sha512', secret).update(paramString).digest('hex');
32 |
33 | return {
34 | Key: key,
35 | Sign: signature
36 | };
37 | };
38 | }
39 |
40 | // If a site uses non-trusted SSL certificates, set this value to false
41 | Poloniex.STRICT_SSL = true;
42 |
43 | // Helper methods
44 | function joinCurrencies(currencyA, currencyB){
45 | return currencyA + '_' + currencyB;
46 | }
47 |
48 | // Prototype
49 | Poloniex.prototype = {
50 | constructor: Poloniex,
51 |
52 | // Make an API request
53 | _request: function(options, callback){
54 | if (!('headers' in options)){
55 | options.headers = {};
56 | }
57 |
58 | options.headers['User-Agent'] = USER_AGENT;
59 | options.json = true;
60 | options.strictSSL = Poloniex.STRICT_SSL;
61 |
62 | request(options, function(err, response, body) {
63 | callback(err, body);
64 | });
65 |
66 | return this;
67 | },
68 |
69 | // Make a public API request
70 | _public: function(parameters, callback){
71 | var options = {
72 | method: 'GET',
73 | url: PUBLIC_API_URL,
74 | qs: parameters
75 | };
76 |
77 | return this._request(options, callback);
78 | },
79 |
80 | // Make a private API request
81 | _private: function(parameters, callback){
82 | var options;
83 |
84 | parameters.nonce = nonce();
85 | options = {
86 | method: 'POST',
87 | url: PRIVATE_API_URL,
88 | form: parameters,
89 | headers: this._getPrivateHeaders(parameters)
90 | };
91 |
92 | return this._request(options, callback);
93 | },
94 |
95 |
96 | /////
97 |
98 |
99 | // PUBLIC METHODS
100 |
101 | getTicker: function(callback){
102 | var parameters = {
103 | command: 'returnTicker'
104 | };
105 |
106 | return this._public(parameters, callback);
107 | },
108 |
109 | get24hVolume: function(callback){
110 | var parameters = {
111 | command: 'return24hVolume'
112 | };
113 |
114 | return this._public(parameters, callback);
115 | },
116 |
117 | getOrderBook: function(currencyA, currencyB, callback){
118 | var parameters = {
119 | command: 'returnOrderBook',
120 | currencyPair: joinCurrencies(currencyA, currencyB)
121 | };
122 |
123 | return this._public(parameters, callback);
124 | },
125 |
126 | getTradeHistory: function(currencyA, currencyB, callback){
127 | var parameters = {
128 | command: 'returnTradeHistory',
129 | currencyPair: joinCurrencies(currencyA, currencyB)
130 | };
131 |
132 | return this._public(parameters, callback);
133 | },
134 |
135 |
136 | /////
137 |
138 |
139 | // PRIVATE METHODS
140 |
141 | myBalances: function(callback){
142 | var parameters = {
143 | command: 'returnBalances'
144 | };
145 |
146 | return this._private(parameters, callback);
147 | },
148 |
149 | myOpenOrders: function(currencyA, currencyB, callback){
150 | var parameters = {
151 | command: 'returnOpenOrders',
152 | currencyPair: joinCurrencies(currencyA, currencyB)
153 | };
154 |
155 | return this._private(parameters, callback);
156 | },
157 |
158 | myTradeHistory: function(currencyA, currencyB, callback){
159 | var parameters = {
160 | command: 'returnTradeHistory',
161 | currencyPair: joinCurrencies(currencyA, currencyB)
162 | };
163 |
164 | return this._private(parameters, callback);
165 | },
166 |
167 | buy: function(currencyA, currencyB, rate, amount, callback){
168 | var parameters = {
169 | command: 'buy',
170 | currencyPair: joinCurrencies(currencyA, currencyB),
171 | rate: rate,
172 | amount: amount
173 | };
174 |
175 | return this._private(parameters, callback);
176 | },
177 |
178 | sell: function(currencyA, currencyB, rate, amount, callback){
179 | var parameters = {
180 | command: 'sell',
181 | currencyPair: joinCurrencies(currencyA, currencyB),
182 | rate: rate,
183 | amount: amount
184 | };
185 |
186 | return this._private(parameters, callback);
187 | },
188 |
189 | cancelOrder: function(currencyA, currencyB, orderNumber, callback){
190 | var parameters = {
191 | command: 'cancelOrder',
192 | currencyPair: joinCurrencies(currencyA, currencyB),
193 | orderNumber: orderNumber
194 | };
195 |
196 | return this._private(parameters, callback);
197 | },
198 |
199 | withdraw: function(currency, amount, address, callback){
200 | var parameters = {
201 | command: 'withdraw',
202 | currency: currency,
203 | amount: amount,
204 | address: address
205 | };
206 |
207 | return this._private(parameters, callback);
208 | }
209 | };
210 |
211 | return Poloniex;
212 | }();
213 |
--------------------------------------------------------------------------------