Compare commits
No commits in common. "main" and "main" have entirely different histories.
@ -8,11 +8,12 @@ This is a library with a collection of onchain and offchain gas price oracle URL
|
|||||||
|
|
||||||
Current offchain list:
|
Current offchain list:
|
||||||
|
|
||||||
|
- https://ethgasstation.info/json/ethgasAPI.json
|
||||||
- https://etherchain.org/api/gasnow
|
- https://etherchain.org/api/gasnow
|
||||||
|
|
||||||
Current onchain list:
|
Current onchain list:
|
||||||
|
|
||||||
- [Chainlink aggregator](https://etherscan.io/address/0x169e633a2d1e6c10dd91238ba11c4a708dfef37c#readContract)
|
- [chainlink](https://etherscan.io/address/0x169e633a2d1e6c10dd91238ba11c4a708dfef37c#readContract)
|
||||||
|
|
||||||
### Binance Smart Chain
|
### Binance Smart Chain
|
||||||
|
|
||||||
@ -24,14 +25,13 @@ Current offchain list:
|
|||||||
|
|
||||||
Current offchain list:
|
Current offchain list:
|
||||||
|
|
||||||
- https://gnosis.blockscout.com/api/v1/gas-price-oracle
|
- https://blockscout.com/xdai/mainnet/api/v1/gas-price-oracle
|
||||||
|
|
||||||
### Polygon (Matic) Network
|
### Polygon (Matic) Network
|
||||||
|
|
||||||
Current offchain list:
|
Current offchain list:
|
||||||
|
|
||||||
- https://gasstation.polygon.technology/v2
|
- https://gasstation-mainnet.matic.network/
|
||||||
- https://matic-gas-station.tornado.ws
|
|
||||||
|
|
||||||
### Avalanche C Network
|
### Avalanche C Network
|
||||||
|
|
||||||
@ -252,9 +252,7 @@ type GetTxGasParamsRes =
|
|||||||
}
|
}
|
||||||
|
|
||||||
const gasParams: GetTxGasParamsRes = await oracle.getTxGasParams({ legacySpeed: 'fast', bumpPercent: 30 })
|
const gasParams: GetTxGasParamsRes = await oracle.getTxGasParams({ legacySpeed: 'fast', bumpPercent: 30 })
|
||||||
console.log(gasParams)
|
console.log(gasParams) // { maxFeePerGas: 17, maxPriorityFeePerGas: 3 } || { gasPrice: 19 }
|
||||||
// { maxFeePerGas: '3f5476a00', maxPriorityFeePerGas: 'b2d05e00' } || { gasPrice: '46c7cfe00' }
|
|
||||||
// equal to: { maxFeePerGas: 17 gwei, maxPriorityFeePerGas: 3 gwei } || { gasPrice: 19 gwei }
|
|
||||||
|
|
||||||
web3.eth.sendTransaction({
|
web3.eth.sendTransaction({
|
||||||
from: '0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8',
|
from: '0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8',
|
||||||
@ -269,8 +267,6 @@ web3.eth.sendTransaction({
|
|||||||
`bumpPercent` argument (`0` by default) - response data will increase by `bumpPercent`%.
|
`bumpPercent` argument (`0` by default) - response data will increase by `bumpPercent`%.
|
||||||
`legacySpeed` argument (`fast` by default) - select the speed of legacy gasPrice.
|
`legacySpeed` argument (`fast` by default) - select the speed of legacy gasPrice.
|
||||||
|
|
||||||
Returns gas info in `wei`, hex-format.
|
|
||||||
|
|
||||||
### Offchain oracles only
|
### Offchain oracles only
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@tornado/gas-price-oracle",
|
"name": "@tornado/gas-price-oracle",
|
||||||
"version": "0.5.3",
|
"version": "0.5.2-p1",
|
||||||
"description": "Gas Price Oracle library for Ethereum dApps.",
|
"description": "Gas Price Oracle library for Ethereum dApps.",
|
||||||
"homepage": "https://git.tornado.ws/tornado-packages/gas-price-oracle",
|
"homepage": "https://git.tornado.ws/tornado-packages/gas-price-oracle",
|
||||||
"main": "./lib/index.js",
|
"main": "./lib/index.js",
|
||||||
@ -8,7 +8,7 @@
|
|||||||
"types": "./lib/index.d.ts",
|
"types": "./lib/index.d.ts",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.tornado.ws/tornado-packages/gas-price-oracle"
|
"url": "https://git.tornado.ws/tornado-packages/archive-monorepo"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "ts-mocha --timeout 30000 --paths 'src/tests/*.test.ts'",
|
"test": "ts-mocha --timeout 30000 --paths 'src/tests/*.test.ts'",
|
||||||
|
@ -1,5 +1,16 @@
|
|||||||
import { OffChainOracle, OffChainOracles, OnChainOracle, OnChainOracles } from '@/services'
|
import { OffChainOracle, OffChainOracles, OnChainOracle, OnChainOracles } from '@/services'
|
||||||
|
|
||||||
|
const ethgasstation: OffChainOracle = {
|
||||||
|
name: 'ethgasstation',
|
||||||
|
url: 'https://ethgasstation.info/json/ethgasAPI.json',
|
||||||
|
instantPropertyName: 'fastest',
|
||||||
|
fastPropertyName: 'fast',
|
||||||
|
standardPropertyName: 'average',
|
||||||
|
lowPropertyName: 'safeLow',
|
||||||
|
denominator: 10,
|
||||||
|
additionalDataProperty: null,
|
||||||
|
}
|
||||||
|
|
||||||
const etherchain: OffChainOracle = {
|
const etherchain: OffChainOracle = {
|
||||||
name: 'etherchain',
|
name: 'etherchain',
|
||||||
url: 'https://etherchain.org/api/gasnow',
|
url: 'https://etherchain.org/api/gasnow',
|
||||||
@ -19,6 +30,7 @@ const chainlink: OnChainOracle = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const offChainOracles: OffChainOracles = {
|
export const offChainOracles: OffChainOracles = {
|
||||||
|
ethgasstation,
|
||||||
etherchain,
|
etherchain,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,21 +2,10 @@ import { OffChainOracle, OffChainOracles, OnChainOracles } from '@/services'
|
|||||||
|
|
||||||
const maticGasStation: OffChainOracle = {
|
const maticGasStation: OffChainOracle = {
|
||||||
name: 'maticGasStation',
|
name: 'maticGasStation',
|
||||||
url: 'https://gasstation.polygon.technology/v2',
|
url: 'https://gasstation-mainnet.matic.network',
|
||||||
instantPropertyName: 'fast.maxFee',
|
instantPropertyName: 'fastest',
|
||||||
fastPropertyName: 'fast.maxFee',
|
fastPropertyName: 'fast',
|
||||||
standardPropertyName: 'standard.maxFee',
|
standardPropertyName: 'standard',
|
||||||
lowPropertyName: 'safeLow.maxFee',
|
|
||||||
denominator: 1,
|
|
||||||
additionalDataProperty: null,
|
|
||||||
}
|
|
||||||
|
|
||||||
const tornadoMaticGasStation: OffChainOracle = {
|
|
||||||
name: 'tornadoMGasStation',
|
|
||||||
url: 'https://matic-gas-station.tornado.ws',
|
|
||||||
instantPropertyName: 'standard',
|
|
||||||
fastPropertyName: 'standard',
|
|
||||||
standardPropertyName: 'safeLow',
|
|
||||||
lowPropertyName: 'safeLow',
|
lowPropertyName: 'safeLow',
|
||||||
denominator: 1,
|
denominator: 1,
|
||||||
additionalDataProperty: null,
|
additionalDataProperty: null,
|
||||||
@ -24,7 +13,6 @@ const tornadoMaticGasStation: OffChainOracle = {
|
|||||||
|
|
||||||
export const offChainOracles: OffChainOracles = {
|
export const offChainOracles: OffChainOracles = {
|
||||||
maticGasStation,
|
maticGasStation,
|
||||||
tornadoMaticGasStation,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const onChainOracles: OnChainOracles = {}
|
export const onChainOracles: OnChainOracles = {}
|
||||||
|
@ -2,7 +2,7 @@ import { OffChainOracle, OffChainOracles, OnChainOracles } from '@/services'
|
|||||||
|
|
||||||
const blockscout: OffChainOracle = {
|
const blockscout: OffChainOracle = {
|
||||||
name: 'blockscout',
|
name: 'blockscout',
|
||||||
url: 'https://gnosis.blockscout.com/api/v1/gas-price-oracle',
|
url: 'https://blockscout.com/xdai/mainnet/api/v1/gas-price-oracle',
|
||||||
instantPropertyName: 'fast',
|
instantPropertyName: 'fast',
|
||||||
fastPropertyName: 'average',
|
fastPropertyName: 'average',
|
||||||
standardPropertyName: 'slow',
|
standardPropertyName: 'slow',
|
||||||
|
@ -16,7 +16,6 @@ import {
|
|||||||
|
|
||||||
import { ChainId, NETWORKS } from '@/config'
|
import { ChainId, NETWORKS } from '@/config'
|
||||||
import { RpcFetcher, NodeJSCache } from '@/services'
|
import { RpcFetcher, NodeJSCache } from '@/services'
|
||||||
import { resolvePropertyPath } from '@/utils'
|
|
||||||
import { GWEI, DEFAULT_TIMEOUT, GWEI_PRECISION, DEFAULT_BLOCK_DURATION } from '@/constants'
|
import { GWEI, DEFAULT_TIMEOUT, GWEI_PRECISION, DEFAULT_BLOCK_DURATION } from '@/constants'
|
||||||
|
|
||||||
import { MULTIPLIERS, DEFAULT_GAS_PRICE } from './constants'
|
import { MULTIPLIERS, DEFAULT_GAS_PRICE } from './constants'
|
||||||
@ -298,17 +297,17 @@ export class LegacyGasPriceOracle implements LegacyOracle {
|
|||||||
const response = await axios.get(url, { timeout: this.configuration.timeout })
|
const response = await axios.get(url, { timeout: this.configuration.timeout })
|
||||||
|
|
||||||
if (response.status === 200) {
|
if (response.status === 200) {
|
||||||
const gas = resolvePropertyPath(response.data, additionalDataProperty)
|
const gas = additionalDataProperty ? response.data[additionalDataProperty] : response.data
|
||||||
|
|
||||||
if (Number(resolvePropertyPath(gas, fastPropertyName)) === 0) {
|
if (Number(gas[fastPropertyName]) === 0) {
|
||||||
throw new Error(`${name} oracle provides corrupted values`)
|
throw new Error(`${name} oracle provides corrupted values`)
|
||||||
}
|
}
|
||||||
|
|
||||||
const gasPrices: GasPrice = {
|
const gasPrices: GasPrice = {
|
||||||
instant: parseFloat(resolvePropertyPath(gas, instantPropertyName)) / denominator,
|
instant: parseFloat(gas[instantPropertyName]) / denominator,
|
||||||
fast: parseFloat(resolvePropertyPath(gas, fastPropertyName)) / denominator,
|
fast: parseFloat(gas[fastPropertyName]) / denominator,
|
||||||
standard: parseFloat(resolvePropertyPath(gas, standardPropertyName)) / denominator,
|
standard: parseFloat(gas[standardPropertyName]) / denominator,
|
||||||
low: parseFloat(resolvePropertyPath(gas, lowPropertyName)) / denominator,
|
low: parseFloat(gas[lowPropertyName]) / denominator,
|
||||||
}
|
}
|
||||||
return LegacyGasPriceOracle.normalize(gasPrices)
|
return LegacyGasPriceOracle.normalize(gasPrices)
|
||||||
} else {
|
} else {
|
||||||
|
@ -5,43 +5,4 @@ const sleep = (time: number): Promise<boolean> => {
|
|||||||
return new Promise((res) => setTimeout(() => res(true), time))
|
return new Promise((res) => setTimeout(() => res(true), time))
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
export { sleep }
|
||||||
* Returns the recursively resolved value of the object's subproperty given the properties path, separated by dots.
|
|
||||||
* If properties path is null, undefined or an empty string - returns the object itself
|
|
||||||
* @param obj - The object, from which get property or subproperty
|
|
||||||
* @param propertiesInString - Property name or properties chained string, like 'user.email.domain'
|
|
||||||
* @returns The value of the subproperty by path or object itself
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
*
|
|
||||||
* ### Object
|
|
||||||
* ```ts
|
|
||||||
* const x = {
|
|
||||||
* y: {
|
|
||||||
* z: 11
|
|
||||||
* }
|
|
||||||
* };
|
|
||||||
* ```
|
|
||||||
*
|
|
||||||
* ### Property path in object
|
|
||||||
* ```ts
|
|
||||||
* const propertyPath = 'y.z';
|
|
||||||
* ```
|
|
||||||
*
|
|
||||||
* ### Usage
|
|
||||||
* ```ts
|
|
||||||
* const subpropertyValue = resolvePropertyPath(x, propertyPath);
|
|
||||||
* ```
|
|
||||||
*
|
|
||||||
* ### Result (subproperty value)
|
|
||||||
* ```ts
|
|
||||||
* 11
|
|
||||||
* ```
|
|
||||||
*/
|
|
||||||
const resolvePropertyPath = (obj: object, propertyPath: string | undefined | null): any => {
|
|
||||||
const properties = propertyPath?.split('.') || []
|
|
||||||
|
|
||||||
return properties.reduce((curr: { [key: string]: any }, nextProperty: string) => curr[nextProperty], obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
export { sleep, resolvePropertyPath }
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "archive-monorepo",
|
"name": "archive-monorepo",
|
||||||
"packageManager": "yarn@3.6.1",
|
"packageManager": "yarn@3.5.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"@tornado/*"
|
"@tornado/*"
|
||||||
|
Loading…
Reference in New Issue
Block a user