├── 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 |
20 |
21 | Password 22 | 23 | 24 | 25 | 28 | 29 | 30 |
31 |
32 | 33 |
34 | 35 |
36 | Administration 37 | 41 |
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 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | {{ for(var pool in it.stats.pools) { }} 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | {{ } }} 64 |
PoolAlgoWorkersValid SharesInvalid SharesTotal BlocksPendingConfirmedOrphanedHashrate
{{=it.stats.pools[pool].name}}{{=it.stats.pools[pool].algorithm}}{{=Object.keys(it.stats.pools[pool].workers).length}}{{=it.stats.pools[pool].poolStats.validShares}}{{=it.stats.pools[pool].poolStats.invalidShares}}{{=it.stats.pools[pool].poolStats.validBlocks}}{{=it.stats.pools[pool].blocks.pending}}{{=it.stats.pools[pool].blocks.confirmed}}{{=it.stats.pools[pool].blocks.orphaned}}{{=it.stats.pools[pool].hashrateString}}
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 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | {{ for(var p in it.stats.pools[pool].payments) { }} 69 | 70 | 77 | 78 | 79 | 80 | 81 | 82 | {{ } }} 83 |
BlocksTimeMinersSharesAmount
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 | {{=readableDate(it.stats.pools[pool].payments[p].time)}}{{=it.stats.pools[pool].payments[p].miners}}{{=Math.round(it.stats.pools[pool].payments[p].shares)}}{{=it.stats.pools[pool].payments[p].paid}} {{=it.stats.pools[pool].symbol}}
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 | 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 | 76 | 77 | 78 | 79 | 80 | 81 | {{ for(var worker in it.stats.pools[pool].miners) { }} 82 | {{var workerstat = it.stats.pools[pool].miners[worker];}} 83 | 84 | 85 | 86 | 87 | 88 | 89 | {{ } }} 90 |
AddressSharesEfficiencyHashrate
{{=worker}}{{=Math.round(workerstat.currRoundShares * 100) / 100}}{{? workerstat.shares > 0}} {{=Math.floor(10000 * workerstat.shares / (workerstat.shares + workerstat.invalidshares)) / 100}}% {{??}} 0% {{?}}{{=workerstat.hashrateString}}
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 |
31 | 68 |
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 |
85 | Community  :  #zclassic IRC 86 |   |   87 | 88 |
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 '
  • ' + poolName + '
  • '; 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 |
    Global Stats
    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 |
    Pools / Coins
    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 | --------------------------------------------------------------------------------