Merge branch 'master' into bugfix/fix-duplicate-indexing
This commit is contained in:
commit
98d819b3d2
13
.github/workflows/cypress.yml
vendored
13
.github/workflows/cypress.yml
vendored
@ -1,7 +1,10 @@
|
|||||||
name: Cypress Tests
|
name: Cypress Tests
|
||||||
|
|
||||||
on: [push, pull_request]
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
jobs:
|
jobs:
|
||||||
cypress:
|
cypress:
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
@ -24,6 +27,7 @@ jobs:
|
|||||||
- name: ${{ matrix.browser }} browser tests (Mempool)
|
- name: ${{ matrix.browser }} browser tests (Mempool)
|
||||||
uses: cypress-io/github-action@v2
|
uses: cypress-io/github-action@v2
|
||||||
with:
|
with:
|
||||||
|
tag: ${{ github.event_name }}
|
||||||
working-directory: frontend
|
working-directory: frontend
|
||||||
build: npm run config:defaults:mempool
|
build: npm run config:defaults:mempool
|
||||||
start: npm run start:local-staging
|
start: npm run start:local-staging
|
||||||
@ -39,6 +43,7 @@ jobs:
|
|||||||
browser: ${{ matrix.browser }}
|
browser: ${{ matrix.browser }}
|
||||||
ci-build-id: '${{ github.sha }}-${{ github.workflow }}-${{ github.event_name }}'
|
ci-build-id: '${{ github.sha }}-${{ github.workflow }}-${{ github.event_name }}'
|
||||||
env:
|
env:
|
||||||
|
COMMIT_INFO_MESSAGE: ${{ github.event.pull_request.title }}
|
||||||
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
|
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
CYPRESS_PROJECT_ID: ${{ secrets.CYPRESS_PROJECT_ID }}
|
CYPRESS_PROJECT_ID: ${{ secrets.CYPRESS_PROJECT_ID }}
|
||||||
@ -47,6 +52,7 @@ jobs:
|
|||||||
uses: cypress-io/github-action@v2
|
uses: cypress-io/github-action@v2
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
|
tag: ${{ github.event_name }}
|
||||||
working-directory: frontend
|
working-directory: frontend
|
||||||
build: npm run config:defaults:liquid
|
build: npm run config:defaults:liquid
|
||||||
start: npm run start:local-staging
|
start: npm run start:local-staging
|
||||||
@ -61,6 +67,7 @@ jobs:
|
|||||||
browser: ${{ matrix.browser }}
|
browser: ${{ matrix.browser }}
|
||||||
ci-build-id: '${{ github.sha }}-${{ github.workflow }}-${{ github.event_name }}'
|
ci-build-id: '${{ github.sha }}-${{ github.workflow }}-${{ github.event_name }}'
|
||||||
env:
|
env:
|
||||||
|
COMMIT_INFO_MESSAGE: ${{ github.event.pull_request.title }}
|
||||||
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
|
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
CYPRESS_PROJECT_ID: ${{ secrets.CYPRESS_PROJECT_ID }}
|
CYPRESS_PROJECT_ID: ${{ secrets.CYPRESS_PROJECT_ID }}
|
||||||
@ -69,6 +76,7 @@ jobs:
|
|||||||
uses: cypress-io/github-action@v2
|
uses: cypress-io/github-action@v2
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
|
tag: ${{ github.event_name }}
|
||||||
working-directory: frontend
|
working-directory: frontend
|
||||||
build: npm run config:defaults:bisq
|
build: npm run config:defaults:bisq
|
||||||
start: npm run start:local-staging
|
start: npm run start:local-staging
|
||||||
@ -81,6 +89,7 @@ jobs:
|
|||||||
browser: ${{ matrix.browser }}
|
browser: ${{ matrix.browser }}
|
||||||
ci-build-id: '${{ github.sha }}-${{ github.workflow }}-${{ github.event_name }}'
|
ci-build-id: '${{ github.sha }}-${{ github.workflow }}-${{ github.event_name }}'
|
||||||
env:
|
env:
|
||||||
|
COMMIT_INFO_MESSAGE: ${{ github.event.pull_request.title }}
|
||||||
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
|
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
CYPRESS_PROJECT_ID: ${{ secrets.CYPRESS_PROJECT_ID }}
|
CYPRESS_PROJECT_ID: ${{ secrets.CYPRESS_PROJECT_ID }}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# The Mempool Open Source Project™
|
# The Mempool Open Source Project™ [](https://dashboard.cypress.io/projects/ry4br7/runs)
|
||||||
|
|
||||||
Mempool is the fully featured visualizer, explorer, and API service running on [mempool.space](https://mempool.space/), an open source project developed and operated for the benefit of the Bitcoin community, with a focus on the emerging transaction fee market to help our transition into a multi-layer ecosystem.
|
Mempool is the fully featured visualizer, explorer, and API service running on [mempool.space](https://mempool.space/), an open source project developed and operated for the benefit of the Bitcoin community, with a focus on the emerging transaction fee market to help our transition into a multi-layer ecosystem.
|
||||||
|
|
||||||
|
@ -301,8 +301,6 @@ class Blocks {
|
|||||||
if (memPool.isInSync()) {
|
if (memPool.isInSync()) {
|
||||||
diskCache.$saveCacheToDisk();
|
diskCache.$saveCacheToDisk();
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1
frontend/.gitignore
vendored
1
frontend/.gitignore
vendored
@ -53,6 +53,7 @@ src/resources/assets.minimal.json
|
|||||||
src/resources/assets-testnet.json
|
src/resources/assets-testnet.json
|
||||||
src/resources/assets-testnet.minimal.json
|
src/resources/assets-testnet.minimal.json
|
||||||
src/resources/pools.json
|
src/resources/pools.json
|
||||||
|
src/resources/mining-pools/*
|
||||||
|
|
||||||
# environment config
|
# environment config
|
||||||
mempool-frontend-config.json
|
mempool-frontend-config.json
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
[height]="600"
|
[height]="600"
|
||||||
[left]="60"
|
[left]="60"
|
||||||
[right]="10"
|
[right]="10"
|
||||||
[data]="mempoolStats && mempoolStats.length ? mempoolStats : null"
|
[data]="statsSubscription$ | async"
|
||||||
[showZoom]="false"
|
[showZoom]="false"
|
||||||
></app-mempool-graph>
|
></app-mempool-graph>
|
||||||
</div>
|
</div>
|
||||||
|
@ -4,39 +4,70 @@ import { OptimizedMempoolStats } from '../../interfaces/node-api.interface';
|
|||||||
import { StateService } from 'src/app/services/state.service';
|
import { StateService } from 'src/app/services/state.service';
|
||||||
import { ApiService } from 'src/app/services/api.service';
|
import { ApiService } from 'src/app/services/api.service';
|
||||||
import { SeoService } from 'src/app/services/seo.service';
|
import { SeoService } from 'src/app/services/seo.service';
|
||||||
import { Observable } from 'rxjs';
|
import { ActivatedRoute } from '@angular/router';
|
||||||
|
import { map, scan, startWith, switchMap, tap } from 'rxjs/operators';
|
||||||
|
import { interval, merge, Observable } from 'rxjs';
|
||||||
|
import { ChangeDetectionStrategy } from '@angular/core';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-television',
|
selector: 'app-television',
|
||||||
templateUrl: './television.component.html',
|
templateUrl: './television.component.html',
|
||||||
styleUrls: ['./television.component.scss']
|
styleUrls: ['./television.component.scss'],
|
||||||
|
changeDetection: ChangeDetectionStrategy.OnPush
|
||||||
})
|
})
|
||||||
export class TelevisionComponent implements OnInit {
|
export class TelevisionComponent implements OnInit {
|
||||||
|
|
||||||
mempoolStats: OptimizedMempoolStats[] = [];
|
mempoolStats: OptimizedMempoolStats[] = [];
|
||||||
mempoolVsizeFeesData: any;
|
statsSubscription$: Observable<OptimizedMempoolStats[]>;
|
||||||
|
fragment: string;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private websocketService: WebsocketService,
|
private websocketService: WebsocketService,
|
||||||
private apiService: ApiService,
|
private apiService: ApiService,
|
||||||
private stateService: StateService,
|
private stateService: StateService,
|
||||||
private seoService: SeoService,
|
private seoService: SeoService,
|
||||||
|
private route: ActivatedRoute
|
||||||
) { }
|
) { }
|
||||||
|
|
||||||
|
refreshStats(time: number, fn: Observable<OptimizedMempoolStats[]>) {
|
||||||
|
return interval(time).pipe(startWith(0), switchMap(() => fn));
|
||||||
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.seoService.setTitle($localize`:@@46ce8155c9ab953edeec97e8950b5a21e67d7c4e:TV view`);
|
this.seoService.setTitle($localize`:@@46ce8155c9ab953edeec97e8950b5a21e67d7c4e:TV view`);
|
||||||
this.websocketService.want(['blocks', 'live-2h-chart', 'mempool-blocks']);
|
this.websocketService.want(['blocks', 'live-2h-chart', 'mempool-blocks']);
|
||||||
|
|
||||||
this.apiService.list2HStatistics$()
|
this.statsSubscription$ = merge(
|
||||||
.subscribe((mempoolStats) => {
|
this.stateService.live2Chart$.pipe(map(stats => [stats])),
|
||||||
this.mempoolStats = mempoolStats;
|
this.route.fragment
|
||||||
});
|
.pipe(
|
||||||
|
tap(fragment => { this.fragment = fragment ?? '2h'; }),
|
||||||
this.stateService.live2Chart$
|
switchMap((fragment) => {
|
||||||
.subscribe((mempoolStats) => {
|
const minute = 60000; const hour = 3600000;
|
||||||
this.mempoolStats.unshift(mempoolStats);
|
switch (fragment) {
|
||||||
this.mempoolStats = this.mempoolStats.slice(0, this.mempoolStats.length - 1);
|
case '24h': return this.apiService.list24HStatistics$();
|
||||||
});
|
case '1w': return this.refreshStats(5 * minute, this.apiService.list1WStatistics$());
|
||||||
|
case '1m': return this.refreshStats(30 * minute, this.apiService.list1MStatistics$());
|
||||||
|
case '3m': return this.refreshStats(2 * hour, this.apiService.list3MStatistics$());
|
||||||
|
case '6m': return this.refreshStats(3 * hour, this.apiService.list6MStatistics$());
|
||||||
|
case '1y': return this.refreshStats(8 * hour, this.apiService.list1YStatistics$());
|
||||||
|
case '2y': return this.refreshStats(8 * hour, this.apiService.list2YStatistics$());
|
||||||
|
case '3y': return this.refreshStats(12 * hour, this.apiService.list3YStatistics$());
|
||||||
|
default /* 2h */: return this.apiService.list2HStatistics$();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.pipe(
|
||||||
|
scan((mempoolStats, newStats) => {
|
||||||
|
if (newStats.length > 1) {
|
||||||
|
mempoolStats = newStats;
|
||||||
|
} else if (['2h', '24h'].includes(this.fragment)) {
|
||||||
|
mempoolStats.unshift(newStats[0]);
|
||||||
|
mempoolStats = mempoolStats.slice(0, mempoolStats.length - 1);
|
||||||
|
}
|
||||||
|
return mempoolStats;
|
||||||
|
})
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,35 @@ function download(filename, url) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function downloadMiningPoolLogos() {
|
||||||
|
const options = {
|
||||||
|
host: 'api.github.com',
|
||||||
|
path: '/repos/mempool/mining-pools/contents/',
|
||||||
|
method: 'GET',
|
||||||
|
headers: {'user-agent': 'node.js'}
|
||||||
|
};
|
||||||
|
|
||||||
|
https.get(options, (response) => {
|
||||||
|
let chunks_of_data = [];
|
||||||
|
|
||||||
|
response.on('data', (fragments) => {
|
||||||
|
chunks_of_data.push(fragments);
|
||||||
|
});
|
||||||
|
|
||||||
|
response.on('end', () => {
|
||||||
|
let response_body = Buffer.concat(chunks_of_data);
|
||||||
|
const poolLogos = JSON.parse(response_body.toString());
|
||||||
|
for (const poolLogo of poolLogos) {
|
||||||
|
download(`${PATH}/mining-pools/${poolLogo.name}`, poolLogo.download_url);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
response.on('error', (error) => {
|
||||||
|
throw new Error(error);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
const poolsJsonUrl = 'https://raw.githubusercontent.com/btccom/Blockchain-Known-Pools/master/pools.json';
|
const poolsJsonUrl = 'https://raw.githubusercontent.com/btccom/Blockchain-Known-Pools/master/pools.json';
|
||||||
let assetsJsonUrl = 'https://raw.githubusercontent.com/mempool/asset_registry_db/master/index.json';
|
let assetsJsonUrl = 'https://raw.githubusercontent.com/mempool/asset_registry_db/master/index.json';
|
||||||
let assetsMinimalJsonUrl = 'https://raw.githubusercontent.com/mempool/asset_registry_db/master/index.minimal.json';
|
let assetsMinimalJsonUrl = 'https://raw.githubusercontent.com/mempool/asset_registry_db/master/index.minimal.json';
|
||||||
@ -55,4 +84,5 @@ console.log('Downloading testnet assets');
|
|||||||
download(PATH + 'assets-testnet.json', testnetAssetsJsonUrl);
|
download(PATH + 'assets-testnet.json', testnetAssetsJsonUrl);
|
||||||
console.log('Downloading testnet assets minimal');
|
console.log('Downloading testnet assets minimal');
|
||||||
download(PATH + 'assets-testnet.minimal.json', testnetAssetsMinimalJsonUrl);
|
download(PATH + 'assets-testnet.minimal.json', testnetAssetsMinimalJsonUrl);
|
||||||
|
console.log('Downloading mining pool logos');
|
||||||
|
downloadMiningPoolLogos();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user