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';
class DatabaseMigration {
private static currentVersion = 98;
private static currentVersion = 99;
private queryTimeout = 3600_000;
private statisticsAddedIndexed = false;
private uniqueLogs: string[] = [];
@@ -1154,6 +1154,12 @@ class DatabaseMigration {
await this.$executeQuery('UPDATE blocks_summaries SET version = 0 WHERE height >= 896070;');
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,
total_fee,
min_fee,
vsize_0,
vsize_1,
vsize_2,
vsize_3,
@@ -55,7 +56,7 @@ class StatisticsApi {
vsize_1800,
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)`;
const [result]: any = await DB.query(query);
return result.insertId;
@@ -75,6 +76,7 @@ class StatisticsApi {
fee_data,
total_fee,
min_fee,
vsize_0,
vsize_1,
vsize_2,
vsize_3,
@@ -115,7 +117,7 @@ class StatisticsApi {
vsize_2000
)
VALUES (${convertToDatetime ? `FROM_UNIXTIME(${statistics.added})` : statistics.added}, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;
const params: (string | number)[] = [
statistics.unconfirmed_transactions,
@@ -125,6 +127,7 @@ class StatisticsApi {
statistics.fee_data,
statistics.total_fee,
statistics.min_fee,
statistics.vsize_0,
statistics.vsize_1,
statistics.vsize_2,
statistics.vsize_3,
@@ -177,6 +180,7 @@ class StatisticsApi {
CAST(avg(unconfirmed_transactions) as DOUBLE) as unconfirmed_transactions,
CAST(avg(vbytes_per_second) as DOUBLE) as vbytes_per_second,
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_2) as DOUBLE) as vsize_2,
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(vbytes_per_second) as DOUBLE) as vbytes_per_second,
CAST(avg(min_fee) as DOUBLE) as min_fee,
vsize_0,
vsize_1,
vsize_2,
vsize_3,
@@ -414,6 +419,7 @@ class StatisticsApi {
total_fee: s.total_fee,
min_fee: s.min_fee,
vsizes: [
s.vsize_0,
s.vsize_1,
s.vsize_2,
s.vsize_3,
@@ -468,44 +474,45 @@ class StatisticsApi {
total_fee: s.total_fee || 0,
min_fee: s.min_fee,
fee_data: '',
vsize_1: s.vsizes[0],
vsize_2: s.vsizes[1],
vsize_3: s.vsizes[2],
vsize_4: s.vsizes[3],
vsize_5: s.vsizes[4],
vsize_6: s.vsizes[5],
vsize_8: s.vsizes[6],
vsize_10: s.vsizes[7],
vsize_12: s.vsizes[8],
vsize_15: s.vsizes[9],
vsize_20: s.vsizes[10],
vsize_30: s.vsizes[11],
vsize_40: s.vsizes[12],
vsize_50: s.vsizes[13],
vsize_60: s.vsizes[14],
vsize_70: s.vsizes[15],
vsize_80: s.vsizes[16],
vsize_90: s.vsizes[17],
vsize_100: s.vsizes[18],
vsize_125: s.vsizes[19],
vsize_150: s.vsizes[20],
vsize_175: s.vsizes[21],
vsize_200: s.vsizes[22],
vsize_250: s.vsizes[23],
vsize_300: s.vsizes[24],
vsize_350: s.vsizes[25],
vsize_400: s.vsizes[26],
vsize_500: s.vsizes[27],
vsize_600: s.vsizes[28],
vsize_700: s.vsizes[29],
vsize_800: s.vsizes[30],
vsize_900: s.vsizes[31],
vsize_1000: s.vsizes[32],
vsize_1200: s.vsizes[33],
vsize_1400: s.vsizes[34],
vsize_1600: s.vsizes[35],
vsize_1800: s.vsizes[36],
vsize_2000: s.vsizes[37],
vsize_0: s.vsizes[0],
vsize_1: s.vsizes[1],
vsize_2: s.vsizes[2],
vsize_3: s.vsizes[3],
vsize_4: s.vsizes[4],
vsize_5: s.vsizes[5],
vsize_6: s.vsizes[6],
vsize_8: s.vsizes[7],
vsize_10: s.vsizes[8],
vsize_12: s.vsizes[9],
vsize_15: s.vsizes[10],
vsize_20: s.vsizes[11],
vsize_30: s.vsizes[12],
vsize_40: s.vsizes[13],
vsize_50: s.vsizes[14],
vsize_60: s.vsizes[15],
vsize_70: s.vsizes[16],
vsize_80: s.vsizes[17],
vsize_90: s.vsizes[18],
vsize_100: s.vsizes[19],
vsize_125: s.vsizes[20],
vsize_150: s.vsizes[21],
vsize_175: s.vsizes[22],
vsize_200: s.vsizes[23],
vsize_250: s.vsizes[24],
vsize_300: s.vsizes[25],
vsize_350: s.vsizes[26],
vsize_400: s.vsizes[27],
vsize_500: s.vsizes[28],
vsize_600: s.vsizes[29],
vsize_700: s.vsizes[30],
vsize_800: s.vsizes[31],
vsize_900: s.vsizes[32],
vsize_1000: s.vsizes[33],
vsize_1200: s.vsizes[34],
vsize_1400: s.vsizes[35],
vsize_1600: s.vsizes[36],
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 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];
const weightVsizeFees: { [feePerWU: number]: number } = {};
@@ -109,6 +109,7 @@ class Statistics {
total_fee: totalFee,
fee_data: '',
min_fee: minFee,
vsize_0: weightVsizeFees['0'] || 0,
vsize_1: weightVsizeFees['1'] || 0,
vsize_2: weightVsizeFees['2'] || 0,
vsize_3: weightVsizeFees['3'] || 0,

View File

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

View File

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

View File

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

View File

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