Merge branch 'master' into hunicus/doc-nav-fix

This commit is contained in:
Felipe Knorr Kuhn
2023-01-12 22:26:20 -08:00
committed by GitHub
95 changed files with 2550 additions and 816 deletions

View File

@@ -120,7 +120,7 @@ export const languages: Language[] = [
{ code: 'he', name: 'עברית' }, // Hebrew
{ code: 'ka', name: 'ქართული' }, // Georgian
// { code: 'lv', name: 'Latviešu' }, // Latvian
// { code: 'lt', name: 'Lietuvių' }, // Lithuanian
{ code: 'lt', name: 'Lietuvių' }, // Lithuanian
{ code: 'hu', name: 'Magyar' }, // Hungarian
{ code: 'mk', name: 'Македонски' }, // Macedonian
// { code: 'ms', name: 'Bahasa Melayu' }, // Malay

View File

@@ -6,6 +6,7 @@ import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './components/app/app.component';
import { ElectrsApiService } from './services/electrs-api.service';
import { StateService } from './services/state.service';
import { CacheService } from './services/cache.service';
import { EnterpriseService } from './services/enterprise.service';
import { WebsocketService } from './services/websocket.service';
import { AudioService } from './services/audio.service';
@@ -23,6 +24,7 @@ import { AppPreloadingStrategy } from './app.preloading-strategy';
const providers = [
ElectrsApiService,
StateService,
CacheService,
WebsocketService,
AudioService,
SeoService,

View File

@@ -36,7 +36,9 @@ export class AddressLabelsComponent implements OnChanges {
handleChannel() {
const type = this.vout ? 'open' : 'close';
this.label = `Channel ${type}: ${this.channel.node_left.alias} <> ${this.channel.node_right.alias}`;
const leftNodeName = this.channel.node_left.alias || this.channel.node_left.public_key.substring(0, 10);
const rightNodeName = this.channel.node_right.alias || this.channel.node_right.public_key.substring(0, 10);
this.label = `Channel ${type}: ${leftNodeName} <> ${rightNodeName}`;
}
handleVin() {

View File

@@ -42,6 +42,10 @@ export class AppComponent implements OnInit {
if (event.target instanceof HTMLInputElement) {
return;
}
// prevent arrow key horizontal scrolling
if(["ArrowLeft","ArrowRight"].indexOf(event.code) > -1) {
event.preventDefault();
}
this.stateService.keyNavigation$.next(event);
}

View File

@@ -77,6 +77,8 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On
cancelAnimationFrame(this.animationFrameRequest);
clearTimeout(this.animationHeartBeat);
}
this.canvas.nativeElement.removeEventListener('webglcontextlost', this.handleContextLost);
this.canvas.nativeElement.removeEventListener('webglcontextrestored', this.handleContextRestored);
}
clear(direction): void {

View File

@@ -53,13 +53,13 @@
<td i18n="block.miner">Miner</td>
<td *ngIf="stateService.env.MINING_DASHBOARD">
<a [attr.data-cy]="'block-details-miner-badge'" placement="bottom" [routerLink]="['/mining/pool' | relativeUrl, block?.extras.pool.slug]" class="badge"
[class]="block?.extras.pool.name === 'Unknown' ? 'badge-secondary' : 'badge-primary'">
[class]="!block?.extras.pool.name || block?.extras.pool.name === 'Unknown' ? 'badge-secondary' : 'badge-primary'">
{{ block?.extras.pool.name }}
</a>
</td>
<td *ngIf="!stateService.env.MINING_DASHBOARD && stateService.env.BASE_MODULE === 'mempool'">
<span [attr.data-cy]="'block-details-miner-badge'" placement="bottom" class="badge"
[class]="block?.extras.pool.name === 'Unknown' ? 'badge-secondary' : 'badge-primary'">
[class]="!block?.extras.pool.name || block?.extras.pool.name === 'Unknown' ? 'badge-secondary' : 'badge-primary'">
{{ block?.extras.pool.name }}
</span>
</td>

View File

@@ -56,3 +56,7 @@
::ng-deep .symbol {
font-size: 24px;
}
.badge {
transition: none;
}

View File

@@ -32,10 +32,10 @@
<div class="box" *ngIf="!error">
<div class="row">
<ng-template [ngIf]="!isLoadingBlock">
<div class="col-sm">
<table class="table table-borderless table-striped">
<tbody>
<div class="col-sm">
<table class="table table-borderless table-striped">
<tbody>
<ng-container *ngIf="!isLoadingBlock; else skeletonRows">
<tr>
<td class="td-width" i18n="block.hash">Hash</td>
<td>&lrm;<a [routerLink]="['/block/' | relativeUrl, block.id]" title="{{ block.id }}">{{ block.id | shortenString : 13 }}</a> <app-clipboard class="d-none d-sm-inline-block" [text]="block.id"></app-clipboard></td>
@@ -54,83 +54,28 @@
<td i18n="block.weight">Weight</td>
<td [innerHTML]="'&lrm;' + (block.weight | wuBytes: 2)"></td>
</tr>
<tr *ngIf="auditEnabled">
<tr *ngIf="!auditDataMissing && indexingAvailable">
<td i18n="block.health">Block health</td>
<td>
<span *ngIf="blockAudit?.matchRate != null">{{ blockAudit.matchRate }}%</span>
<span *ngIf="blockAudit?.matchRate === null" i18n="unknown">Unknown</span>
<span
class="health-badge badge"
[class.badge-success]="blockAudit?.matchRate >= 99"
[class.badge-warning]="blockAudit?.matchRate >= 75 && blockAudit?.matchRate < 99"
[class.badge-danger]="blockAudit?.matchRate < 75"
*ngIf="blockAudit?.matchRate != null; else nullHealth"
>{{ blockAudit?.matchRate }}%</span>
<ng-template #nullHealth>
<ng-container *ngIf="!isLoadingAudit; else loadingHealth">
<span class="health-badge badge badge-secondary" i18n="unknown">Unknown</span>
</ng-container>
</ng-template>
<ng-template #loadingHealth>
<span class="skeleton-loader" style="max-width: 60px"></span>
</ng-template>
</td>
</tr>
<ng-container *ngIf="webGlEnabled && (auditDataMissing || !indexingAvailable)">
<tr *ngIf="isMobile && auditEnabled"></tr>
<tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
<td i18n="mempool-block.fee-span">Fee span</td>
<td><span>{{ block.extras.feeRange[0] | number:'1.0-0' }} - {{ block.extras.feeRange[block.extras.feeRange.length - 1] | number:'1.0-0' }} <span class="symbol" i18n="shared.sat-vbyte|sat/vB">sat/vB</span></span></td>
</tr>
<tr *ngIf="block?.extras?.medianFee != undefined">
<td class="td-width" i18n="block.median-fee">Median fee</td>
<td>~{{ block?.extras?.medianFee | number:'1.0-0' }} <span class="symbol" i18n="shared.sat-vbyte|sat/vB">sat/vB</span> <span class="fiat"><app-fiat [value]="block?.extras?.medianFee * 140" digitsInfo="1.2-2" i18n-ngbTooltip="Transaction fee tooltip" ngbTooltip="Based on average native segwit transaction of 140 vBytes" placement="bottom"></app-fiat></span></td>
</tr>
<ng-template [ngIf]="fees !== undefined" [ngIfElse]="loadingFees">
<tr>
<td i18n="block.total-fees|Total fees in a block">Total fees</td>
<td *ngIf="network !== 'liquid' && network !== 'liquidtestnet'; else liquidTotalFees">
<app-amount [satoshis]="block.extras.totalFees" digitsInfo="1.2-3" [noFiat]="true"></app-amount>
<span class="fiat">
<app-fiat [value]="block.extras.totalFees" digitsInfo="1.0-0"></app-fiat>
</span>
</td>
<ng-template #liquidTotalFees>
<td>
<app-amount [satoshis]="fees * 100000000" digitsInfo="1.2-2" [noFiat]="true"></app-amount>&nbsp; <app-fiat
[value]="fees * 100000000" digitsInfo="1.2-2"></app-fiat>
</td>
</ng-template>
</tr>
<tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
<td i18n="block.subsidy-and-fees|Total subsidy and fees in a block">Subsidy + fees:</td>
<td>
<app-amount [satoshis]="block.extras.reward" digitsInfo="1.2-3" [noFiat]="true"></app-amount>
<span class="fiat">
<app-fiat [value]="(blockSubsidy + fees) * 100000000" digitsInfo="1.0-0"></app-fiat>
</span>
</td>
</tr>
</ng-template>
<ng-template #loadingFees>
<tr>
<td i18n="block.total-fees|Total fees in a block">Total fees</td>
<td style="width: 75%;"><span class="skeleton-loader"></span></td>
</tr>
<tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
<td i18n="block.subsidy-and-fees|Total subsidy and fees in a block">Subsidy + fees:</td>
<td><span class="skeleton-loader"></span></td>
</tr>
</ng-template>
<tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
<td i18n="block.miner">Miner</td>
<td *ngIf="stateService.env.MINING_DASHBOARD">
<a placement="bottom" [routerLink]="['/mining/pool' | relativeUrl, block.extras.pool.slug]" class="badge"
[class]="block.extras.pool.name === 'Unknown' ? 'badge-secondary' : 'badge-primary'">
{{ block.extras.pool.name }}
</a>
</td>
<td *ngIf="!stateService.env.MINING_DASHBOARD && stateService.env.BASE_MODULE === 'mempool'">
<span placement="bottom" class="badge"
[class]="block.extras.pool.name === 'Unknown' ? 'badge-secondary' : 'badge-primary'">
{{ block.extras.pool.name }}
</span>
</td>
</tr>
</ng-container>
</tbody>
</table>
</div>
</ng-template>
<ng-template [ngIf]="isLoadingBlock">
<div class="col-sm">
<table class="table table-borderless table-striped">
<tbody>
</ng-container>
<ng-template #skeletonRows>
<tr>
<td class="td-width" colspan="2"><span class="skeleton-loader"></span></td>
</tr>
@@ -143,114 +88,18 @@
<tr>
<td colspan="2"><span class="skeleton-loader"></span></td>
</tr>
<tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
<tr *ngIf="!auditDataMissing && indexingAvailable">
<td colspan="2"><span class="skeleton-loader"></span></td>
</tr>
<ng-container *ngIf="webGlEnabled && (!indexingAvailable || auditDataMissing)">
<tr *ngIf="isMobile && !auditEnabled"></tr>
<tr>
<td class="td-width" colspan="2"><span class="skeleton-loader"></span></td>
</tr>
<tr>
<td colspan="2"><span class="skeleton-loader"></span></td>
</tr>
<tr>
<td colspan="2"><span class="skeleton-loader"></span></td>
</tr>
<tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
<td colspan="2"><span class="skeleton-loader"></span></td>
</tr>
<tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
<td colspan="2"><span class="skeleton-loader"></span></td>
</tr>
</ng-container>
</tbody>
</table>
</div>
</ng-template>
<div class="col-sm">
<table class="table table-borderless table-striped" *ngIf="!isLoadingBlock && (!auditDataMissing || indexingAvailable && !webGlEnabled)">
<tbody>
<tr *ngIf="isMobile && auditEnabled"></tr>
<tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
<td i18n="mempool-block.fee-span">Fee span</td>
<td><span>{{ block.extras.feeRange[0] | number:'1.0-0' }} - {{ block.extras.feeRange[block.extras.feeRange.length - 1] | number:'1.0-0' }} <span class="symbol" i18n="shared.sat-vbyte|sat/vB">sat/vB</span></span></td>
</tr>
<tr *ngIf="block?.extras?.medianFee != undefined">
<td class="td-width" i18n="block.median-fee">Median fee</td>
<td>~{{ block?.extras?.medianFee | number:'1.0-0' }} <span class="symbol" i18n="shared.sat-vbyte|sat/vB">sat/vB</span> <span class="fiat"><app-fiat [value]="block?.extras?.medianFee * 140" digitsInfo="1.2-2" i18n-ngbTooltip="Transaction fee tooltip" ngbTooltip="Based on average native segwit transaction of 140 vBytes" placement="bottom"></app-fiat></span></td>
</tr>
<ng-template [ngIf]="fees !== undefined" [ngIfElse]="loadingFees">
<tr>
<td i18n="block.total-fees|Total fees in a block">Total fees</td>
<td *ngIf="network !== 'liquid' && network !== 'liquidtestnet'; else liquidTotalFees">
<app-amount [satoshis]="block.extras.totalFees" digitsInfo="1.2-3" [noFiat]="true"></app-amount>
<span class="fiat">
<app-fiat [value]="block.extras.totalFees" digitsInfo="1.0-0"></app-fiat>
</span>
</td>
<ng-template #liquidTotalFees>
<td>
<app-amount [satoshis]="fees * 100000000" digitsInfo="1.2-2" [noFiat]="true"></app-amount>&nbsp; <app-fiat
[value]="fees * 100000000" digitsInfo="1.2-2"></app-fiat>
</td>
</ng-template>
</tr>
<tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
<td i18n="block.subsidy-and-fees|Total subsidy and fees in a block">Subsidy + fees:</td>
<td>
<app-amount [satoshis]="block.extras.reward" digitsInfo="1.2-3" [noFiat]="true"></app-amount>
<span class="fiat">
<app-fiat [value]="(blockSubsidy + fees) * 100000000" digitsInfo="1.0-0"></app-fiat>
</span>
</td>
</tr>
</ng-template>
<ng-template #loadingFees>
<tr>
<td i18n="block.total-fees|Total fees in a block">Total fees</td>
<td style="width: 75%;"><span class="skeleton-loader"></span></td>
</tr>
<tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
<td i18n="block.subsidy-and-fees|Total subsidy and fees in a block">Subsidy + fees:</td>
<td><span class="skeleton-loader"></span></td>
</tr>
</ng-template>
<tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
<td i18n="block.miner">Miner</td>
<td *ngIf="stateService.env.MINING_DASHBOARD">
<a placement="bottom" [routerLink]="['/mining/pool' | relativeUrl, block.extras.pool.slug]" class="badge"
[class]="block.extras.pool.name === 'Unknown' ? 'badge-secondary' : 'badge-primary'">
{{ block.extras.pool.name }}
</a>
</td>
<td *ngIf="!stateService.env.MINING_DASHBOARD && stateService.env.BASE_MODULE === 'mempool'">
<span placement="bottom" class="badge"
[class]="block.extras.pool.name === 'Unknown' ? 'badge-secondary' : 'badge-primary'">
{{ block.extras.pool.name }}
</span>
</td>
</tr>
<ng-container *ngIf="isMobile || (webGlEnabled && (auditDataMissing || !indexingAvailable)); then restOfTable;"></ng-container>
</tbody>
</table>
<table class="table table-borderless table-striped" *ngIf="isLoadingBlock && !auditDataMissing && (indexingAvailable || !webGlEnabled)">
</div>
<div class="col-sm">
<table class="table table-borderless table-striped" *ngIf="!isMobile && !(webGlEnabled && (auditDataMissing || !indexingAvailable))">
<tbody>
<tr *ngIf="isMobile && !auditEnabled"></tr>
<tr>
<td class="td-width" colspan="2"><span class="skeleton-loader"></span></td>
</tr>
<tr>
<td colspan="2"><span class="skeleton-loader"></span></td>
</tr>
<tr>
<td colspan="2"><span class="skeleton-loader"></span></td>
</tr>
<tr>
<td colspan="2"><span class="skeleton-loader"></span></td>
</tr>
<tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
<td colspan="2"><span class="skeleton-loader"></span></td>
</tr>
<ng-container *ngTemplateOutlet="restOfTable"></ng-container>
</tbody>
</table>
<div class="col-sm chart-container" *ngIf="webGlEnabled && (!indexingAvailable || auditDataMissing)">
@@ -263,11 +112,93 @@
[flip]="false"
(txClickEvent)="onTxClick($event)"
></app-block-overview-graph>
<ng-container *ngTemplateOutlet="emptyBlockInfo"></ng-container>
</div>
</div>
</div>
</div>
<ng-template #restOfTable>
<ng-container *ngIf="!isLoadingBlock; else loadingRest">
<tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
<td i18n="mempool-block.fee-span">Fee span</td>
<td><span>{{ block.extras.feeRange[0] | number:'1.0-0' }} - {{ block.extras.feeRange[block.extras.feeRange.length - 1] | number:'1.0-0' }} <span class="symbol" i18n="shared.sat-vbyte|sat/vB">sat/vB</span></span></td>
</tr>
<tr *ngIf="block?.extras?.medianFee != undefined">
<td class="td-width" i18n="block.median-fee">Median fee</td>
<td>~{{ block?.extras?.medianFee | number:'1.0-0' }} <span class="symbol" i18n="shared.sat-vbyte|sat/vB">sat/vB</span> <span class="fiat"><app-fiat [value]="block?.extras?.medianFee * 140" digitsInfo="1.2-2" i18n-ngbTooltip="Transaction fee tooltip" ngbTooltip="Based on average native segwit transaction of 140 vBytes" placement="bottom"></app-fiat></span></td>
</tr>
<ng-template [ngIf]="fees !== undefined" [ngIfElse]="loadingFees">
<tr>
<td i18n="block.total-fees|Total fees in a block">Total fees</td>
<td *ngIf="network !== 'liquid' && network !== 'liquidtestnet'; else liquidTotalFees">
<app-amount [satoshis]="block.extras.totalFees" digitsInfo="1.2-3" [noFiat]="true"></app-amount>
<span class="fiat">
<app-fiat [value]="block.extras.totalFees" digitsInfo="1.0-0"></app-fiat>
</span>
</td>
<ng-template #liquidTotalFees>
<td>
<app-amount [satoshis]="fees * 100000000" digitsInfo="1.2-2" [noFiat]="true"></app-amount>&nbsp; <app-fiat
[value]="fees * 100000000" digitsInfo="1.2-2"></app-fiat>
</td>
</ng-template>
</tr>
<tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
<td i18n="block.subsidy-and-fees|Total subsidy and fees in a block">Subsidy + fees:</td>
<td>
<app-amount [satoshis]="block.extras.reward" digitsInfo="1.2-3" [noFiat]="true"></app-amount>
<span class="fiat">
<app-fiat [value]="(blockSubsidy + fees) * 100000000" digitsInfo="1.0-0"></app-fiat>
</span>
</td>
</tr>
</ng-template>
<ng-template #loadingFees>
<tr>
<td i18n="block.total-fees|Total fees in a block">Total fees</td>
<td style="width: 75%;"><span class="skeleton-loader"></span></td>
</tr>
<tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
<td i18n="block.subsidy-and-fees|Total subsidy and fees in a block">Subsidy + fees:</td>
<td><span class="skeleton-loader"></span></td>
</tr>
</ng-template>
<tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
<td i18n="block.miner">Miner</td>
<td *ngIf="stateService.env.MINING_DASHBOARD">
<a placement="bottom" [routerLink]="['/mining/pool' | relativeUrl, block.extras.pool.slug]" class="badge"
[class]="block.extras.pool.name === 'Unknown' ? 'badge-secondary' : 'badge-primary'">
{{ block.extras.pool.name }}
</a>
</td>
<td *ngIf="!stateService.env.MINING_DASHBOARD && stateService.env.BASE_MODULE === 'mempool'">
<span placement="bottom" class="badge"
[class]="block.extras.pool.name === 'Unknown' ? 'badge-secondary' : 'badge-primary'">
{{ block.extras.pool.name }}
</span>
</td>
</tr>
</ng-container>
<ng-template #loadingRest>
<tr>
<td class="td-width" colspan="2"><span class="skeleton-loader"></span></td>
</tr>
<tr>
<td colspan="2"><span class="skeleton-loader"></span></td>
</tr>
<tr>
<td colspan="2"><span class="skeleton-loader"></span></td>
</tr>
<tr>
<td colspan="2"><span class="skeleton-loader"></span></td>
</tr>
<tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
<td colspan="2"><span class="skeleton-loader"></span></td>
</tr>
</ng-template>
</ng-template>
<span id="overview"></span>
<br>
@@ -283,15 +214,21 @@
<div class="row">
<div class="col-sm">
<h3 class="block-subtitle" *ngIf="!isMobile" i18n="block.projected-block">Projected Block</h3>
<app-block-overview-graph #blockGraphProjected [isLoading]="isLoadingOverview" [resolution]="75"
[blockLimit]="stateService.blockVSize" [orientation]="'top'" [flip]="false" [mirrorTxid]="hoverTx"
(txClickEvent)="onTxClick($event)" (txHoverEvent)="onTxHover($event)" [unavailable]="!isMobile && !auditEnabled"></app-block-overview-graph>
<div class="block-graph-wrapper">
<app-block-overview-graph #blockGraphProjected [isLoading]="isLoadingOverview" [resolution]="75"
[blockLimit]="stateService.blockVSize" [orientation]="'top'" [flip]="false" [mirrorTxid]="hoverTx"
(txClickEvent)="onTxClick($event)" (txHoverEvent)="onTxHover($event)" [unavailable]="!isMobile && !auditEnabled"></app-block-overview-graph>
<ng-container *ngIf="!isMobile || mode !== 'actual'; else emptyBlockInfo"></ng-container>
</div>
</div>
<div class="col-sm" *ngIf="!isMobile">
<h3 class="block-subtitle" *ngIf="!isMobile" i18n="block.actual-block">Actual Block</h3>
<app-block-overview-graph #blockGraphActual [isLoading]="isLoadingOverview" [resolution]="75"
[blockLimit]="stateService.blockVSize" [orientation]="'top'" [flip]="false" [mirrorTxid]="hoverTx" mode="mined"
(txClickEvent)="onTxClick($event)" (txHoverEvent)="onTxHover($event)" [unavailable]="isMobile && !auditEnabled"></app-block-overview-graph>
<div class="block-graph-wrapper">
<app-block-overview-graph #blockGraphActual [isLoading]="isLoadingOverview" [resolution]="75"
[blockLimit]="stateService.blockVSize" [orientation]="'top'" [flip]="false" [mirrorTxid]="hoverTx" mode="mined"
(txClickEvent)="onTxClick($event)" (txHoverEvent)="onTxHover($event)" [unavailable]="isMobile && !auditEnabled"></app-block-overview-graph>
<ng-container *ngTemplateOutlet="emptyBlockInfo"></ng-container>
</div>
</div>
</div>
</div>
@@ -413,5 +350,17 @@
</div>
<ng-template #emptyBlockInfo>
<a
*ngIf="network === '' && block && block.height > 100000 && block.tx_count <= 1"
class="info-bubble-link badge badge-primary"
[routerLink]="['/docs/faq/' | relativeUrl]"
fragment="why-empty-blocks"
>
<fa-icon [icon]="['fas', 'info-circle']" [fixedWidth]="true"></fa-icon>
<span i18n="block.empty-block-explanation">Why is this block empty?</span>
</a>
</ng-template>
<br>
<br>

View File

@@ -202,4 +202,24 @@ h1 {
&.active, &:hover {
border-color: white;
}
}
.block-graph-wrapper {
position: relative;
}
.info-bubble-link {
position: absolute;
display: block;
top: 2em;
left: 50%;
margin: auto;
text-align: center;
padding: 0.5em 1em;
font-size: 80%;
transform: translateX(-50%);
.ng-fa-icon {
margin-right: 1em;
}
}

View File

@@ -43,6 +43,7 @@ export class BlockComponent implements OnInit, OnDestroy {
strippedTransactions: TransactionStripped[];
overviewTransitionDirection: string;
isLoadingOverview = true;
isLoadingAudit = true;
error: any;
blockSubsidy: number;
fees: number;
@@ -137,7 +138,6 @@ export class BlockComponent implements OnInit, OnDestroy {
this.page = 1;
this.error = undefined;
this.fees = undefined;
this.stateService.markBlock$.next({});
this.auditDataMissing = false;
if (history.state.data && history.state.data.blockHeight) {
@@ -297,13 +297,18 @@ export class BlockComponent implements OnInit, OnDestroy {
this.auditSubscription = block$.pipe(
startWith(null),
pairwise(),
switchMap(([prevBlock, block]) => this.apiService.getBlockAudit$(block.id)
.pipe(
catchError((err) => {
this.overviewError = err;
return of([]);
})
)
switchMap(([prevBlock, block]) => {
this.isLoadingAudit = true;
this.blockAudit = null;
return this.apiService.getBlockAudit$(block.id)
.pipe(
catchError((err) => {
this.overviewError = err;
this.isLoadingAudit = false;
return of([]);
})
);
}
),
filter((response) => response != null),
map((response) => {
@@ -375,12 +380,14 @@ export class BlockComponent implements OnInit, OnDestroy {
console.log(err);
this.error = err;
this.isLoadingOverview = false;
this.isLoadingAudit = false;
return of(null);
}),
).subscribe((blockAudit) => {
this.blockAudit = blockAudit;
this.setupBlockGraphs();
this.isLoadingOverview = false;
this.isLoadingAudit = false;
});
}

View File

@@ -1,36 +1,55 @@
<div class="blocks-container blockchain-blocks-container" [class.time-ltr]="timeLtr" *ngIf="(loadingBlocks$ | async) === false; else loadingBlocksTemplate">
<div *ngFor="let block of blocks; let i = index; trackBy: trackByBlocksFn" >
<div [attr.data-cy]="'bitcoin-block-' + i" class="text-center bitcoin-block mined-block blockchain-blocks-{{ i }}" id="bitcoin-block-{{ block.height }}" [ngStyle]="blockStyles[i]" [class.blink-bg]="(specialBlocks[block.height] !== undefined)">
<a draggable="false" [routerLink]="['/block/' | relativeUrl, block.id]" [state]="{ data: { block: block } }"
class="blockLink" [ngClass]="{'disabled': (this.stateService.blockScrolling$ | async)}">&nbsp;</a>
<div [attr.data-cy]="'bitcoin-block-' + i + '-height'" class="block-height">
<a [routerLink]="['/block/' | relativeUrl, block.id]" [state]="{ data: { block: block } }">{{ block.height }}</a>
<div class="blocks-container blockchain-blocks-container" [class.time-ltr]="timeLtr" [style.left]="static ? (offset || 0) + 'px' : null" *ngIf="(loadingBlocks$ | async) === false; else loadingBlocksTemplate">
<div *ngFor="let block of blocks; let i = index; trackBy: trackByBlocksFn">
<ng-container *ngIf="block && !block.loading && !block.placeholder; else placeholderBlock">
<div [attr.data-cy]="'bitcoin-block-' + i" class="text-center bitcoin-block mined-block blockchain-blocks-{{ i }}" id="bitcoin-block-{{ block.height }}" [ngStyle]="blockStyles[i]" [class.blink-bg]="(specialBlocks[block.height] !== undefined)">
<a draggable="false" [routerLink]="['/block/' | relativeUrl, block.id]" [state]="{ data: { block: block } }"
class="blockLink" [ngClass]="{'disabled': (this.stateService.blockScrolling$ | async)}">&nbsp;</a>
<div [attr.data-cy]="'bitcoin-block-' + i + '-height'" class="block-height">
<a [routerLink]="['/block/' | relativeUrl, block.id]" [state]="{ data: { block: block } }">{{ block.height }}</a>
</div>
<div class="block-body">
<div [attr.data-cy]="'bitcoin-block-' + i + '-fees'" class="fees">
~{{ block?.extras?.medianFee | number:feeRounding }} <ng-container i18n="shared.sat-vbyte|sat/vB">sat/vB</ng-container>
</div>
<div [attr.data-cy]="'bitcoin-block-' + i + '-fee-span'" class="fee-span" *ngIf="block?.extras?.feeRange">
{{ block?.extras?.feeRange?.[1] | number:feeRounding }} - {{ block?.extras?.feeRange[block?.extras?.feeRange?.length - 1] | number:feeRounding }} <ng-container i18n="shared.sat-vbyte|sat/vB">sat/vB</ng-container>
</div>
<div [attr.data-cy]="'bitcoin-block-' + i + '-fee-span'" class="fee-span" *ngIf="!block?.extras?.feeRange">
&nbsp;
</div>
<div [attr.data-cy]="'bitcoin-block-' + i + '-total-fees'" *ngIf="showMiningInfo" class="block-size">
<app-amount [satoshis]="block.extras?.totalFees ?? 0" digitsInfo="1.2-3" [noFiat]="true"></app-amount>
</div>
<div [attr.data-cy]="'bitcoin-block-' + i + 'block-size'" *ngIf="!showMiningInfo" class="block-size" [innerHTML]="'&lrm;' + (block.size | bytes: 2)"></div>
<div [attr.data-cy]="'bitcoin-block-' + i + '-transactions'" class="transaction-count">
<ng-container *ngTemplateOutlet="block.tx_count === 1 ? transactionsSingular : transactionsPlural; context: {$implicit: block.tx_count | number}"></ng-container>
<ng-template #transactionsSingular let-i i18n="shared.transaction-count.singular">{{ i }} transaction</ng-template>
<ng-template #transactionsPlural let-i i18n="shared.transaction-count.plural">{{ i }} transactions</ng-template>
</div>
<div [attr.data-cy]="'bitcoin-block-' + i + '-time'" class="time-difference"><app-time-since [time]="block.timestamp" [fastRender]="true"></app-time-since></div>
</div>
<div class="animated" [class]="showMiningInfo ? 'show' : 'hide'" *ngIf="block.extras?.pool != undefined">
<a [attr.data-cy]="'bitcoin-block-' + i + '-pool'" class="badge badge-primary" [routerLink]="[('/mining/pool/' + block.extras.pool.slug) | relativeUrl]">
{{ block.extras.pool.name}}</a>
</div>
</div>
<div class="block-body">
<div [attr.data-cy]="'bitcoin-block-' + i + '-fees'" class="fees">
~{{ block?.extras?.medianFee | number:feeRounding }} <ng-container i18n="shared.sat-vbyte|sat/vB">sat/vB</ng-container>
</ng-container>
<ng-template #placeholderBlock>
<ng-container *ngIf="block && block.placeholder; else loadingBlock">
<div [attr.data-cy]="'bitcoin-block-' + i" class="text-center bitcoin-block mined-block placeholder-block blockchain-blocks-{{ i }}" id="bitcoin-block-{{ block.height }}" [ngStyle]="blockStyles[i]">
</div>
<div [attr.data-cy]="'bitcoin-block-' + i + '-fee-span'" class="fee-span">
{{ block?.extras?.feeRange[1] | number:feeRounding }} - {{ block?.extras?.feeRange[block?.extras?.feeRange.length - 1] | number:feeRounding }} <ng-container i18n="shared.sat-vbyte|sat/vB">sat/vB</ng-container>
</ng-container>
</ng-template>
<ng-template #loadingBlock>
<ng-container *ngIf="block && block.loading">
<div class="flashing">
<div class="text-center bitcoin-block mined-block" id="bitcoin-block-{{ block.height }}" [ngStyle]="blockStyles[i]"></div>
</div>
<div [attr.data-cy]="'bitcoin-block-' + i + '-total-fees'" *ngIf="showMiningInfo" class="block-size">
<app-amount [satoshis]="block.extras?.totalFees ?? 0" digitsInfo="1.2-3" [noFiat]="true"></app-amount>
</div>
<div [attr.data-cy]="'bitcoin-block-' + i + 'block-size'" *ngIf="!showMiningInfo" class="block-size" [innerHTML]="'&lrm;' + (block.size | bytes: 2)"></div>
<div [attr.data-cy]="'bitcoin-block-' + i + '-transactions'" class="transaction-count">
<ng-container *ngTemplateOutlet="block.tx_count === 1 ? transactionsSingular : transactionsPlural; context: {$implicit: block.tx_count | number}"></ng-container>
<ng-template #transactionsSingular let-i i18n="shared.transaction-count.singular">{{ i }} transaction</ng-template>
<ng-template #transactionsPlural let-i i18n="shared.transaction-count.plural">{{ i }} transactions</ng-template>
</div>
<div [attr.data-cy]="'bitcoin-block-' + i + '-time'" class="time-difference"><app-time-since [time]="block.timestamp" [fastRender]="true"></app-time-since></div>
</div>
<div class="animated" [class]="showMiningInfo ? 'show' : 'hide'" *ngIf="block.extras?.pool != undefined">
<a [attr.data-cy]="'bitcoin-block-' + i + '-pool'" class="badge badge-primary" [routerLink]="[('/mining/pool/' + block.extras.pool.slug) | relativeUrl]">
{{ block.extras.pool.name}}</a>
</div>
</div>
</ng-container>
</ng-template>
</div>
<div [hidden]="!arrowVisible" id="arrow-up" [style.transition]="transition" [ngStyle]="{'left': arrowLeftPx + 'px' }"></div>
<div [hidden]="!arrowVisible" id="arrow-up" [style.transition]="arrowTransition" [ngStyle]="{'left': arrowLeftPx + 'px' }"></div>
</div>
<ng-template #loadingBlocksTemplate>

View File

@@ -25,6 +25,10 @@
transition: background 2s, left 2s, transform 1s;
}
.mined-block.placeholder-block {
background: none !important;
}
.block-size {
font-size: 16px;
font-weight: bold;
@@ -96,6 +100,16 @@
transform-origin: top;
}
.bitcoin-block.placeholder-block::after {
content: none;
background: 0;
}
.bitcoin-block.placeholder-block::before {
content: none;
background: 0;
}
.black-background {
background-color: #11131f;
z-index: 100;

View File

@@ -1,10 +1,16 @@
import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';
import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef, Input, OnChanges, SimpleChanges } from '@angular/core';
import { Observable, Subscription } from 'rxjs';
import { StateService } from '../../services/state.service';
import { specialBlocks } from '../../app.constants';
import { BlockExtended } from '../../interfaces/node-api.interface';
import { Location } from '@angular/common';
import { config } from 'process';
import { CacheService } from 'src/app/services/cache.service';
interface BlockchainBlock extends BlockExtended {
placeholder?: boolean;
loading?: boolean;
}
@Component({
selector: 'app-blockchain-blocks',
@@ -12,13 +18,19 @@ import { config } from 'process';
styleUrls: ['./blockchain-blocks.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class BlockchainBlocksComponent implements OnInit, OnDestroy {
export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy {
@Input() static: boolean = false;
@Input() offset: number = 0;
@Input() height: number = 0;
@Input() count: number = 8;
specialBlocks = specialBlocks;
network = '';
blocks: BlockExtended[] = [];
blocks: BlockchainBlock[] = [];
emptyBlocks: BlockExtended[] = this.mountEmptyBlocks();
markHeight: number;
blocksSubscription: Subscription;
blockPageSubscription: Subscription;
networkSubscription: Subscription;
tabHiddenSubscription: Subscription;
markBlockSubscription: Subscription;
@@ -31,7 +43,7 @@ export class BlockchainBlocksComponent implements OnInit, OnDestroy {
arrowVisible = false;
arrowLeftPx = 30;
blocksFilled = false;
transition = '1s';
arrowTransition = '1s';
showMiningInfo = false;
timeLtrSubscription: Subscription;
timeLtr: boolean;
@@ -47,6 +59,7 @@ export class BlockchainBlocksComponent implements OnInit, OnDestroy {
constructor(
public stateService: StateService,
public cacheService: CacheService,
private cd: ChangeDetectorRef,
private location: Location,
) {
@@ -75,44 +88,52 @@ export class BlockchainBlocksComponent implements OnInit, OnDestroy {
this.loadingBlocks$ = this.stateService.isLoadingWebSocket$;
this.networkSubscription = this.stateService.networkChanged$.subscribe((network) => this.network = network);
this.tabHiddenSubscription = this.stateService.isTabHidden$.subscribe((tabHidden) => this.tabHidden = tabHidden);
this.blocksSubscription = this.stateService.blocks$
.subscribe(([block, txConfirmed]) => {
if (this.blocks.some((b) => b.height === block.height)) {
return;
}
if (!this.static) {
this.blocksSubscription = this.stateService.blocks$
.subscribe(([block, txConfirmed]) => {
if (this.blocks.some((b) => b.height === block.height)) {
return;
}
if (this.blocks.length && block.height !== this.blocks[0].height + 1) {
this.blocks = [];
this.blocksFilled = false;
}
if (this.blocks.length && block.height !== this.blocks[0].height + 1) {
this.blocks = [];
this.blocksFilled = false;
}
this.blocks.unshift(block);
this.blocks = this.blocks.slice(0, this.stateService.env.KEEP_BLOCKS_AMOUNT);
this.blocks.unshift(block);
this.blocks = this.blocks.slice(0, this.stateService.env.KEEP_BLOCKS_AMOUNT);
if (this.blocksFilled && !this.tabHidden && block.extras) {
block.extras.stage = block.extras.matchRate >= 66 ? 1 : 2;
}
if (txConfirmed) {
this.markHeight = block.height;
this.moveArrowToPosition(true, true);
} else {
this.moveArrowToPosition(true, false);
}
if (txConfirmed) {
this.markHeight = block.height;
this.moveArrowToPosition(true, true);
} else {
this.moveArrowToPosition(true, false);
}
this.blockStyles = [];
this.blocks.forEach((b) => this.blockStyles.push(this.getStyleForBlock(b)));
setTimeout(() => {
this.blockStyles = [];
this.blocks.forEach((b) => this.blockStyles.push(this.getStyleForBlock(b)));
this.cd.markForCheck();
}, 50);
if (this.blocksFilled) {
this.blocks.forEach((b, i) => this.blockStyles.push(this.getStyleForBlock(b, i, i ? -155 : -205)));
setTimeout(() => {
this.blockStyles = [];
this.blocks.forEach((b, i) => this.blockStyles.push(this.getStyleForBlock(b, i)));
this.cd.markForCheck();
}, 50);
} else {
this.blocks.forEach((b, i) => this.blockStyles.push(this.getStyleForBlock(b, i)));
}
if (this.blocks.length === this.stateService.env.KEEP_BLOCKS_AMOUNT) {
this.blocksFilled = true;
if (this.blocks.length === this.stateService.env.KEEP_BLOCKS_AMOUNT) {
this.blocksFilled = true;
}
this.cd.markForCheck();
});
} else {
this.blockPageSubscription = this.cacheService.loadedBlocks$.subscribe((block) => {
if (block.height <= this.height && block.height > this.height - this.count) {
this.onBlockLoaded(block);
}
this.cd.markForCheck();
});
}
this.markBlockSubscription = this.stateService.markBlock$
.subscribe((state) => {
@@ -123,10 +144,26 @@ export class BlockchainBlocksComponent implements OnInit, OnDestroy {
this.moveArrowToPosition(false);
this.cd.markForCheck();
});
if (this.static) {
this.updateStaticBlocks();
}
}
ngOnChanges(changes: SimpleChanges): void {
if (this.static) {
const animateSlide = changes.height && (changes.height.currentValue === changes.height.previousValue + 1);
this.updateStaticBlocks(animateSlide);
}
}
ngOnDestroy() {
this.blocksSubscription.unsubscribe();
if (this.blocksSubscription) {
this.blocksSubscription.unsubscribe();
}
if (this.blockPageSubscription) {
this.blockPageSubscription.unsubscribe();
}
this.networkSubscription.unsubscribe();
this.tabHiddenSubscription.unsubscribe();
this.markBlockSubscription.unsubscribe();
@@ -142,13 +179,13 @@ export class BlockchainBlocksComponent implements OnInit, OnDestroy {
const blockindex = this.blocks.findIndex((b) => b.height === this.markHeight);
if (blockindex > -1) {
if (!animate) {
this.transition = 'inherit';
this.arrowTransition = 'inherit';
}
this.arrowVisible = true;
if (newBlockFromLeft) {
this.arrowLeftPx = blockindex * 155 + 30 - 205;
setTimeout(() => {
this.transition = '2s';
this.arrowTransition = '2s';
this.arrowLeftPx = blockindex * 155 + 30;
this.cd.markForCheck();
}, 50);
@@ -156,45 +193,117 @@ export class BlockchainBlocksComponent implements OnInit, OnDestroy {
this.arrowLeftPx = blockindex * 155 + 30;
if (!animate) {
setTimeout(() => {
this.transition = '2s';
this.arrowTransition = '2s';
this.cd.markForCheck();
});
}, 50);
}
}
} else {
this.arrowVisible = false;
}
}
trackByBlocksFn(index: number, item: BlockExtended) {
trackByBlocksFn(index: number, item: BlockchainBlock) {
return item.height;
}
getStyleForBlock(block: BlockExtended) {
updateStaticBlocks(animateSlide: boolean = false) {
// reset blocks
this.blocks = [];
this.blockStyles = [];
while (this.blocks.length < this.count) {
const height = this.height - this.blocks.length;
let block;
if (height >= 0) {
this.cacheService.loadBlock(height);
block = this.cacheService.getCachedBlock(height) || null;
}
this.blocks.push(block || {
placeholder: height < 0,
loading: height >= 0,
id: '',
height,
version: 0,
timestamp: 0,
bits: 0,
nonce: 0,
difficulty: 0,
merkle_root: '',
tx_count: 0,
size: 0,
weight: 0,
previousblockhash: '',
});
}
this.blocks = this.blocks.slice(0, this.count);
this.blockStyles = [];
this.blocks.forEach((b, i) => this.blockStyles.push(this.getStyleForBlock(b, i, animateSlide ? -155 : 0)));
this.cd.markForCheck();
if (animateSlide) {
// animate blocks slide right
setTimeout(() => {
this.blockStyles = [];
this.blocks.forEach((b, i) => this.blockStyles.push(this.getStyleForBlock(b, i)));
this.cd.markForCheck();
}, 50);
this.moveArrowToPosition(true, true);
} else {
this.moveArrowToPosition(false, false);
}
}
onBlockLoaded(block: BlockExtended) {
const blockIndex = this.height - block.height;
if (blockIndex >= 0 && blockIndex < this.blocks.length) {
this.blocks[blockIndex] = block;
this.blockStyles[blockIndex] = this.getStyleForBlock(block, blockIndex);
}
this.cd.markForCheck();
}
getStyleForBlock(block: BlockchainBlock, index: number, animateEnterFrom: number = 0) {
if (!block || block.placeholder) {
return this.getStyleForPlaceholderBlock(index, animateEnterFrom);
} else if (block.loading) {
return this.getStyleForLoadingBlock(index, animateEnterFrom);
}
const greenBackgroundHeight = 100 - (block.weight / this.stateService.env.BLOCK_WEIGHT_UNITS) * 100;
let addLeft = 0;
if (block?.extras?.stage === 1) {
block.extras.stage = 2;
addLeft = -205;
if (animateEnterFrom) {
addLeft = animateEnterFrom || 0;
}
return {
left: addLeft + 155 * this.blocks.indexOf(block) + 'px',
left: addLeft + 155 * index + 'px',
background: `repeating-linear-gradient(
#2d3348,
#2d3348 ${greenBackgroundHeight}%,
${this.gradientColors[this.network][0]} ${Math.max(greenBackgroundHeight, 0)}%,
${this.gradientColors[this.network][1]} 100%
)`,
transition: animateEnterFrom ? 'background 2s, transform 1s' : null,
};
}
getStyleForEmptyBlock(block: BlockExtended) {
let addLeft = 0;
getStyleForLoadingBlock(index: number, animateEnterFrom: number = 0) {
const addLeft = animateEnterFrom || 0;
if (block?.extras?.stage === 1) {
block.extras.stage = 2;
addLeft = -205;
}
return {
left: addLeft + (155 * index) + 'px',
background: "#2d3348",
};
}
getStyleForPlaceholderBlock(index: number, animateEnterFrom: number = 0) {
const addLeft = animateEnterFrom || 0;
return {
left: addLeft + (155 * index) + 'px',
};
}
getStyleForEmptyBlock(block: BlockExtended, animateEnterFrom: number = 0) {
const addLeft = animateEnterFrom || 0;
return {
left: addLeft + 155 * this.emptyBlocks.indexOf(block) + 'px',
@@ -219,7 +328,6 @@ export class BlockchainBlocksComponent implements OnInit, OnDestroy {
weight: 0,
previousblockhash: '',
matchRate: 0,
stage: 0,
});
}
return emptyBlocks;

View File

@@ -2,10 +2,14 @@
<div class="position-container" [ngClass]="network ? network : ''">
<span>
<div class="blocks-wrapper">
<app-mempool-blocks></app-mempool-blocks>
<app-blockchain-blocks></app-blockchain-blocks>
<div class="scroll-spacer" *ngIf="minScrollWidth" [style.left]="minScrollWidth + 'px'"></div>
<app-mempool-blocks [hidden]="pageIndex > 0"></app-mempool-blocks>
<app-blockchain-blocks [hidden]="pageIndex > 0"></app-blockchain-blocks>
<ng-container *ngFor="let page of pages; trackBy: trackByPageFn">
<app-blockchain-blocks [static]="true" [offset]="page.offset" [height]="page.height" [count]="blocksPerPage"></app-blockchain-blocks>
</ng-container>
</div>
<div id="divider">
<div id="divider" [hidden]="pageIndex > 0">
<button class="time-toggle" (click)="toggleTimeDirection()"><fa-icon [icon]="['fas', 'exchange-alt']" [fixedWidth]="true"></fa-icon></button>
</div>
</span>

View File

@@ -72,6 +72,15 @@
position: relative;
}
.scroll-spacer {
position: absolute;
top: 0;
left: 0;
width: 1px;
height: 1px;
pointer-events: none;
}
.loading-block {
position: absolute;
text-align: center;

View File

@@ -1,4 +1,4 @@
import { Component, OnInit, OnDestroy, ChangeDetectionStrategy } from '@angular/core';
import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, Input, OnChanges, SimpleChanges } from '@angular/core';
import { Subscription } from 'rxjs';
import { StateService } from '../../services/state.service';
@@ -9,6 +9,11 @@ import { StateService } from '../../services/state.service';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class BlockchainComponent implements OnInit, OnDestroy {
@Input() pages: any[] = [];
@Input() pageIndex: number;
@Input() blocksPerPage: number = 8;
@Input() minScrollWidth: number = 0;
network: string;
timeLtrSubscription: Subscription;
timeLtr: boolean = this.stateService.timeLtr.value;
@@ -29,6 +34,10 @@ export class BlockchainComponent implements OnInit, OnDestroy {
this.timeLtrSubscription.unsubscribe();
}
trackByPageFn(index: number, item: { index: number }) {
return item.index;
}
toggleTimeDirection() {
this.ltrTransitionEnabled = true;
this.stateService.timeLtr.next(!this.timeLtr);

View File

@@ -14,7 +14,7 @@
i18n-ngbTooltip="mining.pool-name" ngbTooltip="Pool" placement="bottom" #miningpool [disableTooltip]="!isEllipsisActive(miningpool)">Pool</th>
<th class="timestamp" i18n="latest-blocks.timestamp" *ngIf="!widget" [class]="indexingAvailable ? '' : 'legacy'">Timestamp</th>
<th class="mined" i18n="latest-blocks.mined" *ngIf="!widget" [class]="indexingAvailable ? '' : 'legacy'">Mined</th>
<th *ngIf="indexingAvailable" class="health text-left" i18n="latest-blocks.health" [ngClass]="{'widget': widget, 'legacy': !indexingAvailable}"
<th *ngIf="indexingAvailable" class="health text-right" i18n="latest-blocks.health" [ngClass]="{'widget': widget, 'legacy': !indexingAvailable}"
i18n-ngbTooltip="latest-blocks.health" ngbTooltip="Health" placement="bottom" #health [disableTooltip]="!isEllipsisActive(health)">Health</th>
<th *ngIf="indexingAvailable" class="reward text-right" i18n="latest-blocks.reward" [ngClass]="{'widget': widget, 'legacy': !indexingAvailable}"
i18n-ngbTooltip="latest-blocks.reward" ngbTooltip="Reward" placement="bottom" #reward [disableTooltip]="!isEllipsisActive(reward)">Reward</th>
@@ -27,7 +27,7 @@
<tbody *ngIf="blocks$ | async as blocks; else skeleton" [style]="isLoading ? 'opacity: 0.75' : ''">
<tr *ngFor="let block of blocks; let i= index; trackBy: trackByBlock">
<td class="text-left" [class]="widget ? 'widget' : ''">
<a [routerLink]="['/block' | relativeUrl, block.id]">{{ block.height }}</a>
<a [routerLink]="['/block' | relativeUrl, block.id]" [state]="{ data: { block: block } }">{{ block.height }}</a>
</td>
<td *ngIf="indexingAvailable" class="pool text-left" [ngClass]="{'widget': widget, 'legacy': !indexingAvailable}">
<div class="tooltip-custom">
@@ -46,16 +46,23 @@
<app-time-since [time]="block.timestamp" [fastRender]="true"></app-time-since>
</td>
<td *ngIf="indexingAvailable" class="health text-right" [ngClass]="{'widget': widget, 'legacy': !indexingAvailable}">
<a class="clear-link" [routerLink]="auditScores[block.id] != null ? ['/block/' | relativeUrl, block.id] : null">
<div class="progress progress-health">
<div class="progress-bar progress-bar-health" role="progressbar"
[ngStyle]="{'width': (100 - (auditScores[block.id] || 0)) + '%' }"></div>
<div class="progress-text">
<span *ngIf="auditScores[block.id] != null;">{{ auditScores[block.id] }}%</span>
<span *ngIf="auditScores[block.id] == null">~</span>
</div>
</div>
</a>
<a
class="health-badge badge"
[class.badge-success]="auditScores[block.id] >= 99"
[class.badge-warning]="auditScores[block.id] >= 75 && auditScores[block.id] < 99"
[class.badge-danger]="auditScores[block.id] < 75"
[routerLink]="auditScores[block.id] != null ? ['/block/' | relativeUrl, block.id] : null"
[state]="{ data: { block: block } }"
*ngIf="auditScores[block.id] != null; else nullHealth"
>{{ auditScores[block.id] }}%</a>
<ng-template #nullHealth>
<ng-container *ngIf="!loadingScores; else loadingHealth">
<span class="health-badge badge badge-secondary" i18n="unknown">Unknown</span>
</ng-container>
</ng-template>
<ng-template #loadingHealth>
<span class="skeleton-loader" style="max-width: 60px"></span>
</ng-template>
</td>
<td *ngIf="indexingAvailable" class="reward text-right" [ngClass]="{'widget': widget, 'legacy': !indexingAvailable}">
<app-amount [satoshis]="block.extras.reward" [noFiat]="true" digitsInfo="1.2-2"></app-amount>

View File

@@ -23,6 +23,7 @@ export class BlocksList implements OnInit, OnDestroy {
indexingAvailable = false;
isLoading = true;
loadingScores = true;
fromBlockHeight = undefined;
paginationMaxSize: number;
page = 1;
@@ -113,6 +114,7 @@ export class BlocksList implements OnInit, OnDestroy {
if (this.indexingAvailable) {
this.auditScoreSubscription = this.fromHeightSubject.pipe(
switchMap((fromBlockHeight) => {
this.loadingScores = true;
return this.apiService.getBlockAuditScores$(this.page === 1 ? undefined : fromBlockHeight)
.pipe(
catchError(() => {
@@ -124,6 +126,7 @@ export class BlocksList implements OnInit, OnDestroy {
Object.values(scores).forEach(score => {
this.auditScores[score.hash] = score?.matchRate != null ? score.matchRate : null;
});
this.loadingScores = false;
});
this.latestScoreSubscription = this.stateService.blocks$.pipe(

View File

@@ -5,7 +5,7 @@
<app-search-results #searchResults [hidden]="dropdownHidden" [results]="typeAhead$ | async" (selectedResult)="selectedResult($event)"></app-search-results>
</div>
<div>
<button [disabled]="isSearching" type="submit" class="btn btn-block btn-primary">
<button [disabled]="isSearching" type="submit" class="btn btn-block btn-purple">
<fa-icon *ngIf="!(isTypeaheading$ | async) else searchLoading" [icon]="['fas', 'search']" [fixedWidth]="true" i18n-title="search-form.search-title" title="Search"></fa-icon>
</button>
</div>

View File

@@ -43,9 +43,6 @@ form {
@media (min-width: 1200px) {
min-width: 300px;
}
input {
border: 0px;
}
.btn {
width: 100px;
}

View File

@@ -11,8 +11,9 @@
<div id="blockchain-container" [dir]="timeLtr ? 'rtl' : 'ltr'" #blockchainContainer
(mousedown)="onMouseDown($event)"
(dragstart)="onDragStart($event)"
(scroll)="onScroll($event)"
>
<app-blockchain></app-blockchain>
<app-blockchain [pageIndex]="pageIndex" [pages]="pages" [blocksPerPage]="blocksPerPage" [minScrollWidth]="minScrollWidth"></app-blockchain>
</div>
<router-outlet></router-outlet>

View File

@@ -19,16 +19,51 @@ export class StartComponent implements OnInit, OnDestroy {
blockchainScrollLeftInit: number;
timeLtrSubscription: Subscription;
timeLtr: boolean = this.stateService.timeLtr.value;
chainTipSubscription: Subscription;
chainTip: number = -1;
markBlockSubscription: Subscription;
@ViewChild('blockchainContainer') blockchainContainer: ElementRef;
isMobile: boolean = false;
blockWidth = 155;
blocksPerPage: number = 1;
pageWidth: number;
firstPageWidth: number;
minScrollWidth: number;
pageIndex: number = 0;
pages: any[] = [];
pendingMark: number | void = null;
constructor(
private stateService: StateService,
) { }
ngOnInit() {
this.firstPageWidth = 40 + (this.blockWidth * this.stateService.env.KEEP_BLOCKS_AMOUNT);
this.onResize();
this.updatePages();
this.timeLtrSubscription = this.stateService.timeLtr.subscribe((ltr) => {
this.timeLtr = !!ltr;
});
this.chainTipSubscription = this.stateService.chainTip$.subscribe((height) => {
this.chainTip = height;
this.updatePages();
if (this.pendingMark != null) {
this.scrollToBlock(this.pendingMark);
this.pendingMark = null;
}
});
this.markBlockSubscription = this.stateService.markBlock$.subscribe((mark) => {
if (mark?.blockHeight != null) {
if (this.chainTip >=0) {
if (!this.blockInViewport(mark.blockHeight)) {
this.scrollToBlock(mark.blockHeight);
}
} else {
this.pendingMark = mark.blockHeight;
}
}
});
this.stateService.blocks$
.subscribe((blocks: any) => {
if (this.stateService.network !== '') {
@@ -55,6 +90,34 @@ export class StartComponent implements OnInit, OnDestroy {
});
}
@HostListener('window:resize', ['$event'])
onResize(): void {
this.isMobile = window.innerWidth <= 767.98;
let firstVisibleBlock;
let offset;
if (this.blockchainContainer?.nativeElement != null) {
this.pages.forEach(page => {
const left = page.offset - this.getConvertedScrollOffset();
const right = left + this.pageWidth;
if (left <= 0 && right > 0) {
const blockIndex = Math.max(0, Math.floor(left / -this.blockWidth));
firstVisibleBlock = page.height - blockIndex;
offset = left + (blockIndex * this.blockWidth);
}
});
}
this.blocksPerPage = Math.ceil(window.innerWidth / this.blockWidth);
this.pageWidth = this.blocksPerPage * this.blockWidth;
this.minScrollWidth = this.firstPageWidth + (this.pageWidth * 2);
if (firstVisibleBlock != null) {
this.scrollToBlock(firstVisibleBlock, offset);
} else {
this.updatePages();
}
}
onMouseDown(event: MouseEvent) {
this.mouseDragStartX = event.clientX;
this.blockchainScrollLeftInit = this.blockchainContainer.nativeElement.scrollLeft;
@@ -70,7 +133,7 @@ export class StartComponent implements OnInit, OnDestroy {
if (this.mouseDragStartX != null) {
this.stateService.setBlockScrollingInProgress(true);
this.blockchainContainer.nativeElement.scrollLeft =
this.blockchainScrollLeftInit + this.mouseDragStartX - event.clientX
this.blockchainScrollLeftInit + this.mouseDragStartX - event.clientX;
}
}
@HostListener('document:mouseup', [])
@@ -79,7 +142,149 @@ export class StartComponent implements OnInit, OnDestroy {
this.stateService.setBlockScrollingInProgress(false);
}
onScroll(e) {
const middlePage = this.pageIndex === 0 ? this.pages[0] : this.pages[1];
// compensate for css transform
const translation = (this.isMobile ? window.innerWidth * 0.95 : window.innerWidth * 0.5);
const backThreshold = middlePage.offset + (this.pageWidth * 0.5) + translation;
const forwardThreshold = middlePage.offset - (this.pageWidth * 0.5) + translation;
const scrollLeft = this.getConvertedScrollOffset();
if (scrollLeft > backThreshold) {
if (this.shiftPagesBack()) {
this.addConvertedScrollOffset(-this.pageWidth);
this.blockchainScrollLeftInit -= this.pageWidth;
}
} else if (scrollLeft < forwardThreshold) {
if (this.shiftPagesForward()) {
this.addConvertedScrollOffset(this.pageWidth);
this.blockchainScrollLeftInit += this.pageWidth;
}
}
}
scrollToBlock(height, blockOffset = 0) {
if (!this.blockchainContainer?.nativeElement) {
setTimeout(() => { this.scrollToBlock(height, blockOffset); }, 50);
return;
}
const targetHeight = this.isMobile ? height - 1 : height;
const viewingPageIndex = this.getPageIndexOf(targetHeight);
const pages = [];
this.pageIndex = Math.max(viewingPageIndex - 1, 0);
let viewingPage = this.getPageAt(viewingPageIndex);
const isLastPage = viewingPage.height < this.blocksPerPage;
if (isLastPage) {
this.pageIndex = Math.max(viewingPageIndex - 2, 0);
viewingPage = this.getPageAt(viewingPageIndex);
}
const left = viewingPage.offset - this.getConvertedScrollOffset();
const blockIndex = viewingPage.height - targetHeight;
const targetOffset = (this.blockWidth * blockIndex) + left;
let deltaOffset = targetOffset - blockOffset;
if (isLastPage) {
pages.push(this.getPageAt(viewingPageIndex - 2));
}
if (viewingPageIndex > 1) {
pages.push(this.getPageAt(viewingPageIndex - 1));
}
if (viewingPageIndex > 0) {
pages.push(viewingPage);
}
if (!isLastPage) {
pages.push(this.getPageAt(viewingPageIndex + 1));
}
if (viewingPageIndex === 0) {
pages.push(this.getPageAt(viewingPageIndex + 2));
}
this.pages = pages;
this.addConvertedScrollOffset(deltaOffset);
}
updatePages() {
const pages = [];
if (this.pageIndex > 0) {
pages.push(this.getPageAt(this.pageIndex));
}
pages.push(this.getPageAt(this.pageIndex + 1));
pages.push(this.getPageAt(this.pageIndex + 2));
this.pages = pages;
}
shiftPagesBack(): boolean {
const nextPage = this.getPageAt(this.pageIndex + 3);
if (nextPage.height >= 0) {
this.pageIndex++;
this.pages.forEach(page => page.offset -= this.pageWidth);
if (this.pageIndex !== 1) {
this.pages.shift();
}
this.pages.push(this.getPageAt(this.pageIndex + 2));
return true;
} else {
return false;
}
}
shiftPagesForward(): boolean {
if (this.pageIndex > 0) {
this.pageIndex--;
this.pages.forEach(page => page.offset += this.pageWidth);
this.pages.pop();
if (this.pageIndex) {
this.pages.unshift(this.getPageAt(this.pageIndex));
}
return true;
}
return false;
}
getPageAt(index: number) {
const height = this.chainTip - 8 - ((index - 1) * this.blocksPerPage)
return {
offset: this.firstPageWidth + (this.pageWidth * (index - 1 - this.pageIndex)),
height: height,
depth: this.chainTip - height,
index: index,
};
}
getPageIndexOf(height: number): number {
const delta = this.chainTip - 8 - height;
return Math.max(0, Math.floor(delta / this.blocksPerPage) + 1);
}
blockInViewport(height: number): boolean {
const firstHeight = this.pages[0].height;
const translation = (this.isMobile ? window.innerWidth * 0.95 : window.innerWidth * 0.5);
const firstX = this.pages[0].offset - this.getConvertedScrollOffset() + translation;
const xPos = firstX + ((firstHeight - height) * 155);
return xPos > -55 && xPos < (window.innerWidth - 100);
}
getConvertedScrollOffset(): number {
if (this.timeLtr) {
return -this.blockchainContainer?.nativeElement?.scrollLeft || 0;
} else {
return this.blockchainContainer?.nativeElement?.scrollLeft || 0;
}
}
addConvertedScrollOffset(offset: number): void {
if (!this.blockchainContainer?.nativeElement) {
return;
}
if (this.timeLtr) {
this.blockchainContainer.nativeElement.scrollLeft -= offset;
} else {
this.blockchainContainer.nativeElement.scrollLeft += offset;
}
}
ngOnDestroy() {
this.timeLtrSubscription.unsubscribe();
this.chainTipSubscription.unsubscribe();
this.markBlockSubscription.unsubscribe();
}
}

View File

@@ -11,6 +11,7 @@ import {
import { Transaction, Vout } from '../../interfaces/electrs.interface';
import { of, merge, Subscription, Observable, Subject, from } from 'rxjs';
import { StateService } from '../../services/state.service';
import { CacheService } from '../../services/cache.service';
import { OpenGraphService } from '../../services/opengraph.service';
import { ApiService } from '../../services/api.service';
import { SeoService } from '../../services/seo.service';
@@ -45,6 +46,7 @@ export class TransactionPreviewComponent implements OnInit, OnDestroy {
private route: ActivatedRoute,
private electrsApiService: ElectrsApiService,
private stateService: StateService,
private cacheService: CacheService,
private apiService: ApiService,
private seoService: SeoService,
private openGraphService: OpenGraphService,
@@ -97,7 +99,7 @@ export class TransactionPreviewComponent implements OnInit, OnDestroy {
}),
switchMap(() => {
let transactionObservable$: Observable<Transaction>;
const cached = this.stateService.getTxFromCache(this.txId);
const cached = this.cacheService.getTxFromCache(this.txId);
if (cached && cached.fee !== -1) {
transactionObservable$ = of(cached);
} else {

View File

@@ -13,6 +13,7 @@ import {
import { Transaction } from '../../interfaces/electrs.interface';
import { of, merge, Subscription, Observable, Subject, timer, combineLatest, from, throwError } from 'rxjs';
import { StateService } from '../../services/state.service';
import { CacheService } from '../../services/cache.service';
import { WebsocketService } from '../../services/websocket.service';
import { AudioService } from '../../services/audio.service';
import { ApiService } from '../../services/api.service';
@@ -74,6 +75,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
private relativeUrlPipe: RelativeUrlPipe,
private electrsApiService: ElectrsApiService,
private stateService: StateService,
private cacheService: CacheService,
private websocketService: WebsocketService,
private audioService: AudioService,
private apiService: ApiService,
@@ -131,26 +133,20 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
this.cpfpInfo = null;
return;
}
if (cpfpInfo.effectiveFeePerVsize) {
this.tx.effectiveFeePerVsize = cpfpInfo.effectiveFeePerVsize;
} else {
const lowerFeeParents = cpfpInfo.ancestors.filter(
(parent) => parent.fee / (parent.weight / 4) < this.tx.feePerVsize
);
let totalWeight =
this.tx.weight +
lowerFeeParents.reduce((prev, val) => prev + val.weight, 0);
let totalFees =
this.tx.fee +
lowerFeeParents.reduce((prev, val) => prev + val.fee, 0);
if (cpfpInfo?.bestDescendant) {
totalWeight += cpfpInfo?.bestDescendant.weight;
totalFees += cpfpInfo?.bestDescendant.fee;
}
this.tx.effectiveFeePerVsize = totalFees / (totalWeight / 4);
// merge ancestors/descendants
const relatives = [...(cpfpInfo.ancestors || []), ...(cpfpInfo.descendants || [])];
if (cpfpInfo.bestDescendant && !cpfpInfo.descendants?.length) {
relatives.push(cpfpInfo.bestDescendant);
}
let totalWeight =
this.tx.weight +
relatives.reduce((prev, val) => prev + val.weight, 0);
let totalFees =
this.tx.fee +
relatives.reduce((prev, val) => prev + val.fee, 0);
this.tx.effectiveFeePerVsize = totalFees / (totalWeight / 4);
if (!this.tx.status.confirmed) {
this.stateService.markBlock$.next({
txFeePerVSize: this.tx.effectiveFeePerVsize,
@@ -203,7 +199,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
}),
switchMap(() => {
let transactionObservable$: Observable<Transaction>;
const cached = this.stateService.getTxFromCache(this.txId);
const cached = this.cacheService.getTxFromCache(this.txId);
if (cached && cached.fee !== -1) {
transactionObservable$ = of(cached);
} else {
@@ -302,7 +298,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
this.waitingForTransaction = false;
}
this.rbfTransaction = rbfTransaction;
this.stateService.setTxCache([this.rbfTransaction]);
this.cacheService.setTxCache([this.rbfTransaction]);
});
this.queryParamsSubscription = this.route.queryParams.subscribe((params) => {

View File

@@ -1,5 +1,6 @@
import { Component, OnInit, Input, ChangeDetectionStrategy, OnChanges, Output, EventEmitter, ChangeDetectorRef } from '@angular/core';
import { StateService } from '../../services/state.service';
import { CacheService } from '../../services/cache.service';
import { Observable, ReplaySubject, BehaviorSubject, merge, Subscription } from 'rxjs';
import { Outspend, Transaction, Vin, Vout } from '../../interfaces/electrs.interface';
import { ElectrsApiService } from '../../services/electrs-api.service';
@@ -44,6 +45,7 @@ export class TransactionsListComponent implements OnInit, OnChanges {
constructor(
public stateService: StateService,
private cacheService: CacheService,
private electrsApiService: ElectrsApiService,
private apiService: ApiService,
private assetsService: AssetsService,
@@ -91,6 +93,9 @@ export class TransactionsListComponent implements OnInit, OnChanges {
filter(() => this.stateService.env.LIGHTNING),
switchMap((txIds) => this.apiService.getChannelByTxIds$(txIds)),
tap((channels) => {
if (!this.transactions) {
return;
}
const transactions = this.transactions.filter((tx) => !tx._channels);
channels.forEach((channel, i) => {
transactions[i]._channels = channel;
@@ -120,7 +125,7 @@ export class TransactionsListComponent implements OnInit, OnChanges {
}
this.transactionsLength = this.transactions.length;
this.stateService.setTxCache(this.transactions);
this.cacheService.setTxCache(this.transactions);
this.transactions.forEach((tx) => {
tx['@voutLimit'] = true;

View File

@@ -88,7 +88,7 @@
<stop offset="100%" stop-color="transparent" />
</linearGradient>
</defs>
<path [attr.d]="middle.path" class="line middle" [style]="middle.style"/>
<path *ngIf="hasLine" [attr.d]="middle.path" class="line middle" [style]="middle.style"/>
<ng-container *ngFor="let input of inputs; let i = index">
<path *ngIf="connectors && !inputData[i].coinbase && !inputData[i].pegin"
[attr.d]="input.connectorPath"
@@ -106,7 +106,7 @@
(pointerout)="onBlur($event, 'input', i);"
(click)="onClick($event, 'input', inputData[i].index);"
/>
<path
<path *ngIf="!input.zeroValue"
[attr.d]="input.path"
class="line {{input.class}}"
[class.highlight]="inputIndex != null && inputData[i].index === inputIndex"
@@ -116,6 +116,16 @@
(pointerout)="onBlur($event, 'input', i);"
(click)="onClick($event, 'input', inputData[i].index);"
/>
<path *ngIf="input.zeroValue"
[attr.d]="input.path"
class="line {{input.class}} zerovalue"
[class.highlight]="inputIndex != null && inputData[i].index === inputIndex"
[class.zerovalue]="input.zeroValue"
[style]="input.style"
(pointerover)="onHover($event, 'input', i);"
(pointerout)="onBlur($event, 'input', i);"
(click)="onClick($event, 'input', inputData[i].index);"
/>
</ng-container>
<ng-container *ngFor="let output of outputs; let i = index">
<path *ngIf="connectors && outspends[outputData[i].index]?.spent"

View File

@@ -68,6 +68,7 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges {
outspends: Outspend[] = [];
zeroValueWidth = 60;
zeroValueThickness = 20;
hasLine: boolean;
outspendsSubscription: Subscription;
refreshOutspends$: ReplaySubject<string> = new ReplaySubject();
@@ -162,7 +163,7 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges {
let truncatedInputs = this.tx.vin.map((v, i) => {
return {
type: 'input',
value: v?.prevout?.value,
value: v?.prevout?.value || (v?.is_coinbase && !totalValue ? 0 : undefined),
txid: v.txid,
vout: v.vout,
address: v?.prevout?.scriptpubkey_address || v?.prevout?.scriptpubkey_type?.toUpperCase(),
@@ -198,6 +199,9 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges {
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]}`
};
this.hasLine = this.inputs.reduce((line, put) => line || !put.zeroValue, false)
&& this.outputs.reduce((line, put) => line || !put.zeroValue, false);
}
calcTotalValue(tx: Transaction): number {
@@ -278,6 +282,9 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges {
lineParams.forEach((line, i) => {
if (xputs[i].value === 0) {
line.outerY = lastOuter + (this.zeroValueThickness / 2);
if (xputs.length === 1) {
line.outerY = (this.height / 2);
}
lastOuter += this.zeroValueThickness + spacing;
return;
}

View File

@@ -24,7 +24,6 @@ export interface CpfpInfo {
ancestors: Ancestor[];
descendants?: Ancestor[];
bestDescendant?: BestDescendant | null;
effectiveFeePerVsize?: number;
}
export interface DifficultyAdjustment {
@@ -122,8 +121,6 @@ export interface BlockExtension {
name: string;
slug: string;
}
stage?: number; // Frontend only
}
export interface BlockExtended extends Block {

View File

@@ -118,7 +118,7 @@ export class NodesNetworksChartComponent implements OnInit {
color: 'grey',
fontSize: 15
},
text: $localize`Indexing in progess`,
text: $localize`Indexing in progress`,
left: 'center',
top: 'center',
};

View File

@@ -109,7 +109,7 @@ export class LightningStatisticsChartComponent implements OnInit {
color: 'grey',
fontSize: 15
},
text: $localize`Indexing in progess`,
text: $localize`Indexing in progress`,
left: 'center',
top: 'center'
};

View File

@@ -0,0 +1,105 @@
import { Injectable } from '@angular/core';
import { firstValueFrom, Subject, Subscription} from 'rxjs';
import { Transaction } from '../interfaces/electrs.interface';
import { BlockExtended } from '../interfaces/node-api.interface';
import { StateService } from './state.service';
import { ApiService } from './api.service';
const BLOCK_CACHE_SIZE = 500;
const KEEP_RECENT_BLOCKS = 50;
@Injectable({
providedIn: 'root'
})
export class CacheService {
loadedBlocks$ = new Subject<BlockExtended>();
tip: number = 0;
txCache: { [txid: string]: Transaction } = {};
blockCache: { [height: number]: BlockExtended } = {};
blockLoading: { [height: number]: boolean } = {};
copiesInBlockQueue: { [height: number]: number } = {};
blockPriorities: number[] = [];
constructor(
private stateService: StateService,
private apiService: ApiService,
) {
this.stateService.blocks$.subscribe(([block]) => {
this.addBlockToCache(block);
this.clearBlocks();
});
this.stateService.chainTip$.subscribe((height) => {
this.tip = height;
});
}
setTxCache(transactions) {
this.txCache = {};
transactions.forEach(tx => {
this.txCache[tx.txid] = tx;
});
}
getTxFromCache(txid) {
if (this.txCache && this.txCache[txid]) {
return this.txCache[txid];
} else {
return null;
}
}
addBlockToCache(block: BlockExtended) {
this.blockCache[block.height] = block;
this.bumpBlockPriority(block.height);
}
async loadBlock(height) {
if (!this.blockCache[height] && !this.blockLoading[height]) {
const chunkSize = 10;
const maxHeight = Math.ceil(height / chunkSize) * chunkSize;
for (let i = 0; i < chunkSize; i++) {
this.blockLoading[maxHeight - i] = true;
}
const result = await firstValueFrom(this.apiService.getBlocks$(maxHeight));
for (let i = 0; i < chunkSize; i++) {
delete this.blockLoading[maxHeight - i];
}
if (result && result.length) {
result.forEach(block => {
this.addBlockToCache(block);
this.loadedBlocks$.next(block);
});
}
this.clearBlocks();
} else {
this.bumpBlockPriority(height);
}
}
// increase the priority of a block, to delay removal
bumpBlockPriority(height) {
this.blockPriorities.push(height);
this.copiesInBlockQueue[height] = (this.copiesInBlockQueue[height] || 0) + 1;
}
// remove lowest priority blocks from the cache
clearBlocks() {
while (Object.keys(this.blockCache).length > (BLOCK_CACHE_SIZE + KEEP_RECENT_BLOCKS) && this.blockPriorities.length > KEEP_RECENT_BLOCKS) {
const height = this.blockPriorities.shift();
if (this.copiesInBlockQueue[height] > 1) {
this.copiesInBlockQueue[height]--;
} else if ((this.tip - height) < KEEP_RECENT_BLOCKS) {
this.bumpBlockPriority(height);
} else {
delete this.blockCache[height];
delete this.copiesInBlockQueue[height];
}
}
}
getCachedBlock(height) {
return this.blockCache[height];
}
}

View File

@@ -104,6 +104,7 @@ export class StateService {
backendInfo$ = new ReplaySubject<IBackendInfo>(1);
loadingIndicators$ = new ReplaySubject<ILoadingIndicators>(1);
recommendedFees$ = new ReplaySubject<Recommendedfees>(1);
chainTip$ = new ReplaySubject<number>(-1);
live2Chart$ = new Subject<OptimizedMempoolStats>();
@@ -111,15 +112,13 @@ export class StateService {
connectionState$ = new BehaviorSubject<0 | 1 | 2>(2);
isTabHidden$: Observable<boolean>;
markBlock$ = new ReplaySubject<MarkBlockState>();
markBlock$ = new BehaviorSubject<MarkBlockState>({});
keyNavigation$ = new Subject<KeyboardEvent>();
blockScrolling$: Subject<boolean> = new Subject<boolean>();
timeLtr: BehaviorSubject<boolean>;
hideFlow: BehaviorSubject<boolean>;
txCache: { [txid: string]: Transaction } = {};
constructor(
@Inject(PLATFORM_ID) private platformId: any,
@Inject(LOCALE_ID) private locale: string,
@@ -274,18 +273,15 @@ export class StateService {
return this.network === 'liquid' || this.network === 'liquidtestnet';
}
setTxCache(transactions) {
this.txCache = {};
transactions.forEach(tx => {
this.txCache[tx.txid] = tx;
});
resetChainTip() {
this.latestBlockHeight = -1;
this.chainTip$.next(-1);
}
getTxFromCache(txid) {
if (this.txCache && this.txCache[txid]) {
return this.txCache[txid];
} else {
return null;
updateChainTip(height) {
if (height > this.latestBlockHeight) {
this.latestBlockHeight = height;
this.chainTip$.next(height);
}
}
}

View File

@@ -70,7 +70,7 @@ export class WebsocketService {
clearTimeout(this.onlineCheckTimeout);
clearTimeout(this.onlineCheckTimeoutTwo);
this.stateService.latestBlockHeight = -1;
this.stateService.resetChainTip();
this.websocketSubject.complete();
this.subscription.unsubscribe();
@@ -224,12 +224,14 @@ export class WebsocketService {
handleResponse(response: WebsocketResponse) {
if (response.blocks && response.blocks.length) {
const blocks = response.blocks;
let maxHeight = 0;
blocks.forEach((block: BlockExtended) => {
if (block.height > this.stateService.latestBlockHeight) {
this.stateService.latestBlockHeight = block.height;
maxHeight = Math.max(maxHeight, block.height);
this.stateService.blocks$.next([block, false]);
}
});
this.stateService.updateChainTip(maxHeight);
}
if (response.tx) {
@@ -238,7 +240,7 @@ export class WebsocketService {
if (response.block) {
if (response.block.height > this.stateService.latestBlockHeight) {
this.stateService.latestBlockHeight = response.block.height;
this.stateService.updateChainTip(response.block.height);
this.stateService.blocks$.next([response.block, !!response.txConfirmed]);
}

View File

@@ -1471,6 +1471,7 @@
</trans-unit>
<trans-unit id="1405c5f1a9834338ff13442c550927ab7144fdc8" datatype="html">
<source>Community Integrations</source>
<target>Intégrations communautaires</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/about/about.component.html</context>
<context context-type="linenumber">191,193</context>
@@ -1544,6 +1545,7 @@
</trans-unit>
<trans-unit id="address-label.multisig" datatype="html">
<source>Multisig <x id="multisigM" equiv-text="ms.m"/> of <x id="multisigN" equiv-text="ms.n"/></source>
<target>Multi-signature <x id="multisigM" equiv-text="ms.m"/> de <x id="multisigN" equiv-text="ms.n"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/address-labels/address-labels.component.ts</context>
<context context-type="linenumber">105</context>
@@ -2027,6 +2029,7 @@
</trans-unit>
<trans-unit id="4718502b32e47c66db00ac7cf4f7f058acb6e849" datatype="html">
<source>Block </source>
<target>Bloc</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block-audit/block-audit.component.html</context>
<context context-type="linenumber">7,9</context>
@@ -2035,6 +2038,7 @@
</trans-unit>
<trans-unit id="adb216f561e9101b11a8288cc7da44afa1ab33b8" datatype="html">
<source>Template vs Mined</source>
<target>Modèle vs Miné</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block-audit/block-audit.component.html</context>
<context context-type="linenumber">11,17</context>
@@ -2121,6 +2125,7 @@
</trans-unit>
<trans-unit id="e9503a2605cf5d41273a7d5ad653873f28f8f1a3" datatype="html">
<source>Match rate</source>
<target>Taux de correspondance</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block-audit/block-audit.component.html</context>
<context context-type="linenumber">64,67</context>
@@ -2129,6 +2134,7 @@
</trans-unit>
<trans-unit id="c97ea3cbb05527c76b0011820ca76e8e00632ca1" datatype="html">
<source>Missing txs</source>
<target>Txs manquantes</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block-audit/block-audit.component.html</context>
<context context-type="linenumber">68,71</context>
@@ -2137,6 +2143,7 @@
</trans-unit>
<trans-unit id="94d8765805623dd51e562e6e4bb669a944bbe516" datatype="html">
<source>Added txs</source>
<target>Txs ajoutées</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block-audit/block-audit.component.html</context>
<context context-type="linenumber">72,75</context>
@@ -2145,6 +2152,7 @@
</trans-unit>
<trans-unit id="da5d7e263a3c6dc585d04844074afaa7229b88a0" datatype="html">
<source>Missing</source>
<target>Manquantes</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block-audit/block-audit.component.html</context>
<context context-type="linenumber">84,85</context>
@@ -2153,6 +2161,7 @@
</trans-unit>
<trans-unit id="80e3b490720757978c99a7b5af3885faf202b955" datatype="html">
<source>Added</source>
<target>Ajoutées</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block-audit/block-audit.component.html</context>
<context context-type="linenumber">86,92</context>
@@ -2470,6 +2479,7 @@
</trans-unit>
<trans-unit id="80065834848189518" datatype="html">
<source>No data to display yet. Try again later.</source>
<target>Aucune donnée à afficher pour le moment. Réessayez plus tard.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block-prediction-graph/block-prediction-graph.component.ts</context>
<context context-type="linenumber">108,103</context>
@@ -2523,6 +2533,7 @@
</trans-unit>
<trans-unit id="7f5d0c10614e8a34f0e2dad33a0568277c50cf69" datatype="html">
<source>Block</source>
<target>Bloc</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block/block-preview.component.html</context>
<context context-type="linenumber">3,7</context>
@@ -2535,6 +2546,7 @@
</trans-unit>
<trans-unit id="445c243f1d1cd2c7f0df430cdb2fa25639600396" datatype="html">
<source><x id="INTERPOLATION" equiv-text="&lt;/ng-template&gt; &lt;/h1&gt; &lt;div class=&quot;blockhash&quot; *ngIf=&quot;block"/></source>
<target> <x id="INTERPOLATION" equiv-text="&lt;/ng-template&gt; &lt;/h1&gt; &lt;div class=&quot;blockhash&quot; *ngIf=&quot;block"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block/block-preview.component.html</context>
<context context-type="linenumber">11,12</context>
@@ -3250,6 +3262,7 @@
</trans-unit>
<trans-unit id="5115edb23059f4dcfe6ce0a979e40962a149c35c" datatype="html">
<source>Hashrate &amp; Difficulty</source>
<target>Taux de hachage &amp; difficulté</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/graphs/graphs.component.html</context>
<context context-type="linenumber">15,16</context>
@@ -3258,6 +3271,7 @@
</trans-unit>
<trans-unit id="a3382a60534e9fff5c3a0fcde39bab356afc4a59" datatype="html">
<source>Lightning</source>
<target>Lightning</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/graphs/graphs.component.html</context>
<context context-type="linenumber">31</context>
@@ -3266,6 +3280,7 @@
</trans-unit>
<trans-unit id="b420668a91f8ebaf6e6409c4ba87f1d45961d2bd" datatype="html">
<source>Lightning Nodes Per Network</source>
<target>Nœuds Lightning par réseau</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/graphs/graphs.component.html</context>
<context context-type="linenumber">34</context>
@@ -3286,6 +3301,7 @@
</trans-unit>
<trans-unit id="ea8db27e6db64f8b940711948c001a1100e5fe9f" datatype="html">
<source>Lightning Network Capacity</source>
<target>Capacité du réseau Lightning</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/graphs/graphs.component.html</context>
<context context-type="linenumber">36</context>
@@ -3306,6 +3322,7 @@
</trans-unit>
<trans-unit id="8573a1576789bd2c4faeaed23037c4917812c6cf" datatype="html">
<source>Lightning Nodes Per ISP</source>
<target>Nœuds Lightning par FAI</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/graphs/graphs.component.html</context>
<context context-type="linenumber">38</context>
@@ -3318,6 +3335,7 @@
</trans-unit>
<trans-unit id="9d3ad4c6623870d96b65fb7a708fed6ce7c20044" datatype="html">
<source>Lightning Nodes Per Country</source>
<target>Nœuds Lightning par pays</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/graphs/graphs.component.html</context>
<context context-type="linenumber">40</context>
@@ -3334,6 +3352,7 @@
</trans-unit>
<trans-unit id="af8560ca50882114be16c951650f83bca73161a7" datatype="html">
<source>Lightning Nodes World Map</source>
<target>Carte du monde des nœuds Lightning</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/graphs/graphs.component.html</context>
<context context-type="linenumber">42</context>
@@ -3350,6 +3369,7 @@
</trans-unit>
<trans-unit id="b482ceceb39c7a045cb2ab2c64f7091d21e63d44" datatype="html">
<source>Lightning Nodes Channels World Map</source>
<target>Carte du monde des canaux Lightning</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/graphs/graphs.component.html</context>
<context context-type="linenumber">44</context>
@@ -3470,6 +3490,7 @@
</trans-unit>
<trans-unit id="142e923d3b04186ac6ba23387265d22a2fa404e0" datatype="html">
<source>Lightning Explorer</source>
<target>Explorateur Lightning</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/master-page/master-page.component.html</context>
<context context-type="linenumber">44,45</context>
@@ -3482,6 +3503,7 @@
</trans-unit>
<trans-unit id="7cbedd89f60daafaf0e56363900d666a4e02ffb1" datatype="html">
<source>beta</source>
<target>bêta</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/master-page/master-page.component.html</context>
<context context-type="linenumber">45,48</context>
@@ -3737,6 +3759,7 @@
</trans-unit>
<trans-unit id="2158ea60725d3a97aed6f0f00aa7df48d7bb42ff" datatype="html">
<source>mining pool</source>
<target>Pool de minage</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/pool/pool-preview.component.html</context>
<context context-type="linenumber">3,5</context>
@@ -4067,6 +4090,7 @@
</trans-unit>
<trans-unit id="7deec1c1520f06170e1f8e8ddfbe4532312f638f" datatype="html">
<source>Explore the full Bitcoin ecosystem</source>
<target>Explorez tout l'écosystème Bitcoin</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/search-form/search-form.component.html</context>
<context context-type="linenumber">4,6</context>
@@ -4427,6 +4451,7 @@
</trans-unit>
<trans-unit id="53fbdc20554c4e68ae509f652b38ab80021c0739" datatype="html">
<source>Flow</source>
<target>Flux</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">195,198</context>
@@ -4440,6 +4465,7 @@
</trans-unit>
<trans-unit id="d0fd8887b50687cfc0fc1f6569f6fd6c5db4ffc0" datatype="html">
<source>Hide diagram</source>
<target>Masquer le diagramme</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">198,203</context>
@@ -4448,6 +4474,7 @@
</trans-unit>
<trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b" datatype="html">
<source>Show more</source>
<target>Montrer plus</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">219,221</context>
@@ -4456,6 +4483,7 @@
</trans-unit>
<trans-unit id="5403a767248e304199592271bba3366d2ca3f903" datatype="html">
<source>Show less</source>
<target>Montrer moins</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">221,227</context>
@@ -4464,6 +4492,7 @@
</trans-unit>
<trans-unit id="e7aa6db8df12d0158df972b6abfc65a8478b2b7d" datatype="html">
<source>Show diagram</source>
<target>Afficher le diagramme</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">241,242</context>
@@ -4657,6 +4686,7 @@
</trans-unit>
<trans-unit id="ac0c4b49e44c42db35ddf590fb5f78375a891b01" datatype="html">
<source>other inputs</source>
<target>autres entrées</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html</context>
<context context-type="linenumber">12</context>
@@ -4665,6 +4695,7 @@
</trans-unit>
<trans-unit id="8900247c0476fea8fcbee57a72a1d1da5ddd40ff" datatype="html">
<source>other outputs</source>
<target>autres sorties</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html</context>
<context context-type="linenumber">13</context>
@@ -4673,6 +4704,7 @@
</trans-unit>
<trans-unit id="3e242f213dd1a0754aad9164aa80887d67708500" datatype="html">
<source>Input</source>
<target>Entrées</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html</context>
<context context-type="linenumber">43</context>
@@ -4681,6 +4713,7 @@
</trans-unit>
<trans-unit id="7a080851e25a41e898776a9c90cf8dbe81027f9a" datatype="html">
<source>Output</source>
<target>Sorties</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html</context>
<context context-type="linenumber">44</context>
@@ -4689,6 +4722,7 @@
</trans-unit>
<trans-unit id="25d58cd5c18fd9c1c89d6062d67dcc2482161410" datatype="html">
<source>This transaction saved <x id="INTERPOLATION" equiv-text="{{ segwitGains.realizedSegwitGains * 100 | number: '1.0-0' }}"/>% on fees by using native SegWit</source>
<target>Cette transaction a permis d'économiser <x id="INTERPOLATION" equiv-text="{{ segwitGains.realizedSegwitGains * 100 | number: '1.0-0' }}"/> % sur les frais en utilisant SegWit natif</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">2</context>
@@ -4715,6 +4749,7 @@
</trans-unit>
<trans-unit id="b6a3f6afdac6873e2d261647d834c02c91376893" datatype="html">
<source>This transaction saved <x id="INTERPOLATION" equiv-text="{{ segwitGains.realizedSegwitGains * 100 | number: '1.0-0' }}"/>% on fees by using SegWit and could save <x id="INTERPOLATION_1" equiv-text="{{ segwitGains.potentialSegwitGains * 100 | number : '1.0-0' }}"/>% more by fully upgrading to native SegWit</source>
<target>Cette transaction a permis d'économiser <x id="INTERPOLATION" equiv-text="{{ segwitGains.realizedSegwitGains * 100 | number: '1.0-0' }}"/> % sur les frais en utilisant SegWit et pourrait économiser <x id="INTERPOLATION_1" equiv-text="{{ segwitGains.potentialSegwitGains * 100 | number : '1.0-0' }}"/> % de plus en passant entièrement à SegWit natif</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">4</context>
@@ -4723,6 +4758,7 @@
</trans-unit>
<trans-unit id="a67530e246368aa7e5d010061fd84c3c4fe755c2" datatype="html">
<source>This transaction could save <x id="INTERPOLATION" equiv-text="{{ segwitGains.potentialSegwitGains * 100 | number : '1.0-0' }}"/>% on fees by upgrading to native SegWit or <x id="INTERPOLATION_1" equiv-text="{{ segwitGains.potentialP2shSegwitGains * 100 | number: '1.0-0' }}"/>% by upgrading to SegWit-P2SH</source>
<target>Cette transaction pourrait économiser <x id="INTERPOLATION" equiv-text="{{ segwitGains.potentialSegwitGains * 100 | number : '1.0-0' }}"/> % sur les frais en passant à SegWit natif ou <x id="INTERPOLATION_1" equiv-text="{{ segwitGains.potentialP2shSegwitGains * 100 | number: '1.0-0' }}"/> % en passant à SegWit-P2SH</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">6</context>
@@ -4731,6 +4767,7 @@
</trans-unit>
<trans-unit id="17e9c05e053cbd29d3835d8ecb19508d0f07241b" datatype="html">
<source>This transaction uses Taproot and thereby saved at least <x id="INTERPOLATION" equiv-text="{{ segwitGains.realizedTaprootGains * 100 | number: '1.0-0' }}"/>% on fees</source>
<target>Cette transaction utilise Taproot et a ainsi économisé au moins <x id="INTERPOLATION" equiv-text="{{ segwitGains.realizedTaprootGains * 100 | number: '1.0-0' }}"/> % sur les frais</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">12</context>
@@ -4739,6 +4776,7 @@
</trans-unit>
<trans-unit id="65d5167c4947e3ad81758d238a7ac7e893c261f0" datatype="html">
<source>Taproot</source>
<target>Taproot</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">12</context>
@@ -4760,6 +4798,7 @@
</trans-unit>
<trans-unit id="47b821c7df420c96de0b22844a88c04d52628540" datatype="html">
<source>This transaction uses Taproot and already saved at least <x id="INTERPOLATION" equiv-text="{{ segwitGains.realizedTaprootGains * 100 | number: '1.0-0' }}"/>% on fees, but could save an additional <x id="INTERPOLATION_1" equiv-text="{{ segwitGains.potentialTaprootGains * 100 | number: '1.0-0' }}"/>% by fully using Taproot</source>
<target>Cette transaction utilise Taproot et a déjà économisé au moins <x id="INTERPOLATION" equiv-text="{{ segwitGains.realizedTaprootGains * 100 | number: '1.0-0' }}"/> % sur les frais, mais pourrait économiser <x id="INTERPOLATION_1" equiv-text="{{ segwitGains.potentialTaprootGains * 100 | number: '1.0-0' }}"/> % supplémentaires en utilisant pleinement Taproot</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">14</context>
@@ -4768,6 +4807,7 @@
</trans-unit>
<trans-unit id="aa31fc4d29f35b2fd36080bb6ff84be8eaab66fd" datatype="html">
<source>This transaction could save <x id="INTERPOLATION" equiv-text="{{ segwitGains.potentialTaprootGains * 100 | number: '1.0-0' }}"/>% on fees by using Taproot</source>
<target>Cette transaction pourrait économiser <x id="INTERPOLATION" equiv-text="{{ segwitGains.potentialTaprootGains * 100 | number: '1.0-0' }}"/> % sur les frais en utilisant Taproot</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">16</context>
@@ -4785,6 +4825,7 @@
</trans-unit>
<trans-unit id="07883574bb93ea23b764861f56a525bdaf907513" datatype="html">
<source>This transaction supports Replace-By-Fee (RBF) allowing fee bumping</source>
<target>Cette transaction prend en charge le Replace-By-Fee/remplacement par frais (RBF), permettant une augmentation des frais</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">25</context>
@@ -5021,6 +5062,7 @@
</trans-unit>
<trans-unit id="4ca458fe3274d1c79640b052d57cf3b900b650b6" datatype="html">
<source>Base fee</source>
<target>Frais de base</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
<context context-type="linenumber">30</context>
@@ -5033,6 +5075,7 @@
</trans-unit>
<trans-unit id="6acd06bd5a3af583cd46c6d9f7954d7a2b44095e" datatype="html">
<source>mSats</source>
<target>mSats</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
<context context-type="linenumber">36</context>
@@ -5049,6 +5092,7 @@
</trans-unit>
<trans-unit id="fb2137ba0df55f21a9d6b6ad08d56d74ad852e0e" datatype="html">
<source>This channel supports zero base fee routing</source>
<target>Ce canal prend en charge le routage sans frais de base</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
<context context-type="linenumber">45</context>
@@ -5057,6 +5101,7 @@
</trans-unit>
<trans-unit id="3ec76ccfe1fdcbfd7ea152392f6472d93d4e8cab" datatype="html">
<source>Zero base fee</source>
<target>Aucun frais de base</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
<context context-type="linenumber">46</context>
@@ -5065,6 +5110,7 @@
</trans-unit>
<trans-unit id="b5e42e06ea8a4012a38eef209104bbd9dd1a0fc0" datatype="html">
<source>This channel does not support zero base fee routing</source>
<target>Ce canal ne prend pas en charge le routage sans frais de base</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
<context context-type="linenumber">51</context>
@@ -5073,6 +5119,7 @@
</trans-unit>
<trans-unit id="09a1bc9c4198e87e9e974a51e86b181429b480d3" datatype="html">
<source>Non-zero base fee</source>
<target>Frais de base non nuls</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
<context context-type="linenumber">52</context>
@@ -5081,6 +5128,7 @@
</trans-unit>
<trans-unit id="055060668d0b9902c37abfb6168a08a36eba4496" datatype="html">
<source>Min HTLC</source>
<target>HTLC min.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
<context context-type="linenumber">58</context>
@@ -5089,6 +5137,7 @@
</trans-unit>
<trans-unit id="c3d94c1a5aef6211f4a902027bd08540d7222b0d" datatype="html">
<source>Max HTLC</source>
<target>HTLC max.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
<context context-type="linenumber">64</context>
@@ -5097,6 +5146,7 @@
</trans-unit>
<trans-unit id="9fe79011b50c2ca1f9b7db7066046631bfc6b3cb" datatype="html">
<source>Timelock delta</source>
<target>Timelock delta</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
<context context-type="linenumber">70</context>
@@ -5105,6 +5155,7 @@
</trans-unit>
<trans-unit id="205c1b86ac1cc419c4d0cca51fdde418c4ffdc20" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ i }}"/> channels</source>
<target> <x id="INTERPOLATION" equiv-text="{{ i }}"/> canaux</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
<context context-type="linenumber">80</context>
@@ -5117,6 +5168,7 @@
</trans-unit>
<trans-unit id="3bbd25c289760a3ba57e30df5ad5fe8977ab25a5" datatype="html">
<source>lightning channel</source>
<target>canal Lightning</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-preview.component.html</context>
<context context-type="linenumber">3,5</context>
@@ -5125,6 +5177,7 @@
</trans-unit>
<trans-unit id="43c4133c7a0263d2e33dd4c2e74d40784b2e4b1c" datatype="html">
<source>Inactive</source>
<target>Inactif</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-preview.component.html</context>
<context context-type="linenumber">10,11</context>
@@ -5141,6 +5194,7 @@
</trans-unit>
<trans-unit id="b36e1450940b7f6028d8587568c7d669b53f7a06" datatype="html">
<source>Active</source>
<target>Actif</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-preview.component.html</context>
<context context-type="linenumber">11,12</context>
@@ -5157,6 +5211,7 @@
</trans-unit>
<trans-unit id="4804b8e78964cee9e5c85f31fd982639b97780b2" datatype="html">
<source>Closed</source>
<target>Fermé</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-preview.component.html</context>
<context context-type="linenumber">12,14</context>
@@ -5177,6 +5232,7 @@
</trans-unit>
<trans-unit id="1b051734b0ee9021991c91b3ed4e81c244322462" datatype="html">
<source>Created</source>
<target>Établi</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-preview.component.html</context>
<context context-type="linenumber">23,26</context>
@@ -5189,6 +5245,7 @@
</trans-unit>
<trans-unit id="ce9dfdc6dccb28dc75a78c704e09dc18fb02dcfa" datatype="html">
<source>Capacity</source>
<target>Capacité</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-preview.component.html</context>
<context context-type="linenumber">27,28</context>
@@ -5241,6 +5298,7 @@
</trans-unit>
<trans-unit id="8fd0077b032e360ece45c4fd655f85b2400dcb83" datatype="html">
<source>ppm</source>
<target>ppm</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-preview.component.html</context>
<context context-type="linenumber">34,35</context>
@@ -5261,6 +5319,7 @@
</trans-unit>
<trans-unit id="13142ad9637003749d667393aaae7a286d1eba5b" datatype="html">
<source>Lightning channel</source>
<target>Canal Lightning</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel.component.html</context>
<context context-type="linenumber">2,5</context>
@@ -5273,6 +5332,7 @@
</trans-unit>
<trans-unit id="8dad9f60ff582b632a864f22c7466327793c3f09" datatype="html">
<source>Last update</source>
<target>Dernière mise à jour</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel.component.html</context>
<context context-type="linenumber">33,34</context>
@@ -5305,6 +5365,7 @@
</trans-unit>
<trans-unit id="0c134c6787c6b763446c096ea5233ace6fd9116d" datatype="html">
<source>Closing date</source>
<target>Date de clôture</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel.component.html</context>
<context context-type="linenumber">37,38</context>
@@ -5317,6 +5378,7 @@
</trans-unit>
<trans-unit id="cdd2ea2e12437df848ec474ac15af48859bd09a0" datatype="html">
<source>Opening transaction</source>
<target>Transaction d'ouverture</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel.component.html</context>
<context context-type="linenumber">73,74</context>
@@ -5325,6 +5387,7 @@
</trans-unit>
<trans-unit id="50411064ac48e15659d1985b414ae91af0c8cd36" datatype="html">
<source>Closing transaction</source>
<target>Transaction de clôture</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel.component.html</context>
<context context-type="linenumber">82,84</context>
@@ -5333,6 +5396,7 @@
</trans-unit>
<trans-unit id="6008566722612122663" datatype="html">
<source>Channel: <x id="PH" equiv-text="value.short_id"/></source>
<target>Canal : <x id="PH" equiv-text="value.short_id"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel.component.ts</context>
<context context-type="linenumber">37</context>
@@ -5340,6 +5404,7 @@
</trans-unit>
<trans-unit id="c9039b1b13b3ef165b66b3c5d79f810ab1ebb050" datatype="html">
<source>Open</source>
<target>Ouvert</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-list/channels-list.component.html</context>
<context context-type="linenumber">5,7</context>
@@ -5348,6 +5413,7 @@
</trans-unit>
<trans-unit id="a43e63c25599408ef14b33c80dd523021b21f846" datatype="html">
<source>No channels to display</source>
<target>Aucun canal à afficher</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-list/channels-list.component.html</context>
<context context-type="linenumber">29,35</context>
@@ -5356,6 +5422,7 @@
</trans-unit>
<trans-unit id="fbaaeb297e70b9a800acf841b9d26c19d60651ef" datatype="html">
<source>Alias</source>
<target>Alias</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-list/channels-list.component.html</context>
<context context-type="linenumber">35,37</context>
@@ -5392,6 +5459,7 @@
</trans-unit>
<trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1" datatype="html">
<source>Status</source>
<target>Statut</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-list/channels-list.component.html</context>
<context context-type="linenumber">37,38</context>
@@ -5400,6 +5468,7 @@
</trans-unit>
<trans-unit id="0cd107458dce99721e72971d426a5a3106074331" datatype="html">
<source>Channel ID</source>
<target>ID du canal</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-list/channels-list.component.html</context>
<context context-type="linenumber">41,45</context>
@@ -5408,6 +5477,7 @@
</trans-unit>
<trans-unit id="e4b2d9e6a2ab9e6ca34027ec03beaac42b7badd4" datatype="html">
<source>sats</source>
<target>sats</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-list/channels-list.component.html</context>
<context context-type="linenumber">61,65</context>
@@ -5460,6 +5530,7 @@
</trans-unit>
<trans-unit id="ab456546aa39de3328fcfdf077f410b5ff1aa773" datatype="html">
<source>Avg Capacity</source>
<target>Capacité moy</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">13,15</context>
@@ -5472,6 +5543,7 @@
</trans-unit>
<trans-unit id="f68705670e611f13da1a43e90f9c97d8761dd9ef" datatype="html">
<source>Avg Fee Rate</source>
<target>Taux de frais moy</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">26,28</context>
@@ -5484,6 +5556,7 @@
</trans-unit>
<trans-unit id="db1f0c0605ab0c4a904523635982253ff72eed40" datatype="html">
<source>The average fee rate charged by routing nodes, ignoring fee rates &gt; 0.5% or 5000ppm</source>
<target>Le taux de frais moyen facturé par les nœuds de routage, en ignorant les taux de frais &gt; 0,5 % ou 5 000 ppm</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">28,30</context>
@@ -5492,6 +5565,7 @@
</trans-unit>
<trans-unit id="140fb39368f210ec945417f3eb23bf9564396e5c" datatype="html">
<source>Avg Base Fee</source>
<target>Frais de base moy</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">41,43</context>
@@ -5504,6 +5578,7 @@
</trans-unit>
<trans-unit id="0a46218f4a7b17b6445460898d75ab78e7e7979b" datatype="html">
<source>The average base fee charged by routing nodes, ignoring base fees &gt; 5000ppm</source>
<target>Frais de base moyens facturés par les nœuds de routage, sans tenir compte des frais de base &gt; 5 000 ppm</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">43,45</context>
@@ -5512,6 +5587,7 @@
</trans-unit>
<trans-unit id="2e72b276a3c5cc2ec27b4c8189639ba2fe62b6cb" datatype="html">
<source>Med Capacity</source>
<target>Capacité med</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">59,61</context>
@@ -5520,6 +5596,7 @@
</trans-unit>
<trans-unit id="2c1c39e28735f607d62dbf3272eb792451c265a5" datatype="html">
<source>Med Fee Rate</source>
<target>Taux de frais med</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">72,74</context>
@@ -5528,6 +5605,7 @@
</trans-unit>
<trans-unit id="cb4dae32e1b4d6a2ba6287d9f7bd859ca7259468" datatype="html">
<source>The median fee rate charged by routing nodes, ignoring fee rates &gt; 0.5% or 5000ppm</source>
<target>Le taux de frais médian facturé par les nœuds de routage, en ignorant les taux de frais &gt; 0,5 % ou 5 000 ppm</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">74,76</context>
@@ -5536,6 +5614,7 @@
</trans-unit>
<trans-unit id="a541dbcef4908bf2e767e77d7a09cc62450e8e56" datatype="html">
<source>Med Base Fee</source>
<target>Frais de base med</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">87,89</context>
@@ -5544,6 +5623,7 @@
</trans-unit>
<trans-unit id="b8539025268617abfcab1c3f2a2c60cd8d7485fb" datatype="html">
<source>The median base fee charged by routing nodes, ignoring base fees &gt; 5000ppm</source>
<target>Frais de base médians facturés par les nœuds de routage, sans tenir compte des frais de base &gt; 5 000 ppm</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">89,91</context>
@@ -5552,6 +5632,7 @@
</trans-unit>
<trans-unit id="de1c07e9943fc284461bb8fb4860faecf52a1568" datatype="html">
<source>Lightning node group</source>
<target>Groupe de nœuds Lightning</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/group/group-preview.component.html</context>
<context context-type="linenumber">3,5</context>
@@ -5564,6 +5645,7 @@
</trans-unit>
<trans-unit id="6e2329529b1953198c7dfa0edb260554310bc636" datatype="html">
<source>Nodes</source>
<target>Nœuds</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/group/group-preview.component.html</context>
<context context-type="linenumber">25,29</context>
@@ -5604,6 +5686,7 @@
</trans-unit>
<trans-unit id="14a12efce56ffe89f839e50320bcf47e4e9ca4e4" datatype="html">
<source>Liquidity</source>
<target>Liquidité</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/group/group-preview.component.html</context>
<context context-type="linenumber">29,31</context>
@@ -5640,6 +5723,7 @@
</trans-unit>
<trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19" datatype="html">
<source>Channels</source>
<target>Canaux</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/group/group-preview.component.html</context>
<context context-type="linenumber">40,43</context>
@@ -5700,6 +5784,7 @@
</trans-unit>
<trans-unit id="e4706894b195010f6814e54bf6570c729d69aaca" datatype="html">
<source>Average size</source>
<target>Taille moyenne</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/group/group-preview.component.html</context>
<context context-type="linenumber">44,46</context>
@@ -5712,6 +5797,7 @@
</trans-unit>
<trans-unit id="ed31c09fd77c36238c13d83635f3fe5294c733d2" datatype="html">
<source>Location</source>
<target>Emplacement</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/group/group.component.html</context>
<context context-type="linenumber">74,77</context>
@@ -5752,6 +5838,7 @@
</trans-unit>
<trans-unit id="29c05e9a540827cdfa8e3b2e5e2f27aeb478916c" datatype="html">
<source>Network Statistics</source>
<target>Statistiques du réseau</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/lightning-dashboard/lightning-dashboard.component.html</context>
<context context-type="linenumber">10</context>
@@ -5760,6 +5847,7 @@
</trans-unit>
<trans-unit id="066e05b9a5db60850d907783fde6913e2e47cd5b" datatype="html">
<source>Channels Statistics</source>
<target>Statistiques des canaux</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/lightning-dashboard/lightning-dashboard.component.html</context>
<context context-type="linenumber">24</context>
@@ -5768,6 +5856,7 @@
</trans-unit>
<trans-unit id="0f33aeb084ac4d83cb0fe6f72648a8585b1b5e88" datatype="html">
<source>Lightning Network History</source>
<target>Historique du réseau Lightning</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/lightning-dashboard/lightning-dashboard.component.html</context>
<context context-type="linenumber">49</context>
@@ -5776,6 +5865,7 @@
</trans-unit>
<trans-unit id="2d9883d230a47fbbb2ec969e32a186597ea27405" datatype="html">
<source>Liquidity Ranking</source>
<target>Classement par liquidité</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/lightning-dashboard/lightning-dashboard.component.html</context>
<context context-type="linenumber">62</context>
@@ -5792,6 +5882,7 @@
</trans-unit>
<trans-unit id="c50bf442cf99f6fc5f8b687c460f33234b879869" datatype="html">
<source>Connectivity Ranking</source>
<target>Classement par connectivité</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/lightning-dashboard/lightning-dashboard.component.html</context>
<context context-type="linenumber">76</context>
@@ -5804,6 +5895,7 @@
</trans-unit>
<trans-unit id="027f48063a5512e5c26b6ca88f7d7734e2d333a7" datatype="html">
<source>Percentage change past week</source>
<target>Variation sur une semaine</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node-statistics/node-statistics.component.html</context>
<context context-type="linenumber">5,7</context>
@@ -5820,6 +5912,7 @@
</trans-unit>
<trans-unit id="be6ebbb11d55adb8e821d503f8e10ccf43ed8b00" datatype="html">
<source>Lightning node</source>
<target>Nœud Lightning</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node-preview.component.html</context>
<context context-type="linenumber">3,5</context>
@@ -5836,6 +5929,7 @@
</trans-unit>
<trans-unit id="af15c87bfed273bc095ba572cf27e3aaffc33b22" datatype="html">
<source>Active capacity</source>
<target>Capacité active</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node-preview.component.html</context>
<context context-type="linenumber">20,22</context>
@@ -5848,6 +5942,7 @@
</trans-unit>
<trans-unit id="52ffa66bd0399a49d5aa8d6f8fa077a6e8db09c0" datatype="html">
<source>Active channels</source>
<target>Canaux actifs</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node-preview.component.html</context>
<context context-type="linenumber">26,30</context>
@@ -5860,6 +5955,7 @@
</trans-unit>
<trans-unit id="a43f25a9ac40e8e2441ff0be7a36b8e5d15534df" datatype="html">
<source>Country</source>
<target>Pays</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node-preview.component.html</context>
<context context-type="linenumber">44,47</context>
@@ -5868,6 +5964,7 @@
</trans-unit>
<trans-unit id="674378571ab7e72a386f27fd3281558bae821d9d" datatype="html">
<source>No node found for public key &quot;<x id="INTERPOLATION" equiv-text="{{ node.public_key | shortenString : 12}}"/>&quot;</source>
<target>Aucun nœud trouvé pour la clé publique &amp;quot; <x id="INTERPOLATION" equiv-text="{{ node.public_key | shortenString : 12}}"/> &amp;quot;</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
<context context-type="linenumber">17,19</context>
@@ -5876,6 +5973,7 @@
</trans-unit>
<trans-unit id="43b48b9c15083a164b401bf3775a4b99f3917699" datatype="html">
<source>Average channel size</source>
<target>Taille moyenne du canal</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
<context context-type="linenumber">40,43</context>
@@ -5884,6 +5982,7 @@
</trans-unit>
<trans-unit id="e5d8bb389c702588877f039d72178f219453a72d" datatype="html">
<source>Unknown</source>
<target>Inconnue</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
<context context-type="linenumber">52,56</context>
@@ -5904,6 +6003,7 @@
</trans-unit>
<trans-unit id="8fa4d523f7b91df4390120b85ed0406138273e1a" datatype="html">
<source>Color</source>
<target>Couleur</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
<context context-type="linenumber">75,77</context>
@@ -5912,6 +6012,7 @@
</trans-unit>
<trans-unit id="5b9904cb31f6f28314443f6385dc5facab7ea851" datatype="html">
<source>ISP</source>
<target>FAI</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
<context context-type="linenumber">82,83</context>
@@ -5924,6 +6025,7 @@
</trans-unit>
<trans-unit id="86d9619247d148019e5599707c39a36e880a2d23" datatype="html">
<source>Exclusively on Tor</source>
<target>Exclusivement sur Tor</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
<context context-type="linenumber">88,90</context>
@@ -5932,6 +6034,7 @@
</trans-unit>
<trans-unit id="b371db1a7ab2167dc8dd91b48ea929d71bb4ef4c" datatype="html">
<source>Open channels</source>
<target>Canaux ouverts</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
<context context-type="linenumber">145,148</context>
@@ -5940,6 +6043,7 @@
</trans-unit>
<trans-unit id="a2dff531c3d7477178553f579e0ec7c3ac7a6f30" datatype="html">
<source>Closed channels</source>
<target>Canaux fermés</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
<context context-type="linenumber">149,152</context>
@@ -5948,6 +6052,7 @@
</trans-unit>
<trans-unit id="2519445964020754921" datatype="html">
<source>Node: <x id="PH" equiv-text="node.alias"/></source>
<target>Nœud : <x id="PH" equiv-text="node.alias"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.ts</context>
<context context-type="linenumber">42</context>
@@ -5955,6 +6060,7 @@
</trans-unit>
<trans-unit id="7cac1c3013423d82d5149a5854d709bd08411430" datatype="html">
<source>(Tor nodes excluded)</source>
<target>(Nœuds Tor exclus)</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-channels-map/nodes-channels-map.component.html</context>
<context context-type="linenumber">8,11</context>
@@ -5975,6 +6081,7 @@
</trans-unit>
<trans-unit id="8199511328474154549" datatype="html">
<source>Lightning Nodes Channels World Map</source>
<target>Carte du monde des canaux Lightning</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts</context>
<context context-type="linenumber">69</context>
@@ -5982,6 +6089,7 @@
</trans-unit>
<trans-unit id="4390631969351833104" datatype="html">
<source>No geolocation data available</source>
<target>Aucune donnée de géolocalisation disponible</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts</context>
<context context-type="linenumber">218,213</context>
@@ -5989,6 +6097,7 @@
</trans-unit>
<trans-unit id="a4d393ee035f4225083c22cc3909b26a05a87528" datatype="html">
<source>Active channels map</source>
<target>Carte des canaux actifs</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-channels/node-channels.component.html</context>
<context context-type="linenumber">2,3</context>
@@ -5997,6 +6106,7 @@
</trans-unit>
<trans-unit id="4635698809727522638" datatype="html">
<source>Indexing in progess</source>
<target>Indexation en cours</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts</context>
<context context-type="linenumber">121,116</context>
@@ -6008,6 +6118,7 @@
</trans-unit>
<trans-unit id="1055322764280599360" datatype="html">
<source>Reachable on Clearnet Only</source>
<target>Accessible uniquement sur Clearnet</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts</context>
<context context-type="linenumber">164,161</context>
@@ -6019,6 +6130,7 @@
</trans-unit>
<trans-unit id="2760682261176173881" datatype="html">
<source>Reachable on Clearnet and Darknet</source>
<target>Accessible sur Clearnet et Darknet</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts</context>
<context context-type="linenumber">185,182</context>
@@ -6030,6 +6142,7 @@
</trans-unit>
<trans-unit id="1191036460161514668" datatype="html">
<source>Reachable on Darknet Only</source>
<target>Accessible uniquement sur Darknet</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts</context>
<context context-type="linenumber">206,203</context>
@@ -6041,6 +6154,7 @@
</trans-unit>
<trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9" datatype="html">
<source>Share</source>
<target>Part</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html</context>
<context context-type="linenumber">29,31</context>
@@ -6053,6 +6167,7 @@
</trans-unit>
<trans-unit id="5222540403093176126" datatype="html">
<source><x id="PH" equiv-text="country.count.toString()"/> nodes</source>
<target> <x id="PH" equiv-text="country.count.toString()"/> nœuds</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts</context>
<context context-type="linenumber">103,102</context>
@@ -6068,6 +6183,7 @@
</trans-unit>
<trans-unit id="7032954508645880700" datatype="html">
<source><x id="PH" equiv-text="this.amountShortenerPipe.transform(country.capacity / 100000000, 2)"/> BTC capacity</source>
<target>Capacité de <x id="PH" equiv-text="this.amountShortenerPipe.transform(country.capacity / 100000000, 2)"/> BTC</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts</context>
<context context-type="linenumber">104,102</context>
@@ -6075,6 +6191,7 @@
</trans-unit>
<trans-unit id="7ede3edfacd291eb9db08e11845d9efdf197f417" datatype="html">
<source>Lightning nodes in <x id="INTERPOLATION" equiv-text="{{ country?.name }}"/></source>
<target>Nœuds Lightning: <x id="INTERPOLATION" equiv-text="{{ country?.name }}"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country/nodes-per-country.component.html</context>
<context context-type="linenumber">3,4</context>
@@ -6083,6 +6200,7 @@
</trans-unit>
<trans-unit id="4498ec29c37744fef46809ebc3db67c5fb789917" datatype="html">
<source>ISP Count</source>
<target>Nombre de FAI</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country/nodes-per-country.component.html</context>
<context context-type="linenumber">34,38</context>
@@ -6091,6 +6209,7 @@
</trans-unit>
<trans-unit id="90a6a964ba53464578003e3b4b2873ef5d2132a1" datatype="html">
<source>Top ISP</source>
<target>FAI les plus utilisés</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country/nodes-per-country.component.html</context>
<context context-type="linenumber">38,40</context>
@@ -6099,6 +6218,7 @@
</trans-unit>
<trans-unit id="7246059109648045954" datatype="html">
<source>Lightning nodes in <x id="PH" equiv-text="response.country.en"/></source>
<target>Nœuds Lightning: <x id="PH" equiv-text="response.country.en"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country/nodes-per-country.component.ts</context>
<context context-type="linenumber">35</context>
@@ -6106,6 +6226,7 @@
</trans-unit>
<trans-unit id="6b4442323c695a8211357c7e4486dd620c443822" datatype="html">
<source>Clearnet Capacity</source>
<target>Capacité Clearnet</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html</context>
<context context-type="linenumber">6,8</context>
@@ -6118,6 +6239,7 @@
</trans-unit>
<trans-unit id="ccabb31683868066778a1d664aa53ee9fcf77d6b" datatype="html">
<source>How much liquidity is running on nodes advertising at least one clearnet IP address</source>
<target>Liquidité qui circule sur les nœuds annonçant au moins une adresse IP clearnet</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html</context>
<context context-type="linenumber">8,9</context>
@@ -6126,6 +6248,7 @@
</trans-unit>
<trans-unit id="462d2233ddacc9869eb28e09b3b12f1d85556937" datatype="html">
<source>Unknown Capacity</source>
<target>Capacité inconnue</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html</context>
<context context-type="linenumber">13,15</context>
@@ -6138,6 +6261,7 @@
</trans-unit>
<trans-unit id="26fb07e8754b87bba4bf12c5137ffa77dac389a8" datatype="html">
<source>How much liquidity is running on nodes which ISP was not identifiable</source>
<target>Liquidité qui circule sur les nœuds dont le FAI n'était pas identifiable</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html</context>
<context context-type="linenumber">15,16</context>
@@ -6146,6 +6270,7 @@
</trans-unit>
<trans-unit id="df3728b721159d25e68f5daf44aaab7fa25f1415" datatype="html">
<source>Tor Capacity</source>
<target>Capacité Tor</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html</context>
<context context-type="linenumber">20,22</context>
@@ -6158,6 +6283,7 @@
</trans-unit>
<trans-unit id="23549ef4e1f846f06abcf07ceecb115945a0cf61" datatype="html">
<source>How much liquidity is running on nodes advertising only Tor addresses</source>
<target>Liquidité qui circule sur les nœuds annonçant uniquement les adresses Tor</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html</context>
<context context-type="linenumber">22,23</context>
@@ -6166,6 +6292,7 @@
</trans-unit>
<trans-unit id="e008f2a76179fdcd7110b41ca624131f91075949" datatype="html">
<source>Top 100 ISPs hosting LN nodes</source>
<target>Top 100 des FAI hébergeant des nœuds LN</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html</context>
<context context-type="linenumber">31,33</context>
@@ -6174,6 +6301,7 @@
</trans-unit>
<trans-unit id="3627306100664959238" datatype="html">
<source><x id="PH" equiv-text="this.amountShortenerPipe.transform(isp[2] / 100000000, 2)"/> BTC</source>
<target> <x id="PH" equiv-text="this.amountShortenerPipe.transform(isp[2] / 100000000, 2)"/> BTC</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts</context>
<context context-type="linenumber">158,156</context>
@@ -6185,6 +6313,7 @@
</trans-unit>
<trans-unit id="c18497e4f0db0d0ad0c71ba294295f42b3d312c9" datatype="html">
<source>Lightning ISP</source>
<target>FAI Lightning</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html</context>
<context context-type="linenumber">3,5</context>
@@ -6193,6 +6322,7 @@
</trans-unit>
<trans-unit id="41074627e075a9b1bd8197c474ea68a2b8276e54" datatype="html">
<source>Top country</source>
<target>Meilleur pays</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html</context>
<context context-type="linenumber">39,41</context>
@@ -6205,6 +6335,7 @@
</trans-unit>
<trans-unit id="5fad6872a652d922ad8822f4016e104b9a8cc113" datatype="html">
<source>Top node</source>
<target>Meilleur nœud</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html</context>
<context context-type="linenumber">45,48</context>
@@ -6213,6 +6344,7 @@
</trans-unit>
<trans-unit id="5735693498020397727" datatype="html">
<source>Lightning nodes on ISP: <x id="PH" equiv-text="response.isp"/> [AS<x id="PH_1" equiv-text="this.route.snapshot.params.isp"/>]</source>
<target>Nœuds Lightning sur le FAI : <x id="PH" equiv-text="response.isp"/> [AS <x id="PH_1" equiv-text="this.route.snapshot.params.isp"/> ]</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.ts</context>
<context context-type="linenumber">44</context>
@@ -6224,6 +6356,7 @@
</trans-unit>
<trans-unit id="d82f436f033a7d81680b8430275f94dda530151c" datatype="html">
<source>Lightning nodes on ISP: <x id="INTERPOLATION" equiv-text="{{ isp?.name }}"/></source>
<target>Nœuds Lightning sur le FAI : <x id="INTERPOLATION" equiv-text="{{ isp?.name }}"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp/nodes-per-isp.component.html</context>
<context context-type="linenumber">2,4</context>
@@ -6232,6 +6365,7 @@
</trans-unit>
<trans-unit id="ca0b795795658155d44ddca02e95f1feeeb4a88f" datatype="html">
<source>ASN</source>
<target>ASN</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp/nodes-per-isp.component.html</context>
<context context-type="linenumber">11,14</context>
@@ -6240,6 +6374,7 @@
</trans-unit>
<trans-unit id="5b727d251b06e9959cf24a90250a480d425339de" datatype="html">
<source>Top 100 oldest lightning nodes</source>
<target>Top 100 des nœuds Lightning les plus anciens</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-ranking/oldest-nodes/oldest-nodes.component.html</context>
<context context-type="linenumber">3,7</context>
@@ -6248,6 +6383,7 @@
</trans-unit>
<trans-unit id="4157312397261844620" datatype="html">
<source>Oldest lightning nodes</source>
<target>Noeuds Lightning les plus anciens</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-ranking/oldest-nodes/oldest-nodes.component.ts</context>
<context context-type="linenumber">27</context>
@@ -6255,6 +6391,7 @@
</trans-unit>
<trans-unit id="71bb1ed9da9ebb92cf35925bc6fe0a8fbc325625" datatype="html">
<source>Top 100 nodes liquidity ranking</source>
<target>Classement des 100 meilleurs nœuds par liquidité</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html</context>
<context context-type="linenumber">3,7</context>
@@ -6263,6 +6400,7 @@
</trans-unit>
<trans-unit id="99786bd2106b708e4514d0121964affb19bee636" datatype="html">
<source>Top 100 nodes connectivity ranking</source>
<target>Classement des 100 meilleurs nœuds par connectivité</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html</context>
<context context-type="linenumber">3,7</context>
@@ -6271,6 +6409,7 @@
</trans-unit>
<trans-unit id="47a30fc5a836252f8fe03e2949756b150684d934" datatype="html">
<source>Oldest nodes</source>
<target>Nœuds les plus anciens</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html</context>
<context context-type="linenumber">36</context>
@@ -6279,6 +6418,7 @@
</trans-unit>
<trans-unit id="4034215342842066505" datatype="html">
<source>Top lightning nodes</source>
<target>Top nœuds Lightning</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.ts</context>
<context context-type="linenumber">22</context>
@@ -6286,6 +6426,7 @@
</trans-unit>
<trans-unit id="af1176facd00a0580509fb2900ab0cf7f9b39ae7" datatype="html">
<source>Indexing in progress</source>
<target>Indexation en cours</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/statistics-chart/lightning-statistics-chart.component.html</context>
<context context-type="linenumber">52,55</context>

File diff suppressed because it is too large Load Diff

View File

@@ -1471,6 +1471,7 @@
</trans-unit>
<trans-unit id="1405c5f1a9834338ff13442c550927ab7144fdc8" datatype="html">
<source>Community Integrations</source>
<target>Интеграции c сообществом</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/about/about.component.html</context>
<context context-type="linenumber">191,193</context>
@@ -1544,6 +1545,7 @@
</trans-unit>
<trans-unit id="address-label.multisig" datatype="html">
<source>Multisig <x id="multisigM" equiv-text="ms.m"/> of <x id="multisigN" equiv-text="ms.n"/></source>
<target>Мультиподпись <x id="multisigM" equiv-text="ms.m"/> из <x id="multisigN" equiv-text="ms.n"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/address-labels/address-labels.component.ts</context>
<context context-type="linenumber">105</context>
@@ -2027,6 +2029,7 @@
</trans-unit>
<trans-unit id="4718502b32e47c66db00ac7cf4f7f058acb6e849" datatype="html">
<source>Block </source>
<target>Блок</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block-audit/block-audit.component.html</context>
<context context-type="linenumber">7,9</context>
@@ -2121,6 +2124,7 @@
</trans-unit>
<trans-unit id="e9503a2605cf5d41273a7d5ad653873f28f8f1a3" datatype="html">
<source>Match rate</source>
<target>Коэффициент соответствия</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block-audit/block-audit.component.html</context>
<context context-type="linenumber">64,67</context>
@@ -2129,6 +2133,7 @@
</trans-unit>
<trans-unit id="c97ea3cbb05527c76b0011820ca76e8e00632ca1" datatype="html">
<source>Missing txs</source>
<target>Отсутствующие транзакции</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block-audit/block-audit.component.html</context>
<context context-type="linenumber">68,71</context>
@@ -2137,6 +2142,7 @@
</trans-unit>
<trans-unit id="94d8765805623dd51e562e6e4bb669a944bbe516" datatype="html">
<source>Added txs</source>
<target>Добавленные транзакции</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block-audit/block-audit.component.html</context>
<context context-type="linenumber">72,75</context>
@@ -2145,6 +2151,7 @@
</trans-unit>
<trans-unit id="da5d7e263a3c6dc585d04844074afaa7229b88a0" datatype="html">
<source>Missing</source>
<target>Отсутствующие</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block-audit/block-audit.component.html</context>
<context context-type="linenumber">84,85</context>
@@ -2153,6 +2160,7 @@
</trans-unit>
<trans-unit id="80e3b490720757978c99a7b5af3885faf202b955" datatype="html">
<source>Added</source>
<target>Добавленные</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block-audit/block-audit.component.html</context>
<context context-type="linenumber">86,92</context>
@@ -2470,6 +2478,7 @@
</trans-unit>
<trans-unit id="80065834848189518" datatype="html">
<source>No data to display yet. Try again later.</source>
<target>Пока нет данных для отображения. Попробуйте позже.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block-prediction-graph/block-prediction-graph.component.ts</context>
<context context-type="linenumber">108,103</context>
@@ -2523,6 +2532,7 @@
</trans-unit>
<trans-unit id="7f5d0c10614e8a34f0e2dad33a0568277c50cf69" datatype="html">
<source>Block</source>
<target>Блок</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block/block-preview.component.html</context>
<context context-type="linenumber">3,7</context>
@@ -2535,6 +2545,7 @@
</trans-unit>
<trans-unit id="445c243f1d1cd2c7f0df430cdb2fa25639600396" datatype="html">
<source><x id="INTERPOLATION" equiv-text="&lt;/ng-template&gt; &lt;/h1&gt; &lt;div class=&quot;blockhash&quot; *ngIf=&quot;block"/></source>
<target> <x id="INTERPOLATION" equiv-text="&lt;/ng-template&gt; &lt;/h1&gt; &lt;div class=&quot;blockhash&quot; *ngIf=&quot;block"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block/block-preview.component.html</context>
<context context-type="linenumber">11,12</context>
@@ -3250,6 +3261,7 @@
</trans-unit>
<trans-unit id="5115edb23059f4dcfe6ce0a979e40962a149c35c" datatype="html">
<source>Hashrate &amp; Difficulty</source>
<target>Хэшрейт и сложность</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/graphs/graphs.component.html</context>
<context context-type="linenumber">15,16</context>
@@ -3258,6 +3270,7 @@
</trans-unit>
<trans-unit id="a3382a60534e9fff5c3a0fcde39bab356afc4a59" datatype="html">
<source>Lightning</source>
<target>Лайтнинг</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/graphs/graphs.component.html</context>
<context context-type="linenumber">31</context>
@@ -3266,6 +3279,7 @@
</trans-unit>
<trans-unit id="b420668a91f8ebaf6e6409c4ba87f1d45961d2bd" datatype="html">
<source>Lightning Nodes Per Network</source>
<target>Узлы Лайтнинг на сеть</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/graphs/graphs.component.html</context>
<context context-type="linenumber">34</context>
@@ -3286,6 +3300,7 @@
</trans-unit>
<trans-unit id="ea8db27e6db64f8b940711948c001a1100e5fe9f" datatype="html">
<source>Lightning Network Capacity</source>
<target>Объем сети Лайтнинг</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/graphs/graphs.component.html</context>
<context context-type="linenumber">36</context>
@@ -3306,6 +3321,7 @@
</trans-unit>
<trans-unit id="8573a1576789bd2c4faeaed23037c4917812c6cf" datatype="html">
<source>Lightning Nodes Per ISP</source>
<target>Узлов Лайтнинг на провайдера</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/graphs/graphs.component.html</context>
<context context-type="linenumber">38</context>
@@ -3318,6 +3334,7 @@
</trans-unit>
<trans-unit id="9d3ad4c6623870d96b65fb7a708fed6ce7c20044" datatype="html">
<source>Lightning Nodes Per Country</source>
<target>Узлов Лайтнинг на страну</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/graphs/graphs.component.html</context>
<context context-type="linenumber">40</context>
@@ -3334,6 +3351,7 @@
</trans-unit>
<trans-unit id="af8560ca50882114be16c951650f83bca73161a7" datatype="html">
<source>Lightning Nodes World Map</source>
<target>Мировая карта узлов Лайтнинг</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/graphs/graphs.component.html</context>
<context context-type="linenumber">42</context>
@@ -3350,6 +3368,7 @@
</trans-unit>
<trans-unit id="b482ceceb39c7a045cb2ab2c64f7091d21e63d44" datatype="html">
<source>Lightning Nodes Channels World Map</source>
<target>Мировая карта лайтнинг-каналов</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/graphs/graphs.component.html</context>
<context context-type="linenumber">44</context>
@@ -3470,6 +3489,7 @@
</trans-unit>
<trans-unit id="142e923d3b04186ac6ba23387265d22a2fa404e0" datatype="html">
<source>Lightning Explorer</source>
<target>Лайтнинг-обозреватель</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/master-page/master-page.component.html</context>
<context context-type="linenumber">44,45</context>
@@ -3482,6 +3502,7 @@
</trans-unit>
<trans-unit id="7cbedd89f60daafaf0e56363900d666a4e02ffb1" datatype="html">
<source>beta</source>
<target>бета</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/master-page/master-page.component.html</context>
<context context-type="linenumber">45,48</context>
@@ -3737,6 +3758,7 @@
</trans-unit>
<trans-unit id="2158ea60725d3a97aed6f0f00aa7df48d7bb42ff" datatype="html">
<source>mining pool</source>
<target>майнинг-пул</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/pool/pool-preview.component.html</context>
<context context-type="linenumber">3,5</context>
@@ -4067,6 +4089,7 @@
</trans-unit>
<trans-unit id="7deec1c1520f06170e1f8e8ddfbe4532312f638f" datatype="html">
<source>Explore the full Bitcoin ecosystem</source>
<target>Исследуйте всю экосистему Биткоина</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/search-form/search-form.component.html</context>
<context context-type="linenumber">4,6</context>
@@ -4440,6 +4463,7 @@
</trans-unit>
<trans-unit id="d0fd8887b50687cfc0fc1f6569f6fd6c5db4ffc0" datatype="html">
<source>Hide diagram</source>
<target>Скрыть диаграмму</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">198,203</context>
@@ -4448,6 +4472,7 @@
</trans-unit>
<trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b" datatype="html">
<source>Show more</source>
<target>Показать больше</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">219,221</context>
@@ -4456,6 +4481,7 @@
</trans-unit>
<trans-unit id="5403a767248e304199592271bba3366d2ca3f903" datatype="html">
<source>Show less</source>
<target>Показывай меньше</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">221,227</context>
@@ -4464,6 +4490,7 @@
</trans-unit>
<trans-unit id="e7aa6db8df12d0158df972b6abfc65a8478b2b7d" datatype="html">
<source>Show diagram</source>
<target>Показать схему</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">241,242</context>
@@ -4657,6 +4684,7 @@
</trans-unit>
<trans-unit id="ac0c4b49e44c42db35ddf590fb5f78375a891b01" datatype="html">
<source>other inputs</source>
<target>другие входы</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html</context>
<context context-type="linenumber">12</context>
@@ -4665,6 +4693,7 @@
</trans-unit>
<trans-unit id="8900247c0476fea8fcbee57a72a1d1da5ddd40ff" datatype="html">
<source>other outputs</source>
<target>другие выходы</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html</context>
<context context-type="linenumber">13</context>
@@ -4673,6 +4702,7 @@
</trans-unit>
<trans-unit id="3e242f213dd1a0754aad9164aa80887d67708500" datatype="html">
<source>Input</source>
<target>Вход</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html</context>
<context context-type="linenumber">43</context>
@@ -4681,6 +4711,7 @@
</trans-unit>
<trans-unit id="7a080851e25a41e898776a9c90cf8dbe81027f9a" datatype="html">
<source>Output</source>
<target>Выход</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html</context>
<context context-type="linenumber">44</context>
@@ -4689,6 +4720,7 @@
</trans-unit>
<trans-unit id="25d58cd5c18fd9c1c89d6062d67dcc2482161410" datatype="html">
<source>This transaction saved <x id="INTERPOLATION" equiv-text="{{ segwitGains.realizedSegwitGains * 100 | number: '1.0-0' }}"/>% on fees by using native SegWit</source>
<target>Эта транзакция сэкономила <x id="INTERPOLATION" equiv-text="{{ segwitGains.realizedSegwitGains * 100 | number: '1.0-0' }}"/> % на комиссиях за счет использования нативного SegWit.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">2</context>
@@ -4715,6 +4747,7 @@
</trans-unit>
<trans-unit id="b6a3f6afdac6873e2d261647d834c02c91376893" datatype="html">
<source>This transaction saved <x id="INTERPOLATION" equiv-text="{{ segwitGains.realizedSegwitGains * 100 | number: '1.0-0' }}"/>% on fees by using SegWit and could save <x id="INTERPOLATION_1" equiv-text="{{ segwitGains.potentialSegwitGains * 100 | number : '1.0-0' }}"/>% more by fully upgrading to native SegWit</source>
<target>Эта транзакция сэкономила <x id="INTERPOLATION" equiv-text="{{ segwitGains.realizedSegwitGains * 100 | number: '1.0-0' }}"/> % на комиссиях за счет использования SegWit и может сэкономить еще <x id="INTERPOLATION_1" equiv-text="{{ segwitGains.potentialSegwitGains * 100 | number : '1.0-0' }}"/> % за счет полного перехода на нативный SegWit.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">4</context>
@@ -4723,6 +4756,7 @@
</trans-unit>
<trans-unit id="a67530e246368aa7e5d010061fd84c3c4fe755c2" datatype="html">
<source>This transaction could save <x id="INTERPOLATION" equiv-text="{{ segwitGains.potentialSegwitGains * 100 | number : '1.0-0' }}"/>% on fees by upgrading to native SegWit or <x id="INTERPOLATION_1" equiv-text="{{ segwitGains.potentialP2shSegwitGains * 100 | number: '1.0-0' }}"/>% by upgrading to SegWit-P2SH</source>
<target>Эта транзакция могла сэкономить <x id="INTERPOLATION" equiv-text="{{ segwitGains.potentialSegwitGains * 100 | number : '1.0-0' }}"/> % на комиссиях за счет перехода на нативный SegWit или <x id="INTERPOLATION_1" equiv-text="{{ segwitGains.potentialP2shSegwitGains * 100 | number: '1.0-0' }}"/> % за счет обновления до SegWit-P2SH.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">6</context>
@@ -4731,6 +4765,7 @@
</trans-unit>
<trans-unit id="17e9c05e053cbd29d3835d8ecb19508d0f07241b" datatype="html">
<source>This transaction uses Taproot and thereby saved at least <x id="INTERPOLATION" equiv-text="{{ segwitGains.realizedTaprootGains * 100 | number: '1.0-0' }}"/>% on fees</source>
<target>Эта транзакция использует Taproot и, таким образом, сэкономила как минимум <x id="INTERPOLATION" equiv-text="{{ segwitGains.realizedTaprootGains * 100 | number: '1.0-0' }}"/> % на комиссиях.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">12</context>
@@ -4739,6 +4774,7 @@
</trans-unit>
<trans-unit id="65d5167c4947e3ad81758d238a7ac7e893c261f0" datatype="html">
<source>Taproot</source>
<target>Taproot</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">12</context>
@@ -4760,6 +4796,7 @@
</trans-unit>
<trans-unit id="47b821c7df420c96de0b22844a88c04d52628540" datatype="html">
<source>This transaction uses Taproot and already saved at least <x id="INTERPOLATION" equiv-text="{{ segwitGains.realizedTaprootGains * 100 | number: '1.0-0' }}"/>% on fees, but could save an additional <x id="INTERPOLATION_1" equiv-text="{{ segwitGains.potentialTaprootGains * 100 | number: '1.0-0' }}"/>% by fully using Taproot</source>
<target>Эта транзакция использует Taproot и уже сэкономила как минимум <x id="INTERPOLATION" equiv-text="{{ segwitGains.realizedTaprootGains * 100 | number: '1.0-0' }}"/> % на комиссиях, но может сэкономить дополнительно <x id="INTERPOLATION_1" equiv-text="{{ segwitGains.potentialTaprootGains * 100 | number: '1.0-0' }}"/> % за счет использования Taproot в полной мере.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">14</context>
@@ -4768,6 +4805,7 @@
</trans-unit>
<trans-unit id="aa31fc4d29f35b2fd36080bb6ff84be8eaab66fd" datatype="html">
<source>This transaction could save <x id="INTERPOLATION" equiv-text="{{ segwitGains.potentialTaprootGains * 100 | number: '1.0-0' }}"/>% on fees by using Taproot</source>
<target>Эта транзакция может сэкономить <x id="INTERPOLATION" equiv-text="{{ segwitGains.potentialTaprootGains * 100 | number: '1.0-0' }}"/> % на комиссиях с помощью Taproot.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">16</context>
@@ -4785,6 +4823,7 @@
</trans-unit>
<trans-unit id="07883574bb93ea23b764861f56a525bdaf907513" datatype="html">
<source>This transaction supports Replace-By-Fee (RBF) allowing fee bumping</source>
<target>Эта транзакция поддерживает функцию Replace-By-Fee (RBF), что позволяет повышать комиссию.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">25</context>
@@ -5021,6 +5060,7 @@
</trans-unit>
<trans-unit id="4ca458fe3274d1c79640b052d57cf3b900b650b6" datatype="html">
<source>Base fee</source>
<target>Базовая комиссия</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
<context context-type="linenumber">30</context>
@@ -5033,6 +5073,7 @@
</trans-unit>
<trans-unit id="6acd06bd5a3af583cd46c6d9f7954d7a2b44095e" datatype="html">
<source>mSats</source>
<target>мСат</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
<context context-type="linenumber">36</context>
@@ -5049,6 +5090,7 @@
</trans-unit>
<trans-unit id="fb2137ba0df55f21a9d6b6ad08d56d74ad852e0e" datatype="html">
<source>This channel supports zero base fee routing</source>
<target>Этот канал поддерживает маршрутизацию с нулевой базовой комиссией.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
<context context-type="linenumber">45</context>
@@ -5057,6 +5099,7 @@
</trans-unit>
<trans-unit id="3ec76ccfe1fdcbfd7ea152392f6472d93d4e8cab" datatype="html">
<source>Zero base fee</source>
<target>Нулевая базовая комиссия</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
<context context-type="linenumber">46</context>
@@ -5065,6 +5108,7 @@
</trans-unit>
<trans-unit id="b5e42e06ea8a4012a38eef209104bbd9dd1a0fc0" datatype="html">
<source>This channel does not support zero base fee routing</source>
<target>Этот канал не поддерживает маршрутизацию с нулевой базовой комиссией.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
<context context-type="linenumber">51</context>
@@ -5073,6 +5117,7 @@
</trans-unit>
<trans-unit id="09a1bc9c4198e87e9e974a51e86b181429b480d3" datatype="html">
<source>Non-zero base fee</source>
<target>Ненулевая базовая комиссия</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
<context context-type="linenumber">52</context>
@@ -5081,6 +5126,7 @@
</trans-unit>
<trans-unit id="055060668d0b9902c37abfb6168a08a36eba4496" datatype="html">
<source>Min HTLC</source>
<target>Мин. HTLC</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
<context context-type="linenumber">58</context>
@@ -5089,6 +5135,7 @@
</trans-unit>
<trans-unit id="c3d94c1a5aef6211f4a902027bd08540d7222b0d" datatype="html">
<source>Max HTLC</source>
<target>Макс. HTLC</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
<context context-type="linenumber">64</context>
@@ -5105,6 +5152,7 @@
</trans-unit>
<trans-unit id="205c1b86ac1cc419c4d0cca51fdde418c4ffdc20" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ i }}"/> channels</source>
<target> <x id="INTERPOLATION" equiv-text="{{ i }}"/> каналов</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
<context context-type="linenumber">80</context>
@@ -5117,6 +5165,7 @@
</trans-unit>
<trans-unit id="3bbd25c289760a3ba57e30df5ad5fe8977ab25a5" datatype="html">
<source>lightning channel</source>
<target>лайтнинг-канал</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-preview.component.html</context>
<context context-type="linenumber">3,5</context>
@@ -5125,6 +5174,7 @@
</trans-unit>
<trans-unit id="43c4133c7a0263d2e33dd4c2e74d40784b2e4b1c" datatype="html">
<source>Inactive</source>
<target>Неактивный</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-preview.component.html</context>
<context context-type="linenumber">10,11</context>
@@ -5141,6 +5191,7 @@
</trans-unit>
<trans-unit id="b36e1450940b7f6028d8587568c7d669b53f7a06" datatype="html">
<source>Active</source>
<target>Активный</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-preview.component.html</context>
<context context-type="linenumber">11,12</context>
@@ -5157,6 +5208,7 @@
</trans-unit>
<trans-unit id="4804b8e78964cee9e5c85f31fd982639b97780b2" datatype="html">
<source>Closed</source>
<target>Закрыт</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-preview.component.html</context>
<context context-type="linenumber">12,14</context>
@@ -5177,6 +5229,7 @@
</trans-unit>
<trans-unit id="1b051734b0ee9021991c91b3ed4e81c244322462" datatype="html">
<source>Created</source>
<target>Создан</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-preview.component.html</context>
<context context-type="linenumber">23,26</context>
@@ -5189,6 +5242,7 @@
</trans-unit>
<trans-unit id="ce9dfdc6dccb28dc75a78c704e09dc18fb02dcfa" datatype="html">
<source>Capacity</source>
<target>Объем</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-preview.component.html</context>
<context context-type="linenumber">27,28</context>
@@ -5261,6 +5315,7 @@
</trans-unit>
<trans-unit id="13142ad9637003749d667393aaae7a286d1eba5b" datatype="html">
<source>Lightning channel</source>
<target>Лайтнинг-канал</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel.component.html</context>
<context context-type="linenumber">2,5</context>
@@ -5273,6 +5328,7 @@
</trans-unit>
<trans-unit id="8dad9f60ff582b632a864f22c7466327793c3f09" datatype="html">
<source>Last update</source>
<target>Последнее обновление</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel.component.html</context>
<context context-type="linenumber">33,34</context>
@@ -5305,6 +5361,7 @@
</trans-unit>
<trans-unit id="0c134c6787c6b763446c096ea5233ace6fd9116d" datatype="html">
<source>Closing date</source>
<target>Дата закрытия</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel.component.html</context>
<context context-type="linenumber">37,38</context>
@@ -5317,6 +5374,7 @@
</trans-unit>
<trans-unit id="cdd2ea2e12437df848ec474ac15af48859bd09a0" datatype="html">
<source>Opening transaction</source>
<target>Транзакция открытия</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel.component.html</context>
<context context-type="linenumber">73,74</context>
@@ -5325,6 +5383,7 @@
</trans-unit>
<trans-unit id="50411064ac48e15659d1985b414ae91af0c8cd36" datatype="html">
<source>Closing transaction</source>
<target>Транзакция закрытия</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel.component.html</context>
<context context-type="linenumber">82,84</context>
@@ -5333,6 +5392,7 @@
</trans-unit>
<trans-unit id="6008566722612122663" datatype="html">
<source>Channel: <x id="PH" equiv-text="value.short_id"/></source>
<target>Канал: <x id="PH" equiv-text="value.short_id"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel.component.ts</context>
<context context-type="linenumber">37</context>
@@ -5348,6 +5408,7 @@
</trans-unit>
<trans-unit id="a43e63c25599408ef14b33c80dd523021b21f846" datatype="html">
<source>No channels to display</source>
<target>Нет каналов для отображения</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-list/channels-list.component.html</context>
<context context-type="linenumber">29,35</context>
@@ -5356,6 +5417,7 @@
</trans-unit>
<trans-unit id="fbaaeb297e70b9a800acf841b9d26c19d60651ef" datatype="html">
<source>Alias</source>
<target>Псевдоним</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-list/channels-list.component.html</context>
<context context-type="linenumber">35,37</context>
@@ -5392,6 +5454,7 @@
</trans-unit>
<trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1" datatype="html">
<source>Status</source>
<target>Статус</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-list/channels-list.component.html</context>
<context context-type="linenumber">37,38</context>
@@ -5400,6 +5463,7 @@
</trans-unit>
<trans-unit id="0cd107458dce99721e72971d426a5a3106074331" datatype="html">
<source>Channel ID</source>
<target>ID канала</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-list/channels-list.component.html</context>
<context context-type="linenumber">41,45</context>
@@ -5408,6 +5472,7 @@
</trans-unit>
<trans-unit id="e4b2d9e6a2ab9e6ca34027ec03beaac42b7badd4" datatype="html">
<source>sats</source>
<target>сат</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-list/channels-list.component.html</context>
<context context-type="linenumber">61,65</context>
@@ -5460,6 +5525,7 @@
</trans-unit>
<trans-unit id="ab456546aa39de3328fcfdf077f410b5ff1aa773" datatype="html">
<source>Avg Capacity</source>
<target>Средняя емкость</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">13,15</context>
@@ -5472,6 +5538,7 @@
</trans-unit>
<trans-unit id="f68705670e611f13da1a43e90f9c97d8761dd9ef" datatype="html">
<source>Avg Fee Rate</source>
<target>Средняя комиссия</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">26,28</context>
@@ -5484,6 +5551,7 @@
</trans-unit>
<trans-unit id="db1f0c0605ab0c4a904523635982253ff72eed40" datatype="html">
<source>The average fee rate charged by routing nodes, ignoring fee rates &gt; 0.5% or 5000ppm</source>
<target>Средняя комиссия, взимаемая узлами маршрутизации, без учета ставок комиссии &gt; 0,5% или 5000 ppm.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">28,30</context>
@@ -5492,6 +5560,7 @@
</trans-unit>
<trans-unit id="140fb39368f210ec945417f3eb23bf9564396e5c" datatype="html">
<source>Avg Base Fee</source>
<target>Средняя базовая комиссия</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">41,43</context>
@@ -5504,6 +5573,7 @@
</trans-unit>
<trans-unit id="0a46218f4a7b17b6445460898d75ab78e7e7979b" datatype="html">
<source>The average base fee charged by routing nodes, ignoring base fees &gt; 5000ppm</source>
<target>Средняя базовая комиссия, взимаемая узлами маршрутизации, без учета базовых комиссий &gt; 5000 ppm</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">43,45</context>
@@ -5512,6 +5582,7 @@
</trans-unit>
<trans-unit id="2e72b276a3c5cc2ec27b4c8189639ba2fe62b6cb" datatype="html">
<source>Med Capacity</source>
<target>Медианныйобъем</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">59,61</context>
@@ -5520,6 +5591,7 @@
</trans-unit>
<trans-unit id="2c1c39e28735f607d62dbf3272eb792451c265a5" datatype="html">
<source>Med Fee Rate</source>
<target>Медианная комиссия</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">72,74</context>
@@ -5528,6 +5600,7 @@
</trans-unit>
<trans-unit id="cb4dae32e1b4d6a2ba6287d9f7bd859ca7259468" datatype="html">
<source>The median fee rate charged by routing nodes, ignoring fee rates &gt; 0.5% or 5000ppm</source>
<target>Медианная комиссия, взимаемая узлами маршрутизации, без учета ставок комиссии &gt; 0,5% или 5000 ppm.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">74,76</context>
@@ -5536,6 +5609,7 @@
</trans-unit>
<trans-unit id="a541dbcef4908bf2e767e77d7a09cc62450e8e56" datatype="html">
<source>Med Base Fee</source>
<target>Медианная базовая комиссия</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">87,89</context>
@@ -5544,6 +5618,7 @@
</trans-unit>
<trans-unit id="b8539025268617abfcab1c3f2a2c60cd8d7485fb" datatype="html">
<source>The median base fee charged by routing nodes, ignoring base fees &gt; 5000ppm</source>
<target>Медианная базовая комиссия, взимаемая узлами маршрутизации, без учета базовых комиссий &gt; 5000 ppm</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">89,91</context>
@@ -5552,6 +5627,7 @@
</trans-unit>
<trans-unit id="de1c07e9943fc284461bb8fb4860faecf52a1568" datatype="html">
<source>Lightning node group</source>
<target>Группа лайтнинг-узлов </target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/group/group-preview.component.html</context>
<context context-type="linenumber">3,5</context>
@@ -5564,6 +5640,7 @@
</trans-unit>
<trans-unit id="6e2329529b1953198c7dfa0edb260554310bc636" datatype="html">
<source>Nodes</source>
<target>Узлы</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/group/group-preview.component.html</context>
<context context-type="linenumber">25,29</context>
@@ -5604,6 +5681,7 @@
</trans-unit>
<trans-unit id="14a12efce56ffe89f839e50320bcf47e4e9ca4e4" datatype="html">
<source>Liquidity</source>
<target>Ликвидность</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/group/group-preview.component.html</context>
<context context-type="linenumber">29,31</context>
@@ -5640,6 +5718,7 @@
</trans-unit>
<trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19" datatype="html">
<source>Channels</source>
<target>Каналы</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/group/group-preview.component.html</context>
<context context-type="linenumber">40,43</context>
@@ -5700,6 +5779,7 @@
</trans-unit>
<trans-unit id="e4706894b195010f6814e54bf6570c729d69aaca" datatype="html">
<source>Average size</source>
<target>Средний размер</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/group/group-preview.component.html</context>
<context context-type="linenumber">44,46</context>
@@ -5712,6 +5792,7 @@
</trans-unit>
<trans-unit id="ed31c09fd77c36238c13d83635f3fe5294c733d2" datatype="html">
<source>Location</source>
<target>Расположение</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/group/group.component.html</context>
<context context-type="linenumber">74,77</context>
@@ -5752,6 +5833,7 @@
</trans-unit>
<trans-unit id="29c05e9a540827cdfa8e3b2e5e2f27aeb478916c" datatype="html">
<source>Network Statistics</source>
<target>Статистика сети</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/lightning-dashboard/lightning-dashboard.component.html</context>
<context context-type="linenumber">10</context>
@@ -5760,6 +5842,7 @@
</trans-unit>
<trans-unit id="066e05b9a5db60850d907783fde6913e2e47cd5b" datatype="html">
<source>Channels Statistics</source>
<target>Статистика каналов</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/lightning-dashboard/lightning-dashboard.component.html</context>
<context context-type="linenumber">24</context>
@@ -5768,6 +5851,7 @@
</trans-unit>
<trans-unit id="0f33aeb084ac4d83cb0fe6f72648a8585b1b5e88" datatype="html">
<source>Lightning Network History</source>
<target>История сети Лайтнинг</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/lightning-dashboard/lightning-dashboard.component.html</context>
<context context-type="linenumber">49</context>
@@ -5776,6 +5860,7 @@
</trans-unit>
<trans-unit id="2d9883d230a47fbbb2ec969e32a186597ea27405" datatype="html">
<source>Liquidity Ranking</source>
<target>Рейтинг ликвидности</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/lightning-dashboard/lightning-dashboard.component.html</context>
<context context-type="linenumber">62</context>
@@ -5792,6 +5877,7 @@
</trans-unit>
<trans-unit id="c50bf442cf99f6fc5f8b687c460f33234b879869" datatype="html">
<source>Connectivity Ranking</source>
<target>Рейтинг соединения</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/lightning-dashboard/lightning-dashboard.component.html</context>
<context context-type="linenumber">76</context>
@@ -5804,6 +5890,7 @@
</trans-unit>
<trans-unit id="027f48063a5512e5c26b6ca88f7d7734e2d333a7" datatype="html">
<source>Percentage change past week</source>
<target>Процентное изменение за последнюю неделю</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node-statistics/node-statistics.component.html</context>
<context context-type="linenumber">5,7</context>
@@ -5820,6 +5907,7 @@
</trans-unit>
<trans-unit id="be6ebbb11d55adb8e821d503f8e10ccf43ed8b00" datatype="html">
<source>Lightning node</source>
<target>Лайтнинг-узел</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node-preview.component.html</context>
<context context-type="linenumber">3,5</context>
@@ -5836,6 +5924,7 @@
</trans-unit>
<trans-unit id="af15c87bfed273bc095ba572cf27e3aaffc33b22" datatype="html">
<source>Active capacity</source>
<target>Активная емкость</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node-preview.component.html</context>
<context context-type="linenumber">20,22</context>
@@ -5848,6 +5937,7 @@
</trans-unit>
<trans-unit id="52ffa66bd0399a49d5aa8d6f8fa077a6e8db09c0" datatype="html">
<source>Active channels</source>
<target>Активные каналы</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node-preview.component.html</context>
<context context-type="linenumber">26,30</context>
@@ -5860,6 +5950,7 @@
</trans-unit>
<trans-unit id="a43f25a9ac40e8e2441ff0be7a36b8e5d15534df" datatype="html">
<source>Country</source>
<target>Страна</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node-preview.component.html</context>
<context context-type="linenumber">44,47</context>
@@ -5868,6 +5959,7 @@
</trans-unit>
<trans-unit id="674378571ab7e72a386f27fd3281558bae821d9d" datatype="html">
<source>No node found for public key &quot;<x id="INTERPOLATION" equiv-text="{{ node.public_key | shortenString : 12}}"/>&quot;</source>
<target>Не найден узел для открытого ключа &amp;quot; <x id="INTERPOLATION" equiv-text="{{ node.public_key | shortenString : 12}}"/> &amp;quot;</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
<context context-type="linenumber">17,19</context>
@@ -5876,6 +5968,7 @@
</trans-unit>
<trans-unit id="43b48b9c15083a164b401bf3775a4b99f3917699" datatype="html">
<source>Average channel size</source>
<target>Средний размер канала</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
<context context-type="linenumber">40,43</context>
@@ -5884,6 +5977,7 @@
</trans-unit>
<trans-unit id="e5d8bb389c702588877f039d72178f219453a72d" datatype="html">
<source>Unknown</source>
<target>Неизвестно</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
<context context-type="linenumber">52,56</context>
@@ -5904,6 +5998,7 @@
</trans-unit>
<trans-unit id="8fa4d523f7b91df4390120b85ed0406138273e1a" datatype="html">
<source>Color</source>
<target>Цвет</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
<context context-type="linenumber">75,77</context>
@@ -5912,6 +6007,7 @@
</trans-unit>
<trans-unit id="5b9904cb31f6f28314443f6385dc5facab7ea851" datatype="html">
<source>ISP</source>
<target>Интернет-провайдер</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
<context context-type="linenumber">82,83</context>
@@ -5924,6 +6020,7 @@
</trans-unit>
<trans-unit id="86d9619247d148019e5599707c39a36e880a2d23" datatype="html">
<source>Exclusively on Tor</source>
<target>Исключительно Tor</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
<context context-type="linenumber">88,90</context>
@@ -5932,6 +6029,7 @@
</trans-unit>
<trans-unit id="b371db1a7ab2167dc8dd91b48ea929d71bb4ef4c" datatype="html">
<source>Open channels</source>
<target>Открытые каналы</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
<context context-type="linenumber">145,148</context>
@@ -5940,6 +6038,7 @@
</trans-unit>
<trans-unit id="a2dff531c3d7477178553f579e0ec7c3ac7a6f30" datatype="html">
<source>Closed channels</source>
<target>Закрытые каналы</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
<context context-type="linenumber">149,152</context>
@@ -5948,6 +6047,7 @@
</trans-unit>
<trans-unit id="2519445964020754921" datatype="html">
<source>Node: <x id="PH" equiv-text="node.alias"/></source>
<target>Узел: <x id="PH" equiv-text="node.alias"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.ts</context>
<context context-type="linenumber">42</context>
@@ -5955,6 +6055,7 @@
</trans-unit>
<trans-unit id="7cac1c3013423d82d5149a5854d709bd08411430" datatype="html">
<source>(Tor nodes excluded)</source>
<target>(узлы Tor исключены)</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-channels-map/nodes-channels-map.component.html</context>
<context context-type="linenumber">8,11</context>
@@ -5975,6 +6076,7 @@
</trans-unit>
<trans-unit id="8199511328474154549" datatype="html">
<source>Lightning Nodes Channels World Map</source>
<target>Мировая карта каналов лайтнинг-узлов</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts</context>
<context context-type="linenumber">69</context>
@@ -5982,6 +6084,7 @@
</trans-unit>
<trans-unit id="4390631969351833104" datatype="html">
<source>No geolocation data available</source>
<target>Данные геолокации недоступны</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts</context>
<context context-type="linenumber">218,213</context>
@@ -5989,6 +6092,7 @@
</trans-unit>
<trans-unit id="a4d393ee035f4225083c22cc3909b26a05a87528" datatype="html">
<source>Active channels map</source>
<target>Карта активных каналов</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-channels/node-channels.component.html</context>
<context context-type="linenumber">2,3</context>
@@ -5997,6 +6101,7 @@
</trans-unit>
<trans-unit id="4635698809727522638" datatype="html">
<source>Indexing in progess</source>
<target>Индексирование в процессе</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts</context>
<context context-type="linenumber">121,116</context>
@@ -6008,6 +6113,7 @@
</trans-unit>
<trans-unit id="1055322764280599360" datatype="html">
<source>Reachable on Clearnet Only</source>
<target>Доступно только в Clearnet</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts</context>
<context context-type="linenumber">164,161</context>
@@ -6019,6 +6125,7 @@
</trans-unit>
<trans-unit id="2760682261176173881" datatype="html">
<source>Reachable on Clearnet and Darknet</source>
<target>Доступно в Clearnet и Darknet</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts</context>
<context context-type="linenumber">185,182</context>
@@ -6030,6 +6137,7 @@
</trans-unit>
<trans-unit id="1191036460161514668" datatype="html">
<source>Reachable on Darknet Only</source>
<target>Доступно только в Darknet</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts</context>
<context context-type="linenumber">206,203</context>
@@ -6041,6 +6149,7 @@
</trans-unit>
<trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9" datatype="html">
<source>Share</source>
<target>Поделиться</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html</context>
<context context-type="linenumber">29,31</context>
@@ -6053,6 +6162,7 @@
</trans-unit>
<trans-unit id="5222540403093176126" datatype="html">
<source><x id="PH" equiv-text="country.count.toString()"/> nodes</source>
<target> узлы <x id="PH" equiv-text="country.count.toString()"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts</context>
<context context-type="linenumber">103,102</context>
@@ -6068,6 +6178,7 @@
</trans-unit>
<trans-unit id="7032954508645880700" datatype="html">
<source><x id="PH" equiv-text="this.amountShortenerPipe.transform(country.capacity / 100000000, 2)"/> BTC capacity</source>
<target> <x id="PH" equiv-text="this.amountShortenerPipe.transform(country.capacity / 100000000, 2)"/> Емкость BTC</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts</context>
<context context-type="linenumber">104,102</context>
@@ -6075,6 +6186,7 @@
</trans-unit>
<trans-unit id="7ede3edfacd291eb9db08e11845d9efdf197f417" datatype="html">
<source>Lightning nodes in <x id="INTERPOLATION" equiv-text="{{ country?.name }}"/></source>
<target>лайтнинг-злы в <x id="INTERPOLATION" equiv-text="{{ country?.name }}"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country/nodes-per-country.component.html</context>
<context context-type="linenumber">3,4</context>
@@ -6083,6 +6195,7 @@
</trans-unit>
<trans-unit id="4498ec29c37744fef46809ebc3db67c5fb789917" datatype="html">
<source>ISP Count</source>
<target>Количество интернет-провайдеров</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country/nodes-per-country.component.html</context>
<context context-type="linenumber">34,38</context>
@@ -6091,6 +6204,7 @@
</trans-unit>
<trans-unit id="90a6a964ba53464578003e3b4b2873ef5d2132a1" datatype="html">
<source>Top ISP</source>
<target>Топ интернет-провайдеры</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country/nodes-per-country.component.html</context>
<context context-type="linenumber">38,40</context>
@@ -6099,6 +6213,7 @@
</trans-unit>
<trans-unit id="7246059109648045954" datatype="html">
<source>Lightning nodes in <x id="PH" equiv-text="response.country.en"/></source>
<target>лайтнинг-узлы в <x id="PH" equiv-text="response.country.en"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country/nodes-per-country.component.ts</context>
<context context-type="linenumber">35</context>
@@ -6106,6 +6221,7 @@
</trans-unit>
<trans-unit id="6b4442323c695a8211357c7e4486dd620c443822" datatype="html">
<source>Clearnet Capacity</source>
<target>Емкость Clearnet</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html</context>
<context context-type="linenumber">6,8</context>
@@ -6118,6 +6234,7 @@
</trans-unit>
<trans-unit id="ccabb31683868066778a1d664aa53ee9fcf77d6b" datatype="html">
<source>How much liquidity is running on nodes advertising at least one clearnet IP address</source>
<target>Сколько ликвидности в узлах, сообщающих хотя бы один IP-адрес на Clearnet</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html</context>
<context context-type="linenumber">8,9</context>
@@ -6126,6 +6243,7 @@
</trans-unit>
<trans-unit id="462d2233ddacc9869eb28e09b3b12f1d85556937" datatype="html">
<source>Unknown Capacity</source>
<target>Емкость неизвестна</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html</context>
<context context-type="linenumber">13,15</context>
@@ -6138,6 +6256,7 @@
</trans-unit>
<trans-unit id="26fb07e8754b87bba4bf12c5137ffa77dac389a8" datatype="html">
<source>How much liquidity is running on nodes which ISP was not identifiable</source>
<target>Сколько ликвидности в узлах, интернет-провайдер которых не удалось идентифицировать</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html</context>
<context context-type="linenumber">15,16</context>
@@ -6146,6 +6265,7 @@
</trans-unit>
<trans-unit id="df3728b721159d25e68f5daf44aaab7fa25f1415" datatype="html">
<source>Tor Capacity</source>
<target>Емкость Tor</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html</context>
<context context-type="linenumber">20,22</context>
@@ -6158,6 +6278,7 @@
</trans-unit>
<trans-unit id="23549ef4e1f846f06abcf07ceecb115945a0cf61" datatype="html">
<source>How much liquidity is running on nodes advertising only Tor addresses</source>
<target>Сколько ликвидности в узлах, сообщающих только адреса Tor</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html</context>
<context context-type="linenumber">22,23</context>
@@ -6166,6 +6287,7 @@
</trans-unit>
<trans-unit id="e008f2a76179fdcd7110b41ca624131f91075949" datatype="html">
<source>Top 100 ISPs hosting LN nodes</source>
<target>Топ-100 интернет-провайдеров, размещающих узлы LN</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html</context>
<context context-type="linenumber">31,33</context>
@@ -6174,6 +6296,7 @@
</trans-unit>
<trans-unit id="3627306100664959238" datatype="html">
<source><x id="PH" equiv-text="this.amountShortenerPipe.transform(isp[2] / 100000000, 2)"/> BTC</source>
<target> <x id="PH" equiv-text="this.amountShortenerPipe.transform(isp[2] / 100000000, 2)"/> BTC</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts</context>
<context context-type="linenumber">158,156</context>
@@ -6185,6 +6308,7 @@
</trans-unit>
<trans-unit id="c18497e4f0db0d0ad0c71ba294295f42b3d312c9" datatype="html">
<source>Lightning ISP</source>
<target>Лайтнинг интернет-провайдер</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html</context>
<context context-type="linenumber">3,5</context>
@@ -6193,6 +6317,7 @@
</trans-unit>
<trans-unit id="41074627e075a9b1bd8197c474ea68a2b8276e54" datatype="html">
<source>Top country</source>
<target>Топ страна</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html</context>
<context context-type="linenumber">39,41</context>
@@ -6205,6 +6330,7 @@
</trans-unit>
<trans-unit id="5fad6872a652d922ad8822f4016e104b9a8cc113" datatype="html">
<source>Top node</source>
<target>Топ узел</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html</context>
<context context-type="linenumber">45,48</context>
@@ -6213,6 +6339,7 @@
</trans-unit>
<trans-unit id="5735693498020397727" datatype="html">
<source>Lightning nodes on ISP: <x id="PH" equiv-text="response.isp"/> [AS<x id="PH_1" equiv-text="this.route.snapshot.params.isp"/>]</source>
<target>Лайтнинг-узлы у провайдера: <x id="PH" equiv-text="response.isp"/> [AS <x id="PH_1" equiv-text="this.route.snapshot.params.isp"/>]</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.ts</context>
<context context-type="linenumber">44</context>
@@ -6224,6 +6351,7 @@
</trans-unit>
<trans-unit id="d82f436f033a7d81680b8430275f94dda530151c" datatype="html">
<source>Lightning nodes on ISP: <x id="INTERPOLATION" equiv-text="{{ isp?.name }}"/></source>
<target>Лайтнинг-узлы у провайдера: <x id="INTERPOLATION" equiv-text="{{ isp?.name }}"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp/nodes-per-isp.component.html</context>
<context context-type="linenumber">2,4</context>
@@ -6232,6 +6360,7 @@
</trans-unit>
<trans-unit id="ca0b795795658155d44ddca02e95f1feeeb4a88f" datatype="html">
<source>ASN</source>
<target>ASN</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp/nodes-per-isp.component.html</context>
<context context-type="linenumber">11,14</context>
@@ -6240,6 +6369,7 @@
</trans-unit>
<trans-unit id="5b727d251b06e9959cf24a90250a480d425339de" datatype="html">
<source>Top 100 oldest lightning nodes</source>
<target>Топ-100 самых старых узлов Lightning</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-ranking/oldest-nodes/oldest-nodes.component.html</context>
<context context-type="linenumber">3,7</context>
@@ -6248,6 +6378,7 @@
</trans-unit>
<trans-unit id="4157312397261844620" datatype="html">
<source>Oldest lightning nodes</source>
<target>Самые старые лайтнинг-узлы</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-ranking/oldest-nodes/oldest-nodes.component.ts</context>
<context context-type="linenumber">27</context>
@@ -6255,6 +6386,7 @@
</trans-unit>
<trans-unit id="71bb1ed9da9ebb92cf35925bc6fe0a8fbc325625" datatype="html">
<source>Top 100 nodes liquidity ranking</source>
<target>Топ-100 узлов по ликвидности</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html</context>
<context context-type="linenumber">3,7</context>
@@ -6263,6 +6395,7 @@
</trans-unit>
<trans-unit id="99786bd2106b708e4514d0121964affb19bee636" datatype="html">
<source>Top 100 nodes connectivity ranking</source>
<target>Топ-100 узлов по подключению</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html</context>
<context context-type="linenumber">3,7</context>
@@ -6271,6 +6404,7 @@
</trans-unit>
<trans-unit id="47a30fc5a836252f8fe03e2949756b150684d934" datatype="html">
<source>Oldest nodes</source>
<target>Самые старые узлы</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html</context>
<context context-type="linenumber">36</context>
@@ -6279,6 +6413,7 @@
</trans-unit>
<trans-unit id="4034215342842066505" datatype="html">
<source>Top lightning nodes</source>
<target>Топ лайтнинг-узлы</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.ts</context>
<context context-type="linenumber">22</context>
@@ -6286,6 +6421,7 @@
</trans-unit>
<trans-unit id="af1176facd00a0580509fb2900ab0cf7f9b39ae7" datatype="html">
<source>Indexing in progress</source>
<target>Выполняется индексирование</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/statistics-chart/lightning-statistics-chart.component.html</context>
<context context-type="linenumber">52,55</context>

View File

@@ -115,10 +115,38 @@ body {
}
.form-control {
color: #495057;
color: #fff;
background-color: #2d3348;
border: 1px solid rgba(17, 19, 31, 0.2);
}
.form-control:focus {
color: #000;
color: #fff;
background-color: #2d3348;
}
.btn-purple {
background-color: #653b9c;
border-color: #653b9c;
}
.btn-purple:not(:disabled):not(.disabled):active, .btn-purple:not(:disabled):not(.disabled).active, .show > .btn-purple.dropdown-toggle {
color: #fff;
background-color: #4d2d77;
border-color: #472a6e;
}
.btn-purple:focus, .btn-purple.focus {
color: #fff;
background-color: #533180;
border-color: #4d2d77;
box-shadow: 0 0 0 0.2rem rgb(124 88 171 / 50%);
}
.btn-purple:hover {
color: #fff;
background-color: #533180;
border-color: #4d2d77;
}
.form-control.form-control-secondary {