🚑 ability to configure min maxPriorityFeePerGas

This commit is contained in:
Pasha8914 2022-10-14 16:30:19 +10:00 committed by Danil K
parent 06b380b488
commit 4861f36c56
8 changed files with 27 additions and 12 deletions

@ -90,6 +90,7 @@ const options: GasOracleOptions = {
blockTime: 10, // seconds blockTime: 10, // seconds
shouldCache: false, shouldCache: false,
timeout: 10000, // specifies the number of milliseconds before the request times out. timeout: 10000, // specifies the number of milliseconds before the request times out.
minPriority: 0, // specifies the min maxPriorityFeePerGas.
fallbackGasPrices: { fallbackGasPrices: {
gasPrices: { gasPrices: {
instant: 28, instant: 28,

@ -1,6 +1,6 @@
{ {
"name": "gas-price-oracle", "name": "gas-price-oracle",
"version": "0.5.1", "version": "0.5.2",
"description": "Gas Price Oracle library for Ethereum dApps.", "description": "Gas Price Oracle library for Ethereum dApps.",
"homepage": "https://github.com/peppersec/gas-price-oracle", "homepage": "https://github.com/peppersec/gas-price-oracle",
"main": "./lib/index.js", "main": "./lib/index.js",

@ -16,6 +16,7 @@ export class Eip1559GasPriceOracle implements EstimateOracle {
shouldCache: false, shouldCache: false,
chainId: ChainId.MAINNET, chainId: ChainId.MAINNET,
fallbackGasPrices: undefined, fallbackGasPrices: undefined,
minPriority: DEFAULT_PRIORITY_FEE,
blockTime: DEFAULT_BLOCK_DURATION, blockTime: DEFAULT_BLOCK_DURATION,
blocksCount: NETWORKS[ChainId.MAINNET].blocksCount, blocksCount: NETWORKS[ChainId.MAINNET].blocksCount,
percentile: NETWORKS[ChainId.MAINNET].percentile, percentile: NETWORKS[ChainId.MAINNET].percentile,
@ -135,8 +136,10 @@ export class Eip1559GasPriceOracle implements EstimateOracle {
private async calculateFees({ baseFee, feeHistory }: CalculateFeesParams): Promise<EstimatedGasPrice> { private async calculateFees({ baseFee, feeHistory }: CalculateFeesParams): Promise<EstimatedGasPrice> {
const estimatedPriorityFee = await this.getPriorityFromChain(feeHistory) const estimatedPriorityFee = await this.getPriorityFromChain(feeHistory)
const { highest: maxPriorityFeePerGas } = findMax([estimatedPriorityFee ?? BG_ZERO, new BigNumber(DEFAULT_PRIORITY_FEE)]) const { highest: maxPriorityFeePerGas } = findMax([
estimatedPriorityFee ?? BG_ZERO,
new BigNumber(this.configuration.minPriority),
])
const maxFeePerGas = baseFee.plus(maxPriorityFeePerGas) const maxFeePerGas = baseFee.plus(maxPriorityFeePerGas)
if (this.checkIsGreaterThanMax(maxFeePerGas) || this.checkIsGreaterThanMax(maxPriorityFeePerGas)) { if (this.checkIsGreaterThanMax(maxFeePerGas) || this.checkIsGreaterThanMax(maxPriorityFeePerGas)) {

@ -32,7 +32,7 @@ export type GasEstimationOptionsPayload = Options & {
fetcher: RpcFetcher fetcher: RpcFetcher
} }
export type Config = Required<Options> & { fallbackGasPrices?: EstimatedGasPrice } export type Config = Required<Options> & { fallbackGasPrices?: EstimatedGasPrice; minPriority: number }
export abstract class EstimateOracle { export abstract class EstimateOracle {
public configuration: Config public configuration: Config
public abstract estimateFees(fallbackGasPrices?: EstimatedGasPrice): Promise<EstimatedGasPrice> public abstract estimateFees(fallbackGasPrices?: EstimatedGasPrice): Promise<EstimatedGasPrice>

@ -38,6 +38,7 @@ export type GasOracleOptions = {
percentile?: number percentile?: number
blockTime?: number blockTime?: number
shouldCache?: boolean shouldCache?: boolean
minPriority?: number
fallbackGasPrices?: FallbackGasPrices fallbackGasPrices?: FallbackGasPrices
} }

@ -2,9 +2,9 @@ const DEFAULT_GAS_PRICE = { instant: 0, fast: 0, standard: 0, low: 0 }
const MULTIPLIERS = { const MULTIPLIERS = {
instant: 1.3, instant: 1.3,
standard: 0.85, fast: 1.2,
low: 0.5, standard: 1.1,
fast: 1, low: 1,
} }
export { MULTIPLIERS, DEFAULT_GAS_PRICE } export { MULTIPLIERS, DEFAULT_GAS_PRICE }

@ -33,7 +33,7 @@ beforeEach('beforeEach', function () {
oracle = new GasPriceOracle() oracle = new GasPriceOracle()
}) })
const INJECTED_RPC_URL = 'https://ethereum-rpc.trustwalletapp.com' const INJECTED_RPC_URL = 'https://cloudflare-eth.com'
describe('eip-1559 gasOracle', function () { describe('eip-1559 gasOracle', function () {
describe('eip constructor', function () { describe('eip constructor', function () {
it('should set default values', function () { it('should set default values', function () {
@ -62,14 +62,14 @@ describe('eip-1559 gasOracle', function () {
describe(`estimateGas ${chainId}`, function () { describe(`estimateGas ${chainId}`, function () {
it('should return error if not eip-1559 not supported', async function () { it('should return error if not eip-1559 not supported', async function () {
if (chainId === ChainId.OPTIMISM || chainId === ChainId.ARBITRUM || chainId === ChainId.BSC) { if (chainId === ChainId.OPTIMISM || chainId === ChainId.BSC) {
await eipOracle.eip1559 await eipOracle.eip1559
.estimateFees() .estimateFees()
.should.be.rejectedWith('An error occurred while fetching current base fee, falling back') .should.be.rejectedWith('An error occurred while fetching current base fee, falling back')
} }
}) })
if (chainId === ChainId.OPTIMISM || chainId === ChainId.ARBITRUM || chainId === ChainId.BSC) { if (chainId === ChainId.OPTIMISM || chainId === ChainId.BSC) {
return return
} }
@ -143,6 +143,16 @@ describe('eip-1559 gasOracle', function () {
}) })
}) })
}) })
describe('estimate ARBITRUM', function () {
it('should be priority 0', async function () {
const eipOracle = new GasPriceOracle({ minPriority: 0, chainId: ChainId.ARBITRUM })
const estimateGas: EstimatedGasPrice = await eipOracle.eip1559.estimateFees(FALLBACK_ESTIMATE)
console.log('estimateGas.maxPriorityFeePerGas', estimateGas.maxPriorityFeePerGas)
estimateGas.maxPriorityFeePerGas.should.be.at.equal(0)
})
})
}) })
after('after', function () { after('after', function () {

@ -42,7 +42,7 @@ beforeEach('beforeEach', function () {
;({ onChainOracles, offChainOracles } = oracle.legacy) ;({ onChainOracles, offChainOracles } = oracle.legacy)
}) })
const INJECTED_RPC_URL = 'https://ethereum-rpc.trustwalletapp.com' const INJECTED_RPC_URL = 'https://cloudflare-eth.com'
describe('legacy gasOracle', function () { describe('legacy gasOracle', function () {
describe('legacy constructor', function () { describe('legacy constructor', function () {
@ -191,7 +191,7 @@ describe('legacy gasOracle', function () {
const gas = (await oracle.gasPrices({ isLegacy: true })) as unknown as GasPrice const gas = (await oracle.gasPrices({ isLegacy: true })) as unknown as GasPrice
const shouldBe = LegacyGasPriceOracle.getMultipliedPrices(NETWORKS[ChainId.MAINNET].defaultGasPrice) const shouldBe = LegacyGasPriceOracle.getCategorize(NETWORKS[ChainId.MAINNET].defaultGasPrice)
gas.instant.should.be.equal(shouldBe.instant) gas.instant.should.be.equal(shouldBe.instant)
gas.fast.should.be.equal(shouldBe.fast) gas.fast.should.be.equal(shouldBe.fast)