diff --git a/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts b/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts index 5bd961e23..02640efc0 100644 --- a/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts +++ b/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts @@ -1,3 +1,4 @@ +import { IBitcoinApi } from './bitcoin-api.interface'; import { IEsploraApi } from './esplora-api.interface'; export interface AbstractBitcoinApi { diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 6b4a14a0e..646672f58 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -2,7 +2,7 @@ import config from '../config'; import bitcoinApi, { bitcoinCoreApi } from './bitcoin/bitcoin-api-factory'; import logger from '../logger'; import memPool from './mempool'; -import { BlockExtended, BlockExtension, BlockSummary, PoolTag, TransactionExtended, TransactionStripped, TransactionMinerInfo, CpfpSummary, MempoolTransactionExtended } from '../mempool.interfaces'; +import { BlockExtended, BlockExtension, BlockSummary, PoolTag, TransactionExtended, TransactionMinerInfo, CpfpSummary, MempoolTransactionExtended, TransactionClassified } from '../mempool.interfaces'; import { Common } from './common'; import diskCache from './disk-cache'; import transactionUtils from './transaction-utils'; @@ -201,7 +201,8 @@ class Blocks { txid: tx.txid, vsize: tx.weight / 4, fee: tx.fee ? Math.round(tx.fee * 100000000) : 0, - value: Math.round(tx.vout.reduce((acc, vout) => acc + (vout.value ? vout.value : 0), 0) * 100000000) + value: Math.round(tx.vout.reduce((acc, vout) => acc + (vout.value ? vout.value : 0), 0) * 100000000), + flags: 0, }; }); @@ -214,7 +215,7 @@ class Blocks { public summarizeBlockTransactions(hash: string, transactions: TransactionExtended[]): BlockSummary { return { id: hash, - transactions: Common.stripTransactions(transactions), + transactions: Common.classifyTransactions(transactions), }; } @@ -945,7 +946,7 @@ class Blocks { } public async $getStrippedBlockTransactions(hash: string, skipMemoryCache = false, - skipDBLookup = false, cpfpSummary?: CpfpSummary, blockHeight?: number): Promise + skipDBLookup = false, cpfpSummary?: CpfpSummary, blockHeight?: number): Promise { if (skipMemoryCache === false) { // Check the memory cache @@ -974,7 +975,8 @@ class Blocks { fee: tx.fee || 0, vsize: tx.vsize, value: Math.round(tx.vout.reduce((acc, vout) => acc + (vout.value ? vout.value : 0), 0)), - rate: tx.effectiveFeePerVsize + rate: tx.effectiveFeePerVsize, + flags: tx.flags || Common.getTransactionFlags(tx), }; }), }; diff --git a/backend/src/api/common.ts b/backend/src/api/common.ts index af93b9622..0dccdef84 100644 --- a/backend/src/api/common.ts +++ b/backend/src/api/common.ts @@ -1,10 +1,9 @@ import * as bitcoinjs from 'bitcoinjs-lib'; import { Request } from 'express'; -import { Ancestor, CpfpInfo, CpfpSummary, CpfpCluster, EffectiveFeeStats, MempoolBlockWithTransactions, TransactionExtended, MempoolTransactionExtended, TransactionStripped, WorkingEffectiveFeeStats, TransactionClassified, TransactionFlags } from '../mempool.interfaces'; +import { CpfpInfo, CpfpSummary, CpfpCluster, EffectiveFeeStats, MempoolBlockWithTransactions, TransactionExtended, MempoolTransactionExtended, TransactionStripped, WorkingEffectiveFeeStats, TransactionClassified, TransactionFlags } from '../mempool.interfaces'; import config from '../config'; import { NodeSocket } from '../repositories/NodesSocketsRepository'; import { isIP } from 'net'; -import rbfCache from './rbf-cache'; import transactionUtils from './transaction-utils'; import { isPoint } from '../utils/secp256k1'; export class Common { @@ -349,14 +348,18 @@ export class Common { } static classifyTransaction(tx: TransactionExtended): TransactionClassified { - const flags = this.getTransactionFlags(tx); + const flags = Common.getTransactionFlags(tx); tx.flags = flags; return { - ...this.stripTransaction(tx), + ...Common.stripTransaction(tx), flags, }; } + static classifyTransactions(txs: TransactionExtended[]): TransactionClassified[] { + return txs.map(Common.classifyTransaction); + } + static stripTransaction(tx: TransactionExtended): TransactionStripped { return { txid: tx.txid, @@ -369,7 +372,7 @@ export class Common { } static stripTransactions(txs: TransactionExtended[]): TransactionStripped[] { - return txs.map(this.stripTransaction); + return txs.map(Common.stripTransaction); } static sleep$(ms: number): Promise { diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 0ca550f4c..58921fcfb 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -1,6 +1,6 @@ import { GbtGenerator, GbtResult, ThreadTransaction as RustThreadTransaction, ThreadAcceleration as RustThreadAcceleration } from 'rust-gbt'; import logger from '../logger'; -import { MempoolBlock, MempoolTransactionExtended, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction, EffectiveFeeStats, PoolTag, TransactionClassified } from '../mempool.interfaces'; +import { MempoolBlock, MempoolTransactionExtended, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction, EffectiveFeeStats, PoolTag, TransactionClassified } from '../mempool.interfaces'; import { Common, OnlineFeeStatsCalculator } from './common'; import config from '../config'; import { Worker } from 'worker_threads'; diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index c93372ded..09d251050 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -280,7 +280,7 @@ export interface BlockExtended extends IEsploraApi.Block { export interface BlockSummary { id: string; - transactions: TransactionStripped[]; + transactions: TransactionClassified[]; } export interface AuditSummary extends BlockAudit { @@ -288,8 +288,8 @@ export interface AuditSummary extends BlockAudit { size?: number, weight?: number, tx_count?: number, - transactions: TransactionStripped[]; - template?: TransactionStripped[]; + transactions: TransactionClassified[]; + template?: TransactionClassified[]; } export interface BlockPrice { diff --git a/backend/src/repositories/BlocksSummariesRepository.ts b/backend/src/repositories/BlocksSummariesRepository.ts index 09598db03..a61bf60ed 100644 --- a/backend/src/repositories/BlocksSummariesRepository.ts +++ b/backend/src/repositories/BlocksSummariesRepository.ts @@ -1,6 +1,6 @@ import DB from '../database'; import logger from '../logger'; -import { BlockSummary, TransactionStripped } from '../mempool.interfaces'; +import { BlockSummary, TransactionClassified } from '../mempool.interfaces'; class BlocksSummariesRepository { public async $getByBlockId(id: string): Promise { @@ -17,7 +17,7 @@ class BlocksSummariesRepository { return undefined; } - public async $saveTransactions(blockHeight: number, blockId: string, transactions: TransactionStripped[]): Promise { + public async $saveTransactions(blockHeight: number, blockId: string, transactions: TransactionClassified[]): Promise { try { const transactionsStr = JSON.stringify(transactions); await DB.query(`