Add support for EIP1559 gas price oracle (#631)

This commit is contained in:
Kirill Fedoseev 2022-01-03 21:58:36 +07:00 committed by GitHub
parent 296e5c5a22
commit 8d732adba1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 359 additions and 49 deletions

View File

@ -8,11 +8,11 @@ COMMON_HOME_RPC_URL | The HTTPS URL(s) used to communicate to the RPC nodes in t
COMMON_FOREIGN_RPC_URL | The HTTPS URL(s) used to communicate to the RPC nodes in the Foreign network. Several URLs can be specified, delimited by spaces. If the connection to one of these nodes is lost the next URL is used for connection. | URL(s)
COMMON_HOME_BRIDGE_ADDRESS | The address of the bridge contract address in the Home network. It is used to listen to events from and send validators' transactions to the Home network. | hexidecimal beginning with "0x"
COMMON_FOREIGN_BRIDGE_ADDRESS | The address of the bridge contract address in the Foreign network. It is used to listen to events from and send validators' transactions to the Foreign network. | hexidecimal beginning with "0x"
COMMON_HOME_GAS_PRICE_SUPPLIER_URL | The URL used to get a JSON response from the gas price prediction oracle for the Home network. The gas price provided by the oracle is used to send the validator's transactions to the RPC node. Since it is assumed that the Home network has a predefined gas price (e.g. the gas price in the Core of POA.Network is `1 GWei`), the gas price oracle parameter can be omitted for such networks. | URL
COMMON_HOME_GAS_PRICE_SUPPLIER_URL | The URL used to get a JSON response from the gas price prediction oracle for the Home network. The gas price provided by the oracle is used to send the validator's transactions to the RPC node. Since it is assumed that the Home network has a predefined gas price (e.g. the gas price in the Core of POA.Network is `1 GWei`), the gas price oracle parameter can be omitted for such networks. Set to `eip1559-gas-estimation` if you want to use EIP1559 RPC-based gas estimation. | URL
COMMON_HOME_GAS_PRICE_SPEED_TYPE | Assuming the gas price oracle responds with the following JSON structure: `{"fast": 20.0, "block_time": 12.834, "health": true, "standard": 6.0, "block_number": 6470469, "instant": 71.0, "slow": 1.889}`, this parameter specifies the desirable transaction speed. The speed type can be omitted when `COMMON_HOME_GAS_PRICE_SUPPLIER_URL` is not used. | `instant` / `fast` / `standard` / `slow`
COMMON_HOME_GAS_PRICE_FALLBACK | The gas price (in Wei) that is used if both the oracle and the fall back gas price specified in the Home Bridge contract are not available. | integer
COMMON_HOME_GAS_PRICE_FACTOR | A value that will multiply the gas price of the oracle to convert it to gwei. If the oracle API returns gas prices in gwei then this can be set to `1`. Also, it could be used to intentionally pay more gas than suggested by the oracle to guarantee the transaction verification. E.g. `1.25` or `1.5`. | integer
COMMON_FOREIGN_GAS_PRICE_SUPPLIER_URL | The URL used to get a JSON response from the gas price prediction oracle for the Foreign network. The provided gas price is used to send the validator's transactions to the RPC node. If the Foreign network is Ethereum Foundation mainnet, the oracle URL can be: https://gasprice.poa.network. Otherwise this parameter can be omitted. Set to `gas-price-oracle` if you want to use npm `gas-price-oracle` package for retrieving gas price from multiple sources. | URL
COMMON_FOREIGN_GAS_PRICE_SUPPLIER_URL | The URL used to get a JSON response from the gas price prediction oracle for the Foreign network. The provided gas price is used to send the validator's transactions to the RPC node. If the Foreign network is Ethereum Foundation mainnet, the oracle URL can be: https://gasprice.poa.network. Otherwise this parameter can be omitted. Set to `gas-price-oracle` if you want to use npm `gas-price-oracle` package for retrieving gas price from multiple sources. Set to `eip1559-gas-estimation` if you want to use EIP1559 RPC-based gas estimation. | URL
COMMON_FOREIGN_GAS_PRICE_SPEED_TYPE | Assuming the gas price oracle responds with the following JSON structure: `{"fast": 20.0, "block_time": 12.834, "health": true, "standard": 6.0, "block_number": 6470469, "instant": 71.0, "slow": 1.889}`, this parameter specifies the desirable transaction speed. The speed type can be omitted when `COMMON_FOREIGN_GAS_PRICE_SUPPLIER_URL`is not used. | `instant` / `fast` / `standard` / `slow`
COMMON_FOREIGN_GAS_PRICE_FALLBACK | The gas price (in Wei) used if both the oracle and fall back gas price specified in the Foreign Bridge contract are not available. | integer
COMMON_FOREIGN_GAS_PRICE_FACTOR | A value that will multiply the gas price of the oracle to convert it to gwei. If the oracle API returns gas prices in gwei then this can be set to `1`. Also, it could be used to intentionally pay more gas than suggested by the oracle to guarantee the transaction verification. E.g. `1.25` or `1.5`. | integer

View File

@ -8,6 +8,7 @@
"test": "NODE_ENV=test mocha"
},
"dependencies": {
"@mycrypto/gas-estimation": "^1.1.0",
"gas-price-oracle": "^0.1.5",
"web3-utils": "^1.3.0",
"node-fetch": "^2.1.2"

View File

@ -1,5 +1,6 @@
const { toWei, toBN, BN } = require('web3-utils')
const { GasPriceOracle } = require('gas-price-oracle')
const { estimateFees } = require('@mycrypto/gas-estimation')
const fetch = require('node-fetch')
const { BRIDGE_MODES } = require('./constants')
const { REWARDABLE_VALIDATORS_ABI } = require('./abis')
@ -176,12 +177,20 @@ const gasPriceWithinLimits = (gasPrice, limits) => {
const normalizeGasPrice = (oracleGasPrice, factor, limits = null) => {
let gasPrice = oracleGasPrice * factor
gasPrice = gasPriceWithinLimits(gasPrice, limits)
return toBN(toWei(gasPrice.toFixed(2).toString(), 'gwei'))
return toWei(gasPrice.toFixed(2).toString(), 'gwei')
}
const gasPriceFromSupplier = async (url, options = {}) => {
const gasPriceFromSupplier = async (web3, url, options = {}) => {
try {
let json
if (url === 'eip1559-gas-estimation') {
const { maxFeePerGas, maxPriorityFeePerGas } = await estimateFees(web3)
const res = { maxFeePerGas: maxFeePerGas.toString(10), maxPriorityFeePerGas: maxPriorityFeePerGas.toString(10) }
options.logger &&
options.logger.debug &&
options.logger.debug(res, 'Gas price updated using eip1559-gas-estimation')
return res
}
if (url === 'gas-price-oracle') {
json = await gasPriceOracle.fetchGasPricesOffChain()
} else if (url) {
@ -205,7 +214,7 @@ const gasPriceFromSupplier = async (url, options = {}) => {
options.logger.debug &&
options.logger.debug({ oracleGasPrice, normalizedGasPrice }, 'Gas price updated using the API')
return normalizedGasPrice
return { gasPrice: normalizedGasPrice }
} catch (e) {
options.logger && options.logger.error && options.logger.error(`Gas Price API is not available. ${e.message}`)
}
@ -214,11 +223,11 @@ const gasPriceFromSupplier = async (url, options = {}) => {
const gasPriceFromContract = async (bridgeContract, options = {}) => {
try {
const gasPrice = await bridgeContract.methods.gasPrice().call()
const gasPrice = (await bridgeContract.methods.gasPrice().call()).toString()
options.logger &&
options.logger.debug &&
options.logger.debug({ gasPrice }, 'Gas price updated using the contracts')
return gasPrice
return { gasPrice }
} catch (e) {
options.logger &&
options.logger.error &&

View File

@ -38,7 +38,7 @@
"pino-pretty": "^2.0.1",
"promise-limit": "^2.7.0",
"promise-retry": "^1.1.1",
"web3": "^1.3.0"
"web3": "^1.6.0"
},
"devDependencies": {
"bn-chai": "^1.0.1",

View File

@ -153,11 +153,11 @@ async function main({ sendJob, txHashes }) {
}
async function sendJobTx(jobs) {
await GasPrice.start(chain, true)
const gasPrice = GasPrice.getPrice().toString(10)
const { web3 } = config.sender === 'foreign' ? config.foreign : config.home
await GasPrice.start(chain, web3, true)
const gasPriceOptions = GasPrice.gasPriceOptions()
const chainId = await getChainId(web3)
let nonce = await getNonce(web3, config.validatorAddress)
@ -174,13 +174,13 @@ async function sendJobTx(jobs) {
const txHash = await sendTx({
data: job.data,
nonce,
gasPrice,
amount: '0',
gasLimit,
privateKey: config.validatorPrivateKey,
to: job.to,
chainId,
web3
web3,
gasPriceOptions
})
nonce++
@ -197,7 +197,7 @@ async function sendJobTx(jobs) {
if (e.message.toLowerCase().includes('insufficient funds')) {
const currentBalance = await web3.eth.getBalance(config.validatorAddress)
const minimumBalance = gasLimit.multipliedBy(gasPrice)
const minimumBalance = gasLimit.multipliedBy(gasPriceOptions.gasPrice || gasPriceOptions.maxFeePerGas)
logger.error(
`Insufficient funds: ${currentBalance}. Stop processing messages until the balance is at least ${minimumBalance}.`
)

View File

@ -42,7 +42,7 @@ async function initialize() {
web3.currentProvider.urls.forEach(checkHttps(config.id))
GasPrice.start(config.id)
GasPrice.start(config.id, web3)
chainId = await getChainId(web3)
connectQueue()
@ -120,7 +120,7 @@ async function main({ msg, ackMsg, nackMsg, channel, scheduleForRetry, scheduleT
const txArray = JSON.parse(msg.content)
logger.debug(`Msg received with ${txArray.length} Tx to send`)
const gasPrice = GasPrice.getPrice().toString(10)
const gasPriceOptions = GasPrice.gasPriceOptions()
let nonce
let insufficientFunds = false
@ -158,24 +158,26 @@ async function main({ msg, ackMsg, nackMsg, channel, scheduleForRetry, scheduleT
nonce = await readNonce(true)
}
logger.info(`Transaction ${job.txHash} was not mined, updating gasPrice: ${job.gasPrice} -> ${gasPrice}`)
const oldGasPrice = JSON.stringify(job.gasPriceOptions)
const newGasPrice = JSON.stringify(gasPriceOptions)
logger.info(`Transaction ${job.txHash} was not mined, updating gasPrice: ${oldGasPrice} -> ${newGasPrice}`)
}
logger.info(`Sending transaction with nonce ${nonce}`)
const txHash = await sendTx({
data: job.data,
nonce,
gasPrice,
amount: '0',
gasLimit,
privateKey: config.validatorPrivateKey,
to: job.to,
chainId,
web3: web3Redundant
web3: web3Redundant,
gasPriceOptions
})
const resendJob = {
...job,
txHash,
gasPrice
gasPriceOptions,
...job
}
resendJobs.push(resendJob)
@ -193,7 +195,7 @@ async function main({ msg, ackMsg, nackMsg, channel, scheduleForRetry, scheduleT
if (isGasPriceError(e)) {
logger.info('Replacement transaction underpriced, forcing gas price update')
GasPrice.start(config.id)
GasPrice.start(config.id, web3)
failedTx.push(job)
} else if (isResend || isSameTransactionError(e)) {
resendJobs.push(job)
@ -207,7 +209,7 @@ async function main({ msg, ackMsg, nackMsg, channel, scheduleForRetry, scheduleT
if (isInsufficientBalanceError(e)) {
insufficientFunds = true
const currentBalance = await web3.eth.getBalance(config.validatorAddress)
minimumBalance = gasLimit.multipliedBy(gasPrice)
minimumBalance = gasLimit.multipliedBy(gasPriceOptions.gasPrice || gasPriceOptions.maxFeePerGas)
logger.error(
`Insufficient funds: ${currentBalance}. Stop processing messages until the balance is at least ${minimumBalance}.`
)

View File

@ -20,21 +20,21 @@ const {
COMMON_HOME_GAS_PRICE_FACTOR
} = process.env
let cachedGasPrice = null
let cachedGasPriceOptions = null
let fetchGasPriceInterval = null
const fetchGasPrice = async (speedType, factor, bridgeContract, gasPriceSupplierUrl) => {
const fetchGasPrice = async (speedType, factor, web3, bridgeContract, gasPriceSupplierUrl) => {
const contractOptions = { logger }
const supplierOptions = { speedType, factor, limits: GAS_PRICE_BOUNDARIES, logger }
cachedGasPrice =
(await gasPriceFromSupplier(gasPriceSupplierUrl, supplierOptions)) ||
cachedGasPriceOptions =
(await gasPriceFromSupplier(web3, gasPriceSupplierUrl, supplierOptions)) ||
(await gasPriceFromContract(bridgeContract, contractOptions)) ||
cachedGasPrice
return cachedGasPrice
cachedGasPriceOptions
return cachedGasPriceOptions
}
async function start(chainId, fetchOnce) {
async function start(chainId, web3, fetchOnce) {
clearInterval(fetchGasPriceInterval)
let contract = null
@ -49,7 +49,7 @@ async function start(chainId, fetchOnce) {
updateInterval = ORACLE_HOME_GAS_PRICE_UPDATE_INTERVAL || DEFAULT_UPDATE_INTERVAL
factor = Number(COMMON_HOME_GAS_PRICE_FACTOR) || DEFAULT_GAS_PRICE_FACTOR
cachedGasPrice = COMMON_HOME_GAS_PRICE_FALLBACK
cachedGasPriceOptions = { gasPrice: COMMON_HOME_GAS_PRICE_FALLBACK }
} else if (chainId === 'foreign') {
contract = foreign.bridgeContract
gasPriceSupplierUrl = COMMON_FOREIGN_GAS_PRICE_SUPPLIER_URL
@ -57,7 +57,7 @@ async function start(chainId, fetchOnce) {
updateInterval = ORACLE_FOREIGN_GAS_PRICE_UPDATE_INTERVAL || DEFAULT_UPDATE_INTERVAL
factor = Number(COMMON_FOREIGN_GAS_PRICE_FACTOR) || DEFAULT_GAS_PRICE_FACTOR
cachedGasPrice = COMMON_FOREIGN_GAS_PRICE_FALLBACK
cachedGasPriceOptions = { gasPrice: COMMON_FOREIGN_GAS_PRICE_FALLBACK }
} else {
throw new Error(`Unrecognized chainId '${chainId}'`)
}
@ -67,21 +67,21 @@ async function start(chainId, fetchOnce) {
}
if (fetchOnce) {
await fetchGasPrice(speedType, factor, contract, gasPriceSupplierUrl)
await fetchGasPrice(speedType, factor, web3, contract, gasPriceSupplierUrl)
} else {
fetchGasPriceInterval = await setIntervalAndRun(
() => fetchGasPrice(speedType, factor, contract, gasPriceSupplierUrl),
() => fetchGasPrice(speedType, factor, web3, contract, gasPriceSupplierUrl),
updateInterval
)
}
}
function getPrice() {
return cachedGasPrice
function gasPriceOptions() {
return cachedGasPriceOptions
}
module.exports = {
start,
getPrice,
gasPriceOptions,
fetchGasPrice
}

View File

@ -1,6 +1,7 @@
const { toWei } = require('web3').utils
async function sendTx({ privateKey, data, nonce, gasPrice, amount, gasLimit, to, chainId, web3 }) {
async function sendTx({ privateKey, data, nonce, gasPrice, gasPriceOptions, amount, gasLimit, to, chainId, web3 }) {
const gasOpts = gasPriceOptions || { gasPrice }
const serializedTx = await web3.eth.accounts.signTransaction(
{
nonce: Number(nonce),
@ -8,8 +9,8 @@ async function sendTx({ privateKey, data, nonce, gasPrice, amount, gasLimit, to,
to,
data,
value: toWei(amount),
gasPrice,
gas: gasLimit
gas: gasLimit,
...gasOpts
},
privateKey
)

View File

@ -71,10 +71,10 @@ describe('gasPrice', () => {
await gasPrice.start('home')
// when
await gasPrice.fetchGasPrice('standard', 1, null, null)
await gasPrice.fetchGasPrice('standard', 1, null, null, null)
// then
expect(gasPrice.getPrice()).to.equal('101000000000')
expect(gasPrice.gasPriceOptions()).to.eql({ gasPrice: '101000000000' })
})
it('should fetch gas from supplier', async () => {
@ -82,10 +82,10 @@ describe('gasPrice', () => {
await gasPrice.start('home')
// when
await gasPrice.fetchGasPrice('standard', 1, null, 'url')
await gasPrice.fetchGasPrice('standard', 1, null, null, 'url')
// then
expect(gasPrice.getPrice().toString()).to.equal('103000000000')
expect(gasPrice.gasPriceOptions()).to.eql({ gasPrice: '103000000000' })
})
it('should fetch gas from contract', async () => {
@ -101,10 +101,10 @@ describe('gasPrice', () => {
}
// when
await gasPrice.fetchGasPrice('standard', 1, bridgeContractMock, null)
await gasPrice.fetchGasPrice('standard', 1, null, bridgeContractMock, null)
// then
expect(gasPrice.getPrice().toString()).to.equal('102000000000')
expect(gasPrice.gasPriceOptions()).to.eql({ gasPrice: '102000000000' })
})
it('should fetch the gas price from the oracle first', async () => {
@ -120,10 +120,10 @@ describe('gasPrice', () => {
}
// when
await gasPrice.fetchGasPrice('standard', 1, bridgeContractMock, 'url')
await gasPrice.fetchGasPrice('standard', 1, null, bridgeContractMock, 'url')
// then
expect(gasPrice.getPrice().toString()).to.equal('103000000000')
expect(gasPrice.gasPriceOptions()).to.eql({ gasPrice: '103000000000' })
})
it('log error using the logger', async () => {
@ -131,7 +131,7 @@ describe('gasPrice', () => {
await gasPrice.start('home')
// when
await gasPrice.fetchGasPrice('standard', 1, null, null)
await gasPrice.fetchGasPrice('standard', 1, null, null, null)
// then
expect(fakeLogger.warn.calledOnce).to.equal(true) // one warning

View File

@ -45,5 +45,8 @@
"compile:contracts": "yarn workspace tokenbridge-contracts run compile",
"install:deploy": "cd contracts/deploy && npm install --unsafe-perm --silent",
"postinstall": "test -n \"$NOYARNPOSTINSTALL\" || ln -sf $(pwd)/node_modules/openzeppelin-solidity/ contracts/node_modules/openzeppelin-solidity"
},
"resolutions": {
"**/@mycrypto/eth-scan": "3.5.3"
}
}

294
yarn.lock
View File

@ -1268,6 +1268,14 @@
crc-32 "^1.2.0"
ethereumjs-util "^7.1.0"
"@ethereumjs/common@^2.5.0", "@ethereumjs/common@^2.6.0":
version "2.6.0"
resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.0.tgz#feb96fb154da41ee2cc2c5df667621a440f36348"
integrity sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA==
dependencies:
crc-32 "^1.2.0"
ethereumjs-util "^7.1.3"
"@ethereumjs/tx@^3.2.1":
version "3.3.0"
resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.0.tgz#14ed1b7fa0f28e1cd61e3ecbdab824205f6a4378"
@ -1276,6 +1284,14 @@
"@ethereumjs/common" "^2.4.0"
ethereumjs-util "^7.1.0"
"@ethereumjs/tx@^3.3.2":
version "3.4.0"
resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.4.0.tgz#7eb1947eefa55eb9cf05b3ca116fb7a3dbd0bce7"
integrity sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==
dependencies:
"@ethereumjs/common" "^2.6.0"
ethereumjs-util "^7.1.3"
"@ethersproject/abi@5.0.0-beta.142":
version "5.0.0-beta.142"
resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.142.tgz#cde0ced7daa2fbc98e35a2c31203331907e84a39"
@ -1555,6 +1571,11 @@
unique-filename "^1.1.1"
which "^1.3.1"
"@findeth/abi@^0.7.1":
version "0.7.1"
resolved "https://registry.yarnpkg.com/@findeth/abi/-/abi-0.7.1.tgz#60d0801cb252e587dc3228f00c00581bb748aebc"
integrity sha512-9uNu+/UxeuIibxIB7slf7BGG2PWjgBZr+rKzohhLb7VuoZjmlCcKZkenqwErROxkPdsap7OGO/o1DuYMvObMvw==
"@graphql-tools/batch-delegate@^6.2.4", "@graphql-tools/batch-delegate@^6.2.6":
version "6.2.6"
resolved "https://registry.yarnpkg.com/@graphql-tools/batch-delegate/-/batch-delegate-6.2.6.tgz#fbea98dc825f87ef29ea5f3f371912c2a2aa2f2c"
@ -2812,6 +2833,22 @@
resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121"
integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==
"@mycrypto/eth-scan@3.5.2", "@mycrypto/eth-scan@3.5.3":
version "3.5.3"
resolved "https://registry.yarnpkg.com/@mycrypto/eth-scan/-/eth-scan-3.5.3.tgz#c2c9cff253b4d2821f77ab0ba73b8f5d7dab1e4c"
integrity sha512-CbMHc+RUCANQMGKt2T65UDZY5kKOHx8lSvupq5fB4UzglcINeyeEekd6TsbW0/1G+7lUXe6fELQmtGSqEPQSvg==
dependencies:
"@findeth/abi" "^0.7.1"
isomorphic-unfetch "^3.1.0"
nanoid "^3.1.28"
"@mycrypto/gas-estimation@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@mycrypto/gas-estimation/-/gas-estimation-1.1.0.tgz#3f7af47aa487a6eb5d324db5ee11a66845c20c1e"
integrity sha512-/riP5G6DYp3uQBhC9vpWqbK+g6Uebs7AYjaivRF6V581h+PoObh0LqIZuKSzWZ5M+zPCxrrZHO43yR/jtpdq1w==
dependencies:
"@mycrypto/eth-scan" "3.5.2"
"@nodefactory/filsnap-adapter@^0.2.1":
version "0.2.2"
resolved "https://registry.yarnpkg.com/@nodefactory/filsnap-adapter/-/filsnap-adapter-0.2.2.tgz#0e182150ce3825b6c26b8512ab9355ab7759b498"
@ -10720,6 +10757,17 @@ ethereumjs-util@^7.0.10, ethereumjs-util@^7.1.0:
ethjs-util "0.1.6"
rlp "^2.2.4"
ethereumjs-util@^7.1.3:
version "7.1.3"
resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz#b55d7b64dde3e3e45749e4c41288238edec32d23"
integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw==
dependencies:
"@types/bn.js" "^5.1.0"
bn.js "^5.1.2"
create-hash "^1.1.2"
ethereum-cryptography "^0.1.3"
rlp "^2.2.4"
ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6"
@ -14006,6 +14054,14 @@ isobject@^4.0.0:
resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0"
integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==
isomorphic-unfetch@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f"
integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==
dependencies:
node-fetch "^2.6.1"
unfetch "^4.2.0"
isomorphic-ws@4.0.1, isomorphic-ws@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc"
@ -16663,6 +16719,11 @@ nanoid@^3.1.12, nanoid@^3.1.3:
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.22.tgz#b35f8fb7d151990a8aebd5aa5015c03cf726f844"
integrity sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==
nanoid@^3.1.28:
version "3.1.30"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362"
integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==
nanomatch@^1.2.9:
version "1.2.13"
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
@ -23073,6 +23134,11 @@ underscore@~1.4.4:
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604"
integrity sha1-YaajIBBiKvoHljvzJSA88SI51gQ=
unfetch@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be"
integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==
unicode-canonical-property-names-ecmascript@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
@ -23712,6 +23778,15 @@ web3-bzz@1.5.2:
got "9.6.0"
swarm-js "^0.1.40"
web3-bzz@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.6.1.tgz#8430eb3cbb69baaee4981d190b840748c37a9ec2"
integrity sha512-JbnFNbRlwwHJZPtVuCxo7rC4U4OTg+mPsyhjgPQJJhS0a6Y54OgVWYk9UA/95HqbmTJwTtX329gJoSsseEfrng==
dependencies:
"@types/node" "^12.12.6"
got "9.6.0"
swarm-js "^0.1.40"
web3-core-helpers@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.1.tgz#f5f32d71c60a4a3bd14786118e633ce7ca6d5d0d"
@ -23756,6 +23831,14 @@ web3-core-helpers@1.5.2:
web3-eth-iban "1.5.2"
web3-utils "1.5.2"
web3-core-helpers@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.6.1.tgz#cb21047306871f4cf0fedfece7d47ea2aa96141b"
integrity sha512-om2PZvK1uoWcgMq6JfcSx3241LEIVF6qi2JuHz2SLKiKEW5UsBUaVx0mNCmcZaiuYQCyOsLS3r33q5AdM+v8ng==
dependencies:
web3-eth-iban "1.6.1"
web3-utils "1.6.1"
web3-core-method@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.1.tgz#9df1bafa2cd8be9d9937e01c6a47fc768d15d90a"
@ -23814,6 +23897,17 @@ web3-core-method@1.5.2:
web3-core-subscriptions "1.5.2"
web3-utils "1.5.2"
web3-core-method@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.6.1.tgz#4ae91c639bf1da85ebfd8b99595da6a2235d7b98"
integrity sha512-szH5KyIWIaULQDBdDvevQUCHV9lsExJ/oV0ePqK+w015D2SdMPMuhii0WB+HCePaksWO+rr/GAypvV9g2T3N+w==
dependencies:
"@ethersproject/transactions" "^5.0.0-beta.135"
web3-core-helpers "1.6.1"
web3-core-promievent "1.6.1"
web3-core-subscriptions "1.6.1"
web3-utils "1.6.1"
web3-core-promievent@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.1.tgz#003e8a3eb82fb27b6164a6d5b9cad04acf733838"
@ -23851,6 +23945,13 @@ web3-core-promievent@1.5.2:
dependencies:
eventemitter3 "4.0.4"
web3-core-promievent@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.6.1.tgz#f650dea9361e2edf02691015b213fcc8ea499992"
integrity sha512-byJ5s2MQxrWdXd27pWFmujfzsTZK4ik8rDgIV1RFDFc+rHZ2nZhq+VWk7t/Nkrj7EaVXncEgTdPEHc18nx+ocQ==
dependencies:
eventemitter3 "4.0.4"
web3-core-requestmanager@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.1.tgz#fa2e2206c3d738db38db7c8fe9c107006f5c6e3d"
@ -23907,6 +24008,17 @@ web3-core-requestmanager@1.5.2:
web3-providers-ipc "1.5.2"
web3-providers-ws "1.5.2"
web3-core-requestmanager@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.6.1.tgz#d9c08b0716c9cda546a0c02767b7e08deb04448a"
integrity sha512-4y7etYEUtkfflyYVBfN1oJtCbVFNhNX1omlEYzezhTnPj3/dT7n+dhUXcqvIhx9iKA13unGfpFge80XNFfcB8A==
dependencies:
util "^0.12.0"
web3-core-helpers "1.6.1"
web3-providers-http "1.6.1"
web3-providers-ipc "1.6.1"
web3-providers-ws "1.6.1"
web3-core-subscriptions@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.1.tgz#8c2368a839d4eec1c01a4b5650bbeb82d0e4a099"
@ -23951,6 +24063,14 @@ web3-core-subscriptions@1.5.2:
eventemitter3 "4.0.4"
web3-core-helpers "1.5.2"
web3-core-subscriptions@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.6.1.tgz#4dfc1f74137354d4ac9eaa628aa916c5e2cc8741"
integrity sha512-WZwxsYttIojyGQ5RqxuQcKg0IJdDCFpUe4EncS3QKZwxPqWzGmgyLwE0rm7tP+Ux1waJn5CUaaoSCBxWGSun1g==
dependencies:
eventemitter3 "4.0.4"
web3-core-helpers "1.6.1"
web3-core@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.1.tgz#7278b58fb6495065e73a77efbbce781a7fddf1a9"
@ -24012,6 +24132,19 @@ web3-core@1.5.2:
web3-core-requestmanager "1.5.2"
web3-utils "1.5.2"
web3-core@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.6.1.tgz#b41f08fdc9ea1082d15384a3d6fa93a47c3fc1b4"
integrity sha512-m+b7UfYvU5cQUAh6NRfxRzH/5B3to1AdEQi1HIQt570cDWlObOOmoO9tY6iJnI5w4acxIO19LqjDMqEJGBYyRQ==
dependencies:
"@types/bn.js" "^4.11.5"
"@types/node" "^12.12.6"
bignumber.js "^9.0.0"
web3-core-helpers "1.6.1"
web3-core-method "1.6.1"
web3-core-requestmanager "1.6.1"
web3-utils "1.6.1"
web3-eth-abi@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.1.tgz#9b915b1c9ebf82f70cca631147035d5419064689"
@ -24056,6 +24189,14 @@ web3-eth-abi@1.5.2:
"@ethersproject/abi" "5.0.7"
web3-utils "1.5.2"
web3-eth-abi@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.6.1.tgz#15b937e3188570754d50bbac51a4bb0578600d1d"
integrity sha512-svhYrAlXP9XQtV7poWKydwDJq2CaNLMtmKydNXoOBLcQec6yGMP+v20pgrxF2H6wyTK+Qy0E3/5ciPOqC/VuoQ==
dependencies:
"@ethersproject/abi" "5.0.7"
web3-utils "1.6.1"
web3-eth-accounts@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.1.tgz#2741a8ef337a7219d57959ac8bd118b9d68d63cf"
@ -24142,6 +24283,23 @@ web3-eth-accounts@1.5.2:
web3-core-method "1.5.2"
web3-utils "1.5.2"
web3-eth-accounts@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.6.1.tgz#aeb0dfb52c4391773550569732975b471212583f"
integrity sha512-rGn3jwnuOKwaQRu4SiShz0YAQ87aVDBKs4HO43+XTCI1q1Y1jn3NOsG3BW9ZHaOckev4+zEyxze/Bsh2oEk24w==
dependencies:
"@ethereumjs/common" "^2.5.0"
"@ethereumjs/tx" "^3.3.2"
crypto-browserify "3.12.0"
eth-lib "0.2.8"
ethereumjs-util "^7.0.10"
scrypt-js "^3.0.1"
uuid "3.3.2"
web3-core "1.6.1"
web3-core-helpers "1.6.1"
web3-core-method "1.6.1"
web3-utils "1.6.1"
web3-eth-contract@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.1.tgz#3542424f3d341386fd9ff65e78060b85ac0ea8c4"
@ -24215,6 +24373,20 @@ web3-eth-contract@1.5.2:
web3-eth-abi "1.5.2"
web3-utils "1.5.2"
web3-eth-contract@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.6.1.tgz#4b0a2c0b37015d70146e54c7cb3f035a58fbeec0"
integrity sha512-GXqTe3mF6kpbOAakiNc7wtJ120/gpuKMTZjuGFKeeY8aobRLfbfgKzM9IpyqVZV2v5RLuGXDuurVN2KPgtu3hQ==
dependencies:
"@types/bn.js" "^4.11.5"
web3-core "1.6.1"
web3-core-helpers "1.6.1"
web3-core-method "1.6.1"
web3-core-promievent "1.6.1"
web3-core-subscriptions "1.6.1"
web3-eth-abi "1.6.1"
web3-utils "1.6.1"
web3-eth-ens@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.1.tgz#a0e52eee68c42a8b9865ceb04e5fb022c2d971d5"
@ -24287,6 +24459,20 @@ web3-eth-ens@1.5.2:
web3-eth-contract "1.5.2"
web3-utils "1.5.2"
web3-eth-ens@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.6.1.tgz#801bd5fb5237377ec2ed8517a9fe4634f2269c7a"
integrity sha512-ngprtbnoRgxg8s1wXt9nXpD3h1P+p7XnKXrp/8GdFI9uDmrbSQPRfzBw86jdZgOmy78hAnWmrHI6pBInmgi2qQ==
dependencies:
content-hash "^2.5.2"
eth-ens-namehash "2.0.8"
web3-core "1.6.1"
web3-core-helpers "1.6.1"
web3-core-promievent "1.6.1"
web3-eth-abi "1.6.1"
web3-eth-contract "1.6.1"
web3-utils "1.6.1"
web3-eth-iban@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.1.tgz#2c3801718946bea24e9296993a975c80b5acf880"
@ -24327,6 +24513,14 @@ web3-eth-iban@1.5.2:
bn.js "^4.11.9"
web3-utils "1.5.2"
web3-eth-iban@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.6.1.tgz#20bbed75723e3e9ff98e624979629d26329462b6"
integrity sha512-91H0jXZnWlOoXmc13O9NuQzcjThnWyAHyDn5Yf7u6mmKOhpJSGF/OHlkbpXt1Y4v2eJdEPaVFa+6i8aRyagE7Q==
dependencies:
bn.js "^4.11.9"
web3-utils "1.6.1"
web3-eth-personal@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.1.tgz#244e9911b7b482dc17c02f23a061a627c6e47faf"
@ -24386,6 +24580,18 @@ web3-eth-personal@1.5.2:
web3-net "1.5.2"
web3-utils "1.5.2"
web3-eth-personal@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.6.1.tgz#9b524fb9f92b51163f46920ee2663d34a4897c8d"
integrity sha512-ItsC89Ln02+irzJjK6ALcLrMZfbVUCqVbmb/ieDKJ+eLW3pNkBNwoUzaydh92d5NzxNZgNxuQWVdlFyYX2hkEw==
dependencies:
"@types/node" "^12.12.6"
web3-core "1.6.1"
web3-core-helpers "1.6.1"
web3-core-method "1.6.1"
web3-net "1.6.1"
web3-utils "1.6.1"
web3-eth@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.1.tgz#b9989e2557c73a9e8ffdc107c6dafbe72c79c1b0"
@ -24480,6 +24686,24 @@ web3-eth@1.5.2:
web3-net "1.5.2"
web3-utils "1.5.2"
web3-eth@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.6.1.tgz#a25aba1ac213d872ecf3f81c7b4ab8072ecae224"
integrity sha512-kOV1ZgCKypSo5BQyltRArS7ZC3bRpIKAxSgzl7pUFinUb/MxfbM9KGeNxUXoCfTSErcCQJaDjcS6bSre5EMKuQ==
dependencies:
web3-core "1.6.1"
web3-core-helpers "1.6.1"
web3-core-method "1.6.1"
web3-core-subscriptions "1.6.1"
web3-eth-abi "1.6.1"
web3-eth-accounts "1.6.1"
web3-eth-contract "1.6.1"
web3-eth-ens "1.6.1"
web3-eth-iban "1.6.1"
web3-eth-personal "1.6.1"
web3-net "1.6.1"
web3-utils "1.6.1"
web3-net@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.1.tgz#edd249503315dd5ab4fa00220f6509d95bb7ab10"
@ -24525,6 +24749,15 @@ web3-net@1.5.2:
web3-core-method "1.5.2"
web3-utils "1.5.2"
web3-net@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.6.1.tgz#7a630a804ec9f81908ae52ccbb4ebbb9530b3906"
integrity sha512-gpnqKEIwfUHh5ik7wsQFlCje1DfcmGv+Sk7LCh1hCqn++HEDQxJ/mZCrMo11ZZpZHCH7c87imdxTg96GJnRxDw==
dependencies:
web3-core "1.6.1"
web3-core-method "1.6.1"
web3-utils "1.6.1"
web3-provider-engine@14.1.0:
version "14.1.0"
resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.1.0.tgz#91590020f8b8c1b65846321310cbfdb039090fc6"
@ -24644,6 +24877,14 @@ web3-providers-http@1.5.2:
web3-core-helpers "1.5.2"
xhr2-cookies "1.1.0"
web3-providers-http@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.6.1.tgz#b59b14eefef23b98c327806f5f566303a73bd435"
integrity sha512-xBoKOJxu10+kO3ikamXmBfrWZ/xpQOGy0ocdp7Y81B17En5TXELwlmMXt1UlIgWiyYDhjq4OwlH/VODYqHXy3A==
dependencies:
web3-core-helpers "1.6.1"
xhr2-cookies "1.1.0"
web3-providers-ipc@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.1.tgz#017bfc687a8fc5398df2241eb98f135e3edd672c"
@ -24688,6 +24929,14 @@ web3-providers-ipc@1.5.2:
oboe "2.1.5"
web3-core-helpers "1.5.2"
web3-providers-ipc@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.6.1.tgz#7ba460589d46896bb3d124288deed1b6a72d517e"
integrity sha512-anyoIZlpMzwEQI4lwylTzDrHsVp20v0QUtSTp2B5jInBinmQtyCE7vnbX20jEQ4j5uPwfJabKNtoJsk6a3O4WQ==
dependencies:
oboe "2.1.5"
web3-core-helpers "1.6.1"
web3-providers-ws@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.1.tgz#2d941eaf3d5a8caa3214eff8dc16d96252b842cb"
@ -24735,6 +24984,15 @@ web3-providers-ws@1.5.2:
web3-core-helpers "1.5.2"
websocket "^1.0.32"
web3-providers-ws@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.6.1.tgz#f7ee71f158971102b865e99ea7911f483e0507e9"
integrity sha512-FWMEFYb4rYFYRgSFBf/O1Ex4p/YKSlN+JydCtdlJwRimd89qm95CTfs4xGjCskwvXMjV2sarH+f1NPwJXicYpg==
dependencies:
eventemitter3 "4.0.4"
web3-core-helpers "1.6.1"
websocket "^1.0.32"
web3-shh@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.1.tgz#4460e3c1e07faf73ddec24ccd00da46f89152b0c"
@ -24775,6 +25033,16 @@ web3-shh@1.5.2:
web3-core-subscriptions "1.5.2"
web3-net "1.5.2"
web3-shh@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.6.1.tgz#eebaab2e5e6be80fe2585c6c094fa10a03349ca7"
integrity sha512-oP00HbAtybLCGlLOZUYXOdeB9xq88k2l0TtStvKBtmFqRt+zVk5TxEeuOnVPRxNhcA2Un8RUw6FtvgZlWStu9A==
dependencies:
web3-core "1.6.1"
web3-core-method "1.6.1"
web3-core-subscriptions "1.6.1"
web3-net "1.6.1"
web3-utils@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.1.tgz#21466e38291551de0ab34558de21512ac4274534"
@ -24843,6 +25111,19 @@ web3-utils@1.5.2, web3-utils@^1.2.6:
randombytes "^2.1.0"
utf8 "3.0.0"
web3-utils@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.6.1.tgz#befcb23922b00603ab56d8c5b4158468dc494aca"
integrity sha512-RidGKv5kOkcerI6jQqDFDoTllQQqV+rPhTzZHhmbqtFObbYpU93uc+yG1LHivRTQhA6llIx67iudc/vzisgO+w==
dependencies:
bn.js "^4.11.9"
ethereum-bloom-filters "^1.0.6"
ethereumjs-util "^7.1.0"
ethjs-unit "0.1.6"
number-to-bn "1.7.0"
randombytes "^2.1.0"
utf8 "3.0.0"
web3@*, web3@1.3.5, web3@^1.3.0:
version "1.3.5"
resolved "https://registry.yarnpkg.com/web3/-/web3-1.3.5.tgz#ef4c3a2241fdd74f2f7794e839f30bc6f9814e46"
@ -24895,6 +25176,19 @@ web3@1.5.2:
web3-shh "1.5.2"
web3-utils "1.5.2"
web3@^1.6.0:
version "1.6.1"
resolved "https://registry.yarnpkg.com/web3/-/web3-1.6.1.tgz#c9e68fe7b3073adddf35393441f950ec69b92735"
integrity sha512-c299lLiyb2/WOcxh7TinwvbATaMmrgNIeAzbLbmOKHI0LcwyfsB1eu2ReOIrfrCYDYRW2KAjYr7J7gHawqDNPQ==
dependencies:
web3-bzz "1.6.1"
web3-core "1.6.1"
web3-eth "1.6.1"
web3-eth-personal "1.6.1"
web3-net "1.6.1"
web3-shh "1.6.1"
web3-utils "1.6.1"
webidl-conversions@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506"