From 611b8c539d54231dd9f881fd9fd0e1601de87ce9 Mon Sep 17 00:00:00 2001 From: Kirill Fedoseev Date: Wed, 28 Oct 2020 14:20:50 +0300 Subject: [PATCH] Improve workflow with several RPC URLs in oracle (#476) --- CONFIGURATION.md | 1 + oracle/.env.example | 1 + oracle/config/foreign-sender.config.js | 5 +- oracle/config/home-sender.config.js | 5 +- oracle/package.json | 4 +- oracle/scripts/erc20_to_erc20/sendForeign.js | 29 +- oracle/scripts/erc20_to_erc20/sendHome.js | 29 +- oracle/scripts/erc20_to_native/sendForeign.js | 29 +- oracle/scripts/erc20_to_native/sendHome.js | 17 +- oracle/scripts/getValidatorStartBlocks.js | 17 +- oracle/scripts/initialChecks.js | 15 +- oracle/scripts/native_to_erc20/sendForeign.js | 22 +- oracle/scripts/native_to_erc20/sendHome.js | 17 +- oracle/scripts/utils/utils.js | 4 +- oracle/src/confirmRelay.js | 7 +- .../estimateGas.js | 2 +- .../processAMBAffirmationRequests/index.js | 2 +- .../estimateGas.js | 2 +- .../processAMBCollectedSignatures/index.js | 2 +- .../processAMBSignatureRequests/index.js | 2 +- .../processAffirmationRequests/estimateGas.js | 2 +- .../processAffirmationRequests/index.js | 2 +- .../processCollectedSignatures/estimateGas.js | 2 +- .../processCollectedSignatures/index.js | 2 +- .../processSignatureRequests/estimateGas.js | 2 +- .../events/processSignatureRequests/index.js | 2 +- oracle/src/events/processTransfers/index.js | 2 +- oracle/src/sender.js | 12 +- oracle/src/services/HttpListProvider.js | 89 +++ .../src/services/RedundantHttpListProvider.js | 40 ++ oracle/src/services/RpcUrlsManager.js | 50 -- oracle/src/services/getRpcUrlsManager.js | 3 - oracle/src/services/web3.js | 52 +- oracle/src/tx/sendTx.js | 58 +- oracle/src/tx/web3.js | 11 +- oracle/src/utils/message.js | 8 +- oracle/src/watcher.js | 4 +- oracle/src/worker.js | 6 +- oracle/src/workers/convertToChai.js | 2 +- .../test/processAffirmationRequests.test.js | 2 +- .../test/processCollectedSignatures.test.js | 2 +- oracle/test/processSignatureRequests.test.js | 2 +- yarn.lock | 521 ++++++++++++++++-- 43 files changed, 750 insertions(+), 338 deletions(-) create mode 100644 oracle/src/services/HttpListProvider.js create mode 100644 oracle/src/services/RedundantHttpListProvider.js delete mode 100644 oracle/src/services/RpcUrlsManager.js delete mode 100644 oracle/src/services/getRpcUrlsManager.js diff --git a/CONFIGURATION.md b/CONFIGURATION.md index 87e48915..adb3c435 100644 --- a/CONFIGURATION.md +++ b/CONFIGURATION.md @@ -41,6 +41,7 @@ ORACLE_HOME_TO_FOREIGN_ALLOWANCE_LIST | Filename with a list of addresses, separ ORACLE_HOME_TO_FOREIGN_BLOCK_LIST | Filename with a list of addresses, separated by newlines. If set, determines the blocked set of accounts whose requests will not be automatically processed by the CollectedSignatures watcher. Has a lower priority than the `ORACLE_HOME_TO_FOREIGN_ALLOWANCE_LIST` | string ORACLE_HOME_TO_FOREIGN_CHECK_SENDER | If set to `true`, instructs the oracle to do an extra check for transaction origin in the block/allowance list. `false` by default. | `true` / `false` ORACLE_ALWAYS_RELAY_SIGNATURES | If set to `true`, the oracle will always relay signatures even if it was not the last who finilized the signatures collecting process. The default is `false`. | `true` / `false` +ORACLE_RPC_REQUEST_TIMEOUT | Timeout in milliseconds for a single RPC request. Default value is `ORACLE_*_RPC_POLLING_INTERVAL * 2`. | integer ## UI configuration diff --git a/oracle/.env.example b/oracle/.env.example index 0d5b45f2..d3301b5e 100644 --- a/oracle/.env.example +++ b/oracle/.env.example @@ -29,6 +29,7 @@ ORACLE_FOREIGN_START_BLOCK= ORACLE_LOG_LEVEL=debug ORACLE_MAX_PROCESSING_TIME=20000 +ORACLE_RPC_REQUEST_TIMEOUT=5000 ORACLE_HOME_TO_FOREIGN_ALLOWANCE_LIST=access-lists/allowance_list.txt ORACLE_HOME_TO_FOREIGN_BLOCK_LIST=access-lists/block_list.txt diff --git a/oracle/config/foreign-sender.config.js b/oracle/config/foreign-sender.config.js index 774f77ed..4234ee06 100644 --- a/oracle/config/foreign-sender.config.js +++ b/oracle/config/foreign-sender.config.js @@ -1,6 +1,6 @@ const baseConfig = require('./base.config') -const { web3Foreign } = require('../src/services/web3') +const { web3Foreign, web3ForeignRedundant } = require('../src/services/web3') module.exports = { ...baseConfig.bridgeConfig, @@ -8,5 +8,6 @@ module.exports = { oldQueue: 'foreign', id: 'foreign', name: 'sender-foreign', - web3: web3Foreign + web3: web3Foreign, + web3Redundant: web3ForeignRedundant } diff --git a/oracle/config/home-sender.config.js b/oracle/config/home-sender.config.js index aed9fc9d..51d9084e 100644 --- a/oracle/config/home-sender.config.js +++ b/oracle/config/home-sender.config.js @@ -1,6 +1,6 @@ const baseConfig = require('./base.config') -const { web3Home } = require('../src/services/web3') +const { web3Home, web3HomeRedundant } = require('../src/services/web3') module.exports = { ...baseConfig.bridgeConfig, @@ -8,5 +8,6 @@ module.exports = { oldQueue: 'home', id: 'home', name: 'sender-home', - web3: web3Home + web3: web3Home, + web3Redundant: web3HomeRedundant } diff --git a/oracle/package.json b/oracle/package.json index 1329b44e..77c2a600 100644 --- a/oracle/package.json +++ b/oracle/package.json @@ -26,15 +26,13 @@ "amqplib": "^0.5.2", "bignumber.js": "^7.2.1", "dotenv": "^5.0.1", - "http-list-provider": "0.0.5", "ioredis": "^3.2.2", "node-fetch": "^2.1.2", "pino": "^4.17.3", "pino-pretty": "^2.0.1", "promise-limit": "^2.7.0", "promise-retry": "^1.1.1", - "web3": "1.0.0-beta.34", - "web3-utils": "1.0.0-beta.34" + "web3": "^1.3.0" }, "devDependencies": { "bn-chai": "^1.0.1", diff --git a/oracle/scripts/erc20_to_erc20/sendForeign.js b/oracle/scripts/erc20_to_erc20/sendForeign.js index 390406dc..4928ac49 100644 --- a/oracle/scripts/erc20_to_erc20/sendForeign.js +++ b/oracle/scripts/erc20_to_erc20/sendForeign.js @@ -1,8 +1,7 @@ require('../../env') -const Web3 = require('web3') -const Web3Utils = require('web3-utils') -const rpcUrlsManager = require('../../src/services/getRpcUrlsManager') -const { sendTx, sendRawTx } = require('../../src/tx/sendTx') +const { toWei } = require('web3').utils +const { web3Foreign } = require('../../src/services/web3') +const { sendTx } = require('../../src/tx/sendTx') const { ERC20_ABI } = require('../../../commons') const { @@ -17,37 +16,23 @@ const NUMBER_OF_DEPOSITS_TO_SEND = process.argv[2] || process.env.NUMBER_OF_DEPO const { FOREIGN_ERC_TO_ERC_ABI } = require('../../../commons') -const foreignRpcUrl = rpcUrlsManager.foreignUrls[0] -const foreignProvider = new Web3.providers.HttpProvider(foreignRpcUrl) -const web3Foreign = new Web3(foreignProvider) - async function main() { const bridge = new web3Foreign.eth.Contract(FOREIGN_ERC_TO_ERC_ABI, COMMON_FOREIGN_BRIDGE_ADDRESS) const bridgeableTokenAddress = await bridge.methods.erc20token().call() const poa20 = new web3Foreign.eth.Contract(ERC20_ABI, bridgeableTokenAddress) try { - const foreignChainId = await sendRawTx({ - chain: 'foreign', - params: [], - method: 'net_version' - }) - let nonce = await sendRawTx({ - chain: 'foreign', - method: 'eth_getTransactionCount', - params: [USER_ADDRESS, 'latest'] - }) - nonce = Web3Utils.hexToNumber(nonce) + const foreignChainId = await web3Foreign.eth.getChainId() + let nonce = await web3Foreign.eth.getTransactionCount(USER_ADDRESS) let actualSent = 0 for (let i = 0; i < Number(NUMBER_OF_DEPOSITS_TO_SEND); i++) { const gasLimit = await poa20.methods - .transfer(COMMON_FOREIGN_BRIDGE_ADDRESS, Web3Utils.toWei(FOREIGN_MIN_AMOUNT_PER_TX)) + .transfer(COMMON_FOREIGN_BRIDGE_ADDRESS, toWei(FOREIGN_MIN_AMOUNT_PER_TX)) .estimateGas({ from: USER_ADDRESS }) const data = await poa20.methods - .transfer(COMMON_FOREIGN_BRIDGE_ADDRESS, Web3Utils.toWei(FOREIGN_MIN_AMOUNT_PER_TX)) + .transfer(COMMON_FOREIGN_BRIDGE_ADDRESS, toWei(FOREIGN_MIN_AMOUNT_PER_TX)) .encodeABI({ from: USER_ADDRESS }) const txHash = await sendTx({ - chain: 'foreign', privateKey: USER_ADDRESS_PRIVATE_KEY, data, nonce, diff --git a/oracle/scripts/erc20_to_erc20/sendHome.js b/oracle/scripts/erc20_to_erc20/sendHome.js index 816b9a19..f31c8454 100644 --- a/oracle/scripts/erc20_to_erc20/sendHome.js +++ b/oracle/scripts/erc20_to_erc20/sendHome.js @@ -1,8 +1,7 @@ require('../../env') -const Web3 = require('web3') -const Web3Utils = require('web3-utils') -const rpcUrlsManager = require('../../src/services/getRpcUrlsManager') -const { sendTx, sendRawTx } = require('../../src/tx/sendTx') +const { toWei } = require('web3').utils +const { web3Home } = require('../../src/services/web3') +const { sendTx } = require('../../src/tx/sendTx') const { isValidAmount } = require('../utils/utils') const { HOME_ERC_TO_ERC_ABI } = require('../../../commons') @@ -46,10 +45,6 @@ const BRIDGEABLE_TOKEN_ABI = [ } ] -const homeRpcUrl = rpcUrlsManager.homeUrls[0] -const homeProvider = new Web3.providers.HttpProvider(homeRpcUrl) -const web3Home = new Web3(homeProvider) - async function main() { const bridge = new web3Home.eth.Contract(HOME_ERC_TO_ERC_ABI, COMMON_HOME_BRIDGE_ADDRESS) const BRIDGEABLE_TOKEN_ADDRESS = await bridge.methods.erc677token().call() @@ -58,27 +53,17 @@ async function main() { try { await isValidAmount(HOME_MIN_AMOUNT_PER_TX, bridge) - const homeChainId = await sendRawTx({ - chain: 'home', - params: [], - method: 'net_version' - }) - let nonce = await sendRawTx({ - chain: 'home', - method: 'eth_getTransactionCount', - params: [USER_ADDRESS, 'latest'] - }) - nonce = Web3Utils.hexToNumber(nonce) + const homeChainId = await web3Home.eth.getChainId() + let nonce = await web3Home.eth.getTransactionCount(USER_ADDRESS) let actualSent = 0 for (let i = 0; i < Number(NUMBER_OF_WITHDRAWALS_TO_SEND); i++) { const gasLimit = await erc677.methods - .transferAndCall(COMMON_HOME_BRIDGE_ADDRESS, Web3Utils.toWei(HOME_MIN_AMOUNT_PER_TX), '0x') + .transferAndCall(COMMON_HOME_BRIDGE_ADDRESS, toWei(HOME_MIN_AMOUNT_PER_TX), '0x') .estimateGas({ from: USER_ADDRESS }) const data = await erc677.methods - .transferAndCall(COMMON_HOME_BRIDGE_ADDRESS, Web3Utils.toWei(HOME_MIN_AMOUNT_PER_TX), '0x') + .transferAndCall(COMMON_HOME_BRIDGE_ADDRESS, toWei(HOME_MIN_AMOUNT_PER_TX), '0x') .encodeABI({ from: USER_ADDRESS }) const txHash = await sendTx({ - chain: 'home', privateKey: USER_ADDRESS_PRIVATE_KEY, data, nonce, diff --git a/oracle/scripts/erc20_to_native/sendForeign.js b/oracle/scripts/erc20_to_native/sendForeign.js index 3b502da5..d6922908 100644 --- a/oracle/scripts/erc20_to_native/sendForeign.js +++ b/oracle/scripts/erc20_to_native/sendForeign.js @@ -1,8 +1,7 @@ require('../../env') -const Web3 = require('web3') -const Web3Utils = require('web3-utils') -const rpcUrlsManager = require('../../src/services/getRpcUrlsManager') -const { sendTx, sendRawTx } = require('../../src/tx/sendTx') +const { toWei } = require('web3').utils +const { web3Foreign } = require('../../src/services/web3') +const { sendTx } = require('../../src/tx/sendTx') const { USER_ADDRESS, @@ -16,37 +15,23 @@ const NUMBER_OF_DEPOSITS_TO_SEND = process.argv[2] || process.env.NUMBER_OF_DEPO const { ERC20_ABI, FOREIGN_ERC_TO_NATIVE_ABI } = require('../../../commons') -const foreignRpcUrl = rpcUrlsManager.foreignUrls[0] -const foreignProvider = new Web3.providers.HttpProvider(foreignRpcUrl) -const web3Foreign = new Web3(foreignProvider) - async function main() { const bridge = new web3Foreign.eth.Contract(FOREIGN_ERC_TO_NATIVE_ABI, COMMON_FOREIGN_BRIDGE_ADDRESS) const bridgeableTokenAddress = await bridge.methods.erc20token().call() const poa20 = new web3Foreign.eth.Contract(ERC20_ABI, bridgeableTokenAddress) try { - const foreignChainId = await sendRawTx({ - chain: 'foreign', - params: [], - method: 'net_version' - }) - let nonce = await sendRawTx({ - chain: 'foreign', - method: 'eth_getTransactionCount', - params: [USER_ADDRESS, 'latest'] - }) - nonce = Web3Utils.hexToNumber(nonce) + const foreignChainId = await web3Foreign.eth.getChainId() + let nonce = await web3Foreign.eth.getTransactionCount(USER_ADDRESS) let actualSent = 0 for (let i = 0; i < Number(NUMBER_OF_DEPOSITS_TO_SEND); i++) { const gasLimit = await poa20.methods - .transfer(COMMON_FOREIGN_BRIDGE_ADDRESS, Web3Utils.toWei(FOREIGN_MIN_AMOUNT_PER_TX)) + .transfer(COMMON_FOREIGN_BRIDGE_ADDRESS, toWei(FOREIGN_MIN_AMOUNT_PER_TX)) .estimateGas({ from: USER_ADDRESS }) const data = await poa20.methods - .transfer(COMMON_FOREIGN_BRIDGE_ADDRESS, Web3Utils.toWei(FOREIGN_MIN_AMOUNT_PER_TX)) + .transfer(COMMON_FOREIGN_BRIDGE_ADDRESS, toWei(FOREIGN_MIN_AMOUNT_PER_TX)) .encodeABI({ from: USER_ADDRESS }) const txHash = await sendTx({ - chain: 'foreign', privateKey: USER_ADDRESS_PRIVATE_KEY, data, nonce, diff --git a/oracle/scripts/erc20_to_native/sendHome.js b/oracle/scripts/erc20_to_native/sendHome.js index 49ba234e..327c695f 100644 --- a/oracle/scripts/erc20_to_native/sendHome.js +++ b/oracle/scripts/erc20_to_native/sendHome.js @@ -1,7 +1,6 @@ require('../../env') -const Web3Utils = require('web3-utils') const { web3Home } = require('../../src/services/web3') -const { sendTx, sendRawTx } = require('../../src/tx/sendTx') +const { sendTx } = require('../../src/tx/sendTx') const { isValidAmount } = require('../utils/utils') const { HOME_ERC_TO_NATIVE_ABI } = require('../../../commons') @@ -21,21 +20,11 @@ async function main() { try { await isValidAmount(HOME_MIN_AMOUNT_PER_TX, bridge) - const homeChainId = await sendRawTx({ - chain: 'home', - params: [], - method: 'net_version' - }) - let nonce = await sendRawTx({ - chain: 'home', - method: 'eth_getTransactionCount', - params: [USER_ADDRESS, 'latest'] - }) - nonce = Web3Utils.hexToNumber(nonce) + const homeChainId = await web3Home.eth.getChainId() + let nonce = await web3Home.eth.getTransactionCount(USER_ADDRESS) let actualSent = 0 for (let i = 0; i < Number(NUMBER_OF_DEPOSITS_TO_SEND); i++) { const txHash = await sendTx({ - chain: 'home', privateKey: USER_ADDRESS_PRIVATE_KEY, data: '0x', nonce, diff --git a/oracle/scripts/getValidatorStartBlocks.js b/oracle/scripts/getValidatorStartBlocks.js index c61a4bad..4276e524 100644 --- a/oracle/scripts/getValidatorStartBlocks.js +++ b/oracle/scripts/getValidatorStartBlocks.js @@ -1,23 +1,20 @@ require('../env') -const Web3 = require('web3') const { BRIDGE_VALIDATORS_ABI } = require('../../commons') -const rpcUrlsManager = require('../src/services/getRpcUrlsManager') +const { web3Home, web3Foreign } = require('../src/services/web3') const { bridgeConfig } = require('../config/base.config') const homeABI = bridgeConfig.homeBridgeAbi const foreignABI = bridgeConfig.foreignBridgeAbi -async function getStartBlock(rpcUrl, bridgeAddress, bridgeAbi) { +async function getStartBlock(web3, bridgeAddress, bridgeAbi) { try { - const web3Provider = new Web3.providers.HttpProvider(rpcUrl) - const web3Instance = new Web3(web3Provider) - const bridgeContract = new web3Instance.eth.Contract(bridgeAbi, bridgeAddress) + const bridgeContract = new web3.eth.Contract(bridgeAbi, bridgeAddress) const deployedAtBlock = await bridgeContract.methods.deployedAtBlock().call() const validatorContractAddress = await bridgeContract.methods.validatorContract().call() - const validatorContract = new web3Instance.eth.Contract(BRIDGE_VALIDATORS_ABI, validatorContractAddress) + const validatorContract = new web3.eth.Contract(BRIDGE_VALIDATORS_ABI, validatorContractAddress) const validatorDeployedAtBlock = await validatorContract.methods.deployedAtBlock().call() @@ -35,10 +32,8 @@ async function getStartBlock(rpcUrl, bridgeAddress, bridgeAbi) { async function main() { const { COMMON_HOME_BRIDGE_ADDRESS, COMMON_FOREIGN_BRIDGE_ADDRESS } = process.env - const homeRpcUrl = rpcUrlsManager.homeUrls[0] - const foreignRpcUrl = rpcUrlsManager.foreignUrls[0] - const homeStartBlock = await getStartBlock(homeRpcUrl, COMMON_HOME_BRIDGE_ADDRESS, homeABI) - const foreignStartBlock = await getStartBlock(foreignRpcUrl, COMMON_FOREIGN_BRIDGE_ADDRESS, foreignABI) + const homeStartBlock = await getStartBlock(web3Home, COMMON_HOME_BRIDGE_ADDRESS, homeABI) + const foreignStartBlock = await getStartBlock(web3Foreign, COMMON_FOREIGN_BRIDGE_ADDRESS, foreignABI) const result = { homeStartBlock, foreignStartBlock diff --git a/oracle/scripts/initialChecks.js b/oracle/scripts/initialChecks.js index 45b9bded..57fa3305 100644 --- a/oracle/scripts/initialChecks.js +++ b/oracle/scripts/initialChecks.js @@ -1,5 +1,4 @@ require('../env') -const Web3 = require('web3') const { getTokensState } = require('../src/utils/tokenState') const { ERC677_BRIDGE_TOKEN_ABI, @@ -7,6 +6,7 @@ const { FOREIGN_ERC_TO_NATIVE_ABI, getTokenType } = require('../../commons') +const { web3Foreign } = require('../src/services/web3') const emptyLogger = { debug: () => {}, @@ -14,26 +14,25 @@ const emptyLogger = { } async function initialChecks() { - const { ORACLE_BRIDGE_MODE, COMMON_FOREIGN_RPC_URL, COMMON_FOREIGN_BRIDGE_ADDRESS } = process.env + const { ORACLE_BRIDGE_MODE, COMMON_FOREIGN_BRIDGE_ADDRESS } = process.env let result = {} - const foreignWeb3 = new Web3(new Web3.providers.HttpProvider(COMMON_FOREIGN_RPC_URL)) if (ORACLE_BRIDGE_MODE === 'ERC_TO_ERC') { - const bridge = new foreignWeb3.eth.Contract(FOREIGN_ERC_TO_ERC_ABI, COMMON_FOREIGN_BRIDGE_ADDRESS) + const bridge = new web3Foreign.eth.Contract(FOREIGN_ERC_TO_ERC_ABI, COMMON_FOREIGN_BRIDGE_ADDRESS) result.bridgeableTokenAddress = await bridge.methods.erc20token().call() } else if (ORACLE_BRIDGE_MODE === 'ERC_TO_NATIVE') { - const bridge = new foreignWeb3.eth.Contract(FOREIGN_ERC_TO_NATIVE_ABI, COMMON_FOREIGN_BRIDGE_ADDRESS) + const bridge = new web3Foreign.eth.Contract(FOREIGN_ERC_TO_NATIVE_ABI, COMMON_FOREIGN_BRIDGE_ADDRESS) result = await getTokensState(bridge, emptyLogger) } if (ORACLE_BRIDGE_MODE === 'ERC_TO_ERC') { - const bridgeTokenContract = new foreignWeb3.eth.Contract(ERC677_BRIDGE_TOKEN_ABI, result.bridgeableTokenAddress) + const bridgeTokenContract = new web3Foreign.eth.Contract(ERC677_BRIDGE_TOKEN_ABI, result.bridgeableTokenAddress) result.foreignERC = await getTokenType(bridgeTokenContract, COMMON_FOREIGN_BRIDGE_ADDRESS) } console.log(JSON.stringify(result)) return result } -initialChecks() +const result = initialChecks() -module.exports = initialChecks +module.exports = result diff --git a/oracle/scripts/native_to_erc20/sendForeign.js b/oracle/scripts/native_to_erc20/sendForeign.js index a7f97583..6500fb78 100644 --- a/oracle/scripts/native_to_erc20/sendForeign.js +++ b/oracle/scripts/native_to_erc20/sendForeign.js @@ -1,7 +1,7 @@ require('../../env') -const Web3Utils = require('web3-utils') +const { toWei } = require('web3').utils const { web3Foreign } = require('../../src/services/web3') -const { sendTx, sendRawTx } = require('../../src/tx/sendTx') +const { sendTx } = require('../../src/tx/sendTx') const { isValidAmount } = require('../utils/utils') const { FOREIGN_NATIVE_TO_ERC_ABI } = require('../../../commons') @@ -53,27 +53,17 @@ async function main() { try { await isValidAmount(FOREIGN_MIN_AMOUNT_PER_TX, bridge) - const foreignChainId = await sendRawTx({ - chain: 'foreign', - params: [], - method: 'net_version' - }) - let nonce = await sendRawTx({ - chain: 'foreign', - method: 'eth_getTransactionCount', - params: [USER_ADDRESS, 'latest'] - }) - nonce = Web3Utils.hexToNumber(nonce) + const foreignChainId = await web3Foreign.eth.getChainId() + let nonce = await web3Foreign.eth.getTransactionCount(USER_ADDRESS) let actualSent = 0 for (let i = 0; i < Number(NUMBER_OF_WITHDRAWALS_TO_SEND); i++) { const gasLimit = await poa20.methods - .transferAndCall(COMMON_FOREIGN_BRIDGE_ADDRESS, Web3Utils.toWei(FOREIGN_MIN_AMOUNT_PER_TX), '0x') + .transferAndCall(COMMON_FOREIGN_BRIDGE_ADDRESS, toWei(FOREIGN_MIN_AMOUNT_PER_TX), '0x') .estimateGas({ from: USER_ADDRESS }) const data = await poa20.methods - .transferAndCall(COMMON_FOREIGN_BRIDGE_ADDRESS, Web3Utils.toWei(FOREIGN_MIN_AMOUNT_PER_TX), '0x') + .transferAndCall(COMMON_FOREIGN_BRIDGE_ADDRESS, toWei(FOREIGN_MIN_AMOUNT_PER_TX), '0x') .encodeABI({ from: USER_ADDRESS }) const txHash = await sendTx({ - chain: 'foreign', privateKey: USER_ADDRESS_PRIVATE_KEY, data, nonce, diff --git a/oracle/scripts/native_to_erc20/sendHome.js b/oracle/scripts/native_to_erc20/sendHome.js index 5f3e6ce6..85a32814 100644 --- a/oracle/scripts/native_to_erc20/sendHome.js +++ b/oracle/scripts/native_to_erc20/sendHome.js @@ -1,7 +1,6 @@ require('../../env') -const Web3Utils = require('web3-utils') const { web3Home } = require('../../src/services/web3') -const { sendTx, sendRawTx } = require('../../src/tx/sendTx') +const { sendTx } = require('../../src/tx/sendTx') const { isValidAmount } = require('../utils/utils') const { HOME_NATIVE_TO_ERC_ABI } = require('../../../commons') @@ -21,21 +20,11 @@ async function main() { try { await isValidAmount(HOME_MIN_AMOUNT_PER_TX, bridge) - const homeChainId = await sendRawTx({ - chain: 'home', - params: [], - method: 'net_version' - }) - let nonce = await sendRawTx({ - chain: 'home', - method: 'eth_getTransactionCount', - params: [USER_ADDRESS, 'latest'] - }) - nonce = Web3Utils.hexToNumber(nonce) + const homeChainId = await web3Home.eth.getChainId() + let nonce = await web3Home.eth.getTransactionCount(USER_ADDRESS) let actualSent = 0 for (let i = 0; i < Number(NUMBER_OF_DEPOSITS_TO_SEND); i++) { const txHash = await sendTx({ - chain: 'home', privateKey: USER_ADDRESS_PRIVATE_KEY, data: '0x', nonce, diff --git a/oracle/scripts/utils/utils.js b/oracle/scripts/utils/utils.js index 458746da..f995447e 100644 --- a/oracle/scripts/utils/utils.js +++ b/oracle/scripts/utils/utils.js @@ -1,8 +1,8 @@ -const Web3Utils = require('web3-utils') +const { fromWei } = require('web3').utils async function getMinPerTxLimit(bridge) { const minPerTx = await bridge.methods.minPerTx().call() - return Web3Utils.fromWei(minPerTx) + return fromWei(minPerTx) } async function isValidAmount(amount, bridge) { diff --git a/oracle/src/confirmRelay.js b/oracle/src/confirmRelay.js index 15eeb70e..f4ca59f6 100644 --- a/oracle/src/confirmRelay.js +++ b/oracle/src/confirmRelay.js @@ -3,7 +3,6 @@ const path = require('path') const { isAttached, connectWatcherToQueue, connection } = require('./services/amqpClient') const logger = require('./services/logger') const GasPrice = require('./services/gasPrice') -const rpcUrlsManager = require('./services/getRpcUrlsManager') const { getNonce, getChainId, getEventsFromTx } = require('./tx/web3') const { sendTx } = require('./tx/sendTx') const { checkHTTPS, watchdog, syncForEach, addExtraGas } = require('./utils/utils') @@ -37,8 +36,7 @@ async function initialize() { try { const checkHttps = checkHTTPS(ORACLE_ALLOW_HTTP_FOR_RPC, logger) - rpcUrlsManager.homeUrls.forEach(checkHttps('home')) - rpcUrlsManager.foreignUrls.forEach(checkHttps('foreign')) + web3Instance.currentProvider.urls.forEach(checkHttps(config.chain)) attached = await isAttached() if (attached) { @@ -139,7 +137,7 @@ async function main({ sendJob, txHash }) { async function sendJobTx(jobs) { const gasPrice = await GasPrice.start(config.chain, true) - const chainId = await getChainId(config.chain) + const chainId = await getChainId(web3Instance) let nonce = await getNonce(web3Instance, ORACLE_VALIDATOR_ADDRESS) await syncForEach(jobs, async job => { @@ -153,7 +151,6 @@ async function sendJobTx(jobs) { try { logger.info(`Sending transaction with nonce ${nonce}`) const txHash = await sendTx({ - chain: config.chain, data: job.data, nonce, gasPrice: gasPrice.toString(10), diff --git a/oracle/src/events/processAMBAffirmationRequests/estimateGas.js b/oracle/src/events/processAMBAffirmationRequests/estimateGas.js index c8ea4470..40332d4f 100644 --- a/oracle/src/events/processAMBAffirmationRequests/estimateGas.js +++ b/oracle/src/events/processAMBAffirmationRequests/estimateGas.js @@ -1,4 +1,4 @@ -const { HttpListProviderError } = require('http-list-provider') +const { HttpListProviderError } = require('../../services/HttpListProvider') const { AlreadyProcessedError, AlreadySignedError, InvalidValidatorError } = require('../../utils/errors') const logger = require('../../services/logger').child({ module: 'processAffirmationRequests:estimateGas' diff --git a/oracle/src/events/processAMBAffirmationRequests/index.js b/oracle/src/events/processAMBAffirmationRequests/index.js index cf0b61a6..94c91c25 100644 --- a/oracle/src/events/processAMBAffirmationRequests/index.js +++ b/oracle/src/events/processAMBAffirmationRequests/index.js @@ -1,6 +1,6 @@ require('dotenv').config() -const { HttpListProviderError } = require('http-list-provider') const promiseLimit = require('promise-limit') +const { HttpListProviderError } = require('../../services/HttpListProvider') const rootLogger = require('../../services/logger') const { web3Home } = require('../../services/web3') const bridgeValidatorsABI = require('../../../../contracts/build/contracts/BridgeValidators').abi diff --git a/oracle/src/events/processAMBCollectedSignatures/estimateGas.js b/oracle/src/events/processAMBCollectedSignatures/estimateGas.js index f14134d6..89732676 100644 --- a/oracle/src/events/processAMBCollectedSignatures/estimateGas.js +++ b/oracle/src/events/processAMBCollectedSignatures/estimateGas.js @@ -1,5 +1,5 @@ const Web3 = require('web3') -const { HttpListProviderError } = require('http-list-provider') +const { HttpListProviderError } = require('../../services/HttpListProvider') const { AlreadyProcessedError, IncompatibleContractError, InvalidValidatorError } = require('../../utils/errors') const logger = require('../../services/logger').child({ module: 'processCollectedSignatures:estimateGas' diff --git a/oracle/src/events/processAMBCollectedSignatures/index.js b/oracle/src/events/processAMBCollectedSignatures/index.js index 05af5397..fe983728 100644 --- a/oracle/src/events/processAMBCollectedSignatures/index.js +++ b/oracle/src/events/processAMBCollectedSignatures/index.js @@ -1,6 +1,6 @@ require('dotenv').config() const promiseLimit = require('promise-limit') -const { HttpListProviderError } = require('http-list-provider') +const { HttpListProviderError } = require('../../services/HttpListProvider') const bridgeValidatorsABI = require('../../../../contracts/build/contracts/BridgeValidators').abi const rootLogger = require('../../services/logger') const { web3Home, web3Foreign } = require('../../services/web3') diff --git a/oracle/src/events/processAMBSignatureRequests/index.js b/oracle/src/events/processAMBSignatureRequests/index.js index 0efc3c03..0840768d 100644 --- a/oracle/src/events/processAMBSignatureRequests/index.js +++ b/oracle/src/events/processAMBSignatureRequests/index.js @@ -1,6 +1,6 @@ require('dotenv').config() const promiseLimit = require('promise-limit') -const { HttpListProviderError } = require('http-list-provider') +const { HttpListProviderError } = require('../../services/HttpListProvider') const bridgeValidatorsABI = require('../../../../contracts/build/contracts/BridgeValidators').abi const rootLogger = require('../../services/logger') const { web3Home } = require('../../services/web3') diff --git a/oracle/src/events/processAffirmationRequests/estimateGas.js b/oracle/src/events/processAffirmationRequests/estimateGas.js index 82cbf792..f49ae4e5 100644 --- a/oracle/src/events/processAffirmationRequests/estimateGas.js +++ b/oracle/src/events/processAffirmationRequests/estimateGas.js @@ -1,4 +1,4 @@ -const { HttpListProviderError } = require('http-list-provider') +const { HttpListProviderError } = require('../../services/HttpListProvider') const { AlreadyProcessedError, AlreadySignedError, InvalidValidatorError } = require('../../utils/errors') const logger = require('../../services/logger').child({ module: 'processAffirmationRequests:estimateGas' diff --git a/oracle/src/events/processAffirmationRequests/index.js b/oracle/src/events/processAffirmationRequests/index.js index d7f198ba..5f89d631 100644 --- a/oracle/src/events/processAffirmationRequests/index.js +++ b/oracle/src/events/processAffirmationRequests/index.js @@ -1,6 +1,6 @@ require('../../../env') const promiseLimit = require('promise-limit') -const { HttpListProviderError } = require('http-list-provider') +const { HttpListProviderError } = require('../../services/HttpListProvider') const rootLogger = require('../../services/logger') const { web3Home } = require('../../services/web3') diff --git a/oracle/src/events/processCollectedSignatures/estimateGas.js b/oracle/src/events/processCollectedSignatures/estimateGas.js index cad273d6..dae22325 100644 --- a/oracle/src/events/processCollectedSignatures/estimateGas.js +++ b/oracle/src/events/processCollectedSignatures/estimateGas.js @@ -1,5 +1,5 @@ const Web3 = require('web3') -const { HttpListProviderError } = require('http-list-provider') +const { HttpListProviderError } = require('../../services/HttpListProvider') const { AlreadyProcessedError, IncompatibleContractError, InvalidValidatorError } = require('../../utils/errors') const { parseMessage } = require('../../utils/message') const logger = require('../../services/logger').child({ diff --git a/oracle/src/events/processCollectedSignatures/index.js b/oracle/src/events/processCollectedSignatures/index.js index 91e21ba4..75ecc9de 100644 --- a/oracle/src/events/processCollectedSignatures/index.js +++ b/oracle/src/events/processCollectedSignatures/index.js @@ -1,6 +1,6 @@ require('../../../env') const promiseLimit = require('promise-limit') -const { HttpListProviderError } = require('http-list-provider') +const { HttpListProviderError } = require('../../services/HttpListProvider') const { BRIDGE_VALIDATORS_ABI } = require('../../../../commons') const rootLogger = require('../../services/logger') const { web3Home, web3Foreign } = require('../../services/web3') diff --git a/oracle/src/events/processSignatureRequests/estimateGas.js b/oracle/src/events/processSignatureRequests/estimateGas.js index 79a3523d..374e0817 100644 --- a/oracle/src/events/processSignatureRequests/estimateGas.js +++ b/oracle/src/events/processSignatureRequests/estimateGas.js @@ -1,4 +1,4 @@ -const { HttpListProviderError } = require('http-list-provider') +const { HttpListProviderError } = require('../../services/HttpListProvider') const { AlreadyProcessedError, AlreadySignedError, InvalidValidatorError } = require('../../utils/errors') const logger = require('../../services/logger').child({ module: 'processSignatureRequests:estimateGas' diff --git a/oracle/src/events/processSignatureRequests/index.js b/oracle/src/events/processSignatureRequests/index.js index 9a465044..81e955e7 100644 --- a/oracle/src/events/processSignatureRequests/index.js +++ b/oracle/src/events/processSignatureRequests/index.js @@ -1,6 +1,6 @@ require('../../../env') const promiseLimit = require('promise-limit') -const { HttpListProviderError } = require('http-list-provider') +const { HttpListProviderError } = require('../../services/HttpListProvider') const { BRIDGE_VALIDATORS_ABI } = require('../../../../commons') const rootLogger = require('../../services/logger') const { web3Home } = require('../../services/web3') diff --git a/oracle/src/events/processTransfers/index.js b/oracle/src/events/processTransfers/index.js index 0b8d8c93..074827c4 100644 --- a/oracle/src/events/processTransfers/index.js +++ b/oracle/src/events/processTransfers/index.js @@ -1,6 +1,6 @@ require('../../../env') const promiseLimit = require('promise-limit') -const { HttpListProviderError } = require('http-list-provider') +const { HttpListProviderError } = require('../../services/HttpListProvider') const { BRIDGE_VALIDATORS_ABI, ZERO_ADDRESS } = require('../../../../commons') const rootLogger = require('../../services/logger') const { web3Home, web3Foreign } = require('../../services/web3') diff --git a/oracle/src/sender.js b/oracle/src/sender.js index 8ccc1af1..5eb51af6 100644 --- a/oracle/src/sender.js +++ b/oracle/src/sender.js @@ -4,7 +4,6 @@ const { connectSenderToQueue } = require('./services/amqpClient') const { redis } = require('./services/redisClient') const GasPrice = require('./services/gasPrice') const logger = require('./services/logger') -const rpcUrlsManager = require('./services/getRpcUrlsManager') const { sendTx } = require('./tx/sendTx') const { getNonce, getChainId } = require('./tx/web3') const { @@ -18,7 +17,7 @@ const { } = require('./utils/utils') const { EXIT_CODES, EXTRA_GAS_PERCENTAGE, MAX_GAS_LIMIT } = require('./utils/constants') -const { ORACLE_VALIDATOR_ADDRESS_PRIVATE_KEY } = process.env +const { ORACLE_VALIDATOR_ADDRESS_PRIVATE_KEY, ORACLE_TX_REDUNDANCY } = process.env const ORACLE_VALIDATOR_ADDRESS = privateKeyToAddress(ORACLE_VALIDATOR_ADDRESS_PRIVATE_KEY) @@ -30,6 +29,7 @@ if (process.argv.length < 3) { const config = require(path.join('../config/', process.argv[2])) const web3Instance = config.web3 +const web3Redundant = ORACLE_TX_REDUNDANCY === 'true' ? config.web3Redundant : config.web3 const nonceKey = `${config.id}:nonce` let chainId = 0 @@ -37,12 +37,11 @@ async function initialize() { try { const checkHttps = checkHTTPS(process.env.ORACLE_ALLOW_HTTP_FOR_RPC, logger) - rpcUrlsManager.homeUrls.forEach(checkHttps('home')) - rpcUrlsManager.foreignUrls.forEach(checkHttps('foreign')) + web3Instance.currentProvider.urls.forEach(checkHttps(config.chain)) GasPrice.start(config.id) - chainId = await getChainId(config.id) + chainId = await getChainId(web3Instance) connectSenderToQueue({ queueName: config.queue, oldQueueName: config.oldQueue, @@ -144,7 +143,6 @@ async function main({ msg, ackMsg, nackMsg, channel, scheduleForRetry, scheduleT } logger.info(`Sending transaction with nonce ${nonce}`) const txHash = await sendTx({ - chain: config.id, data: job.data, nonce, gasPrice, @@ -153,7 +151,7 @@ async function main({ msg, ackMsg, nackMsg, channel, scheduleForRetry, scheduleT privateKey: ORACLE_VALIDATOR_ADDRESS_PRIVATE_KEY, to: job.to, chainId, - web3: web3Instance + web3: web3Redundant }) const resendJob = { ...job, diff --git a/oracle/src/services/HttpListProvider.js b/oracle/src/services/HttpListProvider.js new file mode 100644 index 00000000..4ff6a1e0 --- /dev/null +++ b/oracle/src/services/HttpListProvider.js @@ -0,0 +1,89 @@ +const fetch = require('node-fetch') +const promiseRetry = require('promise-retry') + +const defaultOptions = { + requestTimeout: 0, + retry: { + retries: 0 + } +} + +class HttpListProviderError extends Error { + constructor(message, errors) { + super(message) + this.errors = errors + } +} + +function HttpListProvider(urls, options = {}) { + if (!(this instanceof HttpListProvider)) { + return new HttpListProvider(urls) + } + + if (!urls || !urls.length) { + throw new TypeError(`Invalid URLs: '${urls}'`) + } + + this.urls = urls + this.options = { ...defaultOptions, ...options } + this.currentIndex = 0 +} + +HttpListProvider.prototype.send = async function send(payload, callback) { + // save the currentIndex to avoid race condition + const { currentIndex } = this + + try { + const [result, index] = await promiseRetry(retry => { + return trySend(payload, this.urls, currentIndex, this.options).catch(retry) + }, this.options.retry) + this.currentIndex = index + callback(null, result) + } catch (e) { + callback(e) + } +} + +function send(url, payload, options) { + return fetch(url, { + headers: { + 'Content-type': 'application/json' + }, + method: 'POST', + body: JSON.stringify(payload), + timeout: options.requestTimeout + }) + .then(response => { + if (response.ok) { + return response + } else { + throw new Error(response.statusText) + } + }) + .then(response => response.json()) +} + +async function trySend(payload, urls, initialIndex, options) { + const errors = [] + + let index = initialIndex + for (let count = 0; count < urls.length; count++) { + const url = urls[index] + try { + const result = await send(url, payload, options) + return [result, index] + } catch (e) { + errors.push(e) + } + index = (index + 1) % urls.length + } + + throw new HttpListProviderError('Request failed for all urls', errors) +} + +module.exports = { + HttpListProvider, + HttpListProviderError, + defaultOptions, + send +} diff --git a/oracle/src/services/RedundantHttpListProvider.js b/oracle/src/services/RedundantHttpListProvider.js new file mode 100644 index 00000000..89fe8ffa --- /dev/null +++ b/oracle/src/services/RedundantHttpListProvider.js @@ -0,0 +1,40 @@ +const promiseRetry = require('promise-retry') +const { promiseAny } = require('../utils/utils') +const { defaultOptions, HttpListProviderError, send } = require('./HttpListProvider') + +function RedundantHttpListProvider(urls, options = {}) { + if (!(this instanceof RedundantHttpListProvider)) { + return new RedundantHttpListProvider(urls) + } + + if (!urls || !urls.length) { + throw new TypeError(`Invalid URLs: '${urls}'`) + } + + this.urls = urls + this.options = { ...defaultOptions, ...options } + this.currentIndex = 0 +} + +RedundantHttpListProvider.prototype.send = async function send(payload, callback) { + try { + const result = await promiseRetry(retry => { + return trySend(payload, this.urls, this.options).catch(retry) + }, this.options.retry) + callback(null, result) + } catch (e) { + callback(e) + } +} + +async function trySend(payload, urls, options) { + try { + return await promiseAny(urls.map(url => send(url, payload, options))) + } catch (errors) { + throw new HttpListProviderError('Request failed for all urls', errors) + } +} + +module.exports = { + RedundantHttpListProvider +} diff --git a/oracle/src/services/RpcUrlsManager.js b/oracle/src/services/RpcUrlsManager.js deleted file mode 100644 index dba8d7cc..00000000 --- a/oracle/src/services/RpcUrlsManager.js +++ /dev/null @@ -1,50 +0,0 @@ -const promiseRetry = require('promise-retry') -const tryEach = require('../utils/tryEach') -const { RETRY_CONFIG } = require('../utils/constants') -const { promiseAny } = require('../utils/utils') - -function RpcUrlsManager(homeUrls, foreignUrls) { - if (!homeUrls) { - throw new Error(`Invalid homeUrls: '${homeUrls}'`) - } - if (!foreignUrls) { - throw new Error(`Invalid foreignUrls: '${foreignUrls}'`) - } - - this.homeUrls = homeUrls.split(' ') - this.foreignUrls = foreignUrls.split(' ') -} - -RpcUrlsManager.prototype.tryEach = async function(chain, f, redundant = false) { - if (chain !== 'home' && chain !== 'foreign') { - throw new Error(`Invalid argument chain: '${chain}'`) - } - - // save urls to avoid race condition - const urls = chain === 'home' ? [...this.homeUrls] : [...this.foreignUrls] - - if (redundant) { - // result from first responded node will be returned immediately - // remaining nodes will continue to retry queries in separate promises - // promiseAny will throw only if all urls reached max retry number - return promiseAny(urls.map(url => promiseRetry(retry => f(url).catch(retry), RETRY_CONFIG))) - } - - const [result, index] = await promiseRetry(retry => tryEach(urls, f).catch(retry), RETRY_CONFIG) - - if (index > 0) { - // rotate urls - const failed = urls.splice(0, index) - urls.push(...failed) - } - - if (chain === 'home') { - this.homeUrls = urls - } else { - this.foreignUrls = urls - } - - return result -} - -module.exports = RpcUrlsManager diff --git a/oracle/src/services/getRpcUrlsManager.js b/oracle/src/services/getRpcUrlsManager.js deleted file mode 100644 index 6270c9d4..00000000 --- a/oracle/src/services/getRpcUrlsManager.js +++ /dev/null @@ -1,3 +0,0 @@ -const RpcUrlsManager = require('./RpcUrlsManager') - -module.exports = new RpcUrlsManager(process.env.COMMON_HOME_RPC_URL, process.env.COMMON_FOREIGN_RPC_URL) diff --git a/oracle/src/services/web3.js b/oracle/src/services/web3.js index 6745827a..d669cbfd 100644 --- a/oracle/src/services/web3.js +++ b/oracle/src/services/web3.js @@ -1,19 +1,55 @@ -const HttpListProvider = require('http-list-provider') const Web3 = require('web3') -const rpcUrlsManager = require('./getRpcUrlsManager') +const { HttpListProvider } = require('./HttpListProvider') +const { RedundantHttpListProvider } = require('./RedundantHttpListProvider') const { RETRY_CONFIG } = require('../utils/constants') -const homeProvider = new HttpListProvider(rpcUrlsManager.homeUrls, { +const { + COMMON_HOME_RPC_URL, + COMMON_FOREIGN_RPC_URL, + ORACLE_RPC_REQUEST_TIMEOUT, + ORACLE_HOME_RPC_POLLING_INTERVAL, + ORACLE_FOREIGN_RPC_POLLING_INTERVAL +} = process.env + +if (!COMMON_HOME_RPC_URL) { + throw new Error(`Invalid homeUrls: '${COMMON_HOME_RPC_URL}'`) +} +if (!COMMON_FOREIGN_RPC_URL) { + throw new Error(`Invalid foreignUrls: '${COMMON_FOREIGN_RPC_URL}'`) +} + +const homeUrls = COMMON_HOME_RPC_URL.split(' ').filter(url => url.length > 0) +const foreignUrls = COMMON_FOREIGN_RPC_URL.split(' ').filter(url => url.length > 0) + +const homeDefaultTimeout = parseInt(ORACLE_HOME_RPC_POLLING_INTERVAL, 10) * 2 +const foreignDefaultTimeout = parseInt(ORACLE_FOREIGN_RPC_POLLING_INTERVAL, 10) * 2 +const configuredTimeout = parseInt(ORACLE_RPC_REQUEST_TIMEOUT, 10) + +const homeOptions = { + requestTimeout: configuredTimeout || homeDefaultTimeout, retry: RETRY_CONFIG -}) +} + +const foreignOptions = { + requestTimeout: configuredTimeout || foreignDefaultTimeout, + retry: RETRY_CONFIG +} + +const homeProvider = new HttpListProvider(homeUrls, homeOptions) const web3Home = new Web3(homeProvider) -const foreignProvider = new HttpListProvider(rpcUrlsManager.foreignUrls, { - retry: RETRY_CONFIG -}) +const foreignProvider = new HttpListProvider(foreignUrls, foreignOptions) const web3Foreign = new Web3(foreignProvider) +const redundantHomeProvider = new RedundantHttpListProvider(homeUrls, homeOptions) +const web3HomeRedundant = new Web3(redundantHomeProvider) + +const redundantForeignProvider = new RedundantHttpListProvider(foreignUrls, foreignOptions) +const web3ForeignRedundant = new Web3(redundantForeignProvider) + module.exports = { web3Home, - web3Foreign + web3Foreign, + web3HomeRedundant, + web3ForeignRedundant } diff --git a/oracle/src/tx/sendTx.js b/oracle/src/tx/sendTx.js index 55da4a4e..ac2e4407 100644 --- a/oracle/src/tx/sendTx.js +++ b/oracle/src/tx/sendTx.js @@ -1,67 +1,27 @@ -const Web3Utils = require('web3-utils') -const fetch = require('node-fetch') -const rpcUrlsManager = require('../services/getRpcUrlsManager') +const { toWei } = require('web3').utils -const { ORACLE_TX_REDUNDANCY } = process.env - -// eslint-disable-next-line consistent-return -async function sendTx({ chain, privateKey, data, nonce, gasPrice, amount, gasLimit, to, chainId, web3 }) { +async function sendTx({ privateKey, data, nonce, gasPrice, amount, gasLimit, to, chainId, web3 }) { const serializedTx = await web3.eth.accounts.signTransaction( { nonce: Number(nonce), chainId, to, data, - value: Web3Utils.toWei(amount), + value: toWei(amount), gasPrice, gas: gasLimit }, `0x${privateKey}` ) - return sendRawTx({ - chain, - method: 'eth_sendRawTransaction', - params: [serializedTx.rawTransaction] - }) -} - -// eslint-disable-next-line consistent-return -async function sendRawTx({ chain, params, method }) { - const result = await rpcUrlsManager.tryEach( - chain, - async url => { - // curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":[{see above}],"id":1}' - const response = await fetch(url, { - headers: { - 'Content-type': 'application/json' - }, - method: 'POST', - body: JSON.stringify({ - jsonrpc: '2.0', - method, - params, - id: Math.floor(Math.random() * 100) + 1 - }) - }) - - if (!response.ok) { - throw new Error(response.statusText) - } - - return response - }, - ORACLE_TX_REDUNDANCY === 'true' && method === 'eth_sendRawTransaction' + return new Promise((res, rej) => + web3.eth + .sendSignedTransaction(serializedTx.rawTransaction) + .once('transactionHash', res) + .once('error', rej) ) - - const json = await result.json() - if (json.error) { - throw json.error - } - return json.result } module.exports = { - sendTx, - sendRawTx + sendTx } diff --git a/oracle/src/tx/web3.js b/oracle/src/tx/web3.js index d3e4b0ad..ce18930e 100644 --- a/oracle/src/tx/web3.js +++ b/oracle/src/tx/web3.js @@ -1,8 +1,6 @@ -const { hexToNumber } = require('web3-utils') const logger = require('../services/logger').child({ module: 'web3' }) -const { sendRawTx } = require('./sendTx') async function getNonce(web3, address) { try { @@ -26,15 +24,10 @@ async function getBlockNumber(web3) { } } -async function getChainId(chain) { +async function getChainId(web3) { try { logger.debug('Getting chain id') - const chainIdHex = await sendRawTx({ - chain, - method: 'eth_chainId', - params: [] - }) - const chainId = hexToNumber(chainIdHex) + const chainId = await web3.eth.getChainId() logger.debug({ chainId }, 'Chain id obtained') return chainId } catch (e) { diff --git a/oracle/src/utils/message.js b/oracle/src/utils/message.js index 5be3ae3b..fa5c2657 100644 --- a/oracle/src/utils/message.js +++ b/oracle/src/utils/message.js @@ -1,13 +1,13 @@ const assert = require('assert') -const Web3Utils = require('web3-utils') +const { toHex, numberToHex, padLeft } = require('web3').utils const { strip0x } = require('../../../commons') function createMessage({ recipient, value, transactionHash, bridgeAddress, expectedMessageLength }) { recipient = strip0x(recipient) assert.strictEqual(recipient.length, 20 * 2) - value = Web3Utils.numberToHex(value) - value = Web3Utils.padLeft(value, 32 * 2) + value = numberToHex(value) + value = padLeft(value, 32 * 2) value = strip0x(value) assert.strictEqual(value.length, 64) @@ -60,7 +60,7 @@ function signatureToVRS(rawSignature) { } function packSignatures(array) { - const length = strip0x(Web3Utils.toHex(array.length)) + const length = strip0x(toHex(array.length)) const msgLength = length.length === 1 ? `0${length}` : length let v = '' let r = '' diff --git a/oracle/src/watcher.js b/oracle/src/watcher.js index cc99f9b1..76cae4b8 100644 --- a/oracle/src/watcher.js +++ b/oracle/src/watcher.js @@ -5,7 +5,6 @@ const { connectWatcherToQueue, connection } = require('./services/amqpClient') const { getBlockNumber } = require('./tx/web3') const { redis } = require('./services/redisClient') const logger = require('./services/logger') -const rpcUrlsManager = require('./services/getRpcUrlsManager') const { getRequiredBlockConfirmations, getEvents } = require('./tx/web3') const { checkHTTPS, watchdog } = require('./utils/utils') const { EXIT_CODES } = require('./utils/constants') @@ -42,8 +41,7 @@ async function initialize() { try { const checkHttps = checkHTTPS(process.env.ORACLE_ALLOW_HTTP_FOR_RPC, logger) - rpcUrlsManager.homeUrls.forEach(checkHttps('home')) - rpcUrlsManager.foreignUrls.forEach(checkHttps('foreign')) + web3Instance.currentProvider.urls.forEach(checkHttps(config.chain)) await getLastProcessedBlock() connectWatcherToQueue({ diff --git a/oracle/src/worker.js b/oracle/src/worker.js index 0836c8fa..6fcff505 100644 --- a/oracle/src/worker.js +++ b/oracle/src/worker.js @@ -1,6 +1,5 @@ const path = require('path') const logger = require('./services/logger') -const rpcUrlsManager = require('./services/getRpcUrlsManager') const { checkHTTPS, watchdog } = require('./utils/utils') const { EXIT_CODES } = require('./utils/constants') const { connectWorkerToQueue } = require('./services/amqpClient') @@ -9,12 +8,13 @@ const config = require(path.join('../config/', process.argv[2])) const convertToChai = require('./workers/convertToChai')(config) +const web3Instance = config.web3 + async function initialize() { try { const checkHttps = checkHTTPS(process.env.ORACLE_ALLOW_HTTP_FOR_RPC, logger) - rpcUrlsManager.homeUrls.forEach(checkHttps('home')) - rpcUrlsManager.foreignUrls.forEach(checkHttps('foreign')) + web3Instance.currentProvider.urls.forEach(checkHttps(config.chain)) connectWorkerToQueue({ queueName: config.workerQueue, diff --git a/oracle/src/workers/convertToChai.js b/oracle/src/workers/convertToChai.js index 8b8900bf..71c48638 100644 --- a/oracle/src/workers/convertToChai.js +++ b/oracle/src/workers/convertToChai.js @@ -1,5 +1,5 @@ require('../../env') -const { HttpListProviderError } = require('http-list-provider') +const { HttpListProviderError } = require('../services/HttpListProvider') const rootLogger = require('../services/logger') const { web3Foreign } = require('../services/web3') diff --git a/oracle/test/processAffirmationRequests.test.js b/oracle/test/processAffirmationRequests.test.js index deb66810..d735afee 100644 --- a/oracle/test/processAffirmationRequests.test.js +++ b/oracle/test/processAffirmationRequests.test.js @@ -2,7 +2,7 @@ const chai = require('chai') const chaiAsPromised = require('chai-as-promised') const sinon = require('sinon') const Web3 = require('web3') -const { HttpListProviderError } = require('http-list-provider') +const { HttpListProviderError } = require('../src/services/HttpListProvider') const estimateGas = require('../src/events/processAffirmationRequests/estimateGas') const errors = require('../src/utils/errors') diff --git a/oracle/test/processCollectedSignatures.test.js b/oracle/test/processCollectedSignatures.test.js index b40ea359..c89464fd 100644 --- a/oracle/test/processCollectedSignatures.test.js +++ b/oracle/test/processCollectedSignatures.test.js @@ -1,7 +1,7 @@ const { expect } = require('chai').use(require('chai-as-promised')) const sinon = require('sinon') const Web3 = require('web3') -const { HttpListProviderError } = require('http-list-provider') +const { HttpListProviderError } = require('../src/services/HttpListProvider') const { createMessage, signatureToVRS } = require('../src/utils/message') const estimateGas = require('../src/events/processCollectedSignatures/estimateGas') const errors = require('../src/utils/errors') diff --git a/oracle/test/processSignatureRequests.test.js b/oracle/test/processSignatureRequests.test.js index 63933960..009451b4 100644 --- a/oracle/test/processSignatureRequests.test.js +++ b/oracle/test/processSignatureRequests.test.js @@ -2,7 +2,7 @@ const chai = require('chai') const chaiAsPromised = require('chai-as-promised') const sinon = require('sinon') const Web3 = require('web3') -const { HttpListProviderError } = require('http-list-provider') +const { HttpListProviderError } = require('../src/services/HttpListProvider') const estimateGas = require('../src/events/processSignatureRequests/estimateGas') const errors = require('../src/utils/errors') diff --git a/yarn.lock b/yarn.lock index 5e614f28..fc046235 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1304,6 +1304,21 @@ "@ethersproject/properties" ">=5.0.0-beta.131" "@ethersproject/strings" ">=5.0.0-beta.130" +"@ethersproject/abi@5.0.0-beta.153": + version "5.0.0-beta.153" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee" + integrity sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg== + dependencies: + "@ethersproject/address" ">=5.0.0-beta.128" + "@ethersproject/bignumber" ">=5.0.0-beta.130" + "@ethersproject/bytes" ">=5.0.0-beta.129" + "@ethersproject/constants" ">=5.0.0-beta.128" + "@ethersproject/hash" ">=5.0.0-beta.128" + "@ethersproject/keccak256" ">=5.0.0-beta.127" + "@ethersproject/logger" ">=5.0.0-beta.129" + "@ethersproject/properties" ">=5.0.0-beta.131" + "@ethersproject/strings" ">=5.0.0-beta.130" + "@ethersproject/address@>=5.0.0-beta.128": version "5.0.0-beta.134" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.0-beta.134.tgz#9c1790c87b763dc547ac12e2dbc9fa78d0799a71" @@ -1316,22 +1331,33 @@ "@ethersproject/rlp" ">=5.0.0-beta.126" bn.js "^4.4.0" -"@ethersproject/bignumber@>=5.0.0-beta.130": - version "5.0.0-beta.136" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.0-beta.136.tgz#5fd90ee708f3778733b02caf58453756524c758f" - integrity sha512-G5fYkkMUpmQd7Qcxa7YdwavBkiSb44wI7GsZls/7eGFMYl2ySgmwOBMw3kj1lhheXbF73jfBfOBHvKYrN/p7pQ== +"@ethersproject/address@^5.0.4": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.5.tgz#2caa65f6b7125015395b1b54c985ee0b27059cc7" + integrity sha512-DpkQ6rwk9jTefrRsJzEm6nhRiJd9pvhn1xN0rw5N/jswXG5r7BLk/GVA0mMAVWAsYfvi2xSc5L41FMox43RYEA== dependencies: - "@ethersproject/bytes" ">=5.0.0-beta.129" - "@ethersproject/logger" ">=5.0.0-beta.129" - "@ethersproject/properties" ">=5.0.0-beta.131" + "@ethersproject/bignumber" "^5.0.7" + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/keccak256" "^5.0.3" + "@ethersproject/logger" "^5.0.5" + "@ethersproject/rlp" "^5.0.3" bn.js "^4.4.0" -"@ethersproject/bytes@>=5.0.0-beta.129": - version "5.0.0-beta.137" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.0-beta.137.tgz#a9a35e2b358886289225d28212f4071ae391c161" - integrity sha512-uBwchZzGP912Wcani6vM7RLtsnN69Uc9WTLvewsniKrpHpSx0/k33WUcQVosmkwPgUtqflKyGjcIqaea1Z9WHw== +"@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.7": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.8.tgz#cee33bd8eb0266176def0d371b45274b1d2c4ec0" + integrity sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA== dependencies: - "@ethersproject/logger" ">=5.0.0-beta.129" + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/logger" "^5.0.5" + bn.js "^4.4.0" + +"@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.4": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.5.tgz#688b70000e550de0c97a151a21f15b87d7f97d7c" + integrity sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ== + dependencies: + "@ethersproject/logger" "^5.0.5" "@ethersproject/constants@>=5.0.0-beta.128": version "5.0.0-beta.133" @@ -1340,6 +1366,13 @@ dependencies: "@ethersproject/bignumber" ">=5.0.0-beta.130" +"@ethersproject/constants@^5.0.4": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.5.tgz#0ed19b002e8404bdf6d135234dc86a7d9bcf9b71" + integrity sha512-foaQVmxp2+ik9FrLUCtVrLZCj4M3Ibgkqvh+Xw/vFRSerkjVSYePApaVE5essxhoSlF1U9oXfWY09QI2AXtgKA== + dependencies: + "@ethersproject/bignumber" "^5.0.7" + "@ethersproject/hash@>=5.0.0-beta.128": version "5.0.0-beta.133" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.0.0-beta.133.tgz#bda0c74454a82359642033f27c5157963495fcdf" @@ -1358,17 +1391,25 @@ "@ethersproject/bytes" ">=5.0.0-beta.129" js-sha3 "0.5.7" -"@ethersproject/logger@>=5.0.0-beta.129": - version "5.0.0-beta.136" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.0-beta.136.tgz#a140cea77e1d820a97384fb02bfad63c130f31c1" - integrity sha512-baWK/4ccsVcyUU20nhp7k+hoRYsiaOfURYlyvQCoUUFKD3mpSRQCH42wxCosZZSCWz4rTHgASLQDdKkBtNVz1w== - -"@ethersproject/properties@>=5.0.0-beta.131": - version "5.0.0-beta.138" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.0-beta.138.tgz#e634d25b8c9f9448ef8d739bf4bd2db831dbe79d" - integrity sha512-vLVftNTxonJ0SkkcMcpXHN9pABD84clh+Cz3TV79qvh+lc0MFX3dnYL1JinBdFnqLPXU9vw2LbTrBhwQY8bzCQ== +"@ethersproject/keccak256@^5.0.3": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.4.tgz#36ca0a7d1ae2a272da5654cb886776d0c680ef3a" + integrity sha512-GNpiOUm9PGUxFNqOxYKDQBM0u68bG9XC9iOulEQ8I0tOx/4qUpgVzvgXL6ugxr0RY554Gz/NQsVqknqPzUcxpQ== dependencies: - "@ethersproject/logger" ">=5.0.0-beta.129" + "@ethersproject/bytes" "^5.0.4" + js-sha3 "0.5.7" + +"@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.5": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.6.tgz#faa484203e86e08be9e07fef826afeef7183fe88" + integrity sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ== + +"@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.3": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.4.tgz#a67a1f5a52c30850b5062c861631e73d131f666e" + integrity sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A== + dependencies: + "@ethersproject/logger" "^5.0.5" "@ethersproject/rlp@>=5.0.0-beta.126": version "5.0.0-beta.132" @@ -1378,6 +1419,24 @@ "@ethersproject/bytes" ">=5.0.0-beta.129" "@ethersproject/logger" ">=5.0.0-beta.129" +"@ethersproject/rlp@^5.0.3": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.4.tgz#0090a0271e84ea803016a112a79f5cfd80271a77" + integrity sha512-5qrrZad7VTjofxSsm7Zg/7Dr4ZOln4S2CqiDdOuTv6MBKnXj0CiBojXyuDy52M8O3wxH0CyE924hXWTDV1PQWQ== + dependencies: + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/logger" "^5.0.5" + +"@ethersproject/signing-key@^5.0.4": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.0.5.tgz#acfd06fc05a14180df7e027688bbd23fc4baf782" + integrity sha512-Z1wY7JC1HVO4CvQWY2TyTTuAr8xK3bJijZw1a9G92JEmKdv1j255R/0YLBBcFTl2J65LUjtXynNJ2GbArPGi5g== + dependencies: + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/logger" "^5.0.5" + "@ethersproject/properties" "^5.0.3" + elliptic "6.5.3" + "@ethersproject/strings@>=5.0.0-beta.130": version "5.0.0-beta.136" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.0-beta.136.tgz#053cbf4f9f96a7537cbc50300597f2d707907f51" @@ -1387,6 +1446,21 @@ "@ethersproject/constants" ">=5.0.0-beta.128" "@ethersproject/logger" ">=5.0.0-beta.129" +"@ethersproject/transactions@^5.0.0-beta.135": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.6.tgz#b8b27938be6e9ed671dbdd35fe98af8b14d0df7c" + integrity sha512-htsFhOD+NMBxx676A8ehSuwVV49iqpSB+CkjPZ02tpNew0K6p8g0CZ46Z1ZP946gIHAU80xQ0NACHYrjIUaCFA== + dependencies: + "@ethersproject/address" "^5.0.4" + "@ethersproject/bignumber" "^5.0.7" + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/constants" "^5.0.4" + "@ethersproject/keccak256" "^5.0.3" + "@ethersproject/logger" "^5.0.5" + "@ethersproject/properties" "^5.0.3" + "@ethersproject/rlp" "^5.0.3" + "@ethersproject/signing-key" "^5.0.4" + "@evocateur/libnpmaccess@^3.1.2": version "3.1.2" resolved "https://registry.yarnpkg.com/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz#ecf7f6ce6b004e9f942b098d92200be4a4b1c845" @@ -2847,7 +2921,7 @@ dependencies: bignumber.js "*" -"@types/bn.js@^4.11.0", "@types/bn.js@^4.11.3", "@types/bn.js@^4.11.4": +"@types/bn.js@^4.11.0", "@types/bn.js@^4.11.3", "@types/bn.js@^4.11.4", "@types/bn.js@^4.11.5": version "4.11.6" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== @@ -2990,6 +3064,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.43.tgz#b60ce047822e526e7a9252e50844eee79d5386ff" integrity sha512-KUyZdkGCnVPuXfsKmDUu2XLui65LZIJ2s0M57noy5e+ixUT2oK33ep7zlvgzI8LElcWqbf8AR+o/3GqAPac2zA== +"@types/node@^12.12.6": + version "12.12.69" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.69.tgz#7cb6a3aa0d16664bf2dcd1450ccb8477464fbd79" + integrity sha512-2F2VQRSFmzqgUEXw75L51MgnnZqc6bKWVSUPfrDPzp6mzGGibeVwyQcpvZvBr5RnsoMRHmC8EcBQiobSeqeJxg== + "@types/node@^12.6.1": version "12.12.34" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.34.tgz#0a5d6ae5d22612f0cf5f10320e1fc5d2a745dcb8" @@ -4932,7 +5011,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -base-x@^3.0.2: +base-x@^3.0.2, base-x@^3.0.8: version "3.0.8" resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== @@ -5108,11 +5187,16 @@ bn.js@4.11.6: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= -bn.js@4.11.8, bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.4.0, bn.js@^4.8.0: +bn.js@4.11.8, bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.8.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== +bn.js@^4.11.9, bn.js@^4.4.0: + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== + body-parser@1.19.0, body-parser@^1.16.0: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" @@ -5417,7 +5501,7 @@ buffer@^5.0.5: base64-js "^1.0.2" ieee754 "^1.1.4" -buffer@^5.2.1: +buffer@^5.2.1, buffer@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== @@ -5433,6 +5517,13 @@ buffer@^5.5.0: base64-js "^1.0.2" ieee754 "^1.1.4" +bufferutil@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.1.tgz#3a177e8e5819a1243fe16b63a199951a7ad8d4a7" + integrity sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA== + dependencies: + node-gyp-build "~3.7.0" + builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -5857,6 +5948,17 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +cids@^0.7.1: + version "0.7.5" + resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" + integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== + dependencies: + buffer "^5.5.0" + class-is "^1.1.0" + multibase "~0.6.0" + multicodec "^1.0.0" + multihashes "~0.4.15" + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -5865,6 +5967,11 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +class-is@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" + integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== + class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -6330,6 +6437,15 @@ content-disposition@0.5.3: dependencies: safe-buffer "5.1.2" +content-hash@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" + integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== + dependencies: + cids "^0.7.1" + multicodec "^0.5.5" + multihashes "^0.4.15" + content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" @@ -7174,11 +7290,6 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -deepmerge@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170" - integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA== - default-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" @@ -7677,6 +7788,19 @@ elliptic@6.5.2, elliptic@^6.5.2: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" +elliptic@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + elliptic@^6.0.0, elliptic@^6.4.0: version "6.4.1" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" @@ -8492,7 +8616,7 @@ eth-lib@0.2.7: elliptic "^6.4.0" xhr-request-promise "^0.1.2" -eth-lib@^0.2.8: +eth-lib@0.2.8, eth-lib@^0.2.8: version "0.2.8" resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== @@ -8840,7 +8964,7 @@ eventemitter3@3.1.2, eventemitter3@^3.0.0, eventemitter3@^3.1.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== -eventemitter3@^4.0.0: +eventemitter3@4.0.4, eventemitter3@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== @@ -10752,15 +10876,6 @@ http-https@^1.0.0: resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs= -http-list-provider@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/http-list-provider/-/http-list-provider-0.0.5.tgz#bb901c8bd7bbcce48a697512cb920aaf9aeeb0be" - integrity sha512-s6hMhJLQmCtF3EbM5xDZW97Urk8jG2wfXDVOCANcF0DO/tXPq1iACZ7eFb9+obYVd7459w1mvCgiDUskIschmg== - dependencies: - deepmerge "^2.1.1" - node-fetch "^2.2.0" - promise-retry "^1.1.1" - http-parser-js@>=0.4.0: version "0.5.0" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8" @@ -13936,6 +14051,22 @@ ms@^2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +multibase@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" + integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== + dependencies: + base-x "^3.0.8" + buffer "^5.5.0" + +multibase@~0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" + integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== + dependencies: + base-x "^3.0.8" + buffer "^5.5.0" + multicast-dns-service-types@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" @@ -13949,6 +14080,30 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" +multicodec@^0.5.5: + version "0.5.7" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" + integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== + dependencies: + varint "^5.0.0" + +multicodec@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" + integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== + dependencies: + buffer "^5.6.0" + varint "^5.0.0" + +multihashes@^0.4.15, multihashes@~0.4.15: + version "0.4.21" + resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" + integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== + dependencies: + buffer "^5.5.0" + multibase "^0.7.0" + varint "^5.0.0" + multimatch@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-3.0.0.tgz#0e2534cc6bc238d9ab67e1b9cd5fcd85a6dbf70b" @@ -14123,7 +14278,7 @@ node-fetch@^1.0.1, node-fetch@~1.7.1: encoding "^0.1.11" is-stream "^1.0.1" -node-fetch@^2.1.2, node-fetch@^2.2.0, node-fetch@^2.3.0, node-fetch@^2.5.0: +node-fetch@^2.1.2, node-fetch@^2.3.0, node-fetch@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== @@ -14133,6 +14288,11 @@ node-forge@0.7.5: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" integrity sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ== +node-gyp-build@~3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.7.0.tgz#daa77a4f547b9aed3e2aac779eaf151afd60ec8d" + integrity sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w== + node-gyp@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" @@ -14719,6 +14879,13 @@ oboe@2.1.4: dependencies: http-https "^1.0.0" +oboe@2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" + integrity sha1-VVQoTFQ6ImbXo48X4HOCH73jk80= + dependencies: + http-https "^1.0.0" + obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" @@ -17859,6 +18026,11 @@ scrypt-js@2.0.4: resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== +scrypt-js@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + scrypt.js@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/scrypt.js/-/scrypt.js-0.2.0.tgz#af8d1465b71e9990110bedfc593b9479e03a8ada" @@ -20189,6 +20361,13 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +utf-8-validate@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.2.tgz#63cfbccd85dc1f2b66cf7a1d0eebc08ed056bfb3" + integrity sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw== + dependencies: + node-gyp-build "~3.7.0" + utf8@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.1.tgz#2e01db02f7d8d0944f77104f1609eb0c304cf768" @@ -20305,6 +20484,11 @@ value-or-function@^3.0.0: resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM= +varint@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" + integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== + vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -20541,6 +20725,16 @@ web3-bzz@1.2.7: swarm-js "^0.1.40" underscore "1.9.1" +web3-bzz@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.3.0.tgz#83dfd77fa8a64bbb660462dffd0fee2a02ef1051" + integrity sha512-ibYAnKab+sgTo/UdfbrvYfWblXjjgSMgyy9/FHa6WXS14n/HVB+HfWqGz2EM3fok8Wy5XoKGMvdqvERQ/mzq1w== + dependencies: + "@types/node" "^12.12.6" + got "9.6.0" + swarm-js "^0.1.40" + underscore "1.9.1" + web3-core-helpers@1.0.0-beta.30: version "1.0.0-beta.30" resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.30.tgz#a000cee3f0a09eea13d74b5730335d4635fe1f2f" @@ -20577,6 +20771,15 @@ web3-core-helpers@1.2.7: web3-eth-iban "1.2.7" web3-utils "1.2.7" +web3-core-helpers@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.3.0.tgz#697cc3246a7eaaaac64ea506828d861c981c3f31" + integrity sha512-+MFb1kZCrRctf7UYE7NCG4rGhSXaQJ/KF07di9GVK1pxy1K0+rFi61ZobuV1ky9uQp+uhhSPts4Zp55kRDB5sw== + dependencies: + underscore "1.9.1" + web3-eth-iban "1.3.0" + web3-utils "1.3.0" + web3-core-method@1.0.0-beta.30: version "1.0.0-beta.30" resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.0.0-beta.30.tgz#8dd6ff789e8d1563b8786d13a78c7facefae471c" @@ -20621,6 +20824,18 @@ web3-core-method@1.2.7: web3-core-subscriptions "1.2.7" web3-utils "1.2.7" +web3-core-method@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.3.0.tgz#a71387af842aec7dbad5dbbd1130c14cc6c8beb3" + integrity sha512-h0yFDrYVzy5WkLxC/C3q+hiMnzxdWm9p1T1rslnuHgOp6nYfqzu/6mUIXrsS4h/OWiGJt+BZ0xVZmtC31HDWtg== + dependencies: + "@ethersproject/transactions" "^5.0.0-beta.135" + underscore "1.9.1" + web3-core-helpers "1.3.0" + web3-core-promievent "1.3.0" + web3-core-subscriptions "1.3.0" + web3-utils "1.3.0" + web3-core-promievent@1.0.0-beta.30: version "1.0.0-beta.30" resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.30.tgz#6205192bfb097441132226a5939ec5aed3a8a291" @@ -20652,6 +20867,13 @@ web3-core-promievent@1.2.7: dependencies: eventemitter3 "3.1.2" +web3-core-promievent@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.3.0.tgz#e0442dd0a8989b6bdce09293976cee6d9237a484" + integrity sha512-blv69wrXw447TP3iPvYJpllkhW6B18nfuEbrfcr3n2Y0v1Jx8VJacNZFDFsFIcgXcgUIVCtOpimU7w9v4+rtaw== + dependencies: + eventemitter3 "4.0.4" + web3-core-requestmanager@1.0.0-beta.30: version "1.0.0-beta.30" resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.30.tgz#6ee56fb8a6cb85fd01b3080854f50d64e52240c6" @@ -20696,6 +20918,17 @@ web3-core-requestmanager@1.2.7: web3-providers-ipc "1.2.7" web3-providers-ws "1.2.7" +web3-core-requestmanager@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.3.0.tgz#c5b9a0304504c0e6cce6c90bc1a3bff82732aa1f" + integrity sha512-3yMbuGcomtzlmvTVqNRydxsx7oPlw3ioRL6ReF9PeNYDkUsZaUib+6Dp5eBt7UXh5X+SIn/xa1smhDHz5/HpAw== + dependencies: + underscore "1.9.1" + web3-core-helpers "1.3.0" + web3-providers-http "1.3.0" + web3-providers-ipc "1.3.0" + web3-providers-ws "1.3.0" + web3-core-subscriptions@1.0.0-beta.30: version "1.0.0-beta.30" resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.30.tgz#31652c75356c3f67e5a19cd14b8d314bad4e2127" @@ -20732,6 +20965,15 @@ web3-core-subscriptions@1.2.7: underscore "1.9.1" web3-core-helpers "1.2.7" +web3-core-subscriptions@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.3.0.tgz#c2622ccd2b84f4687475398ff966b579dba0847e" + integrity sha512-MUUQUAhJDb+Nz3S97ExVWveH4utoUnsbPWP+q1HJH437hEGb4vunIb9KvN3hFHLB+aHJfPeStM/4yYTz5PeuyQ== + dependencies: + eventemitter3 "4.0.4" + underscore "1.9.1" + web3-core-helpers "1.3.0" + web3-core@1.0.0-beta.30: version "1.0.0-beta.30" resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.0.0-beta.30.tgz#f75f4d3b85be74c7674637921c3e013bc5d27679" @@ -20778,6 +21020,19 @@ web3-core@1.2.7: web3-core-requestmanager "1.2.7" web3-utils "1.2.7" +web3-core@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.3.0.tgz#b818903738461c1cca0163339e1d6d3fa51242cf" + integrity sha512-BwWvAaKJf4KFG9QsKRi3MNoNgzjI6szyUlgme1qNPxUdCkaS3Rdpa0VKYNHP7M/YTk82/59kNE66mH5vmoaXjA== + dependencies: + "@types/bn.js" "^4.11.5" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.3.0" + web3-core-method "1.3.0" + web3-core-requestmanager "1.3.0" + web3-utils "1.3.0" + web3-eth-abi@1.0.0-beta.30: version "1.0.0-beta.30" resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.30.tgz#6ea52c999a8505b47c2f88ba61d2a680a1066409" @@ -20816,6 +21071,15 @@ web3-eth-abi@1.2.7: underscore "1.9.1" web3-utils "1.2.7" +web3-eth-abi@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.3.0.tgz#387b7ea9b38be69ad8856bc7b4e9a6a69bb4d22b" + integrity sha512-1OrZ9+KGrBeBRd3lO8upkpNua9+7cBsQAgor9wbA25UrcUYSyL8teV66JNRu9gFxaTbkpdrGqM7J/LXpraXWrg== + dependencies: + "@ethersproject/abi" "5.0.0-beta.153" + underscore "1.9.1" + web3-utils "1.3.0" + web3-eth-abi@^1.0.0-beta.24: version "1.2.6" resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.6.tgz#b495383cc5c0d8e2857b26e7fe25606685983b25" @@ -20892,6 +21156,23 @@ web3-eth-accounts@1.2.7: web3-core-method "1.2.7" web3-utils "1.2.7" +web3-eth-accounts@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.3.0.tgz#010acf389b2bee6d5e1aecb2fe78bfa5c8f26c7a" + integrity sha512-/Q7EVW4L2wWUbNRtOTwAIrYvJid/5UnKMw67x/JpvRMwYC+e+744P536Ja6SG4X3MnzFvd3E/jruV4qa6k+zIw== + dependencies: + crypto-browserify "3.12.0" + eth-lib "0.2.8" + ethereumjs-common "^1.3.2" + ethereumjs-tx "^2.1.1" + scrypt-js "^3.0.1" + underscore "1.9.1" + uuid "3.3.2" + web3-core "1.3.0" + web3-core-helpers "1.3.0" + web3-core-method "1.3.0" + web3-utils "1.3.0" + web3-eth-contract@1.0.0-beta.30: version "1.0.0-beta.30" resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.30.tgz#d7eba2385084dff3c75aac48235af2c8d2d6a258" @@ -20950,6 +21231,21 @@ web3-eth-contract@1.2.7: web3-eth-abi "1.2.7" web3-utils "1.2.7" +web3-eth-contract@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.3.0.tgz#c758340ac800788e29fa29edc8b0c0ac957b741c" + integrity sha512-3SCge4SRNCnzLxf0R+sXk6vyTOl05g80Z5+9/B5pERwtPpPWaQGw8w01vqYqsYBKC7zH+dxhMaUgVzU2Dgf7bQ== + dependencies: + "@types/bn.js" "^4.11.5" + underscore "1.9.1" + web3-core "1.3.0" + web3-core-helpers "1.3.0" + web3-core-method "1.3.0" + web3-core-promievent "1.3.0" + web3-core-subscriptions "1.3.0" + web3-eth-abi "1.3.0" + web3-utils "1.3.0" + web3-eth-ens@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.4.tgz#b95b3aa99fb1e35c802b9e02a44c3046a3fa065e" @@ -20978,6 +21274,21 @@ web3-eth-ens@1.2.7: web3-eth-contract "1.2.7" web3-utils "1.2.7" +web3-eth-ens@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.3.0.tgz#0887ba38473c104cf5fb8a715828b3b354fa02a2" + integrity sha512-WnOru+EcuM5dteiVYJcHXo/I7Wq+ei8RrlS2nir49M0QpYvUPGbCGgTbifcjJQTWamgORtWdljSA1s2Asdb74w== + dependencies: + content-hash "^2.5.2" + eth-ens-namehash "2.0.8" + underscore "1.9.1" + web3-core "1.3.0" + web3-core-helpers "1.3.0" + web3-core-promievent "1.3.0" + web3-eth-abi "1.3.0" + web3-eth-contract "1.3.0" + web3-utils "1.3.0" + web3-eth-iban@1.0.0-beta.30: version "1.0.0-beta.30" resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.30.tgz#3b080a5c4da1fa37477b17e4c900781b92150645" @@ -21010,6 +21321,14 @@ web3-eth-iban@1.2.7: bn.js "4.11.8" web3-utils "1.2.7" +web3-eth-iban@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.3.0.tgz#15b782dfaf273ebc4e3f389f1367f4e88ddce4a5" + integrity sha512-v9mZWhR4fPF17/KhHLiWir4YHWLe09O3B/NTdhWqw3fdAMJNztzMHGzgHxA/4fU+rhrs/FhDzc4yt32zMEXBZw== + dependencies: + bn.js "^4.11.9" + web3-utils "1.3.0" + web3-eth-personal@1.0.0-beta.30: version "1.0.0-beta.30" resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.30.tgz#8bd4ef40b3b5f841dd3a8b97873d9dc791caf748" @@ -21056,6 +21375,18 @@ web3-eth-personal@1.2.7: web3-net "1.2.7" web3-utils "1.2.7" +web3-eth-personal@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.3.0.tgz#d376e03dc737d961ff1f8d1aca866efad8477135" + integrity sha512-2czUhElsJdLpuNfun9GeLiClo5O6Xw+bLSjl3f4bNG5X2V4wcIjX2ygep/nfstLLtkz8jSkgl/bV7esANJyeRA== + dependencies: + "@types/node" "^12.12.6" + web3-core "1.3.0" + web3-core-helpers "1.3.0" + web3-core-method "1.3.0" + web3-net "1.3.0" + web3-utils "1.3.0" + web3-eth@1.0.0-beta.30: version "1.0.0-beta.30" resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.0.0-beta.30.tgz#029b15e14cb608b9cfe02603b504d651870f0501" @@ -21130,6 +21461,25 @@ web3-eth@1.2.7: web3-net "1.2.7" web3-utils "1.2.7" +web3-eth@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.3.0.tgz#898e5f5a8827f9bc6844e267a52eb388916a6771" + integrity sha512-/bzJcxXPM9EM18JM5kO2JjZ3nEqVo3HxqU93aWAEgJNqaP/Lltmufl2GpvIB2Hvj+FXAjAXquxUdQ2/xP7BzHQ== + dependencies: + underscore "1.9.1" + web3-core "1.3.0" + web3-core-helpers "1.3.0" + web3-core-method "1.3.0" + web3-core-subscriptions "1.3.0" + web3-eth-abi "1.3.0" + web3-eth-accounts "1.3.0" + web3-eth-contract "1.3.0" + web3-eth-ens "1.3.0" + web3-eth-iban "1.3.0" + web3-eth-personal "1.3.0" + web3-net "1.3.0" + web3-utils "1.3.0" + web3-net@1.0.0-beta.30: version "1.0.0-beta.30" resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.0.0-beta.30.tgz#0a352ede296e6d4b7f88b67aa474e49703de73bf" @@ -21166,6 +21516,15 @@ web3-net@1.2.7: web3-core-method "1.2.7" web3-utils "1.2.7" +web3-net@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.3.0.tgz#b69068cccffab58911c2f08ca4abfbefb0f948c6" + integrity sha512-Xz02KylOyrB2YZzCkysEDrY7RbKxb7LADzx3Zlovfvuby7HBwtXVexXKtoGqksa+ns1lvjQLLQGb+OeLi7Sr7w== + dependencies: + web3-core "1.3.0" + web3-core-method "1.3.0" + web3-utils "1.3.0" + web3-provider-engine@14.0.6: version "14.0.6" resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.0.6.tgz#cbdd66fe20c0136a3a495cbe40d18b6c4160d5f0" @@ -21251,6 +21610,14 @@ web3-providers-http@1.2.7: web3-core-helpers "1.2.7" xhr2-cookies "1.1.0" +web3-providers-http@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.3.0.tgz#88227f64c88b32abed4359383c2663616e0dc531" + integrity sha512-cMKhUI6PqlY/EC+ZDacAxajySBu8AzW8jOjt1Pe/mbRQgS0rcZyvLePGTTuoyaA8C21F8UW+EE5jj7YsNgOuqA== + dependencies: + web3-core-helpers "1.3.0" + xhr2-cookies "1.1.0" + web3-providers-ipc@1.0.0-beta.30: version "1.0.0-beta.30" resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.30.tgz#ee2d8d18a3f120b777044a56e67e0aee20854587" @@ -21287,6 +21654,15 @@ web3-providers-ipc@1.2.7: underscore "1.9.1" web3-core-helpers "1.2.7" +web3-providers-ipc@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.3.0.tgz#d7c2b203733b46f7b4e7b15633d891648cf9a293" + integrity sha512-0CrLuRofR+1J38nEj4WsId/oolwQEM6Yl1sOt41S/6bNI7htdkwgVhSloFIMJMDFHtRw229QIJ6wIaKQz0X1Og== + dependencies: + oboe "2.1.5" + underscore "1.9.1" + web3-core-helpers "1.3.0" + web3-providers-ws@1.0.0-beta.30: version "1.0.0-beta.30" resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.30.tgz#9ae69a9ead8a8761f86379fa347b6db5ae44b12d" @@ -21324,6 +21700,16 @@ web3-providers-ws@1.2.7: underscore "1.9.1" web3-core-helpers "1.2.7" +web3-providers-ws@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.3.0.tgz#84adeff65acd4624d7f5bb43c5b2b22d8f0f63a4" + integrity sha512-Im5MthhJnJst8nSoq0TgbyOdaiFQFa5r6sHPOVllhgIgViDqzbnlAFW9sNzQ0Q8VXPNfPIQKi9cOrHlSRNPjRw== + dependencies: + eventemitter3 "4.0.4" + underscore "1.9.1" + web3-core-helpers "1.3.0" + websocket "^1.0.32" + web3-shh@1.0.0-beta.30: version "1.0.0-beta.30" resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.0.0-beta.30.tgz#2bfe3220d958ff4ca592017790852bc57b7b0ca7" @@ -21364,6 +21750,16 @@ web3-shh@1.2.7: web3-core-subscriptions "1.2.7" web3-net "1.2.7" +web3-shh@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.3.0.tgz#62d15297da8fb5f733dd1b98f9ade300590f4d49" + integrity sha512-IZTojA4VCwVq+7eEIHuL1tJXtU+LJDhO8Y2QmuwetEWW1iBgWCGPHZasipWP+7kDpSm/5lo5GRxL72FF/Os/tA== + dependencies: + web3-core "1.3.0" + web3-core-method "1.3.0" + web3-core-subscriptions "1.3.0" + web3-net "1.3.0" + web3-utils@1.0.0-beta.30: version "1.0.0-beta.30" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.0.0-beta.30.tgz#eae408cc8d6d6fecc8d5097cfead51773f231ff9" @@ -21432,6 +21828,20 @@ web3-utils@1.2.7: underscore "1.9.1" utf8 "3.0.0" +web3-utils@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.0.tgz#5bac16e5e0ec9fe7bdcfadb621655e8aa3cf14e1" + integrity sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA== + dependencies: + bn.js "^4.11.9" + eth-lib "0.2.8" + ethereum-bloom-filters "^1.0.6" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + underscore "1.9.1" + utf8 "3.0.0" + web3@1.0.0-beta.30: version "1.0.0-beta.30" resolved "https://registry.yarnpkg.com/web3/-/web3-1.0.0-beta.30.tgz#ad3e761845aeb2f40a7760cde75793773a431ecd" @@ -21485,6 +21895,19 @@ web3@1.2.7: web3-shh "1.2.7" web3-utils "1.2.7" +web3@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.3.0.tgz#8fe4cd6e2a21c91904f343ba75717ee4c76bb349" + integrity sha512-4q9dna0RecnrlgD/bD1C5S+81Untbd6Z/TBD7rb+D5Bvvc0Wxjr4OP70x+LlnwuRDjDtzBwJbNUblh2grlVArw== + dependencies: + web3-bzz "1.3.0" + web3-core "1.3.0" + web3-eth "1.3.0" + web3-eth-personal "1.3.0" + web3-net "1.3.0" + web3-shh "1.3.0" + web3-utils "1.3.0" + webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -21625,6 +22048,18 @@ websocket@^1.0.28: typedarray-to-buffer "^3.1.5" yaeti "^0.0.6" +websocket@^1.0.32: + version "1.0.32" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.32.tgz#1f16ddab3a21a2d929dec1687ab21cfdc6d3dbb1" + integrity sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q== + dependencies: + bufferutil "^4.0.1" + debug "^2.2.0" + es5-ext "^0.10.50" + typedarray-to-buffer "^3.1.5" + utf-8-validate "^5.0.2" + yaeti "^0.0.6" + "websocket@git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible": version "1.0.26" resolved "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2"