|
|
|
extends layout
|
|
|
|
|
|
|
|
block headContent
|
|
|
|
title Mempool Summary
|
|
|
|
|
|
|
|
block content
|
|
|
|
h1(class="h3") Mempool Summary
|
|
|
|
hr
|
|
|
|
|
|
|
|
if (false)
|
|
|
|
pre
|
|
|
|
code(class="json bg-light") #{JSON.stringify(mempoolstats, null, 4)}
|
|
|
|
|
|
|
|
if (true)
|
|
|
|
div(class="card mb-3 shadow-sm")
|
|
|
|
div(class="card-header")
|
|
|
|
span(class="h6") Summary
|
|
|
|
div(class="card-body")
|
|
|
|
table(class="table details-table mb-0")
|
|
|
|
tr
|
|
|
|
td(class="properties-header") Transaction Count
|
|
|
|
td #{getmempoolinfo.size.toLocaleString()}
|
|
|
|
|
|
|
|
tr
|
|
|
|
- var mem1Data = utils.formatLargeNumber(getmempoolinfo.usage, 2);
|
|
|
|
- var mem2Data = utils.formatLargeNumber(getmempoolinfo.bytes, 2);
|
|
|
|
|
|
|
|
td(class="properties-header") Memory Usage
|
|
|
|
td(class="monospace")
|
|
|
|
span #{mem1Data[0]} #{mem1Data[1].abbreviation}B
|
|
|
|
span(class="text-muted") (virtual size: #{mem2Data[0]} #{mem2Data[1].abbreviation}B)
|
|
|
|
|
|
|
|
tr
|
|
|
|
td(class="properties-header") Total Fees
|
|
|
|
td(class="monospace")
|
|
|
|
- var currencyValue = mempoolstats["totalFees"];
|
|
|
|
include includes/value-display.pug
|
|
|
|
|
|
|
|
if (getmempoolinfo.size > 0)
|
|
|
|
tr
|
|
|
|
td(class="properties-header") Average Fee
|
|
|
|
td(class="monospace")
|
|
|
|
- var currencyValue = mempoolstats["averageFee"];
|
|
|
|
include ./includes/value-display.pug
|
|
|
|
|
|
|
|
tr
|
|
|
|
td(class="properties-header") Average Fee per Byte
|
|
|
|
td(class="monospace") #{utils.formatCurrencyAmountInSmallestUnits(mempoolstats["averageFeePerByte"], 2)}/B
|
|
|
|
|
|
|
|
if (getmempoolinfo.size > 0)
|
|
|
|
h2(class="h5") Transactions by fee rate
|
|
|
|
hr
|
|
|
|
|
|
|
|
if (false)
|
|
|
|
#{JSON.stringify(mempoolstats)}
|
|
|
|
|
|
|
|
if (true)
|
|
|
|
- var feeBucketLabels = [("[0 - " + mempoolstats["satoshiPerByteBucketMaxima"][0] + ")")];
|
|
|
|
each item, index in mempoolstats["satoshiPerByteBuckets"]
|
|
|
|
if (index > 0 && index < mempoolstats["satoshiPerByteBuckets"].length - 1)
|
|
|
|
- feeBucketLabels.push(("[" + mempoolstats["satoshiPerByteBucketMaxima"][index - 1] + " - " + mempoolstats["satoshiPerByteBucketMaxima"][index] + ")"));
|
|
|
|
|
|
|
|
- feeBucketLabels.push((mempoolstats.satoshiPerByteBucketMaxima[mempoolstats.satoshiPerByteBucketMaxima.length - 1] + "+"));
|
|
|
|
|
|
|
|
- var feeBucketTxCounts = mempoolstats["satoshiPerByteBucketCounts"];
|
|
|
|
- var totalfeeBuckets = mempoolstats["satoshiPerByteBucketTotalFees"];
|
|
|
|
|
|
|
|
canvas(id="mempoolBarChart", height="100", class="mb-4")
|
|
|
|
|
|
|
|
script(src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.bundle.min.js")
|
|
|
|
|
|
|
|
script var feeBucketLabels = [];
|
|
|
|
script var bgColors = [];
|
|
|
|
each feeBucketLabel, index in feeBucketLabels
|
|
|
|
- var percentTx = Math.round(100 * feeBucketTxCounts[index] / getmempoolinfo.size).toLocaleString();
|
|
|
|
script feeBucketLabels.push(["#{feeBucketLabel}","#{feeBucketTxCounts[index]} tx (#{percentTx}%)"]);
|
|
|
|
script bgColors.push("hsl(#{(333 * index / feeBucketLabels.length)}, 100%, 50%)");
|
|
|
|
|
|
|
|
script var feeBucketTxCounts = [#{feeBucketTxCounts}];
|
|
|
|
|
|
|
|
script.
|
|
|
|
var ctx = document.getElementById("mempoolBarChart").getContext('2d');
|
|
|
|
var mempoolBarChart = new Chart(ctx, {
|
|
|
|
type: 'bar',
|
|
|
|
data: {
|
|
|
|
labels: feeBucketLabels,
|
|
|
|
datasets: [{
|
|
|
|
data: feeBucketTxCounts,
|
|
|
|
backgroundColor: bgColors
|
|
|
|
}]
|
|
|
|
},
|
|
|
|
options: {
|
|
|
|
legend: {
|
|
|
|
display: false
|
|
|
|
},
|
|
|
|
scales: {
|
|
|
|
yAxes: [{
|
|
|
|
ticks: {
|
|
|
|
beginAtZero:true
|
|
|
|
}
|
|
|
|
}]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
div(class="table-responsive")
|
|
|
|
table(class="table table-striped mb-4")
|
|
|
|
thead
|
|
|
|
tr
|
|
|
|
th Fee Rate
|
|
|
|
th(class="text-right") Tx Count
|
|
|
|
th(class="text-right") Total Fees
|
|
|
|
th(class="text-right") Average Fee
|
|
|
|
th(class="text-right") Average Fee Rate
|
|
|
|
tbody
|
|
|
|
each item, index in mempoolstats["satoshiPerByteBuckets"]
|
|
|
|
tr
|
|
|
|
td #{mempoolstats["satoshiPerByteBucketLabels"][index]}
|
|
|
|
td(class="text-right monospace") #{item["count"].toLocaleString()}
|
|
|
|
td(class="text-right monospace")
|
|
|
|
- var currencyValue = item["totalFees"];
|
|
|
|
include ./includes/value-display.pug
|
|
|
|
|
|
|
|
if (item["totalBytes"] > 0)
|
|
|
|
- var avgFee = item["totalFees"] / item["count"];
|
|
|
|
- var avgFeeRate = item["totalFees"] / item["totalBytes"];
|
|
|
|
|
|
|
|
td(class="text-right monospace")
|
|
|
|
- var currencyValue = avgFee;
|
|
|
|
include ./includes/value-display.pug
|
|
|
|
|
|
|
|
td(class="text-right monospace") #{utils.formatCurrencyAmountInSmallestUnits(avgFeeRate, 2)}/B
|
|
|
|
else
|
|
|
|
td(class="text-right monospace") -
|
|
|
|
td(class="text-right monospace") -
|
|
|
|
|
|
|
|
|
|
|
|
h2(class="h5") Transactions by size
|
|
|
|
hr
|
|
|
|
|
|
|
|
canvas(id="txSizesBarChart", height="100", class="mb-4")
|
|
|
|
|
|
|
|
script var sizeBucketLabels = [];
|
|
|
|
script var bgColors = [];
|
|
|
|
each sizeBucketLabel, index in mempoolstats["sizeBucketLabels"]
|
|
|
|
- var percentTx = Math.round(100 * mempoolstats["sizeBucketTxCounts"][index] / getmempoolinfo.size).toLocaleString();
|
|
|
|
script sizeBucketLabels.push(["#{sizeBucketLabel} bytes","#{mempoolstats["sizeBucketTxCounts"][index]} tx (#{percentTx}%)"]);
|
|
|
|
script bgColors.push("hsl(#{(333 * index / mempoolstats["sizeBucketLabels"].length)}, 100%, 50%)");
|
|
|
|
|
|
|
|
script var sizeBucketTxCounts = [#{mempoolstats["sizeBucketTxCounts"]}];
|
|
|
|
|
|
|
|
script.
|
|
|
|
var ctx = document.getElementById("txSizesBarChart").getContext('2d');
|
|
|
|
var txSizesBarChart = new Chart(ctx, {
|
|
|
|
type: 'bar',
|
|
|
|
data: {
|
|
|
|
labels: sizeBucketLabels,
|
|
|
|
datasets: [{
|
|
|
|
data: sizeBucketTxCounts,
|
|
|
|
backgroundColor: bgColors
|
|
|
|
}]
|
|
|
|
},
|
|
|
|
options: {
|
|
|
|
legend: {
|
|
|
|
display: false
|
|
|
|
},
|
|
|
|
scales: {
|
|
|
|
yAxes: [{
|
|
|
|
ticks: {
|
|
|
|
beginAtZero:true
|
|
|
|
}
|
|
|
|
}]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
h2(class="h5") Transactions by age
|
|
|
|
hr
|
|
|
|
|
|
|
|
canvas(id="txAgesBarChart", height="100", class="mb-4")
|
|
|
|
|
|
|
|
script var ageBucketLabels = [];
|
|
|
|
script var bgColors = [];
|
|
|
|
each ageBucketLabel, index in mempoolstats["ageBucketLabels"]
|
|
|
|
- var percentTx = Math.round(100 * mempoolstats["ageBucketTxCounts"][index] / getmempoolinfo.size).toLocaleString();
|
|
|
|
script ageBucketLabels.push(["#{ageBucketLabel} sec","#{mempoolstats["ageBucketTxCounts"][index]} tx (#{percentTx}%)"]);
|
|
|
|
script bgColors.push("hsl(#{(333 * index / mempoolstats["ageBucketLabels"].length)}, 100%, 50%)");
|
|
|
|
|
|
|
|
script var ageBucketTxCounts = [#{mempoolstats["ageBucketTxCounts"]}];
|
|
|
|
|
|
|
|
script.
|
|
|
|
var ctx = document.getElementById("txAgesBarChart").getContext('2d');
|
|
|
|
var txAgesBarChart = new Chart(ctx, {
|
|
|
|
type: 'bar',
|
|
|
|
data: {
|
|
|
|
labels: ageBucketLabels,
|
|
|
|
datasets: [{
|
|
|
|
data: ageBucketTxCounts,
|
|
|
|
backgroundColor: bgColors
|
|
|
|
}]
|
|
|
|
},
|
|
|
|
options: {
|
|
|
|
legend: {
|
|
|
|
display: false
|
|
|
|
},
|
|
|
|
scales: {
|
|
|
|
yAxes: [{
|
|
|
|
ticks: {
|
|
|
|
beginAtZero:true
|
|
|
|
}
|
|
|
|
}]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|