mempool/frontend/src/app/components/fees-box/fees-box.component.ts

69 lines
2.2 KiB
TypeScript
Raw Normal View History

import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core';
import { StateService } from 'src/app/services/state.service';
2020-07-29 10:20:23 +02:00
import { map, filter } from 'rxjs/operators';
2020-09-28 11:32:48 +02:00
import { merge, Observable } from 'rxjs';
import { MempoolBlock } from 'src/app/interfaces/websocket.interface';
interface FeeEstimations {
fastestFee: number;
halfHourFee: number;
hourFee: number;
}
@Component({
selector: 'app-fees-box',
templateUrl: './fees-box.component.html',
styleUrls: ['./fees-box.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FeesBoxComponent implements OnInit {
feeEstimations$: Observable<FeeEstimations>;
2020-07-30 08:13:22 +02:00
isLoadingWebSocket$: Observable<boolean>;
defaultFee: number;
constructor(
private stateService: StateService,
) { }
ngOnInit(): void {
this.defaultFee = this.stateService.network === 'liquid' ? 0.1 : 1;
2020-07-30 08:13:22 +02:00
this.isLoadingWebSocket$ = this.stateService.isLoadingWebSocket$;
this.feeEstimations$ = this.stateService.mempoolBlocks$
.pipe(
map((pBlocks) => {
2020-09-28 11:32:48 +02:00
if (!pBlocks.length) {
return {
'fastestFee': this.defaultFee,
'halfHourFee': this.defaultFee,
'hourFee': this.defaultFee,
2020-09-28 11:32:48 +02:00
};
}
const firstMedianFee = this.optimizeMedianFee(pBlocks[0]);
const secondMedianFee = pBlocks[1] ? this.optimizeMedianFee(pBlocks[1], firstMedianFee) : this.defaultFee;
const thirdMedianFee = pBlocks[2] ? this.optimizeMedianFee(pBlocks[2], secondMedianFee) : this.defaultFee;
return {
'fastestFee': firstMedianFee,
'halfHourFee': secondMedianFee,
'hourFee': thirdMedianFee,
};
})
);
}
optimizeMedianFee(pBlock: MempoolBlock, previousFee?: number): number {
const useFee = previousFee ? (pBlock.medianFee + previousFee) / 2 : pBlock.medianFee;
if (pBlock.blockVSize <= 500000) {
return this.defaultFee;
}
if (pBlock.blockVSize <= 950000) {
const multiplier = (pBlock.blockVSize - 500000) / 500000;
return Math.max(Math.round(useFee * multiplier), this.defaultFee);
}
return Math.round(useFee);
}
}