202 lines
5.8 KiB
HTML
202 lines
5.8 KiB
HTML
<style>
|
|
.blocksStatHolder > span{
|
|
display: inline-block;
|
|
border-radius: 5px;
|
|
padding: 1px 9px;
|
|
border: 1px solid #e5e5e5;
|
|
margin: 2px;
|
|
}
|
|
.blocksStatHolder > span > span{
|
|
font-weight: bold;
|
|
}
|
|
#blocks_rows > tr > td{
|
|
vertical-align: middle;
|
|
font-family: 'Inconsolata', monospace;
|
|
font-size: 0.95em;
|
|
text-align: center;
|
|
}
|
|
.luckGood{
|
|
color: darkgreen;
|
|
}
|
|
.luckBad{
|
|
color: darkred;
|
|
}
|
|
</style>
|
|
|
|
<div class="blocksStatHolder">
|
|
<span class="bg-primary">Total Blocks Mined: <span id="blocksTotal"></span></span>
|
|
<span class="bg-info">Maturity Depth Requirement: <span id="blocksMaturityCount"></span></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> Shares/Diff</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="blocks_rows">
|
|
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<p class="text-center">
|
|
<button type="button" class="btn btn-default" id="loadMoreBlocks">Load More</button>
|
|
</p>
|
|
|
|
<script>
|
|
|
|
currentPage = {
|
|
destroy: function(){
|
|
if (xhrGetBlocks) xhrGetBlocks.abort();
|
|
},
|
|
update: function(){
|
|
updateText('blocksTotal', lastStats.pool.totalBlocks.toString());
|
|
updateText('blocksMaturityCount', lastStats.config.depth.toString());
|
|
renderBlocks(lastStats.pool.blocks);
|
|
}
|
|
};
|
|
|
|
|
|
|
|
var xhrGetBlocks;
|
|
$('#loadMoreBlocks').click(function(){
|
|
if (xhrGetBlocks) xhrGetBlocks.abort();
|
|
xhrGetBlocks = $.ajax({
|
|
url: api + '/get_blocks',
|
|
data: {
|
|
height: $('#blocks_rows').children().last().data('height')
|
|
},
|
|
dataType: 'json',
|
|
cache: 'false',
|
|
success: function(data){
|
|
renderBlocks(data);
|
|
}
|
|
});
|
|
});
|
|
|
|
|
|
function parseBlock(height, serializedBlock){
|
|
var parts = serializedBlock.split(':');
|
|
var block = {
|
|
height: parseInt(height),
|
|
hash: parts[0],
|
|
time: parts[1],
|
|
difficulty: parseInt(parts[2]),
|
|
shares: parseInt(parts[3]),
|
|
orphaned: parts[4],
|
|
reward: parts[5]
|
|
};
|
|
|
|
var toGo = lastStats.config.depth - (lastStats.network.height - block.height);
|
|
block.maturity = toGo < 1 ? '' : (toGo + ' to go');
|
|
|
|
switch (block.orphaned){
|
|
case '0':
|
|
block.status = 'unlocked';
|
|
break;
|
|
case '1':
|
|
block.status = 'orphaned';
|
|
break;
|
|
default:
|
|
block.status = 'pending';
|
|
break;
|
|
}
|
|
|
|
return block;
|
|
}
|
|
|
|
|
|
|
|
function getBlockRowElement(block, jsonString){
|
|
|
|
function formatLuck(difficulty, shares) {
|
|
var percent = Math.round(shares / difficulty * 100);
|
|
if(!percent) {
|
|
return '<span class="luckGood">?</span>';
|
|
}
|
|
else if(percent <= 100) {
|
|
return '<span class="luckGood">' + percent + '%</span>';
|
|
}
|
|
else {
|
|
return '<span class="luckBad">' + percent + '%</span>';
|
|
}
|
|
}
|
|
|
|
function formatBlockLink(hash){
|
|
return '<a target="_blank" href="' + getBlockchainUrl(hash) + '">' + hash + '</a>';
|
|
}
|
|
|
|
var blockStatusClasses = {
|
|
'pending': '',
|
|
'unlocked': 'success',
|
|
'orphaned': 'danger'
|
|
};
|
|
|
|
var row = document.createElement('tr');
|
|
row.setAttribute('data-json', jsonString);
|
|
row.setAttribute('data-height', block.height);
|
|
row.setAttribute('id', 'blockRow' + block.height);
|
|
row.setAttribute('title', block.status);
|
|
row.className = blockStatusClasses[block.status];
|
|
|
|
var columns =
|
|
'<td>' + block.height + '</td>' +
|
|
'<td>' + block.maturity + '</td>' +
|
|
'<td>' + block.difficulty + '</td>' +
|
|
'<td>' + formatBlockLink(block.hash) + '</td>' +
|
|
'<td>' + formatDate(block.time) + '</td>' +
|
|
'<td>' + formatLuck(block.difficulty, block.shares) + '</td>';
|
|
|
|
row.innerHTML = columns;
|
|
|
|
return row;
|
|
}
|
|
|
|
|
|
function renderBlocks(blocksResults){
|
|
|
|
var $blocksRows = $('#blocks_rows');
|
|
|
|
for (var i = 0; i < blocksResults.length; i += 2){
|
|
|
|
var block = parseBlock(blocksResults[i + 1], blocksResults[i]);
|
|
|
|
var blockJson = JSON.stringify(block);
|
|
|
|
var existingRow = document.getElementById('blockRow' + block.height);
|
|
|
|
if (existingRow && existingRow.getAttribute('data-json') !== blockJson){
|
|
$(existingRow).replaceWith(getBlockRowElement(block, blockJson));
|
|
}
|
|
else if (!existingRow){
|
|
|
|
var blockElement = getBlockRowElement(block, blockJson);
|
|
|
|
var inserted = false;
|
|
var rows = $blocksRows.children().get();
|
|
for (var f = 0; f < rows.length; f++) {
|
|
var bHeight = parseInt(rows[f].getAttribute('data-height'));
|
|
if (bHeight < block.height){
|
|
inserted = true;
|
|
$(rows[f]).before(blockElement);
|
|
break;
|
|
}
|
|
}
|
|
if (!inserted)
|
|
$blocksRows.append(blockElement);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
</script>
|