diff --git a/backend/package-lock.json b/backend/package-lock.json
index 5b99f1e34..a81a848e6 100644
--- a/backend/package-lock.json
+++ b/backend/package-lock.json
@@ -18,7 +18,7 @@
"crypto-js": "~4.2.0",
"express": "~4.19.2",
"maxmind": "~4.3.11",
- "mysql2": "~3.9.7",
+ "mysql2": "~3.10.0",
"redis": "^4.6.6",
"rust-gbt": "file:./rust-gbt",
"socks-proxy-agent": "~7.0.0",
@@ -6197,9 +6197,9 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"node_modules/mysql2": {
- "version": "3.9.7",
- "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.7.tgz",
- "integrity": "sha512-KnJT8vYRcNAZv73uf9zpXqNbvBG7DJrs+1nACsjZP1HMJ1TgXEy8wnNilXAn/5i57JizXKtrUtwDB7HxT9DDpw==",
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.10.0.tgz",
+ "integrity": "sha512-qx0mfWYt1DpTPkw8mAcHW/OwqqyNqBLBHvY5IjN8+icIYTjt6znrgYJ+gxqNNRpVknb5Wc/gcCM4XjbCR0j5tw==",
"dependencies": {
"denque": "^2.1.0",
"generate-function": "^2.3.1",
@@ -12382,9 +12382,9 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"mysql2": {
- "version": "3.9.7",
- "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.7.tgz",
- "integrity": "sha512-KnJT8vYRcNAZv73uf9zpXqNbvBG7DJrs+1nACsjZP1HMJ1TgXEy8wnNilXAn/5i57JizXKtrUtwDB7HxT9DDpw==",
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.10.0.tgz",
+ "integrity": "sha512-qx0mfWYt1DpTPkw8mAcHW/OwqqyNqBLBHvY5IjN8+icIYTjt6znrgYJ+gxqNNRpVknb5Wc/gcCM4XjbCR0j5tw==",
"requires": {
"denque": "^2.1.0",
"generate-function": "^2.3.1",
diff --git a/backend/package.json b/backend/package.json
index 8853d6370..e4e4c9e2f 100644
--- a/backend/package.json
+++ b/backend/package.json
@@ -47,7 +47,7 @@
"crypto-js": "~4.2.0",
"express": "~4.19.2",
"maxmind": "~4.3.11",
- "mysql2": "~3.9.7",
+ "mysql2": "~3.10.0",
"rust-gbt": "file:./rust-gbt",
"redis": "^4.6.6",
"socks-proxy-agent": "~7.0.0",
diff --git a/frontend/src/app/components/acceleration/active-acceleration-box/active-acceleration-box.component.html b/frontend/src/app/components/acceleration/active-acceleration-box/active-acceleration-box.component.html
index 75e821e9f..d009a5e63 100644
--- a/frontend/src/app/components/acceleration/active-acceleration-box/active-acceleration-box.component.html
+++ b/frontend/src/app/components/acceleration/active-acceleration-box/active-acceleration-box.component.html
@@ -1,8 +1,8 @@
- Accelerated to |
-
+ | Accelerated to |
+
@if (accelerationInfo?.acceleratedFeeRate && (!tx.effectiveFeePerVsize || accelerationInfo.acceleratedFeeRate >= tx.effectiveFeePerVsize)) {
@@ -11,24 +11,30 @@
}
|
-
-
-
+
+
+ @if (tx && (tx.acceleratedBy || accelerationInfo) && miningStats) {
+
+ } @else {
+
+ }
|
|
- Accelerated by |
-
- {{ acceleratedByPercentage }} of hashrate
+ | Accelerated by |
+
+ {{ acceleratedByPercentage }} of hashrate
|
diff --git a/frontend/src/app/components/acceleration/active-acceleration-box/active-acceleration-box.component.scss b/frontend/src/app/components/acceleration/active-acceleration-box/active-acceleration-box.component.scss
index 6dba0b06f..12849dc65 100644
--- a/frontend/src/app/components/acceleration/active-acceleration-box/active-acceleration-box.component.scss
+++ b/frontend/src/app/components/acceleration/active-acceleration-box/active-acceleration-box.component.scss
@@ -1,9 +1,50 @@
.td-width {
- width: 150px;
- min-width: 150px;
+ width: 150px;
+ min-width: 150px;
- @media (max-width: 768px) {
- width: 175px;
- min-width: 175px;
- }
+ @media (max-width: 768px) {
+ width: 175px;
+ min-width: 175px;
+ }
+}
+
+.field-label {
+ @media (max-width: 849px) {
+ text-align: left;
+ }
+ @media (max-width: 649px) {
+ width: auto;
+ min-width: auto;
+ }
+}
+
+.field-value {
+ @media (max-width: 849px) {
+ width: 100%;
+ }
+
+ .hashrate-label {
+ @media (max-width: 420px) {
+ display: none;
+ }
+ }
+}
+
+.pie-chart {
+ width: 100%;
+ vertical-align: middle;
+ text-align: center;
+
+ .chart-container {
+ width: 72px;
+ height: 100%;
+ margin-left: auto;
+ }
+
+ @media (max-width: 850px) {
+ width: 150px;
+ }
+ @media (max-width: 420px) {
+ padding-left: 0;
+ }
}
\ No newline at end of file
diff --git a/frontend/src/app/components/acceleration/active-acceleration-box/active-acceleration-box.component.ts b/frontend/src/app/components/acceleration/active-acceleration-box/active-acceleration-box.component.ts
index b6719f906..f52c45041 100644
--- a/frontend/src/app/components/acceleration/active-acceleration-box/active-acceleration-box.component.ts
+++ b/frontend/src/app/components/acceleration/active-acceleration-box/active-acceleration-box.component.ts
@@ -83,7 +83,7 @@ export class ActiveAccelerationBox implements OnChanges {
this.acceleratedByPercentage = ((totalAcceleratedHashrate / parseFloat(this.miningStats.lastEstimatedHashrate)) * 100).toFixed(1) + '%';
data.push(getDataItem(
totalAcceleratedHashrate,
- 'var(--tertiary)',
+ 'var(--mainnet-alt)',
`${this.acceleratedByPercentage} accelerating`,
) as PieSeriesOption);
const notAcceleratedByPercentage = ((1 - (totalAcceleratedHashrate / parseFloat(this.miningStats.lastEstimatedHashrate))) * 100).toFixed(1) + '%';
diff --git a/frontend/src/app/components/blockchain/blockchain.component.scss b/frontend/src/app/components/blockchain/blockchain.component.scss
index 700f57a27..1488d262a 100644
--- a/frontend/src/app/components/blockchain/blockchain.component.scss
+++ b/frontend/src/app/components/blockchain/blockchain.component.scss
@@ -71,7 +71,7 @@
color: var(--fg);
font-size: 0.8rem;
position: absolute;
- bottom: 15.8em;
+ bottom: 16.1em;
left: 1px;
transform: translateX(-50%) rotate(90deg);
background: none;
diff --git a/frontend/src/app/components/pool/pool.component.ts b/frontend/src/app/components/pool/pool.component.ts
index 3d2d0ac81..2648bc4ca 100644
--- a/frontend/src/app/components/pool/pool.component.ts
+++ b/frontend/src/app/components/pool/pool.component.ts
@@ -1,7 +1,7 @@
import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { echarts, EChartsOption } from '../../graphs/echarts';
-import { BehaviorSubject, Observable, combineLatest, of, timer } from 'rxjs';
+import { BehaviorSubject, Observable, Subscription, combineLatest, of } from 'rxjs';
import { catchError, distinctUntilChanged, filter, map, share, switchMap, tap } from 'rxjs/operators';
import { BlockExtended, PoolStat } from '../../interfaces/node-api.interface';
import { ApiService } from '../../services/api.service';
@@ -28,6 +28,7 @@ export class PoolComponent implements OnInit {
gfg = true;
formatNumber = formatNumber;
+ slugSubscription: Subscription;
poolStats$: Observable;
blocks$: Observable;
oobFees$: Observable;
@@ -56,38 +57,24 @@ export class PoolComponent implements OnInit {
}
ngOnInit(): void {
- this.poolStats$ = this.route.params.pipe(map((params) => params.slug))
+ this.slugSubscription = this.route.params.pipe(map((params) => params.slug)).subscribe((slug) => {
+ this.isLoading = true;
+ this.blocks = [];
+ this.chartOptions = {};
+ this.slug = slug;
+ this.initializeObservables();
+ });
+ }
+
+ initializeObservables(): void {
+ this.poolStats$ = this.apiService.getPoolHashrate$(this.slug)
.pipe(
- switchMap((slug: any) => {
- this.isLoading = true;
- this.slug = slug;
- return this.apiService.getPoolHashrate$(this.slug)
- .pipe(
- switchMap((data) => {
- this.isLoading = false;
- const hashrate = data.map(val => [val.timestamp * 1000, val.avgHashrate]);
- const share = data.map(val => [val.timestamp * 1000, val.share * 100]);
- this.prepareChartOptions(hashrate, share);
- return [slug];
- }),
- catchError(() => {
- this.isLoading = false;
- this.seoService.logSoft404();
- return of([slug]);
- })
- );
- }),
- switchMap((slug) => {
- return this.apiService.getPoolStats$(slug).pipe(
- catchError(() => {
- this.isLoading = false;
- this.seoService.logSoft404();
- return of(null);
- })
- );
- }),
- tap(() => {
- this.loadMoreSubject.next(this.blocks[0]?.height);
+ switchMap((data) => {
+ this.isLoading = false;
+ const hashrate = data.map(val => [val.timestamp * 1000, val.avgHashrate]);
+ const share = data.map(val => [val.timestamp * 1000, val.share * 100]);
+ this.prepareChartOptions(hashrate, share);
+ return this.apiService.getPoolStats$(this.slug);
}),
map((poolStats) => {
this.seoService.setTitle(poolStats.pool.name);
@@ -101,7 +88,12 @@ export class PoolComponent implements OnInit {
return Object.assign({
logo: `/resources/mining-pools/` + poolStats.pool.slug + '.svg'
}, poolStats);
- })
+ }),
+ catchError(() => {
+ this.isLoading = false;
+ this.seoService.logSoft404();
+ return of(null);
+ }),
);
this.blocks$ = this.loadMoreSubject
@@ -328,4 +320,8 @@ export class PoolComponent implements OnInit {
trackByBlock(index: number, block: BlockExtended) {
return block.height;
}
+
+ ngOnDestroy(): void {
+ this.slugSubscription.unsubscribe();
+ }
}
diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts
index a76720752..2b2ed8060 100644
--- a/frontend/src/app/components/transaction/transaction.component.ts
+++ b/frontend/src/app/components/transaction/transaction.component.ts
@@ -380,7 +380,12 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
this.txInBlockIndex = this.mempoolPosition.block;
if (txPosition.cpfp !== undefined) {
+ if (txPosition.position.acceleratedBy) {
+ txPosition.cpfp.acceleratedBy = txPosition.position.acceleratedBy;
+ }
this.setCpfpInfo(txPosition.cpfp);
+ } else if ((this.tx?.acceleration && txPosition.position.acceleratedBy)) {
+ this.tx.acceleratedBy = txPosition.position.acceleratedBy;
}
}
} else {
diff --git a/frontend/src/app/lightning/group/group.component.ts b/frontend/src/app/lightning/group/group.component.ts
index 4c2cd4dd9..ea83653c2 100644
--- a/frontend/src/app/lightning/group/group.component.ts
+++ b/frontend/src/app/lightning/group/group.component.ts
@@ -80,6 +80,12 @@ export class GroupComponent implements OnInit {
};
}
}
+
+ nodes.map((node) => {
+ node.channels = node.opened_channel_count;
+ return node;
+ });
+
const sumLiquidity = nodes.reduce((partialSum, a) => partialSum + parseInt(a.capacity, 10), 0);
const sumChannels = nodes.reduce((partialSum, a) => partialSum + a.opened_channel_count, 0);