-
+
First seen
@@ -80,7 +80,7 @@
} @else {
}
-
+
@if (!tx.status.confirmed) {
@@ -113,7 +113,10 @@
} @else {
}
-
+
@if (tx.status.confirmed) {
@@ -130,4 +133,10 @@
+
+
+
diff --git a/frontend/src/app/components/acceleration-timeline/acceleration-timeline.component.scss b/frontend/src/app/components/acceleration-timeline/acceleration-timeline.component.scss
index 93a0cdba1..f351a0114 100644
--- a/frontend/src/app/components/acceleration-timeline/acceleration-timeline.component.scss
+++ b/frontend/src/app/components/acceleration-timeline/acceleration-timeline.component.scss
@@ -152,9 +152,16 @@
margin-bottom: -8px;
transform: translateY(-50%);
border-radius: 50%;
- cursor: pointer;
padding: 4px;
background: transparent;
+ transition: background-color 300ms, padding 300ms;
+
+ &.hovering {
+ cursor: pointer;
+ &:hover {
+ padding: 0px;
+ }
+ }
.shape {
position: relative;
diff --git a/frontend/src/app/components/acceleration-timeline/acceleration-timeline.component.ts b/frontend/src/app/components/acceleration-timeline/acceleration-timeline.component.ts
index c8dbed72b..da0eee4a3 100644
--- a/frontend/src/app/components/acceleration-timeline/acceleration-timeline.component.ts
+++ b/frontend/src/app/components/acceleration-timeline/acceleration-timeline.component.ts
@@ -1,6 +1,8 @@
-import { Component, Input, OnInit, OnChanges } from '@angular/core';
+import { Component, Input, OnInit, OnChanges, HostListener } from '@angular/core';
import { ETA } from '../../services/eta.service';
import { Transaction } from '../../interfaces/electrs.interface';
+import { Acceleration, SinglePoolStats } from '../../interfaces/node-api.interface';
+import { MiningService } from '../../services/mining.service';
@Component({
selector: 'app-acceleration-timeline',
@@ -10,6 +12,7 @@ import { Transaction } from '../../interfaces/electrs.interface';
export class AccelerationTimelineComponent implements OnInit, OnChanges {
@Input() transactionTime: number;
@Input() tx: Transaction;
+ @Input() accelerationInfo: Acceleration;
@Input() eta: ETA;
// A mined transaction has standard ETA and accelerated ETA undefined
// A transaction in mempool has either standardETA defined (if accelerated) or acceleratedETA defined (if not accelerated yet)
@@ -22,13 +25,25 @@ export class AccelerationTimelineComponent implements OnInit, OnChanges {
useAbsoluteTime: boolean = false;
interval: number;
- constructor() {}
+ tooltipPosition = null;
+ hoverInfo: any = null;
+ poolsData: { [id: number]: SinglePoolStats } = {};
+
+ constructor(
+ private miningService: MiningService,
+ ) {}
ngOnInit(): void {
this.acceleratedAt = this.tx.acceleratedAt ?? new Date().getTime() / 1000;
this.now = Math.floor(new Date().getTime() / 1000);
this.useAbsoluteTime = this.tx.status.block_time < this.now - 7 * 24 * 3600;
+ this.miningService.getPools().subscribe(pools => {
+ for (const pool of pools) {
+ this.poolsData[pool.unique_id] = pool;
+ }
+ });
+
this.interval = window.setInterval(() => {
this.now = Math.floor(new Date().getTime() / 1000);
this.useAbsoluteTime = this.tx.status.block_time < this.now - 7 * 24 * 3600;
@@ -52,4 +67,42 @@ export class AccelerationTimelineComponent implements OnInit, OnChanges {
ngOnDestroy(): void {
clearInterval(this.interval);
}
+
+ onHover(event, status: string): void {
+ if (status === 'seen') {
+ this.hoverInfo = {
+ status,
+ fee: this.tx.fee,
+ weight: this.tx.weight
+ };
+ } else if (status === 'accelerated') {
+ this.hoverInfo = {
+ status,
+ fee: this.accelerationInfo?.effectiveFee || this.tx.fee,
+ weight: this.tx.weight,
+ feeDelta: this.accelerationInfo?.feeDelta || this.tx.feeDelta,
+ pools: this.tx.acceleratedBy || this.accelerationInfo?.pools,
+ poolsData: this.poolsData
+ };
+ } else if (status === 'mined') {
+ this.hoverInfo = {
+ status,
+ fee: this.accelerationInfo?.effectiveFee,
+ weight: this.tx.weight,
+ bidBoost: this.accelerationInfo?.bidBoost,
+ minedByPoolUniqueId: this.accelerationInfo?.minedByPoolUniqueId,
+ pools: this.tx.acceleratedBy || this.accelerationInfo?.pools,
+ poolsData: this.poolsData
+ };
+ }
+ }
+
+ onBlur(event): void {
+ this.hoverInfo = null;
+ }
+
+ @HostListener('pointermove', ['$event'])
+ onPointerMove(event) {
+ this.tooltipPosition = { x: event.clientX, y: event.clientY };
+ }
}
diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html
index 9ce22d26c..a6a985fb0 100644
--- a/frontend/src/app/components/transaction/transaction.component.html
+++ b/frontend/src/app/components/transaction/transaction.component.html
@@ -167,7 +167,7 @@
Acceleration Timeline
-
+
diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts
index 313a43e1f..89bcfafbb 100644
--- a/frontend/src/app/shared/shared.module.ts
+++ b/frontend/src/app/shared/shared.module.ts
@@ -68,6 +68,7 @@ import { AddressTransactionsWidgetComponent } from '../components/address-transa
import { RbfTimelineComponent } from '../components/rbf-timeline/rbf-timeline.component';
import { AccelerationTimelineComponent } from '../components/acceleration-timeline/acceleration-timeline.component';
import { RbfTimelineTooltipComponent } from '../components/rbf-timeline/rbf-timeline-tooltip.component';
+import { AccelerationTimelineTooltipComponent } from '../components/acceleration-timeline/acceleration-timeline-tooltip.component';
import { PushTransactionComponent } from '../components/push-transaction/push-transaction.component';
import { TestTransactionsComponent } from '../components/test-transactions/test-transactions.component';
import { AssetsFeaturedComponent } from '../components/assets/assets-featured/assets-featured.component';
@@ -180,6 +181,7 @@ import { OnlyVsizeDirective, OnlyWeightDirective } from './components/weight-dir
RbfTimelineComponent,
AccelerationTimelineComponent,
RbfTimelineTooltipComponent,
+ AccelerationTimelineTooltipComponent,
PushTransactionComponent,
TestTransactionsComponent,
AssetsNavComponent,
@@ -320,6 +322,7 @@ import { OnlyVsizeDirective, OnlyWeightDirective } from './components/weight-dir
RbfTimelineComponent,
AccelerationTimelineComponent,
RbfTimelineTooltipComponent,
+ AccelerationTimelineTooltipComponent,
PushTransactionComponent,
TestTransactionsComponent,
AssetsNavComponent,