Show more stats in pool ranking pie widget

This commit is contained in:
nymkappa 2022-03-05 18:47:21 +01:00
parent f9e361a9c0
commit d45f3c32cf
No known key found for this signature in database
GPG Key ID: E155910B16E8BD04
8 changed files with 83 additions and 85 deletions

View File

@ -78,7 +78,7 @@ export class HashrateChartPoolsComponent implements OnInit {
name: name, name: name,
showSymbol: false, showSymbol: false,
symbol: 'none', symbol: 'none',
data: grouped[name].map((val) => [val.timestamp * 1000, (val.share * 100).toFixed(2)]), data: grouped[name].map((val) => [val.timestamp * 1000, val.share * 100]),
type: 'line', type: 'line',
lineStyle: { width: 0 }, lineStyle: { width: 0 },
areaStyle: { opacity: 1 }, areaStyle: { opacity: 1 },
@ -149,7 +149,7 @@ export class HashrateChartPoolsComponent implements OnInit {
data.sort((a, b) => b.data[1] - a.data[1]); data.sort((a, b) => b.data[1] - a.data[1]);
for (const pool of data) { for (const pool of data) {
if (pool.data[1] > 0) { if (pool.data[1] > 0) {
tooltip += `${pool.marker} ${pool.seriesName}: ${pool.data[1]}%<br>` tooltip += `${pool.marker} ${pool.seriesName}: ${pool.data[1].toFixed(2)}%<br>`;
} }
} }
return tooltip; return tooltip;

View File

@ -20,27 +20,6 @@
<div class="col"> <div class="col">
<div class="card" style="height: 385px"> <div class="card" style="height: 385px">
<div class="card-body"> <div class="card-body">
<div class="pool-distribution">
<div class="item">
<h5 class="card-title" i18n="dashboard.minimum-fee|Minimum mempool fee">Blocks (1w)</h5>
<p class="card-text">
1082
</p>
</div>
<div class="item">
<h5 class="card-title" i18n="dashboard.minimum-fee|Minimum mempool fee">Miners luck (1w)</h5>
<p class="card-text">
107.25%
</p>
</div>
<div class="item">
<h5 class="card-title" i18n="dashboard.minimum-fee|Minimum mempool fee">Miners Gini (1w)</h5>
<p class="card-text">
0.123
</p>
</div>
</div>
<app-pool-ranking [widget]=true></app-pool-ranking> <app-pool-ranking [widget]=true></app-pool-ranking>
<div class="mt-1"><a [routerLink]="['/mining/pools' | relativeUrl]" i18n="dashboard.view-more">View more &raquo;</a></div> <div class="mt-1"><a [routerLink]="['/mining/pools' | relativeUrl]" i18n="dashboard.view-more">View more &raquo;</a></div>
</div> </div>

View File

@ -55,55 +55,3 @@
text-align: center; text-align: center;
padding-bottom: 3px; padding-bottom: 3px;
} }
.pool-distribution {
min-height: 56px;
display: block;
@media (min-width: 485px) {
display: flex;
flex-direction: row;
}
h5 {
margin-bottom: 10px;
}
.item {
width: 50%;
margin: 0px auto 10px;
display: inline-block;
@media (min-width: 485px) {
margin: 0px auto 10px;
}
@media (min-width: 785px) {
margin: 0px auto 0px;
}
&:last-child {
margin: 0px auto 0px;
}
&:nth-child(2) {
order: 2;
@media (min-width: 485px) {
order: 3;
}
}
&:nth-child(3) {
order: 3;
@media (min-width: 485px) {
order: 2;
display: block;
}
@media (min-width: 768px) {
display: none;
}
@media (min-width: 992px) {
display: block;
}
}
.card-text {
font-size: 18px;
span {
color: #ffffff66;
font-size: 12px;
}
}
}
}

View File

@ -1,5 +1,26 @@
<div [class]="widget === false ? 'container-xl' : ''"> <div [class]="widget === false ? 'container-xl' : ''">
<div class="pool-distribution" *ngIf="widget && (miningStatsObservable$ | async) as miningStats">
<div class="item">
<h5 class="card-title" i18n="mining.miners-luck">Pools luck (1w)</h5>
<p class="card-text">
{{ miningStats['minersLuck'] }}%
</p>
</div>
<div class="item">
<h5 class="card-title" i18n="master-page.blocks">Blocks (1w)</h5>
<p class="card-text">
{{ miningStats.blockCount }}
</p>
</div>
<div class="item">
<h5 class="card-title" i18n="mining.miners-count">Pools count (1w)</h5>
<p class="card-text">
{{ miningStats.pools.length }}
</p>
</div>
</div>
<div [class]="widget ? 'chart-widget' : 'chart'" <div [class]="widget ? 'chart-widget' : 'chart'"
echarts [initOpts]="chartInitOptions" [options]="chartOptions" (chartInit)="onChartInit($event)"></div> echarts [initOpts]="chartInitOptions" [options]="chartOptions" (chartInit)="onChartInit($event)"></div>
<div class="text-center loadingGraphs" *ngIf="isLoading"> <div class="text-center loadingGraphs" *ngIf="isLoading">

View File

@ -47,3 +47,59 @@
.loadingGraphs.widget { .loadingGraphs.widget {
top: 25%; top: 25%;
} }
.pool-distribution {
min-height: 56px;
display: block;
@media (min-width: 485px) {
display: flex;
flex-direction: row;
}
h5 {
margin-bottom: 10px;
}
.item {
width: 50%;
margin: 0px auto 10px;
display: inline-block;
@media (min-width: 485px) {
margin: 0px auto 10px;
}
@media (min-width: 785px) {
margin: 0px auto 0px;
}
&:last-child {
margin: 0px auto 0px;
}
&:nth-child(2) {
order: 2;
@media (min-width: 485px) {
order: 3;
}
}
&:nth-child(3) {
order: 3;
@media (min-width: 485px) {
order: 2;
display: block;
}
@media (min-width: 768px) {
display: none;
}
@media (min-width: 992px) {
display: block;
}
}
.card-title {
font-size: 1rem;
color: #4a68b9;
}
.card-text {
font-size: 18px;
span {
color: #ffffff66;
font-size: 12px;
}
}
}
}

View File

@ -85,6 +85,7 @@ export class PoolRankingComponent implements OnInit {
}), }),
map(data => { map(data => {
data.pools = data.pools.map((pool: SinglePoolStats) => this.formatPoolUI(pool)); data.pools = data.pools.map((pool: SinglePoolStats) => this.formatPoolUI(pool));
data['minersLuck'] = (100 * (data.blockCount / 1008)).toFixed(2); // luck 1w
return data; return data;
}), }),
tap(data => { tap(data => {
@ -298,7 +299,7 @@ export class PoolRankingComponent implements OnInit {
/** /**
* Default mining stats if something goes wrong * Default mining stats if something goes wrong
*/ */
getEmptyMiningStat() { getEmptyMiningStat(): MiningStats {
return { return {
lastEstimatedHashrate: 'Error', lastEstimatedHashrate: 'Error',
blockCount: 0, blockCount: 0,

View File

@ -64,7 +64,7 @@ export interface SinglePoolStats {
blockCount: number; blockCount: number;
emptyBlocks: number; emptyBlocks: number;
rank: number; rank: number;
share: string; share: number;
lastEstimatedHashrate: string; lastEstimatedHashrate: string;
emptyBlockRatio: string; emptyBlockRatio: string;
logo: string; logo: string;
@ -75,13 +75,6 @@ export interface PoolsStats {
oldestIndexedBlockTimestamp: number; oldestIndexedBlockTimestamp: number;
pools: SinglePoolStats[]; pools: SinglePoolStats[];
} }
export interface MiningStats {
lastEstimatedHashrate: string;
blockCount: number;
totalEmptyBlock: number;
totalEmptyBlockRatio: string;
pools: SinglePoolStats[];
}
/** /**
* Pool component * Pool component

View File

@ -73,7 +73,7 @@ export class MiningService {
const totalEmptyBlockRatio = (totalEmptyBlock / stats.blockCount * 100).toFixed(2); const totalEmptyBlockRatio = (totalEmptyBlock / stats.blockCount * 100).toFixed(2);
const poolsStats = stats.pools.map((poolStat) => { const poolsStats = stats.pools.map((poolStat) => {
return { return {
share: (poolStat.blockCount / stats.blockCount * 100).toFixed(2), share: parseFloat((poolStat.blockCount / stats.blockCount * 100).toFixed(2)),
lastEstimatedHashrate: (poolStat.blockCount / stats.blockCount * stats.lastEstimatedHashrate / hashrateDivider).toFixed(2), lastEstimatedHashrate: (poolStat.blockCount / stats.blockCount * stats.lastEstimatedHashrate / hashrateDivider).toFixed(2),
emptyBlockRatio: (poolStat.emptyBlocks / poolStat.blockCount * 100).toFixed(2), emptyBlockRatio: (poolStat.emptyBlocks / poolStat.blockCount * 100).toFixed(2),
logo: `./resources/mining-pools/` + poolStat.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg', logo: `./resources/mining-pools/` + poolStat.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg',