support sub 1 sat rates in stats chart

This commit is contained in:
Mononaut
2025-06-23 03:48:09 +00:00
parent 2c27941bf2
commit bee74460e0
7 changed files with 61 additions and 46 deletions

View File

@@ -7,7 +7,7 @@ import cpfpRepository from '../repositories/CpfpRepository';
import { RowDataPacket } from 'mysql2'; import { RowDataPacket } from 'mysql2';
class DatabaseMigration { class DatabaseMigration {
private static currentVersion = 98; private static currentVersion = 99;
private queryTimeout = 3600_000; private queryTimeout = 3600_000;
private statisticsAddedIndexed = false; private statisticsAddedIndexed = false;
private uniqueLogs: string[] = []; private uniqueLogs: string[] = [];
@@ -1154,6 +1154,12 @@ class DatabaseMigration {
await this.$executeQuery('UPDATE blocks_summaries SET version = 0 WHERE height >= 896070;'); await this.$executeQuery('UPDATE blocks_summaries SET version = 0 WHERE height >= 896070;');
await this.updateToSchemaVersion(98); await this.updateToSchemaVersion(98);
} }
// Add vsize_0 to statistics table
if (databaseSchemaVersion < 99) {
await this.$executeQuery('ALTER TABLE statistics ADD COLUMN vsize_0 int(11) NOT NULL DEFAULT 0');
await this.updateToSchemaVersion(99);
}
} }
/** /**

View File

@@ -16,6 +16,7 @@ class StatisticsApi {
fee_data, fee_data,
total_fee, total_fee,
min_fee, min_fee,
vsize_0,
vsize_1, vsize_1,
vsize_2, vsize_2,
vsize_3, vsize_3,
@@ -55,7 +56,7 @@ class StatisticsApi {
vsize_1800, vsize_1800,
vsize_2000 vsize_2000
) )
VALUES (NOW(), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, VALUES (NOW(), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)`; 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)`;
const [result]: any = await DB.query(query); const [result]: any = await DB.query(query);
return result.insertId; return result.insertId;
@@ -75,6 +76,7 @@ class StatisticsApi {
fee_data, fee_data,
total_fee, total_fee,
min_fee, min_fee,
vsize_0,
vsize_1, vsize_1,
vsize_2, vsize_2,
vsize_3, vsize_3,
@@ -115,7 +117,7 @@ class StatisticsApi {
vsize_2000 vsize_2000
) )
VALUES (${convertToDatetime ? `FROM_UNIXTIME(${statistics.added})` : statistics.added}, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, VALUES (${convertToDatetime ? `FROM_UNIXTIME(${statistics.added})` : statistics.added}, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`; ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;
const params: (string | number)[] = [ const params: (string | number)[] = [
statistics.unconfirmed_transactions, statistics.unconfirmed_transactions,
@@ -125,6 +127,7 @@ class StatisticsApi {
statistics.fee_data, statistics.fee_data,
statistics.total_fee, statistics.total_fee,
statistics.min_fee, statistics.min_fee,
statistics.vsize_0,
statistics.vsize_1, statistics.vsize_1,
statistics.vsize_2, statistics.vsize_2,
statistics.vsize_3, statistics.vsize_3,
@@ -177,6 +180,7 @@ class StatisticsApi {
CAST(avg(unconfirmed_transactions) as DOUBLE) as unconfirmed_transactions, CAST(avg(unconfirmed_transactions) as DOUBLE) as unconfirmed_transactions,
CAST(avg(vbytes_per_second) as DOUBLE) as vbytes_per_second, CAST(avg(vbytes_per_second) as DOUBLE) as vbytes_per_second,
CAST(avg(min_fee) as DOUBLE) as min_fee, CAST(avg(min_fee) as DOUBLE) as min_fee,
CAST(avg(vsize_0) as DOUBLE) as vsize_0,
CAST(avg(vsize_1) as DOUBLE) as vsize_1, CAST(avg(vsize_1) as DOUBLE) as vsize_1,
CAST(avg(vsize_2) as DOUBLE) as vsize_2, CAST(avg(vsize_2) as DOUBLE) as vsize_2,
CAST(avg(vsize_3) as DOUBLE) as vsize_3, CAST(avg(vsize_3) as DOUBLE) as vsize_3,
@@ -227,6 +231,7 @@ class StatisticsApi {
CAST(avg(unconfirmed_transactions) as DOUBLE) as unconfirmed_transactions, CAST(avg(unconfirmed_transactions) as DOUBLE) as unconfirmed_transactions,
CAST(avg(vbytes_per_second) as DOUBLE) as vbytes_per_second, CAST(avg(vbytes_per_second) as DOUBLE) as vbytes_per_second,
CAST(avg(min_fee) as DOUBLE) as min_fee, CAST(avg(min_fee) as DOUBLE) as min_fee,
vsize_0,
vsize_1, vsize_1,
vsize_2, vsize_2,
vsize_3, vsize_3,
@@ -414,6 +419,7 @@ class StatisticsApi {
total_fee: s.total_fee, total_fee: s.total_fee,
min_fee: s.min_fee, min_fee: s.min_fee,
vsizes: [ vsizes: [
s.vsize_0,
s.vsize_1, s.vsize_1,
s.vsize_2, s.vsize_2,
s.vsize_3, s.vsize_3,
@@ -468,44 +474,45 @@ class StatisticsApi {
total_fee: s.total_fee || 0, total_fee: s.total_fee || 0,
min_fee: s.min_fee, min_fee: s.min_fee,
fee_data: '', fee_data: '',
vsize_1: s.vsizes[0], vsize_0: s.vsizes[0],
vsize_2: s.vsizes[1], vsize_1: s.vsizes[1],
vsize_3: s.vsizes[2], vsize_2: s.vsizes[2],
vsize_4: s.vsizes[3], vsize_3: s.vsizes[3],
vsize_5: s.vsizes[4], vsize_4: s.vsizes[4],
vsize_6: s.vsizes[5], vsize_5: s.vsizes[5],
vsize_8: s.vsizes[6], vsize_6: s.vsizes[6],
vsize_10: s.vsizes[7], vsize_8: s.vsizes[7],
vsize_12: s.vsizes[8], vsize_10: s.vsizes[8],
vsize_15: s.vsizes[9], vsize_12: s.vsizes[9],
vsize_20: s.vsizes[10], vsize_15: s.vsizes[10],
vsize_30: s.vsizes[11], vsize_20: s.vsizes[11],
vsize_40: s.vsizes[12], vsize_30: s.vsizes[12],
vsize_50: s.vsizes[13], vsize_40: s.vsizes[13],
vsize_60: s.vsizes[14], vsize_50: s.vsizes[14],
vsize_70: s.vsizes[15], vsize_60: s.vsizes[15],
vsize_80: s.vsizes[16], vsize_70: s.vsizes[16],
vsize_90: s.vsizes[17], vsize_80: s.vsizes[17],
vsize_100: s.vsizes[18], vsize_90: s.vsizes[18],
vsize_125: s.vsizes[19], vsize_100: s.vsizes[19],
vsize_150: s.vsizes[20], vsize_125: s.vsizes[20],
vsize_175: s.vsizes[21], vsize_150: s.vsizes[21],
vsize_200: s.vsizes[22], vsize_175: s.vsizes[22],
vsize_250: s.vsizes[23], vsize_200: s.vsizes[23],
vsize_300: s.vsizes[24], vsize_250: s.vsizes[24],
vsize_350: s.vsizes[25], vsize_300: s.vsizes[25],
vsize_400: s.vsizes[26], vsize_350: s.vsizes[26],
vsize_500: s.vsizes[27], vsize_400: s.vsizes[27],
vsize_600: s.vsizes[28], vsize_500: s.vsizes[28],
vsize_700: s.vsizes[29], vsize_600: s.vsizes[29],
vsize_800: s.vsizes[30], vsize_700: s.vsizes[30],
vsize_900: s.vsizes[31], vsize_800: s.vsizes[31],
vsize_1000: s.vsizes[32], vsize_900: s.vsizes[32],
vsize_1200: s.vsizes[33], vsize_1000: s.vsizes[33],
vsize_1400: s.vsizes[34], vsize_1200: s.vsizes[34],
vsize_1600: s.vsizes[35], vsize_1400: s.vsizes[35],
vsize_1800: s.vsizes[36], vsize_1600: s.vsizes[36],
vsize_2000: s.vsizes[37], vsize_1800: s.vsizes[37],
vsize_2000: s.vsizes[38],
} }
}); });
} }

View File

@@ -73,7 +73,7 @@ class Statistics {
const totalWeight = memPoolArray.map((tx) => tx.vsize).reduce((acc, curr) => acc + curr) * 4; const totalWeight = memPoolArray.map((tx) => tx.vsize).reduce((acc, curr) => acc + curr) * 4;
const totalFee = memPoolArray.map((tx) => tx.fee).reduce((acc, curr) => acc + curr); const totalFee = memPoolArray.map((tx) => tx.fee).reduce((acc, curr) => acc + curr);
const logFees = [1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 20, 30, 40, 50, 60, 70, 80, 90, 100, 125, 150, 175, 200, const logFees = [0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 20, 30, 40, 50, 60, 70, 80, 90, 100, 125, 150, 175, 200,
250, 300, 350, 400, 500, 600, 700, 800, 900, 1000, 1200, 1400, 1600, 1800, 2000]; 250, 300, 350, 400, 500, 600, 700, 800, 900, 1000, 1200, 1400, 1600, 1800, 2000];
const weightVsizeFees: { [feePerWU: number]: number } = {}; const weightVsizeFees: { [feePerWU: number]: number } = {};
@@ -109,6 +109,7 @@ class Statistics {
total_fee: totalFee, total_fee: totalFee,
fee_data: '', fee_data: '',
min_fee: minFee, min_fee: minFee,
vsize_0: weightVsizeFees['0'] || 0,
vsize_1: weightVsizeFees['1'] || 0, vsize_1: weightVsizeFees['1'] || 0,
vsize_2: weightVsizeFees['2'] || 0, vsize_2: weightVsizeFees['2'] || 0,
vsize_3: weightVsizeFees['3'] || 0, vsize_3: weightVsizeFees['3'] || 0,

View File

@@ -406,6 +406,7 @@ export interface Statistic {
fee_data: string; fee_data: string;
min_fee: number; min_fee: number;
vsize_0: number;
vsize_1: number; vsize_1: number;
vsize_2: number; vsize_2: number;
vsize_3: number; vsize_3: number;

View File

@@ -83,7 +83,7 @@ export const contrastMempoolFeeColors = [
]; ];
export const chartColors = [ export const chartColors = [
"#D81B60", "#A81524",
"#D81B60", "#D81B60",
"#8E24AA", "#8E24AA",
"#5E35B1", "#5E35B1",

View File

@@ -117,7 +117,7 @@ export class MempoolGraphComponent implements OnInit, OnChanges {
let feesArray: number[][] = []; let feesArray: number[][] = [];
let maxTier = 0; let maxTier = 0;
for (let index = 37; index > -1; index--) { for (let index = 38; index > -1; index--) {
feesArray = []; feesArray = [];
mempoolStats.forEach((stats) => { mempoolStats.forEach((stats) => {
if (stats.vsizes[index] >= this.filterSize) { if (stats.vsizes[index] >= this.filterSize) {

View File

@@ -30,7 +30,7 @@ export class StatisticsComponent implements OnInit {
feeLevels = feeLevels; feeLevels = feeLevels;
chartColors = chartColors; chartColors = chartColors;
filterSize = 100000; filterSize = 100000;
filterFeeIndex = 1; filterFeeIndex = 0;
showCount = false; showCount = false;
maxFeeIndex: number; maxFeeIndex: number;
dropDownOpen = false; dropDownOpen = false;
@@ -146,7 +146,7 @@ export class StatisticsComponent implements OnInit {
const labels = mempoolStats.map(stats => stats.added); const labels = mempoolStats.map(stats => stats.added);
let maxTier = 0; let maxTier = 0;
for (let index = 37; index > -1; index--) { for (let index = 38; index > -1; index--) {
mempoolStats.forEach((stats) => { mempoolStats.forEach((stats) => {
if (stats.vsizes[index] >= this.filterSize) { if (stats.vsizes[index] >= this.filterSize) {
maxTier = Math.max(maxTier, index); maxTier = Math.max(maxTier, index);