Retrieve acceleration request time and first seen time
This commit is contained in:
parent
46c4d57367
commit
815dcbd4ce
@ -162,6 +162,7 @@ class BitcoinRoutes {
|
|||||||
adjustedVsize: tx.adjustedVsize,
|
adjustedVsize: tx.adjustedVsize,
|
||||||
acceleration: tx.acceleration,
|
acceleration: tx.acceleration,
|
||||||
acceleratedBy: tx.acceleratedBy || undefined,
|
acceleratedBy: tx.acceleratedBy || undefined,
|
||||||
|
acceleratedAt: tx.acceleratedAt || undefined,
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -449,12 +449,14 @@ class MempoolBlocks {
|
|||||||
}
|
}
|
||||||
mempoolTx.acceleration = true;
|
mempoolTx.acceleration = true;
|
||||||
mempoolTx.acceleratedBy = isAcceleratedBy[txid] || acceleration?.pools;
|
mempoolTx.acceleratedBy = isAcceleratedBy[txid] || acceleration?.pools;
|
||||||
|
mempoolTx.acceleratedAt = acceleration?.added;
|
||||||
for (const ancestor of mempoolTx.ancestors || []) {
|
for (const ancestor of mempoolTx.ancestors || []) {
|
||||||
if (!mempool[ancestor.txid].acceleration) {
|
if (!mempool[ancestor.txid].acceleration) {
|
||||||
mempool[ancestor.txid].cpfpDirty = true;
|
mempool[ancestor.txid].cpfpDirty = true;
|
||||||
}
|
}
|
||||||
mempool[ancestor.txid].acceleration = true;
|
mempool[ancestor.txid].acceleration = true;
|
||||||
mempool[ancestor.txid].acceleratedBy = mempoolTx.acceleratedBy;
|
mempool[ancestor.txid].acceleratedBy = mempoolTx.acceleratedBy;
|
||||||
|
mempool[ancestor.txid].acceleratedAt = mempoolTx.acceleratedAt;
|
||||||
isAcceleratedBy[ancestor.txid] = mempoolTx.acceleratedBy;
|
isAcceleratedBy[ancestor.txid] = mempoolTx.acceleratedBy;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -822,6 +822,7 @@ class WebsocketHandler {
|
|||||||
...mempoolTx.position,
|
...mempoolTx.position,
|
||||||
accelerated: mempoolTx.acceleration || undefined,
|
accelerated: mempoolTx.acceleration || undefined,
|
||||||
acceleratedBy: mempoolTx.acceleratedBy || undefined,
|
acceleratedBy: mempoolTx.acceleratedBy || undefined,
|
||||||
|
acceleratedAt: mempoolTx.acceleratedAt || undefined,
|
||||||
},
|
},
|
||||||
accelerationPositions: memPool.getAccelerationPositions(mempoolTx.txid),
|
accelerationPositions: memPool.getAccelerationPositions(mempoolTx.txid),
|
||||||
};
|
};
|
||||||
@ -862,6 +863,7 @@ class WebsocketHandler {
|
|||||||
...mempoolTx.position,
|
...mempoolTx.position,
|
||||||
accelerated: mempoolTx.acceleration || undefined,
|
accelerated: mempoolTx.acceleration || undefined,
|
||||||
acceleratedBy: mempoolTx.acceleratedBy || undefined,
|
acceleratedBy: mempoolTx.acceleratedBy || undefined,
|
||||||
|
acceleratedAt: mempoolTx.acceleratedAt || undefined,
|
||||||
};
|
};
|
||||||
if (!mempoolTx.cpfpChecked) {
|
if (!mempoolTx.cpfpChecked) {
|
||||||
calculateCpfp(mempoolTx, newMempool);
|
calculateCpfp(mempoolTx, newMempool);
|
||||||
@ -1139,6 +1141,7 @@ class WebsocketHandler {
|
|||||||
...mempoolTx.position,
|
...mempoolTx.position,
|
||||||
accelerated: mempoolTx.acceleration || undefined,
|
accelerated: mempoolTx.acceleration || undefined,
|
||||||
acceleratedBy: mempoolTx.acceleratedBy || undefined,
|
acceleratedBy: mempoolTx.acceleratedBy || undefined,
|
||||||
|
acceleratedAt: mempoolTx.acceleratedAt || undefined,
|
||||||
},
|
},
|
||||||
accelerationPositions: memPool.getAccelerationPositions(mempoolTx.txid),
|
accelerationPositions: memPool.getAccelerationPositions(mempoolTx.txid),
|
||||||
});
|
});
|
||||||
@ -1160,6 +1163,7 @@ class WebsocketHandler {
|
|||||||
},
|
},
|
||||||
accelerated: mempoolTx.acceleration || undefined,
|
accelerated: mempoolTx.acceleration || undefined,
|
||||||
acceleratedBy: mempoolTx.acceleratedBy || undefined,
|
acceleratedBy: mempoolTx.acceleratedBy || undefined,
|
||||||
|
acceleratedAt: mempoolTx.acceleratedAt || undefined,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -112,6 +112,7 @@ export interface TransactionExtended extends IEsploraApi.Transaction {
|
|||||||
};
|
};
|
||||||
acceleration?: boolean;
|
acceleration?: boolean;
|
||||||
acceleratedBy?: number[];
|
acceleratedBy?: number[];
|
||||||
|
acceleratedAt?: number;
|
||||||
replacement?: boolean;
|
replacement?: boolean;
|
||||||
uid?: number;
|
uid?: number;
|
||||||
flags?: number;
|
flags?: number;
|
||||||
@ -434,7 +435,7 @@ export interface OptimizedStatistic {
|
|||||||
|
|
||||||
export interface TxTrackingInfo {
|
export interface TxTrackingInfo {
|
||||||
replacedBy?: string,
|
replacedBy?: string,
|
||||||
position?: { block: number, vsize: number, accelerated?: boolean, acceleratedBy?: number[] },
|
position?: { block: number, vsize: number, accelerated?: boolean, acceleratedBy?: number[], acceleratedAt?: number },
|
||||||
cpfp?: {
|
cpfp?: {
|
||||||
ancestors?: Ancestor[],
|
ancestors?: Ancestor[],
|
||||||
bestDescendant?: Ancestor | null,
|
bestDescendant?: Ancestor | null,
|
||||||
@ -446,6 +447,7 @@ export interface TxTrackingInfo {
|
|||||||
utxoSpent?: { [vout: number]: { vin: number, txid: string } },
|
utxoSpent?: { [vout: number]: { vin: number, txid: string } },
|
||||||
accelerated?: boolean,
|
accelerated?: boolean,
|
||||||
acceleratedBy?: number[],
|
acceleratedBy?: number[],
|
||||||
|
acceleratedAt?: number,
|
||||||
confirmed?: boolean
|
confirmed?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,6 +51,7 @@ interface AuditStatus {
|
|||||||
accelerated?: boolean;
|
accelerated?: boolean;
|
||||||
conflict?: boolean;
|
conflict?: boolean;
|
||||||
coinbase?: boolean;
|
coinbase?: boolean;
|
||||||
|
firstSeen?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
@ -325,7 +326,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
|||||||
const boostCost = acceleration.boostCost || acceleration.bidBoost;
|
const boostCost = acceleration.boostCost || acceleration.bidBoost;
|
||||||
acceleration.acceleratedFeeRate = Math.max(acceleration.effectiveFee, acceleration.effectiveFee + boostCost) / acceleration.effectiveVsize;
|
acceleration.acceleratedFeeRate = Math.max(acceleration.effectiveFee, acceleration.effectiveFee + boostCost) / acceleration.effectiveVsize;
|
||||||
acceleration.boost = boostCost;
|
acceleration.boost = boostCost;
|
||||||
|
this.tx.acceleratedAt = acceleration.added;
|
||||||
this.accelerationInfo = acceleration;
|
this.accelerationInfo = acceleration;
|
||||||
this.setIsAccelerated();
|
this.setIsAccelerated();
|
||||||
}
|
}
|
||||||
@ -368,6 +369,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
|||||||
const isAccelerated = audit.acceleratedTxs.includes(txid);
|
const isAccelerated = audit.acceleratedTxs.includes(txid);
|
||||||
const isConflict = audit.fullrbfTxs.includes(txid);
|
const isConflict = audit.fullrbfTxs.includes(txid);
|
||||||
const isExpected = audit.template.some(tx => tx.txid === txid);
|
const isExpected = audit.template.some(tx => tx.txid === txid);
|
||||||
|
const firstSeen = audit.template.find(tx => tx.txid === txid)?.time;
|
||||||
return {
|
return {
|
||||||
seen: isExpected || isPrioritized || isAccelerated,
|
seen: isExpected || isPrioritized || isAccelerated,
|
||||||
expected: isExpected,
|
expected: isExpected,
|
||||||
@ -375,6 +377,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
|||||||
prioritized: isPrioritized,
|
prioritized: isPrioritized,
|
||||||
conflict: isConflict,
|
conflict: isConflict,
|
||||||
accelerated: isAccelerated,
|
accelerated: isAccelerated,
|
||||||
|
firstSeen,
|
||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
retry({ count: 3, delay: 2000 }),
|
retry({ count: 3, delay: 2000 }),
|
||||||
@ -388,6 +391,9 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
|||||||
})
|
})
|
||||||
).subscribe(auditStatus => {
|
).subscribe(auditStatus => {
|
||||||
this.auditStatus = auditStatus;
|
this.auditStatus = auditStatus;
|
||||||
|
if (this.auditStatus?.firstSeen) {
|
||||||
|
this.transactionTime = this.auditStatus.firstSeen;
|
||||||
|
}
|
||||||
this.setIsAccelerated();
|
this.setIsAccelerated();
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -771,6 +777,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
|||||||
if (cpfpInfo.acceleration) {
|
if (cpfpInfo.acceleration) {
|
||||||
this.tx.acceleration = cpfpInfo.acceleration;
|
this.tx.acceleration = cpfpInfo.acceleration;
|
||||||
this.tx.acceleratedBy = cpfpInfo.acceleratedBy;
|
this.tx.acceleratedBy = cpfpInfo.acceleratedBy;
|
||||||
|
this.tx.acceleratedAt = cpfpInfo.acceleratedAt;
|
||||||
this.setIsAccelerated(firstCpfp);
|
this.setIsAccelerated(firstCpfp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ export interface Transaction {
|
|||||||
cpfpChecked?: boolean;
|
cpfpChecked?: boolean;
|
||||||
acceleration?: boolean;
|
acceleration?: boolean;
|
||||||
acceleratedBy?: number[];
|
acceleratedBy?: number[];
|
||||||
|
acceleratedAt?: number;
|
||||||
deleteAfter?: number;
|
deleteAfter?: number;
|
||||||
_unblinded?: any;
|
_unblinded?: any;
|
||||||
_deduced?: boolean;
|
_deduced?: boolean;
|
||||||
|
@ -30,6 +30,7 @@ export interface CpfpInfo {
|
|||||||
adjustedVsize?: number;
|
adjustedVsize?: number;
|
||||||
acceleration?: boolean;
|
acceleration?: boolean;
|
||||||
acceleratedBy?: number[];
|
acceleratedBy?: number[];
|
||||||
|
acceleratedAt?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface RbfInfo {
|
export interface RbfInfo {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user