import { GasPriceOracle } from '@tornado/gas-price-oracle' import { GasPrice } from '@/types' import { ChainId } from '@/types' import { numbers, RPC_LIST } from '@/constants' import { getProvider } from '@/services' import { gweiToWei, bump } from '@/utilities' const SECONDS = 3 const TEN_SECOND = SECONDS * numbers?.SECOND const percentBump = { INSTANT: 150, FAST: 130, STANDARD: 85, LOW: 50, } const getGasPrice = async (chainId: ChainId): Promise => { if (chainId === ChainId.BSC) { return await getGasPriceFromRpc(chainId) } const instance = new GasPriceOracle({ chainId, timeout: TEN_SECOND, defaultRpc: RPC_LIST[chainId], }) const result = (await instance.gasPrices({ isLegacy: true })) as GasPrice if (chainId === ChainId.XDAI || chainId === ChainId.MAINNET) { return { instant: bump(gweiToWei(result.instant), percentBump.INSTANT), fast: bump(gweiToWei(result.instant), percentBump.FAST), standard: bump(gweiToWei(result.standard), percentBump.STANDARD), low: bump(gweiToWei(result.low), percentBump.LOW), } } return result } const getGasPriceFromRpc = async (chainId: ChainId) => { try { const { provider } = getProvider(chainId) const current = await provider.getGasPrice() return { instant: bump(current, percentBump.INSTANT), fast: bump(current, percentBump.FAST), standard: bump(current, percentBump.STANDARD), low: bump(current, percentBump.LOW), } } catch (err) { throw new Error('getGasPriceFromRpc has error') } } export { getGasPrice, getGasPriceFromRpc }