diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts
index a2ae6d0c9..92abaab6d 100644
--- a/backend/src/api/websocket-handler.ts
+++ b/backend/src/api/websocket-handler.ts
@@ -332,11 +332,18 @@ class WebsocketHandler {
}
if (client['track-tx']) {
- const utxoSpent = newTransactions.some((tx) => {
- return tx.vin.some((vin) => vin.txid === client['track-tx']);
- });
- if (utxoSpent) {
- response['utxoSpent'] = true;
+ const outspends: object = {};
+ newTransactions.forEach((tx) => tx.vin.forEach((vin, i) => {
+ if (vin.txid === client['track-tx']) {
+ outspends[vin.vout] = {
+ vin: i,
+ txid: tx.txid,
+ };
+ }
+ }));
+
+ if (Object.keys(outspends).length) {
+ response['utxoSpent'] = outspends;
}
if (rbfTransactions[client['track-tx']]) {
@@ -414,7 +421,6 @@ class WebsocketHandler {
}
if (client['track-tx'] && txIds.indexOf(client['track-tx']) > -1) {
- client['track-tx'] = null;
response['txConfirmed'] = true;
}
diff --git a/frontend/src/app/components/hashrate-chart/hashrate-chart.component.html b/frontend/src/app/components/hashrate-chart/hashrate-chart.component.html
index eaa9fa809..c58861d36 100644
--- a/frontend/src/app/components/hashrate-chart/hashrate-chart.component.html
+++ b/frontend/src/app/components/hashrate-chart/hashrate-chart.component.html
@@ -25,13 +25,13 @@
-
+
diff --git a/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts b/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts
index a5f2b63b8..b5db5bb65 100644
--- a/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts
+++ b/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts
@@ -15,7 +15,7 @@ import { selectPowerOfTen } from 'src/app/bitcoin.utils';
styles: [`
.loadingGraphs {
position: absolute;
- top: 38%;
+ top: 50%;
left: calc(50% - 15px);
z-index: 100;
}
diff --git a/frontend/src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html b/frontend/src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html
index 8750caa56..69da008d2 100644
--- a/frontend/src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html
+++ b/frontend/src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html
@@ -25,7 +25,7 @@
-
diff --git a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html
index 9a820ce76..2fb47427f 100644
--- a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html
+++ b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html
@@ -2,11 +2,12 @@
+
Reward stats
-
+
Miners Reward
@@ -34,6 +35,31 @@
+
+
+
@@ -96,4 +122,4 @@
-
\ No newline at end of file
+
diff --git a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.scss b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.scss
index 828ee7ed0..fb2663812 100644
--- a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.scss
+++ b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.scss
@@ -44,7 +44,7 @@
.fade-border {
-webkit-mask-image: linear-gradient(to right, transparent 0%, black 10%, black 80%, transparent 100%)
}
-
+
.main-title {
position: relative;
color: #ffffff91;
@@ -56,39 +56,22 @@
padding-bottom: 3px;
}
-.general-stats {
- min-height: 56px;
- display: block;
- @media (min-width: 485px) {
- display: flex;
+.fee-estimation-container {
+ display: flex;
+ justify-content: space-between;
+ @media (min-width: 376px) {
flex-direction: row;
}
- h5 {
- margin-bottom: 10px;
- }
.item {
- width: 50%;
- margin: 0px auto 10px;
- display: inline-block;
- @media (min-width: 485px) {
- margin: 0px auto 10px;
+ max-width: 150px;
+ margin: 0;
+ width: -webkit-fill-available;
+ @media (min-width: 376px) {
+ margin: 0 auto 0px;
}
- @media (min-width: 785px) {
- margin: 0px auto 0px;
- }
- &:last-child {
- margin: 0px auto 0px;
- }
- &:nth-child(2) {
- order: 2;
+ &:first-child{
+ display: none;
@media (min-width: 485px) {
- order: 3;
- }
- }
- &:nth-child(3) {
- order: 3;
- @media (min-width: 485px) {
- order: 2;
display: block;
}
@media (min-width: 768px) {
@@ -98,48 +81,37 @@
display: block;
}
}
- .card-title {
- font-size: 1rem;
- color: #4a68b9;
+ &:last-child {
+ margin-bottom: 0;
}
- .card-text {
- font-size: 18px;
- span {
- color: #ffffff66;
- font-size: 12px;
- }
+ .card-text span {
+ color: #ffffff66;
+ font-size: 12px;
+ top: 0px;
+ }
+ .fee-text{
+ border-bottom: 1px solid #ffffff1c;
+ width: fit-content;
+ margin: auto;
+ line-height: 1.45;
+ padding: 0px 2px;
+ }
+ .fiat {
+ display: block;
+ font-size: 14px !important;
}
}
}
-.difficulty-adjustment-container {
- display: flex;
- flex-direction: row;
- justify-content: space-around;
- height: 76px;
- .shared-block {
- color: #ffffff66;
- font-size: 12px;
+.skeleton-loader {
+ width: 100%;
+ display: block;
+ &:first-child {
+ max-width: 90px;
+ margin: 15px auto 3px;
}
- .item {
- padding: 0 5px;
- width: 100%;
- &:nth-child(1) {
- display: none;
- @media (min-width: 485px) {
- display: table-cell;
- }
- @media (min-width: 768px) {
- display: none;
- }
- @media (min-width: 992px) {
- display: table-cell;
- }
- }
- }
- .card-text {
- font-size: 22px;
- margin-top: -9px;
- position: relative;
+ &:last-child {
+ margin: 10px auto 3px;
+ max-width: 55px;
}
}
diff --git a/frontend/src/app/components/pool-ranking/pool-ranking.component.html b/frontend/src/app/components/pool-ranking/pool-ranking.component.html
index 6bba39df4..9a1dc01b2 100644
--- a/frontend/src/app/components/pool-ranking/pool-ranking.component.html
+++ b/frontend/src/app/components/pool-ranking/pool-ranking.component.html
@@ -1,23 +1,25 @@
-
-
-
Pools luck (1w)
-
- {{ miningStats['minersLuck'] }}%
-
-
-
-
Blocks (1w)
-
- {{ miningStats.blockCount }}
-
-
-
-
Pools count (1w)
-
- {{ miningStats.pools.length }}
-
+
+
+
+
Pools luck (1w)
+
+ {{ miningStats['minersLuck'] }}%
+
+
+
+
Blocks (1w)
+
+ {{ miningStats.blockCount }}
+
+
+
+
Pools count (1w)
+
+ {{ miningStats.pools.length }}
+
+
@@ -96,3 +98,27 @@
+
+
+
+
+
+
Pools luck (1w)
+
+
+
+
+
+
+
Pools count (1w)
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/app/components/pool-ranking/pool-ranking.component.scss b/frontend/src/app/components/pool-ranking/pool-ranking.component.scss
index f73486395..d25148df1 100644
--- a/frontend/src/app/components/pool-ranking/pool-ranking.component.scss
+++ b/frontend/src/app/components/pool-ranking/pool-ranking.component.scss
@@ -102,4 +102,11 @@
}
}
}
-}
\ No newline at end of file
+}
+
+.skeleton-loader {
+ width: 100%;
+ display: block;
+ max-width: 80px;
+ margin: 15px auto 3px;
+}
diff --git a/frontend/src/app/components/pool-ranking/pool-ranking.component.ts b/frontend/src/app/components/pool-ranking/pool-ranking.component.ts
index 64641c31d..01b36ab74 100644
--- a/frontend/src/app/components/pool-ranking/pool-ranking.component.ts
+++ b/frontend/src/app/components/pool-ranking/pool-ranking.component.ts
@@ -1,4 +1,4 @@
-import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';
+import { ChangeDetectionStrategy, Component, Input, NgZone, OnInit } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms';
import { Router } from '@angular/router';
import { EChartsOption, PieSeriesOption } from 'echarts';
@@ -41,6 +41,7 @@ export class PoolRankingComponent implements OnInit {
private miningService: MiningService,
private seoService: SeoService,
private router: Router,
+ private zone: NgZone,
) {
}
@@ -293,7 +294,9 @@ export class PoolRankingComponent implements OnInit {
if (e.data.data === 9999) { // "Other"
return;
}
- this.router.navigate(['/mining/pool/', e.data.data]);
+ this.zone.run(() => {
+ this.router.navigate(['/mining/pool/', e.data.data]);
+ });
});
}
diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.html b/frontend/src/app/components/transactions-list/transactions-list.component.html
index 200356ffd..1470e6211 100644
--- a/frontend/src/app/components/transactions-list/transactions-list.component.html
+++ b/frontend/src/app/components/transactions-list/transactions-list.component.html
@@ -186,16 +186,16 @@
-
-
+ |
+
-
+
-
+
diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.ts b/frontend/src/app/components/transactions-list/transactions-list.component.ts
index fd3cf0241..7d3c5d0e4 100644
--- a/frontend/src/app/components/transactions-list/transactions-list.component.ts
+++ b/frontend/src/app/components/transactions-list/transactions-list.component.ts
@@ -1,11 +1,11 @@
-import { Component, OnInit, Input, ChangeDetectionStrategy, OnChanges, Output, EventEmitter } from '@angular/core';
+import { Component, OnInit, Input, ChangeDetectionStrategy, OnChanges, Output, EventEmitter, ChangeDetectorRef } from '@angular/core';
import { StateService } from '../../services/state.service';
-import { Observable, forkJoin, ReplaySubject, BehaviorSubject, merge } from 'rxjs';
+import { Observable, forkJoin, ReplaySubject, BehaviorSubject, merge, of, Subject, Subscription } from 'rxjs';
import { Outspend, Transaction } from '../../interfaces/electrs.interface';
import { ElectrsApiService } from '../../services/electrs-api.service';
import { environment } from 'src/environments/environment';
import { AssetsService } from 'src/app/services/assets.service';
-import { map, share, switchMap } from 'rxjs/operators';
+import { map, share, switchMap, tap } from 'rxjs/operators';
import { BlockExtended } from 'src/app/interfaces/node-api.interface';
@Component({
@@ -27,41 +27,18 @@ export class TransactionsListComponent implements OnInit, OnChanges {
@Output() loadMore = new EventEmitter();
latestBlock$: Observable;
- outspends$: Observable;
+ outspendsSubscription: Subscription;
refreshOutspends$: ReplaySubject |