Merge branch 'master' into mononaut/reconnect-dead-websocket

This commit is contained in:
softsimon 2023-11-30 17:57:19 +09:00 committed by GitHub
commit 12cf130c00
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
71 changed files with 100887 additions and 66339 deletions

View File

@ -80,7 +80,13 @@ class ChannelsApi {
public async $searchChannelsById(search: string): Promise<any[]> { public async $searchChannelsById(search: string): Promise<any[]> {
try { try {
const searchStripped = search.replace(/[^0-9x]/g, '') + '%'; // restrict search to valid id/short_id prefix formats
let searchStripped = search.match(/[0-9]+[0-9x]*/)?.[0] || '';
if (!searchStripped.length) {
return [];
}
// add wildcard to search by prefix
searchStripped += '%';
const query = `SELECT id, short_id, capacity, status FROM channels WHERE id LIKE ? OR short_id LIKE ? LIMIT 10`; const query = `SELECT id, short_id, capacity, status FROM channels WHERE id LIKE ? OR short_id LIKE ? LIMIT 10`;
const [rows]: any = await DB.query(query, [searchStripped, searchStripped]); const [rows]: any = await DB.query(query, [searchStripped, searchStripped]);
return rows; return rows;

View File

@ -94,9 +94,13 @@ class WebsocketHandler {
throw new Error('WebSocket.Server is not set'); throw new Error('WebSocket.Server is not set');
} }
this.wss.on('connection', (client: WebSocket) => { this.wss.on('connection', (client: WebSocket, req) => {
this.numConnected++; this.numConnected++;
client.on('error', logger.info); client['remoteAddress'] = req.headers['x-forwarded-for'] || req.socket?.remoteAddress || 'unknown';
client.on('error', (e) => {
logger.info(`websocket client error from ${client['remoteAddress']}: ` + (e instanceof Error ? e.message : e));
client.close();
});
client.on('close', () => { client.on('close', () => {
this.numDisconnected++; this.numDisconnected++;
}); });
@ -282,7 +286,8 @@ class WebsocketHandler {
client.send(serializedResponse); client.send(serializedResponse);
} }
} catch (e) { } catch (e) {
logger.debug('Error parsing websocket message: ' + (e instanceof Error ? e.message : e)); logger.debug(`Error parsing websocket message from ${client['remoteAddress']}: ` + (e instanceof Error ? e.message : e));
client.close();
} }
}); });
}); });

View File

@ -23,7 +23,7 @@
"@angular/router": "^16.2.2", "@angular/router": "^16.2.2",
"@fortawesome/angular-fontawesome": "~0.13.0", "@fortawesome/angular-fontawesome": "~0.13.0",
"@fortawesome/fontawesome-common-types": "~6.4.0", "@fortawesome/fontawesome-common-types": "~6.4.0",
"@fortawesome/fontawesome-svg-core": "~6.4.0", "@fortawesome/fontawesome-svg-core": "~6.5.0",
"@fortawesome/free-solid-svg-icons": "~6.4.0", "@fortawesome/free-solid-svg-icons": "~6.4.0",
"@mempool/mempool.js": "2.3.0", "@mempool/mempool.js": "2.3.0",
"@ng-bootstrap/ng-bootstrap": "^15.1.0", "@ng-bootstrap/ng-bootstrap": "^15.1.0",
@ -31,7 +31,6 @@
"bootstrap": "~4.6.2", "bootstrap": "~4.6.2",
"browserify": "^17.0.0", "browserify": "^17.0.0",
"clipboard": "^2.0.11", "clipboard": "^2.0.11",
"cypress": "^13.6.0",
"domino": "^2.1.6", "domino": "^2.1.6",
"echarts": "~5.4.3", "echarts": "~5.4.3",
"lightweight-charts": "~3.8.0", "lightweight-charts": "~3.8.0",
@ -3560,17 +3559,26 @@
} }
}, },
"node_modules/@fortawesome/fontawesome-svg-core": { "node_modules/@fortawesome/fontawesome-svg-core": {
"version": "6.4.0", "version": "6.5.0",
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.0.tgz",
"integrity": "sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==", "integrity": "sha512-5DrR+oxQr+ruRQ3CEVV8DSCT/q8Atm56+FzAs0P6eW/epW47OmecSpSwc/YTlJ3u5BfPKUBSGyPR2qjZ+5eIgA==",
"hasInstallScript": true, "hasInstallScript": true,
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-common-types": "6.4.0" "@fortawesome/fontawesome-common-types": "6.5.0"
}, },
"engines": { "engines": {
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/@fortawesome/fontawesome-svg-core/node_modules/@fortawesome/fontawesome-common-types": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.0.tgz",
"integrity": "sha512-vYC8oN2l8meu05sRi1j3Iie/HNFAeIxpitYFhsUrBc11TxiMken9QdXnSQ0q16FYsOSt/6soxs5ghdk+VYGiog==",
"hasInstallScript": true,
"engines": {
"node": ">=6"
}
},
"node_modules/@fortawesome/free-solid-svg-icons": { "node_modules/@fortawesome/free-solid-svg-icons": {
"version": "6.4.0", "version": "6.4.0",
"resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz",
@ -19319,11 +19327,18 @@
"integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==" "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ=="
}, },
"@fortawesome/fontawesome-svg-core": { "@fortawesome/fontawesome-svg-core": {
"version": "6.4.0", "version": "6.5.0",
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.0.tgz",
"integrity": "sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==", "integrity": "sha512-5DrR+oxQr+ruRQ3CEVV8DSCT/q8Atm56+FzAs0P6eW/epW47OmecSpSwc/YTlJ3u5BfPKUBSGyPR2qjZ+5eIgA==",
"requires": { "requires": {
"@fortawesome/fontawesome-common-types": "6.4.0" "@fortawesome/fontawesome-common-types": "6.5.0"
},
"dependencies": {
"@fortawesome/fontawesome-common-types": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.0.tgz",
"integrity": "sha512-vYC8oN2l8meu05sRi1j3Iie/HNFAeIxpitYFhsUrBc11TxiMken9QdXnSQ0q16FYsOSt/6soxs5ghdk+VYGiog=="
}
} }
}, },
"@fortawesome/free-solid-svg-icons": { "@fortawesome/free-solid-svg-icons": {

View File

@ -75,7 +75,7 @@
"@angular/router": "^16.2.2", "@angular/router": "^16.2.2",
"@fortawesome/angular-fontawesome": "~0.13.0", "@fortawesome/angular-fontawesome": "~0.13.0",
"@fortawesome/fontawesome-common-types": "~6.4.0", "@fortawesome/fontawesome-common-types": "~6.4.0",
"@fortawesome/fontawesome-svg-core": "~6.4.0", "@fortawesome/fontawesome-svg-core": "~6.5.0",
"@fortawesome/free-solid-svg-icons": "~6.4.0", "@fortawesome/free-solid-svg-icons": "~6.4.0",
"@mempool/mempool.js": "2.3.0", "@mempool/mempool.js": "2.3.0",
"@ng-bootstrap/ng-bootstrap": "^15.1.0", "@ng-bootstrap/ng-bootstrap": "^15.1.0",

View File

@ -30,7 +30,7 @@ export class BisqDashboardComponent implements OnInit {
ngOnInit(): void { ngOnInit(): void {
this.seoService.setTitle($localize`:@@meta.title.bisq.markets:Markets`); this.seoService.setTitle($localize`:@@meta.title.bisq.markets:Markets`);
this.seoService.setDescription($localize`:@@meta.description.bisq.markets:Explore the full Bitcoin ecosystem with The Mempool Open Project™. See Bisq market prices, trading activity, and more.`); this.seoService.setDescription($localize`:@@meta.description.bisq.markets:Explore the full Bitcoin ecosystem with The Mempool Open Source Project™. See Bisq market prices, trading activity, and more.`);
this.websocketService.want(['blocks']); this.websocketService.want(['blocks']);
this.volumes$ = this.bisqApiService.getAllVolumesDay$() this.volumes$ = this.bisqApiService.getAllVolumesDay$()

View File

@ -36,14 +36,14 @@
<div id="become-sponsor-container"> <div id="become-sponsor-container">
<div class="become-sponsor community"> <div class="become-sponsor community">
<p style="font-weight: 700; font-size: 18px;">If you're an individual...</p> <p style="font-weight: 700; font-size: 18px;">If you're an individual...</p>
<a href="https://mempool.space/sponsor" class="btn" style="background-color: rgba(152, 88, 255, 0.75); box-shadow: 0px 0px 50px 5px rgba(152, 88, 255, 0.75)" i18n="about.community-sponsor-button">Become a Community Sponsor</a> <a href="https://mempool.space/sponsor" class="btn" style="background-color: rgba(152, 88, 255, 0.75); box-shadow: 0px 0px 50px 5px rgba(152, 88, 255, 0.75)" i18n="about.community-sponsor-button" (click)="onSponsorClick($event)">Become a Community Sponsor</a>
<p class="sponsor-feature"><fa-icon [icon]="['fas', 'check']"></fa-icon> Exclusive swag</p> <p class="sponsor-feature"><fa-icon [icon]="['fas', 'check']"></fa-icon> Exclusive swag</p>
<p class="sponsor-feature"><fa-icon [icon]="['fas', 'check']"></fa-icon> Your avatar on the About page</p> <p class="sponsor-feature"><fa-icon [icon]="['fas', 'check']"></fa-icon> Your avatar on the About page</p>
<p class="sponsor-feature"><fa-icon [icon]="['fas', 'check']"></fa-icon> And more coming soon :)</p> <p class="sponsor-feature"><fa-icon [icon]="['fas', 'check']"></fa-icon> And more coming soon :)</p>
</div> </div>
<div class="become-sponsor enterprise"> <div class="become-sponsor enterprise">
<p style="font-weight: 700; font-size: 18px;">If you're a business...</p> <p style="font-weight: 700; font-size: 18px;">If you're a business...</p>
<a href="https://mempool.space/enterprise" class="btn" style="background-color: rgba(152, 88, 255, 0.75); box-shadow: 0px 0px 50px 5px rgba(152, 88, 255, 0.75)" i18n="about.enterprise-sponsor-button">Become an Enterprise Sponsor</a> <a href="https://mempool.space/enterprise" class="btn" style="background-color: rgba(152, 88, 255, 0.75); box-shadow: 0px 0px 50px 5px rgba(152, 88, 255, 0.75)" i18n="about.enterprise-sponsor-button" (click)="onEnterpriseClick($event)">Become an Enterprise Sponsor</a>
<p class="sponsor-feature"><fa-icon [icon]="['fas', 'check']"></fa-icon> Increased API limits</p> <p class="sponsor-feature"><fa-icon [icon]="['fas', 'check']"></fa-icon> Increased API limits</p>
<p class="sponsor-feature"><fa-icon [icon]="['fas', 'check']"></fa-icon> Co-branded instance</p> <p class="sponsor-feature"><fa-icon [icon]="['fas', 'check']"></fa-icon> Co-branded instance</p>
<p class="sponsor-feature"><fa-icon [icon]="['fas', 'check']"></fa-icon> 99% service-level agreement</p> <p class="sponsor-feature"><fa-icon [icon]="['fas', 'check']"></fa-icon> 99% service-level agreement</p>

View File

@ -282,6 +282,7 @@
text-align: left; text-align: left;
width: 250px; width: 250px;
margin: 12px auto; margin: 12px auto;
white-space: nowrap;
} }
@media (max-width: 992px) { @media (max-width: 992px) {

View File

@ -9,6 +9,7 @@ import { Router, ActivatedRoute } from '@angular/router';
import { map, share, tap } from 'rxjs/operators'; import { map, share, tap } from 'rxjs/operators';
import { ITranslators } from '../../interfaces/node-api.interface'; import { ITranslators } from '../../interfaces/node-api.interface';
import { DOCUMENT } from '@angular/common'; import { DOCUMENT } from '@angular/common';
import { EnterpriseService } from '../../services/enterprise.service';
@Component({ @Component({
selector: 'app-about', selector: 'app-about',
@ -33,6 +34,7 @@ export class AboutComponent implements OnInit {
private websocketService: WebsocketService, private websocketService: WebsocketService,
private seoService: SeoService, private seoService: SeoService,
public stateService: StateService, public stateService: StateService,
private enterpriseService: EnterpriseService,
private apiService: ApiService, private apiService: ApiService,
private router: Router, private router: Router,
private route: ActivatedRoute, private route: ActivatedRoute,
@ -108,4 +110,14 @@ export class AboutComponent implements OnInit {
unmutePromoVideo(): void { unmutePromoVideo(): void {
this.promoVideo.nativeElement.muted = false; this.promoVideo.nativeElement.muted = false;
} }
onSponsorClick(e): boolean {
this.enterpriseService.goal(5);
return true;
}
onEnterpriseClick(e): boolean {
this.enterpriseService.goal(6);
return true;
}
} }

View File

@ -51,7 +51,7 @@
In-band fees In-band fees
</td> </td>
<td style="text-align: end;"> <td style="text-align: end;">
{{ estimate.txSummary.effectiveFee | number : '1.0-0' }} <span class="symbol" i18n="shared.sats|sats">sats</span> {{ estimate.txSummary.effectiveFee | number : '1.0-0' }} <span class="symbol" i18n="shared.sats">sats</span>
</td> </td>
</tr> </tr>
<tr class="info group-last"> <tr class="info group-last">
@ -76,7 +76,7 @@
<div class="d-flex mb-0"> <div class="d-flex mb-0">
<ng-container *ngFor="let option of maxRateOptions"> <ng-container *ngFor="let option of maxRateOptions">
<button type="button" class="btn btn-primary flex-grow-1 btn-border btn-sm feerate" [class]="{active: selectFeeRateIndex === option.index}" (click)="setUserBid(option)"> <button type="button" class="btn btn-primary flex-grow-1 btn-border btn-sm feerate" [class]="{active: selectFeeRateIndex === option.index}" (click)="setUserBid(option)">
<span class="fee">{{ option.fee + estimate.mempoolBaseFee + estimate.vsizeFee | number }} <span class="symbol" i18n="shared.sats|sats">sats</span></span> <span class="fee">{{ option.fee + estimate.mempoolBaseFee + estimate.vsizeFee | number }} <span class="symbol" i18n="shared.sats">sats</span></span>
<span class="rate">~<app-fee-rate [fee]="option.rate" rounding="1.0-0"></app-fee-rate></span> <span class="rate">~<app-fee-rate [fee]="option.rate" rounding="1.0-0"></app-fee-rate></span>
</button> </button>
</ng-container> </ng-container>
@ -110,7 +110,7 @@
{{ math.max(0, estimate.nextBlockFee - estimate.txSummary.effectiveFee) | number }} {{ math.max(0, estimate.nextBlockFee - estimate.txSummary.effectiveFee) | number }}
</td> </td>
<td class="units"> <td class="units">
<span class="symbol" i18n="shared.sats|sats">sats</span> <span class="symbol" i18n="shared.sats">sats</span>
<span class="fiat ml-1"><app-fiat [value]="math.max(0, estimate.nextBlockFee - estimate.txSummary.effectiveFee)"></app-fiat></span> <span class="fiat ml-1"><app-fiat [value]="math.max(0, estimate.nextBlockFee - estimate.txSummary.effectiveFee)"></app-fiat></span>
</td> </td>
</tr> </tr>
@ -130,7 +130,7 @@
+{{ estimate.mempoolBaseFee | number }} +{{ estimate.mempoolBaseFee | number }}
</td> </td>
<td class="units"> <td class="units">
<span class="symbol" i18n="shared.sats|sats">sats</span> <span class="symbol" i18n="shared.sats">sats</span>
<span class="fiat ml-1"><app-fiat [value]="estimate.mempoolBaseFee"></app-fiat></span> <span class="fiat ml-1"><app-fiat [value]="estimate.mempoolBaseFee"></app-fiat></span>
</td> </td>
</tr> </tr>
@ -142,7 +142,7 @@
+{{ estimate.vsizeFee | number }} +{{ estimate.vsizeFee | number }}
</td> </td>
<td class="units"> <td class="units">
<span class="symbol" i18n="shared.sats|sats">sats</span> <span class="symbol" i18n="shared.sats">sats</span>
<span class="fiat ml-1"><app-fiat [value]="estimate.vsizeFee"></app-fiat></span> <span class="fiat ml-1"><app-fiat [value]="estimate.vsizeFee"></app-fiat></span>
</td> </td>
</tr> </tr>
@ -159,7 +159,7 @@
</span> </span>
</td> </td>
<td class="units"> <td class="units">
<span class="symbol" i18n="shared.sats|sats">sats</span> <span class="symbol" i18n="shared.sats">sats</span>
<span class="fiat ml-1"><app-fiat [value]="estimate.cost + estimate.mempoolBaseFee + estimate.vsizeFee"></app-fiat></span> <span class="fiat ml-1"><app-fiat [value]="estimate.cost + estimate.mempoolBaseFee + estimate.vsizeFee"></app-fiat></span>
</td> </td>
</tr> </tr>
@ -182,7 +182,7 @@
</span> </span>
</td> </td>
<td class="units"> <td class="units">
<span class="symbol" i18n="shared.sats|sats">sats</span> <span class="symbol" i18n="shared.sats">sats</span>
<span class="fiat ml-1"> <span class="fiat ml-1">
<app-fiat [value]="maxCost" [colorClass]="estimate.userBalance < maxCost ? 'red-color' : 'green-color'"></app-fiat> <app-fiat [value]="maxCost" [colorClass]="estimate.userBalance < maxCost ? 'red-color' : 'green-color'"></app-fiat>
</span> </span>
@ -205,7 +205,7 @@
{{ estimate.userBalance | number }} {{ estimate.userBalance | number }}
</td> </td>
<td class="units"> <td class="units">
<span class="symbol" i18n="shared.sats|sats">sats</span> <span class="symbol" i18n="shared.sats">sats</span>
<span class="fiat ml-1"> <span class="fiat ml-1">
<app-fiat [value]="estimate.userBalance" [colorClass]="estimate.userBalance < maxCost ? 'red-color' : 'green-color'"></app-fiat> <app-fiat [value]="estimate.userBalance" [colorClass]="estimate.userBalance < maxCost ? 'red-color' : 'green-color'"></app-fiat>
</span> </span>

View File

@ -219,13 +219,13 @@
<div class="box" *ngIf="!error && webGlEnabled && showAudit"> <div class="box" *ngIf="!error && webGlEnabled && showAudit">
<div class="nav nav-tabs" *ngIf="isMobile && showAudit"> <div class="nav nav-tabs" *ngIf="isMobile && showAudit">
<a class="nav-link" [class.active]="mode === 'projected'" <a class="nav-link" [class.active]="mode === 'projected'"
fragment="projected" (click)="changeMode('projected')"><ng-container i18n="block.expected">Expected</ng-container>&nbsp;&nbsp;<span class="badge badge-pill badge-warning" i18n="beta">beta</span></a> fragment="projected" (click)="changeMode('projected')"><ng-container i18n="block.expected">Expected</ng-container></a>
<a class="nav-link" [class.active]="mode === 'actual'" i18n="block.actual" <a class="nav-link" [class.active]="mode === 'actual'" i18n="block.actual"
fragment="actual" (click)="changeMode('actual')">Actual</a> fragment="actual" (click)="changeMode('actual')">Actual</a>
</div> </div>
<div class="row"> <div class="row">
<div class="col-sm"> <div class="col-sm">
<h3 class="block-subtitle" *ngIf="!isMobile"><ng-container i18n="block.expected-block">Expected Block</ng-container> <span class="badge badge-pill badge-warning beta" i18n="beta">beta</span></h3> <h3 class="block-subtitle" *ngIf="!isMobile"><ng-container i18n="block.expected-block">Expected Block</ng-container></h3>
<div class="block-graph-wrapper"> <div class="block-graph-wrapper">
<app-block-overview-graph #blockGraphProjected [isLoading]="isLoadingOverview" [resolution]="86" <app-block-overview-graph #blockGraphProjected [isLoading]="isLoadingOverview" [resolution]="86"
[blockLimit]="stateService.blockVSize" [orientation]="'top'" [flip]="false" [mirrorTxid]="hoverTx" [auditHighlighting]="showAudit" [blockLimit]="stateService.blockVSize" [orientation]="'top'" [flip]="false" [mirrorTxid]="hoverTx" [auditHighlighting]="showAudit"
@ -262,7 +262,7 @@
<tbody> <tbody>
<tr> <tr>
<td class="td-width" i18n="transaction.version">Version</td> <td class="td-width" i18n="transaction.version">Version</td>
<td>{{ block.version | decimal2hex }} <span *ngIf="displayTaprootStatus() && hasTaproot(block.version)" class="badge badge-success ml-1" >Taproot</span></td> <td>{{ block.version | decimal2hex }} <span *ngIf="displayTaprootStatus() && hasTaproot(block.version)" class="badge badge-success ml-1" i18n="tx-features.tag.taproot|Taproot">Taproot</span></td>
</tr> </tr>
<tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'"> <tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
<td i18n="block.bits">Bits</td> <td i18n="block.bits">Bits</td>

View File

@ -56,7 +56,7 @@ export class BlocksList implements OnInit {
this.paginationMaxSize = window.matchMedia('(max-width: 670px)').matches ? 3 : 5; this.paginationMaxSize = window.matchMedia('(max-width: 670px)').matches ? 3 : 5;
if (!this.widget) { if (!this.widget) {
this.seoService.setTitle($localize`:@@meta.title.blocks-list:Blocks`); this.seoService.setTitle($localize`:@@m8a7b4bd44c0ac71b2e72de0398b303257f7d2f54:Blocks`);
} }
if( this.stateService.network==='liquid'||this.stateService.network==='liquidtestnet' ) { if( this.stateService.network==='liquid'||this.stateService.network==='liquidtestnet' ) {
this.seoService.setDescription($localize`:@@meta.description.liquid.blocks:See the most recent Liquid${seoDescriptionNetwork(this.stateService.network)} blocks along with basic stats such as block height, block size, and more.`); this.seoService.setDescription($localize`:@@meta.description.liquid.blocks:See the most recent Liquid${seoDescriptionNetwork(this.stateService.network)} blocks along with basic stats such as block height, block size, and more.`);

View File

@ -26,7 +26,7 @@
<div class="input-group input-group-lg mb-1"> <div class="input-group input-group-lg mb-1">
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text">sats</span> <span class="input-group-text" i18n="shared.sats">sats</span>
</div> </div>
<input type="text" class="form-control" formControlName="satoshis" (input)="transformInput('satoshis')" (click)="selectAll($event)"> <input type="text" class="form-control" formControlName="satoshis" (input)="transformInput('satoshis')" (click)="selectAll($event)">
<app-clipboard [button]="true" [text]="form.get('satoshis').value" [class]="'btn btn-lg btn-secondary ml-1'"></app-clipboard> <app-clipboard [button]="true" [text]="form.get('satoshis').value" [class]="'btn btn-lg btn-secondary ml-1'"></app-clipboard>
@ -41,7 +41,7 @@
<div class="bitcoin-satoshis-text"> <div class="bitcoin-satoshis-text">
<span [innerHTML]="form.get('bitcoin').value | bitcoinsatoshis"></span> <span [innerHTML]="form.get('bitcoin').value | bitcoinsatoshis"></span>
<span class="sats"> sats</span> <span class="sats" i18n="shared.sats">sats</span>
</div> </div>
</div> </div>

View File

@ -38,36 +38,35 @@
</div> </div>
<ng-container *ngIf="!hideStats"> <ng-container *ngIf="!hideStats">
<div class="stats top left"> <div class="stats top left">
<p class="label" i18n="clock.fiat-price">fiat price</p> <p class="label" i18n>Price</p>
<p> <p>
<app-fiat [value]="100000000" digitsInfo="1.2-2" colorClass="white-color"></app-fiat> <app-fiat [value]="100000000" digitsInfo="1.2-2" colorClass="white-color"></app-fiat>
</p> </p>
</div> </div>
<div class="stats top right"> <div class="stats top right">
<p class="label" i18n="clock.priority-rate|priority fee rate">priority rate</p> <p class="label" i18n="fees-box.high-priority">High Priority</p>
<p *ngIf="recommendedFees$ | async as recommendedFees;"> <p *ngIf="recommendedFees$ | async as recommendedFees;">
<app-fee-rate [fee]="recommendedFees.fastestFee" unitClass="" rounding="1.0-0"></app-fee-rate> <app-fee-rate [fee]="recommendedFees.fastestFee" unitClass="" rounding="1.0-0"></app-fee-rate>
</p> </p>
</div> </div>
<div *ngIf="mode !== 'mempool' && blocks?.length" class="stats bottom left"> <div *ngIf="mode !== 'mempool' && blocks?.length" class="stats bottom left">
<p [innerHTML]="blocks[blockIndex].size | bytes: 2"></p> <p [innerHTML]="blocks[blockIndex].size | bytes: 2"></p>
<p class="label" i18n="clock.block-size">block size</p> <p class="label" i18n="block.size">Size</p>
</div> </div>
<div *ngIf="mode !== 'mempool' && blocks?.length" class="stats bottom right"> <div *ngIf="mode !== 'mempool' && blocks?.length" class="stats bottom right">
<p class="force-wrap"> <p class="force-wrap">
<ng-container *ngTemplateOutlet="blocks[blockIndex].tx_count === 1 ? transactionsSingular : transactionsPlural; context: {$implicit: blocks[blockIndex].tx_count | number}"></ng-container> {{ blocks[blockIndex].tx_count | number }}
<ng-template #transactionsSingular let-i i18n="shared.transaction-count.singular">{{ i }} <span class="label">transaction</span></ng-template> <span class="label" i18n="dashboard.txs">Transactions</span>
<ng-template #transactionsPlural let-i i18n="shared.transaction-count.plural">{{ i }} <span class="label">transactions</span></ng-template>
</p> </p>
</div> </div>
<ng-container *ngIf="mempoolInfo$ | async as mempoolInfo;"> <ng-container *ngIf="mempoolInfo$ | async as mempoolInfo;">
<div *ngIf="mode === 'mempool'" class="stats bottom left"> <div *ngIf="mode === 'mempool'" class="stats bottom left">
<p [innerHTML]="mempoolInfo.usage | bytes: 0"></p> <p [innerHTML]="mempoolInfo.usage | bytes: 0"></p>
<p class="label" i18n="dashboard.memory-usage|Memory usage">memory usage</p> <p class="label" i18n="dashboard.memory-usage|Memory usage">Memory Usage</p>
</div> </div>
<div *ngIf="mode === 'mempool'" class="stats bottom right"> <div *ngIf="mode === 'mempool'" class="stats bottom right">
<p>{{ mempoolInfo.size | number }}</p> <p>{{ mempoolInfo.size | number }}</p>
<p class="label" i18n="dashboard.unconfirmed|Unconfirmed count">unconfirmed</p> <p class="label" i18n="dashboard.unconfirmed|Unconfirmed count">Unconfirmed</p>
</div> </div>
</ng-container> </ng-container>
</ng-container> </ng-container>

View File

@ -63,6 +63,7 @@
.label { .label {
font-size: calc(0.04 * var(--clock-width)); font-size: calc(0.04 * var(--clock-width));
line-height: calc(0.05 * var(--clock-width)); line-height: calc(0.05 * var(--clock-width));
text-transform: lowercase;
} }
&.top { &.top {

View File

@ -11,7 +11,7 @@
<div class="progress inc-tx-progress-bar"> <div class="progress inc-tx-progress-bar">
<div class="progress-bar" role="progressbar" [ngStyle]="{'width': mempoolInfoData.progressWidth, 'background-color': mempoolInfoData.progressColor}">&nbsp;</div> <div class="progress-bar" role="progressbar" [ngStyle]="{'width': mempoolInfoData.progressWidth, 'background-color': mempoolInfoData.progressColor}">&nbsp;</div>
<div class="progress-text" *only-vsize>&lrm;{{ mempoolInfoData.vBytesPerSecond | ceil | number }} <ng-container i18n="shared.vbytes-per-second|vB/s">vB/s</ng-container></div> <div class="progress-text" *only-vsize>&lrm;{{ mempoolInfoData.vBytesPerSecond | ceil | number }} <ng-container i18n="shared.vbytes-per-second|vB/s">vB/s</ng-container></div>
<div class="progress-text" *only-weight>&lrm;{{ mempoolInfoData.vBytesPerSecond * 4 | ceil | number }} <ng-container i18n="shared.weight-units-per-second|vB/s">WU/s</ng-container></div> <div class="progress-text" *only-weight>&lrm;{{ mempoolInfoData.vBytesPerSecond * 4 | ceil | number }} <ng-container i18n="shared.weight-per-second|WU/s">WU/s</ng-container></div>
</div> </div>
</ng-template> </ng-template>
</ng-template> </ng-template>

View File

@ -22,7 +22,7 @@
<a class="dropdown-item" routerLinkActive="active" <a class="dropdown-item" routerLinkActive="active"
[routerLink]="['/graphs/mining/block-sizes-weights' | relativeUrl]" i18n="mining.block-sizes-weights">Block Sizes and Weights</a> [routerLink]="['/graphs/mining/block-sizes-weights' | relativeUrl]" i18n="mining.block-sizes-weights">Block Sizes and Weights</a>
<a *ngIf="stateService.env.AUDIT" class="dropdown-item" routerLinkActive="active" <a *ngIf="stateService.env.AUDIT" class="dropdown-item" routerLinkActive="active"
[routerLink]="['/graphs/mining/block-health' | relativeUrl]" i18n="mining.block-health">Block Health</a> [routerLink]="['/graphs/mining/block-health' | relativeUrl]" i18n="mining.blocks-health">Block Health</a>
</div> </div>
</div> </div>

View File

@ -249,10 +249,8 @@ export class HashrateChartComponent implements OnInit {
for (const tick of ticks) { for (const tick of ticks) {
if (tick.seriesIndex === 0) { // Hashrate if (tick.seriesIndex === 0) { // Hashrate
let hashrate = tick.data[1]; let hashrate = tick.data[1];
if (this.isMobile()) { hashratePowerOfTen = selectPowerOfTen(tick.data[1]);
hashratePowerOfTen = selectPowerOfTen(tick.data[1]); hashrate = Math.round(tick.data[1] / hashratePowerOfTen.divider);
hashrate = Math.round(tick.data[1] / hashratePowerOfTen.divider);
}
hashrateString = `${tick.marker} ${tick.seriesName}: ${formatNumber(hashrate, this.locale, '1.0-0')} ${hashratePowerOfTen.unit}H/s<br>`; hashrateString = `${tick.marker} ${tick.seriesName}: ${formatNumber(hashrate, this.locale, '1.0-0')} ${hashratePowerOfTen.unit}H/s<br>`;
} else if (tick.seriesIndex === 1) { // Difficulty } else if (tick.seriesIndex === 1) { // Difficulty
let difficultyPowerOfTen = hashratePowerOfTen; let difficultyPowerOfTen = hashratePowerOfTen;
@ -260,18 +258,14 @@ export class HashrateChartComponent implements OnInit {
if (difficulty === null) { if (difficulty === null) {
difficultyString = `${tick.marker} ${tick.seriesName}: No data<br>`; difficultyString = `${tick.marker} ${tick.seriesName}: No data<br>`;
} else { } else {
if (this.isMobile()) { difficultyPowerOfTen = selectPowerOfTen(tick.data[1]);
difficultyPowerOfTen = selectPowerOfTen(tick.data[1]); difficulty = tick.data[1] / difficultyPowerOfTen.divider;
difficulty = Math.round(tick.data[1] / difficultyPowerOfTen.divider);
}
difficultyString = `${tick.marker} ${tick.seriesName}: ${formatNumber(difficulty, this.locale, '1.2-2')} ${difficultyPowerOfTen.unit}<br>`; difficultyString = `${tick.marker} ${tick.seriesName}: ${formatNumber(difficulty, this.locale, '1.2-2')} ${difficultyPowerOfTen.unit}<br>`;
} }
} else if (tick.seriesIndex === 2) { // Hashrate MA } else if (tick.seriesIndex === 2) { // Hashrate MA
let hashrate = tick.data[1]; let hashrate = tick.data[1];
if (this.isMobile()) { hashratePowerOfTen = selectPowerOfTen(tick.data[1]);
hashratePowerOfTen = selectPowerOfTen(tick.data[1]); hashrate = Math.round(tick.data[1] / hashratePowerOfTen.divider);
hashrate = Math.round(tick.data[1] / hashratePowerOfTen.divider);
}
hashrateStringMA = `${tick.marker} ${tick.seriesName}: ${formatNumber(hashrate, this.locale, '1.0-0')} ${hashratePowerOfTen.unit}H/s`; hashrateStringMA = `${tick.marker} ${tick.seriesName}: ${formatNumber(hashrate, this.locale, '1.0-0')} ${hashratePowerOfTen.unit}H/s`;
} }
} }

View File

@ -143,7 +143,7 @@
<table class="table table-xs table-data"> <table class="table table-xs table-data">
<thead> <thead>
<tr> <tr>
<th scope="col" class="data-title text-center" style="width: 33%" i18n="24h">Blocks 24h</th> <th scope="col" class="data-title text-center" style="width: 33%" i18n="24h">Blocks (24h)</th>
<th scope="col" class="data-title text-center" style="width: 33%" i18n="1w">1w</th> <th scope="col" class="data-title text-center" style="width: 33%" i18n="1w">1w</th>
<th scope="col" class="data-title text-center" style="width: 33%" i18n="all">All</th> <th scope="col" class="data-title text-center" style="width: 33%" i18n="all">All</th>
</tr> </tr>
@ -165,7 +165,7 @@
<table class="table table-xs table-data"> <table class="table table-xs table-data">
<thead> <thead>
<tr> <tr>
<th scope="col" class="data-title text-center" style="width: 33%" i18n="24h">Blocks 24h</th> <th scope="col" class="data-title text-center" style="width: 33%" i18n="24h">Blocks (24h)</th>
<th scope="col" class="data-title text-center" style="width: 33%" i18n="1w">1w</th> <th scope="col" class="data-title text-center" style="width: 33%" i18n="1w">1w</th>
<th scope="col" class="data-title text-center" style="width: 33%" i18n="all">All</th> <th scope="col" class="data-title text-center" style="width: 33%" i18n="all">All</th>
</tr> </tr>
@ -433,7 +433,7 @@
<table class="table table-xs table-data text-center"> <table class="table table-xs table-data text-center">
<thead> <thead>
<tr> <tr>
<th scope="col" class="data-title text-center" style="width: 33%" i18n="24h">Blocks 24h</th> <th scope="col" class="data-title text-center" style="width: 33%" i18n="24h">Blocks (24h)</th>
<th scope="col" class="data-title text-center" style="width: 33%" i18n="1w">1w</th> <th scope="col" class="data-title text-center" style="width: 33%" i18n="1w">1w</th>
<th scope="col" class="data-title text-center" style="width: 33%" i18n="all">All</th> <th scope="col" class="data-title text-center" style="width: 33%" i18n="all">All</th>
</tr> </tr>
@ -458,7 +458,7 @@
<table class="table table-xs table-data text-center"> <table class="table table-xs table-data text-center">
<thead> <thead>
<tr> <tr>
<th scope="col" class="data-title text-center" style="width: 33%" i18n="24h">Blocks 24h</th> <th scope="col" class="data-title text-center" style="width: 33%" i18n="24h">Blocks (24h)</th>
<th scope="col" class="data-title text-center" style="width: 33%" i18n="1w">1w</th> <th scope="col" class="data-title text-center" style="width: 33%" i18n="1w">1w</th>
<th scope="col" class="data-title text-center" style="width: 33%" i18n="all">All</th> <th scope="col" class="data-title text-center" style="width: 33%" i18n="all">All</th>
</tr> </tr>

View File

@ -6,11 +6,9 @@
<form class="formRadioGroup"> <form class="formRadioGroup">
<div class="btn-group btn-group-toggle" name="radioBasic"> <div class="btn-group btn-group-toggle" name="radioBasic">
<label class="btn btn-primary btn-sm" [class.active]="!fullRbf"> <label class="btn btn-primary btn-sm" [class.active]="!fullRbf">
<input type="radio" [value]="'All'" fragment="" [routerLink]="[]"> All <input type="radio" [value]="'All'" fragment="" [routerLink]="[]"><span i18n="all">All</span></label>
</label>
<label class="btn btn-primary btn-sm" [class.active]="fullRbf"> <label class="btn btn-primary btn-sm" [class.active]="fullRbf">
<input type="radio" [value]="'Full RBF'" fragment="fullrbf" [routerLink]="[]"> Full RBF <input type="radio" [value]="'Full RBF'" fragment="fullrbf" [routerLink]="[]" i18n="transaction.full-rbf">Full RBF</label>
</label>
</div> </div>
</form> </form>
</div> </div>
@ -33,7 +31,7 @@
</div> </div>
<div class="no-replacements" *ngIf="!trees?.length"> <div class="no-replacements" *ngIf="!trees?.length">
<p i18n="rbf.no-replacements-yet">there are no replacements in the mempool yet!</p> <p i18n="rbf.no-replacements-yet">There are no replacements in the mempool yet!</p>
</div> </div>
</ng-container> </ng-container>
</div> </div>

View File

@ -55,7 +55,7 @@ export class RbfList implements OnInit, OnDestroy {
}) })
); );
this.seoService.setTitle($localize`:@@meta.title.rbf-list:RBF Replacements`); this.seoService.setTitle($localize`:@@5e3d5a82750902f159122fcca487b07f1af3141f:RBF Replacements`);
this.seoService.setDescription($localize`:@@meta.description.rbf-list:See the most recent RBF replacements on the Bitcoin${seoDescriptionNetwork(this.stateService.network)} network, updated in real-time.`); this.seoService.setDescription($localize`:@@meta.description.rbf-list:See the most recent RBF replacements on the Bitcoin${seoDescriptionNetwork(this.stateService.network)} network, updated in real-time.`);
} }

View File

@ -32,9 +32,9 @@
<tr> <tr>
<td class="td-width" i18n="transaction.status|Transaction Status">Status</td> <td class="td-width" i18n="transaction.status|Transaction Status">Status</td>
<td> <td>
<span *ngIf="rbfInfo.tx.fullRbf" class="badge badge-info" i18n="rbfInfo-features.tag.full-rbf|Full RBF">Full RBF</span> <span *ngIf="rbfInfo.tx.fullRbf" class="badge badge-info" i18n="transaction.full-rbf">Full RBF</span>
<span *ngIf="rbfInfo.tx.rbf; else rbfDisabled" class="badge badge-success" i18n="rbfInfo-features.tag.rbf|RBF">RBF</span> <span *ngIf="rbfInfo.tx.rbf; else rbfDisabled" class="badge badge-success" i18n="rbfInfo-features.tag.rbf|RBF">RBF</span>
<ng-template #rbfDisabled><span class="badge badge-danger mr-1"><del i18n="rbfInfo-features.tag.rbf|RBF">RBF</del></span></ng-template> <ng-template #rbfDisabled><span class="badge badge-danger mr-1"><del i18n="tx-features.tag.rbf|RBF">RBF</del></span></ng-template>
<span *ngIf="rbfInfo.tx.mined" class="badge badge-success" i18n="transaction.rbf.mined">Mined</span> <span *ngIf="rbfInfo.tx.mined" class="badge badge-success" i18n="transaction.rbf.mined">Mined</span>
</td> </td>
</tr> </tr>

View File

@ -14,7 +14,7 @@
[class]="(stateService.env.MINING_DASHBOARD || stateService.env.LIGHTNING) ? 'mining' : 'no-menu'" (click)="saveGraphPreference()"> [class]="(stateService.env.MINING_DASHBOARD || stateService.env.LIGHTNING) ? 'mining' : 'no-menu'" (click)="saveGraphPreference()">
<div class="small-buttons"> <div class="small-buttons">
<a class="btn btn-primary btn-sm mb-0" [routerLink]="['/clock/mempool/0' | relativeUrl]" style="color: white" id="btn-clock"> <a class="btn btn-primary btn-sm mb-0" [routerLink]="['/clock/mempool/0' | relativeUrl]" style="color: white" id="btn-clock">
<fa-icon [icon]="['fas', 'clock']" [fixedWidth]="true" i18n-title="master-page.clockview" title="Clock view"></fa-icon> <fa-icon [icon]="['fas', 'clock']" [fixedWidth]="true" i18n-title="master-page.clockview" i18n-title="footer.clock-mempool" title="Clock (Mempool)"></fa-icon>
</a> </a>
<a *ngIf="!isMobile()" class="btn btn-primary btn-sm mb-0" [routerLink]="['/tv' | relativeUrl]" style="color: white" id="btn-tv"> <a *ngIf="!isMobile()" class="btn btn-primary btn-sm mb-0" [routerLink]="['/tv' | relativeUrl]" style="color: white" id="btn-tv">
<fa-icon [icon]="['fas', 'tv']" [fixedWidth]="true" i18n-title="master-page.tvview" title="TV view"></fa-icon> <fa-icon [icon]="['fas', 'tv']" [fixedWidth]="true" i18n-title="master-page.tvview" title="TV view"></fa-icon>

View File

@ -519,7 +519,7 @@
<div class="effective-fee-container"> <div class="effective-fee-container">
<app-fee-rate [fee]="tx.effectiveFeePerVsize"></app-fee-rate> <app-fee-rate [fee]="tx.effectiveFeePerVsize"></app-fee-rate>
<ng-template [ngIf]="tx?.status?.confirmed"> <ng-template [ngIf]="tx?.status?.confirmed">
<app-tx-fee-rating class="ml-2 mr-2" *ngIf="tx.fee || tx.effectiveFeePerVsize" [tx]="tx"></app-tx-fee-rating> <app-tx-fee-rating class="ml-2 mr-2 effective-fee-rating" *ngIf="tx.fee || tx.effectiveFeePerVsize" [tx]="tx"></app-tx-fee-rating>
</ng-template> </ng-template>
</div> </div>
<button *ngIf="cpfpInfo.bestDescendant || cpfpInfo.descendants?.length || cpfpInfo.ancestors?.length" type="button" class="btn btn-outline-info btn-sm btn-small-height float-right" (click)="showCpfpDetails = !showCpfpDetails">CPFP <fa-icon [icon]="['fas', 'info-circle']" [fixedWidth]="true"></fa-icon></button> <button *ngIf="cpfpInfo.bestDescendant || cpfpInfo.descendants?.length || cpfpInfo.ancestors?.length" type="button" class="btn btn-outline-info btn-sm btn-small-height float-right" (click)="showCpfpDetails = !showCpfpDetails">CPFP <fa-icon [icon]="['fas', 'info-circle']" [fixedWidth]="true"></fa-icon></button>

View File

@ -152,6 +152,16 @@
@media (min-width: 768px){ @media (min-width: 768px){
display: inline-block; display: inline-block;
} }
@media (max-width: 425px){
display: flex;
flex-direction: column;
}
}
.effective-fee-rating {
@media (max-width: 767px){
margin-right: 0px !important;
}
} }
.title { .title {

View File

@ -99,7 +99,7 @@
<td class="table-cell-badges"> <td class="table-cell-badges">
<span *ngIf="replacement.mined" class="badge badge-success" i18n="transaction.rbf.mined">Mined</span> <span *ngIf="replacement.mined" class="badge badge-success" i18n="transaction.rbf.mined">Mined</span>
<span *ngIf="replacement.fullRbf" class="badge badge-info" i18n="transaction.full-rbf">Full RBF</span> <span *ngIf="replacement.fullRbf" class="badge badge-info" i18n="transaction.full-rbf">Full RBF</span>
<span *ngIf="!replacement.fullRbf" class="badge badge-success" i18n="transaction.rbf">RBF</span> <span *ngIf="!replacement.fullRbf" class="badge badge-success" i18n="tx-features.tag.rbf|RBF">RBF</span>
</td> </td>
</tr> </tr>
</tbody> </tbody>
@ -110,7 +110,7 @@
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<a class="title-link" href="" [routerLink]="['/blocks' | relativeUrl]"> <a class="title-link" href="" [routerLink]="['/blocks' | relativeUrl]">
<h5 class="card-title d-inline" i18n="dashboard.recent-block">Recent blocks</h5> <h5 class="card-title d-inline" i18n="dashboard.recent-blocks">Recent Blocks</h5>
<span>&nbsp;</span> <span>&nbsp;</span>
<fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true" style="vertical-align: text-top; font-size: 13px; color: #4a68b9"></fa-icon> <fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true" style="vertical-align: text-top; font-size: 13px; color: #4a68b9"></fa-icon>
</a> </a>

View File

@ -10,9 +10,9 @@
<div class="doc-content"> <div class="doc-content">
<div id="disclaimer"> <div id="disclaimer">
<table *ngIf="!mobileViewport"><tr><td><app-svg-images name="warning" class="disclaimer-warning" viewBox="0 0 304 304" fill="#ffc107" width="50" height="50"></app-svg-images></td><td><p i18n="faq.big-disclaimer"><b>mempool.space merely provides data about the Bitcoin network.</b> It cannot help you with retrieving funds, wallet issues, etc.</p><p>For any such requests, you need to get in touch with the entity that helped make the transaction (wallet software, exchange company, etc).</p></td></tr></table> <table *ngIf="!mobileViewport"><tr><td><app-svg-images name="warning" class="disclaimer-warning" viewBox="0 0 304 304" fill="#ffc107" width="50" height="50"></app-svg-images></td><td> <ng-container *ngTemplateOutlet="faqDisclaimer"></ng-container></td></tr></table>
<div *ngIf="mobileViewport"><app-svg-images name="warning" class="disclaimer-warning" viewBox="0 0 304 304" fill="#ffc107" width="50" height="50"></app-svg-images><p i18n="faq.big-disclaimer"><b>mempool.space merely provides data about the Bitcoin network.</b> It cannot help you with retrieving funds, wallet issues, etc.</p><p>For any such requests, you need to get in touch with the entity that helped make the transaction (wallet software, exchange company, etc).</p></div> <div *ngIf="mobileViewport"><app-svg-images name="warning" class="disclaimer-warning" viewBox="0 0 304 304" fill="#ffc107" width="50" height="50"></app-svg-images><ng-container *ngTemplateOutlet="faqDisclaimer"></ng-container></div>
<ng-template #faqDisclaimer i18n="faq.big-disclaimer"><p><b>mempool.space merely provides data about the Bitcoin network.</b> It cannot help you with retrieving funds, wallet issues, etc.</p><p>For any such requests, you need to get in touch with the entity that helped make the transaction (wallet software, exchange company, etc).</p></ng-template>
</div> </div>
<div class="doc-item-container" *ngFor="let item of faq"> <div class="doc-item-container" *ngFor="let item of faq">

View File

@ -62,12 +62,10 @@ export class DocsComponent implements OnInit {
} else { } else {
this.seoService.setDescription($localize`:@@meta.description.docs.websocket-bitcoin:Documentation for the mempool.space WebSocket API service: get real-time info on blocks, mempools, transactions, addresses, and more.`); this.seoService.setDescription($localize`:@@meta.description.docs.websocket-bitcoin:Documentation for the mempool.space WebSocket API service: get real-time info on blocks, mempools, transactions, addresses, and more.`);
} }
/*
} else { } else {
this.activeTab = 3; this.activeTab = 3;
this.seoService.setTitle($localize`:@@meta.title.docs.electrum:Electrum RPC`); this.seoService.setTitle($localize`:@@meta.title.docs.electrum:Electrum RPC`);
this.seoService.setDescription($localize`:@@meta.description.docs.electrumrpc:Documentation for our Electrum RPC interface: get instant, convenient, and reliable access to an Esplora instance.`); this.seoService.setDescription($localize`:@@meta.description.docs.electrumrpc:Documentation for our Electrum RPC interface: get instant, convenient, and reliable access to an Esplora instance.`);
*/
} }
} }

View File

@ -37,7 +37,7 @@
<thead> <thead>
<th class="alias text-left" i18n="lightning.alias">Alias</th> <th class="alias text-left" i18n="lightning.alias">Alias</th>
<th class="nodedetails text-left">&nbsp;</th> <th class="nodedetails text-left">&nbsp;</th>
<th class="status text-left" i18n="status">Status</th> <th class="status text-left" i18n="transaction.status|Transaction Status">Status</th>
<th class="feerate text-left" *ngIf="status !== 'closed'" i18n="transaction.fee-rate|Transaction fee rate">Fee rate</th> <th class="feerate text-left" *ngIf="status !== 'closed'" i18n="transaction.fee-rate|Transaction fee rate">Fee rate</th>
<th class="feerate text-left" *ngIf="status === 'closed'" i18n="channels.closing_date">Closing date</th> <th class="feerate text-left" *ngIf="status === 'closed'" i18n="channels.closing_date">Closing date</th>
<th class="liquidity text-right" i18n="lightning.capacity">Capacity</th> <th class="liquidity text-right" i18n="lightning.capacity">Capacity</th>

View File

@ -49,7 +49,7 @@
<tr *ngIf="!node.city && !node.country"> <tr *ngIf="!node.city && !node.country">
<td i18n="lightning.location">Location</td> <td i18n="lightning.location">Location</td>
<td> <td>
<span>unknown</span> <span i18n="unknown">Unknown</span>
</td> </td>
</tr> </tr>
</tbody> </tbody>

View File

@ -119,7 +119,7 @@
</div> </div>
<ng-template #featurebits let-bits="bits"> <ng-template #featurebits let-bits="bits">
<td i18n="lightning.features" class="text-truncate label">Features</td> <td i18n="transaction.features|Transaction features" class="text-truncate label">Features</td>
<td class="d-flex justify-content-between"> <td class="d-flex justify-content-between">
<span class="text-truncate w-90">{{ bits }}</span> <span class="text-truncate w-90">{{ bits }}</span>
<button type="button" class="btn btn-outline-info btn-xs" (click)="toggleFeatures()" i18n="transaction.details|Transaction Details">Details</button> <button type="button" class="btn btn-outline-info btn-xs" (click)="toggleFeatures()" i18n="transaction.details|Transaction Details">Details</button>

View File

@ -1,22 +1,28 @@
<div class="map-wrapper" [class]="style"> <div class="map-wrapper" [class]="style" *ngIf="style !== 'graph'">
<ng-container *ngIf="channelsObservable | async"> <ng-container *ngIf="channelsObservable | async">
<div *ngIf="chartOptions" [class]="'full-container ' + style + (fitContainer ? ' fit-container' : '')"> <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>
</div>
<small style="color: #ffffff66" i18n="lightning.tor-nodes-excluded">(Tor nodes excluded)</small>
</div>
<div class="chart" [class]="style" echarts [initOpts]="chartInitOptions" [options]="chartOptions" <div class="chart" [class]="style" echarts [initOpts]="chartInitOptions" [options]="chartOptions"
(chartInit)="onChartInit($event)" (chartFinished)="onChartFinished($event)"> (chartInit)="onChartInit($event)" (chartFinished)="onChartFinished($event)">
</div> </div>
<div *ngIf="!chartOptions && style === 'nodepage'" style="padding-top: 30px"></div> <div *ngIf="!chartOptions && style === 'nodepage'" style="padding-top: 30px"></div>
</div> </div>
<div class="text-center loading-spinner" [class]="style" *ngIf="isLoading && !disableSpinner"> <div class="text-center loading-spinner" [class]="style" *ngIf="isLoading && !disableSpinner">
<div class="spinner-border text-light"></div> <div class="spinner-border text-light"></div>
</div> </div>
</ng-container> </ng-container>
</div> </div>
<div class="full-container-graph" *ngIf="style === 'graph'">
<div 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>
</div>
<small style="color: #ffffff66" i18n="lightning.tor-nodes-excluded">(Tor nodes excluded)</small>
</div>
<div *ngIf="channelsObservable | async" class="chart-graph" echarts [initOpts]="chartInitOptions" [options]="chartOptions"
(chartInit)="onChartInit($event)" (chartFinished)="onChartFinished($event)">
</div>
</div>

View File

@ -143,3 +143,55 @@
text-align: center; text-align: center;
margin-top: 100px; margin-top: 100px;
} }
.full-container-graph {
display: flex;
flex-direction: column;
padding: 0px 15px;
width: 100%;
height: calc(100vh - 225px);
min-height: 400px;
@media (min-width: 992px) {
height: calc(100vh - 150px);
}
}
.full-container-graph.widget {
min-height: 240px;
height: 240px;
padding: 0px;
}
.full-container-graph.fit-container {
margin: 0;
padding: 0;
height: 100%;
min-height: 100px;
.chart {
padding: 0;
min-height: 100px;
}
}
.chart-graph {
display: flex;
flex: 1;
height: 100%;
padding-top: 30px;
padding-bottom: 20px;
padding-right: 10px;
@media (max-width: 992px) {
padding-bottom: 25px;
}
@media (max-width: 829px) {
padding-bottom: 50px;
}
@media (max-width: 767px) {
padding-bottom: 25px;
}
@media (max-width: 629px) {
padding-bottom: 55px;
}
@media (max-width: 567px) {
padding-bottom: 55px;
}
}

View File

@ -65,6 +65,7 @@ export class NodesChannelsMap implements OnInit {
} }
if (this.style === 'graph') { if (this.style === 'graph') {
this.center = [0, 5];
this.seoService.setTitle($localize`Lightning Nodes Channels World Map`); this.seoService.setTitle($localize`Lightning Nodes Channels World Map`);
this.seoService.setDescription($localize`:@@meta.description.lightning.node-map:See the channels of non-Tor Lightning network nodes visualized on a world map. Hover/tap on points on the map for node names and details.`); this.seoService.setDescription($localize`:@@meta.description.lightning.node-map:See the channels of non-Tor Lightning network nodes visualized on a world map. Hover/tap on points on the map for node names and details.`);
} }
@ -238,7 +239,6 @@ export class NodesChannelsMap implements OnInit {
title: title ?? undefined, title: title ?? undefined,
tooltip: {}, tooltip: {},
geo: { geo: {
top: 75,
animation: false, animation: false,
silent: true, silent: true,
center: this.center, center: this.center,

View File

@ -3,6 +3,7 @@ import { Inject, Injectable } from '@angular/core';
import { ApiService } from './api.service'; import { ApiService } from './api.service';
import { SeoService } from './seo.service'; import { SeoService } from './seo.service';
import { StateService } from './state.service'; import { StateService } from './state.service';
import { ActivatedRoute } from '@angular/router';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
@ -11,12 +12,15 @@ export class EnterpriseService {
exclusiveHostName = '.mempool.space'; exclusiveHostName = '.mempool.space';
subdomain: string | null = null; subdomain: string | null = null;
info: object = {}; info: object = {};
statsUrl: string;
siteId: number;
constructor( constructor(
@Inject(DOCUMENT) private document: Document, @Inject(DOCUMENT) private document: Document,
private apiService: ApiService, private apiService: ApiService,
private seoService: SeoService, private seoService: SeoService,
private stateService: StateService, private stateService: StateService,
private activatedRoute: ActivatedRoute,
) { ) {
const subdomain = this.document.location.hostname.indexOf(this.exclusiveHostName) > -1 const subdomain = this.document.location.hostname.indexOf(this.exclusiveHostName) > -1
&& this.document.location.hostname.split(this.exclusiveHostName)[0] || false; && this.document.location.hostname.split(this.exclusiveHostName)[0] || false;
@ -88,16 +92,63 @@ export class EnterpriseService {
} }
} }
this.statsUrl = statsUrl;
this.siteId = siteId;
// @ts-ignore // @ts-ignore
const _paq = window._paq = window._paq || []; if (window._paq && window['Matomo']) {
_paq.push(['disableCookies']); window['Matomo'].addTracker(statsUrl+'m.php', siteId.toString());
_paq.push(['trackPageView']); const matomo = this.getMatomo();
_paq.push(['enableLinkTracking']); matomo.setDocumentTitle(this.seoService.getTitle());
(function() { matomo.setCustomUrl(this.getCustomUrl());
_paq.push(['setTrackerUrl', statsUrl+'m.php']); matomo.disableCookies();
_paq.push(['setSiteId', siteId.toString()]); matomo.trackPageView();
const d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; matomo.enableLinkTracking();
g.type='text/javascript'; g.async=true; g.src=statsUrl+'m.js'; s.parentNode.insertBefore(g,s); } else {
})(); // @ts-ignore
const alreadyInitialized = !!window._paq;
// @ts-ignore
const _paq = window._paq = window._paq || [];
_paq.push(['setDocumentTitle', this.seoService.getTitle()]);
_paq.push(['setCustomUrl', this.getCustomUrl()]);
_paq.push(['disableCookies']);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
if (alreadyInitialized) {
_paq.push(['addTracker', statsUrl+'m.php', siteId.toString()]);
} else {
(function() {
_paq.push(['setTrackerUrl', statsUrl+'m.php']);
_paq.push(['setSiteId', siteId.toString()]);
const d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
// @ts-ignore
g.type='text/javascript'; g.async=true; g.src=statsUrl+'m.js'; s.parentNode.insertBefore(g,s);
})();
}
}
}
private getMatomo() {
if (this.siteId != null) {
return window['Matomo']?.getTracker(this.statsUrl, this.siteId);
}
}
goal(id: number) {
// @ts-ignore
this.getMatomo()?.trackGoal(id);
}
private getCustomUrl(): string {
let url = window.location.origin + '/';
let route = this.activatedRoute;
while (route) {
const segment = route?.routeConfig?.path;
if (segment && segment.length) {
url += segment + '/';
}
route = route.firstChild;
}
return url;
} }
} }

View File

@ -10,7 +10,7 @@ import { StateService } from './state.service';
export class SeoService { export class SeoService {
network = ''; network = '';
baseTitle = 'mempool'; baseTitle = 'mempool';
baseDescription = 'Explore the full Bitcoin ecosystem with The Mempool Open Project™.'; baseDescription = 'Explore the full Bitcoin ecosystem with The Mempool Open Source Project™.';
canonicalLink: HTMLElement = document.getElementById('canonical'); canonicalLink: HTMLElement = document.getElementById('canonical');

View File

@ -52,7 +52,7 @@
<p><a [routerLink]="['/docs/faq']" fragment="what-is-a-block-explorer" i18n="faq.what-is-a-block-exlorer">What is a block explorer?</a></p> <p><a [routerLink]="['/docs/faq']" fragment="what-is-a-block-explorer" i18n="faq.what-is-a-block-exlorer">What is a block explorer?</a></p>
<p><a [routerLink]="['/docs/faq']" fragment="what-is-a-mempool-explorer" i18n="faq.what-is-a-mempool-exlorer">What is a mempool explorer?</a></p> <p><a [routerLink]="['/docs/faq']" fragment="what-is-a-mempool-explorer" i18n="faq.what-is-a-mempool-exlorer">What is a mempool explorer?</a></p>
<p><a [routerLink]="['/docs/faq']" fragment="why-is-transaction-stuck-in-mempool" i18n="faq.why-isnt-my-transaction-confirming">Why isn't my transaction confirming?</a></p> <p><a [routerLink]="['/docs/faq']" fragment="why-is-transaction-stuck-in-mempool" i18n="faq.why-isnt-my-transaction-confirming">Why isn't my transaction confirming?</a></p>
<p><a [routerLink]="['/docs/faq' | relativeUrl]" i18n="faq.more-faq">More FAQs </a></p> <p><a [routerLink]="['/docs/faq' | relativeUrl]" i18n="faq.more-faq">More FAQs &raquo;</a></p>
</div> </div>
<div class="links" *ngIf="officialMempoolSpace || env.TESTNET_ENABLED || env.SIGNET_ENABLED || env.LIQUID_ENABLED || env.LIQUID_TESTNET_ENABLED else toolBox" > <div class="links" *ngIf="officialMempoolSpace || env.TESTNET_ENABLED || env.SIGNET_ENABLED || env.LIQUID_ENABLED || env.LIQUID_TESTNET_ENABLED else toolBox" >

View File

@ -2,12 +2,12 @@ import { Component, Input, OnInit } from "@angular/core";
import { DomSanitizer, SafeHtml } from "@angular/platform-browser"; import { DomSanitizer, SafeHtml } from "@angular/platform-browser";
const MempoolErrors = { const MempoolErrors = {
'internal_server_error': `Something went wrong, please try again later`,
'acceleration_duplicated': `This transaction has already been accelerated.`, 'acceleration_duplicated': `This transaction has already been accelerated.`,
'acceleration_outbid': `Your fee delta is too low.`, 'acceleration_outbid': `Your fee delta is too low.`,
'cannot_accelerate_tx': `Cannot accelerate this transaction.`, 'cannot_accelerate_tx': `Cannot accelerate this transaction.`,
'cannot_decode_raw_tx': `Cannot decode this raw transaction.`, 'cannot_decode_raw_tx': `Cannot decode this raw transaction.`,
'cannot_fetch_raw_tx': `Cannot find this transaction.`, 'cannot_fetch_raw_tx': `Cannot find this transaction.`,
'database_error': `Something went wrong. Please try again later.`,
'high_sigop_tx': `This transaction cannot be accelerated.`, 'high_sigop_tx': `This transaction cannot be accelerated.`,
'invalid_acceleration_request': `This acceleration request is not valid.`, 'invalid_acceleration_request': `This acceleration request is not valid.`,
'invalid_tx_dependencies': `This transaction dependencies are not valid.`, 'invalid_tx_dependencies': `This transaction dependencies are not valid.`,

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -542,6 +542,10 @@
<context context-type="sourcefile">src/app/components/blocks-list/blocks-list.component.html</context> <context context-type="sourcefile">src/app/components/blocks-list/blocks-list.component.html</context>
<context context-type="linenumber">24</context> <context context-type="linenumber">24</context>
</context-group> </context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/clock/clock.component.html</context>
<context context-type="linenumber">59</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/mempool-block/mempool-block.component.html</context> <context context-type="sourcefile">src/app/components/mempool-block/mempool-block.component.html</context>
<context context-type="linenumber">32</context> <context context-type="linenumber">32</context>
@ -655,6 +659,10 @@
<context context-type="sourcefile">src/app/bisq/bisq-trades/bisq-trades.component.html</context> <context context-type="sourcefile">src/app/bisq/bisq-trades/bisq-trades.component.html</context>
<context context-type="linenumber">5</context> <context context-type="linenumber">5</context>
</context-group> </context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/clock/clock.component.html</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit> </trans-unit>
<trans-unit id="b666c0101ab9ef128a75fdf05a43184a57de0cff" datatype="html"> <trans-unit id="b666c0101ab9ef128a75fdf05a43184a57de0cff" datatype="html">
<source>Volume (7d)</source> <source>Volume (7d)</source>
@ -700,7 +708,7 @@
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="meta.description.bisq.markets" datatype="html"> <trans-unit id="meta.description.bisq.markets" datatype="html">
<source>Explore the full Bitcoin ecosystem with The Mempool Open Project™. See Bisq market prices, trading activity, and more.</source> <source>Explore the full Bitcoin ecosystem with The Mempool Open Source Project™. See Bisq market prices, trading activity, and more.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/bisq/bisq-dashboard/bisq-dashboard.component.ts</context> <context context-type="sourcefile">src/app/bisq/bisq-dashboard/bisq-dashboard.component.ts</context>
<context context-type="linenumber">33</context> <context context-type="linenumber">33</context>
@ -1064,6 +1072,10 @@
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">141</context> <context context-type="linenumber">141</context>
</context-group> </context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
<context context-type="linenumber">122</context>
</context-group>
<note priority="1" from="description">Transaction features</note> <note priority="1" from="description">Transaction features</note>
<note priority="1" from="meaning">transaction.features</note> <note priority="1" from="meaning">transaction.features</note>
</trans-unit> </trans-unit>
@ -1498,7 +1510,7 @@
<note priority="1" from="description">sat</note> <note priority="1" from="description">sat</note>
<note priority="1" from="meaning">shared.sat</note> <note priority="1" from="meaning">shared.sat</note>
</trans-unit> </trans-unit>
<trans-unit id="0df32c0261b0de1a2601ba61b6f621db35d344a4" datatype="html"> <trans-unit id="e4b2d9e6a2ab9e6ca34027ec03beaac42b7badd4" datatype="html">
<source>sats</source> <source>sats</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/accelerate-preview/accelerate-preview.component.html</context> <context context-type="sourcefile">src/app/components/accelerate-preview/accelerate-preview.component.html</context>
@ -1532,8 +1544,67 @@
<context context-type="sourcefile">src/app/components/accelerate-preview/accelerate-preview.component.html</context> <context context-type="sourcefile">src/app/components/accelerate-preview/accelerate-preview.component.html</context>
<context context-type="linenumber">208</context> <context context-type="linenumber">208</context>
</context-group> </context-group>
<note priority="1" from="description">sats</note> <context-group purpose="location">
<note priority="1" from="meaning">shared.sats</note> <context context-type="sourcefile">src/app/components/calculator/calculator.component.html</context>
<context context-type="linenumber">29</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/calculator/calculator.component.html</context>
<context context-type="linenumber">44</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-list/channels-list.component.html</context>
<context context-type="linenumber">63</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-list/channels-list.component.html</context>
<context context-type="linenumber">87</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">63</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/group/group-preview.component.html</context>
<context context-type="linenumber">34</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/group/group.component.html</context>
<context context-type="linenumber">32</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/group/group.component.html</context>
<context context-type="linenumber">83</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/justice-list/justice-list.component.html</context>
<context context-type="linenumber">28</context>
</context-group>
<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">50</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country/nodes-per-country.component.html</context>
<context context-type="linenumber">22</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country/nodes-per-country.component.html</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp/nodes-per-isp.component.html</context>
<context context-type="linenumber">23</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp/nodes-per-isp.component.html</context>
<context context-type="linenumber">79</context>
</context-group>
<note priority="1" from="description">shared.sats</note>
</trans-unit> </trans-unit>
<trans-unit id="d2eb45d1cd8cd146b7cb0223ab97a4b03b614060" datatype="html"> <trans-unit id="d2eb45d1cd8cd146b7cb0223ab97a4b03b614060" datatype="html">
<source>sat/vB</source> <source>sat/vB</source>
@ -1872,6 +1943,10 @@
<context context-type="sourcefile">src/app/components/pool/pool.component.html</context> <context context-type="sourcefile">src/app/components/pool/pool.component.html</context>
<context context-type="linenumber">463</context> <context context-type="linenumber">463</context>
</context-group> </context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/rbf-list/rbf-list.component.html</context>
<context context-type="linenumber">9</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/statistics/statistics.component.html</context> <context context-type="sourcefile">src/app/components/statistics/statistics.component.html</context>
<context context-type="linenumber">60</context> <context context-type="linenumber">60</context>
@ -2469,6 +2544,10 @@
<context context-type="sourcefile">src/app/components/blocks-list/blocks-list.component.html</context> <context context-type="sourcefile">src/app/components/blocks-list/blocks-list.component.html</context>
<context context-type="linenumber">25</context> <context context-type="linenumber">25</context>
</context-group> </context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/clock/clock.component.html</context>
<context context-type="linenumber">54</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/mempool-block/mempool-block.component.html</context> <context context-type="sourcefile">src/app/components/mempool-block/mempool-block.component.html</context>
<context context-type="linenumber">36</context> <context context-type="linenumber">36</context>
@ -2742,6 +2821,10 @@
<context context-type="sourcefile">src/app/lightning/channel/closing-type/closing-type.component.ts</context> <context context-type="sourcefile">src/app/lightning/channel/closing-type/closing-type.component.ts</context>
<context context-type="linenumber">32</context> <context context-type="linenumber">32</context>
</context-group> </context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node-preview.component.html</context>
<context context-type="linenumber">52</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context> <context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
<context context-type="linenumber">58</context> <context context-type="linenumber">58</context>
@ -2857,6 +2940,35 @@
</context-group> </context-group>
<note priority="1" from="description">block.actual-block</note> <note priority="1" from="description">block.actual-block</note>
</trans-unit> </trans-unit>
<trans-unit id="65d5167c4947e3ad81758d238a7ac7e893c261f0" datatype="html">
<source>Taproot</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/block/block.component.html</context>
<context context-type="linenumber">265</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">12</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">16</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">21</context>
</context-group>
<note priority="1" from="description">Taproot</note>
<note priority="1" from="meaning">tx-features.tag.taproot</note>
</trans-unit>
<trans-unit id="fd04710d1a54d46cd1b81a13fc98e3d561b92141" datatype="html"> <trans-unit id="fd04710d1a54d46cd1b81a13fc98e3d561b92141" datatype="html">
<source>Bits</source> <source>Bits</source>
<context-group purpose="location"> <context-group purpose="location">
@ -3091,7 +3203,7 @@
</context-group> </context-group>
<note priority="1" from="description">dashboard.txs</note> <note priority="1" from="description">dashboard.txs</note>
</trans-unit> </trans-unit>
<trans-unit id="meta.title.blocks-list" datatype="html"> <trans-unit id="m8a7b4bd44c0ac71b2e72de0398b303257f7d2f54" datatype="html">
<source>Blocks</source> <source>Blocks</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/blocks-list/blocks-list.component.ts</context> <context context-type="sourcefile">src/app/components/blocks-list/blocks-list.component.ts</context>
@ -3131,65 +3243,48 @@
<context context-type="linenumber">19</context> <context context-type="linenumber">19</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="c1a2053754e3632bfa5ed0a8b5f8f5a993d9b862" datatype="html"> <trans-unit id="d1d0bb0a34b216be66137562a0b18eaaca546113" datatype="html">
<source>fiat price</source> <source>High Priority</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/clock/clock.component.html</context>
<context context-type="linenumber">41</context>
</context-group>
<note priority="1" from="description">clock.fiat-price</note>
</trans-unit>
<trans-unit id="ac930a014eca5c6261824c43888fb4162687039f" datatype="html">
<source>priority rate</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/clock/clock.component.html</context> <context context-type="sourcefile">src/app/components/clock/clock.component.html</context>
<context context-type="linenumber">47</context> <context context-type="linenumber">47</context>
</context-group> </context-group>
<note priority="1" from="description">priority fee rate</note>
<note priority="1" from="meaning">clock.priority-rate</note>
</trans-unit>
<trans-unit id="449ebe00d2d78db4891d8ce4836ce1abd3b90a98" datatype="html">
<source>block size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/clock/clock.component.html</context> <context context-type="sourcefile">src/app/components/fees-box/fees-box.component.html</context>
<context context-type="linenumber">54</context> <context context-type="linenumber">10</context>
</context-group> </context-group>
<note priority="1" from="description">clock.block-size</note>
</trans-unit>
<trans-unit id="46fb7c9aeee694a104674c692a432b4a0411bd77" datatype="html">
<source><x id="INTERPOLATION" equiv-text="&lt;span class=&quot;label&quot;&gt;transaction&lt;/span&gt;&lt;/ng-template&gt;
&lt;ng-template #transactionsPlur"/> <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;label&quot;&gt;"/>transaction<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/clock/clock.component.html</context> <context context-type="sourcefile">src/app/components/fees-box/fees-box.component.html</context>
<context context-type="linenumber">59,60</context> <context context-type="linenumber">47</context>
</context-group> </context-group>
<note priority="1" from="description">shared.transaction-count.singular</note> <note priority="1" from="description">fees-box.high-priority</note>
</trans-unit> </trans-unit>
<trans-unit id="17656d8a87079c27be95ac4eb0e24984178c17e5" datatype="html"> <trans-unit id="b7dde2cf8ec2fcd328295c9c7fcc944c4d3720b6" datatype="html">
<source><x id="INTERPOLATION" equiv-text="&lt;span class=&quot;label&quot;&gt;transactions&lt;/span&gt;&lt;/ng-template&gt; <source>Memory Usage</source>
&lt;/p&gt;
&lt;/div&gt;
&lt;ng-conta"/> <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;label&quot;&gt;"/>transactions<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/clock/clock.component.html</context> <context context-type="sourcefile">src/app/components/clock/clock.component.html</context>
<context context-type="linenumber">60,61</context> <context context-type="linenumber">65</context>
</context-group> </context-group>
<note priority="1" from="description">shared.transaction-count.plural</note>
</trans-unit>
<trans-unit id="328cf23ee20a77dbb24afcb5fe56e4c5d5c56580" datatype="html">
<source>memory usage</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/clock/clock.component.html</context> <context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
<context context-type="linenumber">66</context> <context context-type="linenumber">236</context>
</context-group> </context-group>
<note priority="1" from="description">Memory usage</note> <note priority="1" from="description">Memory usage</note>
<note priority="1" from="meaning">dashboard.memory-usage</note> <note priority="1" from="meaning">dashboard.memory-usage</note>
</trans-unit> </trans-unit>
<trans-unit id="9de66bf0ef8dd5fabd3c81ccf089c241a8333ce1" datatype="html"> <trans-unit id="60cd6fa18f925b42065d8cfb1a791efdc228b4c3" datatype="html">
<source>unconfirmed</source> <source>Unconfirmed</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/clock/clock.component.html</context> <context context-type="sourcefile">src/app/components/clock/clock.component.html</context>
<context context-type="linenumber">70</context> <context context-type="linenumber">69</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/footer/footer.component.html</context>
<context context-type="linenumber">20</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
<context context-type="linenumber">230</context>
</context-group> </context-group>
<note priority="1" from="description">Unconfirmed count</note> <note priority="1" from="description">Unconfirmed count</note>
<note priority="1" from="meaning">dashboard.unconfirmed</note> <note priority="1" from="meaning">dashboard.unconfirmed</note>
@ -3484,18 +3579,6 @@
</context-group> </context-group>
<note priority="1" from="description">Transaction feerate tooltip (high priority)</note> <note priority="1" from="description">Transaction feerate tooltip (high priority)</note>
</trans-unit> </trans-unit>
<trans-unit id="d1d0bb0a34b216be66137562a0b18eaaca546113" datatype="html">
<source>High Priority</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/fees-box/fees-box.component.html</context>
<context context-type="linenumber">10</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/fees-box/fees-box.component.html</context>
<context context-type="linenumber">47</context>
</context-group>
<note priority="1" from="description">fees-box.high-priority</note>
</trans-unit>
<trans-unit id="926c571b25cca7e2a294619f145960c0cd3848b6" datatype="html"> <trans-unit id="926c571b25cca7e2a294619f145960c0cd3848b6" datatype="html">
<source>Incoming transactions</source> <source>Incoming transactions</source>
<context-group purpose="location"> <context-group purpose="location">
@ -3529,27 +3612,18 @@
<note priority="1" from="description">vB/s</note> <note priority="1" from="description">vB/s</note>
<note priority="1" from="meaning">shared.vbytes-per-second</note> <note priority="1" from="meaning">shared.vbytes-per-second</note>
</trans-unit> </trans-unit>
<trans-unit id="d9678e2a050d1a9a583d5a566cad704534aaba94" datatype="html"> <trans-unit id="93168b4de564d2c5d21d67cf2fb263f27b45e4c8" datatype="html">
<source>WU/s</source> <source>WU/s</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/footer/footer.component.html</context> <context context-type="sourcefile">src/app/components/footer/footer.component.html</context>
<context context-type="linenumber">14</context> <context context-type="linenumber">14</context>
</context-group> </context-group>
<note priority="1" from="description">vB/s</note>
<note priority="1" from="meaning">shared.weight-units-per-second</note>
</trans-unit>
<trans-unit id="60cd6fa18f925b42065d8cfb1a791efdc228b4c3" datatype="html">
<source>Unconfirmed</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/footer/footer.component.html</context>
<context context-type="linenumber">20</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context> <context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
<context context-type="linenumber">230</context> <context context-type="linenumber">268</context>
</context-group> </context-group>
<note priority="1" from="description">Unconfirmed count</note> <note priority="1" from="description">WU/s</note>
<note priority="1" from="meaning">dashboard.unconfirmed</note> <note priority="1" from="meaning">shared.weight-per-second</note>
</trans-unit> </trans-unit>
<trans-unit id="6f7832e2e8db3c4b16c41681ba334a2ab9726cc3" datatype="html"> <trans-unit id="6f7832e2e8db3c4b16c41681ba334a2ab9726cc3" datatype="html">
<source>Mempool size</source> <source>Mempool size</source>
@ -3919,6 +3993,10 @@
<context context-type="sourcefile">src/app/components/mining-dashboard/mining-dashboard.component.html</context> <context context-type="sourcefile">src/app/components/mining-dashboard/mining-dashboard.component.html</context>
<context context-type="linenumber">52</context> <context context-type="linenumber">52</context>
</context-group> </context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
<context context-type="linenumber">113</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context> <context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context>
<context context-type="linenumber">44</context> <context context-type="linenumber">44</context>
@ -4255,8 +4333,8 @@
</context-group> </context-group>
<note priority="1" from="description">mining.hashrate</note> <note priority="1" from="description">mining.hashrate</note>
</trans-unit> </trans-unit>
<trans-unit id="72a917b41e60e5b8d5eb0f63648e6bfa2d4802cd" datatype="html"> <trans-unit id="3dc78651b2810cbb6e830fe7e57499d8cf6a8e4d" datatype="html">
<source>Blocks 24h</source> <source>Blocks (24h)</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/pool/pool.component.html</context> <context context-type="sourcefile">src/app/components/pool/pool.component.html</context>
<context context-type="linenumber">146</context> <context context-type="linenumber">146</context>
@ -4307,7 +4385,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/rbf-list/rbf-list.component.html</context> <context context-type="sourcefile">src/app/components/rbf-list/rbf-list.component.html</context>
<context context-type="linenumber">25</context> <context context-type="linenumber">23</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html</context> <context context-type="sourcefile">src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html</context>
@ -4384,13 +4462,21 @@
<context context-type="sourcefile">src/app/components/rbf-list/rbf-list.component.html</context> <context context-type="sourcefile">src/app/components/rbf-list/rbf-list.component.html</context>
<context context-type="linenumber">2</context> <context context-type="linenumber">2</context>
</context-group> </context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/rbf-list/rbf-list.component.ts</context>
<context context-type="linenumber">58</context>
</context-group>
<note priority="1" from="description">page.rbf-replacements</note> <note priority="1" from="description">page.rbf-replacements</note>
</trans-unit> </trans-unit>
<trans-unit id="8a9b3afe9486474f0d7767605fe99af99c8ea430" datatype="html"> <trans-unit id="8a9b3afe9486474f0d7767605fe99af99c8ea430" datatype="html">
<source>Full RBF</source> <source>Full RBF</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/rbf-list/rbf-list.component.html</context> <context context-type="sourcefile">src/app/components/rbf-list/rbf-list.component.html</context>
<context context-type="linenumber">26</context> <context context-type="linenumber">24</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html</context>
<context context-type="linenumber">35</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context> <context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
@ -4398,21 +4484,14 @@
</context-group> </context-group>
<note priority="1" from="description">transaction.full-rbf</note> <note priority="1" from="description">transaction.full-rbf</note>
</trans-unit> </trans-unit>
<trans-unit id="d669085bb6e73779113e37e297e7a15e864e39df" datatype="html"> <trans-unit id="c88914ee712e3ab5ad5f88de8a6ed12050919ccb" datatype="html">
<source>there are no replacements in the mempool yet!</source> <source>There are no replacements in the mempool yet!</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/rbf-list/rbf-list.component.html</context> <context context-type="sourcefile">src/app/components/rbf-list/rbf-list.component.html</context>
<context context-type="linenumber">36</context> <context context-type="linenumber">34</context>
</context-group> </context-group>
<note priority="1" from="description">rbf.no-replacements-yet</note> <note priority="1" from="description">rbf.no-replacements-yet</note>
</trans-unit> </trans-unit>
<trans-unit id="meta.title.rbf-list" datatype="html">
<source>RBF Replacements</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/rbf-list/rbf-list.component.ts</context>
<context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit id="meta.description.rbf-list" datatype="html"> <trans-unit id="meta.description.rbf-list" datatype="html">
<source>See the most recent RBF replacements on the Bitcoin<x id="PH" equiv-text="seoDescriptionNetwork(this.stateService.network)"/> network, updated in real-time.</source> <source>See the most recent RBF replacements on the Bitcoin<x id="PH" equiv-text="seoDescriptionNetwork(this.stateService.network)"/> network, updated in real-time.</source>
<context-group purpose="location"> <context-group purpose="location">
@ -4467,30 +4546,42 @@
<context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context> <context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
<context context-type="linenumber">88</context> <context context-type="linenumber">88</context>
</context-group> </context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-list/channels-list.component.html</context>
<context context-type="linenumber">40</context>
</context-group>
<note priority="1" from="description">Transaction Status</note> <note priority="1" from="description">Transaction Status</note>
<note priority="1" from="meaning">transaction.status</note> <note priority="1" from="meaning">transaction.status</note>
</trans-unit> </trans-unit>
<trans-unit id="bcfa763af07f14dd2693f89a361abd4dd2b50f26" datatype="html">
<source>Full RBF</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html</context>
<context context-type="linenumber">35</context>
</context-group>
<note priority="1" from="description">Full RBF</note>
<note priority="1" from="meaning">rbfInfo-features.tag.full-rbf</note>
</trans-unit>
<trans-unit id="eb3b032a755fc367f7f6e957d0c7dc9d6db49464" datatype="html"> <trans-unit id="eb3b032a755fc367f7f6e957d0c7dc9d6db49464" datatype="html">
<source>RBF</source> <source>RBF</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html</context> <context context-type="sourcefile">src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html</context>
<context context-type="linenumber">36</context> <context context-type="linenumber">36</context>
</context-group> </context-group>
<note priority="1" from="description">RBF</note>
<note priority="1" from="meaning">rbfInfo-features.tag.rbf</note>
</trans-unit>
<trans-unit id="f0e7d6d900658ee5ce66d8fef3637caf13891c53" datatype="html">
<source>RBF</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html</context> <context context-type="sourcefile">src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html</context>
<context context-type="linenumber">37</context> <context context-type="linenumber">37</context>
</context-group> </context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">28</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">29</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
<context context-type="linenumber">102</context>
</context-group>
<note priority="1" from="description">RBF</note> <note priority="1" from="description">RBF</note>
<note priority="1" from="meaning">rbfInfo-features.tag.rbf</note> <note priority="1" from="meaning">tx-features.tag.rbf</note>
</trans-unit> </trans-unit>
<trans-unit id="e48f3277d241b5e74b6e01a989a4ecb4495d3d25" datatype="html"> <trans-unit id="e48f3277d241b5e74b6e01a989a4ecb4495d3d25" datatype="html">
<source>Miners Reward</source> <source>Miners Reward</source>
@ -4662,13 +4753,17 @@
</context-group> </context-group>
<note priority="1" from="description">statistics.memory-by-vBytes</note> <note priority="1" from="description">statistics.memory-by-vBytes</note>
</trans-unit> </trans-unit>
<trans-unit id="29eb02d97585f4774f67ad19134453006b455b11" datatype="html"> <trans-unit id="d0e134a0886ae71207e912575d226525062b62f1" datatype="html">
<source>Clock view</source> <source>Clock (Mempool)</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/statistics/statistics.component.html</context> <context context-type="sourcefile">src/app/components/statistics/statistics.component.html</context>
<context context-type="linenumber">17</context> <context context-type="linenumber">17</context>
</context-group> </context-group>
<note priority="1" from="description">master-page.clockview</note> <context-group purpose="location">
<context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context>
<context context-type="linenumber">70</context>
</context-group>
<note priority="1" from="description">footer.clock-mempool</note>
</trans-unit> </trans-unit>
<trans-unit id="46ce8155c9ab953edeec97e8950b5a21e67d7c4e" datatype="html"> <trans-unit id="46ce8155c9ab953edeec97e8950b5a21e67d7c4e" datatype="html">
<source>TV view</source> <source>TV view</source>
@ -5339,31 +5434,6 @@
</context-group> </context-group>
<note priority="1" from="description">Tooltip about fees saved with taproot</note> <note priority="1" from="description">Tooltip about fees saved with taproot</note>
</trans-unit> </trans-unit>
<trans-unit id="65d5167c4947e3ad81758d238a7ac7e893c261f0" datatype="html">
<source>Taproot</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">12</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">16</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">21</context>
</context-group>
<note priority="1" from="description">Taproot</note>
<note priority="1" from="meaning">tx-features.tag.taproot</note>
</trans-unit>
<trans-unit id="47b821c7df420c96de0b22844a88c04d52628540" datatype="html"> <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: &apos;1.0-0&apos; }}"/>% on fees, but could save an additional <x id="INTERPOLATION_1" equiv-text="{{ segwitGains.potentialTaprootGains * 100 | number: &apos;1.0-0&apos; }}"/>% by fully using Taproot</source> <source>This transaction uses Taproot and already saved at least <x id="INTERPOLATION" equiv-text="{{ segwitGains.realizedTaprootGains * 100 | number: &apos;1.0-0&apos; }}"/>% on fees, but could save an additional <x id="INTERPOLATION_1" equiv-text="{{ segwitGains.potentialTaprootGains * 100 | number: &apos;1.0-0&apos; }}"/>% by fully using Taproot</source>
<context-group purpose="location"> <context-group purpose="location">
@ -5404,19 +5474,6 @@
</context-group> </context-group>
<note priority="1" from="description">RBF tooltip</note> <note priority="1" from="description">RBF tooltip</note>
</trans-unit> </trans-unit>
<trans-unit id="f0e7d6d900658ee5ce66d8fef3637caf13891c53" datatype="html">
<source>RBF</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">28</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-features/tx-features.component.html</context>
<context context-type="linenumber">29</context>
</context-group>
<note priority="1" from="description">RBF</note>
<note priority="1" from="meaning">tx-features.tag.rbf</note>
</trans-unit>
<trans-unit id="85ce9e4f45873116b746899169cbc3445321d60c" datatype="html"> <trans-unit id="85ce9e4f45873116b746899169cbc3445321d60c" datatype="html">
<source>This transaction does NOT support Replace-By-Fee (RBF) and cannot be fee bumped using this method</source> <source>This transaction does NOT support Replace-By-Fee (RBF) and cannot be fee bumped using this method</source>
<context-group purpose="location"> <context-group purpose="location">
@ -5491,22 +5548,6 @@
</context-group> </context-group>
<note priority="1" from="description">dashboard.new-transaction-fee</note> <note priority="1" from="description">dashboard.new-transaction-fee</note>
</trans-unit> </trans-unit>
<trans-unit id="6c657ff25c8e7953c2ac10600fe06cb6c150c0fe" datatype="html">
<source>RBF</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
<context context-type="linenumber">102</context>
</context-group>
<note priority="1" from="description">transaction.rbf</note>
</trans-unit>
<trans-unit id="ff3cc795c751d530669fd34cf474882fb02ebdbd" datatype="html">
<source>Recent blocks</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
<context context-type="linenumber">113</context>
</context-group>
<note priority="1" from="description">dashboard.recent-block</note>
</trans-unit>
<trans-unit id="aa6ce7e6e6fe5cd080713965451f25bca15a2a25" datatype="html"> <trans-unit id="aa6ce7e6e6fe5cd080713965451f25bca15a2a25" datatype="html">
<source>Recent Transactions</source> <source>Recent Transactions</source>
<context-group purpose="location"> <context-group purpose="location">
@ -5533,15 +5574,6 @@
<note priority="1" from="description">Purgin below fee</note> <note priority="1" from="description">Purgin below fee</note>
<note priority="1" from="meaning">dashboard.purging</note> <note priority="1" from="meaning">dashboard.purging</note>
</trans-unit> </trans-unit>
<trans-unit id="b7dde2cf8ec2fcd328295c9c7fcc944c4d3720b6" datatype="html">
<source>Memory Usage</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
<context context-type="linenumber">236</context>
</context-group>
<note priority="1" from="description">Memory usage</note>
<note priority="1" from="meaning">dashboard.memory-usage</note>
</trans-unit>
<trans-unit id="eb7a000cd340b44291d790f7b56f7b926edc275b" datatype="html"> <trans-unit id="eb7a000cd340b44291d790f7b56f7b926edc275b" datatype="html">
<source>L-BTC in circulation</source> <source>L-BTC in circulation</source>
<context-group purpose="location"> <context-group purpose="location">
@ -5558,24 +5590,11 @@
</context-group> </context-group>
<note priority="1" from="description">dashboard.incoming-transactions</note> <note priority="1" from="description">dashboard.incoming-transactions</note>
</trans-unit> </trans-unit>
<trans-unit id="93168b4de564d2c5d21d67cf2fb263f27b45e4c8" datatype="html"> <trans-unit id="999bb1a0150c2815a6b4dd64a1850e763603e525" datatype="html">
<source>WU/s</source> <source><x id="START_PARAGRAPH" ctype="x-p" equiv-text="For any such requ"/><x id="START_BOLD_TEXT" ctype="x-b" equiv-text="mempool.space mer"/>mempool.space merely provides data about the Bitcoin network.<x id="CLOSE_BOLD_TEXT" ctype="x-b" equiv-text="&lt;/b&gt;"/> It cannot help you with retrieving funds, wallet issues, etc.<x id="CLOSE_PARAGRAPH" ctype="x-p" equiv-text="&lt;/p&gt;"/><x id="START_PARAGRAPH" ctype="x-p" equiv-text="For any such requ"/>For any such requests, you need to get in touch with the entity that helped make the transaction (wallet software, exchange company, etc).<x id="CLOSE_PARAGRAPH" ctype="x-p" equiv-text="&lt;/p&gt;"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
<context context-type="linenumber">268</context>
</context-group>
<note priority="1" from="description">WU/s</note>
<note priority="1" from="meaning">shared.weight-per-second</note>
</trans-unit>
<trans-unit id="30ef953d2dc6ccaa55a272d5f38cccfdbb986b65" datatype="html">
<source><x id="START_BOLD_TEXT" ctype="x-b" equiv-text="mempool.space merely provides data about the Bitcoin network.&lt;/b&gt; It cannot help"/>mempool.space merely provides data about the Bitcoin network.<x id="CLOSE_BOLD_TEXT" ctype="x-b" equiv-text="&lt;/b&gt;"/> It cannot help you with retrieving funds, wallet issues, etc.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/docs/api-docs/api-docs.component.html</context> <context context-type="sourcefile">src/app/docs/api-docs/api-docs.component.html</context>
<context context-type="linenumber">13</context> <context context-type="linenumber">15,16</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/docs/api-docs/api-docs.component.html</context>
<context context-type="linenumber">14</context>
</context-group> </context-group>
<note priority="1" from="description">faq.big-disclaimer</note> <note priority="1" from="description">faq.big-disclaimer</note>
</trans-unit> </trans-unit>
@ -5721,6 +5740,20 @@
<context context-type="linenumber">63</context> <context context-type="linenumber">63</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="meta.title.docs.electrum" datatype="html">
<source>Electrum RPC</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/docs/docs/docs.component.ts</context>
<context context-type="linenumber">67</context>
</context-group>
</trans-unit>
<trans-unit id="meta.description.docs.electrumrpc" datatype="html">
<source>Documentation for our Electrum RPC interface: get instant, convenient, and reliable access to an Esplora instance.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/docs/docs/docs.component.ts</context>
<context context-type="linenumber">68</context>
</context-group>
</trans-unit>
<trans-unit id="4ca458fe3274d1c79640b052d57cf3b900b650b6" datatype="html"> <trans-unit id="4ca458fe3274d1c79640b052d57cf3b900b650b6" datatype="html">
<source>Base fee</source> <source>Base fee</source>
<context-group purpose="location"> <context-group purpose="location">
@ -6186,14 +6219,6 @@
</context-group> </context-group>
<note priority="1" from="description">lightning.alias</note> <note priority="1" from="description">lightning.alias</note>
</trans-unit> </trans-unit>
<trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1" datatype="html">
<source>Status</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-list/channels-list.component.html</context>
<context context-type="linenumber">40</context>
</context-group>
<note priority="1" from="description">status</note>
</trans-unit>
<trans-unit id="0cd107458dce99721e72971d426a5a3106074331" datatype="html"> <trans-unit id="0cd107458dce99721e72971d426a5a3106074331" datatype="html">
<source>Channel ID</source> <source>Channel ID</source>
<context-group purpose="location"> <context-group purpose="location">
@ -6206,62 +6231,6 @@
</context-group> </context-group>
<note priority="1" from="description">channels.id</note> <note priority="1" from="description">channels.id</note>
</trans-unit> </trans-unit>
<trans-unit id="e4b2d9e6a2ab9e6ca34027ec03beaac42b7badd4" datatype="html">
<source>sats</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-list/channels-list.component.html</context>
<context context-type="linenumber">63</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-list/channels-list.component.html</context>
<context context-type="linenumber">87</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channels-statistics/channels-statistics.component.html</context>
<context context-type="linenumber">63</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/group/group-preview.component.html</context>
<context context-type="linenumber">34</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/group/group.component.html</context>
<context context-type="linenumber">32</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/group/group.component.html</context>
<context context-type="linenumber">83</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/justice-list/justice-list.component.html</context>
<context context-type="linenumber">28</context>
</context-group>
<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">50</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country/nodes-per-country.component.html</context>
<context context-type="linenumber">22</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country/nodes-per-country.component.html</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp/nodes-per-isp.component.html</context>
<context context-type="linenumber">23</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-isp/nodes-per-isp.component.html</context>
<context context-type="linenumber">79</context>
</context-group>
<note priority="1" from="description">shared.sats</note>
</trans-unit>
<trans-unit id="cfcc7201138b0ef9901e9604c35f550e91629295" datatype="html"> <trans-unit id="cfcc7201138b0ef9901e9604c35f550e91629295" datatype="html">
<source>avg</source> <source>avg</source>
<context-group purpose="location"> <context-group purpose="location">
@ -6815,14 +6784,6 @@
</context-group> </context-group>
<note priority="1" from="description">tor</note> <note priority="1" from="description">tor</note>
</trans-unit> </trans-unit>
<trans-unit id="6cdb1fea93d77c07950c0c76c6e0ad79ebbef084" datatype="html">
<source>Features</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
<context context-type="linenumber">122</context>
</context-group>
<note priority="1" from="description">lightning.features</note>
</trans-unit>
<trans-unit id="a737eb6814b234b0fd00e81b645b95a396711f15" datatype="html"> <trans-unit id="a737eb6814b234b0fd00e81b645b95a396711f15" datatype="html">
<source>Decoded</source> <source>Decoded</source>
<context-group purpose="location"> <context-group purpose="location">
@ -7483,8 +7444,8 @@
</context-group> </context-group>
<note priority="1" from="description">faq.why-isnt-my-transaction-confirming</note> <note priority="1" from="description">faq.why-isnt-my-transaction-confirming</note>
</trans-unit> </trans-unit>
<trans-unit id="7c68ef2d3d91cb3a67edf6213b75c22cbc31867b" datatype="html"> <trans-unit id="03f766a5a2abdbfbdcc2b6135691b9fb1f2ed530" datatype="html">
<source>More FAQs </source> <source>More FAQs »</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context> <context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context>
<context context-type="linenumber">55</context> <context context-type="linenumber">55</context>
@ -7555,14 +7516,6 @@
</context-group> </context-group>
<note priority="1" from="description">footer.tools</note> <note priority="1" from="description">footer.tools</note>
</trans-unit> </trans-unit>
<trans-unit id="d0e134a0886ae71207e912575d226525062b62f1" datatype="html">
<source>Clock (Mempool)</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context>
<context context-type="linenumber">70</context>
</context-group>
<note priority="1" from="description">footer.clock-mempool</note>
</trans-unit>
<trans-unit id="8c23995422ac012b80a2369a878b199c39271906" datatype="html"> <trans-unit id="8c23995422ac012b80a2369a878b199c39271906" datatype="html">
<source>Clock (Mined)</source> <source>Clock (Mined)</source>
<context-group purpose="location"> <context-group purpose="location">

File diff suppressed because it is too large Load Diff