mempool/backend/src/api/fee-api.ts

46 lines
1.4 KiB
TypeScript
Raw Normal View History

const config = require('../../mempool-config.json');
import { MempoolBlock } from '../interfaces';
import projectedBlocks from './mempool-blocks';
2019-07-21 17:59:47 +03:00
class FeeApi {
constructor() { }
defaultFee = config.LIQUID ? 0.1 : 1;
2019-07-21 17:59:47 +03:00
public getRecommendedFee() {
const pBlocks = projectedBlocks.getMempoolBlocks();
2019-07-21 17:59:47 +03:00
if (!pBlocks.length) {
return {
2020-09-28 16:32:48 +07:00
'fastestFee': this.defaultFee,
'halfHourFee': this.defaultFee,
'hourFee': this.defaultFee,
2019-07-21 17:59:47 +03: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;
2019-07-21 17:59:47 +03:00
return {
'fastestFee': firstMedianFee,
'halfHourFee': secondMedianFee,
'hourFee': thirdMedianFee,
};
}
private 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);
}
2019-07-21 17:59:47 +03:00
}
export default new FeeApi();