66 lines
1.8 KiB
TypeScript
66 lines
1.8 KiB
TypeScript
import { BigNumber, fetchAsync } from '@0x/utils';
|
|
|
|
import {
|
|
DEFAULT_ESTIMATED_TRANSACTION_TIME_MS,
|
|
DEFAULT_GAS_PRICE,
|
|
ETH_GAS_STATION_API_BASE_URL,
|
|
GWEI_IN_WEI,
|
|
} from '../constants';
|
|
|
|
import { errorReporter } from './error_reporter';
|
|
|
|
interface EthGasStationResult {
|
|
average: number;
|
|
fastestWait: number;
|
|
fastWait: number;
|
|
fast: number;
|
|
safeLowWait: number;
|
|
blockNum: number;
|
|
avgWait: number;
|
|
block_time: number;
|
|
speed: number;
|
|
fastest: number;
|
|
safeLow: number;
|
|
}
|
|
|
|
interface GasInfo {
|
|
gasPriceInWei: BigNumber;
|
|
estimatedTimeMs: number;
|
|
}
|
|
|
|
const fetchFastAmountInWeiAsync = async (): Promise<GasInfo> => {
|
|
const res = await fetchAsync(`${ETH_GAS_STATION_API_BASE_URL}/json/ethgasAPI.json`);
|
|
const gasInfo = (await res.json()) as EthGasStationResult;
|
|
// Eth Gas Station result is gwei * 10
|
|
const gasPriceInGwei = new BigNumber(gasInfo.fast / 10);
|
|
// Time is in minutes
|
|
const estimatedTimeMs = gasInfo.fastWait * 60 * 1000; // Minutes to MS
|
|
return { gasPriceInWei: gasPriceInGwei.multipliedBy(GWEI_IN_WEI), estimatedTimeMs };
|
|
};
|
|
|
|
export class GasPriceEstimator {
|
|
private _lastFetched?: GasInfo;
|
|
public async getGasInfoAsync(): Promise<GasInfo> {
|
|
let fetchedAmount: GasInfo | undefined;
|
|
try {
|
|
fetchedAmount = await fetchFastAmountInWeiAsync();
|
|
} catch (e) {
|
|
fetchedAmount = undefined;
|
|
errorReporter.report(e);
|
|
}
|
|
|
|
if (fetchedAmount) {
|
|
this._lastFetched = fetchedAmount;
|
|
}
|
|
|
|
return (
|
|
fetchedAmount ||
|
|
this._lastFetched || {
|
|
gasPriceInWei: DEFAULT_GAS_PRICE,
|
|
estimatedTimeMs: DEFAULT_ESTIMATED_TRANSACTION_TIME_MS,
|
|
}
|
|
);
|
|
}
|
|
}
|
|
export const gasPriceEstimator = new GasPriceEstimator();
|