Merge branch 'master' into subnet-navigation
This commit is contained in:
		
						commit
						d3b3c7df21
					
				@ -22,7 +22,7 @@
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "ng": "./node_modules/@angular/cli/bin/ng.js",
 | 
			
		||||
    "tsc": "./node_modules/typescript/bin/tsc",
 | 
			
		||||
    "i18n-extract-from-source": "./node_modules/@angular/cli/bin/ng extract-i18n --out-file ./src/locale/messages.xlf",
 | 
			
		||||
    "i18n-extract-from-source": "npm run ng -- extract-i18n --out-file ./src/locale/messages.xlf",
 | 
			
		||||
    "i18n-pull-from-transifex": "tx pull -a --parallel --minimum-perc 1 --force",
 | 
			
		||||
    "serve": "npm run generate-config && npm run ng -- serve -c local",
 | 
			
		||||
    "serve:stg": "npm run generate-config && npm run ng -- serve -c staging",
 | 
			
		||||
 | 
			
		||||
@ -31,17 +31,17 @@
 | 
			
		||||
    <button class="btn btn-primary w-100" id="dropdownBasic1" ngbDropdownToggle i18n="lightning">Lightning</button>
 | 
			
		||||
    <div ngbDropdownMenu aria-labelledby="dropdownBasic1">
 | 
			
		||||
      <a class="dropdown-item" routerLinkActive="active" [routerLink]="['/graphs/lightning/nodes-networks' | relativeUrl]"
 | 
			
		||||
        i18n="lightning.nodes-networks">Lightning nodes per network</a>
 | 
			
		||||
        i18n="lightning.nodes-networks">Lightning Nodes Per Network</a>
 | 
			
		||||
      <a class="dropdown-item" routerLinkActive="active" [routerLink]="['/graphs/lightning/capacity' | relativeUrl]"
 | 
			
		||||
        i18n="lightning.capacity">Network capacity</a>
 | 
			
		||||
        i18n="lightning.network-capacity">Lightning Network Capacity</a>
 | 
			
		||||
      <a class="dropdown-item" routerLinkActive="active" [routerLink]="['/graphs/lightning/nodes-per-isp' | relativeUrl]"
 | 
			
		||||
        i18n="lightning.nodes-per-isp">Lightning nodes per ISP</a>
 | 
			
		||||
        i18n="lightning.nodes-per-isp">Lightning Nodes Per ISP</a>
 | 
			
		||||
      <a class="dropdown-item" routerLinkActive="active" [routerLink]="['/graphs/lightning/nodes-per-country' | relativeUrl]"
 | 
			
		||||
        i18n="lightning.nodes-per-country">Lightning nodes per country</a>
 | 
			
		||||
        i18n="lightning.nodes-per-country">Lightning Nodes Per Country</a>
 | 
			
		||||
      <a class="dropdown-item" routerLinkActive="active" [routerLink]="['/graphs/lightning/nodes-map' | relativeUrl]"
 | 
			
		||||
        i18n="lightning.lightning.nodes-heatmap">Lightning nodes world map</a>
 | 
			
		||||
        i18n="lightning.lightning.nodes-heatmap">Lightning Nodes World Map</a>
 | 
			
		||||
      <a class="dropdown-item" routerLinkActive="active" [routerLink]="['/graphs/lightning/nodes-channels-map' | relativeUrl]"
 | 
			
		||||
        i18n="lightning.nodes-channels-world-map">Lightning nodes channels world map</a>
 | 
			
		||||
        i18n="lightning.nodes-channels-world-map">Lightning Nodes Channels World Map</a>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
@ -24,7 +24,7 @@
 | 
			
		||||
      </ng-template>
 | 
			
		||||
    </span>
 | 
			
		||||
    <span class="field col-sm-4 text-center"><ng-container *ngIf="transactionTime > 0">‎{{ transactionTime * 1000 | date:'yyyy-MM-dd HH:mm' }}</ng-container></span>
 | 
			
		||||
    <span class="field col-sm-4 text-right"><span class="label" i18n="transaction.fee|Transaction fee">Fee </span>{{ tx.fee | number }} <span class="symbol" i18n="shared.sat|sat">sat</span></span>
 | 
			
		||||
    <span class="field col-sm-4 text-right"><span class="label" i18n="transaction.fee|Transaction fee">Fee</span> {{ tx.fee | number }} <span class="symbol" i18n="shared.sat|sat">sat</span></span>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.container-buttons {
 | 
			
		||||
  align-self: flex-start;
 | 
			
		||||
  align-self: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.title-block {
 | 
			
		||||
 | 
			
		||||
@ -42,7 +42,7 @@
 | 
			
		||||
        <ng-container [ngSwitch]="line.type">
 | 
			
		||||
          <span *ngSwitchCase="'input'" i18n="transaction.input">Input</span>
 | 
			
		||||
          <span *ngSwitchCase="'output'" i18n="transaction.output">Output</span>
 | 
			
		||||
          <span *ngSwitchCase="'fee'" i18n="transaction.fee">Fee</span>
 | 
			
		||||
          <span *ngSwitchCase="'fee'" i18n="transaction.fee|Transaction fee">Fee</span>
 | 
			
		||||
        </ng-container>
 | 
			
		||||
        <span *ngIf="line.type !== 'fee'"> #{{ line.index + 1 }}</span>
 | 
			
		||||
      </p>
 | 
			
		||||
 | 
			
		||||
@ -123,7 +123,7 @@
 | 
			
		||||
              <th class="table-cell-txid" i18n="dashboard.latest-transactions.txid">TXID</th>
 | 
			
		||||
              <th class="table-cell-satoshis" i18n="dashboard.latest-transactions.amount">Amount</th>
 | 
			
		||||
              <th class="table-cell-fiat" *ngIf="(network$ | async) === ''" i18n="dashboard.latest-transactions.USD">USD</th>
 | 
			
		||||
              <th class="table-cell-fees" i18n="dashboard.latest-transactions.fee">Fee</th>
 | 
			
		||||
              <th class="table-cell-fees" i18n="transaction.fee|Transaction fee">Fee</th>
 | 
			
		||||
            </thead>
 | 
			
		||||
            <tbody>
 | 
			
		||||
              <tr *ngFor="let transaction of transactions$ | async; let i = index;">
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,7 @@
 | 
			
		||||
    <app-clipboard [text]="channel.public_key"></app-clipboard>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div class="box-right">
 | 
			
		||||
    <div class="second-line">{{ channel.channels }} channels</div>
 | 
			
		||||
    <div class="second-line"><ng-container *ngTemplateOutlet="xChannels; context: {$implicit: channel.channels }"></ng-container></div>
 | 
			
		||||
    <div class="second-line"><app-amount [satoshis]="channel.capacity" digitsInfo="1.2-2"></app-amount></div>
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
@ -16,7 +16,7 @@
 | 
			
		||||
  <table class="table table-borderless table-striped">
 | 
			
		||||
    <tbody>
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td i18n="lightning.fee-rate">Fee rate</td>
 | 
			
		||||
        <td i18n="transaction.fee-rate|Transaction fee rate">Fee rate</td>
 | 
			
		||||
        <td>
 | 
			
		||||
          <span class="d-inline-block d-md-none">
 | 
			
		||||
            {{ channel.fee_rate !== null ? (channel.fee_rate | amountShortener : 2 : undefined : true) : '-' }} <span class="symbol">ppm {{ channel.fee_rate !== null ? '(' + (channel.fee_rate / 10000 | amountShortener : 2 : undefined : true) + '%)' : '' }}</span>
 | 
			
		||||
@ -33,19 +33,24 @@
 | 
			
		||||
            <span>
 | 
			
		||||
              <span *ngIf="channel.base_fee_mtokens !== null">
 | 
			
		||||
                {{ channel.base_fee_mtokens | amountShortener : 0 }}
 | 
			
		||||
                <span class="symbol">msats</span>
 | 
			
		||||
                <span class="symbol" i18n="shared.m-sats">mSats</span>
 | 
			
		||||
              </span>
 | 
			
		||||
              <span *ngIf="channel.base_fee_mtokens === null">
 | 
			
		||||
                -
 | 
			
		||||
              </span>
 | 
			
		||||
            </span>
 | 
			
		||||
            <span *ngIf="channel.base_fee_mtokens !== null" class="badge" [class]="channel.base_fee_mtokens === 0 ? 'badge-success' : 'badge-danger'"
 | 
			
		||||
              i18n-ngbTooltip="lightning.zero-base-fee"
 | 
			
		||||
              [ngbTooltip]="channel.base_fee_mtokens === 0 ? 'This channel supports zero base fee routing' :
 | 
			
		||||
                'This channel does not support zero base fee routing'"
 | 
			
		||||
              placement="bottom" i18n="lightning.zerobasefee">
 | 
			
		||||
              {{ channel.base_fee_mtokens === 0 ? 'Zero base fee' : 'Non-zero base fee' }}
 | 
			
		||||
            </span>
 | 
			
		||||
            <ng-template [ngIf]="channel.base_fee_mtokens !== null">
 | 
			
		||||
              <span class="badge badge-success" *ngIf="channel.base_fee_mtokens === 0; else nonZeroBaseFee"
 | 
			
		||||
                i18n-ngbTooltip="lightning.zero-base-fee-tooltip"
 | 
			
		||||
                ngbTooltip="This channel supports zero base fee routing"
 | 
			
		||||
                placement="bottom" i18n="lightning.zero-base-fee">Zero base fee</span>
 | 
			
		||||
            </ng-template>
 | 
			
		||||
            <ng-template #nonZeroBaseFee>
 | 
			
		||||
              <span class="badge badge-danger"
 | 
			
		||||
                i18n-ngbTooltip="lightning.non-zero-base-fee-tooltip"
 | 
			
		||||
                ngbTooltip="This channel does not support zero base fee routing"
 | 
			
		||||
                placement="bottom" i18n="lightning.non-zero-base-fee">Non-zero base fee</span>
 | 
			
		||||
            </ng-template>
 | 
			
		||||
          </span>
 | 
			
		||||
        </td>
 | 
			
		||||
      </tr>
 | 
			
		||||
@ -62,7 +67,7 @@
 | 
			
		||||
        </td>
 | 
			
		||||
      </tr>
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td i18n="lightning.timelock-detla">Timelock delta</td>
 | 
			
		||||
        <td i18n="lightning.timelock-delta">Timelock delta</td>
 | 
			
		||||
        <td>
 | 
			
		||||
          <ng-container *ngTemplateOutlet="blocksPlural; context: {$implicit: channel.cltv_delta ?? '-' }"></ng-container>
 | 
			
		||||
        </td>
 | 
			
		||||
@ -72,3 +77,4 @@
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<ng-template #blocksPlural let-i i18n="shared.blocks">{{ i }} <span class="shared-block">blocks</span></ng-template>
 | 
			
		||||
<ng-template #xChannels let-i i18n="lightning.x-channels">{{ i }} channels</ng-template>
 | 
			
		||||
 | 
			
		||||
@ -7,9 +7,9 @@
 | 
			
		||||
      <h1 class="title">{{ channel.short_id }}</h1>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="badges mb-2">
 | 
			
		||||
      <span class="badge rounded-pill badge-secondary" *ngIf="channel.status === 0">Inactive</span>
 | 
			
		||||
      <span class="badge rounded-pill badge-success" *ngIf="channel.status === 1">Active</span>
 | 
			
		||||
      <span class="badge rounded-pill badge-danger" *ngIf="channel.status === 2">Closed</span>
 | 
			
		||||
      <span class="badge rounded-pill badge-secondary" *ngIf="channel.status === 0" i18n="status.inactive">Inactive</span>
 | 
			
		||||
      <span class="badge rounded-pill badge-success" *ngIf="channel.status === 1" i18n="status.active">Active</span>
 | 
			
		||||
      <span class="badge rounded-pill badge-danger" *ngIf="channel.status === 2" i18n="status.closed">Closed</span>
 | 
			
		||||
 | 
			
		||||
      <app-closing-type [type]="channel.closing_reason" *ngIf="channel.status === 2"></app-closing-type>
 | 
			
		||||
    </div>
 | 
			
		||||
@ -20,20 +20,20 @@
 | 
			
		||||
      <table class="table table-borderless table-striped">
 | 
			
		||||
        <tbody>
 | 
			
		||||
          <tr>
 | 
			
		||||
            <td i18n="channel.created">Created</td>
 | 
			
		||||
            <td i18n="lightning.created">Created</td>
 | 
			
		||||
            <td>{{ channel.created | date:'yyyy-MM-dd HH:mm' }}</td>
 | 
			
		||||
          </tr>
 | 
			
		||||
          <tr>
 | 
			
		||||
            <td i18n="channel.capacity">Capacity</td>
 | 
			
		||||
            <td i18n="lightning.capacity">Capacity</td>
 | 
			
		||||
            <td><app-amount [satoshis]="channel.capacity" [noFiat]="true"></app-amount></td>
 | 
			
		||||
          </tr>
 | 
			
		||||
          <tr>
 | 
			
		||||
            <td i18n="channel.fee-rate">Fee rate</td>
 | 
			
		||||
            <td i18n="transaction.fee-rate|Transaction fee rate">Fee rate</td>
 | 
			
		||||
            <td>
 | 
			
		||||
              <div class="dual-cell">
 | 
			
		||||
                <span>{{ channel.node_left.fee_rate }} <span class="symbol">ppm</span></span>
 | 
			
		||||
                <span>{{ channel.node_left.fee_rate }} <span class="symbol" i18n="lightning.ppm">ppm</span></span>
 | 
			
		||||
                <fa-icon class="between-arrow" [icon]="['fas', 'arrow-right-arrow-left']" [fixedWidth]="true"></fa-icon>
 | 
			
		||||
                <span>{{ channel.node_right.fee_rate }} <span class="symbol">ppm</span></span>
 | 
			
		||||
                <span>{{ channel.node_right.fee_rate }} <span class="symbol" i18n="lightning.ppm">ppm</span></span>
 | 
			
		||||
              </div>
 | 
			
		||||
            </td>
 | 
			
		||||
          </tr>
 | 
			
		||||
 | 
			
		||||
@ -8,9 +8,9 @@
 | 
			
		||||
    </span>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div class="badges mb-2">
 | 
			
		||||
    <span class="badge rounded-pill badge-secondary" *ngIf="channel.status === 0">Inactive</span>
 | 
			
		||||
    <span class="badge rounded-pill badge-success" *ngIf="channel.status === 1">Active</span>
 | 
			
		||||
    <span class="badge rounded-pill badge-danger" *ngIf="channel.status === 2">Closed</span>
 | 
			
		||||
    <span class="badge rounded-pill badge-secondary" *ngIf="channel.status === 0" i18n="status.inactive">Inactive</span>
 | 
			
		||||
    <span class="badge rounded-pill badge-success" *ngIf="channel.status === 1" i18n="status.active">Active</span>
 | 
			
		||||
    <span class="badge rounded-pill badge-danger" *ngIf="channel.status === 2" i18n="status.closed">Closed</span>
 | 
			
		||||
    <app-closing-type *ngIf="channel.closing_reason" [type]="channel.closing_reason"></app-closing-type>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
@ -45,7 +45,7 @@
 | 
			
		||||
          <table class="table table-borderless table-striped">
 | 
			
		||||
            <tbody>
 | 
			
		||||
              <tr>
 | 
			
		||||
                <td i18n="address.total-received">Capacity</td>
 | 
			
		||||
                <td i18n="lightning.capacity">Capacity</td>
 | 
			
		||||
                <td><app-sats [satoshis]="channel.capacity"></app-sats><app-fiat [value]="channel.capacity" digitsInfo="1.0-0"></app-fiat></td>
 | 
			
		||||
              </tr>
 | 
			
		||||
            </tbody>
 | 
			
		||||
@ -70,7 +70,7 @@
 | 
			
		||||
  <ng-container *ngIf="transactions$ | async as transactions">
 | 
			
		||||
    <ng-template [ngIf]="transactions[0]">
 | 
			
		||||
      <div class="d-flex">
 | 
			
		||||
        <h3>Opening transaction</h3>
 | 
			
		||||
        <h3 i18n="lightning.opening-transaction">Opening transaction</h3>
 | 
			
		||||
        <button type="button" class="btn btn-outline-info details-button btn-sm" (click)="txList1.toggleDetails()"
 | 
			
		||||
          i18n="transaction.details|Transaction Details">Details</button>
 | 
			
		||||
      </div>
 | 
			
		||||
@ -79,7 +79,7 @@
 | 
			
		||||
    </ng-template>
 | 
			
		||||
    <ng-template [ngIf]="transactions[1]">
 | 
			
		||||
      <div class="closing-header d-flex">
 | 
			
		||||
        <h3 style="margin: 0;">Closing transaction</h3>  <app-closing-type [type]="channel.closing_reason">
 | 
			
		||||
        <h3 style="margin: 0;" i18n="lightning.closing-transaction">Closing transaction</h3>  <app-closing-type [type]="channel.closing_reason">
 | 
			
		||||
        </app-closing-type>
 | 
			
		||||
        <button type="button" class="btn btn-outline-info details-button btn-sm" (click)="txList2.toggleDetails()"
 | 
			
		||||
          i18n="transaction.details|Transaction Details">Details</button>
 | 
			
		||||
 | 
			
		||||
@ -34,7 +34,7 @@ export class ChannelComponent implements OnInit {
 | 
			
		||||
          return this.lightningApiService.getChannel$(params.get('short_id'))
 | 
			
		||||
            .pipe(
 | 
			
		||||
              tap((value) => {
 | 
			
		||||
                this.seoService.setTitle(`Channel: ${value.short_id}`);
 | 
			
		||||
                this.seoService.setTitle($localize`Channel: ${value.short_id}`);
 | 
			
		||||
              }),
 | 
			
		||||
              catchError((err) => {
 | 
			
		||||
                this.error = err;
 | 
			
		||||
 | 
			
		||||
@ -2,10 +2,10 @@
 | 
			
		||||
  <form [formGroup]="channelStatusForm" class="formRadioGroup">
 | 
			
		||||
    <div class="btn-group btn-group-toggle" ngbRadioGroup name="radioBasic" formControlName="status">
 | 
			
		||||
      <label ngbButtonLabel class="btn-primary btn-sm">
 | 
			
		||||
        <input ngbButton type="radio" [value]="'open'" fragment="open" i18n="open">Open
 | 
			
		||||
        <input ngbButton type="radio" [value]="'open'" fragment="open"><span i18n="open">Open</span>
 | 
			
		||||
      </label>
 | 
			
		||||
      <label ngbButtonLabel class="btn-primary btn-sm">
 | 
			
		||||
        <input ngbButton type="radio" [value]="'closed'" fragment="closed" i18n="closed">Closed
 | 
			
		||||
        <input ngbButton type="radio" [value]="'closed'" fragment="closed"><span i18n="closed">Closed</span>
 | 
			
		||||
      </label>
 | 
			
		||||
    </div>
 | 
			
		||||
  </form>
 | 
			
		||||
@ -32,12 +32,12 @@
 | 
			
		||||
  
 | 
			
		||||
<ng-template #tableHeader>
 | 
			
		||||
  <thead>
 | 
			
		||||
    <th class="alias text-left" i18n="nodes.alias">Node Alias</th>
 | 
			
		||||
    <th class="alias text-left d-none d-md-table-cell" i18n="channels.transaction"> </th>
 | 
			
		||||
    <th class="alias text-left" i18n="lightning.alias">Alias</th>
 | 
			
		||||
    <th class="alias text-left d-none d-md-table-cell"> </th>
 | 
			
		||||
    <th class="alias text-left d-none d-md-table-cell" i18n="status">Status</th>
 | 
			
		||||
    <th *ngIf="status !== 'closed'" class="channels text-left d-none d-md-table-cell" i18n="channels.rate">Fee Rate</th>
 | 
			
		||||
    <th *ngIf="status !== 'closed'" class="channels text-left d-none d-md-table-cell" i18n="transaction.fee-rate|Transaction fee rate">Fee rate</th>
 | 
			
		||||
    <th *ngIf="status === 'closed'" class="channels text-left d-none d-md-table-cell" i18n="channels.closing_date">Closing date</th>
 | 
			
		||||
    <th class="capacity text-right d-none d-md-table-cell" i18n="nodes.capacity">Capacity</th>
 | 
			
		||||
    <th class="capacity text-right d-none d-md-table-cell" i18n="lightning.capacity">Capacity</th>
 | 
			
		||||
    <th class="capacity text-right" i18n="channels.id">Channel ID</th>
 | 
			
		||||
  </thead>
 | 
			
		||||
</ng-template>
 | 
			
		||||
@ -53,7 +53,7 @@
 | 
			
		||||
    </div>
 | 
			
		||||
  </td>
 | 
			
		||||
  <td class="alias text-left d-none d-md-table-cell">
 | 
			
		||||
    <div class="second-line">{{ node.channels }} channels</div>
 | 
			
		||||
    <div class="second-line"><ng-container *ngTemplateOutlet="xChannels; context: {$implicit: node.channels }"></ng-container></div>
 | 
			
		||||
    <div class="second-line">
 | 
			
		||||
      <app-amount *ngIf="node.capacity > 100000000; else smallnode" [satoshis]="node.capacity" [digitsInfo]="'1.2-2'" [noFiat]="true"></app-amount>
 | 
			
		||||
      <ng-template #smallnode>
 | 
			
		||||
@ -63,10 +63,10 @@
 | 
			
		||||
    </div>
 | 
			
		||||
  </td>
 | 
			
		||||
  <td class="d-none d-md-table-cell">
 | 
			
		||||
    <span class="badge rounded-pill badge-secondary" *ngIf="channel.status === 0" i18n="lightning.inactive">Inactive</span>
 | 
			
		||||
    <span class="badge rounded-pill badge-success" *ngIf="channel.status === 1" i18n="lightning.active">Active</span>
 | 
			
		||||
    <span class="badge rounded-pill badge-secondary" *ngIf="channel.status === 0" i18n="status.inactive">Inactive</span>
 | 
			
		||||
    <span class="badge rounded-pill badge-success" *ngIf="channel.status === 1" i18n="status.active">Active</span>
 | 
			
		||||
    <ng-template [ngIf]="channel.status === 2">
 | 
			
		||||
      <span class="badge rounded-pill badge-secondary" *ngIf="!channel.closing_reason; else closingReason" i18n="lightning.closed">Closed</span>
 | 
			
		||||
      <span class="badge rounded-pill badge-secondary" *ngIf="!channel.closing_reason; else closingReason" i18n="status.closed">Closed</span>
 | 
			
		||||
      <ng-template #closingReason>
 | 
			
		||||
        <app-closing-type [type]="channel.closing_reason"></app-closing-type>
 | 
			
		||||
      </ng-template>
 | 
			
		||||
@ -117,3 +117,5 @@
 | 
			
		||||
  </tbody>
 | 
			
		||||
</table>
 | 
			
		||||
</ng-template>
 | 
			
		||||
 | 
			
		||||
<ng-template #xChannels let-i i18n="lightning.x-channels">{{ i }} channels</ng-template>
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,7 @@
 | 
			
		||||
      <div class="card-text">
 | 
			
		||||
        <div class="fee-text" [class]="!statistics.previous ? 'no-border' : ''">
 | 
			
		||||
          {{ statistics.latest?.avg_capacity || 0 | number: '1.0-0' }}
 | 
			
		||||
          <span i18n="shared.sat-vbyte|sat/vB">sats</span>
 | 
			
		||||
          <span i18n="shared.sats">sats</span>
 | 
			
		||||
        </div>
 | 
			
		||||
        <span class="fiat" *ngIf="statistics.previous">
 | 
			
		||||
          <app-change [current]="statistics.latest?.avg_capacity" [previous]="statistics.previous?.avg_capacity"></app-change>
 | 
			
		||||
@ -29,7 +29,7 @@
 | 
			
		||||
        placement="bottom">
 | 
			
		||||
        <div class="fee-text" [class]="!statistics.previous ? 'no-border' : ''">
 | 
			
		||||
          {{ statistics.latest?.avg_fee_rate || 0 | number: '1.0-0' }}
 | 
			
		||||
          <span i18n="shared.sat-vbyte|sat/vB">ppm</span>
 | 
			
		||||
          <span i18n="lightning.ppm">ppm</span>
 | 
			
		||||
        </div>
 | 
			
		||||
        <span class="fiat" *ngIf="statistics.previous">
 | 
			
		||||
          <app-change [current]="statistics.latest?.avg_fee_rate" [previous]="statistics.previous?.avg_fee_rate"></app-change>
 | 
			
		||||
@ -44,7 +44,7 @@
 | 
			
		||||
        <div class="card-text">
 | 
			
		||||
          <div class="fee-text" [class]="!statistics.previous ? 'no-border' : ''">
 | 
			
		||||
            {{ statistics.latest?.avg_base_fee_mtokens || 0 | number: '1.0-0' }}
 | 
			
		||||
            <span i18n="shared.sat-vbyte|sat/vB">msats</span>
 | 
			
		||||
            <span i18n="shared.m-sats">mSats</span>
 | 
			
		||||
          </div>
 | 
			
		||||
          <span class="fiat" *ngIf="statistics.previous">
 | 
			
		||||
            <app-change [current]="statistics.latest?.avg_base_fee_mtokens" [previous]="statistics.previous?.avg_base_fee_mtokens"></app-change>
 | 
			
		||||
@ -60,7 +60,7 @@
 | 
			
		||||
      <div class="card-text">
 | 
			
		||||
        <div class="fee-text" [class]="!statistics.previous ? 'no-border' : ''">
 | 
			
		||||
          {{ statistics.latest?.med_capacity || 0 | number: '1.0-0' }}
 | 
			
		||||
          <span i18n="shared.sat-vbyte|sat/vB">sats</span>
 | 
			
		||||
          <span i18n="shared.sats">sats</span>
 | 
			
		||||
        </div>
 | 
			
		||||
        <span class="fiat" *ngIf="statistics.previous">
 | 
			
		||||
          <app-change [current]="statistics.latest?.med_capacity" [previous]="statistics.previous?.med_capacity"></app-change>
 | 
			
		||||
@ -75,7 +75,7 @@
 | 
			
		||||
        placement="bottom">
 | 
			
		||||
        <div class="fee-text" [class]="!statistics.previous ? 'no-border' : ''">
 | 
			
		||||
          {{ statistics.latest?.med_fee_rate || 0 | number: '1.0-0' }}
 | 
			
		||||
          <span i18n="shared.sat-vbyte|sat/vB">ppm</span>
 | 
			
		||||
          <span i18n="lightning.ppm">ppm</span>
 | 
			
		||||
        </div>
 | 
			
		||||
        <span class="fiat" *ngIf="statistics.previous">
 | 
			
		||||
          <app-change [current]="statistics.latest?.med_fee_rate" [previous]="statistics.previous?.med_fee_rate"></app-change>
 | 
			
		||||
@ -90,7 +90,7 @@
 | 
			
		||||
        <div class="card-text">
 | 
			
		||||
          <div class="fee-text" [class]="!statistics.previous ? 'no-border' : ''">
 | 
			
		||||
            {{ statistics.latest?.med_base_fee_mtokens || 0 | number: '1.0-0' }}
 | 
			
		||||
            <span i18n="shared.sat-vbyte|sat/vB">msats</span>
 | 
			
		||||
            <span i18n="shared.m-sats">mSats</span>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <span class="fiat" *ngIf="statistics.previous">
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
<div class="box preview-box" *ngIf="nodes$ | async as nodes">
 | 
			
		||||
  <app-preview-title>
 | 
			
		||||
    <span i18n="lightning.node">Lightning node group</span>
 | 
			
		||||
    <span i18n="lightning.node-group">Lightning node group</span>
 | 
			
		||||
  </app-preview-title>
 | 
			
		||||
  <div class="row d-flex justify-content-between full-width-row">
 | 
			
		||||
    <div class="logo-wrapper">
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
<div class="container-xl full-height" style="min-height: 335px">
 | 
			
		||||
  <h5 class="mb-1" style="color: #ffffff66" i18n="lightning.node">Lightning node group</h5>
 | 
			
		||||
  <h5 class="mb-1" style="color: #ffffff66" i18n="lightning.node-group">Lightning node group</h5>
 | 
			
		||||
 | 
			
		||||
  <div class="header">
 | 
			
		||||
    <div class="logo-container">
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,7 @@
 | 
			
		||||
    <!-- Network capacity/channels/nodes -->
 | 
			
		||||
    <div class="col">
 | 
			
		||||
      <div class="main-title">
 | 
			
		||||
        <span i18n="lightning.statistics-title">Network Statistics</span> 
 | 
			
		||||
        <span i18n="lightning.network-statistics-title">Network Statistics</span> 
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="card-wrapper">
 | 
			
		||||
        <div class="card" style="height: 123px">
 | 
			
		||||
@ -21,7 +21,7 @@
 | 
			
		||||
    <!-- Channels stats -->
 | 
			
		||||
    <div class="col">
 | 
			
		||||
      <div class="main-title">
 | 
			
		||||
        <span i18n="lightning.statistics-title">Channels Statistics</span> 
 | 
			
		||||
        <span i18n="lightning.channel-statistics-title">Channels Statistics</span> 
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="card-wrapper">
 | 
			
		||||
        <div class="card" style="height: 123px">
 | 
			
		||||
@ -46,7 +46,7 @@
 | 
			
		||||
    <div class="col">
 | 
			
		||||
      <div class="card graph-card">
 | 
			
		||||
        <div class="card-body pl-2 pr-2 pt-1">
 | 
			
		||||
          <h5 class="card-title mt-3" i18n="lightning.network-history">Lightning network history</h5>
 | 
			
		||||
          <h5 class="card-title mt-3" i18n="lightning.network-history">Lightning Network History</h5>
 | 
			
		||||
          <app-lightning-statistics-chart [widget]=true></app-lightning-statistics-chart>
 | 
			
		||||
          <app-nodes-networks-chart [widget]=true></app-nodes-networks-chart>
 | 
			
		||||
          <div><a [routerLink]="['/graphs/lightning/nodes-networks' | relativeUrl]" i18n="dashboard.view-more">View more »</a></div>
 | 
			
		||||
@ -59,7 +59,7 @@
 | 
			
		||||
      <div class="card" style="height: 409px">
 | 
			
		||||
        <div class="card-body">
 | 
			
		||||
          <a class="title-link" href="" [routerLink]="['/lightning/nodes/rankings/liquidity' | relativeUrl]">
 | 
			
		||||
            <h5 class="card-title d-inline" i18n="lightning.liquidity-ranking">Liquidity ranking</h5>
 | 
			
		||||
            <h5 class="card-title d-inline" i18n="lightning.liquidity-ranking">Liquidity Ranking</h5>
 | 
			
		||||
            <span> </span>
 | 
			
		||||
            <fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true" style="vertical-align: 'text-top'; font-size: 13px; color: '#4a68b9'"></fa-icon>
 | 
			
		||||
          </a>
 | 
			
		||||
@ -73,7 +73,7 @@
 | 
			
		||||
      <div class="card" style="height: 409px">
 | 
			
		||||
        <div class="card-body">
 | 
			
		||||
          <a class="title-link" href="" [routerLink]="['/lightning/nodes/rankings/connectivity' | relativeUrl]">
 | 
			
		||||
            <h5 class="card-title d-inline" i18n="lightning.connectivity-ranking">Connectivity ranking</h5>
 | 
			
		||||
            <h5 class="card-title d-inline" i18n="lightning.connectivity-ranking">Connectivity Ranking</h5>
 | 
			
		||||
            <span> </span>
 | 
			
		||||
            <fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true" style="vertical-align: 'text-top'; font-size: 13px; color: '#4a68b9'"></fa-icon>
 | 
			
		||||
          </a>
 | 
			
		||||
 | 
			
		||||
@ -24,7 +24,7 @@ export class LightningDashboardComponent implements OnInit {
 | 
			
		||||
  ) { }
 | 
			
		||||
 | 
			
		||||
  ngOnInit(): void {
 | 
			
		||||
    this.seoService.setTitle($localize`Lightning Network`);
 | 
			
		||||
    this.seoService.setTitle($localize`:@@142e923d3b04186ac6ba23387265d22a2fa404e0:Lightning Explorer`);
 | 
			
		||||
 | 
			
		||||
    this.nodesRanking$ = this.lightningApiService.getNodesRanking$().pipe(share());
 | 
			
		||||
    this.statistics$ = this.lightningApiService.getLatestStatistics$().pipe(share());
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
<div class="box preview-box" *ngIf="(node$ | async) as node">
 | 
			
		||||
  <app-preview-title>
 | 
			
		||||
    <span i18n="lightning.node">lightning node</span>
 | 
			
		||||
    <span i18n="lightning.node">Lightning node</span>
 | 
			
		||||
  </app-preview-title>
 | 
			
		||||
  <div class="row d-flex justify-content-between full-width-row">
 | 
			
		||||
    <h1 class="title"></h1>
 | 
			
		||||
@ -29,13 +29,13 @@
 | 
			
		||||
            </td>
 | 
			
		||||
          </tr>
 | 
			
		||||
          <tr>
 | 
			
		||||
            <td i18n="lightning.active-channels-avg">Average size</td>
 | 
			
		||||
            <td i18n="lightning.avg-size">Average size</td>
 | 
			
		||||
            <td>
 | 
			
		||||
              <app-amount [satoshis]="node.avgCapacity" [noFiat]="true"></app-amount>
 | 
			
		||||
            </td>
 | 
			
		||||
          </tr>
 | 
			
		||||
          <tr *ngIf="node.city">
 | 
			
		||||
            <td i18n="location">Location</td>
 | 
			
		||||
            <td i18n="lightning.location">Location</td>
 | 
			
		||||
            <td>
 | 
			
		||||
              <span>{{ node.city.en }}</span>
 | 
			
		||||
            </td>
 | 
			
		||||
@ -47,7 +47,7 @@
 | 
			
		||||
            </td>
 | 
			
		||||
          </tr>
 | 
			
		||||
          <tr *ngIf="!node.city && !node.country">
 | 
			
		||||
            <td i18n="location">Location</td>
 | 
			
		||||
            <td i18n="lightning.location">Location</td>
 | 
			
		||||
            <td>
 | 
			
		||||
              <span>unknown</span>
 | 
			
		||||
            </td>
 | 
			
		||||
 | 
			
		||||
@ -15,7 +15,6 @@
 | 
			
		||||
 | 
			
		||||
  <div *ngIf="error" class="d-flex flex-column justify-content-around align-items-center mt-5 w-100" style="min-height: 100px">
 | 
			
		||||
    <span i18n="lightning.node-not-found">No node found for public key "{{ node.public_key | shortenString : 12}}"</span>
 | 
			
		||||
    <a [routerLink]="['/lightning' | relativeUrl]" i18n="lightning.back-to-lightning-dashboard">Back to the lightning dashboard</a>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
  <div class="box" *ngIf="!error">
 | 
			
		||||
@ -45,7 +44,7 @@
 | 
			
		||||
              </td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr>
 | 
			
		||||
              <td i18n="location" class="text-truncate">Location</td>
 | 
			
		||||
              <td i18n="lightning.location" class="text-truncate">Location</td>
 | 
			
		||||
              <td *ngIf="node.geolocation">
 | 
			
		||||
                <app-geolocation [data]="node.geolocation" [type]="'node'"></app-geolocation>
 | 
			
		||||
              </td>
 | 
			
		||||
@ -61,19 +60,19 @@
 | 
			
		||||
        <table class="table table-borderless table-striped table-fixed">
 | 
			
		||||
          <tbody>
 | 
			
		||||
            <tr>
 | 
			
		||||
              <td i18n="address.total-received" class="text-truncate label">First seen</td>
 | 
			
		||||
              <td i18n="transaction.first-seen|Transaction first seen" class="text-truncate label">First seen</td>
 | 
			
		||||
              <td>
 | 
			
		||||
                <app-timestamp [unixTime]="node.first_seen"></app-timestamp>
 | 
			
		||||
              </td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr>
 | 
			
		||||
              <td i18n="address.total-sent" class="text-truncate label">Last update</td>
 | 
			
		||||
              <td class="text-truncate label" i18n="lightning.last_update">Last update</td>
 | 
			
		||||
              <td>
 | 
			
		||||
                <app-timestamp [unixTime]="node.updated_at"></app-timestamp>
 | 
			
		||||
              </td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr>
 | 
			
		||||
              <td i18n="address.balance" class="text-truncate label">Color</td>
 | 
			
		||||
              <td i18n="lightning.color" class="text-truncate label">Color</td>
 | 
			
		||||
              <td>
 | 
			
		||||
                <div [ngStyle]="{'color': node.color}">{{ node.color }}</div>
 | 
			
		||||
              </td>
 | 
			
		||||
 | 
			
		||||
@ -39,7 +39,7 @@ export class NodeComponent implements OnInit {
 | 
			
		||||
          return this.lightningApiService.getNode$(params.get('public_key'));
 | 
			
		||||
        }),
 | 
			
		||||
        map((node) => {
 | 
			
		||||
          this.seoService.setTitle(`Node: ${node.alias}`);
 | 
			
		||||
          this.seoService.setTitle($localize`Node: ${node.alias}`);
 | 
			
		||||
 | 
			
		||||
          const socketsObject = [];
 | 
			
		||||
          for (const socket of node.sockets.split(',')) {
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@
 | 
			
		||||
    <div *ngIf="chartOptions" [class]="'full-container ' + style + (fitContainer ? ' fit-container' : '')">
 | 
			
		||||
      <div *ngIf="style === 'graph'" class="card-header">
 | 
			
		||||
        <div class="d-flex d-md-block align-items-baseline" style="margin-bottom: -5px">
 | 
			
		||||
          <span i18n="lightning.nodes-channels-world-map">Lightning nodes channels world map</span>
 | 
			
		||||
          <span i18n="lightning.nodes-channels-world-map">Lightning Nodes Channels World Map</span>
 | 
			
		||||
        </div>
 | 
			
		||||
        <small style="color: #ffffff66" i18n="lightning.tor-nodes-excluded">(Tor nodes excluded)</small>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@ -66,7 +66,7 @@ export class NodesChannelsMap implements OnInit {
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    if (this.style === 'graph') {
 | 
			
		||||
      this.seoService.setTitle($localize`Lightning nodes channels world map`);
 | 
			
		||||
      this.seoService.setTitle($localize`Lightning Nodes Channels World Map`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (['nodepage', 'channelpage'].includes(this.style)) {
 | 
			
		||||
 | 
			
		||||
@ -3,8 +3,8 @@
 | 
			
		||||
  <table class="table table-borderless">
 | 
			
		||||
    <thead>
 | 
			
		||||
      <th class="alias text-left" i18n="nodes.alias">Alias</th>
 | 
			
		||||
      <th class="capacity text-right" [class]="show" i18n="node.capacity">Capacity</th>
 | 
			
		||||
      <th class="channels text-right" [class]="show" i18n="node.channels">Channels</th>
 | 
			
		||||
      <th class="capacity text-right" [class]="show" i18n="lightning.capacity">Capacity</th>
 | 
			
		||||
      <th class="channels text-right" [class]="show" i18n="lightning.channels">Channels</th>
 | 
			
		||||
    </thead>
 | 
			
		||||
    <tbody *ngIf="nodes$ | async as nodes; else skeleton">
 | 
			
		||||
      <tr *ngFor="let node of nodes; let i = index;">
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
  <div *ngIf="!widget" class="card-header">
 | 
			
		||||
    <div class="d-flex d-md-block align-items-baseline" style="margin-bottom: -5px">
 | 
			
		||||
      <span i18n="lightning.nodes-world-map">Lightning nodes world map</span>
 | 
			
		||||
      <span i18n="lightning.nodes-world-map">Lightning Nodes World Map</span>
 | 
			
		||||
    </div>
 | 
			
		||||
    <small style="color: #ffffff66" i18n="lightning.tor-nodes-excluded">(Tor nodes excluded)</small>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
@ -47,7 +47,7 @@ export class NodesMap implements OnInit, OnChanges {
 | 
			
		||||
 | 
			
		||||
  ngOnInit(): void {
 | 
			
		||||
    if (!this.widget) {
 | 
			
		||||
      this.seoService.setTitle($localize`Lightning nodes world map`);
 | 
			
		||||
      this.seoService.setTitle($localize`:@@af8560ca50882114be16c951650f83bca73161a7:Lightning Nodes World Map`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!this.inputNodes$) {
 | 
			
		||||
@ -141,7 +141,7 @@ export class NodesMap implements OnInit, OnChanges {
 | 
			
		||||
          color: 'grey',
 | 
			
		||||
          fontSize: 15
 | 
			
		||||
        },
 | 
			
		||||
        text: $localize`No data to display yet`,
 | 
			
		||||
        text: $localize`No data to display yet. Try again later.`,
 | 
			
		||||
        left: 'center',
 | 
			
		||||
        top: 'center'
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
  <div class="card-header mb-0 mb-md-4" [style]="widget ? 'display:none' : ''">
 | 
			
		||||
    <div class="d-flex d-md-block align-items-baseline">
 | 
			
		||||
      <span i18n="lightning.nodes-networks">Lightning nodes per network</span>
 | 
			
		||||
      <span i18n="lightning.nodes-networks">Lightning Nodes Per Network</span>
 | 
			
		||||
      <button class="btn p-0 pl-2" style="margin: 0 0 4px 0px" (click)="onSaveChart()">
 | 
			
		||||
        <fa-icon [icon]="['fas', 'download']" [fixedWidth]="true"></fa-icon>
 | 
			
		||||
      </button>
 | 
			
		||||
 | 
			
		||||
@ -64,7 +64,7 @@ export class NodesNetworksChartComponent implements OnInit {
 | 
			
		||||
    if (this.widget) {
 | 
			
		||||
      this.miningWindowPreference = '3y';
 | 
			
		||||
    } else {
 | 
			
		||||
      this.seoService.setTitle($localize`Lightning nodes per network`);
 | 
			
		||||
      this.seoService.setTitle($localize`:@@b420668a91f8ebaf6e6409c4ba87f1d45961d2bd:Lightning Nodes Per Network`);
 | 
			
		||||
      this.miningWindowPreference = this.miningService.getDefaultTimespan('all');
 | 
			
		||||
    }
 | 
			
		||||
    this.radioGroupForm = this.formBuilder.group({ dateSpan: this.miningWindowPreference });
 | 
			
		||||
@ -128,7 +128,7 @@ export class NodesNetworksChartComponent implements OnInit {
 | 
			
		||||
          color: 'grey',
 | 
			
		||||
          fontSize: 11
 | 
			
		||||
        },
 | 
			
		||||
        text: $localize`Nodes per network`,
 | 
			
		||||
        text: $localize`:@@b420668a91f8ebaf6e6409c4ba87f1d45961d2bd:Lightning Nodes Per Network`,
 | 
			
		||||
        left: 'center',
 | 
			
		||||
        top: 11,
 | 
			
		||||
        zlevel: 10,
 | 
			
		||||
@ -139,7 +139,7 @@ export class NodesNetworksChartComponent implements OnInit {
 | 
			
		||||
      {
 | 
			
		||||
        zlevel: 1,
 | 
			
		||||
        yAxisIndex: 0,
 | 
			
		||||
        name: $localize`Unknown`,
 | 
			
		||||
        name: $localize`:@@e5d8bb389c702588877f039d72178f219453a72d:Unknown`,
 | 
			
		||||
        showSymbol: false,
 | 
			
		||||
        symbol: 'none',
 | 
			
		||||
        data: data.unannounced_nodes,
 | 
			
		||||
@ -308,7 +308,7 @@ export class NodesNetworksChartComponent implements OnInit {
 | 
			
		||||
            icon: 'roundRect',
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            name: $localize`Unknown`,
 | 
			
		||||
            name: $localize`:@@e5d8bb389c702588877f039d72178f219453a72d:Unknown`,
 | 
			
		||||
            inactiveColor: 'rgb(110, 112, 121)',
 | 
			
		||||
            textStyle: {
 | 
			
		||||
              color: 'white',
 | 
			
		||||
@ -320,7 +320,7 @@ export class NodesNetworksChartComponent implements OnInit {
 | 
			
		||||
          '$localize`Reachable on Darknet Only`': true,
 | 
			
		||||
          '$localize`Reachable on Clearnet Only`': true,
 | 
			
		||||
          '$localize`Reachable on Clearnet and Darknet`': true,
 | 
			
		||||
          '$localize`Unknown`': true,
 | 
			
		||||
          '$localize`:@@e5d8bb389c702588877f039d72178f219453a72d:Unknown`': true,
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      yAxis: data.tor_nodes.length === 0 ? undefined : [
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
  <div class="card-header">
 | 
			
		||||
    <div class="d-flex d-md-block align-items-baseline" style="margin-bottom: -5px">
 | 
			
		||||
      <span i18n="lightning.nodes-per-country">Lightning nodes per country</span>
 | 
			
		||||
      <span i18n="lightning.nodes-per-country">Lightning Nodes Per Country</span>
 | 
			
		||||
      <button class="btn p-0 pl-2" style="margin: 0 0 4px 0px" (click)="onSaveChart()">
 | 
			
		||||
        <fa-icon [icon]="['fas', 'download']" [fixedWidth]="true"></fa-icon>
 | 
			
		||||
      </button>
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ export class NodesPerCountryChartComponent implements OnInit {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ngOnInit(): void {
 | 
			
		||||
    this.seoService.setTitle($localize`Lightning nodes per country`);
 | 
			
		||||
    this.seoService.setTitle($localize`:@@9d3ad4c6623870d96b65fb7a708fed6ce7c20044:Lightning Nodes Per Country`);
 | 
			
		||||
 | 
			
		||||
    this.nodesPerCountryObservable$ = this.apiService.getNodesPerCountry$()
 | 
			
		||||
      .pipe(
 | 
			
		||||
@ -100,7 +100,7 @@ export class NodesPerCountryChartComponent implements OnInit {
 | 
			
		||||
          borderColor: '#000',
 | 
			
		||||
          formatter: () => {
 | 
			
		||||
            return `<b style="color: white">${country.name.en} (${country.share}%)</b><br>` +
 | 
			
		||||
              $localize`${country.count.toString()} nodes<br>` +
 | 
			
		||||
              $localize`${country.count.toString()} nodes` + `<br>` +
 | 
			
		||||
              $localize`${this.amountShortenerPipe.transform(country.capacity / 100000000, 2)} BTC capacity`
 | 
			
		||||
            ;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
<div class="container-xl full-height" style="min-height: 335px">
 | 
			
		||||
  <h1 i18n="lightning.nodes-in-country">
 | 
			
		||||
    <span>Lightning nodes in {{ country?.name }}</span>
 | 
			
		||||
  <h1>
 | 
			
		||||
    <span i18n="lightning.nodes-in-country">Lightning nodes in {{ country?.name }}</span>
 | 
			
		||||
    <span style="font-size: 50px; vertical-align:sub;"> {{ country?.flag }}</span>
 | 
			
		||||
  </h1>
 | 
			
		||||
 | 
			
		||||
@ -58,7 +58,7 @@
 | 
			
		||||
      
 | 
			
		||||
      <thead>
 | 
			
		||||
        <th class="alias text-left" i18n="lightning.alias">Alias</th>
 | 
			
		||||
        <th class="timestamp-first text-left" i18n="lightning.first_seen">First seen</th>
 | 
			
		||||
        <th class="timestamp-first text-left" i18n="transaction.first-seen|Transaction first seen">First seen</th>
 | 
			
		||||
        <th class="timestamp-update text-left" i18n="lightning.last_update">Last update</th>
 | 
			
		||||
        <th class="capacity text-right" i18n="lightning.capacity">Capacity</th>
 | 
			
		||||
        <th class="channels text-right" i18n="lightning.channels">Channels</th>
 | 
			
		||||
 | 
			
		||||
@ -3,21 +3,21 @@
 | 
			
		||||
  <div *ngIf="widget">
 | 
			
		||||
    <div class="pool-distribution" *ngIf="(nodesPerAsObservable$ | async) as stats; else loadingReward">
 | 
			
		||||
      <div class="item">
 | 
			
		||||
        <h5 class="card-title d-inline-block" i18n="lightning.clearnet-capacity">Clearnet capacity</h5>
 | 
			
		||||
        <h5 class="card-title d-inline-block" i18n="lightning.clearnet-capacity">Clearnet Capacity</h5>
 | 
			
		||||
        <p class="card-text" i18n-ngbTooltip="lightning.clearnet-capacity-desc"
 | 
			
		||||
          ngbTooltip="How much liquidity is running on nodes advertising at least one clearnet IP address" placement="bottom">
 | 
			
		||||
          <app-amount [satoshis]="stats.clearnetCapacity" [digitsInfo]="'1.2-2'" [noFiat]="true"></app-amount>
 | 
			
		||||
        </p>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="item">
 | 
			
		||||
        <h5 class="card-title d-inline-block" i18n="lightning.unknown-capacity">Unknown capacity</h5>
 | 
			
		||||
        <h5 class="card-title d-inline-block" i18n="lightning.unknown-capacity">Unknown Capacity</h5>
 | 
			
		||||
        <p class="card-text" i18n-ngbTooltip="lightning.unknown-capacity-desc"
 | 
			
		||||
        ngbTooltip="How much liquidity is running on nodes which ISP was not identifiable" placement="bottom">
 | 
			
		||||
          <app-amount [satoshis]="stats.unknownCapacity" [digitsInfo]="'1.2-2'" [noFiat]="true"></app-amount>
 | 
			
		||||
        </p>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="item">
 | 
			
		||||
        <h5 class="card-title d-inline-block" i18n="lightning.tor-capacity">Tor capacity</h5>
 | 
			
		||||
        <h5 class="card-title d-inline-block" i18n="lightning.tor-capacity">Tor Capacity</h5>
 | 
			
		||||
        <p class="card-text" i18n-ngbTooltip="lightning.tor-capacity-desc"
 | 
			
		||||
        ngbTooltip="How much liquidity is running on nodes advertising only Tor addresses" placement="bottom">
 | 
			
		||||
          <app-amount [satoshis]="stats.torCapacity" [digitsInfo]="'1.2-2'" [noFiat]="true"></app-amount>
 | 
			
		||||
@ -33,8 +33,8 @@
 | 
			
		||||
        <fa-icon [icon]="['fas', 'download']" [fixedWidth]="true"></fa-icon>
 | 
			
		||||
      </button>
 | 
			
		||||
    </div>
 | 
			
		||||
    <small class="d-block" style="color: #ffffff66; min-height: 25px" i18n="lightning.tor-nodes-excluded">
 | 
			
		||||
      <span>(Tor nodes excluded)</span>
 | 
			
		||||
    <small class="d-block" style="color: #ffffff66; min-height: 25px" >
 | 
			
		||||
      <span i18n="lightning.tor-nodes-excluded">(Tor nodes excluded)</span>
 | 
			
		||||
    </small>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
@ -80,19 +80,19 @@
 | 
			
		||||
<ng-template #loadingReward>
 | 
			
		||||
  <div class="pool-distribution">
 | 
			
		||||
    <div class="item">
 | 
			
		||||
      <h5 class="card-title d-inline-block" i18n="lightning.clearnet-capacity">Clearnet capacity</h5>
 | 
			
		||||
      <h5 class="card-title d-inline-block" i18n="lightning.clearnet-capacity">Clearnet Capacity</h5>
 | 
			
		||||
      <p class="card-text">
 | 
			
		||||
        <span class="skeleton-loader skeleton-loader-big"></span>
 | 
			
		||||
      </p>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="item">
 | 
			
		||||
      <h5 class="card-title d-inline-block" i18n="lightning.unknown-capacity">Unknown capacity</h5>
 | 
			
		||||
      <h5 class="card-title d-inline-block" i18n="lightning.unknown-capacity">Unknown Capacity</h5>
 | 
			
		||||
      <p class="card-text">
 | 
			
		||||
        <span class="skeleton-loader skeleton-loader-big"></span>
 | 
			
		||||
      </p>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="item">
 | 
			
		||||
      <h5 class="card-title d-inline-block" i18n="lightning.tor-capacity">Tor capacity</h5>
 | 
			
		||||
      <h5 class="card-title d-inline-block" i18n="lightning.tor-capacity">Tor Capacity</h5>
 | 
			
		||||
      <p class="card-text">
 | 
			
		||||
        <span class="skeleton-loader skeleton-loader-big"></span>
 | 
			
		||||
      </p>
 | 
			
		||||
 | 
			
		||||
@ -48,7 +48,7 @@ export class NodesPerISPChartComponent implements OnInit {
 | 
			
		||||
 | 
			
		||||
  ngOnInit(): void {
 | 
			
		||||
    if (!this.widget) {
 | 
			
		||||
      this.seoService.setTitle($localize`Lightning nodes per ISP`);
 | 
			
		||||
      this.seoService.setTitle($localize`:@@8573a1576789bd2c4faeaed23037c4917812c6cf:Lightning Nodes Per ISP`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.nodesPerAsObservable$ = combineLatest([
 | 
			
		||||
@ -154,7 +154,7 @@ export class NodesPerISPChartComponent implements OnInit {
 | 
			
		||||
          borderColor: '#000',
 | 
			
		||||
          formatter: () => {
 | 
			
		||||
            return `<b style="color: white">${isp[1]} (${this.sortBy === 'capacity' ? isp[7] : isp[6]}%)</b><br>` +
 | 
			
		||||
              $localize`${isp[4].toString()} nodes<br>` +
 | 
			
		||||
              $localize`${isp[4].toString()} nodes` + `<br>` +
 | 
			
		||||
              $localize`${this.amountShortenerPipe.transform(isp[2] / 100000000, 2)} BTC`
 | 
			
		||||
            ;
 | 
			
		||||
          }
 | 
			
		||||
@ -186,7 +186,7 @@ export class NodesPerISPChartComponent implements OnInit {
 | 
			
		||||
        borderColor: '#000',
 | 
			
		||||
        formatter: () => {
 | 
			
		||||
          return `<b style="color: white">Other (${totalShareOther.toFixed(2)}%)</b><br>` +
 | 
			
		||||
            $localize`${nodeCountOther.toString()} nodes<br>` +
 | 
			
		||||
            $localize`${nodeCountOther.toString()} nodes` + `<br>` +
 | 
			
		||||
            $localize`${this.amountShortenerPipe.transform(capacityOther / 100000000, 2)} BTC`;
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
<div class="box preview-box" *ngIf="(nodes$ | async) as ispNodes">
 | 
			
		||||
  <app-preview-title>
 | 
			
		||||
    <span i18n="lightning.node">lightning ISP</span>
 | 
			
		||||
    <span i18n="lightning.node-isp">Lightning ISP</span>
 | 
			
		||||
  </app-preview-title>
 | 
			
		||||
  <div class="row d-flex justify-content-between full-width-row">
 | 
			
		||||
    <div class="title-wrapper">
 | 
			
		||||
 | 
			
		||||
@ -55,7 +55,7 @@
 | 
			
		||||
 | 
			
		||||
      <thead>
 | 
			
		||||
        <th class="alias text-left" i18n="lightning.alias">Alias</th>
 | 
			
		||||
        <th class="timestamp-first text-left" i18n="lightning.first_seen">First seen</th>
 | 
			
		||||
        <th class="timestamp-first text-left" i18n="transaction.first-seen|Transaction first seen">First seen</th>
 | 
			
		||||
        <th class="timestamp-update text-left" i18n="lightning.last_update">Last update</th>
 | 
			
		||||
        <th class="capacity text-right" i18n="lightning.capacity">Capacity</th>
 | 
			
		||||
        <th class="channels text-right" i18n="lightning.channels">Channels</th>
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
<div [class]="!widget ? 'container-xl full-height' : ''">
 | 
			
		||||
  <h1 *ngIf="!widget" class="float-left" i18n="lightning.top-100-oldest-nodes">
 | 
			
		||||
    <span>Top 100 oldest lightning nodes</span>
 | 
			
		||||
  <h1 *ngIf="!widget" class="float-left">
 | 
			
		||||
    <span i18n="lightning.top-100-oldest-nodes">Top 100 oldest lightning nodes</span>
 | 
			
		||||
  </h1>
 | 
			
		||||
 | 
			
		||||
  <div [class]="widget ? 'widget' : 'full'">
 | 
			
		||||
@ -8,7 +8,7 @@
 | 
			
		||||
      <thead>
 | 
			
		||||
        <th class="rank"></th>
 | 
			
		||||
        <th class="alias text-left" i18n="nodes.alias">Alias</th>
 | 
			
		||||
        <th  class="timestamp-first text-right" i18n="lightning.first_seen">First seen</th>
 | 
			
		||||
        <th  class="timestamp-first text-right" i18n="transaction.first-seen|Transaction first seen">First seen</th>
 | 
			
		||||
        <th *ngIf="!widget" class="capacity text-right" i18n="node.liquidity">Liquidity</th>
 | 
			
		||||
        <th *ngIf="!widget" class="channels text-right" i18n="lightning.channels">Channels</th>
 | 
			
		||||
        <th *ngIf="!widget" class="timestamp-update text-left" i18n="lightning.last_update">Last update</th>
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,7 @@
 | 
			
		||||
        <th class="alias text-left" i18n="nodes.alias">Alias</th>
 | 
			
		||||
        <th class="capacity text-right" i18n="node.liquidity">Liquidity</th>
 | 
			
		||||
        <th *ngIf="!widget" class="channels text-right" i18n="lightning.channels">Channels</th>
 | 
			
		||||
        <th *ngIf="!widget" class="timestamp-first text-left" i18n="lightning.first_seen">First seen</th>
 | 
			
		||||
        <th *ngIf="!widget" class="timestamp-first text-left" i18n="transaction.first-seen|Transaction first seen">First seen</th>
 | 
			
		||||
        <th *ngIf="!widget" class="timestamp-update text-left" i18n="lightning.last_update">Last update</th>
 | 
			
		||||
        <th *ngIf="!widget" class="location text-right" i18n="lightning.location">Location</th>
 | 
			
		||||
      </thead>
 | 
			
		||||
 | 
			
		||||
@ -26,7 +26,7 @@ export class TopNodesPerCapacity implements OnInit {
 | 
			
		||||
 | 
			
		||||
  ngOnInit(): void {
 | 
			
		||||
    if (!this.widget) {
 | 
			
		||||
      this.seoService.setTitle($localize`Liquidity Ranking`);
 | 
			
		||||
      this.seoService.setTitle($localize`:@@2d9883d230a47fbbb2ec969e32a186597ea27405:Liquidity Ranking`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (let i = 1; i <= (this.widget ? (isMobile() ? 8 : 7) : 100); ++i) {
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,7 @@
 | 
			
		||||
        <th class="alias text-left" i18n="nodes.alias">Alias</th>
 | 
			
		||||
        <th class="channels text-right" i18n="node.channels">Channels</th>
 | 
			
		||||
        <th *ngIf="!widget" class="capacity text-right" i18n="lightning.liquidity">Liquidity</th>
 | 
			
		||||
        <th *ngIf="!widget" class="timestamp-first text-left" i18n="lightning.first_seen">First seen</th>
 | 
			
		||||
        <th *ngIf="!widget" class="timestamp-first text-left" i18n="transaction.first-seen|Transaction first seen">First seen</th>
 | 
			
		||||
        <th *ngIf="!widget" class="timestamp-update text-left" i18n="lightning.last_update">Last update</th>
 | 
			
		||||
        <th *ngIf="!widget" class="location text-right" i18n="lightning.location">Location</th>
 | 
			
		||||
      </thead>
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,6 @@
 | 
			
		||||
import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';
 | 
			
		||||
import { map, Observable } from 'rxjs';
 | 
			
		||||
import { INodesRanking, ITopNodesPerChannels } from '../../../interfaces/node-api.interface';
 | 
			
		||||
import { SeoService } from '../../../services/seo.service';
 | 
			
		||||
import { isMobile } from '../../../shared/common.utils';
 | 
			
		||||
import { GeolocationData } from '../../../shared/components/geolocation/geolocation.component';
 | 
			
		||||
import { LightningApiService } from '../../lightning-api.service';
 | 
			
		||||
@ -21,14 +20,9 @@ export class TopNodesPerChannels implements OnInit {
 | 
			
		||||
 | 
			
		||||
  constructor(
 | 
			
		||||
    private apiService: LightningApiService,
 | 
			
		||||
    private seoService: SeoService
 | 
			
		||||
  ) {}
 | 
			
		||||
 | 
			
		||||
  ngOnInit(): void {
 | 
			
		||||
    if (!this.widget) {
 | 
			
		||||
      this.seoService.setTitle($localize`Connectivity Ranking`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (let i = 1; i <= (this.widget ? (isMobile() ? 8 : 7) : 100); ++i) {
 | 
			
		||||
      this.skeletonRows.push(i);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,7 @@
 | 
			
		||||
      <div class="card">
 | 
			
		||||
        <div class="card-body">
 | 
			
		||||
          <a class="title-link" href="" [routerLink]="['/lightning/nodes/rankings/liquidity' | relativeUrl]">
 | 
			
		||||
            <h5 class="card-title d-inline" i18n="lightning.liquidity-ranking">Liquidity ranking</h5>
 | 
			
		||||
            <h5 class="card-title d-inline" i18n="lightning.liquidity-ranking">Liquidity Ranking</h5>
 | 
			
		||||
            <span> </span>
 | 
			
		||||
            <fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true"
 | 
			
		||||
              style="vertical-align: 'text-top'; font-size: 13px; color: '#4a68b9'"></fa-icon>
 | 
			
		||||
@ -19,7 +19,7 @@
 | 
			
		||||
      <div class="card">
 | 
			
		||||
        <div class="card-body">
 | 
			
		||||
          <a class="title-link" href="" [routerLink]="['/lightning/nodes/rankings/connectivity' | relativeUrl]">
 | 
			
		||||
            <h5 class="card-title d-inline" i18n="lightning.connectivity-ranking">Connectivity ranking</h5>
 | 
			
		||||
            <h5 class="card-title d-inline" i18n="lightning.connectivity-ranking">Connectivity Ranking</h5>
 | 
			
		||||
            <span> </span>
 | 
			
		||||
            <fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true"
 | 
			
		||||
              style="vertical-align: 'text-top'; font-size: 13px; color: '#4a68b9'"></fa-icon>
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
  <div class="card-header mb-0 mb-md-4" [style]="widget ? 'display:none' : ''">
 | 
			
		||||
    <div class="d-flex d-md-block align-items-baseline">
 | 
			
		||||
      <span i18n="mining.channels-and-capacity">Channels & Capacity</span>
 | 
			
		||||
      <span i18n="lightning.network-capacity">Lightning Network Capacity</span>
 | 
			
		||||
      <button class="btn p-0 pl-2" style="margin: 0 0 4px 0px" (click)="onSaveChart()">
 | 
			
		||||
        <fa-icon [icon]="['fas', 'download']" [fixedWidth]="true"></fa-icon>
 | 
			
		||||
      </button>
 | 
			
		||||
@ -49,9 +49,7 @@
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
  <div *ngIf="widget && (capacityObservable$ | async) as stats">
 | 
			
		||||
    <div *ngIf="stats.days === 0" class="indexing-message d-flex" i18n="lightning.indexing-in-progress">
 | 
			
		||||
      Indexing in progress
 | 
			
		||||
    </div>
 | 
			
		||||
    <div *ngIf="stats.days === 0" class="indexing-message d-flex" i18n="lightning.indexing-in-progress">Indexing in progress</div>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
@ -63,7 +63,7 @@ export class LightningStatisticsChartComponent implements OnInit {
 | 
			
		||||
    if (this.widget) {
 | 
			
		||||
      this.miningWindowPreference = '3y';
 | 
			
		||||
    } else {
 | 
			
		||||
      this.seoService.setTitle($localize`Channels and Capacity`);
 | 
			
		||||
      this.seoService.setTitle($localize`:@@ea8db27e6db64f8b940711948c001a1100e5fe9f:Lightning Network Capacity`);
 | 
			
		||||
      this.miningWindowPreference = this.miningService.getDefaultTimespan('all');
 | 
			
		||||
    }
 | 
			
		||||
    this.radioGroupForm = this.formBuilder.group({ dateSpan: this.miningWindowPreference });
 | 
			
		||||
@ -119,7 +119,7 @@ export class LightningStatisticsChartComponent implements OnInit {
 | 
			
		||||
          color: 'grey',
 | 
			
		||||
          fontSize: 11
 | 
			
		||||
        },
 | 
			
		||||
        text: $localize`Channels & Capacity`,
 | 
			
		||||
        text: $localize`:@@ea8db27e6db64f8b940711948c001a1100e5fe9f:Lightning Network Capacity`,
 | 
			
		||||
        left: 'center',
 | 
			
		||||
        top: 11,
 | 
			
		||||
        zlevel: 10,
 | 
			
		||||
@ -191,7 +191,7 @@ export class LightningStatisticsChartComponent implements OnInit {
 | 
			
		||||
        padding: 10,
 | 
			
		||||
        data: [
 | 
			
		||||
          {
 | 
			
		||||
            name: 'Channels',
 | 
			
		||||
            name: $localize`:@@807cf11e6ac1cde912496f764c176bdfdd6b7e19:Channels`,
 | 
			
		||||
            inactiveColor: 'rgb(110, 112, 121)',
 | 
			
		||||
            textStyle: {
 | 
			
		||||
              color: 'white',
 | 
			
		||||
@ -199,7 +199,7 @@ export class LightningStatisticsChartComponent implements OnInit {
 | 
			
		||||
            icon: 'roundRect',
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            name: 'Capacity',
 | 
			
		||||
            name: $localize`:@@ce9dfdc6dccb28dc75a78c704e09dc18fb02dcfa:Capacity`,
 | 
			
		||||
            inactiveColor: 'rgb(110, 112, 121)',
 | 
			
		||||
            textStyle: {
 | 
			
		||||
              color: 'white',
 | 
			
		||||
@ -279,7 +279,7 @@ export class LightningStatisticsChartComponent implements OnInit {
 | 
			
		||||
        {
 | 
			
		||||
          zlevel: 0,
 | 
			
		||||
          yAxisIndex: 1,
 | 
			
		||||
          name: $localize`Capacity`,
 | 
			
		||||
          name: $localize`:@@ce9dfdc6dccb28dc75a78c704e09dc18fb02dcfa:Capacity`,
 | 
			
		||||
          showSymbol: false,
 | 
			
		||||
          symbol: 'none',
 | 
			
		||||
          stack: 'Total',
 | 
			
		||||
@ -341,7 +341,7 @@ export class LightningStatisticsChartComponent implements OnInit {
 | 
			
		||||
    this.chartInstance.setOption(this.chartOptions);
 | 
			
		||||
    download(this.chartInstance.getDataURL({
 | 
			
		||||
      pixelRatio: 2,
 | 
			
		||||
    }), `block-sizes-weights-${this.timespan}-${Math.round(now.getTime() / 1000)}.svg`);
 | 
			
		||||
    }), `lightning-network-capacity-${this.timespan}-${Math.round(now.getTime() / 1000)}.svg`);
 | 
			
		||||
    // @ts-ignore
 | 
			
		||||
    this.chartOptions.grid.bottom = prevBottom;
 | 
			
		||||
    this.chartOptions.backgroundColor = 'none';
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user