cryptonote-universal-pool/website/index.html

829 lines
31 KiB
HTML

<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1">
<title>Cryptonote Mining Pool</title>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-timeago/1.4.0/jquery.timeago.min.js"></script>
<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
<link href="//netdna.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css" rel="stylesheet">
<link href='http://fonts.googleapis.com/css?family=Inconsolata' rel='stylesheet' type='text/css'>
<script src="config.js"></script>
<script src="additional.js"></script>
<link href="additional.css" rel="stylesheet">
<style>
#coinName{
text-transform: capitalize;
}
body {
padding-top: 90px;
padding-bottom: 70px;
}
.container{
font-size: 1.2em;
}
.page{
display: none;
}
.stats {
margin-bottom: 40px;
}
.stats:last-child{
width: auto;
}
.stats > h3 > i{
font-size: 0.80em;
width: 21px;
}
.stats > div{
padding: 5px 0;
}
.stats > div > .fa {
width: 25px;
}
.stats > div > span:first-of-type{
font-weight: bold;
}
.marketFooter{
font-size: 10px;
opacity: 0.6;
}
#networkLastReward{
text-transform: uppercase;
}
#donationPercent{
font-size: 0.8em;
margin-left: 5px;
}
#lastHash{
font-family: 'Inconsolata', monospace;
font-size: 0.8em;
}
#yourStatsInput{
z-index: inherit;
font-family: 'Inconsolata', monospace;
}
#yourAddressDisplay > span {
font-family: 'Inconsolata', monospace;
}
.yourStats{
display: none;
}
#yourAddressDisplay{
display: inline-block;
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
vertical-align: middle;
font-family: 'Inconsolata', monospace;
font-size: 0.9em;
}
#addressError{
color: red;
}
#stats_updated{
opacity: 0;
float: right;
margin-left: 30px;
color: #e8e8e8;
line-height: 47px;
font-size: 0.9em;
}
.blocksStatHolder > h4{
display: inline-block;
margin-right: 10px;
}
.blocksStatHolder > span{
display: inline-block;
border-radius: 5px;
padding: 1px 9px;
border: 1px solid #e5e5e5;
margin: 2px;
}
#blocks_rows > tr > td{
vertical-align: middle;
font-family: 'Inconsolata', monospace;
font-size: 0.95em;
}
.luckGood{
color: darkgreen;
}
.luckBad{
color: darkred;
}
#page_getting_started > .stats:first-of-type{
margin-bottom: 15px;
}
#page_getting_started .stats {
margin-bottom: 10px;
}
.getting_started_windows{
line-height: 40px;
}
#miningPorts > .stats{
width: auto !important;
margin-right: 70px;
margin-left: 15px;
display: inline-block;
}
#miningPorts > .stats:last-child{
margin-right: 0;
}
#getting_started_list > li{
margin-bottom: 20px;
}
#cpuminer_code{
display: inline-block;
white-space: normal;
}
footer{
position: fixed;
bottom: 0;
width: 100%;
background-color: #f5f5f5;
}
footer > div{
margin: 10px auto;
text-align: center;
}
</style>
</head>
<body>
<script>
$(function(){
$('#siteInfo').load('info.html');
$.get(api + '/stats', function(data){
renderStats(data);
updateMarkets();
});
function fetchLiveStats() {
$.ajax({
url: api + '/live_stats',
dataType: 'json',
cache: 'false'
}).done(function(data){
renderStats(data);
}).fail(function(){
console.log('live stats long polling connection failed');
}).always(function () {
fetchLiveStats();
});
}
fetchLiveStats();
window.onhashchange = function(){
pageRouter();
};
pageRouter();
$('#networkLastBlockFound,#poolLastBlockFound,#yourLastShare,#marketLastUpdated').timeago();
var $miningPorts = $('#miningPorts');
var miningPortTemplate = $miningPorts.html();
$miningPorts.empty();
var lookupBtnHtml = $('#lookUp').html();
var addressEventSource;
var addressTimeout;
$('#lookUp').click(function(){
var address = $('#yourStatsInput').val().trim();
if (!address){
$('#yourStatsInput').focus();
return;
}
$('#addressError').hide();
$('.yourStats').hide();
$(this).html('<i class="fa fa-refresh fa-spin"></i> Searching...');
if (addressEventSource) addressEventSource.abort();
if (addressTimeout) clearTimeout(addressTimeout);
function fetchAddressStats(longpoll){
addressEventSource = $.ajax({
url: api + '/stats_address',
data: {
address: address,
longpoll: longpoll
},
dataType: 'json',
cache: 'false',
success: function(data){
$('#lookUp').html(lookupBtnHtml);
if (!data.stats){
$('.yourStats').hide();
$('#addressError').text(data.error).show();
if (addressTimeout) clearTimeout(addressTimeout);
addressTimeout = setTimeout(function(){
fetchAddressStats(false);
}, 2000);
return;
}
$('#addressError').hide();
$('#yourAddressDisplay').text(address);
if (data.stats.lastShare)
$('#yourLastShare').timeago('update', new Date(parseInt(data.stats.lastShare) * 1000).toISOString());
else
$('#yourLastShare').text('Never');
$('#yourHashrateHolder').text((data.stats.hashrate || '0 H') + '/sec');
$('#yourHashes').text(data.stats.hashes || '0');
$('#yourPaid').text(getReadableCoins(data.stats.paid) + ' ' + data.stats.symbol);
$('#yourPendingBalance').text(getReadableCoins(data.stats.balance) + ' ' + data.stats.symbol);
$('.yourStats').show();
docCookies.setItem('mining_address', address, Infinity);
fetchAddressStats(true);
},
error: function(e){
if (e.statusText === 'abort') return;
$('#lookUp').html(lookupBtnHtml);
$('#addressError').text('Connection error').show();
if (addressTimeout) clearTimeout(addressTimeout);
addressTimeout = setTimeout(function(){
fetchAddressStats(false);
}, 2000);
}
});
}
fetchAddressStats(false);
});
var lastPortsJson = '';
var stats_update = $('#stats_updated')[0];
var cryptonatorMarkets;
function updateMarkets(){
var completedFetches = 0;
var marketsData = [];
for (var i = 0; i < cryptonatorMarkets.length; i++){
(function(i){
$.get('https://www.cryptonator.com/api/ticker/' + cryptonatorMarkets[i], function(data){
marketsData[i] = data;
completedFetches++;
if (completedFetches !== cryptonatorMarkets.length) return;
var $marketHeader = $('#marketHeader');
$('.marketTicker').remove();
for (var f = marketsData.length - 1; f >= 0 ; f--){
var price = parseFloat(marketsData[f].ticker.price);
if (price > 1) price = Math.round(price * 100) / 100;
else price = marketsData[f].ticker.price;
$marketHeader.after('<div class="marketTicker">' + marketsData[f].ticker.base + ': <span>' + price + ' ' + marketsData[f].ticker.target + '</span></div>');
}
$('#marketLastUpdated').timeago('update', new Date(marketsData[0].timestamp * 1000).toISOString());
}, 'json');
})(i);
}
}
setInterval(updateMarkets, 300000); //poll market data every 5 minutes
var lastStats;
function renderStats(stats){
lastStats = stats;
$('#coinName').text(stats.config.coin);
$('#blocksTotal').text(stats.pool.totalBlocks);
$('#networkHashrate').text(getReadableHashRateString(stats.network.difficulty / 60) + '/sec');
$('#networkLastBlockFound').timeago('update', new Date(stats.network.timestamp * 1000).toISOString());
$('#networkDifficulty').text(stats.network.difficulty);
$('#blockchainHeight').text(stats.network.height);
$('#networkLastReward').text((stats.network.reward / coinUnits).toFixed(4) + ' ' + stats.config.symbol);
$('#lastHash').attr('href', blockchainExplorer + stats.network.hash).text(stats.network.hash.substr(0, 13) + '...');
$('#poolHashrate').text(getReadableHashRateString(stats.pool.hashrate) + '/sec');
cryptonatorMarkets = cryptonatorWidget;
if (stats.pool.lastBlockFound){
var d = new Date(parseInt(stats.pool.lastBlockFound)).toISOString();
$('#poolLastBlockFound').timeago('update', d);
}
else{
$('#poolLastBlockFound').removeAttr('title').data('ts', '').text('Never');
}
$('#poolRoundHashes').text(stats.pool.roundHashes);
$('#poolMiners').text(stats.pool.miners);
$('#poolFee').text(stats.config.fee + '%');
if (stats.config.donation && stats.config.donation > 0)
$('#donationPercent').text(' + ' + stats.config.donation + '% development funding');
else
$('#donationPercent').text('');
$('#blockSolvedTime').text(getReadableTime(stats.network.difficulty / stats.pool.hashrate));
$('#miningPoolHost').text(poolHost);
var portsJson = JSON.stringify(stats.config.ports);
if (lastPortsJson !== portsJson) {
lastPortsJson = portsJson;
var $miningPortChildren = [];
for (var i = 0; i < stats.config.ports.length; i++) {
var portData = stats.config.ports[i];
var $portChild = $(miningPortTemplate);
$portChild.find('.miningPort').text(portData.port);
$portChild.find('.miningPortDiff').text(portData.difficulty);
$portChild.find('.miningPortDesc').text(portData.desc);
$miningPortChildren.push($portChild);
}
$miningPorts.empty().append($miningPortChildren);
}
$('#easyminer_link').attr('href', easyminerDownload);
$('#simplewallet_download').attr('href', simplewalletDownload);
$('#cpuminer_code').text('minerd -a cryptonight -o stratum+tcp://'
+ poolHost + ':'
+ (stats.config.ports[0] || {}).port
+ ' -u address -p x');
var kiwiIrc = 'https://kiwiirc.com/client/' + irc;
if ($('#kiwi_irc').attr('src') !== kiwiIrc){
$('#kiwi_irc').attr('src', kiwiIrc);
}
$('#emailLink').attr('href', 'mailto:' + email).text(email);
$('#blocksMaturityCount').text(stats.config.depth);
var blocksJson = JSON.stringify(stats.pool.blocks);
if (lastBlocksJson !== blocksJson) {
lastBlocksJson = blocksJson;
renderBlocks(stats.pool.blocks);
}
$('#blocks_rows').find('tr[class=""]').each(function(){
var height = parseInt(this.children[0].innerHTML);
this.children[1].innerHTML = getMaturity(stats.config.depth, stats.network.height, height);
});
$('#poolVersion').text(stats.config.version);
stats_update.style.transition = 'opacity 100ms ease-out';
stats_update.style.opacity = 1;
setTimeout(function(){
stats_update.style.transition = 'opacity 7000ms linear';
stats_update.style.opacity = 0;
}, 500);
}
function getMaturity(depth, chainHeight, blockHeight){
var toGo = depth - (chainHeight - blockHeight);
if (toGo < 1) return '';
return '' + toGo + ' to go';
}
var lastBlocksJson = '';
var $blockRows = $('#blocks_rows');
function renderBlocks(blocksResults){
var depth = lastStats.config.depth;
var chainHeight = lastStats.network.height;
var explorer = blockchainExplorer;
var blockStatusClasses = {
'pending': '',
'unlocked': 'success',
'orphaned': 'danger'
};
var formatDate = function(time){
if (!time) return '';
return new Date(parseInt(time) * 1000).toLocaleString();
};
var formatLuck = function(difficulty, shares){
if (difficulty > shares){
var percent = 100 - Math.round(shares / difficulty * 100);
return '<span class="luckGood">&nbsp;' + percent + '%</span>';
}
else{
var percent = (100 - Math.round(difficulty / shares * 100)) * -1;
return '<span class="luckBad">' + percent + '%</span>';
}
};
var pendingRows = '';
for (var i = 0; i < blocksResults.length; i += 2){
var parts = blocksResults[i].split(':');
var block = {
height: parseInt(blocksResults[i + 1]),
hash: parts[0],
time: parts[1],
difficulty: parseInt(parts[2]),
shares: parseInt(parts[3]),
orphaned: parts[4],
reward: parts[5]
};
switch (block.orphaned){
case '0':
block.status = 'unlocked';
break;
case '1':
block.status = 'orphaned';
break;
default:
block.status = 'pending';
break;
}
var row = '<tr data-height="' + block.height + '" id="blockMatured' + block.height + '" title="' + block.status
+ '" class="' + blockStatusClasses[block.status] + '">' +
'<td>' + block.height + '</td>' +
'<td>' + (block.status === 'pending' ? getMaturity(depth, chainHeight, block.height) : '') + '</td>' +
'<td>' + block.difficulty + '</td>' +
'<td><a target="_blank" href="' + explorer + block.hash + '">' + block.hash + '</a></td>' +
'<td>' + formatDate(block.time) + '</td>' +
'<td>' + formatLuck(block.difficulty, block.shares) + '</td>' +
'</tr>';
if (block.status === 'pending'){
pendingRows += row;
}
else if (!$blockRows.find('#blockMatured' + block.height).length){
var inserted = false;
$blockRows.children().each(function(){
var bHeight = parseInt(this.getAttribute('data-height'));
if (bHeight < block.height){
$(this).after(row);
inserted = true;
return false;
}
});
if (!inserted){
$blockRows.append(row);
}
}
}
if (pendingRows) {
$blockRows.children('[title="pending"]').remove();
$blockRows.prepend(pendingRows);
}
}
var docCookies = {
getItem: function (sKey) {
return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
},
setItem: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) {
if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return false; }
var sExpires = "";
if (vEnd) {
switch (vEnd.constructor) {
case Number:
sExpires = vEnd === Infinity ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT" : "; max-age=" + vEnd;
break;
case String:
sExpires = "; expires=" + vEnd;
break;
case Date:
sExpires = "; expires=" + vEnd.toUTCString();
break;
}
}
document.cookie = encodeURIComponent(sKey) + "=" + encodeURIComponent(sValue) + sExpires + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "") + (bSecure ? "; secure" : "");
return true;
},
removeItem: function (sKey, sPath, sDomain) {
if (!sKey || !this.hasItem(sKey)) { return false; }
document.cookie = encodeURIComponent(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + ( sDomain ? "; domain=" + sDomain : "") + ( sPath ? "; path=" + sPath : "");
return true;
},
hasItem: function (sKey) {
return (new RegExp("(?:^|;\\s*)" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie);
},
keys: /* optional method: you can safely remove it! */ function () {
var aKeys = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "").split(/\s*(?:\=[^;]*)?;\s*/);
for (var nIdx = 0; nIdx < aKeys.length; nIdx++) { aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]); }
return aKeys;
}
};
var coinDecimals = coinUnits.toString().length - 1;
function getReadableCoins(coins){
return (parseInt(coins || 0) / coinUnits).toFixed(coinDecimals);
}
function getReadableTime(seconds){
var units = [
[60, 'second'],
[60, 'minute'],
[24, 'hour'],
[12, 'day'],
[7, 'week'],
[30, 'month'],
[12, 'year']
];
function formatAmounts(amount, unit){
var rounded = Math.round(amount);
return '' + rounded + ' ' + unit + (rounded > 1 ? 's' : '');
}
var amount = seconds;
for (var i = 0; i < units.length; i++){
if (amount < units[i][0])
return formatAmounts(amount, units[i][1]);
amount = amount / units[i][0];
}
return formatAmounts(amount, units[units.length - 1][1]);
}
function getReadableHashRateString(hashrate){
var i = 0;
var byteUnits = [' H', ' KH', ' MH', ' GH', ' TH', ' PH' ];
while (hashrate > 1024){
hashrate = hashrate / 1024;
i++;
}
return hashrate.toFixed(2) + byteUnits[i];
}
function pageRouter(){
$('.page').hide();
$('.hot_link').parent().removeClass('active');
var $link = $('a.hot_link[href="' + (window.location.hash || '#') + '"]');
$link.parent().addClass('active');
var page = $link.data('page');
$('#' + page).show();
}
var address = docCookies.getItem('mining_address');
if (address){
$('#yourStatsInput').val(address);
$('#lookUp').click();
}
$('#yourStatsInput').keyup(function(e){
if(e.keyCode === 13)
$('#lookUp').click();
});
var getBlocksAjax;
$('#loadMoreBlocks').click(function(){
if (getBlocksAjax)
getBlocksAjax.abort();
getBlocksAjax = $.ajax({
url: api + '/get_blocks',
data: {
height: $blockRows.children().last().data('height')
},
dataType: 'json',
cache: 'false',
success: function(data){
renderBlocks(data);
}
})
});
});
</script>
<div class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand"><span id="coinName"></span> Mining Pool</a>
</div>
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li class="active"><a class="hot_link" data-page="page_home" href="#"><i class="fa fa-home"></i> Home</a></li>
<li><a class="hot_link" data-page="page_pool_blocks" href="#pool_blocks"><i class="fa fa-cubes"></i> Pool Blocks</a></li>
<li><a class="hot_link" data-page="page_getting_started" href="#getting_started"><i class="fa fa-rocket"></i> Getting Started</a></li>
<li><a class="hot_link" data-page="page_community" href="#community"><i class="fa fa-comments"></i> Community</a></li>
</ul>
<div id="stats_updated">Stats Updated &nbsp;<i class="fa fa-bolt"></i></div>
</div>
</div>
</div>
<div class="container">
<div class="page" id="page_home">
<div id="siteInfo"></div>
<div class="row">
<div class="col-md-4 stats">
<h3>Network</h3>
<div><i class="fa fa-tachometer"></i> Hash Rate: <span id="networkHashrate"></span></div>
<div><i class="fa fa-clock-o"></i> Block Found: <span id="networkLastBlockFound"></span></div>
<div><i class="fa fa-unlock-alt"></i> Difficulty: <span id="networkDifficulty"></span></div>
<div><i class="fa fa-bars"></i> Blockchain Height: <span id="blockchainHeight"></span></div>
<div><i class="fa fa-money"></i> Last Reward: <span id="networkLastReward"></span></div>
<div><i class="fa fa-paw"></i> Last Hash: <a id="lastHash" target="_blank"></a></div>
</div>
<div class="col-md-4 stats">
<h3>Pool</h3>
<div><i class="fa fa-tachometer"></i> Hash Rate: <span id="poolHashrate"></span></div>
<div><i class="fa fa-clock-o"></i> Block Found: <span id="poolLastBlockFound"></span></div>
<div><i class="fa fa-cloud-upload"></i> Round Hashes: <span id="poolRoundHashes"></span></div>
<div><i class="fa fa-users"></i> Connected Miners: <span id="poolMiners"></span></div>
<div><i class="fa fa-money"></i> Fee: <span id="poolFee"></span><span id="donationPercent"></span></div>
<div><i class="fa fa-history"></i> Block Found Every: <span id="blockSolvedTime"></span> (est.)</div>
</div>
<div class="col-md-4 stats">
<h3 id="marketHeader">Market</h3>
<div class="marketFooter">Updated: <span id="marketLastUpdated"></span></div>
<div class="marketFooter">Powered by <a href="https://www.cryptonator.com/">Cryptonator</a></div>
</div>
</div>
<div class="stats">
<h3>Your Stats</h3>
<div class="input-group">
<label class="input-group-addon" for="yourStatsInput"><i class="fa fa-key"></i> Address</label>
<input class="form-control" id="yourStatsInput" type="text">
<span class="input-group-btn"><button class="btn btn-default" type="button" id="lookUp"><i class="fa fa-search"></i> Lookup</button></span>
</div>
<div id="addressError"></div>
<div class="yourStats"><i class="fa fa-key"></i> Address: <span id="yourAddressDisplay"></span></div>
<div class="yourStats"><i class="fa fa-bank"></i> Pending Balance: <span id="yourPendingBalance"></span></div>
<div class="yourStats"><i class="fa fa-money"></i> Total Paid: <span id="yourPaid"></span></div>
<div class="yourStats"><i class="fa fa-clock-o"></i> Last Share Submitted: <span id="yourLastShare"></span></div>
<div class="yourStats"><i class="fa fa-tachometer"></i> Hash Rate: <span id="yourHashrateHolder"></span></div>
<div class="yourStats"><i class="fa fa-cloud-upload"></i> Total Hashes Submitted: <span id="yourHashes"></span></div>
</div>
</div>
<div class="page" id="page_pool_blocks">
<div class="blocksStatHolder">
<span class="bg-primary"><span id="blocksTotal"></span> Total Blocks Mined</span>
<span class="bg-info">Maturity requires <span id="blocksMaturityCount"></span> blocks</span>
</div>
<hr>
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th><i class="fa fa-bars"></i> Height</th>
<th title="How many more blocks network must mine before this block is matured"><i class="fa fa-link"></i> Maturity</th>
<th><i class="fa fa-unlock-alt"></i> Difficulty</th>
<th><i class="fa fa-paw"></i> Block Hash</th>
<th><i class="fa fa-clock-o"></i> Time Found</th>
<th><i class="fa fa-star-half-o"></i> Luck</th>
</tr>
</thead>
<tbody id="blocks_rows">
</tbody>
</table>
<p class="text-center">
<button type="button" class="btn btn-default" id="loadMoreBlocks">Load More</button>
</p>
</div>
</div>
<div class="page" id="page_getting_started">
<h1>Getting Started</h1>
<hr>
<div class="stats">
<h4>Mining Host</h4>
<div><i class="fa fa-cloud"></i> Pool Address: <span id="miningPoolHost"></span></div>
</div>
<h4>Mining Ports</h4>
<div id="miningPorts" class="row">
<div class="stats">
<div><i class="fa fa-tachometer"></i> Port: <span class="miningPort"></span></div>
<div><i class="fa fa-unlock-alt"></i> Starting Difficulty: <span class="miningPortDiff"></span></div>
<div><i class="fa fa-question"></i> Description: <span class="miningPortDesc"></span></div>
</div>
</div>
<hr>
<h4>For <i class="fa fa-windows"></i> Windows users</h4>
<br>
<p class="getting_started_windows">
You can <a class="btn btn-default btn-sm" target="_blank" id="easyminer_link"><i class="fa fa-download"></i> Download</a> and run <a target="_blank" href="https://github.com/zone117x/cryptonote-easy-miner">cryptonote-easy-miner</a> <i class="fa fa-github"></i> which will automatically generate your wallet address
and manage multiple instances of simpleminer to take advantage of all your CPU Cores.
</p>
<hr>
<h4>Or download the the binaries for your system</h4>
<br>
<ol id="getting_started_list">
<li><a id="simplewallet_download" target="_blank" class="btn btn-default btn-sm"><i class="fa fa-download"></i> Download</a> simplewallet for your system</li>
<li>Run simplewallet to generate your public address</li>
<li><a target="_blank" class="btn btn-default btn-sm" href="https://github.com/LucasJones/cpuminer-multi/releases/"><i class="fa fa-download"></i> Download</a> CPUMiner-multi</li>
<li>Choose a port and point your miner to our pool with your address, for example:
<br><br>
<code id="cpuminer_code"></code>
</li>
</ol>
</div>
<div class="page" id="page_community">
<h3>Chat Room</h3>
<iframe id="kiwi_irc" style="border:0; width:100%; height:500px;"></iframe>
<h3>Contact</h3>
<p>Email pool support at <a id="emailLink" href=""></a></p>
</div>
</div>
<footer>
<div class="text-muted">
Powered by <a target="_blank" href="//github.com/zone117x/node-cryptonote-pool"><i class="fa fa-github"></i> node-cryptonote-pool</a>
<span id="poolVersion"></span>
created by Matthew Little & open sourced under the <a href="http://www.gnu.org/licenses/gpl-2.0.html">GPL</a>
</div>
</footer>
</body>
</html>