feat: updated gasOracle library

This commit is contained in:
Pasha8914 2022-06-25 01:56:03 +10:00 committed by Danil Kovtonyuk
parent 9598f666fb
commit 6125b3b2af
No known key found for this signature in database
GPG key ID: E72A919BF08C3746
10 changed files with 52 additions and 331 deletions

View file

@ -1,8 +1,8 @@
/* eslint-disable no-console */
import Web3 from 'web3'
import { toHex, fromWei } from 'web3-utils'
import { GasPriceOracle } from 'gas-price-oracle'
import { serialize } from '@ethersproject/transactions'
import { toHex, toWei, toBN, fromWei } from 'web3-utils'
import networkConfig from '@/networkConfig'
import OvmGasPriceOracleABI from '@/abis/OvmGasPriceOracle.abi.json'
@ -10,39 +10,22 @@ import { DUMMY_NONCE, DUMMY_WITHDRAW_DATA } from '@/constants/variables'
export const state = () => {
return {
oracle: {
instant: 80,
fast: 50,
standard: 25,
low: 8
},
eip: {
instant: {
baseFee: 80,
maxFeePerGas: 80,
maxPriorityFeePerGas: 3
},
fast: {
baseFee: 50,
maxFeePerGas: 50,
maxPriorityFeePerGas: 3
},
standard: {
baseFee: 25,
maxFeePerGas: 27,
maxPriorityFeePerGas: 2
},
low: {
baseFee: 8,
maxFeePerGas: 9,
maxPriorityFeePerGas: 1
}
},
gasParams: { gasPrice: 50 },
l1Fee: '0'
}
}
export const getters = {
oracle: (state, getters, rootState, rootGetters) => {
const netId = Number(rootGetters['metamask/netId'])
const { gasPrices } = rootGetters['metamask/networkConfig']
return new GasPriceOracle({
chainId: netId,
defaultRpc: rootGetters['settings/currentRpc'].url,
defaultFallbackGasPrices: gasPrices
})
},
ovmGasPriceOracleContract: (state, getters, rootState) => ({ netId }) => {
const config = networkConfig[`netId${netId}`]
const { url } = rootState.settings[`netId${netId}`].rpc
@ -57,78 +40,21 @@ export const getters = {
l1Fee: (state) => {
return state.l1Fee
},
oracle: (state, getters, rootState, rootGetters) => {
const netId = Number(rootGetters['metamask/netId'])
const { gasPrices } = rootGetters['metamask/networkConfig']
return new GasPriceOracle({
chainId: netId,
defaultRpc: rootGetters['settings/currentRpc'].url,
defaultFallbackGasPrices: gasPrices
})
getGasParams: (state) => {
return state.gasParams
},
eipSupported: (state, getters, rootState, rootGetters) => {
const netId = rootGetters['metamask/netId']
const networksWithEIP1559 = [1, 5]
return networksWithEIP1559.includes(netId)
gasPrice: (state, getters) => {
const { gasPrice, maxFeePerGas } = getters.getGasParams
return toHex(maxFeePerGas || gasPrice)
},
getGasParams: (state, getters) => (speed = 'fast', isDisable = false) => {
const { maxFeePerGas, maxPriorityFeePerGas } = state.eip[speed]
if (!isDisable && getters.eipSupported) {
return {
maxFeePerGas: toHex(maxFeePerGas),
maxPriorityFeePerGas: toHex(maxPriorityFeePerGas)
}
}
return {
gasPrice: getters.getGasPrice(speed)
}
},
getGasPrice: (state, getters) => (speed = 'fast') => {
const gasPrices = getters.gasPrices
return toHex(toWei(gasPrices[speed].toString(), 'gwei'))
},
fastGasPrice: (state, getters) => {
return getters.getGasPrice('fast')
},
gasPrices: (state, getters) => {
const parseGwei = (value) => String(Math.floor(Number(fromWei(String(value), 'gwei')) * 100) / 100)
const { eip, oracle } = state
if (getters.eipSupported) {
return {
instant: parseGwei(eip.instant.maxFeePerGas),
low: parseGwei(eip.low.maxFeePerGas),
standard: parseGwei(eip.standard.maxFeePerGas),
fast: parseGwei(eip.fast.maxFeePerGas)
}
}
return {
instant: String(oracle.instant),
low: String(oracle.low),
standard: String(oracle.standard),
fast: String(oracle.fast)
}
gasPriceInGwei: (state, getters) => {
return fromWei(getters.gasPrice, 'gwei')
}
}
export const mutations = {
SAVE_ORACLE_GAS_PRICES(state, { instant, fast, standard, low }) {
this._vm.$set(state.oracle, 'instant', instant)
this._vm.$set(state.oracle, 'fast', fast)
this._vm.$set(state.oracle, 'standard', standard)
this._vm.$set(state.oracle, 'low', low)
},
SAVE_EIP_GAS_PRICES(state, { instant, fast, standard, low }) {
this._vm.$set(state.eip, 'instant', instant)
this._vm.$set(state.eip, 'fast', fast)
this._vm.$set(state.eip, 'standard', standard)
this._vm.$set(state.eip, 'low', low)
SAVE_GAS_PARAMS(state, payload) {
state.gasParams = payload
},
SAVE_L1_FEE(state, l1Fee) {
state.l1Fee = l1Fee
@ -136,85 +62,27 @@ export const mutations = {
}
export const actions = {
async fetchGasPrice({ getters, commit, dispatch, rootGetters, state }) {
async fetchGasPrice({ getters, dispatch, commit, rootGetters }) {
const netId = rootGetters['metamask/netId']
const { pollInterval } = rootGetters['metamask/networkConfig']
const isLegacy = netId === 137
try {
if (getters.eipSupported) {
const result = await dispatch('estimateFees')
commit('SAVE_EIP_GAS_PRICES', result)
} else {
const gas = await dispatch('getGasPrice')
commit('SAVE_ORACLE_GAS_PRICES', gas)
}
const txGasParams = await getters.oracle.getTxGasParams({ isLegacy })
commit('SAVE_GAS_PARAMS', txGasParams)
await dispatch('fetchL1Fee')
setTimeout(() => dispatch('fetchGasPrice'), 1000 * pollInterval)
} catch (e) {
console.error('fetchGasPrice', e)
} finally {
setTimeout(() => dispatch('fetchGasPrice'), 1000 * pollInterval)
}
},
async estimateFees({ rootGetters }) {
try {
const { url } = rootGetters['settings/currentRpc']
const web3 = this.$provider.getWeb3(url)
const latestBlock = await web3.eth.getBlock('latest')
if (!latestBlock.baseFeePerGas) {
throw new Error('An error occurred while fetching current base fee, falling back')
}
const baseFee = toBN(latestBlock.baseFeePerGas)
const potentialMaxFee = baseFee.mul(toBN(1125)).div(toBN(1000))
const GWEI = (amount) => toBN(toWei(amount, 'gwei'))
const fastPriorityFee = GWEI('4')
const standardPriorityFee = GWEI('2.5')
const lowPriorityFee = GWEI('1')
return {
instant: {
baseFee,
maxFeePerGas: potentialMaxFee.add(fastPriorityFee),
maxPriorityFeePerGas: fastPriorityFee
},
fast: {
baseFee,
maxFeePerGas: potentialMaxFee.add(fastPriorityFee),
maxPriorityFeePerGas: fastPriorityFee
},
standard: {
baseFee,
maxFeePerGas: potentialMaxFee.add(standardPriorityFee),
maxPriorityFeePerGas: standardPriorityFee
},
low: {
baseFee,
maxFeePerGas: potentialMaxFee.add(lowPriorityFee),
maxPriorityFeePerGas: lowPriorityFee
}
}
} catch (err) {
throw new Error(err.message)
}
},
async getGasPrice({ state, getters }) {
try {
const gas = await getters.oracle.gasPrices(state.oracle)
return gas
} catch (err) {
throw new Error(err.message)
}
},
setDefault({ commit, rootGetters }) {
const { gasPrices } = rootGetters['metamask/networkConfig']
commit('SAVE_ORACLE_GAS_PRICES', gasPrices)
commit('SAVE_GAS_PARAMS', { gasPrice: gasPrices?.fast })
},
async fetchL1Fee({ commit, getters, dispatch, rootGetters }) {
async fetchL1Fee({ commit, getters, rootGetters }) {
const netId = rootGetters['metamask/netId']
const isOptimismConnected = rootGetters['application/isOptimismConnected']
@ -225,15 +93,13 @@ export const actions = {
const gasLimit = rootGetters['application/withdrawGas']
const tornadoProxyInstance = rootGetters['application/tornadoProxyContract']({ netId })
const gasPrice = getters.fastGasPrice
const tx = serialize({
type: 0,
gasLimit,
gasPrice,
chainId: netId,
nonce: DUMMY_NONCE,
data: DUMMY_WITHDRAW_DATA,
gasPrice: getters.gasPrice,
to: tornadoProxyInstance._address
})