Merge branch 'master' into mononaut/esplora-only-address-graph
This commit is contained in:
commit
1a3b8580e7
@ -9,8 +9,8 @@ class BackendInfo {
|
|||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
// This file is created by ./fetch-version.ts during building
|
// This file is created by ./fetch-version.ts during building
|
||||||
const versionFile = path.join(__dirname, 'version.json')
|
const versionFile = path.join(__dirname, 'version.json');
|
||||||
var versionInfo;
|
let versionInfo;
|
||||||
if (fs.existsSync(versionFile)) {
|
if (fs.existsSync(versionFile)) {
|
||||||
versionInfo = JSON.parse(fs.readFileSync(versionFile).toString());
|
versionInfo = JSON.parse(fs.readFileSync(versionFile).toString());
|
||||||
} else {
|
} else {
|
||||||
@ -24,7 +24,8 @@ class BackendInfo {
|
|||||||
hostname: os.hostname(),
|
hostname: os.hostname(),
|
||||||
version: versionInfo.version,
|
version: versionInfo.version,
|
||||||
gitCommit: versionInfo.gitCommit,
|
gitCommit: versionInfo.gitCommit,
|
||||||
lightning: config.LIGHTNING.ENABLED
|
lightning: config.LIGHTNING.ENABLED,
|
||||||
|
backend: config.MEMPOOL.BACKEND,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -32,7 +33,7 @@ class BackendInfo {
|
|||||||
return this.backendInfo;
|
return this.backendInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
public getShortCommitHash() {
|
public getShortCommitHash(): string {
|
||||||
return this.backendInfo.gitCommit.slice(0, 7);
|
return this.backendInfo.gitCommit.slice(0, 7);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -455,6 +455,7 @@ export interface IBackendInfo {
|
|||||||
gitCommit: string;
|
gitCommit: string;
|
||||||
version: string;
|
version: string;
|
||||||
lightning: boolean;
|
lightning: boolean;
|
||||||
|
backend: 'esplora' | 'electrum' | 'none';
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IDifficultyAdjustment {
|
export interface IDifficultyAdjustment {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
FROM node:20.11.1-buster-slim AS builder
|
FROM node:20.12.0-buster-slim AS builder
|
||||||
|
|
||||||
ARG commitHash
|
ARG commitHash
|
||||||
ENV MEMPOOL_COMMIT_HASH=${commitHash}
|
ENV MEMPOOL_COMMIT_HASH=${commitHash}
|
||||||
@ -17,7 +17,7 @@ ENV PATH="/root/.cargo/bin:$PATH"
|
|||||||
RUN npm install --omit=dev --omit=optional
|
RUN npm install --omit=dev --omit=optional
|
||||||
RUN npm run package
|
RUN npm run package
|
||||||
|
|
||||||
FROM node:20.11.1-buster-slim
|
FROM node:20.12.0-buster-slim
|
||||||
|
|
||||||
WORKDIR /backend
|
WORKDIR /backend
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
FROM node:20.11.1-buster-slim AS builder
|
FROM node:20.12.0-buster-slim AS builder
|
||||||
|
|
||||||
ARG commitHash
|
ARG commitHash
|
||||||
ENV DOCKER_COMMIT_HASH=${commitHash}
|
ENV DOCKER_COMMIT_HASH=${commitHash}
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
"@typescript-eslint/no-this-alias": 1,
|
"@typescript-eslint/no-this-alias": 1,
|
||||||
"@typescript-eslint/no-var-requires": 1,
|
"@typescript-eslint/no-var-requires": 1,
|
||||||
"@typescript-eslint/explicit-function-return-type": 1,
|
"@typescript-eslint/explicit-function-return-type": 1,
|
||||||
|
"@typescript-eslint/no-unused-vars": 1,
|
||||||
"no-case-declarations": 1,
|
"no-case-declarations": 1,
|
||||||
"no-console": 1,
|
"no-console": 1,
|
||||||
"no-constant-condition": 1,
|
"no-constant-condition": 1,
|
||||||
|
@ -223,11 +223,11 @@
|
|||||||
"serve": {
|
"serve": {
|
||||||
"builder": "@angular-devkit/build-angular:dev-server",
|
"builder": "@angular-devkit/build-angular:dev-server",
|
||||||
"options": {
|
"options": {
|
||||||
"browserTarget": "mempool:build"
|
"buildTarget": "mempool:build"
|
||||||
},
|
},
|
||||||
"configurations": {
|
"configurations": {
|
||||||
"production": {
|
"production": {
|
||||||
"browserTarget": "mempool:build:production"
|
"buildTarget": "mempool:build:production"
|
||||||
},
|
},
|
||||||
"local": {
|
"local": {
|
||||||
"proxyConfig": "proxy.conf.local.js",
|
"proxyConfig": "proxy.conf.local.js",
|
||||||
@ -264,7 +264,7 @@
|
|||||||
"extract-i18n": {
|
"extract-i18n": {
|
||||||
"builder": "@angular-devkit/build-angular:extract-i18n",
|
"builder": "@angular-devkit/build-angular:extract-i18n",
|
||||||
"options": {
|
"options": {
|
||||||
"browserTarget": "mempool:build"
|
"buildTarget": "mempool:build"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"e2e": {
|
"e2e": {
|
||||||
@ -303,7 +303,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"serve-ssr": {
|
"serve-ssr": {
|
||||||
"builder": "@nguniversal/builders:ssr-dev-server",
|
"builder": "@angular-devkit/build-angular:ssr-dev-server",
|
||||||
"options": {
|
"options": {
|
||||||
"browserTarget": "mempool:build",
|
"browserTarget": "mempool:build",
|
||||||
"serverTarget": "mempool:server"
|
"serverTarget": "mempool:server"
|
||||||
@ -318,7 +318,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"prerender": {
|
"prerender": {
|
||||||
"builder": "@nguniversal/builders:prerender",
|
"builder": "@angular-devkit/build-angular:prerender",
|
||||||
"options": {
|
"options": {
|
||||||
"browserTarget": "mempool:build:production",
|
"browserTarget": "mempool:build:production",
|
||||||
"serverTarget": "mempool:server:production",
|
"serverTarget": "mempool:server:production",
|
||||||
|
11999
frontend/package-lock.json
generated
11999
frontend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -64,24 +64,25 @@
|
|||||||
"cypress:run:ci:staging": "node update-config.js TESTNET_ENABLED=true SIGNET_ENABLED=true LIQUID_ENABLED=true BISQ_ENABLED=true ITEMS_PER_PAGE=25 && npm run generate-config && start-server-and-test serve:local-staging 4200 cypress:run:record"
|
"cypress:run:ci:staging": "node update-config.js TESTNET_ENABLED=true SIGNET_ENABLED=true LIQUID_ENABLED=true BISQ_ENABLED=true ITEMS_PER_PAGE=25 && npm run generate-config && start-server-and-test serve:local-staging 4200 cypress:run:record"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@angular-devkit/build-angular": "^16.1.1",
|
"@angular-devkit/build-angular": "^17.3.1",
|
||||||
"@angular/animations": "^16.1.1",
|
"@angular/animations": "^17.3.1",
|
||||||
"@angular/cli": "^16.1.1",
|
"@angular/cli": "^17.3.1",
|
||||||
"@angular/common": "^16.1.1",
|
"@angular/common": "^17.3.1",
|
||||||
"@angular/compiler": "^16.1.1",
|
"@angular/compiler": "^17.3.1",
|
||||||
"@angular/core": "^16.1.1",
|
"@angular/core": "^17.3.1",
|
||||||
"@angular/forms": "^16.1.1",
|
"@angular/forms": "^17.3.1",
|
||||||
"@angular/localize": "^16.1.1",
|
"@angular/localize": "^17.3.1",
|
||||||
"@angular/platform-browser": "^16.1.1",
|
"@angular/platform-browser": "^17.3.1",
|
||||||
"@angular/platform-browser-dynamic": "^16.1.1",
|
"@angular/platform-browser-dynamic": "^17.3.1",
|
||||||
"@angular/platform-server": "^16.1.1",
|
"@angular/platform-server": "^17.3.1",
|
||||||
"@angular/router": "^16.1.1",
|
"@angular/router": "^17.3.1",
|
||||||
"@fortawesome/angular-fontawesome": "~0.13.0",
|
"@angular/ssr": "^17.3.1",
|
||||||
|
"@fortawesome/angular-fontawesome": "~0.14.1",
|
||||||
"@fortawesome/fontawesome-common-types": "~6.5.1",
|
"@fortawesome/fontawesome-common-types": "~6.5.1",
|
||||||
"@fortawesome/fontawesome-svg-core": "~6.5.1",
|
"@fortawesome/fontawesome-svg-core": "~6.5.1",
|
||||||
"@fortawesome/free-solid-svg-icons": "~6.5.1",
|
"@fortawesome/free-solid-svg-icons": "~6.5.1",
|
||||||
"@mempool/mempool.js": "2.3.0",
|
"@mempool/mempool.js": "2.3.0",
|
||||||
"@ng-bootstrap/ng-bootstrap": "^15.1.0",
|
"@ng-bootstrap/ng-bootstrap": "^16.0.0",
|
||||||
"@types/qrcode": "~1.5.0",
|
"@types/qrcode": "~1.5.0",
|
||||||
"bootstrap": "~4.6.2",
|
"bootstrap": "~4.6.2",
|
||||||
"browserify": "^17.0.0",
|
"browserify": "^17.0.0",
|
||||||
@ -89,29 +90,29 @@
|
|||||||
"domino": "^2.1.6",
|
"domino": "^2.1.6",
|
||||||
"echarts": "~5.5.0",
|
"echarts": "~5.5.0",
|
||||||
"lightweight-charts": "~3.8.0",
|
"lightweight-charts": "~3.8.0",
|
||||||
"ngx-echarts": "~16.2.0",
|
"ngx-echarts": "~17.1.0",
|
||||||
"ngx-infinite-scroll": "^16.0.0",
|
"ngx-infinite-scroll": "^17.0.0",
|
||||||
"qrcode": "1.5.1",
|
"qrcode": "1.5.1",
|
||||||
"rxjs": "~7.8.1",
|
"rxjs": "~7.8.1",
|
||||||
"tinyify": "^3.1.0",
|
"esbuild": "^0.20.2",
|
||||||
|
"tinyify": "^4.0.0",
|
||||||
"tlite": "^0.1.9",
|
"tlite": "^0.1.9",
|
||||||
"tslib": "~2.6.0",
|
"tslib": "~2.6.0",
|
||||||
"zone.js": "~0.13.1"
|
"zone.js": "~0.14.4"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@angular/compiler-cli": "^16.1.1",
|
"@angular/compiler-cli": "^17.3.1",
|
||||||
"@angular/language-service": "^16.1.1",
|
"@angular/language-service": "^17.3.1",
|
||||||
"@nguniversal/builders": "16.1.1",
|
|
||||||
"@nguniversal/express-engine": "16.1.1",
|
|
||||||
"@types/node": "^18.11.9",
|
"@types/node": "^18.11.9",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.48.1",
|
"@typescript-eslint/eslint-plugin": "^7.4.0",
|
||||||
"@typescript-eslint/parser": "^5.48.1",
|
"@typescript-eslint/parser": "^7.4.0",
|
||||||
"eslint": "^8.31.0",
|
"eslint": "^8.57.0",
|
||||||
|
"browser-sync": "^3.0.0",
|
||||||
"http-proxy-middleware": "~2.0.6",
|
"http-proxy-middleware": "~2.0.6",
|
||||||
"prettier": "^3.0.0",
|
"prettier": "^3.0.0",
|
||||||
"source-map-support": "^0.5.21",
|
"source-map-support": "^0.5.21",
|
||||||
"ts-node": "~10.9.1",
|
"ts-node": "~10.9.1",
|
||||||
"typescript": "~4.9.3"
|
"typescript": "~5.4.3"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@cypress/schematic": "^2.5.0",
|
"@cypress/schematic": "^2.5.0",
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import 'zone.js/dist/zone-node';
|
|
||||||
import './src/resources/config.js';
|
import './src/resources/config.js';
|
||||||
|
|
||||||
import * as domino from 'domino';
|
import * as domino from 'domino';
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
import 'zone.js/dist/zone-node';
|
import 'zone.js';
|
||||||
import './src/resources/config.js';
|
import './src/resources/config.js';
|
||||||
|
|
||||||
import { ngExpressEngine } from '@nguniversal/express-engine';
|
import { CommonEngine } from '@angular/ssr';
|
||||||
import * as express from 'express';
|
import * as express from 'express';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as domino from 'domino';
|
import * as domino from 'domino';
|
||||||
import { createProxyMiddleware } from 'http-proxy-middleware';
|
|
||||||
|
|
||||||
import { join } from 'path';
|
import { join } from 'path';
|
||||||
import { AppServerModule } from './src/main.server';
|
import { AppServerModule } from './src/main.server';
|
||||||
@ -15,6 +14,8 @@ import { existsSync } from 'fs';
|
|||||||
|
|
||||||
import { ResizeObserver } from './shims';
|
import { ResizeObserver } from './shims';
|
||||||
|
|
||||||
|
const commonEngine = new CommonEngine();
|
||||||
|
|
||||||
const template = fs.readFileSync(path.join(process.cwd(), 'dist/mempool/browser/en-US/', 'index.html')).toString();
|
const template = fs.readFileSync(path.join(process.cwd(), 'dist/mempool/browser/en-US/', 'index.html')).toString();
|
||||||
const win = domino.createWindow(template);
|
const win = domino.createWindow(template);
|
||||||
|
|
||||||
@ -58,35 +59,32 @@ global['localStorage'] = {
|
|||||||
export function app(locale: string): express.Express {
|
export function app(locale: string): express.Express {
|
||||||
const server = express();
|
const server = express();
|
||||||
const distFolder = join(process.cwd(), `dist/mempool/browser/${locale}`);
|
const distFolder = join(process.cwd(), `dist/mempool/browser/${locale}`);
|
||||||
const indexHtml = existsSync(join(distFolder, 'index.original.html')) ? 'index.original.html' : 'index';
|
const indexHtml = join(distFolder, 'index.html');
|
||||||
|
|
||||||
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
|
|
||||||
server.engine('html', ngExpressEngine({
|
|
||||||
bootstrap: AppServerModule,
|
|
||||||
}));
|
|
||||||
|
|
||||||
server.set('view engine', 'html');
|
server.set('view engine', 'html');
|
||||||
server.set('views', distFolder);
|
server.set('views', distFolder);
|
||||||
|
|
||||||
|
|
||||||
// static file handler so we send HTTP 404 to nginx
|
// static file handler so we send HTTP 404 to nginx
|
||||||
server.get('/**.(css|js|json|ico|webmanifest|png|jpg|jpeg|svg|mp4)*', express.static(distFolder, { maxAge: '1y', fallthrough: false }));
|
server.get('/**.(css|js|json|ico|webmanifest|png|jpg|jpeg|svg|mp4)*', express.static(distFolder, { maxAge: '1y', fallthrough: false }));
|
||||||
// handle page routes
|
// handle page routes
|
||||||
server.get('/**', getLocalizedSSR(indexHtml));
|
server.get('*', (req, res, next) => {
|
||||||
|
const { protocol, originalUrl, baseUrl, headers } = req;
|
||||||
|
|
||||||
|
commonEngine
|
||||||
|
.render({
|
||||||
|
bootstrap: AppServerModule,
|
||||||
|
documentFilePath: indexHtml,
|
||||||
|
url: `${protocol}://${headers.host}${originalUrl}`,
|
||||||
|
publicPath: distFolder,
|
||||||
|
providers: [{ provide: APP_BASE_HREF, useValue: baseUrl }],
|
||||||
|
})
|
||||||
|
.then((html) => res.send(html))
|
||||||
|
.catch((err) => next(err));
|
||||||
|
});
|
||||||
|
|
||||||
return server;
|
return server;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLocalizedSSR(indexHtml) {
|
|
||||||
return (req, res) => {
|
|
||||||
res.render(indexHtml, {
|
|
||||||
req,
|
|
||||||
providers: [
|
|
||||||
{ provide: APP_BASE_HREF, useValue: req.baseUrl }
|
|
||||||
]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// only used for development mode
|
// only used for development mode
|
||||||
function run(): void {
|
function run(): void {
|
||||||
@ -108,5 +106,3 @@ const moduleFilename = mainModule && mainModule.filename || '';
|
|||||||
if (moduleFilename === __filename || moduleFilename.includes('iisnode')) {
|
if (moduleFilename === __filename || moduleFilename.includes('iisnode')) {
|
||||||
run();
|
run();
|
||||||
}
|
}
|
||||||
|
|
||||||
export * from './src/main.server';
|
|
@ -265,8 +265,8 @@ export class IncomingTransactionsGraphComponent implements OnInit, OnChanges, On
|
|||||||
type: 'value',
|
type: 'value',
|
||||||
axisLabel: {
|
axisLabel: {
|
||||||
fontSize: 11,
|
fontSize: 11,
|
||||||
formatter: (value) => {
|
formatter: (value): string => {
|
||||||
return this.weightMode ? value * 4 : value;
|
return this.weightMode ? (value * 4).toString() : value.toString();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
splitLine: {
|
splitLine: {
|
||||||
|
@ -20,10 +20,12 @@
|
|||||||
-
|
-
|
||||||
<app-fee-rate [fee]="projectedBlock.feeRange[projectedBlock.feeRange.length - 1]" rounding="1.0-0" unitClass=""></app-fee-rate>
|
<app-fee-rate [fee]="projectedBlock.feeRange[projectedBlock.feeRange.length - 1]" rounding="1.0-0" unitClass=""></app-fee-rate>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="showMiningInfo" class="block-size">
|
<div *ngIf="showMiningInfo$ | async; else noMiningInfo" class="block-size">
|
||||||
<app-amount [attr.data-cy]="'mempool-block-' + i + '-total-fees'" [satoshis]="projectedBlock.totalFees" digitsInfo="1.2-3" [noFiat]="true"></app-amount>
|
<app-amount [attr.data-cy]="'mempool-block-' + i + '-total-fees'" [satoshis]="projectedBlock.totalFees" digitsInfo="1.2-3" [noFiat]="true"></app-amount>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="!showMiningInfo" class="block-size" [innerHTML]="'‎' + (projectedBlock.blockSize | bytes: 2)"></div>
|
<ng-template #noMiningInfo>
|
||||||
|
<div class="block-size" [innerHTML]="'‎' + (projectedBlock.blockSize | bytes: 2)"></div>
|
||||||
|
</ng-template>
|
||||||
<div [attr.data-cy]="'mempool-block-' + i + '-transaction-count'" class="transaction-count">
|
<div [attr.data-cy]="'mempool-block-' + i + '-transaction-count'" class="transaction-count">
|
||||||
<ng-container *ngTemplateOutlet="projectedBlock.nTx === 1 ? transactionsSingular : transactionsPlural; context: {$implicit: projectedBlock.nTx | number}"></ng-container>
|
<ng-container *ngTemplateOutlet="projectedBlock.nTx === 1 ? transactionsSingular : transactionsPlural; context: {$implicit: projectedBlock.nTx | number}"></ng-container>
|
||||||
<ng-template #transactionsSingular let-i i18n="shared.transaction-count.singular">{{ i }} transaction</ng-template>
|
<ng-template #transactionsSingular let-i i18n="shared.transaction-count.singular">{{ i }} transaction</ng-template>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef, HostListener, Input, OnChanges, SimpleChanges, Output, EventEmitter } from '@angular/core';
|
import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef, HostListener, Input, OnChanges, SimpleChanges, Output, EventEmitter } from '@angular/core';
|
||||||
import { Subscription, Observable, of, combineLatest } from 'rxjs';
|
import { Subscription, Observable, of, combineLatest, BehaviorSubject } from 'rxjs';
|
||||||
import { MempoolBlock } from '../../interfaces/websocket.interface';
|
import { MempoolBlock } from '../../interfaces/websocket.interface';
|
||||||
import { StateService } from '../../services/state.service';
|
import { StateService } from '../../services/state.service';
|
||||||
import { Router } from '@angular/router';
|
import { Router } from '@angular/router';
|
||||||
@ -42,6 +42,7 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy {
|
|||||||
mempoolBlocks$: Observable<MempoolBlock[]>;
|
mempoolBlocks$: Observable<MempoolBlock[]>;
|
||||||
difficultyAdjustments$: Observable<DifficultyAdjustment>;
|
difficultyAdjustments$: Observable<DifficultyAdjustment>;
|
||||||
loadingBlocks$: Observable<boolean>;
|
loadingBlocks$: Observable<boolean>;
|
||||||
|
showMiningInfo$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
|
||||||
blocksSubscription: Subscription;
|
blocksSubscription: Subscription;
|
||||||
|
|
||||||
mempoolBlocksFull: MempoolBlock[] = [];
|
mempoolBlocksFull: MempoolBlock[] = [];
|
||||||
@ -57,10 +58,8 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy {
|
|||||||
network = '';
|
network = '';
|
||||||
now = new Date().getTime();
|
now = new Date().getTime();
|
||||||
timeOffset = 0;
|
timeOffset = 0;
|
||||||
showMiningInfo = false;
|
|
||||||
timeLtrSubscription: Subscription;
|
timeLtrSubscription: Subscription;
|
||||||
timeLtr: boolean;
|
timeLtr: boolean;
|
||||||
showMiningInfoSubscription: Subscription;
|
|
||||||
animateEntry: boolean = false;
|
animateEntry: boolean = false;
|
||||||
|
|
||||||
blockOffset: number = 155;
|
blockOffset: number = 155;
|
||||||
@ -98,10 +97,7 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy {
|
|||||||
this.widthChange.emit(this.mempoolWidth);
|
this.widthChange.emit(this.mempoolWidth);
|
||||||
|
|
||||||
if (['', 'testnet', 'signet'].includes(this.stateService.network)) {
|
if (['', 'testnet', 'signet'].includes(this.stateService.network)) {
|
||||||
this.showMiningInfoSubscription = this.stateService.showMiningInfo$.subscribe((showMiningInfo) => {
|
this.showMiningInfo$ = this.stateService.showMiningInfo$;
|
||||||
this.showMiningInfo = showMiningInfo;
|
|
||||||
this.cd.markForCheck();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.timeLtrSubscription = this.stateService.timeLtr.subscribe((ltr) => {
|
this.timeLtrSubscription = this.stateService.timeLtr.subscribe((ltr) => {
|
||||||
@ -267,7 +263,6 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy {
|
|||||||
this.chainTipSubscription.unsubscribe();
|
this.chainTipSubscription.unsubscribe();
|
||||||
this.keySubscription.unsubscribe();
|
this.keySubscription.unsubscribe();
|
||||||
this.isTabHiddenSubscription.unsubscribe();
|
this.isTabHiddenSubscription.unsubscribe();
|
||||||
this.showMiningInfoSubscription.unsubscribe();
|
|
||||||
clearTimeout(this.resetTransitionTimeout);
|
clearTimeout(this.resetTransitionTimeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -411,7 +411,6 @@ export class MempoolGraphComponent implements OnInit, OnChanges {
|
|||||||
padding: [20, 0, 0, 0],
|
padding: [20, 0, 0, 0],
|
||||||
},
|
},
|
||||||
type: 'time',
|
type: 'time',
|
||||||
boundaryGap: false,
|
|
||||||
axisLine: { onZero: true },
|
axisLine: { onZero: true },
|
||||||
axisLabel: {
|
axisLabel: {
|
||||||
margin: 20,
|
margin: 20,
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<span class="menu-click text-nowrap ellipsis">
|
<span class="menu-click text-nowrap ellipsis">
|
||||||
<strong>
|
<strong>
|
||||||
<span *ngIf="user.username.includes('@'); else usernamenospace">{{ user.username }}</span>
|
<span *ngIf="user.username.includes('@'); else usernamenospace">{{ user.username }}</span>
|
||||||
<ng-template #usernamenospace>@{{ user.username }}</ng-template>
|
<ng-template #usernamenospace>@{{ user.username }}</ng-template>
|
||||||
</strong>
|
</strong>
|
||||||
</span>
|
</span>
|
||||||
<span class="badge mr-1 badge-og" *ngIf="user.ogRank">
|
<span class="badge mr-1 badge-og" *ngIf="user.ogRank">
|
||||||
|
@ -326,7 +326,7 @@
|
|||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<p>If you have any questions about this Policy, would like to speak with us about the use of our Marks in ways not described in the Policy, or see any abuse of our Marks, please email us at <legal@mempool.space></p>
|
<p>If you have any questions about this Policy, would like to speak with us about the use of our Marks in ways not described in the Policy, or see any abuse of our Marks, please email us at <legal@mempool.space></p>
|
||||||
|
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Inject, Injectable, PLATFORM_ID } from '@angular/core';
|
import { Inject, Injectable, PLATFORM_ID, makeStateKey, TransferState } from '@angular/core';
|
||||||
import { HttpInterceptor, HttpEvent, HttpRequest, HttpHandler, HttpResponse, HttpErrorResponse, HttpHeaders } from '@angular/common/http';
|
import { HttpInterceptor, HttpEvent, HttpRequest, HttpHandler, HttpResponse, HttpErrorResponse, HttpHeaders } from '@angular/common/http';
|
||||||
import { Observable, of } from 'rxjs';
|
import { Observable, of } from 'rxjs';
|
||||||
import { catchError, tap } from 'rxjs/operators';
|
import { catchError, tap } from 'rxjs/operators';
|
||||||
import { TransferState, makeStateKey } from '@angular/platform-browser';
|
|
||||||
import { isPlatformBrowser } from '@angular/common';
|
import { isPlatformBrowser } from '@angular/common';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
@ -7,5 +7,5 @@ if (environment.production) {
|
|||||||
enableProdMode();
|
enableProdMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
export { AppServerModule } from './app/app.server.module';
|
export { AppServerModule } from './app/app.module.server';
|
||||||
export { renderModule } from '@angular/platform-server';
|
export { renderModule } from '@angular/platform-server';
|
||||||
|
@ -32,19 +32,19 @@ const githubSecret = process.env.GITHUB_TOKEN;
|
|||||||
const CONFIG_FILE_NAME = 'mempool-frontend-config.json';
|
const CONFIG_FILE_NAME = 'mempool-frontend-config.json';
|
||||||
let configContent = {};
|
let configContent = {};
|
||||||
|
|
||||||
var PATH;
|
var ASSETS_PATH;
|
||||||
if (process.argv[2]) {
|
if (process.argv[2]) {
|
||||||
PATH = process.argv[2];
|
ASSETS_PATH = process.argv[2];
|
||||||
PATH += PATH.endsWith("/") ? "" : "/"
|
ASSETS_PATH += ASSETS_PATH.endsWith("/") ? "" : "/"
|
||||||
PATH = path.resolve(path.normalize(PATH));
|
ASSETS_PATH = path.resolve(path.normalize(ASSETS_PATH));
|
||||||
console.log(`[sync-assets] using PATH ${PATH}`);
|
console.log(`[sync-assets] using ASSETS_PATH ${ASSETS_PATH}`);
|
||||||
if (!fs.existsSync(PATH)){
|
if (!fs.existsSync(ASSETS_PATH)){
|
||||||
console.log(`${LOG_TAG} ${PATH} does not exist, creating`);
|
console.log(`${LOG_TAG} ${ASSETS_PATH} does not exist, creating`);
|
||||||
fs.mkdirSync(PATH, { recursive: true });
|
fs.mkdirSync(ASSETS_PATH, { recursive: true });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!PATH) {
|
if (!ASSETS_PATH) {
|
||||||
throw new Error('Resource path argument is not set');
|
throw new Error('Resource path argument is not set');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,7 +125,8 @@ function downloadMiningPoolLogos$() {
|
|||||||
if (verbose) {
|
if (verbose) {
|
||||||
console.log(`${LOG_TAG} Processing ${poolLogo.name}`);
|
console.log(`${LOG_TAG} Processing ${poolLogo.name}`);
|
||||||
}
|
}
|
||||||
const filePath = `${PATH}/mining-pools/${poolLogo.name}`;
|
console.log(`${ASSETS_PATH}/mining-pools/${poolLogo.name}`);
|
||||||
|
const filePath = `${ASSETS_PATH}/mining-pools/${poolLogo.name}`;
|
||||||
if (fs.existsSync(filePath)) {
|
if (fs.existsSync(filePath)) {
|
||||||
const localHash = getLocalHash(filePath);
|
const localHash = getLocalHash(filePath);
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
@ -152,7 +153,7 @@ function downloadMiningPoolLogos$() {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
console.log(`${LOG_TAG} \t\t${poolLogo.name} is missing, downloading...`);
|
console.log(`${LOG_TAG} \t\t${poolLogo.name} is missing, downloading...`);
|
||||||
const miningPoolsDir = `${PATH}/mining-pools/`;
|
const miningPoolsDir = `${ASSETS_PATH}/mining-pools/`;
|
||||||
if (!fs.existsSync(miningPoolsDir)){
|
if (!fs.existsSync(miningPoolsDir)){
|
||||||
fs.mkdirSync(miningPoolsDir, { recursive: true });
|
fs.mkdirSync(miningPoolsDir, { recursive: true });
|
||||||
}
|
}
|
||||||
@ -219,7 +220,7 @@ function downloadPromoVideoSubtiles$() {
|
|||||||
if (verbose) {
|
if (verbose) {
|
||||||
console.log(`${LOG_TAG} Processing ${language.name}`);
|
console.log(`${LOG_TAG} Processing ${language.name}`);
|
||||||
}
|
}
|
||||||
const filePath = `${PATH}/promo-video/${language.name}`;
|
const filePath = `${ASSETS_PATH}/promo-video/${language.name}`;
|
||||||
if (fs.existsSync(filePath)) {
|
if (fs.existsSync(filePath)) {
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
console.log(`${LOG_TAG} \t${language.name} remote promo video hash ${language.sha}`);
|
console.log(`${LOG_TAG} \t${language.name} remote promo video hash ${language.sha}`);
|
||||||
@ -245,7 +246,7 @@ function downloadPromoVideoSubtiles$() {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
console.log(`${LOG_TAG} \t\t${language.name} is missing, downloading`);
|
console.log(`${LOG_TAG} \t\t${language.name} is missing, downloading`);
|
||||||
const promoVideosDir = `${PATH}/promo-video/`;
|
const promoVideosDir = `${ASSETS_PATH}/promo-video/`;
|
||||||
if (!fs.existsSync(promoVideosDir)){
|
if (!fs.existsSync(promoVideosDir)){
|
||||||
fs.mkdirSync(promoVideosDir, { recursive: true });
|
fs.mkdirSync(promoVideosDir, { recursive: true });
|
||||||
}
|
}
|
||||||
@ -313,7 +314,7 @@ function downloadPromoVideo$() {
|
|||||||
if (item.name !== 'promo.mp4') {
|
if (item.name !== 'promo.mp4') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const filePath = `${PATH}/promo-video/mempool-promo.mp4`;
|
const filePath = `${ASSETS_PATH}/promo-video/mempool-promo.mp4`;
|
||||||
if (fs.existsSync(filePath)) {
|
if (fs.existsSync(filePath)) {
|
||||||
const localHash = getLocalHash(filePath);
|
const localHash = getLocalHash(filePath);
|
||||||
|
|
||||||
@ -373,16 +374,16 @@ if (configContent.BASE_MODULE && configContent.BASE_MODULE === 'liquid') {
|
|||||||
const testnetAssetsMinimalJsonUrl = 'https://raw.githubusercontent.com/Blockstream/asset_registry_testnet_db/master/index.minimal.json';
|
const testnetAssetsMinimalJsonUrl = 'https://raw.githubusercontent.com/Blockstream/asset_registry_testnet_db/master/index.minimal.json';
|
||||||
|
|
||||||
console.log(`${LOG_TAG} Downloading assets`);
|
console.log(`${LOG_TAG} Downloading assets`);
|
||||||
download(`${PATH}/assets.json`, assetsJsonUrl);
|
download(`${ASSETS_PATH}/assets.json`, assetsJsonUrl);
|
||||||
|
|
||||||
console.log(`${LOG_TAG} Downloading assets minimal`);
|
console.log(`${LOG_TAG} Downloading assets minimal`);
|
||||||
download(`${PATH}/assets.minimal.json`, assetsMinimalJsonUrl);
|
download(`${ASSETS_PATH}/assets.minimal.json`, assetsMinimalJsonUrl);
|
||||||
|
|
||||||
console.log(`${LOG_TAG} Downloading testnet assets`);
|
console.log(`${LOG_TAG} Downloading testnet assets`);
|
||||||
download(`${PATH}/assets-testnet.json`, testnetAssetsJsonUrl);
|
download(`${ASSETS_PATH}/assets-testnet.json`, testnetAssetsJsonUrl);
|
||||||
|
|
||||||
console.log(`${LOG_TAG} Downloading testnet assets minimal`);
|
console.log(`${LOG_TAG} Downloading testnet assets minimal`);
|
||||||
download(`${PATH}/assets-testnet.minimal.json`, testnetAssetsMinimalJsonUrl);
|
download(`${ASSETS_PATH}/assets-testnet.minimal.json`, testnetAssetsMinimalJsonUrl);
|
||||||
} else {
|
} else {
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
console.log(`${LOG_TAG} BASE_MODULE is not set to Liquid (currently ${configContent.BASE_MODULE}), skipping downloading assets`);
|
console.log(`${LOG_TAG} BASE_MODULE is not set to Liquid (currently ${configContent.BASE_MODULE}), skipping downloading assets`);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
"declaration": false,
|
"declaration": false,
|
||||||
"downlevelIteration": true,
|
"downlevelIteration": true,
|
||||||
"experimentalDecorators": true,
|
"experimentalDecorators": true,
|
||||||
"module": "ES2020",
|
"module": "ES2022",
|
||||||
"moduleResolution": "node",
|
"moduleResolution": "node",
|
||||||
"importHelpers": true,
|
"importHelpers": true,
|
||||||
"target": "ES2022",
|
"target": "ES2022",
|
||||||
@ -15,7 +15,7 @@
|
|||||||
"node_modules/@types"
|
"node_modules/@types"
|
||||||
],
|
],
|
||||||
"lib": [
|
"lib": [
|
||||||
"ES2018",
|
"ES2022",
|
||||||
"dom",
|
"dom",
|
||||||
"dom.iterable"
|
"dom.iterable"
|
||||||
]
|
]
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
#!/usr/bin/env zsh
|
#!/usr/bin/env zsh
|
||||||
#for j in fmt va1 fra tk7;do for i in 1 2 3 4 5 6;do echo -n 20$i.$j: ;curl -i -s https://node20$i.$j.mempool.space/api/v1/services/accelerator/accelerations|head -1;done;done
|
#for j in fmt va1 fra tk7;do for i in 1 2 3 4 5 6;do echo -n 20$i.$j: ;curl -i -s https://node20$i.$j.mempool.space/api/v1/services/accelerator/accelerations|head -1;done;done
|
||||||
check_mempoolspace_frontend_git_hash() {
|
check_mempoolspace_frontend_git_hash() {
|
||||||
echo curl -s --connect-to "::node${1}.${2}.mempool.space:443" https://mempool.space/resources/config.js
|
echo -n $(curl -s --connect-to "::node${1}.${2}.mempool.space:443" https://mempool.space/en-US/resources/config.js|grep GIT_COMMIT_HASH|cut -d "'" -f2|cut -c1-8)
|
||||||
echo -n $(curl -s --connect-to "::node${1}.${2}.mempool.space:443" https://mempool.space/resources/config.js|grep GIT_COMMIT_HASH|cut -d "'" -f2|cut -c1-8)
|
|
||||||
}
|
}
|
||||||
check_mempoolfoss_frontend_git_hash() {
|
check_mempoolfoss_frontend_git_hash() {
|
||||||
echo -n $(curl -s "https://node${1}.${2}.mempool.space/resources/config.js"|grep GIT_COMMIT_HASH|cut -d "'" -f2|cut -c1-8)
|
echo -n $(curl -s "https://node${1}.${2}.mempool.space/resources/config.js"|grep GIT_COMMIT_HASH|cut -d "'" -f2|cut -c1-8)
|
||||||
@ -13,19 +12,24 @@ check_mempoolspace_frontend_md5_hash() {
|
|||||||
check_mempoolfoss_frontend_md5_hash() {
|
check_mempoolfoss_frontend_md5_hash() {
|
||||||
echo -n $(curl -s https://node${1}.${2}.mempool.space|md5|cut -c1-8)
|
echo -n $(curl -s https://node${1}.${2}.mempool.space|md5|cut -c1-8)
|
||||||
}
|
}
|
||||||
|
check_mempool_electrs_git_hash() {
|
||||||
|
echo -n $(curl -s -i https://node${1}.${2}.mempool.space/api/mempool|grep -i x-powered-by|cut -d ' ' -f3)
|
||||||
|
}
|
||||||
for site in fmt va1 fra tk7;do
|
for site in fmt va1 fra tk7;do
|
||||||
echo "${site}"
|
echo "${site}"
|
||||||
for node in 201 202 203 204 205 206 207 208 209 210 211 212 213 214;do
|
for node in 201 202 203 204 205 206 207 208 209 210 211 212 213 214;do
|
||||||
[ "${site}" = "fmt" ] && [ "${node}" -gt 206 ] && continue
|
[ "${site}" = "fmt" ] && [ "${node}" -gt 206 ] && continue
|
||||||
[ "${site}" = "tk7" ] && [ "${node}" -gt 206 ] && continue
|
[ "${site}" = "tk7" ] && [ "${node}" -gt 206 ] && continue
|
||||||
echo -n "node${node}.${site}: "
|
echo -n "node${node}.${site}: "
|
||||||
#check_mempoolspace_frontend_git_hash $node $site
|
check_mempoolspace_frontend_git_hash $node $site
|
||||||
#echo -n " "
|
|
||||||
check_mempoolspace_frontend_md5_hash $node $site
|
|
||||||
echo -n " "
|
echo -n " "
|
||||||
check_mempoolfoss_frontend_git_hash $node $site
|
check_mempoolfoss_frontend_git_hash $node $site
|
||||||
echo -n " "
|
echo -n " "
|
||||||
|
check_mempoolspace_frontend_md5_hash $node $site
|
||||||
|
echo -n " "
|
||||||
check_mempoolfoss_frontend_md5_hash $node $site
|
check_mempoolfoss_frontend_md5_hash $node $site
|
||||||
|
echo -n " "
|
||||||
|
check_mempool_electrs_git_hash $node $site
|
||||||
echo
|
echo
|
||||||
done
|
done
|
||||||
done
|
done
|
||||||
|
@ -1047,9 +1047,9 @@ osSudo "${ROOT_USER}" crontab -u "${MEMPOOL_USER}" "${MEMPOOL_HOME}/${MEMPOOL_RE
|
|||||||
echo "[*] Installing nvm.sh from GitHub"
|
echo "[*] Installing nvm.sh from GitHub"
|
||||||
osSudo "${MEMPOOL_USER}" sh -c 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | zsh'
|
osSudo "${MEMPOOL_USER}" sh -c 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | zsh'
|
||||||
|
|
||||||
echo "[*] Building NodeJS v20.5.1 via nvm.sh"
|
echo "[*] Building NodeJS via nvm.sh"
|
||||||
osSudo "${MEMPOOL_USER}" zsh -c 'source ~/.zshrc ; nvm install v20.7.0 --shared-zlib'
|
osSudo "${MEMPOOL_USER}" zsh -c 'source ~/.zshrc ; nvm install v20.12.0 --shared-zlib'
|
||||||
osSudo "${MEMPOOL_USER}" zsh -c 'source ~/.zshrc ; nvm alias default 20.7.0'
|
osSudo "${MEMPOOL_USER}" zsh -c 'source ~/.zshrc ; nvm alias default 20.12.0'
|
||||||
|
|
||||||
####################
|
####################
|
||||||
# Tor installation #
|
# Tor installation #
|
||||||
@ -1449,7 +1449,7 @@ if [ "${UNFURL_INSTALL}" = ON ];then
|
|||||||
echo 'nvidia_xorg_enable="YES"' >> /etc/rc.conf
|
echo 'nvidia_xorg_enable="YES"' >> /etc/rc.conf
|
||||||
|
|
||||||
echo "[*] Installing color emoji"
|
echo "[*] Installing color emoji"
|
||||||
osSudo "${ROOT_USER}" curl "https://github.com/samuelngs/apple-emoji-linux/releases/download/ios-15.4/AppleColorEmoji.ttf" -o /usr/local/share/fonts/TTF/AppleColorEmoji.ttf
|
osSudo "${ROOT_USER}" curl -sSL "https://github.com/samuelngs/apple-emoji-linux/releases/download/ios-15.4/AppleColorEmoji.ttf" -o /usr/local/share/fonts/TTF/AppleColorEmoji.ttf
|
||||||
cat > /usr/local/etc/fonts/conf.d/01-emoji.conf <<EOF
|
cat > /usr/local/etc/fonts/conf.d/01-emoji.conf <<EOF
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
|
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
|
||||||
@ -1491,7 +1491,7 @@ EOF
|
|||||||
osSudo "${UNFURL_USER}" sh -c 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | zsh'
|
osSudo "${UNFURL_USER}" sh -c 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | zsh'
|
||||||
|
|
||||||
echo "[*] Building NodeJS via nvm.sh"
|
echo "[*] Building NodeJS via nvm.sh"
|
||||||
osSudo "${UNFURL_USER}" zsh -c 'source ~/.zshrc ; nvm install v20.7.0 --shared-zlib'
|
osSudo "${UNFURL_USER}" zsh -c 'source ~/.zshrc ; nvm install v20.12.0 --shared-zlib'
|
||||||
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
Loading…
x
Reference in New Issue
Block a user