-
-
Notifications
You must be signed in to change notification settings - Fork 183
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Use eth_feeHistory as a fallback for gas estimates
If we are on an EIP-1559-supported network and the Metaswap API fails for some reason, fall back to using `eth_feeHistory` to calculate gas estimates (which the API uses anyway). This code is more or less taken from the code for the API ([1]). [1]: https://gitlab.com/ConsenSys/codefi/products/metaswap/gas-api/-/blob/eae6927b1a0c445e02cb3cba9e9e6b0f35857a12/src/eip1559/feeHistory.ts
- Loading branch information
Showing
10 changed files
with
692 additions
and
73 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,135 @@ | ||
import fetchFeeHistory, { EthFeeHistoryResponse } from './fetchFeeHistory'; | ||
|
||
describe('fetchFeeHistory', () => { | ||
/** | ||
* Builds an EthQuery double that returns a mock response for `eth_feeHistory`. | ||
* | ||
* @param ethFeeHistoryResponse - The response for `eth_feeHistory` | ||
* @returns The EthQuery double. | ||
*/ | ||
function buildEthQuery(ethFeeHistoryResponse: EthFeeHistoryResponse) { | ||
return { | ||
eth_feeHistory: (...args: any[]) => { | ||
const cb = args.pop(); | ||
cb(null, ethFeeHistoryResponse); | ||
}, | ||
}; | ||
} | ||
|
||
it('should return a representation of fee history from the Ethereum network, organized by block rather than type of data', async () => { | ||
// To reproduce: | ||
// | ||
// curl -X POST --data '{ | ||
// "id": 1, | ||
// "jsonrpc": "2.0", | ||
// "method": "eth_feeHistory", | ||
// "params": ["0x5", "latest", [10, 20, 30]] | ||
// }' https://mainnet.infura.io/v3/<PROJECT_ID> | ||
const ethQuery = buildEthQuery({ | ||
oldestBlock: '0xcb1939', | ||
// Note that this array contains 6 items when we requested 5. Per | ||
// <https://github.com/ethereum/go-ethereum/blob/57a3fab8a75eeb9c2f4fab770b73b51b9fe672c5/eth/gasprice/feehistory.go#L191-L192>, | ||
// baseFeePerGas will always include an extra item which is the calculated base fee for the | ||
// next (future) block. | ||
baseFeePerGas: [ | ||
'0x16eb46a3bb', | ||
'0x14cd6f0628', | ||
'0x1763700ef2', | ||
'0x1477020d14', | ||
'0x129c9eb46b', | ||
'0x134002f480', | ||
], | ||
gasUsedRatio: [ | ||
0.13060046666666666, | ||
0.9972395333333334, | ||
0, | ||
0.13780313333333333, | ||
0.6371707333333333, | ||
], | ||
reward: [ | ||
['0x59682f00', '0x59682f00', '0x59682f00'], | ||
['0x540ae480', '0x59682f00', '0x59682f00'], | ||
['0x0', '0x0', '0x0'], | ||
['0x3b9aca00', '0x3b9aca00', '0x3b9aca00'], | ||
['0x59682f00', '0x59682f00', '0x59682f00'], | ||
], | ||
}); | ||
|
||
const feeHistory = await fetchFeeHistory({ | ||
ethQuery, | ||
numberOfBlocks: 5, | ||
percentiles: [10, 20, 30], | ||
}); | ||
|
||
expect(feeHistory).toStrictEqual({ | ||
startBlockId: '0xcb1939', | ||
blocks: [ | ||
{ | ||
baseFeePerGas: 98436555707, | ||
gasUsedRatio: 0.13060046666666666, | ||
priorityFeesByPercentile: { | ||
10: 1500000000, | ||
20: 1500000000, | ||
30: 1500000000, | ||
}, | ||
}, | ||
{ | ||
baseFeePerGas: 89345951272, | ||
gasUsedRatio: 0.9972395333333334, | ||
priorityFeesByPercentile: { | ||
10: 1410000000, | ||
20: 1500000000, | ||
30: 1500000000, | ||
}, | ||
}, | ||
{ | ||
baseFeePerGas: 100452536050, | ||
gasUsedRatio: 0, | ||
priorityFeesByPercentile: { | ||
10: 0, | ||
20: 0, | ||
30: 0, | ||
}, | ||
}, | ||
{ | ||
baseFeePerGas: 87895969044, | ||
gasUsedRatio: 0.13780313333333333, | ||
priorityFeesByPercentile: { | ||
10: 1000000000, | ||
20: 1000000000, | ||
30: 1000000000, | ||
}, | ||
}, | ||
{ | ||
baseFeePerGas: 79937057899, | ||
gasUsedRatio: 0.6371707333333333, | ||
priorityFeesByPercentile: { | ||
10: 1500000000, | ||
20: 1500000000, | ||
30: 1500000000, | ||
}, | ||
}, | ||
], | ||
}); | ||
}); | ||
|
||
it('should handle an "empty" response from eth_feeHistory', async () => { | ||
const ethQuery = buildEthQuery({ | ||
oldestBlock: '0x0', | ||
baseFeePerGas: [], | ||
gasUsedRatio: [], | ||
reward: [], | ||
}); | ||
|
||
const feeHistory = await fetchFeeHistory({ | ||
ethQuery, | ||
numberOfBlocks: 5, | ||
percentiles: [10, 20, 30], | ||
}); | ||
|
||
expect(feeHistory).toStrictEqual({ | ||
startBlockId: '0x0', | ||
blocks: [], | ||
}); | ||
}); | ||
}); |
Oops, something went wrong.