diff --git a/backend/src/api/common.ts b/backend/src/api/common.ts index d1cf76844..0e29ac44b 100644 --- a/backend/src/api/common.ts +++ b/backend/src/api/common.ts @@ -253,7 +253,7 @@ export class Common { } } else if (['unknown', 'provably_unspendable', 'empty'].includes(vin.prevout?.scriptpubkey_type || '')) { return true; - } else if (this.isNonStandardAnchor(tx, height)) { + } else if (vin.prevout?.scriptpubkey_type === 'anchor' && this.isNonStandardAnchor(vin, height)) { return true; } // bad-witness-nonstandard @@ -396,11 +396,12 @@ export class Common { 'signet': 211_000, '': 863_500, }; - static isNonStandardAnchor(tx: TransactionExtended, height?: number): boolean { + static isNonStandardAnchor(vin: IEsploraApi.Vin, height?: number): boolean { if ( height != null && this.ANCHOR_STANDARDNESS_ACTIVATION_HEIGHT[config.MEMPOOL.NETWORK] && height <= this.ANCHOR_STANDARDNESS_ACTIVATION_HEIGHT[config.MEMPOOL.NETWORK] + && vin.prevout?.scriptpubkey === '51024e73' ) { // anchor outputs were non-standard to spend before v28.x (scheduled for 2024/09/30 https://github.com/bitcoin/bitcoin/issues/29891) return true; diff --git a/frontend/src/app/components/tracker/tracker.component.ts b/frontend/src/app/components/tracker/tracker.component.ts index 3c5cebdbc..f78b7a2a9 100644 --- a/frontend/src/app/components/tracker/tracker.component.ts +++ b/frontend/src/app/components/tracker/tracker.component.ts @@ -750,7 +750,8 @@ export class TrackerComponent implements OnInit, OnDestroy { checkAccelerationEligibility() { if (this.tx) { - this.tx.flags = getTransactionFlags(this.tx, null, null, this.tx.status?.block_height || (this.stateService.latestBlockHeight + 1), this.stateService.network); + const txHeight = this.tx.status?.block_height || (this.stateService.latestBlockHeight >= 0 ? this.stateService.latestBlockHeight + 1 : null); + this.tx.flags = getTransactionFlags(this.tx, null, null, txHeight, this.stateService.network); const replaceableInputs = (this.tx.flags & (TransactionFlags.sighash_none | TransactionFlags.sighash_acp)) > 0n; const highSigop = (this.tx.sigops * 20) > this.tx.weight; this.eligibleForAcceleration = !replaceableInputs && !highSigop; diff --git a/frontend/src/app/components/transaction/transaction-raw.component.ts b/frontend/src/app/components/transaction/transaction-raw.component.ts index 07ec72c6e..8dc516928 100644 --- a/frontend/src/app/components/transaction/transaction-raw.component.ts +++ b/frontend/src/app/components/transaction/transaction-raw.component.ts @@ -270,7 +270,8 @@ export class TransactionRawComponent implements OnInit, OnDestroy { replaceUrl: true }); - this.transaction.flags = getTransactionFlags(this.transaction, this.cpfpInfo, null, this.transaction.status?.block_height || (this.stateService.latestBlockHeight + 1), this.stateService.network); + const txHeight = this.transaction.status?.block_height || (this.stateService.latestBlockHeight >= 0 ? this.stateService.latestBlockHeight + 1 : null); + this.transaction.flags = getTransactionFlags(this.transaction, this.cpfpInfo, null, txHeight, this.stateService.network); this.filters = this.transaction.flags ? toFilters(this.transaction.flags).filter(f => f.txPage) : []; this.setupGraph(); diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index e70cb673a..9b50b341f 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -930,7 +930,8 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { this.segwitEnabled = !this.tx.status.confirmed || isFeatureActive(this.stateService.network, this.tx.status.block_height, 'segwit'); this.taprootEnabled = !this.tx.status.confirmed || isFeatureActive(this.stateService.network, this.tx.status.block_height, 'taproot'); this.rbfEnabled = !this.tx.status.confirmed || isFeatureActive(this.stateService.network, this.tx.status.block_height, 'rbf'); - this.tx.flags = getTransactionFlags(this.tx, null, null, this.tx.status?.block_height || (this.stateService.latestBlockHeight + 1), this.stateService.network); + const txHeight = this.tx.status?.block_height || (this.stateService.latestBlockHeight >= 0 ? this.stateService.latestBlockHeight + 1 : null); + this.tx.flags = getTransactionFlags(this.tx, null, null, txHeight, this.stateService.network); this.filters = this.tx.flags ? toFilters(this.tx.flags).filter(f => f.txPage) : []; this.checkAccelerationEligibility(); } else { diff --git a/frontend/src/app/shared/transaction.utils.ts b/frontend/src/app/shared/transaction.utils.ts index daf3733e3..ba2b6c6b1 100644 --- a/frontend/src/app/shared/transaction.utils.ts +++ b/frontend/src/app/shared/transaction.utils.ts @@ -511,7 +511,7 @@ export function isNonStandard(tx: Transaction, height?: number, network?: string } } else if (['unknown', 'provably_unspendable', 'empty'].includes(vin.prevout?.scriptpubkey_type || '')) { return true; - } else if (isNonStandardAnchor(tx, height, network)) { + } else if (vin.prevout?.scriptpubkey_type === 'anchor' && isNonStandardAnchor(vin, height, network)) { return true; } // bad-witness-nonstandard @@ -634,12 +634,13 @@ const ANCHOR_STANDARDNESS_ACTIVATION_HEIGHT = { 'signet': 211_000, '': 863_500, }; -function isNonStandardAnchor(tx: Transaction, height?: number, network?: string): boolean { +function isNonStandardAnchor(vin: Vin, height?: number, network?: string): boolean { if ( height != null && network != null && ANCHOR_STANDARDNESS_ACTIVATION_HEIGHT[network] && height <= ANCHOR_STANDARDNESS_ACTIVATION_HEIGHT[network] + && vin.prevout?.scriptpubkey === '51024e73' ) { // anchor outputs were non-standard to spend before v28.x (scheduled for 2024/09/30 https://github.com/bitcoin/bitcoin/issues/29891) return true;