mirror of
https://github.com/mempool/mempool.git
synced 2024-12-26 16:24:26 +01:00
Merge pull request #1687 from mempool/nymkappa/feature/use-block-count-timespan
Replace all oldestIndexedBlockTimestamp with X-total-count header
This commit is contained in:
commit
cba9930410
@ -89,7 +89,6 @@ class Mining {
|
||||
});
|
||||
|
||||
poolsStatistics['pools'] = poolsStats;
|
||||
poolsStatistics['oldestIndexedBlockTimestamp'] = await BlocksRepository.$oldestBlockTimestamp();
|
||||
|
||||
const blockCount: number = await BlocksRepository.$blockCount(null, interval);
|
||||
poolsStatistics['blockCount'] = blockCount;
|
||||
|
@ -669,14 +669,12 @@ class Routes {
|
||||
public async $getHistoricalBlockFeeRates(req: Request, res: Response) {
|
||||
try {
|
||||
const blockFeeRates = await mining.$getHistoricalBlockFeeRates(req.params.interval);
|
||||
const oldestIndexedBlockTimestamp = await BlocksRepository.$oldestBlockTimestamp();
|
||||
const blockCount = await BlocksRepository.$blockCount(null, null);
|
||||
res.header('Pragma', 'public');
|
||||
res.header('Cache-control', 'public');
|
||||
res.header('X-total-count', blockCount.toString());
|
||||
res.setHeader('Expires', new Date(Date.now() + 1000 * 60).toUTCString());
|
||||
res.json({
|
||||
oldestIndexedBlockTimestamp: oldestIndexedBlockTimestamp,
|
||||
blockFeeRates: blockFeeRates,
|
||||
});
|
||||
res.json(blockFeeRates);
|
||||
} catch (e) {
|
||||
res.status(500).send(e instanceof Error ? e.message : e);
|
||||
}
|
||||
|
@ -8,34 +8,34 @@
|
||||
</button>
|
||||
<form [formGroup]="radioGroupForm" class="formRadioGroup" *ngIf="(statsObservable$ | async) as stats">
|
||||
<div class="btn-group btn-group-toggle" ngbRadioGroup name="radioBasic" formControlName="dateSpan">
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.availableTimespanDay >= 1">
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 144">
|
||||
<input ngbButton type="radio" [value]="'24h'" fragment="24h"> 24h
|
||||
</label>
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.availableTimespanDay >= 3">
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 432">
|
||||
<input ngbButton type="radio" [value]="'3d'" fragment="3d"> 3D
|
||||
</label>
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.availableTimespanDay >= 7">
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 1008">
|
||||
<input ngbButton type="radio" [value]="'1w'" fragment="1w"> 1W
|
||||
</label>
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.availableTimespanDay >= 30">
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 4320">
|
||||
<input ngbButton type="radio" [value]="'1m'" fragment="1m"> 1M
|
||||
</label>
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.availableTimespanDay >= 90">
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 12960">
|
||||
<input ngbButton type="radio" [value]="'3m'" fragment="3m"> 3M
|
||||
</label>
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.availableTimespanDay >= 180">
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 25920">
|
||||
<input ngbButton type="radio" [value]="'6m'" fragment="6m"> 6M
|
||||
</label>
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.availableTimespanDay >= 365">
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 52560">
|
||||
<input ngbButton type="radio" [value]="'1y'" fragment="1y"> 1Y
|
||||
</label>
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.availableTimespanDay >= 730">
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 105120">
|
||||
<input ngbButton type="radio" [value]="'2y'" fragment="2y"> 2Y
|
||||
</label>
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.availableTimespanDay >= 1095">
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 157680">
|
||||
<input ngbButton type="radio" [value]="'3y'" fragment="3y"> 3Y
|
||||
</label>
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.availableTimespanDay > 1095">
|
||||
<label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount > 157680">
|
||||
<input ngbButton type="radio" [value]="'all'" fragment="all"> ALL
|
||||
</label>
|
||||
</div>
|
||||
|
@ -76,7 +76,7 @@ export class BlockFeeRatesGraphComponent implements OnInit {
|
||||
this.isLoading = true;
|
||||
return this.apiService.getHistoricalBlockFeeRates$(timespan)
|
||||
.pipe(
|
||||
tap((data: any) => {
|
||||
tap((response) => {
|
||||
// Group by percentile
|
||||
const seriesData = {
|
||||
'Min': [],
|
||||
@ -87,7 +87,7 @@ export class BlockFeeRatesGraphComponent implements OnInit {
|
||||
'90th': [],
|
||||
'Max': []
|
||||
};
|
||||
for (const rate of data.blockFeeRates) {
|
||||
for (const rate of response.body) {
|
||||
const timestamp = rate.timestamp * 1000;
|
||||
seriesData['Min'].push([timestamp, rate.avgFee_0, rate.avgHeight]);
|
||||
seriesData['10th'].push([timestamp, rate.avgFee_10, rate.avgHeight]);
|
||||
@ -130,13 +130,9 @@ export class BlockFeeRatesGraphComponent implements OnInit {
|
||||
});
|
||||
this.isLoading = false;
|
||||
}),
|
||||
map((data: any) => {
|
||||
const availableTimespanDay = (
|
||||
(new Date().getTime() / 1000) - (data.oldestIndexedBlockTimestamp)
|
||||
) / 3600 / 24;
|
||||
|
||||
map((response) => {
|
||||
return {
|
||||
availableTimespanDay: availableTimespanDay,
|
||||
blockCount: parseInt(response.headers.get('x-total-count'), 10),
|
||||
};
|
||||
}),
|
||||
);
|
||||
|
@ -34,10 +34,6 @@ export class DifficultyAdjustmentsTable implements OnInit {
|
||||
.pipe(
|
||||
map((response) => {
|
||||
const data = response.body;
|
||||
const availableTimespanDay = (
|
||||
(new Date().getTime() / 1000) - (data.oldestIndexedBlockTimestamp)
|
||||
) / 3600 / 24;
|
||||
|
||||
const tableData = [];
|
||||
for (let i = data.difficulty.length - 1; i > 0; --i) {
|
||||
const selectedPowerOfTen: any = selectPowerOfTen(data.difficulty[i].difficulty);
|
||||
@ -53,7 +49,6 @@ export class DifficultyAdjustmentsTable implements OnInit {
|
||||
this.isLoading = false;
|
||||
|
||||
return {
|
||||
availableTimespanDay: availableTimespanDay,
|
||||
difficulty: tableData.slice(0, 6),
|
||||
};
|
||||
}),
|
||||
|
@ -3049,7 +3049,6 @@ export const restApiDocsData = [
|
||||
"slug": "antpool"
|
||||
},
|
||||
...
|
||||
"oldestIndexedBlockTimestamp": 1231006505,
|
||||
"blockCount": 1005,
|
||||
"lastEstimatedHashrate": 230086716765559200000
|
||||
}`
|
||||
@ -3080,7 +3079,6 @@ export const restApiDocsData = [
|
||||
},
|
||||
...
|
||||
],
|
||||
"oldestIndexedBlockTimestamp": 1296688602,
|
||||
"blockCount": 2226180,
|
||||
"lastEstimatedHashrate": 602244182177430.8
|
||||
}`
|
||||
@ -4025,111 +4023,103 @@ export const restApiDocsData = [
|
||||
esModule: [],
|
||||
commonJS: [],
|
||||
curl: [`1m`],
|
||||
response: `{
|
||||
"oldestIndexedBlockTimestamp": 1571434851,
|
||||
"blockFeeRates": [
|
||||
{
|
||||
"avgHeight": 732152,
|
||||
"timestamp": 1650132959,
|
||||
"avgFee_0": 1,
|
||||
"avgFee_10": 2,
|
||||
"avgFee_25": 2,
|
||||
"avgFee_50": 3,
|
||||
"avgFee_75": 4,
|
||||
"avgFee_90": 8,
|
||||
"avgFee_100": 393
|
||||
},
|
||||
{
|
||||
"avgHeight": 732158,
|
||||
"timestamp": 1650134432,
|
||||
"avgFee_0": 1,
|
||||
"avgFee_10": 1,
|
||||
"avgFee_25": 2,
|
||||
"avgFee_50": 4,
|
||||
"avgFee_75": 6,
|
||||
"avgFee_90": 10,
|
||||
"avgFee_100": 240
|
||||
},
|
||||
{
|
||||
"avgHeight": 732161,
|
||||
"timestamp": 1650135818,
|
||||
"avgFee_0": 1,
|
||||
"avgFee_10": 1,
|
||||
"avgFee_25": 1,
|
||||
"avgFee_50": 2,
|
||||
"avgFee_75": 5,
|
||||
"avgFee_90": 8,
|
||||
"avgFee_100": 251
|
||||
},
|
||||
...
|
||||
]
|
||||
}`
|
||||
response: `[
|
||||
{
|
||||
"avgHeight": 732152,
|
||||
"timestamp": 1650132959,
|
||||
"avgFee_0": 1,
|
||||
"avgFee_10": 2,
|
||||
"avgFee_25": 2,
|
||||
"avgFee_50": 3,
|
||||
"avgFee_75": 4,
|
||||
"avgFee_90": 8,
|
||||
"avgFee_100": 393
|
||||
},
|
||||
{
|
||||
"avgHeight": 732158,
|
||||
"timestamp": 1650134432,
|
||||
"avgFee_0": 1,
|
||||
"avgFee_10": 1,
|
||||
"avgFee_25": 2,
|
||||
"avgFee_50": 4,
|
||||
"avgFee_75": 6,
|
||||
"avgFee_90": 10,
|
||||
"avgFee_100": 240
|
||||
},
|
||||
{
|
||||
"avgHeight": 732161,
|
||||
"timestamp": 1650135818,
|
||||
"avgFee_0": 1,
|
||||
"avgFee_10": 1,
|
||||
"avgFee_25": 1,
|
||||
"avgFee_50": 2,
|
||||
"avgFee_75": 5,
|
||||
"avgFee_90": 8,
|
||||
"avgFee_100": 251
|
||||
},
|
||||
...
|
||||
]`
|
||||
},
|
||||
codeSampleTestnet: {
|
||||
esModule: [],
|
||||
commonJS: [],
|
||||
curl: [`1m`],
|
||||
response: `{
|
||||
"oldestIndexedBlockTimestamp": 1296688602,
|
||||
"blockFeeRates": [
|
||||
{
|
||||
"avgHeight": 2196306,
|
||||
"timestamp": 1650360168,
|
||||
"avgFee_0": 1,
|
||||
"avgFee_10": 1,
|
||||
"avgFee_25": 1,
|
||||
"avgFee_50": 1,
|
||||
"avgFee_75": 2,
|
||||
"avgFee_90": 28,
|
||||
"avgFee_100": 2644
|
||||
},
|
||||
{
|
||||
"avgHeight": 2196308,
|
||||
"timestamp": 1650361209,
|
||||
"avgFee_0": 1,
|
||||
"avgFee_10": 1,
|
||||
"avgFee_25": 1,
|
||||
"avgFee_50": 4,
|
||||
"avgFee_75": 12,
|
||||
"avgFee_90": 65,
|
||||
"avgFee_100": 102
|
||||
},
|
||||
...
|
||||
]
|
||||
}`
|
||||
response: `[
|
||||
{
|
||||
"avgHeight": 2196306,
|
||||
"timestamp": 1650360168,
|
||||
"avgFee_0": 1,
|
||||
"avgFee_10": 1,
|
||||
"avgFee_25": 1,
|
||||
"avgFee_50": 1,
|
||||
"avgFee_75": 2,
|
||||
"avgFee_90": 28,
|
||||
"avgFee_100": 2644
|
||||
},
|
||||
{
|
||||
"avgHeight": 2196308,
|
||||
"timestamp": 1650361209,
|
||||
"avgFee_0": 1,
|
||||
"avgFee_10": 1,
|
||||
"avgFee_25": 1,
|
||||
"avgFee_50": 4,
|
||||
"avgFee_75": 12,
|
||||
"avgFee_90": 65,
|
||||
"avgFee_100": 102
|
||||
},
|
||||
...
|
||||
]`
|
||||
},
|
||||
codeSampleSignet: {
|
||||
esModule: [],
|
||||
commonJS: [],
|
||||
curl: [`1m`],
|
||||
response: `{
|
||||
"oldestIndexedBlockTimestamp": 1598918400,
|
||||
"blockFeeRates": [
|
||||
{
|
||||
"avgHeight": 86620,
|
||||
"timestamp": 1650360010,
|
||||
"avgFee_0": 1,
|
||||
"avgFee_10": 1,
|
||||
"avgFee_25": 1,
|
||||
"avgFee_50": 1,
|
||||
"avgFee_75": 1,
|
||||
"avgFee_90": 1,
|
||||
"avgFee_100": 1
|
||||
},
|
||||
{
|
||||
"avgHeight": 86623,
|
||||
"timestamp": 1650361330,
|
||||
"avgFee_0": 1,
|
||||
"avgFee_10": 1,
|
||||
"avgFee_25": 1,
|
||||
"avgFee_50": 1,
|
||||
"avgFee_75": 1,
|
||||
"avgFee_90": 1,
|
||||
"avgFee_100": 1
|
||||
},
|
||||
...
|
||||
]
|
||||
}`
|
||||
"blockFeeRates": [
|
||||
{
|
||||
"avgHeight": 86620,
|
||||
"timestamp": 1650360010,
|
||||
"avgFee_0": 1,
|
||||
"avgFee_10": 1,
|
||||
"avgFee_25": 1,
|
||||
"avgFee_50": 1,
|
||||
"avgFee_75": 1,
|
||||
"avgFee_90": 1,
|
||||
"avgFee_100": 1
|
||||
},
|
||||
{
|
||||
"avgHeight": 86623,
|
||||
"timestamp": 1650361330,
|
||||
"avgFee_0": 1,
|
||||
"avgFee_10": 1,
|
||||
"avgFee_25": 1,
|
||||
"avgFee_50": 1,
|
||||
"avgFee_75": 1,
|
||||
"avgFee_90": 1,
|
||||
"avgFee_100": 1
|
||||
},
|
||||
...
|
||||
]`
|
||||
},
|
||||
codeSampleLiquid: emptyCodeSample,
|
||||
codeSampleLiquidTestnet: emptyCodeSample,
|
||||
|
@ -76,7 +76,6 @@ export interface SinglePoolStats {
|
||||
export interface PoolsStats {
|
||||
blockCount: number;
|
||||
lastEstimatedHashrate: number;
|
||||
oldestIndexedBlockTimestamp: number;
|
||||
pools: SinglePoolStats[];
|
||||
}
|
||||
|
||||
|
@ -189,7 +189,7 @@ export class ApiService {
|
||||
getHistoricalBlockFeeRates$(interval: string | undefined) : Observable<any> {
|
||||
return this.httpClient.get<any[]>(
|
||||
this.apiBaseUrl + this.apiBasePath + `/api/v1/mining/blocks/fee-rates` +
|
||||
(interval !== undefined ? `/${interval}` : '')
|
||||
(interval !== undefined ? `/${interval}` : ''), { observe: 'response' }
|
||||
);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user