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 @@ - - + - - - + 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);
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