Merge pull request #5939 from mempool/mononaut/sub-sat

fix sub-1 sat/vb colors
This commit is contained in:
wiz 2025-06-26 09:34:59 +09:00 committed by GitHub
commit 5797709287
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 68 additions and 49 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,
@ -459,6 +465,7 @@ class StatisticsApi {
public mapOptimizedStatisticToStatistic(statistic: OptimizedStatistic[]): Statistic[] {
return statistic.map((s) => {
const completeVsizes = s.vsizes.length === 37 ? [0, ...s.vsizes] : s.vsizes;
return {
added: s.added,
unconfirmed_transactions: s.count,
@ -468,44 +475,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: completeVsizes[0],
vsize_1: completeVsizes[1],
vsize_2: completeVsizes[2],
vsize_3: completeVsizes[3],
vsize_4: completeVsizes[4],
vsize_5: completeVsizes[5],
vsize_6: completeVsizes[6],
vsize_8: completeVsizes[7],
vsize_10: completeVsizes[8],
vsize_12: completeVsizes[9],
vsize_15: completeVsizes[10],
vsize_20: completeVsizes[11],
vsize_30: completeVsizes[12],
vsize_40: completeVsizes[13],
vsize_50: completeVsizes[14],
vsize_60: completeVsizes[15],
vsize_70: completeVsizes[16],
vsize_80: completeVsizes[17],
vsize_90: completeVsizes[18],
vsize_100: completeVsizes[19],
vsize_125: completeVsizes[20],
vsize_150: completeVsizes[21],
vsize_175: completeVsizes[22],
vsize_200: completeVsizes[23],
vsize_250: completeVsizes[24],
vsize_300: completeVsizes[25],
vsize_350: completeVsizes[26],
vsize_400: completeVsizes[27],
vsize_500: completeVsizes[28],
vsize_600: completeVsizes[29],
vsize_700: completeVsizes[30],
vsize_800: completeVsizes[31],
vsize_900: completeVsizes[32],
vsize_1000: completeVsizes[33],
vsize_1200: completeVsizes[34],
vsize_1400: completeVsizes[35],
vsize_1600: completeVsizes[36],
vsize_1800: completeVsizes[37],
vsize_2000: completeVsizes[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

@ -1,4 +1,5 @@
export const defaultMempoolFeeColors = [
'557d00',
'557d00',
'5d7d01',
'637d02',
@ -40,6 +41,7 @@ export const defaultMempoolFeeColors = [
];
export const contrastMempoolFeeColors = [
'0082e6',
'0082e6',
'0984df',
'1285d9',
@ -81,6 +83,7 @@ export const contrastMempoolFeeColors = [
];
export const chartColors = [
"#A81524",
"#D81B60",
"#8E24AA",
"#5E35B1",
@ -125,7 +128,7 @@ export const poolsColor = {
'unknown': '#FDD835',
};
export const feeLevels = [1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 20, 30, 40, 50, 60, 70, 80, 90, 100, 125, 150, 175, 200,
export const feeLevels = [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];
export interface Language {

View file

@ -153,7 +153,7 @@ export class AcceleratorDashboardComponent implements OnInit, OnDestroy {
return acceleratedColor;
} else {
const rate = tx.fee / tx.vsize; // color by simple single-tx fee rate
const feeLevelIndex = feeLevels.findIndex((feeLvl) => Math.max(1, rate) < feeLvl) - 1;
const feeLevelIndex = feeLevels.findIndex((feeLvl) => Math.max(0, rate) < feeLvl) - 1;
return this.theme.theme === 'contrast' || this.theme.theme === 'bukele' ? contrastColors[feeLevelIndex] || contrastColors[contrastColors.length - 1] : normalColors[feeLevelIndex] || normalColors[normalColors.length - 1];
}
}

View file

@ -65,7 +65,7 @@ const defaultColors: { [key: string]: ColorPalette } = {
base: defaultMempoolFeeColors.map(hexToColor),
audit: [],
marginal: [],
baseLevel: (tx: TxView, rate: number) => feeLevels.findIndex((feeLvl) => Math.max(1, rate) < feeLvl) - 1
baseLevel: (tx: TxView, rate: number) => feeLevels.findIndex((feeLvl) => Math.max(0, rate) < feeLvl) - 1
},
}
for (const key in defaultColors) {
@ -96,7 +96,7 @@ const contrastColors: { [key: string]: ColorPalette } = {
base: contrastMempoolFeeColors.map(hexToColor),
audit: [],
marginal: [],
baseLevel: (tx: TxView, rate: number) => feeLevels.findIndex((feeLvl) => Math.max(1, rate) < feeLvl) - 1
baseLevel: (tx: TxView, rate: number) => feeLevels.findIndex((feeLvl) => Math.max(0, rate) < feeLvl) - 1
},
}
for (const key in contrastColors) {

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);