From 2907054a01945d5a13bcd8c540d7d6a71098fec8 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 8 Mar 2023 02:14:41 -0600 Subject: [PATCH 01/22] Update pool ranking block count when new blocks arrive --- .../app/components/pool-ranking/pool-ranking.component.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 a3f23c031..0f2103024 100644 --- a/frontend/src/app/components/pool-ranking/pool-ranking.component.ts +++ b/frontend/src/app/components/pool-ranking/pool-ranking.component.ts @@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, Component, Input, NgZone, OnInit, HostBinding import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; import { EChartsOption, PieSeriesOption } from 'echarts'; -import { concat, Observable } from 'rxjs'; +import { merge, Observable } from 'rxjs'; import { map, share, startWith, switchMap, tap } from 'rxjs/operators'; import { SeoService } from '../../services/seo.service'; import { StorageService } from '../..//services/storage.service'; @@ -73,7 +73,7 @@ export class PoolRankingComponent implements OnInit { } }); - this.miningStatsObservable$ = concat( + this.miningStatsObservable$ = merge( this.radioGroupForm.get('dateSpan').valueChanges .pipe( startWith(this.radioGroupForm.controls.dateSpan.value), // (trigger when the page loads) @@ -89,7 +89,7 @@ export class PoolRankingComponent implements OnInit { return this.miningService.getMiningStats(this.miningWindowPreference); }) ), - this.stateService.blocks$ + this.stateService.chainTip$ .pipe( switchMap(() => { return this.miningService.getMiningStats(this.miningWindowPreference); From c3c0696844445280d2522812981bc66c6b761256 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 8 Mar 2023 02:15:15 -0600 Subject: [PATCH 02/22] Update hashrate estimate when new blocks arrive --- .../hashrate-chart.component.ts | 149 +++++++++--------- 1 file changed, 78 insertions(+), 71 deletions(-) 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 53bb33be3..fcff0dddb 100644 --- a/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts +++ b/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, OnInit, HostBinding } from '@angular/core'; import { EChartsOption, graphic } from 'echarts'; -import { Observable } from 'rxjs'; -import { map, share, startWith, switchMap, tap } from 'rxjs/operators'; +import { merge, Observable, of } from 'rxjs'; +import { map, mergeMap, share, startWith, switchMap, tap } from 'rxjs/operators'; import { ApiService } from '../../services/api.service'; import { SeoService } from '../../services/seo.service'; import { formatNumber } from '@angular/common'; @@ -84,77 +84,84 @@ export class HashrateChartComponent implements OnInit { } }); - this.hashrateObservable$ = this.radioGroupForm.get('dateSpan').valueChanges - .pipe( - startWith(this.radioGroupForm.controls.dateSpan.value), - switchMap((timespan) => { - if (!this.widget && !firstRun) { - this.storageService.setValue('miningWindowPreference', timespan); - } - this.timespan = timespan; - firstRun = false; - this.miningWindowPreference = timespan; - this.isLoading = true; - return this.apiService.getHistoricalHashrate$(timespan) - .pipe( - tap((response) => { - const data = response.body; + this.hashrateObservable$ = merge( + this.radioGroupForm.get('dateSpan').valueChanges + .pipe( + startWith(this.radioGroupForm.controls.dateSpan.value), + switchMap((timespan) => { + if (!this.widget && !firstRun) { + this.storageService.setValue('miningWindowPreference', timespan); + } + this.timespan = timespan; + firstRun = false; + this.miningWindowPreference = timespan; + this.isLoading = true; + return this.apiService.getHistoricalHashrate$(this.timespan); + }) + ), + this.stateService.chainTip$ + .pipe( + switchMap(() => { + return this.apiService.getHistoricalHashrate$(this.timespan); + }) + ) + ).pipe( + tap((response: any) => { + const data = response.body; - // We generate duplicated data point so the tooltip works nicely - const diffFixed = []; - let diffIndex = 1; - let hashIndex = 0; - while (hashIndex < data.hashrates.length) { - if (diffIndex >= data.difficulty.length) { - while (hashIndex < data.hashrates.length) { - diffFixed.push({ - timestamp: data.hashrates[hashIndex].timestamp, - difficulty: data.difficulty.length > 0 ? data.difficulty[data.difficulty.length - 1].difficulty : null - }); - ++hashIndex; - } - break; - } - - while (hashIndex < data.hashrates.length && diffIndex < data.difficulty.length && - data.hashrates[hashIndex].timestamp <= data.difficulty[diffIndex].time - ) { - diffFixed.push({ - timestamp: data.hashrates[hashIndex].timestamp, - difficulty: data.difficulty[diffIndex - 1].difficulty - }); - ++hashIndex; - } - ++diffIndex; - } - - let maResolution = 15; - const hashrateMa = []; - for (let i = maResolution - 1; i < data.hashrates.length; ++i) { - let avg = 0; - for (let y = maResolution - 1; y >= 0; --y) { - avg += data.hashrates[i - y].avgHashrate; - } - avg /= maResolution; - hashrateMa.push([data.hashrates[i].timestamp * 1000, avg]); - } - - this.prepareChartOptions({ - hashrates: data.hashrates.map(val => [val.timestamp * 1000, val.avgHashrate]), - difficulty: diffFixed.map(val => [val.timestamp * 1000, val.difficulty]), - hashrateMa: hashrateMa, + // We generate duplicated data point so the tooltip works nicely + const diffFixed = []; + let diffIndex = 1; + let hashIndex = 0; + while (hashIndex < data.hashrates.length) { + if (diffIndex >= data.difficulty.length) { + while (hashIndex < data.hashrates.length) { + diffFixed.push({ + timestamp: data.hashrates[hashIndex].timestamp, + difficulty: data.difficulty.length > 0 ? data.difficulty[data.difficulty.length - 1].difficulty : null }); - this.isLoading = false; - }), - map((response) => { - const data = response.body; - return { - blockCount: parseInt(response.headers.get('x-total-count'), 10), - currentDifficulty: data.currentDifficulty, - currentHashrate: data.currentHashrate, - }; - }), - ); + ++hashIndex; + } + break; + } + + while (hashIndex < data.hashrates.length && diffIndex < data.difficulty.length && + data.hashrates[hashIndex].timestamp <= data.difficulty[diffIndex].time + ) { + diffFixed.push({ + timestamp: data.hashrates[hashIndex].timestamp, + difficulty: data.difficulty[diffIndex - 1].difficulty + }); + ++hashIndex; + } + ++diffIndex; + } + + let maResolution = 15; + const hashrateMa = []; + for (let i = maResolution - 1; i < data.hashrates.length; ++i) { + let avg = 0; + for (let y = maResolution - 1; y >= 0; --y) { + avg += data.hashrates[i - y].avgHashrate; + } + avg /= maResolution; + hashrateMa.push([data.hashrates[i].timestamp * 1000, avg]); + } + + this.prepareChartOptions({ + hashrates: data.hashrates.map(val => [val.timestamp * 1000, val.avgHashrate]), + difficulty: diffFixed.map(val => [val.timestamp * 1000, val.difficulty]), + hashrateMa: hashrateMa, + }); + this.isLoading = false; + }), + map((response) => { + const data = response.body; + return { + blockCount: parseInt(response.headers.get('x-total-count'), 10), + currentDifficulty: data.currentDifficulty, + currentHashrate: data.currentHashrate, + }; }), share() ); From a8214bcbbde8ce8100910f1bf2e0da3aff38a13a Mon Sep 17 00:00:00 2001 From: wiz Date: Thu, 9 Mar 2023 14:24:18 +0900 Subject: [PATCH 03/22] Add old special block events to app constants --- frontend/src/app/app.constants.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/app.constants.ts b/frontend/src/app/app.constants.ts index bd8fc46eb..f15733bb0 100644 --- a/frontend/src/app/app.constants.ts +++ b/frontend/src/app/app.constants.ts @@ -136,12 +136,28 @@ export const languages: Language[] = [ ]; export const specialBlocks = { + '0': { + labelEvent: 'Genesis', + labelEventCompleted: 'The Genesis of Bitcoin', + }, + '210000': { + labelEvent: 'Bitcoin\'s 1st Halving', + labelEventCompleted: 'Block Subsidy has halved to 25 BTC per block', + }, + '420000': { + labelEvent: 'Bitcoin\'s 2nd Halving', + labelEventCompleted: 'Block Subsidy has halved to 12.5 BTC per block', + }, + '630000': { + labelEvent: 'Bitcoin\'s 3rd Halving', + labelEventCompleted: 'Block Subsidy has halved to 6.25 BTC per block', + }, '709632': { labelEvent: 'Taproot 🌱 activation', labelEventCompleted: 'Taproot 🌱 has been activated!', }, '840000': { - labelEvent: 'Halving 🥳', + labelEvent: 'Bitcoin\'s 4th Halving', labelEventCompleted: 'Block Subsidy has halved to 3.125 BTC per block', } }; From 37e94249dfe995a86e68ac5946b3ee95944d4356 Mon Sep 17 00:00:00 2001 From: softsimon Date: Thu, 9 Mar 2023 15:30:04 +0900 Subject: [PATCH 04/22] Fixing Channels and Capacity i18n strings --- .../node-statistics-chart.component.ts | 8 +- frontend/src/locale/messages.xlf | 376 +++++++++--------- 2 files changed, 198 insertions(+), 186 deletions(-) diff --git a/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts b/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts index 91384b31b..7518b33da 100644 --- a/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts +++ b/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts @@ -146,7 +146,7 @@ export class NodeStatisticsChartComponent implements OnInit { padding: 10, data: [ { - name: 'Channels', + name: $localize`:@@807cf11e6ac1cde912496f764c176bdfdd6b7e19:Channels`, inactiveColor: 'rgb(110, 112, 121)', textStyle: { color: 'white', @@ -154,7 +154,7 @@ export class NodeStatisticsChartComponent implements OnInit { icon: 'roundRect', }, { - name: 'Capacity', + name: $localize`:@@ce9dfdc6dccb28dc75a78c704e09dc18fb02dcfa:Capacity`, inactiveColor: 'rgb(110, 112, 121)', textStyle: { color: 'white', @@ -201,7 +201,7 @@ export class NodeStatisticsChartComponent implements OnInit { series: data.channels.length === 0 ? [] : [ { zlevel: 1, - name: 'Channels', + name: $localize`:@@807cf11e6ac1cde912496f764c176bdfdd6b7e19:Channels`, showSymbol: false, symbol: 'none', data: data.channels, @@ -224,7 +224,7 @@ export class NodeStatisticsChartComponent implements OnInit { { zlevel: 0, yAxisIndex: 1, - name: 'Capacity', + name: $localize`:@@ce9dfdc6dccb28dc75a78c704e09dc18fb02dcfa:Capacity`, showSymbol: false, symbol: 'none', stack: 'Total', diff --git a/frontend/src/locale/messages.xlf b/frontend/src/locale/messages.xlf index 49d42a2f1..48c7da18d 100644 --- a/frontend/src/locale/messages.xlf +++ b/frontend/src/locale/messages.xlf @@ -995,7 +995,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1124,11 +1124,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1144,11 +1144,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1165,7 +1165,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1466,7 +1466,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -1893,7 +1893,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -1939,7 +1939,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -1959,7 +1959,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -1998,7 +1998,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2023,7 +2023,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2044,7 +2044,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2137,11 +2137,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2170,7 +2170,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2239,7 +2239,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2277,7 +2277,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2293,7 +2293,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2333,7 +2333,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2360,7 +2360,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2651,11 +2651,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2692,7 +2692,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3117,7 +3117,7 @@ Mining src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3125,7 +3125,7 @@ Pools Ranking src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3137,7 +3137,7 @@ Pools Dominance src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3149,7 +3149,7 @@ Hashrate & Difficulty src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3157,7 +3157,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3165,7 +3165,7 @@ Lightning Nodes Per Network src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3185,7 +3185,7 @@ Lightning Network Capacity src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3205,7 +3205,7 @@ Lightning Nodes Per ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3217,7 +3217,7 @@ Lightning Nodes Per Country src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3233,7 +3233,7 @@ Lightning Nodes World Map src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3249,7 +3249,7 @@ Lightning Nodes Channels World Map src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3269,11 +3269,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3301,11 +3301,11 @@ Hashrate (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3828,7 +3828,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4030,7 +4030,7 @@ Filter src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4038,7 +4038,7 @@ Invert src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4046,200 +4046,192 @@ Transaction vBytes per second (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second Just now - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 78 ago - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 97 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 98 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 99 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 100 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 101 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 102 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 110 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 111 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 112 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 113 + + + + In ~ + + src/app/components/time/time.component.ts + 120 + + + src/app/components/time/time.component.ts + 121 + + + src/app/components/time/time.component.ts + 122 + + + src/app/components/time/time.component.ts + 123 + + + src/app/components/time/time.component.ts + 124 + + + src/app/components/time/time.component.ts + 125 + + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 133 + + + src/app/components/time/time.component.ts + 134 + + + src/app/components/time/time.component.ts + 135 + + + src/app/components/time/time.component.ts + 136 After - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 143 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 144 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 145 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 146 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 147 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 148 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 156 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 157 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 158 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 159 @@ -4363,7 +4355,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4380,7 +4372,7 @@ Show more src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4396,7 +4388,7 @@ Show less src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4408,7 +4400,7 @@ Show diagram src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4416,7 +4408,7 @@ Locktime src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4424,7 +4416,7 @@ Transaction not found. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4432,7 +4424,7 @@ Waiting for it to appear in the mempool... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4440,7 +4432,7 @@ Effective fee rate src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -4851,13 +4843,17 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer REST API service src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -4865,11 +4861,11 @@ Endpoint src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -4877,18 +4873,18 @@ Description src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 Default push: action: 'want', data: ['blocks', ...] to express what you want pushed. Available: blocks, mempool-blocks, live-2h-chart, and stats.Push transactions related to address: 'track-address': '3PbJ...bF9B' to receive all new transactions containing that address as input or output. Returns an array of transactions. address-transactions for new mempool transactions, and block-transactions for new block confirmed transactions. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5154,6 +5150,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -5642,6 +5646,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 From 304089b3d0acc8f8c4983e347490d0f938e4ad90 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 9 Mar 2023 17:27:19 +0900 Subject: [PATCH 05/22] Bump axios from 0.27.2 -> 1.3.4 --- backend/package-lock.json | 34 +++++++++++++++++++++++----------- backend/package.json | 2 +- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 8b5f759f7..5962e01c4 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -12,7 +12,7 @@ "@babel/core": "^7.20.12", "@mempool/electrum-client": "^1.1.7", "@types/node": "^16.18.11", - "axios": "~0.27.2", + "axios": "~1.3.4", "bitcoinjs-lib": "~6.1.0", "crypto-js": "~4.1.1", "express": "~4.18.2", @@ -2082,12 +2082,13 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", + "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/babel-jest": { @@ -5217,6 +5218,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -7869,12 +7875,13 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", + "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", "requires": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "babel-jest": { @@ -10227,6 +10234,11 @@ "ipaddr.js": "1.9.1" } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", diff --git a/backend/package.json b/backend/package.json index 9c1b3a12a..95309c20e 100644 --- a/backend/package.json +++ b/backend/package.json @@ -37,7 +37,7 @@ "@babel/core": "^7.20.12", "@mempool/electrum-client": "^1.1.7", "@types/node": "^16.18.11", - "axios": "~0.27.2", + "axios": "~1.3.4", "bitcoinjs-lib": "~6.1.0", "crypto-js": "~4.1.1", "express": "~4.18.2", From 42228dc70f397628ef0177a229c8dddec823f425 Mon Sep 17 00:00:00 2001 From: softsimon Date: Thu, 9 Mar 2023 17:46:09 +0900 Subject: [PATCH 06/22] Revert "Bump axios from 0.27.2 -> 1.3.4" --- backend/package-lock.json | 34 +++++++++++----------------------- backend/package.json | 2 +- 2 files changed, 12 insertions(+), 24 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 5962e01c4..8b5f759f7 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -12,7 +12,7 @@ "@babel/core": "^7.20.12", "@mempool/electrum-client": "^1.1.7", "@types/node": "^16.18.11", - "axios": "~1.3.4", + "axios": "~0.27.2", "bitcoinjs-lib": "~6.1.0", "crypto-js": "~4.1.1", "express": "~4.18.2", @@ -2082,13 +2082,12 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "node_modules/axios": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", - "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" } }, "node_modules/babel-jest": { @@ -5218,11 +5217,6 @@ "node": ">= 0.10" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -7875,13 +7869,12 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "axios": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", - "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" } }, "babel-jest": { @@ -10234,11 +10227,6 @@ "ipaddr.js": "1.9.1" } }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", diff --git a/backend/package.json b/backend/package.json index 95309c20e..9c1b3a12a 100644 --- a/backend/package.json +++ b/backend/package.json @@ -37,7 +37,7 @@ "@babel/core": "^7.20.12", "@mempool/electrum-client": "^1.1.7", "@types/node": "^16.18.11", - "axios": "~1.3.4", + "axios": "~0.27.2", "bitcoinjs-lib": "~6.1.0", "crypto-js": "~4.1.1", "express": "~4.18.2", From 548a6ea66497677449c93da4f9404885214ea22b Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 9 Mar 2023 18:53:29 +0900 Subject: [PATCH 07/22] Autofocus search input when we load the app for the first time --- .../src/app/components/search-form/search-form.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/search-form/search-form.component.html b/frontend/src/app/components/search-form/search-form.component.html index b881c6ea7..cdfcfe015 100644 --- a/frontend/src/app/components/search-form/search-form.component.html +++ b/frontend/src/app/components/search-form/search-form.component.html @@ -1,7 +1,7 @@
- +
From 6327ce7c899878411d4777151bc0bba425134bfb Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Fri, 10 Mar 2023 09:21:44 +0900 Subject: [PATCH 08/22] Sort asn numerically - add few more top 10 isp in warm cache --- backend/src/api/explorer/nodes.api.ts | 16 ++++++++-------- production/nginx-cache-warmer | 7 +++++-- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/backend/src/api/explorer/nodes.api.ts b/backend/src/api/explorer/nodes.api.ts index e1949a17c..d86ecf665 100644 --- a/backend/src/api/explorer/nodes.api.ts +++ b/backend/src/api/explorer/nodes.api.ts @@ -417,24 +417,24 @@ class NodesApi { if (!ispList[isp1]) { ispList[isp1] = { - id: channel.isp1ID.toString(), + ids: [channel.isp1ID], capacity: 0, channels: 0, nodes: {}, }; - } else if (ispList[isp1].id.indexOf(channel.isp1ID) === -1) { - ispList[isp1].id += ',' + channel.isp1ID.toString(); + } else if (ispList[isp1].ids.includes(channel.isp1ID) === false) { + ispList[isp1].ids.push(channel.isp1ID); } if (!ispList[isp2]) { ispList[isp2] = { - id: channel.isp2ID.toString(), + ids: [channel.isp2ID], capacity: 0, channels: 0, nodes: {}, }; - } else if (ispList[isp2].id.indexOf(channel.isp2ID) === -1) { - ispList[isp2].id += ',' + channel.isp2ID.toString(); + } else if (ispList[isp2].ids.includes(channel.isp2ID) === false) { + ispList[isp2].ids.push(channel.isp2ID); } ispList[isp1].capacity += channel.capacity; @@ -444,11 +444,11 @@ class NodesApi { ispList[isp2].channels += 1; ispList[isp2].nodes[channel.node2PublicKey] = true; } - + const ispRanking: any[] = []; for (const isp of Object.keys(ispList)) { ispRanking.push([ - ispList[isp].id, + ispList[isp].ids.sort((a, b) => a - b).join(','), isp, ispList[isp].capacity, ispList[isp].channels, diff --git a/production/nginx-cache-warmer b/production/nginx-cache-warmer index 5a298367b..6b58e5b78 100755 --- a/production/nginx-cache-warmer +++ b/production/nginx-cache-warmer @@ -95,7 +95,7 @@ do for url in / \ '/api/v1/lightning/statistics/3y' \ '/api/v1/lightning/statistics/all' \ '/api/v1/lightning/nodes/isp-ranking' \ - '/api/v1/lightning/nodes/isp/396982,15169' `# Google` \ + '/api/v1/lightning/nodes/isp/15169,396982' `# Google` \ '/api/v1/lightning/nodes/isp/14618,16509' `# Amazon` \ '/api/v1/lightning/nodes/isp/39572' `# DataWeb` \ '/api/v1/lightning/nodes/isp/14061' `# Digital Ocean` \ @@ -107,12 +107,15 @@ do for url in / \ '/api/v1/lightning/nodes/isp/34197' `# SHRD SARL` \ '/api/v1/lightning/nodes/isp/42275' `# Three Fourteen SASU` \ '/api/v1/lightning/nodes/isp/16276' `# OVH SAS` \ - '/api/v1/lightning/nodes/isp/11426,11427,20001,20115,11351,10796,33363,12271' `# Spectrum` \ + '/api/v1/lightning/nodes/isp/10796,11351,11426,11427,12271,20001,20115,33363' `# Spectrum` \ '/api/v1/lightning/nodes/isp/701' `# Verizon` \ '/api/v1/lightning/nodes/isp/12876' `# Scaleway` \ '/api/v1/lightning/nodes/isp/33915' `# Ziggo` \ '/api/v1/lightning/nodes/isp/3320' `# Deutsche Telekom AG` \ '/api/v1/lightning/nodes/isp/8075' `# Microsoft Azure` \ + '/api/v1/lightning/nodes/isp/212531', `# UAB Interneto vizija` \ + '/api/v1/lightning/nodes/isp/63949', `# Linode` \ + '/api/v1/lightning/nodes/isp/51167', `# Contabo GmbH` \ '/api/v1/lightning/nodes/countries' \ '/api/v1/lightning/nodes/rankings' \ '/api/v1/lightning/nodes/rankings/liquidity' \ From 778e2f9b6464a5bd5e80e0f7bd193e29fc0ca3ad Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Fri, 10 Mar 2023 10:26:30 +0900 Subject: [PATCH 09/22] Fixes #3217 --- .../blocks-list/blocks-list.component.ts | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/frontend/src/app/components/blocks-list/blocks-list.component.ts b/frontend/src/app/components/blocks-list/blocks-list.component.ts index 160e0c882..0086ff902 100644 --- a/frontend/src/app/components/blocks-list/blocks-list.component.ts +++ b/frontend/src/app/components/blocks-list/blocks-list.component.ts @@ -87,8 +87,8 @@ export class BlocksList implements OnInit, OnDestroy { this.stateService.blocks$ .pipe( switchMap((block) => { - if (block[0].height < this.lastBlockHeight) { - return []; // Return an empty stream so the last pipe is not executed + if (block[0].height <= this.lastBlockHeight) { + return [null]; // Return an empty stream so the last pipe is not executed } this.lastBlockHeight = block[0].height; return [block]; @@ -101,14 +101,16 @@ export class BlocksList implements OnInit, OnDestroy { this.lastPage = this.page; return blocks[0]; } - this.blocksCount = Math.max(this.blocksCount, blocks[1][0].height) + 1; - if (this.stateService.env.MINING_DASHBOARD) { - // @ts-ignore: Need to add an extra field for the template - blocks[1][0].extras.pool.logo = `/resources/mining-pools/` + - blocks[1][0].extras.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg'; + if (blocks[1]) { + this.blocksCount = Math.max(this.blocksCount, blocks[1][0].height) + 1; + if (this.stateService.env.MINING_DASHBOARD) { + // @ts-ignore: Need to add an extra field for the template + blocks[1][0].extras.pool.logo = `/resources/mining-pools/` + + blocks[1][0].extras.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg'; + } + acc.unshift(blocks[1][0]); + acc = acc.slice(0, this.widget ? 6 : 15); } - acc.unshift(blocks[1][0]); - acc = acc.slice(0, this.widget ? 6 : 15); return acc; }, []) ); From 3f234431fbd991dd459cb1f7ae53d2aad3b675ba Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 9 Mar 2023 19:31:53 -0600 Subject: [PATCH 10/22] fix missing fee rating on mobile --- .../src/app/components/transaction/transaction.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index 0cd4a86c2..ec08c9303 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -488,7 +488,7 @@
{{ tx.effectiveFeePerVsize | feeRounding }} sat/vB - +
From 796566e7aedcc926b872d7feef291554c4b8ce29 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 9 Mar 2023 19:47:54 -0600 Subject: [PATCH 11/22] Save cache to disk on SIGTERM/SIGINT --- backend/src/api/disk-cache.ts | 63 ++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index 01bbb4d3f..584916563 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -16,14 +16,26 @@ class DiskCache { private static CHUNK_FILES = 25; private isWritingCache = false; - constructor() { } + constructor() { + if (!cluster.isMaster) { + return; + } + process.on('SIGINT', (e) => { + this.saveCacheToDiskSync(); + process.exit(2); + }); + process.on('SIGTERM', (e) => { + this.saveCacheToDiskSync(); + process.exit(2); + }); + } async $saveCacheToDisk(): Promise { if (!cluster.isPrimary) { return; } if (this.isWritingCache) { - logger.debug('Saving cache already in progress. Skipping.') + logger.debug('Saving cache already in progress. Skipping.'); return; } try { @@ -61,7 +73,50 @@ class DiskCache { } } - wipeCache() { + saveCacheToDiskSync(): void { + if (!cluster.isPrimary) { + return; + } + if (this.isWritingCache) { + logger.debug('Saving cache already in progress. Skipping.'); + return; + } + try { + logger.debug('Writing mempool and blocks data to disk cache (sync)...'); + this.isWritingCache = true; + + const mempool = memPool.getMempool(); + const mempoolArray: TransactionExtended[] = []; + for (const tx in mempool) { + mempoolArray.push(mempool[tx]); + } + + Common.shuffleArray(mempoolArray); + + const chunkSize = Math.floor(mempoolArray.length / DiskCache.CHUNK_FILES); + + fs.writeFileSync(DiskCache.FILE_NAME, JSON.stringify({ + cacheSchemaVersion: this.cacheSchemaVersion, + blocks: blocks.getBlocks(), + blockSummaries: blocks.getBlockSummaries(), + mempool: {}, + mempoolArray: mempoolArray.splice(0, chunkSize), + }), { flag: 'w' }); + for (let i = 1; i < DiskCache.CHUNK_FILES; i++) { + fs.writeFileSync(DiskCache.FILE_NAMES.replace('{number}', i.toString()), JSON.stringify({ + mempool: {}, + mempoolArray: mempoolArray.splice(0, chunkSize), + }), { flag: 'w' }); + } + logger.debug('Mempool and blocks data saved to disk cache'); + this.isWritingCache = false; + } catch (e) { + logger.warn('Error writing to cache file: ' + (e instanceof Error ? e.message : e)); + this.isWritingCache = false; + } + } + + wipeCache(): void { logger.notice(`Wiping nodejs backend cache/cache*.json files`); try { fs.unlinkSync(DiskCache.FILE_NAME); @@ -83,7 +138,7 @@ class DiskCache { } } - loadMempoolCache() { + loadMempoolCache(): void { if (!fs.existsSync(DiskCache.FILE_NAME)) { return; } From 46d89ac8379c04ceaa1c0988bab62211b4cf86de Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 9 Mar 2023 20:19:22 -0600 Subject: [PATCH 12/22] prevent disk cache file write corruption --- backend/src/api/disk-cache.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index 584916563..af04d5acb 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -11,6 +11,8 @@ import { Common } from './common'; class DiskCache { private cacheSchemaVersion = 3; + private static TMP_FILE_NAME = config.MEMPOOL.CACHE_DIR + '/tmp-cache.json'; + private static TMP_FILE_NAMES = config.MEMPOOL.CACHE_DIR + '/tmp-cache{number}.json'; private static FILE_NAME = config.MEMPOOL.CACHE_DIR + '/cache.json'; private static FILE_NAMES = config.MEMPOOL.CACHE_DIR + '/cache{number}.json'; private static CHUNK_FILES = 25; @@ -95,7 +97,7 @@ class DiskCache { const chunkSize = Math.floor(mempoolArray.length / DiskCache.CHUNK_FILES); - fs.writeFileSync(DiskCache.FILE_NAME, JSON.stringify({ + fs.writeFileSync(DiskCache.TMP_FILE_NAME, JSON.stringify({ cacheSchemaVersion: this.cacheSchemaVersion, blocks: blocks.getBlocks(), blockSummaries: blocks.getBlockSummaries(), @@ -103,11 +105,17 @@ class DiskCache { mempoolArray: mempoolArray.splice(0, chunkSize), }), { flag: 'w' }); for (let i = 1; i < DiskCache.CHUNK_FILES; i++) { - fs.writeFileSync(DiskCache.FILE_NAMES.replace('{number}', i.toString()), JSON.stringify({ + fs.writeFileSync(DiskCache.TMP_FILE_NAMES.replace('{number}', i.toString()), JSON.stringify({ mempool: {}, mempoolArray: mempoolArray.splice(0, chunkSize), }), { flag: 'w' }); } + + fs.renameSync(DiskCache.TMP_FILE_NAME, DiskCache.FILE_NAME); + for (let i = 1; i < DiskCache.CHUNK_FILES; i++) { + fs.renameSync(DiskCache.TMP_FILE_NAMES.replace('{number}', i.toString()), DiskCache.FILE_NAMES.replace('{number}', i.toString())); + } + logger.debug('Mempool and blocks data saved to disk cache'); this.isWritingCache = false; } catch (e) { From dd01371b61a3b5b8c998585b4423c0b25a91fe7e Mon Sep 17 00:00:00 2001 From: softsimon Date: Fri, 10 Mar 2023 12:37:55 +0900 Subject: [PATCH 13/22] Fixes changed after checked error in transaction page --- .../src/app/components/transaction/transaction.component.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index 673743344..e254d131a 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -496,7 +496,9 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { @HostListener('window:resize', ['$event']) setGraphSize(): void { if (this.graphContainer) { - this.graphWidth = this.graphContainer.nativeElement.clientWidth; + setTimeout(() => { + this.graphWidth = this.graphContainer.nativeElement.clientWidth; + }, 1); } } From a22a62836e8cc55a0793349a7fcd88c1a80d8e6e Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 21 Feb 2023 21:59:31 -0600 Subject: [PATCH 14/22] pixel-perfect flow diagrams --- .../tx-bowtie-graph/tx-bowtie-graph.component.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.ts b/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.ts index 1c5ee5391..b402ddea8 100644 --- a/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.ts +++ b/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.ts @@ -208,8 +208,8 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges { this.outputs = this.initLines('out', voutWithFee, totalValue, this.maxStrands); this.middle = { - path: `M ${(this.width / 2) - this.midWidth} ${(this.height / 2) + 0.5} L ${(this.width / 2) + this.midWidth} ${(this.height / 2) + 0.5}`, - style: `stroke-width: ${this.combinedWeight + 1}; stroke: ${this.gradient[1]}` + path: `M ${(this.width / 2) - this.midWidth} ${(this.height / 2) + 0.25} L ${(this.width / 2) + this.midWidth} ${(this.height / 2) + 0.25}`, + style: `stroke-width: ${this.combinedWeight + 0.5}; stroke: ${this.gradient[1]}` }; this.hasLine = this.inputs.reduce((line, put) => line || !put.zeroValue, false) @@ -266,7 +266,7 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges { const lineParams = weights.map((w, i) => { return { weight: w, - thickness: xputs[i].value === 0 ? this.zeroValueThickness : Math.max(this.minWeight - 1, w) + 1, + thickness: xputs[i].value === 0 ? this.zeroValueThickness : Math.min(this.combinedWeight + 0.5, Math.max(this.minWeight - 1, w) + 1), offset: 0, innerY: 0, outerY: 0, @@ -278,7 +278,7 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges { // bounds of the middle segment const innerTop = (this.height / 2) - (this.combinedWeight / 2); - const innerBottom = innerTop + this.combinedWeight; + const innerBottom = innerTop + this.combinedWeight + 0.5; // tracks the visual bottom of the endpoints of the previous line let lastOuter = 0; let lastInner = innerTop; @@ -303,7 +303,7 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges { // set the vertical position of the (center of the) outer side of the line line.outerY = lastOuter + (line.thickness / 2); - line.innerY = Math.min(innerBottom + (line.thickness / 2), Math.max(innerTop + (line.thickness / 2), lastInner + (line.weight / 2))); + line.innerY = Math.min(innerBottom - (line.thickness / 2), Math.max(innerTop + (line.thickness / 2), lastInner + (line.weight / 2))); // special case to center single input/outputs if (xputs.length === 1) { From 4a0d9cb66f7a18d789e08c15ace3b414b95320ca Mon Sep 17 00:00:00 2001 From: softsimon Date: Fri, 10 Mar 2023 18:35:26 +0900 Subject: [PATCH 15/22] Fixes arrow position on confirmed blocks fixes #3294 --- .../components/blockchain-blocks/blockchain-blocks.component.ts | 2 +- .../src/app/components/transaction/transaction.component.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts index 3feaf6c2d..e3547a569 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts @@ -107,7 +107,7 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { this.blocks.unshift(block); this.blocks = this.blocks.slice(0, this.dynamicBlocksAmount); - if (txConfirmed) { + if (txConfirmed && this.height === block.height) { this.markHeight = block.height; this.moveArrowToPosition(true, true); } else { diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index 673743344..c28525159 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -347,7 +347,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { this.blocksSubscription = this.stateService.blocks$.subscribe(([block, txConfirmed]) => { this.latestBlock = block; - if (txConfirmed && this.tx) { + if (txConfirmed && this.tx && !this.tx.status.confirmed) { this.tx.status = { confirmed: true, block_height: block.height, From d3d67627f3090a36dff30a145befb3384fb803f3 Mon Sep 17 00:00:00 2001 From: softsimon Date: Fri, 10 Mar 2023 20:19:37 +0900 Subject: [PATCH 16/22] Remove search bar focus border --- .../app/components/search-form/search-form.component.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frontend/src/app/components/search-form/search-form.component.scss b/frontend/src/app/components/search-form/search-form.component.scss index d59acadb9..f3d2ee234 100644 --- a/frontend/src/app/components/search-form/search-form.component.scss +++ b/frontend/src/app/components/search-form/search-form.component.scss @@ -53,3 +53,8 @@ form { margin-top: 1px; margin-right: 2px; } + +input:focus { + box-shadow: none; + border-color: #1b1f2c; +} From 4263977d99a6d16abb86c2a7c7a963f1cb0b4543 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Sat, 11 Mar 2023 10:52:15 +0900 Subject: [PATCH 17/22] Updated regtest example --- backend/README.md | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/backend/README.md b/backend/README.md index be85d25af..256dcaa43 100644 --- a/backend/README.md +++ b/backend/README.md @@ -171,52 +171,58 @@ Helpful link: https://gist.github.com/System-Glitch/cb4e87bf1ae3fec9925725bb3ebe Run bitcoind on regtest: ``` - bitcoind -regtest -rpcport=8332 + bitcoind -regtest ``` Create a new wallet, if needed: ``` - bitcoin-cli -regtest -rpcport=8332 createwallet test + bitcoin-cli -regtest createwallet test ``` Load wallet (this command may take a while if you have lot of UTXOs): ``` - bitcoin-cli -regtest -rpcport=8332 loadwallet test + bitcoin-cli -regtest loadwallet test ``` Get a new address: ``` - address=$(./src/bitcoin-cli -regtest -rpcport=8332 getnewaddress) + address=$(bitcoin-cli -regtest getnewaddress) ``` Mine blocks to the previously generated address. You need at least 101 blocks before you can spend. This will take some time to execute (~1 min): ``` - bitcoin-cli -regtest -rpcport=8332 generatetoaddress 101 $address + bitcoin-cli -regtest generatetoaddress 101 $address ``` Send 0.1 BTC at 5 sat/vB to another address: ``` - ./src/bitcoin-cli -named -regtest -rpcport=8332 sendtoaddress address=$(./src/bitcoin-cli -regtest -rpcport=8332 getnewaddress) amount=0.1 fee_rate=5 + bitcoin-cli -named -regtest sendtoaddress address=$(bitcoin-cli -regtest getnewaddress) amount=0.1 fee_rate=5 ``` See more example of `sendtoaddress`: ``` - ./src/bitcoin-cli sendtoaddress # will print the help + bitcoin-cli sendtoaddress # will print the help ``` -Mini script to generate transactions with random TX fee-rate (between 1 to 100 sat/vB). It's slow so don't expect to use this to test mempool spam, except if you let it run for a long time, or maybe with multiple regtest nodes connected to each other. +Mini script to generate random network activity (random TX count with random tx fee-rate). It's slow so don't expect to use this to test mempool spam, except if you let it run for a long time, or maybe with multiple regtest nodes connected to each other. ``` #!/bin/bash - address=$(./src/bitcoin-cli -regtest -rpcport=8332 getnewaddress) + address=$(bitcoin-cli -regtest getnewaddress) + bitcoin-cli -regtest generatetoaddress 101 $address for i in {1..1000000} do - ./src/bitcoin-cli -regtest -rpcport=8332 -named sendtoaddress address=$address amount=0.01 fee_rate=$(jot -r 1 1 100) + for y in $(seq 1 "$(jot -r 1 1 1000)") + do + bitcoin-cli -regtest -named sendtoaddress address=$address amount=0.01 fee_rate=$(jot -r 1 1 100) + done + bitcoin-cli -regtest generatetoaddress 1 $address + sleep 5 done ``` Generate block at regular interval (every 10 seconds in this example): ``` - watch -n 10 "./src/bitcoin-cli -regtest -rpcport=8332 generatetoaddress 1 $address" + watch -n 10 "bitcoin-cli -regtest generatetoaddress 1 $address" ``` ### Mining pools update From 097eed0baaeb49c4e29bb375c59d8f15f4130926 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sat, 11 Mar 2023 17:26:33 +0900 Subject: [PATCH 18/22] Pull from transifex 2023-03-11 --- frontend/src/locale/messages.da.xlf | 378 ++++++++++++++------------- frontend/src/locale/messages.es.xlf | 381 +++++++++++++++------------- frontend/src/locale/messages.fi.xlf | 377 ++++++++++++++------------- frontend/src/locale/messages.fr.xlf | 378 ++++++++++++++------------- frontend/src/locale/messages.he.xlf | 377 ++++++++++++++------------- 5 files changed, 976 insertions(+), 915 deletions(-) diff --git a/frontend/src/locale/messages.da.xlf b/frontend/src/locale/messages.da.xlf index da4ef358d..29f667ed5 100644 --- a/frontend/src/locale/messages.da.xlf +++ b/frontend/src/locale/messages.da.xlf @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2846,11 +2846,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2891,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3346,7 +3346,7 @@ Mining src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3355,7 @@ Pool rangering src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3368,7 @@ Pool dominans src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3381,7 @@ Hashrate og sværhedsgrad src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3390,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3399,7 @@ Lightningnoder pr. netværk src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3420,7 @@ Lightning Netværkets kapacitet src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3441,7 @@ Lightningnoder pr. internetudbyder src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3454,7 @@ Lightningnoder pr. land src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3471,7 @@ Verdenskort over Lightningnoder src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3488,7 @@ Verdenskort over lightningnodernes kanaler src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3509,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3543,11 @@ Hashrate (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -4115,7 +4115,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4339,7 @@ Filter src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4348,7 @@ Vend om src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4357,7 @@ Transaktion vBytes pr. sekund (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4365,188 @@ Just now Lige nu - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 78 ago siden - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 97 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 98 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 99 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 100 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 101 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 102 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 110 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 111 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 112 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 113 + + + + In ~ + Om ~ + + src/app/components/time/time.component.ts + 120 + + + src/app/components/time/time.component.ts + 121 + + + src/app/components/time/time.component.ts + 122 + + + src/app/components/time/time.component.ts + 123 + + + src/app/components/time/time.component.ts + 124 + + + src/app/components/time/time.component.ts + 125 + + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 133 + + + src/app/components/time/time.component.ts + 134 + + + src/app/components/time/time.component.ts + 135 + + + src/app/components/time/time.component.ts + 136 After Efter - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 143 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 144 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 145 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 146 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 147 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 148 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 156 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 157 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 158 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - Om ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 159 @@ -4688,7 +4680,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4699,7 @@ Vis mere src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4716,7 @@ Vis mindre src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4729,7 @@ Vis diagram src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4738,7 @@ Låsetid src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4747,7 @@ Transaktionen blev ikke fundet. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4756,7 @@ Venter på, at den dukker op i mempoolen... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4765,7 @@ Effektiv gebyrsats src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5220,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5231,7 @@ REST API service src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5240,11 @@ Endpoint src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5253,11 @@ Beskrivelse src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5265,7 @@ Default push: action: 'want', data: ['blocks', ...] to express what you want pushed. Available: blocks, mempool-blocks, live-2h-chart, and stats.Push transactions related to address: 'track-address': '3PbJ...bF9B' to receive all new transactions containing that address as input or output. Returns an array of transactions. address-transactions for new mempool transactions, and block-transactions for new block confirmed transactions. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5558,6 +5554,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -6079,6 +6083,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 diff --git a/frontend/src/locale/messages.es.xlf b/frontend/src/locale/messages.es.xlf index a4d01ac86..66437d4fb 100644 --- a/frontend/src/locale/messages.es.xlf +++ b/frontend/src/locale/messages.es.xlf @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2846,11 +2846,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2891,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3346,7 +3346,7 @@ Minado src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3355,7 @@ Ranking de pools src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3368,7 @@ Dominancia de pools src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3381,7 @@ Dificultad y Hashrate src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3390,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3399,7 @@ Nodos Lightning Por Red src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3420,7 @@ Capacidad De Red Lightning src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3441,7 @@ Nodos Lightning Por ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3454,7 @@ Nodos Lightning Por País src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3471,7 @@ Mapa Mundial De Nodos Lightning src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3488,7 @@ Mapa Mundial De Canales De Nodos Lightning src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3509,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3543,11 @@ Tasa de hash (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -4115,7 +4115,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4339,7 @@ Filtro src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4348,7 @@ Invertir src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4357,7 @@ vBytes de transacciones por segundo (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4365,188 @@ Just now Justo ahora - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 78 ago atrás - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 97 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 98 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 99 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 100 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 101 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 102 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 110 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 111 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 112 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 113 + + + + In ~ + En ~ + + src/app/components/time/time.component.ts + 120 + + + src/app/components/time/time.component.ts + 121 + + + src/app/components/time/time.component.ts + 122 + + + src/app/components/time/time.component.ts + 123 + + + src/app/components/time/time.component.ts + 124 + + + src/app/components/time/time.component.ts + 125 + + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 133 + + + src/app/components/time/time.component.ts + 134 + + + src/app/components/time/time.component.ts + 135 + + + src/app/components/time/time.component.ts + 136 After Después - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 143 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 144 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 145 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 146 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 147 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 148 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 156 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 157 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 158 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - En ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 159 @@ -4688,7 +4680,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4699,7 @@ Mostrar más src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4716,7 @@ Mostras menos src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4729,7 @@ Mostrar diagrama src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4738,7 @@ Tiempo de bloque src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4747,7 @@ Transacción no encontrada src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4756,7 @@ Esperando a que aparezca en la mempool... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4765,7 @@ Ratio de tasa efectiva src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5220,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5231,7 @@ servicio REST API src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5240,11 @@ Endpoint src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5253,11 @@ Descripción src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5265,7 @@ Empujar por defecto: acciona: 'want', data: ['blocks', ...] para expresar lo que quiere empujar. Disponible: blocks, mempool-blocks, live-2h-chart, y stats.Empujar transacciones relaccionadas a la direccion: 'track-address': '3PbJ...bF9B' para recibir todas las nuevas transacciones que contengan la direccion como input o output. Devuelve cualquier formación de transacciones. dirección-transacciones para nuevas transacciones mempool, y bloque-transacciones para nuevas transacciones confirmadas en bloque. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5558,6 +5554,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -6079,6 +6083,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -6559,6 +6571,7 @@ Clearnet and Darknet + Clearnet y Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6570,6 +6583,7 @@ Clearnet Only (IPv4, IPv6) + Solo Clearnet (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6581,6 +6595,7 @@ Darknet Only (Tor, I2P, cjdns) + Solo Darknet (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 diff --git a/frontend/src/locale/messages.fi.xlf b/frontend/src/locale/messages.fi.xlf index a53a7bf5a..44217e369 100644 --- a/frontend/src/locale/messages.fi.xlf +++ b/frontend/src/locale/messages.fi.xlf @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2846,11 +2846,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2891,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3346,7 +3346,7 @@ Louhinta src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3355,7 @@ Poolien sijoitus src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3368,7 @@ Poolien dominanssi src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3381,7 @@ Laskentateho & Vaikeusaste src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3390,7 @@ Salamaverkko src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3399,7 @@ Salamasolmut per verkko src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3420,7 @@ Salamaverkon kapasiteetti src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3441,7 @@ Salamasolmut palveluntarjoajaa kohti src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3454,7 @@ Salamasolmut maata kohti src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3471,7 @@ Salamasolmujen maailmankartta src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3488,7 @@ Salamasolmu kanavien maailmankartta src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3509,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3543,11 @@ Laskentateho (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -4115,7 +4115,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4339,7 @@ Suodatin src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4348,7 @@ Käänteinen src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4357,7 @@ Siirtotapahtuma vByte:ä sekunnissa (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4365,187 @@ Just now Juuri nyt - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 78 ago sitten - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 97 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 98 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 99 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 100 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 101 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 102 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 110 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 111 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 112 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 113 + + + + In ~ + + src/app/components/time/time.component.ts + 120 + + + src/app/components/time/time.component.ts + 121 + + + src/app/components/time/time.component.ts + 122 + + + src/app/components/time/time.component.ts + 123 + + + src/app/components/time/time.component.ts + 124 + + + src/app/components/time/time.component.ts + 125 + + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 133 + + + src/app/components/time/time.component.ts + 134 + + + src/app/components/time/time.component.ts + 135 + + + src/app/components/time/time.component.ts + 136 After jälkeen - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 143 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 144 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 145 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 146 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 147 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 148 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 156 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 157 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 158 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 159 @@ -4688,7 +4679,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4698,7 @@ Näytä enemmän src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4715,7 @@ Näytä vähemmän src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4728,7 @@ Näytä kaavio src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4737,7 @@ Lukitusaika src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4746,7 @@ Siirtotapahtumaa ei löydy. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4755,7 @@ Odotetaan sen ilmestymistä mempooliin... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4764,7 @@ Todellinen siirtomaksu taso src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5219,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5230,7 @@ REST API-palvelu src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5239,11 @@ Päätepiste src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5252,11 @@ Kuvaus src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5264,7 @@ Oletus työntö: action: 'want', data: ['blocks', ...] ilmaisemaan, mitä haluat työnnettävän. Käytettävissä: blocks, mempool-blocks, live-2h-chart ja stats.Työnnä osoitteeseen liittyvät tapahtumat: 'track-address': '3PbJ...bF9B' vastaanottaa kaikki uudet transaktiot, jotka sisältävät kyseisen osoitteen syötteenä tai tulosteena. Palauttaa transaktioiden joukon. address-transactions uusille mempool-transaktioille ja block-transactions uusille lohkon vahvistetuille transaktioille. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5558,6 +5553,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -6079,6 +6082,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 diff --git a/frontend/src/locale/messages.fr.xlf b/frontend/src/locale/messages.fr.xlf index 704ba8412..208b71ce0 100644 --- a/frontend/src/locale/messages.fr.xlf +++ b/frontend/src/locale/messages.fr.xlf @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2846,11 +2846,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2891,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3346,7 +3346,7 @@ Minage src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3355,7 @@ Classement des pools src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3368,7 @@ Dominance des pools src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3381,7 @@ Taux de hachage & difficulté src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3390,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3399,7 @@ Nœuds Lightning par réseau src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3420,7 @@ Capacité du réseau Lightning src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3441,7 @@ Nœuds Lightning par FAI src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3454,7 @@ Nœuds Lightning par pays src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3471,7 @@ Carte du monde des nœuds Lightning src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3488,7 @@ Carte du monde des canaux Lightning src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3509,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3543,11 @@ Taux de hachage (moy) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -4115,7 +4115,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4339,7 @@ Filtrer src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4348,7 @@ Inverser src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4357,7 @@ Transaction vBytes par seconde (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4365,188 @@ Just now Juste maintenant - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 78 ago Il y a - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 97 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 98 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 99 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 100 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 101 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 102 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 110 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 111 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 112 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 113 + + + + In ~ + Dans ~ + + src/app/components/time/time.component.ts + 120 + + + src/app/components/time/time.component.ts + 121 + + + src/app/components/time/time.component.ts + 122 + + + src/app/components/time/time.component.ts + 123 + + + src/app/components/time/time.component.ts + 124 + + + src/app/components/time/time.component.ts + 125 + + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 133 + + + src/app/components/time/time.component.ts + 134 + + + src/app/components/time/time.component.ts + 135 + + + src/app/components/time/time.component.ts + 136 After Après - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 143 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 144 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 145 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 146 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 147 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 148 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 156 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 157 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 158 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - Dans ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 159 @@ -4688,7 +4680,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4699,7 @@ Montrer plus src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4716,7 @@ Montrer moins src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4729,7 @@ Afficher le diagramme src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4738,7 @@ Temps de verrouillage src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4747,7 @@ Transaction introuvable. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4756,7 @@ Veuillez patienter pendant que nous attendons qu'elle apparaisse dans le mempool src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4765,7 @@ Taux de frais effectif src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5220,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5231,7 @@ Service d'API REST src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5240,11 @@ Point de terminaison src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5253,11 @@ Description src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5265,7 @@ Pousser par défaut : action: 'want', data: ['blocks', ...] pour exprimer ce que vous voulez pousser. Disponible: blocks, mempool-blocks, live-2h-chart, et stats.Pousse les transactions liées à l'adresse : 'track-address': '3PbJ...bF9B' pour recevoir toutes les nouvelles transactions contenant cette adresse en entrée ou en sortie. Renvoie un tableau de transactions. address-transactions pour les nouvelles transactions mempool, et block-transactions pour les nouvelles transactions confirmées en bloc. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5558,6 +5554,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -6079,6 +6083,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 diff --git a/frontend/src/locale/messages.he.xlf b/frontend/src/locale/messages.he.xlf index b58237560..3ab6c3305 100644 --- a/frontend/src/locale/messages.he.xlf +++ b/frontend/src/locale/messages.he.xlf @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2846,11 +2846,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2891,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3346,7 +3346,7 @@ כרייה src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3355,7 @@ דירוג בריכות src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3368,7 @@ שליטת בריכות src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3381,7 @@ קשי וכמות האשים src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3390,7 @@ ברק src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3399,7 @@ צמתי ברק לפי רשת src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3420,7 @@ קיבולת רשת הברק src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3441,7 @@ צמתי ברק לפי ספקי תשתית src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3454,7 @@ צמתי ברק לפי מדינה src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3471,7 @@ צמתי ברק במפת העולם src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3488,7 @@ ערוצי צמתי ברק במפת העולם src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3509,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3543,11 @@ כמות האשים (ממוצע נע) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -4113,7 +4113,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4336,7 +4336,7 @@ סנן src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4345,7 +4345,7 @@ להפוך src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4354,7 +4354,7 @@ טרנזקציות vBytes לשניה (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4362,196 +4362,187 @@ Just now זה עתה - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 78 ago לפני - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 97 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 98 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 99 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 100 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 101 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 102 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 110 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 111 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 112 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 113 + + + + In ~ + + src/app/components/time/time.component.ts + 120 + + + src/app/components/time/time.component.ts + 121 + + + src/app/components/time/time.component.ts + 122 + + + src/app/components/time/time.component.ts + 123 + + + src/app/components/time/time.component.ts + 124 + + + src/app/components/time/time.component.ts + 125 + + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 133 + + + src/app/components/time/time.component.ts + 134 + + + src/app/components/time/time.component.ts + 135 + + + src/app/components/time/time.component.ts + 136 After לאחר - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 143 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 144 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 145 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 146 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 147 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 148 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 156 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 157 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 158 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - תוך ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 159 @@ -4685,7 +4676,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4704,7 +4695,7 @@ הצג עוד src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4721,7 +4712,7 @@ הצג פחות src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4734,7 +4725,7 @@ הצג דיאגמה src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4743,7 +4734,7 @@ זמן נעילה src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4752,7 +4743,7 @@ טרנזקציה לא נמצאה. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4761,7 +4752,7 @@ ממתין להופעתה בממפול.. src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4770,7 +4761,7 @@ שיעור עמלה אפקטיבי src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5224,13 +5215,17 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer REST API service src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5239,11 +5234,11 @@ נקודת קצה src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5252,11 +5247,11 @@ תיאור src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5264,7 +5259,7 @@ ברירת מחדל דוחף: פעולה ׳רוצה׳, מידע: [׳בלוקים׳,...] לבטא את מה שרצית לדחוף. זמין בלוקים , בלוקי-ממפול , תצוגה חיה-שעתיים-טבלה , ו סטטיסטיקות . דוחף טרנזקציות הקשורות לכתובת: ׳עקוב-כתובת׳: ׳3PbJ...bF9B' לקבלה של כל הטרנזקציות החדשות המכילות את כתובת זו כקלט או פלט. מאחזר מערך של טרנזקציות. טרנזקציות-כתובת לטרנזקציות ממפול חדשות ו בלוקי-טרנזקציות לבלוקים מאושרים חדשים. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5545,6 +5540,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -6061,6 +6064,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 From 39051e94e3b66850263682555e3d3d7b3302faa2 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 7 Mar 2023 19:19:28 -0600 Subject: [PATCH 19/22] Redesign difficulty adjustment dashboard widget --- .../api/difficulty-adjustment.test.ts | 4 + backend/src/api/difficulty-adjustment.ts | 8 +- .../difficulty-mining.component.html | 87 ++++++++++ .../difficulty-mining.component.scss | 154 ++++++++++++++++++ .../difficulty-mining.component.ts | 86 ++++++++++ .../difficulty-tooltip.component.html | 41 +++++ .../difficulty-tooltip.component.scss | 18 ++ .../difficulty-tooltip.component.ts | 66 ++++++++ .../difficulty/difficulty.component.html | 122 ++++++++------ .../difficulty/difficulty.component.scss | 68 +++++++- .../difficulty/difficulty.component.ts | 127 ++++++++++++++- .../mining-dashboard.component.html | 2 +- .../src/app/components/time/time.component.ts | 8 +- .../src/app/interfaces/node-api.interface.ts | 2 + frontend/src/app/shared/shared.module.ts | 6 + 15 files changed, 735 insertions(+), 64 deletions(-) create mode 100644 frontend/src/app/components/difficulty-mining/difficulty-mining.component.html create mode 100644 frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss create mode 100644 frontend/src/app/components/difficulty-mining/difficulty-mining.component.ts create mode 100644 frontend/src/app/components/difficulty/difficulty-tooltip.component.html create mode 100644 frontend/src/app/components/difficulty/difficulty-tooltip.component.scss create mode 100644 frontend/src/app/components/difficulty/difficulty-tooltip.component.ts diff --git a/backend/src/__tests__/api/difficulty-adjustment.test.ts b/backend/src/__tests__/api/difficulty-adjustment.test.ts index eb774d445..5ef1936e0 100644 --- a/backend/src/__tests__/api/difficulty-adjustment.test.ts +++ b/backend/src/__tests__/api/difficulty-adjustment.test.ts @@ -23,9 +23,11 @@ describe('Mempool Difficulty Adjustment', () => { remainingBlocks: 1834, remainingTime: 977591692, previousRetarget: 0.6280047707459726, + previousTime: 1660820820, nextRetargetHeight: 751968, timeAvg: 533038, timeOffset: 0, + expectedBlocks: 161.68833333333333, }, ], [ // Vector 2 (testnet) @@ -43,11 +45,13 @@ describe('Mempool Difficulty Adjustment', () => { estimatedRetargetDate: 1661895424692, remainingBlocks: 1834, remainingTime: 977591692, + previousTime: 1660820820, previousRetarget: 0.6280047707459726, nextRetargetHeight: 751968, timeAvg: 533038, timeOffset: -667000, // 11 min 7 seconds since last block (testnet only) // If we add time avg to abs(timeOffset) it makes exactly 1200000 ms, or 20 minutes + expectedBlocks: 161.68833333333333, }, ], ] as [[number, number, number, number, string, number], DifficultyAdjustment][]; diff --git a/backend/src/api/difficulty-adjustment.ts b/backend/src/api/difficulty-adjustment.ts index a1b6ab70e..c4e2abf31 100644 --- a/backend/src/api/difficulty-adjustment.ts +++ b/backend/src/api/difficulty-adjustment.ts @@ -9,9 +9,11 @@ export interface DifficultyAdjustment { remainingBlocks: number; // Block count remainingTime: number; // Duration of time in ms previousRetarget: number; // Percent: -75 to 300 + previousTime: number; // Unix time in ms nextRetargetHeight: number; // Block Height timeAvg: number; // Duration of time in ms timeOffset: number; // (Testnet) Time since last block (cap @ 20min) in ms + expectedBlocks: number; // Block count } export function calcDifficultyAdjustment( @@ -32,12 +34,12 @@ export function calcDifficultyAdjustment( const progressPercent = (blockHeight >= 0) ? blocksInEpoch / EPOCH_BLOCK_LENGTH * 100 : 100; const remainingBlocks = EPOCH_BLOCK_LENGTH - blocksInEpoch; const nextRetargetHeight = (blockHeight >= 0) ? blockHeight + remainingBlocks : 0; + const expectedBlocks = diffSeconds / BLOCK_SECONDS_TARGET; let difficultyChange = 0; - let timeAvgSecs = BLOCK_SECONDS_TARGET; + let timeAvgSecs = diffSeconds / blocksInEpoch; // Only calculate the estimate once we have 7.2% of blocks in current epoch if (blocksInEpoch >= ESTIMATE_LAG_BLOCKS) { - timeAvgSecs = diffSeconds / blocksInEpoch; difficultyChange = (BLOCK_SECONDS_TARGET / timeAvgSecs - 1) * 100; // Max increase is x4 (+300%) if (difficultyChange > 300) { @@ -74,9 +76,11 @@ export function calcDifficultyAdjustment( remainingBlocks, remainingTime, previousRetarget, + previousTime: DATime, nextRetargetHeight, timeAvg, timeOffset, + expectedBlocks, }; } diff --git a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.html b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.html new file mode 100644 index 000000000..ce0bf7eff --- /dev/null +++ b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.html @@ -0,0 +1,87 @@ +
Difficulty Adjustment
+
+
+
+
+
+
Remaining
+
+ + {{ i }} blocks + {{ i }} block +
+
+
+
+
Estimate
+
+ + + + + + + {{ epochData.change | absolute | number: '1.2-2' }} + % +
+ +
+
+
+ Previous: + + + + + + + + {{ epochData.previousRetarget | absolute | number: '1.2-2' }} % +
+
+
+
Current Period
+
{{ epochData.progress | number: '1.2-2' }} %
+
+
 
+
+
+
+
Next Halving
+
+ + {{ i }} blocks + {{ i }} block +
+
+
+
+
+
+
+ + +
+
+
Remaining
+
+
+
+
+
+
+
Estimate
+
+
+
+
+
+
+
Current Period
+
+
+
+
+
+
+
diff --git a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss new file mode 100644 index 000000000..c5cd2dc5e --- /dev/null +++ b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss @@ -0,0 +1,154 @@ +.difficulty-adjustment-container { + display: flex; + flex-direction: row; + justify-content: space-around; + height: 76px; + .shared-block { + color: #ffffff66; + font-size: 12px; + } + .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; + } +} + + +.difficulty-skeleton { + display: flex; + justify-content: space-between; + @media (min-width: 376px) { + flex-direction: row; + } + .item { + max-width: 150px; + margin: 0; + width: -webkit-fill-available; + @media (min-width: 376px) { + margin: 0 auto 0px; + } + &:first-child{ + display: none; + @media (min-width: 485px) { + display: block; + } + @media (min-width: 768px) { + display: none; + } + @media (min-width: 992px) { + display: block; + } + } + &:last-child { + margin-bottom: 0; + } + } + .card-text { + .skeleton-loader { + width: 100%; + display: block; + &:first-child { + margin: 14px auto 0; + max-width: 80px; + } + &:last-child { + margin: 10px auto 0; + max-width: 120px; + } + } + } +} + +.card { + background-color: #1d1f31; + height: 100%; +} + +.card-title { + color: #4a68b9; + font-size: 1rem; +} + +.progress { + display: inline-flex; + width: 100%; + background-color: #2d3348; + height: 1.1rem; + max-width: 180px; +} + +.skeleton-loader { + max-width: 100%; +} + +.more-padding { + padding: 18px; +} + +.small-bar { + height: 8px; + top: -4px; + max-width: 120px; +} + +.loading-container { + min-height: 76px; +} + +.main-title { + position: relative; + color: #ffffff91; + margin-top: -13px; + font-size: 10px; + text-transform: uppercase; + font-weight: 500; + text-align: center; + padding-bottom: 3px; +} + +.card-wrapper { + .card { + height: auto !important; + } + .card-body { + display: flex; + flex: inherit; + text-align: center; + flex-direction: column; + justify-content: space-around; + padding: 24px 20px; + } +} + +.retarget-sign { + margin-right: -3px; + font-size: 14px; + top: -2px; + position: relative; +} + +.previous-retarget-sign { + margin-right: -2px; + font-size: 10px; +} + +.symbol { + font-size: 13px; +} \ No newline at end of file diff --git a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.ts b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.ts new file mode 100644 index 000000000..2abb02e22 --- /dev/null +++ b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.ts @@ -0,0 +1,86 @@ +import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; +import { combineLatest, Observable, timer } from 'rxjs'; +import { map, switchMap } from 'rxjs/operators'; +import { StateService } from '../../services/state.service'; + +interface EpochProgress { + base: string; + change: number; + progress: number; + remainingBlocks: number; + newDifficultyHeight: number; + colorAdjustments: string; + colorPreviousAdjustments: string; + estimatedRetargetDate: number; + previousRetarget: number; + blocksUntilHalving: number; + timeUntilHalving: number; +} + +@Component({ + selector: 'app-difficulty-mining', + templateUrl: './difficulty-mining.component.html', + styleUrls: ['./difficulty-mining.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class DifficultyMiningComponent implements OnInit { + isLoadingWebSocket$: Observable; + difficultyEpoch$: Observable; + + @Input() showProgress = true; + @Input() showHalving = false; + @Input() showTitle = true; + + constructor( + public stateService: StateService, + ) { } + + ngOnInit(): void { + this.isLoadingWebSocket$ = this.stateService.isLoadingWebSocket$; + this.difficultyEpoch$ = combineLatest([ + this.stateService.blocks$.pipe(map(([block]) => block)), + this.stateService.difficultyAdjustment$, + ]) + .pipe( + map(([block, da]) => { + let colorAdjustments = '#ffffff66'; + if (da.difficultyChange > 0) { + colorAdjustments = '#3bcc49'; + } + if (da.difficultyChange < 0) { + colorAdjustments = '#dc3545'; + } + + let colorPreviousAdjustments = '#dc3545'; + if (da.previousRetarget) { + if (da.previousRetarget >= 0) { + colorPreviousAdjustments = '#3bcc49'; + } + if (da.previousRetarget === 0) { + colorPreviousAdjustments = '#ffffff66'; + } + } else { + colorPreviousAdjustments = '#ffffff66'; + } + + const blocksUntilHalving = 210000 - (block.height % 210000); + const timeUntilHalving = new Date().getTime() + (blocksUntilHalving * 600000); + + const data = { + base: `${da.progressPercent.toFixed(2)}%`, + change: da.difficultyChange, + progress: da.progressPercent, + remainingBlocks: da.remainingBlocks - 1, + colorAdjustments, + colorPreviousAdjustments, + newDifficultyHeight: da.nextRetargetHeight, + estimatedRetargetDate: da.estimatedRetargetDate, + previousRetarget: da.previousRetarget, + blocksUntilHalving, + timeUntilHalving, + }; + return data; + }) + ); + } +} diff --git a/frontend/src/app/components/difficulty/difficulty-tooltip.component.html b/frontend/src/app/components/difficulty/difficulty-tooltip.component.html new file mode 100644 index 000000000..57a96cca7 --- /dev/null +++ b/frontend/src/app/components/difficulty/difficulty-tooltip.component.html @@ -0,0 +1,41 @@ +
+ + + + + {{ i }} blocks expected + {{ i }} block expected + + + + {{ i }} blocks mined + {{ i }} block mined + + + + + {{ i }} blocks remaining + {{ i }} block remaining + + + + {{ i }} blocks ahead + {{ i }} block ahead + + + + {{ i }} blocks behind + {{ i }} block behind + + + next block + + +
\ No newline at end of file diff --git a/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss b/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss new file mode 100644 index 000000000..82b762acd --- /dev/null +++ b/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss @@ -0,0 +1,18 @@ +.difficulty-tooltip { + position: fixed; + background: rgba(#11131f, 0.95); + border-radius: 4px; + box-shadow: 1px 1px 10px rgba(0,0,0,0.5); + color: #b1b1b1; + padding: 10px 15px; + text-align: left; + pointer-events: none; + max-width: 300px; + min-width: 200px; + text-align: center; + + p { + margin: 0; + white-space: nowrap; + } +} \ No newline at end of file diff --git a/frontend/src/app/components/difficulty/difficulty-tooltip.component.ts b/frontend/src/app/components/difficulty/difficulty-tooltip.component.ts new file mode 100644 index 000000000..c7d26f61a --- /dev/null +++ b/frontend/src/app/components/difficulty/difficulty-tooltip.component.ts @@ -0,0 +1,66 @@ +import { Component, ElementRef, ViewChild, Input, OnChanges } from '@angular/core'; + +interface EpochProgress { + base: string; + change: number; + progress: number; + minedBlocks: number; + remainingBlocks: number; + expectedBlocks: number; + newDifficultyHeight: number; + colorAdjustments: string; + colorPreviousAdjustments: string; + estimatedRetargetDate: number; + previousRetarget: number; + blocksUntilHalving: number; + timeUntilHalving: number; +} + +const EPOCH_BLOCK_LENGTH = 2016; // Bitcoin mainnet + +@Component({ + selector: 'app-difficulty-tooltip', + templateUrl: './difficulty-tooltip.component.html', + styleUrls: ['./difficulty-tooltip.component.scss'], +}) +export class DifficultyTooltipComponent implements OnChanges { + @Input() status: string | void; + @Input() progress: EpochProgress | void = null; + @Input() cursorPosition: { x: number, y: number }; + + mined: number; + ahead: number; + behind: number; + expected: number; + remaining: number; + isAhead: boolean; + isBehind: boolean; + + tooltipPosition = { x: 0, y: 0 }; + + @ViewChild('tooltip') tooltipElement: ElementRef; + + constructor() {} + + ngOnChanges(changes): void { + if (changes.cursorPosition && changes.cursorPosition.currentValue) { + let x = changes.cursorPosition.currentValue.x; + let y = changes.cursorPosition.currentValue.y - 50; + if (this.tooltipElement) { + const elementBounds = this.tooltipElement.nativeElement.getBoundingClientRect(); + x -= elementBounds.width / 2; + x = Math.min(Math.max(x, 20), (window.innerWidth - 20 - elementBounds.width)); + } + this.tooltipPosition = { x, y }; + } + if ((changes.progress || changes.status) && this.progress && this.status) { + this.remaining = this.progress.remainingBlocks; + this.expected = this.progress.expectedBlocks; + this.mined = this.progress.minedBlocks; + this.ahead = Math.max(0, this.mined - this.expected); + this.behind = Math.max(0, this.expected - this.mined); + this.isAhead = this.ahead > 0; + this.isBehind = this.behind > 0; + } + } +} diff --git a/frontend/src/app/components/difficulty/difficulty.component.html b/frontend/src/app/components/difficulty/difficulty.component.html index ce0bf7eff..5b2f23cf3 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.html +++ b/frontend/src/app/components/difficulty/difficulty.component.html @@ -3,81 +3,100 @@
-
-
Remaining
-
- - {{ i }} blocks - {{ i }} block -
-
+
+ + + + + + + + + + + + + + +
-
-
Estimate
-
- - - - - - - {{ epochData.change | absolute | number: '1.2-2' }} - % +
+
+
+ ~ +
+
Average interval
- -
-
-
- Previous: - - - +
+
+ + - - + + - {{ epochData.previousRetarget | absolute | number: '1.2-2' }} % + {{ epochData.change | absolute | number: '1.2-2' }} + % +
+ +
+
+
+ Previous: + + + + + + + + {{ epochData.previousRetarget | absolute | number: '1.2-2' }} % +
-
-
-
Current Period
-
{{ epochData.progress | number: '1.2-2' }} %
-
-
 
+
+
+
+ {{ epochData.retargetDateString }} +
-
-
Next Halving
-
- - {{ i }} blocks - {{ i }} block -
-
-
+
+
+
-
Remaining
-
Estimate
-
Current Period
@@ -85,3 +104,10 @@
+ + \ No newline at end of file diff --git a/frontend/src/app/components/difficulty/difficulty.component.scss b/frontend/src/app/components/difficulty/difficulty.component.scss index c5cd2dc5e..9828ba8f5 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.scss +++ b/frontend/src/app/components/difficulty/difficulty.component.scss @@ -1,8 +1,14 @@ .difficulty-adjustment-container { + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.difficulty-stats { display: flex; flex-direction: row; justify-content: space-around; - height: 76px; + height: 50.5px; .shared-block { color: #ffffff66; font-size: 12px; @@ -24,8 +30,8 @@ } } .card-text { - font-size: 22px; - margin-top: -9px; + font-size: 20px; + margin: auto; position: relative; } } @@ -33,7 +39,9 @@ .difficulty-skeleton { display: flex; - justify-content: space-between; + flex-direction: row; + justify-content: space-around; + height: 50.5px; @media (min-width: 376px) { flex-direction: row; } @@ -65,7 +73,7 @@ width: 100%; display: block; &:first-child { - margin: 14px auto 0; + margin: 10px auto 4px; max-width: 80px; } &:last-child { @@ -109,7 +117,7 @@ } .loading-container { - min-height: 76px; + min-height: 50.5px; } .main-title { @@ -133,7 +141,7 @@ text-align: center; flex-direction: column; justify-content: space-around; - padding: 24px 20px; + padding: 20px; } } @@ -151,4 +159,50 @@ .symbol { font-size: 13px; +} + +.epoch-progress { + width: 100%; + height: 22px; + margin-bottom: 12px; +} + +.epoch-blocks { + display: block; + width: 100%; + background: #2d3348; + + .rect { + fill: #2d3348; + + &.behind { + fill: #D81B60; + } + &.mined { + fill: url(#diff-gradient); + } + &.ahead { + fill: #1a9436; + } + + &.hover { + fill: #535e84; + &.behind { + fill: #e94d86; + } + &.mined { + fill: url(#diff-hover-gradient); + } + &.ahead { + fill: #29d951; + } + } + } +} + +.blocks-ahead { + color: #3bcc49; +} +.blocks-behind { + color: #D81B60; } \ No newline at end of file diff --git a/frontend/src/app/components/difficulty/difficulty.component.ts b/frontend/src/app/components/difficulty/difficulty.component.ts index 76a996acc..910ea1384 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.ts +++ b/frontend/src/app/components/difficulty/difficulty.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; +import { ChangeDetectionStrategy, Component, HostListener, Inject, Input, LOCALE_ID, OnInit } from '@angular/core'; import { combineLatest, Observable, timer } from 'rxjs'; import { map, switchMap } from 'rxjs/operators'; import { StateService } from '../..//services/state.service'; @@ -7,16 +7,33 @@ interface EpochProgress { base: string; change: number; progress: number; + minedBlocks: number; remainingBlocks: number; + expectedBlocks: number; newDifficultyHeight: number; colorAdjustments: string; colorPreviousAdjustments: string; estimatedRetargetDate: number; + retargetDateString: string; previousRetarget: number; blocksUntilHalving: number; timeUntilHalving: number; + timeAvg: number; } +type BlockStatus = 'mined' | 'behind' | 'ahead' | 'next' | 'remaining'; + +interface DiffShape { + x: number; + y: number; + w: number; + h: number; + status: BlockStatus; + expected: boolean; +} + +const EPOCH_BLOCK_LENGTH = 2016; // Bitcoin mainnet + @Component({ selector: 'app-difficulty', templateUrl: './difficulty.component.html', @@ -24,15 +41,27 @@ interface EpochProgress { changeDetection: ChangeDetectionStrategy.OnPush, }) export class DifficultyComponent implements OnInit { - isLoadingWebSocket$: Observable; - difficultyEpoch$: Observable; - @Input() showProgress = true; @Input() showHalving = false; @Input() showTitle = true; + + isLoadingWebSocket$: Observable; + difficultyEpoch$: Observable; + + epochStart: number; + currentHeight: number; + currentIndex: number; + expectedHeight: number; + expectedIndex: number; + difference: number; + shapes: DiffShape[]; + + tooltipPosition = { x: 0, y: 0 }; + hoverSection: DiffShape | void; constructor( public stateService: StateService, + @Inject(LOCALE_ID) private locale: string, ) { } ngOnInit(): void { @@ -65,22 +94,110 @@ export class DifficultyComponent implements OnInit { const blocksUntilHalving = 210000 - (block.height % 210000); const timeUntilHalving = new Date().getTime() + (blocksUntilHalving * 600000); + const newEpochStart = Math.floor(this.stateService.latestBlockHeight / EPOCH_BLOCK_LENGTH) * EPOCH_BLOCK_LENGTH; + const newExpectedHeight = Math.floor(newEpochStart + da.expectedBlocks); + + if (newEpochStart !== this.epochStart || newExpectedHeight !== this.expectedHeight || this.currentHeight !== this.stateService.latestBlockHeight) { + this.epochStart = newEpochStart; + this.expectedHeight = newExpectedHeight; + this.currentHeight = this.stateService.latestBlockHeight; + this.currentIndex = this.currentHeight - this.epochStart; + this.expectedIndex = Math.min(this.expectedHeight - this.epochStart, 2106) - 1; + this.difference = this.currentIndex - this.expectedIndex; + + this.shapes = []; + this.shapes = this.shapes.concat(this.blocksToShapes( + 0, Math.min(this.currentIndex, this.expectedIndex), 'mined', true + )); + this.shapes = this.shapes.concat(this.blocksToShapes( + this.currentIndex + 1, this.expectedIndex, 'behind', true + )); + this.shapes = this.shapes.concat(this.blocksToShapes( + this.expectedIndex + 1, this.currentIndex, 'ahead', false + )); + if (this.currentIndex < 2105) { + this.shapes = this.shapes.concat(this.blocksToShapes( + this.currentIndex + 1, this.currentIndex + 1, 'next', (this.expectedIndex > this.currentIndex) + )); + } + this.shapes = this.shapes.concat(this.blocksToShapes( + Math.max(this.currentIndex + 2, this.expectedIndex + 1), 2105, 'remaining', false + )); + } + + + let retargetDateString; + if (da.remainingBlocks > 1870) { + retargetDateString = (new Date(da.estimatedRetargetDate)).toLocaleDateString(this.locale, { month: 'long', day: 'numeric' }); + } else { + retargetDateString = (new Date(da.estimatedRetargetDate)).toLocaleTimeString(this.locale, { month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric' }); + } const data = { base: `${da.progressPercent.toFixed(2)}%`, change: da.difficultyChange, progress: da.progressPercent, - remainingBlocks: da.remainingBlocks, + minedBlocks: this.currentIndex + 1, + remainingBlocks: da.remainingBlocks - 1, + expectedBlocks: Math.floor(da.expectedBlocks), colorAdjustments, colorPreviousAdjustments, newDifficultyHeight: da.nextRetargetHeight, estimatedRetargetDate: da.estimatedRetargetDate, + retargetDateString, previousRetarget: da.previousRetarget, blocksUntilHalving, timeUntilHalving, + timeAvg: da.timeAvg, }; return data; }) ); } + + blocksToShapes(start: number, end: number, status: BlockStatus, expected: boolean = false): DiffShape[] { + const startY = start % 9; + const startX = Math.floor(start / 9); + const endY = (end % 9); + const endX = Math.floor(end / 9); + + if (startX > endX) { + return []; + } + + if (startX === endX) { + return [{ + x: startX, y: startY, w: 1, h: 1 + endY - startY, status, expected + }]; + } + + const shapes = []; + shapes.push({ + x: startX, y: startY, w: 1, h: 9 - startY, status, expected + }); + shapes.push({ + x: endX, y: 0, w: 1, h: endY + 1, status, expected + }); + + if (startX < endX - 1) { + shapes.push({ + x: startX + 1, y: 0, w: endX - startX - 1, h: 9, status, expected + }); + } + + return shapes; + } + + @HostListener('pointermove', ['$event']) + onPointerMove(event) { + this.tooltipPosition = { x: event.clientX, y: event.clientY }; + } + + onHover(event, rect): void { + this.hoverSection = rect; + } + + onBlur(event): void { + this.hoverSection = null; + } } 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 1a932567c..a51f90f6c 100644 --- a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html +++ b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html @@ -22,7 +22,7 @@
Difficulty Adjustment
- +
diff --git a/frontend/src/app/components/time/time.component.ts b/frontend/src/app/components/time/time.component.ts index 4cc76975e..061061cc9 100644 --- a/frontend/src/app/components/time/time.component.ts +++ b/frontend/src/app/components/time/time.component.ts @@ -19,6 +19,7 @@ export class TimeComponent implements OnInit, OnChanges, OnDestroy { @Input() fixedRender = false; @Input() relative = false; @Input() forceFloorOnTimeIntervals: string[]; + @Input() fractionDigits: number = 0; constructor( private ref: ChangeDetectorRef, @@ -88,7 +89,12 @@ export class TimeComponent implements OnInit, OnChanges, OnDestroy { } else { counter = Math.round(seconds / this.intervals[i]); } - const dateStrings = dates(counter); + let rounded = counter; + if (this.fractionDigits) { + const roundFactor = Math.pow(10,this.fractionDigits); + rounded = Math.round((seconds / this.intervals[i]) * roundFactor) / roundFactor; + } + const dateStrings = dates(rounded); if (counter > 0) { switch (this.kind) { case 'since': diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 7ed32a9de..cad623f9f 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -33,9 +33,11 @@ export interface DifficultyAdjustment { remainingBlocks: number; remainingTime: number; previousRetarget: number; + previousTime: number; nextRetargetHeight: number; timeAvg: number; timeOffset: number; + expectedBlocks: number; } export interface AddressInformation { diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts index 52b469836..188942c02 100644 --- a/frontend/src/app/shared/shared.module.ts +++ b/frontend/src/app/shared/shared.module.ts @@ -58,6 +58,8 @@ import { AssetsNavComponent } from '../components/assets/assets-nav/assets-nav.c import { StatusViewComponent } from '../components/status-view/status-view.component'; import { FeesBoxComponent } from '../components/fees-box/fees-box.component'; import { DifficultyComponent } from '../components/difficulty/difficulty.component'; +import { DifficultyTooltipComponent } from '../components/difficulty/difficulty-tooltip.component'; +import { DifficultyMiningComponent } from '../components/difficulty-mining/difficulty-mining.component'; import { TermsOfServiceComponent } from '../components/terms-of-service/terms-of-service.component'; import { TxBowtieGraphComponent } from '../components/tx-bowtie-graph/tx-bowtie-graph.component'; import { TxBowtieGraphTooltipComponent } from '../components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component'; @@ -133,6 +135,8 @@ import { GeolocationComponent } from '../shared/components/geolocation/geolocati StatusViewComponent, FeesBoxComponent, DifficultyComponent, + DifficultyMiningComponent, + DifficultyTooltipComponent, TxBowtieGraphComponent, TxBowtieGraphTooltipComponent, TermsOfServiceComponent, @@ -234,6 +238,8 @@ import { GeolocationComponent } from '../shared/components/geolocation/geolocati StatusViewComponent, FeesBoxComponent, DifficultyComponent, + DifficultyMiningComponent, + DifficultyTooltipComponent, TxBowtieGraphComponent, TxBowtieGraphTooltipComponent, TermsOfServiceComponent, From ef0cc9d2db0e2b2253dc040890ad7c4a52c8c42f Mon Sep 17 00:00:00 2001 From: softsimon Date: Sat, 11 Mar 2023 18:04:06 +0900 Subject: [PATCH 20/22] Changing interval to block time --- .../difficulty/difficulty.component.html | 2 +- frontend/src/locale/messages.xlf | 342 +++++++++++------- 2 files changed, 222 insertions(+), 122 deletions(-) diff --git a/frontend/src/app/components/difficulty/difficulty.component.html b/frontend/src/app/components/difficulty/difficulty.component.html index 5b2f23cf3..d23edcfe3 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.html +++ b/frontend/src/app/components/difficulty/difficulty.component.html @@ -39,7 +39,7 @@
~
-
Average interval
+
Average block time
diff --git a/frontend/src/locale/messages.xlf b/frontend/src/locale/messages.xlf index 48c7da18d..e040e7bc9 100644 --- a/frontend/src/locale/messages.xlf +++ b/frontend/src/locale/messages.xlf @@ -2452,6 +2452,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2870,6 +2874,10 @@ Difficulty Adjustment + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 @@ -2883,11 +2891,11 @@ Remaining - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -2896,11 +2904,11 @@ blocks - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -2921,11 +2929,11 @@ block - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -2937,11 +2945,11 @@ Estimate - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -2949,19 +2957,23 @@ Previous - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -2969,11 +2981,99 @@ Next Halving - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) @@ -4054,39 +4154,27 @@ Just now src/app/components/time/time.component.ts - 78 + 79 ago - - src/app/components/time/time.component.ts - 97 - - - src/app/components/time/time.component.ts - 98 - - - src/app/components/time/time.component.ts - 99 - - - src/app/components/time/time.component.ts - 100 - - - src/app/components/time/time.component.ts - 101 - - - src/app/components/time/time.component.ts - 102 - src/app/components/time/time.component.ts 103 + + src/app/components/time/time.component.ts + 104 + + + src/app/components/time/time.component.ts + 105 + + + src/app/components/time/time.component.ts + 106 + src/app/components/time/time.component.ts 107 @@ -4099,53 +4187,53 @@ src/app/components/time/time.component.ts 109 - - src/app/components/time/time.component.ts - 110 - - - src/app/components/time/time.component.ts - 111 - - - src/app/components/time/time.component.ts - 112 - src/app/components/time/time.component.ts 113 + + src/app/components/time/time.component.ts + 114 + + + src/app/components/time/time.component.ts + 115 + + + src/app/components/time/time.component.ts + 116 + + + src/app/components/time/time.component.ts + 117 + + + src/app/components/time/time.component.ts + 118 + + + src/app/components/time/time.component.ts + 119 + In ~ - - src/app/components/time/time.component.ts - 120 - - - src/app/components/time/time.component.ts - 121 - - - src/app/components/time/time.component.ts - 122 - - - src/app/components/time/time.component.ts - 123 - - - src/app/components/time/time.component.ts - 124 - - - src/app/components/time/time.component.ts - 125 - src/app/components/time/time.component.ts 126 + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + src/app/components/time/time.component.ts 130 @@ -4158,53 +4246,53 @@ src/app/components/time/time.component.ts 132 - - src/app/components/time/time.component.ts - 133 - - - src/app/components/time/time.component.ts - 134 - - - src/app/components/time/time.component.ts - 135 - src/app/components/time/time.component.ts 136 + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 + After - - src/app/components/time/time.component.ts - 143 - - - src/app/components/time/time.component.ts - 144 - - - src/app/components/time/time.component.ts - 145 - - - src/app/components/time/time.component.ts - 146 - - - src/app/components/time/time.component.ts - 147 - - - src/app/components/time/time.component.ts - 148 - src/app/components/time/time.component.ts 149 + + src/app/components/time/time.component.ts + 150 + + + src/app/components/time/time.component.ts + 151 + + + src/app/components/time/time.component.ts + 152 + src/app/components/time/time.component.ts 153 @@ -4217,22 +4305,34 @@ src/app/components/time/time.component.ts 155 - - src/app/components/time/time.component.ts - 156 - - - src/app/components/time/time.component.ts - 157 - - - src/app/components/time/time.component.ts - 158 - src/app/components/time/time.component.ts 159 + + src/app/components/time/time.component.ts + 160 + + + src/app/components/time/time.component.ts + 161 + + + src/app/components/time/time.component.ts + 162 + + + src/app/components/time/time.component.ts + 163 + + + src/app/components/time/time.component.ts + 164 + + + src/app/components/time/time.component.ts + 165 + This transaction has been replaced by: From 23ea5d582b4fe200eaf115fa65eb1e2d6947568e Mon Sep 17 00:00:00 2001 From: softsimon Date: Sat, 11 Mar 2023 18:32:47 +0900 Subject: [PATCH 21/22] Fixes i18n duplicate warning --- .../components/difficulty/difficulty-tooltip.component.html | 2 +- .../components/difficulty/difficulty-tooltip.component.scss | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/difficulty/difficulty-tooltip.component.html b/frontend/src/app/components/difficulty/difficulty-tooltip.component.html index 57a96cca7..d06bb5e91 100644 --- a/frontend/src/app/components/difficulty/difficulty-tooltip.component.html +++ b/frontend/src/app/components/difficulty/difficulty-tooltip.component.html @@ -35,7 +35,7 @@ {{ i }} block behind - next block + Next Block
\ No newline at end of file diff --git a/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss b/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss index 82b762acd..8b7a5eb73 100644 --- a/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss +++ b/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss @@ -15,4 +15,8 @@ margin: 0; white-space: nowrap; } -} \ No newline at end of file +} + +.next-block { + text-transform: capitalize; +} From 6b4650f3cd24deab416dcb3113f70cbf51286601 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sat, 11 Mar 2023 18:34:51 +0900 Subject: [PATCH 22/22] next block lower case css fix --- .../app/components/difficulty/difficulty-tooltip.component.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss b/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss index 8b7a5eb73..5b4a8a02f 100644 --- a/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss +++ b/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss @@ -18,5 +18,5 @@ } .next-block { - text-transform: capitalize; + text-transform: lowercase; }