From 389cea3c39fd5d5ea3f3a21af4a620b14b6562b5 Mon Sep 17 00:00:00 2001 From: Kirill Fedoseev Date: Fri, 23 Oct 2020 13:48:37 +0300 Subject: [PATCH 01/10] Reduce time complexity of events comparison in monitor (#475) --- monitor/utils/message.js | 63 ++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 38 deletions(-) diff --git a/monitor/utils/message.js b/monitor/utils/message.js index ea4a9941..03c2fac1 100644 --- a/monitor/utils/message.js +++ b/monitor/utils/message.js @@ -1,44 +1,27 @@ -const web3Utils = require('web3').utils const { parseAMBMessage } = require('../../commons') -function deliveredMsgNotProcessed(processedList) { - return deliveredMsg => { - let msgData = deliveredMsg.returnValues.encodedData - if (!deliveredMsg.returnValues.messageId) { - // append tx hash to an old message, where message id was not used - msgData = deliveredMsg.transactionHash + msgData.slice(2) - } - const msg = parseAMBMessage(msgData) - return ( - processedList.filter(processedMsg => { - return messageEqualsEvent(msg, processedMsg.returnValues) - }).length === 0 - ) +const keyAMB = e => [e.messageId, e.sender, e.executor].join(',').toLowerCase() + +const normalizeAMBMessage = e => { + let msgData = e.returnValues.encodedData + if (!e.returnValues.messageId) { + // append tx hash to an old message, where message id was not used + // for old messages, e.messageId is a corresponding transactionHash + msgData = e.transactionHash + msgData.slice(2) } + return parseAMBMessage(msgData) +} + +function deliveredMsgNotProcessed(processedList) { + const keys = new Set() + processedList.forEach(processedMsg => keys.add(keyAMB(processedMsg.returnValues))) + return deliveredMsg => !keys.has(keyAMB(normalizeAMBMessage(deliveredMsg))) } function processedMsgNotDelivered(deliveredList) { - return processedMsg => { - return ( - deliveredList.filter(deliveredMsg => { - let msgData = deliveredMsg.returnValues.encodedData - if (!deliveredMsg.returnValues.messageId) { - // append tx hash to an old message, where message id was not used - msgData = deliveredMsg.transactionHash + msgData.slice(2) - } - const msg = parseAMBMessage(msgData) - return messageEqualsEvent(msg, processedMsg.returnValues) - }).length === 0 - ) - } -} - -function messageEqualsEvent(parsedMsg, event) { - return ( - web3Utils.toChecksumAddress(parsedMsg.sender) === event.sender && - web3Utils.toChecksumAddress(parsedMsg.executor) === event.executor && - parsedMsg.messageId === event.messageId // for an old messages, event.messageId is actually a transactionHash - ) + const keys = new Set() + deliveredList.forEach(deliveredMsg => keys.add(keyAMB(normalizeAMBMessage(deliveredMsg)))) + return processedMsg => !keys.has(keyAMB(processedMsg.returnValues)) } /** @@ -60,9 +43,13 @@ const normalizeEventInformation = event => ({ value: event.returnValues.value }) -const eventWithoutReference = otherSideEvents => e => - otherSideEvents.filter(a => a.referenceTx === e.referenceTx && a.recipient === e.recipient && a.value === e.value) - .length === 0 +const key = e => [e.referenceTx, e.recipient, e.value].join(',').toLowerCase() + +const eventWithoutReference = otherSideEvents => { + const keys = new Set() + otherSideEvents.forEach(e => keys.add(key(e))) + return e => !keys.has(key(e)) +} module.exports = { deliveredMsgNotProcessed, From 611b8c539d54231dd9f881fd9fd0e1601de87ce9 Mon Sep 17 00:00:00 2001 From: Kirill Fedoseev Date: Wed, 28 Oct 2020 14:20:50 +0300 Subject: [PATCH 02/10] 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" From 5fa9d21246d9c0fbb1d0746e5e5cf006f9489760 Mon Sep 17 00:00:00 2001 From: Kirill Fedoseev Date: Wed, 28 Oct 2020 15:35:11 +0300 Subject: [PATCH 03/10] Fix set-env deprecation warnings (#478) --- .github/workflows/main.yml | 102 ++++++++++++++++++++++--------------- 1 file changed, 62 insertions(+), 40 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8927c620..79671ef5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -19,9 +19,11 @@ jobs: - uses: actions/checkout@v2 with: submodules: true - - run: git submodule status > submodule.status - - id: get_cache_key - run: echo "::set-output name=cache_key::cache-repo-${{ hashFiles('yarn.lock', 'package.json', 'submodule.status') }}" + - name: Set cache key + id: get_cache_key + run: | + git submodule status > submodule.status + echo "::set-output name=cache_key::cache-repo-${{ hashFiles('yarn.lock', 'package.json', 'submodule.status') }}" - uses: actions/cache@v2 id: cache-repo with: @@ -29,7 +31,8 @@ jobs: **/node_modules contracts/build key: ${{ steps.get_cache_key.outputs.cache_key }} - - if: ${{ !steps.cache-repo.outputs.cache-hit }} + - name: Install dependencies and compile contracts + if: ${{ !steps.cache-repo.outputs.cache-hit }} run: | yarn install --frozen-lockfile yarn run install:deploy @@ -56,7 +59,8 @@ jobs: **/node_modules contracts/build key: ${{ needs.initialize.outputs.cache_key }} - - run: ${{ steps.cache-repo.outputs.cache-hit }} && yarn run ${{ matrix.task }} + - name: yarn run ${{ matrix.task }} + run: ${{ steps.cache-repo.outputs.cache-hit }} && yarn run ${{ matrix.task }} ui-coverage: runs-on: ubuntu-latest needs: @@ -76,7 +80,8 @@ jobs: **/node_modules contracts/build key: ${{ needs.initialize.outputs.cache_key }} - - run: ${{ steps.cache-repo.outputs.cache-hit }} && yarn workspace ui run coverage + - name: yarn workspace ui run coverage + run: ${{ steps.cache-repo.outputs.cache-hit }} && yarn workspace ui run coverage - uses: coverallsapp/github-action@master with: github-token: ${{ github.token }} @@ -87,14 +92,16 @@ jobs: - uses: actions/checkout@v2 with: submodules: true - - run: | + - name: Evaluate e2e docker images tags + run: | git submodule status > submodule.status - echo "::set-env name=E2E_TAG::${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'Dockerfile.e2e', 'commons', 'oracle-e2e', 'monitor-e2e') }}" - echo "::set-env name=ORACLE_TAG::${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'oracle') }}" - echo "::set-env name=MONITOR_TAG::${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'monitor') }}" - echo "::set-env name=UI_TAG::${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'ui') }}" - echo "::set-env name=ALM_TAG::${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'alm') }}" - - run: | + echo "E2E_TAG=${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'Dockerfile.e2e', 'commons', 'oracle-e2e', 'monitor-e2e') }}" >> $GITHUB_ENV + echo "ORACLE_TAG=${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'oracle') }}" >> $GITHUB_ENV + echo "MONITOR_TAG=${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'monitor') }}" >> $GITHUB_ENV + echo "UI_TAG=${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'ui') }}" >> $GITHUB_ENV + echo "ALM_TAG=${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'alm') }}" >> $GITHUB_ENV + - name: Rebuild and push updated images + run: | function check_if_image_exists() { curl -fsSlL -H 'Authorization: bearer ${{ github.token }}' "https://${DOCKER_REGISTRY}/v2/${DOCKER_REPO}/tokenbridge-e2e-$1/manifests/$2" > /dev/null } @@ -119,8 +126,10 @@ jobs: - uses: actions/checkout@v2 with: submodules: true - - run: echo "::set-env name=MOLECULE_RUNNER_TAG::${{ hashFiles('./deployment-e2e/Dockerfile') }}" - - run: | + - name: Evaluate e2e molecule runner tag + run: echo "MOLECULE_RUNNER_TAG=${{ hashFiles('./deployment-e2e/Dockerfile') }}" >> $GITHUB_ENV + - name: Rebuild and push molecule runner e2e image + run: | function check_if_image_exists() { curl -fsSlL -H 'Authorization: bearer ${{ github.token }}' "https://${DOCKER_REGISTRY}/v2/${DOCKER_REPO}/tokenbridge-e2e-$1/manifests/$2" > /dev/null } @@ -150,14 +159,15 @@ jobs: - uses: actions/checkout@v2 with: submodules: true - - run: | + - name: Evaluate e2e docker images tags + run: | git submodule status > submodule.status - echo "::set-env name=E2E_TAG::${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'Dockerfile.e2e', 'commons', 'oracle-e2e', 'monitor-e2e') }}" - echo "::set-env name=ORACLE_TAG::${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'oracle') }}" - echo "::set-env name=MONITOR_TAG::${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'monitor') }}" - echo "::set-env name=UI_TAG::${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'ui') }}" - echo "::set-env name=ALM_TAG::${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'alm') }}" - - if: ${{ matrix.use-cache }} + echo "E2E_TAG=${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'Dockerfile.e2e', 'commons', 'oracle-e2e', 'monitor-e2e') }}" >> $GITHUB_ENV + echo "ORACLE_TAG=${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'oracle') }}" >> $GITHUB_ENV + echo "MONITOR_TAG=${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'monitor') }}" >> $GITHUB_ENV + echo "UI_TAG=${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'ui') }}" >> $GITHUB_ENV + echo "ALM_TAG=${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'alm') }}" >> $GITHUB_ENV + - if: ${{ matrix.use-cache }} uses: actions/cache@v2 id: cache-repo with: @@ -165,8 +175,10 @@ jobs: **/node_modules contracts/build key: ${{ needs.initialize.outputs.cache_key }} - - run: docker login ${DOCKER_REGISTRY} -u ${{ github.actor }} -p ${{ github.token }} - - run: ${{ !matrix.use-cache || steps.cache-repo.outputs.cache-hit }} && yarn run ${{ matrix.task }} + - name: Login to docker registry + run: docker login ${DOCKER_REGISTRY} -u ${{ github.actor }} -p ${{ github.token }} + - name: yarn run ${{ matrix.task }} + run: ${{ !matrix.use-cache || steps.cache-repo.outputs.cache-hit }} && yarn run ${{ matrix.task }} deployment: runs-on: ubuntu-latest needs: @@ -179,8 +191,10 @@ jobs: - uses: actions/checkout@v2 with: submodules: true - - run: echo "::set-env name=MOLECULE_RUNNER_TAG::${{ hashFiles('./deployment-e2e/Dockerfile') }}" - - run: docker login ${DOCKER_REGISTRY} -u ${{ github.actor }} -p ${{ github.token }} + - name: Evaluate e2e molecule runner tag + run: echo "MOLECULE_RUNNER_TAG=${{ hashFiles('./deployment-e2e/Dockerfile') }}" >> $GITHUB_ENV + - name: Login to docker registry + run: docker login ${DOCKER_REGISTRY} -u ${{ github.actor }} -p ${{ github.token }} - run: deployment-e2e/molecule.sh ${{ matrix.task }} ultimate: runs-on: ubuntu-latest @@ -205,14 +219,15 @@ jobs: - uses: actions/checkout@v2 with: submodules: true - - run: | + - name: Evaluate e2e docker images tags + run: | git submodule status > submodule.status - echo "::set-env name=E2E_TAG::${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'Dockerfile.e2e', 'commons', 'oracle-e2e', 'monitor-e2e') }}" - echo "::set-env name=ORACLE_TAG::${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'oracle') }}" - echo "::set-env name=MONITOR_TAG::${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'monitor') }}" - echo "::set-env name=UI_TAG::${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'ui') }}" - echo "::set-env name=ALM_TAG::${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'alm') }}" - echo "::set-env name=MOLECULE_RUNNER_TAG::${{ hashFiles('./deployment-e2e/Dockerfile') }}" + echo "E2E_TAG=${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'Dockerfile.e2e', 'commons', 'oracle-e2e', 'monitor-e2e') }}" >> $GITHUB_ENV + echo "ORACLE_TAG=${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'oracle') }}" >> $GITHUB_ENV + echo "MONITOR_TAG=${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'monitor') }}" >> $GITHUB_ENV + echo "UI_TAG=${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'ui') }}" >> $GITHUB_ENV + echo "ALM_TAG=${{ hashFiles('yarn.lock', 'package.json', 'submodule.status', 'commons', 'alm') }}" >> $GITHUB_ENV + echo "MOLECULE_RUNNER_TAG=${{ hashFiles('./deployment-e2e/Dockerfile') }}" >> $GITHUB_ENV - uses: actions/cache@v2 id: cache-repo with: @@ -220,12 +235,19 @@ jobs: **/node_modules contracts/build key: ${{ needs.initialize.outputs.cache_key }} - - run: docker login ${DOCKER_REGISTRY} -u ${{ github.actor }} -p ${{ github.token }} - - run: ${{ steps.cache-repo.outputs.cache-hit }} && e2e-commons/up.sh deploy blocks - - run: docker-compose -f ./e2e-commons/docker-compose.yml pull oracle - - run: deployment-e2e/molecule.sh ultimate-${{ matrix.task }} - - run: sudo chown -R $USER:docker /var/run/docker.sock - - if: ${{ matrix.ui-e2e-grep }} + - name: Login to docker registry + run: docker login ${DOCKER_REGISTRY} -u ${{ github.actor }} -p ${{ github.token }} + - name: Deploy contracts + run: ${{ steps.cache-repo.outputs.cache-hit }} && e2e-commons/up.sh deploy blocks + - name: Pull e2e oracle image + run: docker-compose -f ./e2e-commons/docker-compose.yml pull oracle + - name: Deploy oracle and ui + run: deployment-e2e/molecule.sh ultimate-${{ matrix.task }} + - name: Reset docker socket permissions + run: sudo chown -R $USER:docker /var/run/docker.sock + - name: Run ui e2e tests + if: ${{ matrix.ui-e2e-grep }} run: cd ui-e2e && xvfb-run yarn mocha -g "${{ matrix.ui-e2e-grep }}" -b ./test.js - - if: ${{ !matrix.ui-e2e-grep }} + - name: Run oracle e2e tests + if: ${{ !matrix.ui-e2e-grep }} run: docker-compose -f ./e2e-commons/docker-compose.yml run e2e yarn workspace oracle-e2e run ${{ matrix.task }} From f8d85b14de04b07da247d2e5c17d0baed3b2613a Mon Sep 17 00:00:00 2001 From: Kirill Fedoseev Date: Thu, 29 Oct 2020 11:25:43 +0300 Subject: [PATCH 04/10] Add allowance/block lists support to monitor (#477) --- .dockerignore | 5 +++++ .gitignore | 10 ++++------ CONFIGURATION.md | 3 +++ monitor/.env.example | 3 +++ monitor/alerts.js | 19 ++++++------------- monitor/cache/.gitkeep | 0 monitor/checkWorker.js | 13 ++++++++----- monitor/checkWorker2.js | 2 ++ monitor/checkWorker3.js | 7 ++----- monitor/docker-compose.yml | 5 +++-- monitor/eventsStats.js | 29 +++++++++++++++++++++++++++-- monitor/getBalances.js | 18 +++--------------- monitor/getShortEventStats.js | 31 +++++++++++++++++++++++++++++-- monitor/package.json | 2 +- monitor/scripts/getBridgeStats.sh | 13 ++++++++++++- monitor/stuckTransfers.js | 7 ++----- monitor/utils/events.js | 16 ++-------------- monitor/utils/file.js | 12 +++++++++++- monitor/utils/message.js | 18 +++++++++++++++++- monitor/utils/web3.js | 15 +++++++++++++++ monitor/utils/web3Cache.js | 29 +++++++++++++++++++++++++++++ monitor/validators.js | 13 ++----------- oracle/src/utils/utils.js | 5 ++++- yarn.lock | 5 +++++ 24 files changed, 195 insertions(+), 85 deletions(-) create mode 100644 monitor/cache/.gitkeep create mode 100644 monitor/utils/web3.js create mode 100644 monitor/utils/web3Cache.js diff --git a/.dockerignore b/.dockerignore index b4795279..f31efb0c 100644 --- a/.dockerignore +++ b/.dockerignore @@ -8,11 +8,16 @@ **/docs **/*.md +monitor/**/*.env* +oracle/**/*.env* +!**/.env.example + contracts/test contracts/build oracle/test monitor/test monitor/responses +monitor/cache commons/test oracle/**/*.png oracle/**/*.jpg diff --git a/.gitignore b/.gitignore index 94b2a7df..7cea0539 100644 --- a/.gitignore +++ b/.gitignore @@ -10,11 +10,8 @@ dist # misc .DS_Store -.env -.env.local -.env.development.local -.env.test.local -.env.production.local +*.env* +!.env.example .idea .nyc_output logs/ @@ -49,5 +46,6 @@ __pycache__ #monitor monitor/responses/* -monitor/configs/*.env +monitor/cache/* +!monitor/cache/.gitkeep !monitor/.gitkeep diff --git a/CONFIGURATION.md b/CONFIGURATION.md index adb3c435..b93db0d1 100644 --- a/CONFIGURATION.md +++ b/CONFIGURATION.md @@ -79,3 +79,6 @@ MONITOR_TX_NUMBER_THRESHOLD | If estimated number of transaction is equal to or MONITOR_PORT | The port for the Monitor. | integer MONITOR_BRIDGE_NAME | The name to be used in the url path for the bridge | string MONITOR_CACHE_EVENTS | If set to true, monitor will cache obtained events for other workers runs | `true` / `false` +MONITOR_HOME_TO_FOREIGN_ALLOWANCE_LIST | File with a list of addresses, separated by newlines. If set, determines the privileged set of accounts whose requests should be automatically processed by the CollectedSignatures watcher. | string +MONITOR_HOME_TO_FOREIGN_BLOCK_LIST | File with a list of addresses, separated by newlines. If set, determines the set of accounts whose requests should be marked as unclaimed. Has a lower priority than the `MONITOR_HOME_TO_FOREIGN_ALLOWANCE_LIST`. | string +MONITOR_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` diff --git a/monitor/.env.example b/monitor/.env.example index 66d96f77..31647b03 100644 --- a/monitor/.env.example +++ b/monitor/.env.example @@ -22,3 +22,6 @@ COMMON_FOREIGN_GAS_PRICE_FACTOR=1 MONITOR_TX_NUMBER_THRESHOLD=100 MONITOR_PORT=3003 MONITOR_CACHE_EVENTS=true + +MONITOR_HOME_TO_FOREIGN_ALLOWANCE_LIST= +MONITOR_HOME_TO_FOREIGN_BLOCK_LIST= diff --git a/monitor/alerts.js b/monitor/alerts.js index b5215dfa..4d118d0f 100644 --- a/monitor/alerts.js +++ b/monitor/alerts.js @@ -1,18 +1,11 @@ require('dotenv').config() -const Web3 = require('web3') +const Web3Utils = require('web3').utils const logger = require('./logger')('alerts') const eventsInfo = require('./utils/events') const { getBlockNumber } = require('./utils/contract') const { processedMsgNotDelivered, eventWithoutReference } = require('./utils/message') const { BRIDGE_MODES } = require('../commons') - -const { COMMON_HOME_RPC_URL, COMMON_FOREIGN_RPC_URL } = process.env - -const homeProvider = new Web3.providers.HttpProvider(COMMON_HOME_RPC_URL) -const web3Home = new Web3(homeProvider) - -const foreignProvider = new Web3.providers.HttpProvider(COMMON_FOREIGN_RPC_URL) -const web3Foreign = new Web3(foreignProvider) +const { web3Home, web3Foreign } = require('./utils/web3') async function main() { const { @@ -77,10 +70,10 @@ async function main() { * @returns {function({blockNumber?: *}): boolean[]} */ const findMisbehaviorRange = currentBlockNumber => ({ blockNumber }) => { - const minus60 = currentBlockNumber.sub(Web3.utils.toBN(60)) - const minus180 = currentBlockNumber.sub(Web3.utils.toBN(180)) - const minus720 = currentBlockNumber.sub(Web3.utils.toBN(720)) - const minus17280 = currentBlockNumber.sub(Web3.utils.toBN(17280)) + const minus60 = currentBlockNumber.sub(Web3Utils.toBN(60)) + const minus180 = currentBlockNumber.sub(Web3Utils.toBN(180)) + const minus720 = currentBlockNumber.sub(Web3Utils.toBN(720)) + const minus17280 = currentBlockNumber.sub(Web3Utils.toBN(17280)) return [ minus60.lte(blockNumber), diff --git a/monitor/cache/.gitkeep b/monitor/cache/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/monitor/checkWorker.js b/monitor/checkWorker.js index 649accd8..2cc1eaa3 100644 --- a/monitor/checkWorker.js +++ b/monitor/checkWorker.js @@ -1,21 +1,20 @@ require('dotenv').config() -const Web3 = require('web3') +const BN = require('bignumber.js') const logger = require('./logger')('checkWorker') const { getBridgeMode } = require('../commons') const getBalances = require('./getBalances') const getShortEventStats = require('./getShortEventStats') const validators = require('./validators') const { writeFile, createDir } = require('./utils/file') +const { saveCache } = require('./utils/web3Cache') +const { web3Home } = require('./utils/web3') -const { COMMON_HOME_BRIDGE_ADDRESS, COMMON_HOME_RPC_URL, MONITOR_BRIDGE_NAME } = process.env +const { COMMON_HOME_BRIDGE_ADDRESS, MONITOR_BRIDGE_NAME } = process.env const MONITOR_VALIDATOR_HOME_TX_LIMIT = Number(process.env.MONITOR_VALIDATOR_HOME_TX_LIMIT) || 0 const MONITOR_VALIDATOR_FOREIGN_TX_LIMIT = Number(process.env.MONITOR_VALIDATOR_FOREIGN_TX_LIMIT) || 0 const MONITOR_TX_NUMBER_THRESHOLD = Number(process.env.MONITOR_TX_NUMBER_THRESHOLD) || 100 -const homeProvider = new Web3.providers.HttpProvider(COMMON_HOME_RPC_URL) -const web3Home = new Web3(homeProvider) - const { HOME_ERC_TO_ERC_ABI } = require('../commons') async function checkWorker() { @@ -31,9 +30,13 @@ async function checkWorker() { const home = Object.assign({}, balances.home, events.home) const foreign = Object.assign({}, balances.foreign, events.foreign) const status = Object.assign({}, balances, events, { home }, { foreign }) + if (status.balanceDiff && status.unclaimedBalance) { + status.balanceDiff = new BN(status.balanceDiff).minus(status.unclaimedBalance).toFixed() + } if (!status) throw new Error('status is empty: ' + JSON.stringify(status)) status.health = true writeFile(`/responses/${MONITOR_BRIDGE_NAME}/getBalances.json`, status) + saveCache() logger.debug('calling validators()') const vBalances = await validators(bridgeMode) diff --git a/monitor/checkWorker2.js b/monitor/checkWorker2.js index 0cb09aa4..06778c55 100644 --- a/monitor/checkWorker2.js +++ b/monitor/checkWorker2.js @@ -3,6 +3,7 @@ const logger = require('./logger')('checkWorker2') const eventsStats = require('./eventsStats') const alerts = require('./alerts') const { writeFile, createDir } = require('./utils/file') +const { saveCache } = require('./utils/web3Cache') const { MONITOR_BRIDGE_NAME } = process.env @@ -26,6 +27,7 @@ async function checkWorker2() { _alerts.ok = !_alerts.executeAffirmations.mostRecentTxHash && !_alerts.executeSignatures.mostRecentTxHash _alerts.health = true writeFile(`/responses/${MONITOR_BRIDGE_NAME}/alerts.json`, _alerts) + saveCache() logger.debug('Done x2') } catch (e) { logger.error(e) diff --git a/monitor/checkWorker3.js b/monitor/checkWorker3.js index 565a20e8..fdab50cb 100644 --- a/monitor/checkWorker3.js +++ b/monitor/checkWorker3.js @@ -1,15 +1,12 @@ require('dotenv').config() -const Web3 = require('web3') const logger = require('./logger')('checkWorker3') const stuckTransfers = require('./stuckTransfers') const { writeFile, createDir } = require('./utils/file') +const { web3Home } = require('./utils/web3') -const { MONITOR_BRIDGE_NAME, COMMON_HOME_BRIDGE_ADDRESS, COMMON_HOME_RPC_URL } = process.env +const { MONITOR_BRIDGE_NAME, COMMON_HOME_BRIDGE_ADDRESS } = process.env const { getBridgeMode, HOME_NATIVE_TO_ERC_ABI, BRIDGE_MODES } = require('../commons') -const homeProvider = new Web3.providers.HttpProvider(COMMON_HOME_RPC_URL) -const web3Home = new Web3(homeProvider) - async function checkWorker3() { try { const homeBridge = new web3Home.eth.Contract(HOME_NATIVE_TO_ERC_ABI, COMMON_HOME_BRIDGE_ADDRESS) diff --git a/monitor/docker-compose.yml b/monitor/docker-compose.yml index 8d0661e9..9164d9ef 100644 --- a/monitor/docker-compose.yml +++ b/monitor/docker-compose.yml @@ -4,11 +4,12 @@ services: monitor: image: poanetwork/tokenbridge-monitor:latest ports: - - "${MONITOR_PORT}:${MONITOR_PORT}" + - "${MONITOR_PORT}:${MONITOR_PORT}" env_file: ./.env - environment: + environment: - NODE_ENV=production volumes: - ./responses:/mono/monitor/responses + - ./cache:/mono/monitor/cache restart: unless-stopped entrypoint: "yarn start" diff --git a/monitor/eventsStats.js b/monitor/eventsStats.js index c0e49f30..2d5ac542 100644 --- a/monitor/eventsStats.js +++ b/monitor/eventsStats.js @@ -1,8 +1,20 @@ require('dotenv').config() const eventsInfo = require('./utils/events') -const { processedMsgNotDelivered, deliveredMsgNotProcessed, eventWithoutReference } = require('./utils/message') +const { + processedMsgNotDelivered, + deliveredMsgNotProcessed, + eventWithoutReference, + unclaimedHomeToForeignRequests +} = require('./utils/message') +const { getHomeTxSender } = require('./utils/web3Cache') const { BRIDGE_MODES } = require('../commons') +const { + MONITOR_HOME_TO_FOREIGN_ALLOWANCE_LIST, + MONITOR_HOME_TO_FOREIGN_BLOCK_LIST, + MONITOR_HOME_TO_FOREIGN_CHECK_SENDER +} = process.env + async function main() { const { homeToForeignRequests, @@ -33,17 +45,30 @@ async function main() { lastChecked: Math.floor(Date.now() / 1000) } } else { - const onlyInHomeDeposits = homeToForeignRequests.filter(eventWithoutReference(homeToForeignConfirmations)) + let onlyInHomeDeposits = homeToForeignRequests.filter(eventWithoutReference(homeToForeignConfirmations)) const onlyInForeignDeposits = homeToForeignConfirmations.filter(eventWithoutReference(homeToForeignRequests)) const onlyInHomeWithdrawals = foreignToHomeConfirmations.filter(eventWithoutReference(foreignToHomeRequests)) const onlyInForeignWithdrawals = foreignToHomeRequests.filter(eventWithoutReference(foreignToHomeConfirmations)) + const unclaimedStats = {} + if (MONITOR_HOME_TO_FOREIGN_ALLOWANCE_LIST || MONITOR_HOME_TO_FOREIGN_BLOCK_LIST) { + const unclaimedFilter = unclaimedHomeToForeignRequests() + if (MONITOR_HOME_TO_FOREIGN_CHECK_SENDER === 'true') { + for (let i = 0; i < onlyInHomeDeposits.length; i++) { + onlyInHomeDeposits[i].sender = await getHomeTxSender(onlyInHomeDeposits[i].transactionHash) + } + } + unclaimedStats.unclaimedHomeDeposits = onlyInHomeDeposits.filter(unclaimedFilter) + onlyInHomeDeposits = onlyInHomeDeposits.filter(e => !unclaimedFilter(e)) + } + return { onlyInHomeDeposits, onlyInForeignDeposits, onlyInHomeWithdrawals, onlyInForeignWithdrawals, + ...unclaimedStats, lastChecked: Math.floor(Date.now() / 1000) } } diff --git a/monitor/getBalances.js b/monitor/getBalances.js index d60a7b90..180587df 100644 --- a/monitor/getBalances.js +++ b/monitor/getBalances.js @@ -1,23 +1,11 @@ require('dotenv').config() const BN = require('bignumber.js') -const Web3 = require('web3') +const Web3Utils = require('web3').utils const logger = require('./logger')('getBalances') const { BRIDGE_MODES } = require('../commons') +const { web3Home, web3Foreign } = require('./utils/web3') -const Web3Utils = Web3.utils - -const { - COMMON_HOME_RPC_URL, - COMMON_FOREIGN_RPC_URL, - COMMON_HOME_BRIDGE_ADDRESS, - COMMON_FOREIGN_BRIDGE_ADDRESS -} = process.env - -const homeProvider = new Web3.providers.HttpProvider(COMMON_HOME_RPC_URL) -const web3Home = new Web3(homeProvider) - -const foreignProvider = new Web3.providers.HttpProvider(COMMON_FOREIGN_RPC_URL) -const web3Foreign = new Web3(foreignProvider) +const { COMMON_HOME_BRIDGE_ADDRESS, COMMON_FOREIGN_BRIDGE_ADDRESS } = process.env const { ERC20_ABI, diff --git a/monitor/getShortEventStats.js b/monitor/getShortEventStats.js index f314abd0..edaee46d 100644 --- a/monitor/getShortEventStats.js +++ b/monitor/getShortEventStats.js @@ -1,6 +1,16 @@ require('dotenv').config() +const BN = require('bignumber.js') +const Web3Utils = require('web3').utils const eventsInfo = require('./utils/events') +const { eventWithoutReference, unclaimedHomeToForeignRequests } = require('./utils/message') const { BRIDGE_MODES } = require('../commons') +const { getHomeTxSender } = require('./utils/web3Cache') + +const { + MONITOR_HOME_TO_FOREIGN_ALLOWANCE_LIST, + MONITOR_HOME_TO_FOREIGN_BLOCK_LIST, + MONITOR_HOME_TO_FOREIGN_CHECK_SENDER +} = process.env async function main(bridgeMode) { const { @@ -24,9 +34,26 @@ async function main(bridgeMode) { } } } else { - return { + const stats = { depositsDiff: homeToForeignRequests.length - homeToForeignConfirmations.length, - withdrawalDiff: foreignToHomeConfirmations.length - foreignToHomeRequests.length, + withdrawalDiff: foreignToHomeConfirmations.length - foreignToHomeRequests.length + } + if (MONITOR_HOME_TO_FOREIGN_ALLOWANCE_LIST || MONITOR_HOME_TO_FOREIGN_BLOCK_LIST) { + const onlyInHomeDeposits = homeToForeignRequests.filter(eventWithoutReference(homeToForeignConfirmations)) + if (MONITOR_HOME_TO_FOREIGN_CHECK_SENDER === 'true') { + for (let i = 0; i < onlyInHomeDeposits.length; i++) { + onlyInHomeDeposits[i].sender = await getHomeTxSender(onlyInHomeDeposits[i].transactionHash) + } + } + + const unclaimedPool = onlyInHomeDeposits.filter(unclaimedHomeToForeignRequests()) + + stats.depositsDiff -= unclaimedPool.length + stats.unclaimedDiff = unclaimedPool.length + stats.unclaimedBalance = Web3Utils.fromWei(BN.sum(...unclaimedPool.map(e => e.value)).toFixed()) + } + return { + ...stats, home: { deposits: homeToForeignRequests.length, withdrawals: foreignToHomeConfirmations.length diff --git a/monitor/package.json b/monitor/package.json index c91d7297..ea9ff358 100644 --- a/monitor/package.json +++ b/monitor/package.json @@ -14,7 +14,7 @@ "author": "", "license": "ISC", "dependencies": { - "bignumber.js": "^6.0.0", + "bignumber.js": "^9.0.1", "cors": "^2.8.5", "dotenv": "^5.0.1", "express": "^4.16.3", diff --git a/monitor/scripts/getBridgeStats.sh b/monitor/scripts/getBridgeStats.sh index ccf80dbe..f8df6624 100755 --- a/monitor/scripts/getBridgeStats.sh +++ b/monitor/scripts/getBridgeStats.sh @@ -2,6 +2,10 @@ CONFIGDIR="configs" RESPONSESDIR="responses" +ACLDIR="access-lists" +ALLOWANCEFILE="allowance_list.txt" +BLOCKFILE="block_list.txt" +CACHEDIR="cache" IMAGETAG="latest" cd $(dirname $0)/.. @@ -26,10 +30,17 @@ if /usr/local/bin/docker-compose ps | grep -q -i 'monitor'; then fi done + alist=`source ${file} && echo ${MONITOR_HOME_TO_FOREIGN_ALLOWANCE_LIST}` + blist=`source ${file} && echo ${MONITOR_HOME_TO_FOREIGN_BLOCK_LIST}` + al_param="$(pwd)/${ACLDIR}/${bridgename}/${ALLOWANCEFILE}:/mono/monitor/access-lists/allowance_list.txt" + bl_param="$(pwd)/${ACLDIR}/${bridgename}/${BLOCKFILE}:/mono/monitor/access-lists/block_list.txt" + containername=${bridgename}"-checker" docker container stats --no-stream ${containername} 2>/dev/null 1>&2 if [ ! "$?" == "0" ]; then docker run --rm --env-file $file -v $(pwd)/${RESPONSESDIR}:/mono/monitor/responses \ + ${alist:+"-v"} ${alist:+"$al_param"} ${blist:+"-v"} ${blist:+"$bl_param"} \ + -v $(pwd)/${CACHEDIR}/${bridgename}:/mono/monitor/cache \ --name ${containername} poanetwork/tokenbridge-monitor:${IMAGETAG} \ /bin/bash -c 'yarn check-all' shasum -a 256 -s -c ${checksumfile} @@ -57,4 +68,4 @@ if /usr/local/bin/docker-compose ps | grep -q -i 'monitor'; then else echo "Monitor is not running, skipping checks." -fi \ No newline at end of file +fi diff --git a/monitor/stuckTransfers.js b/monitor/stuckTransfers.js index 3fdbe32a..c69b27c5 100644 --- a/monitor/stuckTransfers.js +++ b/monitor/stuckTransfers.js @@ -1,14 +1,11 @@ require('dotenv').config() -const Web3 = require('web3') const logger = require('./logger')('stuckTransfers.js') const { FOREIGN_V1_ABI } = require('../commons/abis') +const { web3Foreign } = require('./utils/web3') -const { COMMON_FOREIGN_RPC_URL, COMMON_FOREIGN_BRIDGE_ADDRESS } = process.env +const { COMMON_FOREIGN_BRIDGE_ADDRESS } = process.env const MONITOR_FOREIGN_START_BLOCK = Number(process.env.MONITOR_FOREIGN_START_BLOCK) || 0 -const foreignProvider = new Web3.providers.HttpProvider(COMMON_FOREIGN_RPC_URL) -const web3Foreign = new Web3(foreignProvider) - const ABITransferWithoutData = [ { anonymous: false, diff --git a/monitor/utils/events.js b/monitor/utils/events.js index 054cca15..a037bd2c 100644 --- a/monitor/utils/events.js +++ b/monitor/utils/events.js @@ -1,5 +1,4 @@ require('dotenv').config() -const Web3 = require('web3') const { toBN } = require('web3').utils const logger = require('../logger')('eventsUtils') const { @@ -19,23 +18,12 @@ const { const { normalizeEventInformation } = require('./message') const { filterTransferBeforeES } = require('./tokenUtils') const { writeFile, readCacheFile } = require('./file') +const { web3Home, web3Foreign } = require('./web3') -const { - COMMON_HOME_RPC_URL, - COMMON_FOREIGN_RPC_URL, - COMMON_HOME_BRIDGE_ADDRESS, - COMMON_FOREIGN_BRIDGE_ADDRESS, - MONITOR_CACHE_EVENTS -} = process.env +const { COMMON_HOME_BRIDGE_ADDRESS, COMMON_FOREIGN_BRIDGE_ADDRESS, MONITOR_CACHE_EVENTS } = process.env const MONITOR_HOME_START_BLOCK = toBN(Number(process.env.MONITOR_HOME_START_BLOCK) || 0) const MONITOR_FOREIGN_START_BLOCK = toBN(Number(process.env.MONITOR_FOREIGN_START_BLOCK) || 0) -const homeProvider = new Web3.providers.HttpProvider(COMMON_HOME_RPC_URL) -const web3Home = new Web3(homeProvider) - -const foreignProvider = new Web3.providers.HttpProvider(COMMON_FOREIGN_RPC_URL) -const web3Foreign = new Web3(foreignProvider) - const { getBlockNumber } = require('./contract') const cacheFilePath = '/tmp/cachedEvents.json' diff --git a/monitor/utils/file.js b/monitor/utils/file.js index 2484e0a1..ddf05ea4 100644 --- a/monitor/utils/file.js +++ b/monitor/utils/file.js @@ -38,9 +38,19 @@ function readCacheFile(filePath) { } } +function readAccessListFile(filePath) { + const data = fs.readFileSync(filePath) + return data + .toString() + .split('\n') + .map(addr => addr.trim().toLowerCase()) + .filter(addr => addr.length === 42) +} + module.exports = { readFile, writeFile, createDir, - readCacheFile + readCacheFile, + readAccessListFile } diff --git a/monitor/utils/message.js b/monitor/utils/message.js index 03c2fac1..46282b1f 100644 --- a/monitor/utils/message.js +++ b/monitor/utils/message.js @@ -1,4 +1,7 @@ const { parseAMBMessage } = require('../../commons') +const { readAccessListFile } = require('./file') + +const { MONITOR_HOME_TO_FOREIGN_ALLOWANCE_LIST, MONITOR_HOME_TO_FOREIGN_BLOCK_LIST } = process.env const keyAMB = e => [e.messageId, e.sender, e.executor].join(',').toLowerCase() @@ -51,9 +54,22 @@ const eventWithoutReference = otherSideEvents => { return e => !keys.has(key(e)) } +const unclaimedHomeToForeignRequests = () => { + if (MONITOR_HOME_TO_FOREIGN_ALLOWANCE_LIST) { + const allowanceList = readAccessListFile(MONITOR_HOME_TO_FOREIGN_ALLOWANCE_LIST) + return e => !allowanceList.includes(e.recipient.toLowerCase()) && !(e.sender && allowanceList.includes(e.sender)) + } else if (MONITOR_HOME_TO_FOREIGN_BLOCK_LIST) { + const blockList = readAccessListFile(MONITOR_HOME_TO_FOREIGN_BLOCK_LIST) + return e => blockList.includes(e.recipient.toLowerCase()) || (e.sender && blockList.includes(e.sender)) + } else { + return () => false + } +} + module.exports = { deliveredMsgNotProcessed, processedMsgNotDelivered, normalizeEventInformation, - eventWithoutReference + eventWithoutReference, + unclaimedHomeToForeignRequests } diff --git a/monitor/utils/web3.js b/monitor/utils/web3.js new file mode 100644 index 00000000..863da23d --- /dev/null +++ b/monitor/utils/web3.js @@ -0,0 +1,15 @@ +require('dotenv').config() +const Web3 = require('web3') + +const { COMMON_HOME_RPC_URL, COMMON_FOREIGN_RPC_URL } = process.env + +const homeProvider = new Web3.providers.HttpProvider(COMMON_HOME_RPC_URL) +const web3Home = new Web3(homeProvider) + +const foreignProvider = new Web3.providers.HttpProvider(COMMON_FOREIGN_RPC_URL) +const web3Foreign = new Web3(foreignProvider) + +module.exports = { + web3Home, + web3Foreign +} diff --git a/monitor/utils/web3Cache.js b/monitor/utils/web3Cache.js new file mode 100644 index 00000000..3dc13277 --- /dev/null +++ b/monitor/utils/web3Cache.js @@ -0,0 +1,29 @@ +const logger = require('../logger')('web3Cache') +const { readCacheFile, writeFile } = require('./file') +const { web3Home } = require('./web3') + +let isDirty = false + +const homeTxSendersCacheFile = './cache/homeTxSenders.json' +const cachedHomeTxSenders = readCacheFile(homeTxSendersCacheFile) || {} + +async function getHomeTxSender(txHash) { + if (!cachedHomeTxSenders[txHash]) { + logger.debug(`Fetching sender for tx ${txHash}`) + cachedHomeTxSenders[txHash] = (await web3Home.eth.getTransaction(txHash)).from.toLowerCase() + isDirty = true + } + return cachedHomeTxSenders[txHash] +} + +function saveCache() { + if (isDirty) { + logger.debug('Saving cache on disk') + writeFile(homeTxSendersCacheFile, cachedHomeTxSenders) + } +} + +module.exports = { + getHomeTxSender, + saveCache +} diff --git a/monitor/validators.js b/monitor/validators.js index e8f71dfc..c6b4ea7b 100644 --- a/monitor/validators.js +++ b/monitor/validators.js @@ -1,13 +1,12 @@ require('dotenv').config() -const Web3 = require('web3') +const Web3Utils = require('web3').utils const fetch = require('node-fetch') const logger = require('./logger')('validators') const { getBridgeABIs, BRIDGE_VALIDATORS_ABI, getValidatorList, gasPriceFromSupplier } = require('../commons') const { getBlockNumber } = require('./utils/contract') +const { web3Home, web3Foreign } = require('./utils/web3') const { - COMMON_HOME_RPC_URL, - COMMON_FOREIGN_RPC_URL, COMMON_HOME_BRIDGE_ADDRESS, COMMON_FOREIGN_BRIDGE_ADDRESS, COMMON_HOME_GAS_PRICE_SUPPLIER_URL, @@ -24,14 +23,6 @@ const MONITOR_FOREIGN_START_BLOCK = Number(process.env.MONITOR_FOREIGN_START_BLO const MONITOR_VALIDATOR_HOME_TX_LIMIT = Number(process.env.MONITOR_VALIDATOR_HOME_TX_LIMIT) || 0 const MONITOR_VALIDATOR_FOREIGN_TX_LIMIT = Number(process.env.MONITOR_VALIDATOR_FOREIGN_TX_LIMIT) || 0 -const Web3Utils = Web3.utils - -const homeProvider = new Web3.providers.HttpProvider(COMMON_HOME_RPC_URL) -const web3Home = new Web3(homeProvider) - -const foreignProvider = new Web3.providers.HttpProvider(COMMON_FOREIGN_RPC_URL) -const web3Foreign = new Web3(foreignProvider) - const homeGasPriceSupplierOpts = { speedType: COMMON_HOME_GAS_PRICE_SPEED_TYPE, factor: COMMON_HOME_GAS_PRICE_FACTOR, diff --git a/oracle/src/utils/utils.js b/oracle/src/utils/utils.js index 7ce89b2a..a7052d46 100644 --- a/oracle/src/utils/utils.js +++ b/oracle/src/utils/utils.js @@ -118,7 +118,10 @@ async function readAccessListFile(fileName, logger) { .split('\n') .map(addr => addr.trim().toLowerCase()) .filter(addr => addr.length === 42) - logger.info({ fileName }, `Access list was read successfully, ${data.length} addresses found`) + logger.info( + { fileName }, + `Access list was read successfully, ${readAccessLists[fileName].length} addresses found` + ) logger.debug({ addresses: readAccessLists[fileName] }, `Read addresses from the file`) } catch (e) { readAccessLists[fileName] = [] diff --git a/yarn.lock b/yarn.lock index fc046235..cf385a04 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5073,6 +5073,11 @@ bignumber.js@^6.0.0: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-6.0.0.tgz#bbfa047644609a5af093e9cbd83b0461fa3f6002" integrity sha512-x247jIuy60/+FtMRvscqfxtVHQf8AGx2hm9c6btkgC0x/hp9yt+teISNhvF8WlwRkCc5yF2fDECH8SIMe8j+GA== +bignumber.js@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5" + integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA== + bignumber.js@~8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-8.0.2.tgz#d8c4e1874359573b1ef03011a2d861214aeef137" From 0228fc7d5f5f8d3ca6d60c5d23d5f76cacc3cd61 Mon Sep 17 00:00:00 2001 From: Kirill Fedoseev Date: Sat, 31 Oct 2020 21:02:56 +0300 Subject: [PATCH 05/10] Support of manual lane in the AMB oracle (#483) --- commons/.eslintrc | 3 +- commons/message.js | 15 +++- contracts | 2 +- e2e-commons/access-lists/block_list.txt | 3 +- e2e-commons/components-envs/oracle-amb.env | 1 + e2e-commons/constants.json | 1 + e2e-commons/docker-compose.yml | 3 + e2e-commons/scripts/deploy.sh | 5 ++ e2e-commons/up.sh | 58 ++++++------- oracle-e2e/run-tests.sh | 20 ++++- oracle-e2e/test/amb.js | 81 ++++++++++++++++++- oracle-e2e/test/utils.js | 5 ++ .../processAMBCollectedSignatures/index.js | 42 +++++++++- package.json | 4 +- 14 files changed, 199 insertions(+), 44 deletions(-) diff --git a/commons/.eslintrc b/commons/.eslintrc index 0194f8e8..78c69fae 100644 --- a/commons/.eslintrc +++ b/commons/.eslintrc @@ -5,7 +5,8 @@ ], "rules": { "no-unused-expressions": "off", - "import/no-extraneous-dependencies": "off" + "import/no-extraneous-dependencies": "off", + "no-bitwise": "off" }, "env": { "mocha": true diff --git a/commons/message.js b/commons/message.js index efa5de30..1afb4117 100644 --- a/commons/message.js +++ b/commons/message.js @@ -6,17 +6,30 @@ function addTxHashToData({ encodedData, transactionHash }) { return encodedData.slice(0, 2) + strip0x(transactionHash) + encodedData.slice(2) } +/** + * Decodes the datatype byte from the AMB message. + * First (the most significant bit) denotes if the message should be forwarded to the manual lane. + * @param dataType: number datatype of the received AMB message. + * @return {{manualLane: boolean}} + */ +const decodeAMBDataType = dataType => ({ + manualLane: (dataType & 128) === 128 +}) + function parseAMBMessage(message) { message = strip0x(message) const messageId = `0x${message.slice(0, 64)}` const sender = `0x${message.slice(64, 104)}` const executor = `0x${message.slice(104, 144)}` + const dataType = parseInt(message.slice(156, 158), 16) return { sender, executor, - messageId + messageId, + dataType, + decodedDataType: decodeAMBDataType(dataType) } } diff --git a/contracts b/contracts index dd461352..1748f947 160000 --- a/contracts +++ b/contracts @@ -1 +1 @@ -Subproject commit dd46135248dbb4684752735aab3cf64db170a405 +Subproject commit 1748f94757c07ce99d13d99a0a5d1d738b292354 diff --git a/e2e-commons/access-lists/block_list.txt b/e2e-commons/access-lists/block_list.txt index f130606c..8edcbf93 100644 --- a/e2e-commons/access-lists/block_list.txt +++ b/e2e-commons/access-lists/block_list.txt @@ -1 +1,2 @@ -0xc9e38bfdB9c635F0796ad83CC8705dc379F41c04 \ No newline at end of file +0xc9e38bfdB9c635F0796ad83CC8705dc379F41c04 +0x612E8bd50A7b1F009F43f2b8679E9B8eD91eb5CE diff --git a/e2e-commons/components-envs/oracle-amb.env b/e2e-commons/components-envs/oracle-amb.env index 4dba7b41..5c529691 100644 --- a/e2e-commons/components-envs/oracle-amb.env +++ b/e2e-commons/components-envs/oracle-amb.env @@ -23,3 +23,4 @@ ORACLE_FOREIGN_RPC_POLLING_INTERVAL=500 ORACLE_ALLOW_HTTP_FOR_RPC=yes ORACLE_HOME_START_BLOCK=1 ORACLE_FOREIGN_START_BLOCK=1 +ORACLE_HOME_TO_FOREIGN_BLOCK_LIST=/mono/oracle/access-lists/block_list.txt diff --git a/e2e-commons/constants.json b/e2e-commons/constants.json index 9aa0609b..b19d81fd 100644 --- a/e2e-commons/constants.json +++ b/e2e-commons/constants.json @@ -63,6 +63,7 @@ "foreign": "0x0AEe1FCD12dDFab6265F7f8956e6E012A9Fe4Aa0", "homeBox": "0x6C4EaAb8756d53Bf599FFe2347FAFF1123D6C8A1", "foreignBox": "0x6C4EaAb8756d53Bf599FFe2347FAFF1123D6C8A1", + "blockedHomeBox": "0x612E8bd50A7b1F009F43f2b8679E9B8eD91eb5CE", "monitor": "http://monitor-amb:3013/bridge" }, "ambStakeErcToErc": { diff --git a/e2e-commons/docker-compose.yml b/e2e-commons/docker-compose.yml index 4fbd84c9..d6863e2a 100644 --- a/e2e-commons/docker-compose.yml +++ b/e2e-commons/docker-compose.yml @@ -61,6 +61,9 @@ services: environment: - NODE_ENV=production command: "true" + volumes: + - '../e2e-commons/access-lists/block_list.txt:/mono/oracle/access-lists/block_list.txt' + - '../e2e-commons/access-lists/allowance_list.txt:/mono/oracle/access-lists/allowance_list.txt' networks: - ultimate ui: diff --git a/e2e-commons/scripts/deploy.sh b/e2e-commons/scripts/deploy.sh index 12466562..109861d6 100755 --- a/e2e-commons/scripts/deploy.sh +++ b/e2e-commons/scripts/deploy.sh @@ -53,3 +53,8 @@ node deploy.js cd - > /dev/null node setupStakeTokens.js cd - > /dev/null + +echo -e "\n\n############ Deploying one more test contract for amb ############\n" +cd "$DEPLOY_PATH" +node src/utils/deployTestBox.js +cd - > /dev/null diff --git a/e2e-commons/up.sh b/e2e-commons/up.sh index f0a367c0..7b3c7afe 100755 --- a/e2e-commons/up.sh +++ b/e2e-commons/up.sh @@ -17,21 +17,29 @@ docker-compose up -d parity1 parity2 e2e startValidator () { docker-compose $1 run -d --name $4 redis docker-compose $1 run -d --name $5 rabbit - docker-compose $1 run $2 $3 -d oracle yarn watcher:signature-request - docker-compose $1 run $2 $3 -d oracle yarn watcher:collected-signatures - docker-compose $1 run $2 $3 -d oracle yarn watcher:affirmation-request - docker-compose $1 run $2 $3 -d oracle-erc20 yarn watcher:signature-request - docker-compose $1 run $2 $3 -d oracle-erc20 yarn watcher:collected-signatures - docker-compose $1 run $2 $3 -d oracle-erc20 yarn watcher:affirmation-request - docker-compose $1 run $2 $3 -d oracle-erc20 yarn watcher:transfer - docker-compose $1 run $2 $3 -d oracle-erc20-native yarn watcher:signature-request - docker-compose $1 run $2 $3 -d oracle-erc20-native yarn watcher:collected-signatures - docker-compose $1 run $2 $3 -d oracle-erc20-native yarn watcher:affirmation-request - docker-compose $1 run $2 $3 -d oracle-erc20-native yarn watcher:transfer - docker-compose $1 run $2 $3 -d oracle-erc20-native yarn worker:convert-to-chai - docker-compose $1 run $2 $3 -d oracle-amb yarn watcher:signature-request - docker-compose $1 run $2 $3 -d oracle-amb yarn watcher:collected-signatures - docker-compose $1 run $2 $3 -d oracle-amb yarn watcher:affirmation-request + if [[ -z "$MODE" || "$MODE" == native-to-erc ]]; then + docker-compose $1 run $2 $3 -d oracle yarn watcher:signature-request + docker-compose $1 run $2 $3 -d oracle yarn watcher:collected-signatures + docker-compose $1 run $2 $3 -d oracle yarn watcher:affirmation-request + fi + if [[ -z "$MODE" || "$MODE" == erc-to-erc ]]; then + docker-compose $1 run $2 $3 -d oracle-erc20 yarn watcher:signature-request + docker-compose $1 run $2 $3 -d oracle-erc20 yarn watcher:collected-signatures + docker-compose $1 run $2 $3 -d oracle-erc20 yarn watcher:affirmation-request + docker-compose $1 run $2 $3 -d oracle-erc20 yarn watcher:transfer + fi + if [[ -z "$MODE" || "$MODE" == erc-to-native ]]; then + docker-compose $1 run $2 $3 -d oracle-erc20-native yarn watcher:signature-request + docker-compose $1 run $2 $3 -d oracle-erc20-native yarn watcher:collected-signatures + docker-compose $1 run $2 $3 -d oracle-erc20-native yarn watcher:affirmation-request + docker-compose $1 run $2 $3 -d oracle-erc20-native yarn watcher:transfer + docker-compose $1 run $2 $3 -d oracle-erc20-native yarn worker:convert-to-chai + fi + if [[ -z "$MODE" || "$MODE" == amb ]]; then + docker-compose $1 run $2 $3 -d oracle-amb yarn watcher:signature-request + docker-compose $1 run $2 $3 -d oracle-amb yarn watcher:collected-signatures + docker-compose $1 run $2 $3 -d oracle-amb yarn watcher:affirmation-request + fi docker-compose $1 run $2 $3 -d oracle-erc20-native yarn sender:home docker-compose $1 run $2 $3 -d oracle-erc20-native yarn sender:foreign } @@ -48,25 +56,7 @@ startAMBValidator () { while [ "$1" != "" ]; do if [ "$1" == "oracle" ]; then - docker-compose up -d redis rabbit - - docker-compose run -d oracle yarn watcher:signature-request - docker-compose run -d oracle yarn watcher:collected-signatures - docker-compose run -d oracle yarn watcher:affirmation-request - docker-compose run -d oracle-erc20 yarn watcher:signature-request - docker-compose run -d oracle-erc20 yarn watcher:collected-signatures - docker-compose run -d oracle-erc20 yarn watcher:affirmation-request - docker-compose run -d oracle-erc20 yarn watcher:transfer - docker-compose run -d oracle-erc20-native yarn watcher:signature-request - docker-compose run -d oracle-erc20-native yarn watcher:collected-signatures - docker-compose run -d oracle-erc20-native yarn watcher:affirmation-request - docker-compose run -d oracle-erc20-native yarn watcher:transfer - docker-compose run -d oracle-erc20-native yarn worker:convert-to-chai - docker-compose run -d oracle-amb yarn watcher:signature-request - docker-compose run -d oracle-amb yarn watcher:collected-signatures - docker-compose run -d oracle-amb yarn watcher:affirmation-request - docker-compose run -d oracle yarn sender:home - docker-compose run -d oracle yarn sender:foreign + startValidator "" "" "" "redis" "rabbit" fi if [ "$1" == "oracle-validator-2" ]; then diff --git a/oracle-e2e/run-tests.sh b/oracle-e2e/run-tests.sh index 455f3fd2..2e05bcc0 100755 --- a/oracle-e2e/run-tests.sh +++ b/oracle-e2e/run-tests.sh @@ -1,8 +1,24 @@ cd $(dirname $0) -../e2e-commons/up.sh deploy blocks oracle oracle-validator-2 oracle-validator-3 +mode="$1" +case "$mode" in + amb) + script=./test/amb.js + ;; + native-to-erc) + script=./test/nativeToErc.js + ;; + erc-to-erc) + script=./test/ercToErc.js + ;; + erc-to-native) + script=./test/ercToNative.js + ;; +esac -docker-compose -f ../e2e-commons/docker-compose.yml run e2e yarn workspace oracle-e2e run start +MODE="$mode" ../e2e-commons/up.sh deploy blocks oracle oracle-validator-2 oracle-validator-3 + +docker-compose -f ../e2e-commons/docker-compose.yml run e2e yarn workspace oracle-e2e run start $script rc=$? ../e2e-commons/down.sh diff --git a/oracle-e2e/test/amb.js b/oracle-e2e/test/amb.js index 57c6c972..3e194a75 100644 --- a/oracle-e2e/test/amb.js +++ b/oracle-e2e/test/amb.js @@ -3,7 +3,7 @@ const assert = require('assert') const { user, homeRPC, foreignRPC, amb, validator } = require('../../e2e-commons/constants.json') const { uniformRetry } = require('../../e2e-commons/utils') const { BOX_ABI, HOME_AMB_ABI, FOREIGN_AMB_ABI } = require('../../commons') -const { setRequiredSignatures } = require('./utils') +const { delay, setRequiredSignatures } = require('./utils') const { toBN } = Web3.utils @@ -19,14 +19,17 @@ foreignWeb3.eth.accounts.wallet.add(user.privateKey) foreignWeb3.eth.accounts.wallet.add(validator.privateKey) const homeBox = new homeWeb3.eth.Contract(BOX_ABI, amb.homeBox) +const blockHomeBox = new homeWeb3.eth.Contract(BOX_ABI, amb.blockedHomeBox) const foreignBox = new foreignWeb3.eth.Contract(BOX_ABI, amb.foreignBox) const homeBridge = new homeWeb3.eth.Contract(HOME_AMB_ABI, COMMON_HOME_BRIDGE_ADDRESS) const foreignBridge = new foreignWeb3.eth.Contract(FOREIGN_AMB_ABI, COMMON_FOREIGN_BRIDGE_ADDRESS) describe('arbitrary message bridging', () => { + let requiredSignatures = 1 before(async () => { // Only 1 validator is used in ultimate tests if (process.env.ULTIMATE !== 'true') { + requiredSignatures = 2 // Set 2 required signatures for home bridge await setRequiredSignatures({ bridgeContract: homeBridge, @@ -76,6 +79,82 @@ describe('arbitrary message bridging', () => { } }) }) + + it('should confirm but not relay message from blocked contract', async () => { + const newValue = 4 + + const initialValue = await foreignBox.methods.value().call() + assert(!toBN(initialValue).eq(toBN(newValue)), 'initial value should be different from new value') + + const signatures = await homeBridge.getPastEvents('SignedForUserRequest', { + fromBlock: 0, + toBlock: 'latest' + }) + + await blockHomeBox.methods + .setValueOnOtherNetwork(newValue, amb.home, amb.foreignBox) + .send({ + from: user.address, + gas: '400000' + }) + .catch(e => { + console.error(e) + }) + + await delay(5000) + + const newSignatures = await homeBridge.getPastEvents('SignedForUserRequest', { + fromBlock: 0, + toBlock: 'latest' + }) + + assert( + newSignatures.length === signatures.length + requiredSignatures, + `Incorrect amount of signatures submitted, got ${newSignatures.length}, expected ${signatures.length + + requiredSignatures}` + ) + + const value = await foreignBox.methods.value().call() + assert(!toBN(value).eq(toBN(newValue)), 'Message should not be relayed by oracle automatically') + }) + + it('should confirm but not relay message from manual lane', async () => { + const newValue = 5 + + const initialValue = await foreignBox.methods.value().call() + assert(!toBN(initialValue).eq(toBN(newValue)), 'initial value should be different from new value') + + const signatures = await homeBridge.getPastEvents('SignedForUserRequest', { + fromBlock: 0, + toBlock: 'latest' + }) + + await homeBox.methods + .setValueOnOtherNetworkUsingManualLane(newValue, amb.home, amb.foreignBox) + .send({ + from: user.address, + gas: '400000' + }) + .catch(e => { + console.error(e) + }) + + await delay(5000) + + const newSignatures = await homeBridge.getPastEvents('SignedForUserRequest', { + fromBlock: 0, + toBlock: 'latest' + }) + + assert( + newSignatures.length === signatures.length + requiredSignatures, + `Incorrect amount of signatures submitted, got ${newSignatures.length}, expected ${signatures.length + + requiredSignatures}` + ) + + const value = await foreignBox.methods.value().call() + assert(!toBN(value).eq(toBN(newValue)), 'Message should not be relayed by oracle automatically') + }) }) }) describe('Foreign to Home', () => { diff --git a/oracle-e2e/test/utils.js b/oracle-e2e/test/utils.js index f1b85de0..48ab703e 100644 --- a/oracle-e2e/test/utils.js +++ b/oracle-e2e/test/utils.js @@ -1,5 +1,9 @@ const { BRIDGE_VALIDATORS_ABI } = require('../../commons') +async function delay(ms) { + return new Promise(res => setTimeout(res, ms)) +} + const setRequiredSignatures = async ({ bridgeContract, web3, requiredSignatures, options }) => { const validatorAddress = await bridgeContract.methods.validatorContract().call() const validatorContract = new web3.eth.Contract(BRIDGE_VALIDATORS_ABI, validatorAddress) @@ -8,5 +12,6 @@ const setRequiredSignatures = async ({ bridgeContract, web3, requiredSignatures, } module.exports = { + delay, setRequiredSignatures } diff --git a/oracle/src/events/processAMBCollectedSignatures/index.js b/oracle/src/events/processAMBCollectedSignatures/index.js index fe983728..bc719f25 100644 --- a/oracle/src/events/processAMBCollectedSignatures/index.js +++ b/oracle/src/events/processAMBCollectedSignatures/index.js @@ -5,6 +5,7 @@ const bridgeValidatorsABI = require('../../../../contracts/build/contracts/Bridg const rootLogger = require('../../services/logger') const { web3Home, web3Foreign } = require('../../services/web3') const { signatureToVRS, packSignatures } = require('../../utils/message') +const { readAccessListFile } = require('../../utils/utils') const { parseAMBMessage } = require('../../../../commons') const estimateGas = require('./estimateGas') const { AlreadyProcessedError, IncompatibleContractError, InvalidValidatorError } = require('../../utils/errors') @@ -12,7 +13,11 @@ const { MAX_CONCURRENT_EVENTS, EXTRA_GAS_ABSOLUTE } = require('../../utils/const const limit = promiseLimit(MAX_CONCURRENT_EVENTS) -const { ORACLE_ALWAYS_RELAY_SIGNATURES } = process.env +const { + ORACLE_HOME_TO_FOREIGN_ALLOWANCE_LIST, + ORACLE_HOME_TO_FOREIGN_BLOCK_LIST, + ORACLE_ALWAYS_RELAY_SIGNATURES +} = process.env let validatorContract = null @@ -50,6 +55,41 @@ function processCollectedSignaturesBuilder(config) { logger.info(`Processing CollectedSignatures ${colSignature.transactionHash}`) const message = await homeBridge.methods.message(messageHash).call() + const parsedMessage = parseAMBMessage(message) + + if (ORACLE_HOME_TO_FOREIGN_ALLOWANCE_LIST || ORACLE_HOME_TO_FOREIGN_BLOCK_LIST) { + const sender = parsedMessage.sender.toLowerCase() + const executor = parsedMessage.executor.toLowerCase() + + if (ORACLE_HOME_TO_FOREIGN_ALLOWANCE_LIST) { + const allowanceList = await readAccessListFile(ORACLE_HOME_TO_FOREIGN_ALLOWANCE_LIST, logger) + if (!allowanceList.includes(executor) && !allowanceList.includes(sender)) { + logger.info( + { sender, executor }, + 'Validator skips a message. Neither sender nor executor addresses are in the allowance list.' + ) + return + } + } else if (ORACLE_HOME_TO_FOREIGN_BLOCK_LIST) { + const blockList = await readAccessListFile(ORACLE_HOME_TO_FOREIGN_BLOCK_LIST, logger) + if (blockList.includes(executor)) { + logger.info({ executor }, 'Validator skips a message. Executor address is in the block list.') + return + } + if (blockList.includes(sender)) { + logger.info({ sender }, 'Validator skips a message. Sender address is in the block list.') + return + } + } + } + + if (parsedMessage.decodedDataType.manualLane) { + logger.info( + { dataType: parsedMessage.dataType }, + 'Validator skips a message. Message was forwarded to the manual lane by the extension' + ) + return + } logger.debug({ NumberOfCollectedSignatures }, 'Number of signatures to get') diff --git a/package.json b/package.json index af29d73d..b77f2e88 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "build:ui": "yarn workspace ui run build", "build:alm": "yarn workspace alm run build", "build:plugin": "yarn workspace burner-wallet-plugin run build", - "lint": "yarn wsrun --exclude token-bridge-contracts lint", + "lint": "yarn wsrun --exclude tokenbridge-contracts lint", "test": "yarn wsrun --exclude oracle-e2e --exclude ui-e2e --exclude monitor-e2e --exclude alm-e2e test", "oracle-e2e": "./oracle-e2e/run-tests.sh", "ui-e2e": "./ui-e2e/run-tests.sh", @@ -47,7 +47,7 @@ "monitor-e2e": "./monitor-e2e/run-tests.sh", "alm-e2e": "./alm-e2e/run-tests.sh", "clean": "rm -rf ./node_modules ./**/node_modules ./**/**/node_modules ./**/build ./**/**/dist", - "compile:contracts": "yarn workspace token-bridge-contracts run compile", + "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" } From eb1069497a690847739b55f4da5871cb4cbe5a9c Mon Sep 17 00:00:00 2001 From: Kirill Fedoseev Date: Wed, 4 Nov 2020 14:24:42 +0300 Subject: [PATCH 06/10] Cache fetched events in monitor (#482) --- .dockerignore | 2 +- commons/utils.js | 2 +- monitor/alerts.js | 27 +- monitor/checkWorker.js | 7 +- monitor/getBalances.js | 63 +- monitor/getShortEventStats.js | 7 +- monitor/package.json | 2 +- monitor/scripts/getBridgeStats.sh | 11 +- monitor/stuckTransfers.js | 46 +- monitor/utils/contract.js | 11 - monitor/utils/events.js | 60 +- monitor/utils/file.js | 6 + monitor/utils/getValidatorsList.js | 93 ++ monitor/utils/web3.js | 14 +- monitor/utils/web3Cache.js | 110 ++- monitor/validators.js | 29 +- yarn.lock | 1482 ++++++++-------------------- 17 files changed, 813 insertions(+), 1159 deletions(-) delete mode 100644 monitor/utils/contract.js create mode 100644 monitor/utils/getValidatorsList.js diff --git a/.dockerignore b/.dockerignore index f31efb0c..f0947608 100644 --- a/.dockerignore +++ b/.dockerignore @@ -17,7 +17,7 @@ contracts/build oracle/test monitor/test monitor/responses -monitor/cache +monitor/cache/* commons/test oracle/**/*.png oracle/**/*.jpg diff --git a/commons/utils.js b/commons/utils.js index 06c61bc5..494975ae 100644 --- a/commons/utils.js +++ b/commons/utils.js @@ -164,7 +164,7 @@ const getPastEvents = async ( } catch (e) { if (e.message.includes('query returned more than') && toBlock !== 'latest') { const middle = toBN(fromBlock) - .add(toBlock) + .add(toBN(toBlock)) .divRound(toBN(2)) const middlePlusOne = middle.add(toBN(1)) diff --git a/monitor/alerts.js b/monitor/alerts.js index 4d118d0f..597e0cff 100644 --- a/monitor/alerts.js +++ b/monitor/alerts.js @@ -1,11 +1,9 @@ require('dotenv').config() -const Web3Utils = require('web3').utils const logger = require('./logger')('alerts') const eventsInfo = require('./utils/events') -const { getBlockNumber } = require('./utils/contract') const { processedMsgNotDelivered, eventWithoutReference } = require('./utils/message') const { BRIDGE_MODES } = require('../commons') -const { web3Home, web3Foreign } = require('./utils/web3') +const { web3Home, web3Foreign, getHomeBlockNumber, getForeignBlockNumber } = require('./utils/web3') async function main() { const { @@ -26,7 +24,8 @@ async function main() { xAffirmations = foreignToHomeConfirmations.filter(eventWithoutReference(foreignToHomeRequests)) } logger.debug('building misbehavior blocks') - const [homeBlockNumber, foreignBlockNumber] = await getBlockNumber(web3Home, web3Foreign) + const homeBlockNumber = await getHomeBlockNumber() + const foreignBlockNumber = await getForeignBlockNumber() const baseRange = [false, false, false, false, false] const xSignaturesMisbehavior = buildRangesObject( @@ -66,21 +65,21 @@ async function main() { /** * Finds the location for the blockNumber in a specific range starting from currentBlockNumber - * @param {BN} currentBlockNumber + * @param {Number} currentBlockNumber * @returns {function({blockNumber?: *}): boolean[]} */ const findMisbehaviorRange = currentBlockNumber => ({ blockNumber }) => { - const minus60 = currentBlockNumber.sub(Web3Utils.toBN(60)) - const minus180 = currentBlockNumber.sub(Web3Utils.toBN(180)) - const minus720 = currentBlockNumber.sub(Web3Utils.toBN(720)) - const minus17280 = currentBlockNumber.sub(Web3Utils.toBN(17280)) + const minus60 = currentBlockNumber - 60 + const minus180 = currentBlockNumber - 180 + const minus720 = currentBlockNumber - 720 + const minus17280 = currentBlockNumber - 17280 return [ - minus60.lte(blockNumber), - minus180.lte(blockNumber) && minus60.gt(blockNumber), - minus720.lte(blockNumber) && minus180.gt(blockNumber), - minus17280.lte(blockNumber) && minus720.gt(blockNumber), - minus17280.gt(blockNumber) + minus60 <= blockNumber, + minus180 <= blockNumber && minus60 > blockNumber, + minus720 <= blockNumber && minus180 > blockNumber, + minus17280 <= blockNumber && minus720 > blockNumber, + minus17280 > blockNumber ] } diff --git a/monitor/checkWorker.js b/monitor/checkWorker.js index 2cc1eaa3..a2384025 100644 --- a/monitor/checkWorker.js +++ b/monitor/checkWorker.js @@ -5,6 +5,7 @@ const { getBridgeMode } = require('../commons') const getBalances = require('./getBalances') const getShortEventStats = require('./getShortEventStats') const validators = require('./validators') +const getEventsInfo = require('./utils/events') const { writeFile, createDir } = require('./utils/file') const { saveCache } = require('./utils/web3Cache') const { web3Home } = require('./utils/web3') @@ -23,10 +24,12 @@ async function checkWorker() { const homeBridge = new web3Home.eth.Contract(HOME_ERC_TO_ERC_ABI, COMMON_HOME_BRIDGE_ADDRESS) const bridgeMode = await getBridgeMode(homeBridge) logger.debug('Bridge mode:', bridgeMode) + logger.debug('calling getEventsInfo()') + const eventsInfo = await getEventsInfo(bridgeMode) logger.debug('calling getBalances()') - const balances = await getBalances(bridgeMode) + const balances = await getBalances(bridgeMode, eventsInfo) logger.debug('calling getShortEventStats()') - const events = await getShortEventStats(bridgeMode) + const events = await getShortEventStats(bridgeMode, eventsInfo) const home = Object.assign({}, balances.home, events.home) const foreign = Object.assign({}, balances.foreign, events.foreign) const status = Object.assign({}, balances, events, { home }, { foreign }) diff --git a/monitor/getBalances.js b/monitor/getBalances.js index 180587df..806cd045 100644 --- a/monitor/getBalances.js +++ b/monitor/getBalances.js @@ -3,7 +3,7 @@ const BN = require('bignumber.js') const Web3Utils = require('web3').utils const logger = require('./logger')('getBalances') const { BRIDGE_MODES } = require('../commons') -const { web3Home, web3Foreign } = require('./utils/web3') +const { web3Home, web3Foreign, getHomeBlockNumber } = require('./utils/web3') const { COMMON_HOME_BRIDGE_ADDRESS, COMMON_FOREIGN_BRIDGE_ADDRESS } = process.env @@ -18,21 +18,50 @@ const { FOREIGN_NATIVE_TO_ERC_ABI } = require('../commons') -async function main(bridgeMode) { +async function main(bridgeMode, eventsInfo) { + const { + homeToForeignConfirmations, + foreignToHomeConfirmations, + homeDelayedBlockNumber, + foreignDelayedBlockNumber + } = eventsInfo + + // Events in the ./utils/events.js are fetched for different block ranges, + // In order to be consistent with the balance values, the following values might be needed + + // Foreign balance should represent all UserRequestForAffirmation events up to block `N - requiredBlockConfirmation()` + // and all RelayedMessage events up to block `N`. + // This constant tells the difference between bridge balance at block `N - requiredBlockConfirmation() + 1` + // and the actual value monitor is interested in. + const lateForeignConfirmationsTotalValue = BN.sum( + 0, + ...homeToForeignConfirmations.filter(e => e.blockNumber > foreignDelayedBlockNumber).map(e => e.value) + ) + // Home balance should represent all UserRequestForSignature events up to block `M - requiredBlockConfirmation()` + // and all AffirmationCompleted events up to block `M`. + // This constant tells the difference between bridge balance at block `M - requiredBlockConfirmation() + 1` + // and the actual value monitor is interested in. + const lateHomeConfirmationsTotalValue = BN.sum( + 0, + ...foreignToHomeConfirmations.filter(e => e.blockNumber > homeDelayedBlockNumber).map(e => e.value) + ) + if (bridgeMode === BRIDGE_MODES.ERC_TO_ERC) { const foreignBridge = new web3Foreign.eth.Contract(FOREIGN_ERC_TO_ERC_ABI, COMMON_FOREIGN_BRIDGE_ADDRESS) const erc20Address = await foreignBridge.methods.erc20token().call() const erc20Contract = new web3Foreign.eth.Contract(ERC20_ABI, erc20Address) logger.debug('calling erc20Contract.methods.balanceOf') - const foreignErc20Balance = await erc20Contract.methods.balanceOf(COMMON_FOREIGN_BRIDGE_ADDRESS).call() + const foreignErc20Balance = await erc20Contract.methods + .balanceOf(COMMON_FOREIGN_BRIDGE_ADDRESS) + .call({}, foreignDelayedBlockNumber) const homeBridge = new web3Home.eth.Contract(HOME_ERC_TO_ERC_ABI, COMMON_HOME_BRIDGE_ADDRESS) logger.debug('calling homeBridge.methods.erc677token') const tokenAddress = await homeBridge.methods.erc677token().call() const tokenContract = new web3Home.eth.Contract(ERC677_ABI, tokenAddress) logger.debug('calling tokenContract.methods.totalSupply()') - const totalSupply = await tokenContract.methods.totalSupply().call() - const foreignBalanceBN = new BN(foreignErc20Balance) - const foreignTotalSupplyBN = new BN(totalSupply) + const totalSupply = await tokenContract.methods.totalSupply().call({}, homeDelayedBlockNumber) + const foreignBalanceBN = new BN(foreignErc20Balance).plus(lateForeignConfirmationsTotalValue) + const foreignTotalSupplyBN = new BN(totalSupply).plus(lateHomeConfirmationsTotalValue) const diff = foreignBalanceBN.minus(foreignTotalSupplyBN).toString(10) logger.debug('Done') return { @@ -49,12 +78,12 @@ async function main(bridgeMode) { logger.debug('calling web3Home.eth.getBalance') const foreignBridge = new web3Foreign.eth.Contract(FOREIGN_NATIVE_TO_ERC_ABI, COMMON_FOREIGN_BRIDGE_ADDRESS) const erc20Address = await foreignBridge.methods.erc677token().call() - const homeBalance = await web3Home.eth.getBalance(COMMON_HOME_BRIDGE_ADDRESS) + const homeBalance = await web3Home.eth.getBalance(COMMON_HOME_BRIDGE_ADDRESS, homeDelayedBlockNumber) const tokenContract = new web3Foreign.eth.Contract(ERC20_ABI, erc20Address) logger.debug('calling tokenContract.methods.totalSupply()') - const totalSupply = await tokenContract.methods.totalSupply().call() - const homeBalanceBN = new BN(homeBalance) - const foreignTotalSupplyBN = new BN(totalSupply) + const totalSupply = await tokenContract.methods.totalSupply().call({}, foreignDelayedBlockNumber) + const homeBalanceBN = new BN(homeBalance).plus(lateHomeConfirmationsTotalValue) + const foreignTotalSupplyBN = new BN(totalSupply).plus(lateForeignConfirmationsTotalValue) const diff = homeBalanceBN.minus(foreignTotalSupplyBN).toString(10) logger.debug('Done') return { @@ -91,21 +120,25 @@ async function main(bridgeMode) { } logger.debug('calling erc20Contract.methods.balanceOf') - const foreignErc20Balance = await erc20Contract.methods.balanceOf(COMMON_FOREIGN_BRIDGE_ADDRESS).call() + const foreignErc20Balance = await erc20Contract.methods + .balanceOf(COMMON_FOREIGN_BRIDGE_ADDRESS) + .call({}, foreignDelayedBlockNumber) const homeBridge = new web3Home.eth.Contract(HOME_ERC_TO_NATIVE_ABI, COMMON_HOME_BRIDGE_ADDRESS) logger.debug('calling homeBridge.methods.blockRewardContract') const blockRewardAddress = await homeBridge.methods.blockRewardContract().call() const blockRewardContract = new web3Home.eth.Contract(BLOCK_REWARD_ABI, blockRewardAddress) + const homeBlockNumber = await getHomeBlockNumber() logger.debug('calling blockReward.methods.mintedTotally') - const mintedCoins = await blockRewardContract.methods.mintedTotallyByBridge(COMMON_HOME_BRIDGE_ADDRESS).call() + const mintedCoins = await blockRewardContract.methods + .mintedTotallyByBridge(COMMON_HOME_BRIDGE_ADDRESS) + .call({}, homeBlockNumber) logger.debug('calling homeBridge.methods.totalBurntCoins') - const burntCoins = await homeBridge.methods.totalBurntCoins().call() - + const burntCoins = await homeBridge.methods.totalBurntCoins().call({}, homeDelayedBlockNumber) const mintedCoinsBN = new BN(mintedCoins) const burntCoinsBN = new BN(burntCoins) const totalSupplyBN = mintedCoinsBN.minus(burntCoinsBN) - const foreignErc20BalanceBN = new BN(foreignErc20Balance) + const foreignErc20BalanceBN = new BN(foreignErc20Balance).plus(lateForeignConfirmationsTotalValue) const investedAmountInDaiBN = new BN(investedAmountInDai) const bridgeDsrBalanceBN = new BN(bridgeDsrBalance) diff --git a/monitor/getShortEventStats.js b/monitor/getShortEventStats.js index edaee46d..c9777285 100644 --- a/monitor/getShortEventStats.js +++ b/monitor/getShortEventStats.js @@ -1,7 +1,6 @@ require('dotenv').config() const BN = require('bignumber.js') const Web3Utils = require('web3').utils -const eventsInfo = require('./utils/events') const { eventWithoutReference, unclaimedHomeToForeignRequests } = require('./utils/message') const { BRIDGE_MODES } = require('../commons') const { getHomeTxSender } = require('./utils/web3Cache') @@ -12,13 +11,13 @@ const { MONITOR_HOME_TO_FOREIGN_CHECK_SENDER } = process.env -async function main(bridgeMode) { +async function main(bridgeMode, eventsInfo) { const { homeToForeignConfirmations, homeToForeignRequests, foreignToHomeConfirmations, foreignToHomeRequests - } = await eventsInfo(bridgeMode) + } = eventsInfo if (bridgeMode === BRIDGE_MODES.ARBITRARY_MESSAGE) { return { @@ -50,7 +49,7 @@ async function main(bridgeMode) { stats.depositsDiff -= unclaimedPool.length stats.unclaimedDiff = unclaimedPool.length - stats.unclaimedBalance = Web3Utils.fromWei(BN.sum(...unclaimedPool.map(e => e.value)).toFixed()) + stats.unclaimedBalance = Web3Utils.fromWei(BN.sum(0, ...unclaimedPool.map(e => e.value)).toFixed()) } return { ...stats, diff --git a/monitor/package.json b/monitor/package.json index ea9ff358..55583cf3 100644 --- a/monitor/package.json +++ b/monitor/package.json @@ -19,7 +19,7 @@ "dotenv": "^5.0.1", "express": "^4.16.3", "node-fetch": "^2.1.2", - "web3": "1.0.0-beta.34" + "web3": "^1.3.0" }, "engines": { "node": ">= 10.18" diff --git a/monitor/scripts/getBridgeStats.sh b/monitor/scripts/getBridgeStats.sh index f8df6624..d847ed28 100755 --- a/monitor/scripts/getBridgeStats.sh +++ b/monitor/scripts/getBridgeStats.sh @@ -12,11 +12,11 @@ cd $(dirname $0)/.. if /usr/local/bin/docker-compose ps | grep -q -i 'monitor'; then tstart=`date +"%s"` - + for file in ${CONFIGDIR}/*.env do echo "${file} handling..." - + bridgename=`source ${file} && echo ${MONITOR_BRIDGE_NAME}` reportdir=${RESPONSESDIR}"/"${bridgename} if [ ! -d ${reportdir} ]; then @@ -38,9 +38,10 @@ if /usr/local/bin/docker-compose ps | grep -q -i 'monitor'; then containername=${bridgename}"-checker" docker container stats --no-stream ${containername} 2>/dev/null 1>&2 if [ ! "$?" == "0" ]; then + mkdir -p "$(pwd)/$CACHEDIR/$bridgename" docker run --rm --env-file $file -v $(pwd)/${RESPONSESDIR}:/mono/monitor/responses \ ${alist:+"-v"} ${alist:+"$al_param"} ${blist:+"-v"} ${blist:+"$bl_param"} \ - -v $(pwd)/${CACHEDIR}/${bridgename}:/mono/monitor/cache \ + -v $(pwd)/${CACHEDIR}/${bridgename}:/mono/monitor/cache/${bridgename} \ --name ${containername} poanetwork/tokenbridge-monitor:${IMAGETAG} \ /bin/bash -c 'yarn check-all' shasum -a 256 -s -c ${checksumfile} @@ -57,11 +58,11 @@ if /usr/local/bin/docker-compose ps | grep -q -i 'monitor'; then else echo "${containername} have not finished yet" >&2 fi - + rm ${checksumfile} echo "========================================" done - + tend=`date +"%s"` tdiff=`expr ${tend} - ${tstart}` echo "Total time to run: ${tdiff}" diff --git a/monitor/stuckTransfers.js b/monitor/stuckTransfers.js index c69b27c5..b5b75062 100644 --- a/monitor/stuckTransfers.js +++ b/monitor/stuckTransfers.js @@ -1,7 +1,8 @@ require('dotenv').config() const logger = require('./logger')('stuckTransfers.js') const { FOREIGN_V1_ABI } = require('../commons/abis') -const { web3Foreign } = require('./utils/web3') +const { web3Foreign, getForeignBlockNumber } = require('./utils/web3') +const { getPastEvents } = require('./utils/web3Cache') const { COMMON_FOREIGN_BRIDGE_ADDRESS } = process.env const MONITOR_FOREIGN_START_BLOCK = Number(process.env.MONITOR_FOREIGN_START_BLOCK) || 0 @@ -61,38 +62,39 @@ const ABIWithData = [ } ] -function compareTransfers(transfersNormal) { - return withData => { - return ( - transfersNormal.filter(normal => { - return normal.transactionHash === withData.transactionHash - }).length === 0 - ) - } +function transferWithoutCallback(transfersNormal) { + const txHashes = new Set() + transfersNormal.forEach(transfer => txHashes.add(transfer.transactionHash)) + return withData => !txHashes.has(withData.transactionHash) } async function main() { const foreignBridge = new web3Foreign.eth.Contract(FOREIGN_V1_ABI, COMMON_FOREIGN_BRIDGE_ADDRESS) + logger.debug('calling foreignBridge.methods.erc677token') const erc20Address = await foreignBridge.methods.erc677token().call() const tokenContract = new web3Foreign.eth.Contract(ABITransferWithoutData, erc20Address) const tokenContractWithData = new web3Foreign.eth.Contract(ABIWithData, erc20Address) + logger.debug('getting last block number') + const foreignBlockNumber = await getForeignBlockNumber() + const foreignConfirmations = await foreignBridge.methods.requiredBlockConfirmations().call() + const foreignDelayedBlockNumber = foreignBlockNumber - foreignConfirmations logger.debug('calling tokenContract.getPastEvents Transfer') - const transfersNormal = await tokenContract.getPastEvents('Transfer', { - filter: { - to: COMMON_FOREIGN_BRIDGE_ADDRESS + const options = { + event: 'Transfer', + options: { + filter: { + to: COMMON_FOREIGN_BRIDGE_ADDRESS + } }, fromBlock: MONITOR_FOREIGN_START_BLOCK, - toBlock: 'latest' - }) + toBlock: foreignBlockNumber, + chain: 'foreign', + safeToBlock: foreignDelayedBlockNumber + } + const transfersNormal = await getPastEvents(tokenContract, options) logger.debug('calling tokenContractWithData.getPastEvents Transfer') - const transfersWithData = await tokenContractWithData.getPastEvents('Transfer', { - filter: { - to: COMMON_FOREIGN_BRIDGE_ADDRESS - }, - fromBlock: MONITOR_FOREIGN_START_BLOCK, - toBlock: 'latest' - }) - const stuckTransfers = transfersNormal.filter(compareTransfers(transfersWithData)) + const transfersWithData = await getPastEvents(tokenContractWithData, options) + const stuckTransfers = transfersNormal.filter(transferWithoutCallback(transfersWithData)) logger.debug('Done') return { stuckTransfers, diff --git a/monitor/utils/contract.js b/monitor/utils/contract.js deleted file mode 100644 index 1bbeb44f..00000000 --- a/monitor/utils/contract.js +++ /dev/null @@ -1,11 +0,0 @@ -const { toBN } = require('web3').utils - -const getBlockNumberCall = web3 => web3.eth.getBlockNumber() - -async function getBlockNumber(web3Home, web3Foreign) { - return (await Promise.all([web3Home, web3Foreign].map(getBlockNumberCall))).map(toBN) -} - -module.exports = { - getBlockNumber -} diff --git a/monitor/utils/events.js b/monitor/utils/events.js index a037bd2c..5d03ec5e 100644 --- a/monitor/utils/events.js +++ b/monitor/utils/events.js @@ -1,5 +1,4 @@ require('dotenv').config() -const { toBN } = require('web3').utils const logger = require('../logger')('eventsUtils') const { BRIDGE_MODES, @@ -10,7 +9,6 @@ const { ERC20_ABI, ERC677_BRIDGE_TOKEN_ABI, getTokenType, - getPastEvents, ZERO_ADDRESS, OLD_AMB_USER_REQUEST_FOR_SIGNATURE_ABI, OLD_AMB_USER_REQUEST_FOR_AFFIRMATION_ABI @@ -18,13 +16,12 @@ const { const { normalizeEventInformation } = require('./message') const { filterTransferBeforeES } = require('./tokenUtils') const { writeFile, readCacheFile } = require('./file') -const { web3Home, web3Foreign } = require('./web3') +const { web3Home, web3Foreign, getHomeBlockNumber, getForeignBlockNumber } = require('./web3') +const { getPastEvents } = require('./web3Cache') const { COMMON_HOME_BRIDGE_ADDRESS, COMMON_FOREIGN_BRIDGE_ADDRESS, MONITOR_CACHE_EVENTS } = process.env -const MONITOR_HOME_START_BLOCK = toBN(Number(process.env.MONITOR_HOME_START_BLOCK) || 0) -const MONITOR_FOREIGN_START_BLOCK = toBN(Number(process.env.MONITOR_FOREIGN_START_BLOCK) || 0) - -const { getBlockNumber } = require('./contract') +const MONITOR_HOME_START_BLOCK = Number(process.env.MONITOR_HOME_START_BLOCK) || 0 +const MONITOR_FOREIGN_START_BLOCK = Number(process.env.MONITOR_FOREIGN_START_BLOCK) || 0 const cacheFilePath = '/tmp/cachedEvents.json' async function main(mode) { @@ -61,11 +58,12 @@ async function main(mode) { } logger.debug('getting last block numbers') - const [homeBlockNumber, foreignBlockNumber] = await getBlockNumber(web3Home, web3Foreign) - const homeConfirmations = toBN(await homeBridge.methods.requiredBlockConfirmations().call()) - const foreignConfirmations = toBN(await foreignBridge.methods.requiredBlockConfirmations().call()) - const homeDelayedBlockNumber = homeBlockNumber.sub(homeConfirmations) - const foreignDelayedBlockNumber = foreignBlockNumber.sub(foreignConfirmations) + const homeBlockNumber = await getHomeBlockNumber() + const foreignBlockNumber = await getForeignBlockNumber() + const homeConfirmations = await homeBridge.methods.requiredBlockConfirmations().call() + const foreignConfirmations = await foreignBridge.methods.requiredBlockConfirmations().call() + const homeDelayedBlockNumber = homeBlockNumber - homeConfirmations + const foreignDelayedBlockNumber = foreignBlockNumber - foreignConfirmations let homeToForeignRequests = [] let foreignToHomeRequests = [] @@ -83,22 +81,24 @@ async function main(mode) { homeToForeignRequests = (await getPastEvents(oldHomeBridge, { event: 'UserRequestForSignature', fromBlock: MONITOR_HOME_START_BLOCK, - toBlock: homeDelayedBlockNumber + toBlock: homeDelayedBlockNumber, + chain: 'home' })).map(normalizeEvent) logger.debug(`found ${homeToForeignRequests.length} events`) if (homeToForeignRequests.length > 0) { - homeMigrationBlock = toBN(Math.max(...homeToForeignRequests.map(x => x.blockNumber))) + homeMigrationBlock = Math.max(...homeToForeignRequests.map(x => x.blockNumber)) } logger.debug("calling oldForeignBridge.getPastEvents('UserRequestForAffirmation(bytes)')") foreignToHomeRequests = (await getPastEvents(oldForeignBridge, { event: 'UserRequestForAffirmation', fromBlock: MONITOR_FOREIGN_START_BLOCK, - toBlock: foreignDelayedBlockNumber + toBlock: foreignDelayedBlockNumber, + chain: 'foreign' })).map(normalizeEvent) logger.debug(`found ${foreignToHomeRequests.length} events`) if (foreignToHomeRequests.length > 0) { - foreignMigrationBlock = toBN(Math.max(...foreignToHomeRequests.map(x => x.blockNumber))) + foreignMigrationBlock = Math.max(...foreignToHomeRequests.map(x => x.blockNumber)) } } @@ -106,7 +106,8 @@ async function main(mode) { const homeToForeignRequestsNew = (await getPastEvents(homeBridge, { event: v1Bridge ? 'Deposit' : 'UserRequestForSignature', fromBlock: homeMigrationBlock, - toBlock: homeDelayedBlockNumber + toBlock: homeDelayedBlockNumber, + chain: 'home' })).map(normalizeEvent) homeToForeignRequests = [...homeToForeignRequests, ...homeToForeignRequestsNew] @@ -114,21 +115,26 @@ async function main(mode) { const homeToForeignConfirmations = (await getPastEvents(foreignBridge, { event: v1Bridge ? 'Deposit' : 'RelayedMessage', fromBlock: MONITOR_FOREIGN_START_BLOCK, - toBlock: foreignBlockNumber + toBlock: foreignBlockNumber, + chain: 'foreign', + safeToBlock: foreignDelayedBlockNumber })).map(normalizeEvent) logger.debug("calling homeBridge.getPastEvents('AffirmationCompleted')") const foreignToHomeConfirmations = (await getPastEvents(homeBridge, { event: v1Bridge ? 'Withdraw' : 'AffirmationCompleted', fromBlock: MONITOR_HOME_START_BLOCK, - toBlock: homeBlockNumber + toBlock: homeBlockNumber, + chain: 'home', + safeToBlock: homeDelayedBlockNumber })).map(normalizeEvent) logger.debug("calling foreignBridge.getPastEvents('UserRequestForAffirmation')") const foreignToHomeRequestsNew = (await getPastEvents(foreignBridge, { event: v1Bridge ? 'Withdraw' : 'UserRequestForAffirmation', fromBlock: foreignMigrationBlock, - toBlock: foreignDelayedBlockNumber + toBlock: foreignDelayedBlockNumber, + chain: 'foreign' })).map(normalizeEvent) foreignToHomeRequests = [...foreignToHomeRequests, ...foreignToHomeRequestsNew] @@ -140,7 +146,8 @@ async function main(mode) { toBlock: foreignDelayedBlockNumber, options: { filter: { to: COMMON_FOREIGN_BRIDGE_ADDRESS } - } + }, + chain: 'foreign' })).map(normalizeEvent) let directTransfers = transferEvents @@ -151,7 +158,9 @@ async function main(mode) { const tokensSwappedEvents = await getPastEvents(foreignBridge, { event: 'TokensSwapped', fromBlock: MONITOR_FOREIGN_START_BLOCK, - toBlock: foreignBlockNumber + toBlock: foreignBlockNumber, + chain: 'foreign', + safeToBlock: foreignDelayedBlockNumber }) // Get token swap events emitted by foreign bridge @@ -190,7 +199,8 @@ async function main(mode) { toBlock: foreignDelayedBlockNumber, options: { filter: { to: COMMON_FOREIGN_BRIDGE_ADDRESS } - } + }, + chain: 'foreign' })).map(normalizeEvent) // Remove events after the ES @@ -225,7 +235,9 @@ async function main(mode) { foreignToHomeConfirmations, foreignToHomeRequests, isExternalErc20, - bridgeMode + bridgeMode, + homeDelayedBlockNumber, + foreignDelayedBlockNumber } if (MONITOR_CACHE_EVENTS === 'true') { diff --git a/monitor/utils/file.js b/monitor/utils/file.js index ddf05ea4..ad9f25f6 100644 --- a/monitor/utils/file.js +++ b/monitor/utils/file.js @@ -38,6 +38,11 @@ function readCacheFile(filePath) { } } +function writeCacheFile(filePath, object) { + fs.mkdirSync(path.dirname(filePath), { recursive: true }) + fs.writeFileSync(filePath, JSON.stringify(object)) +} + function readAccessListFile(filePath) { const data = fs.readFileSync(filePath) return data @@ -52,5 +57,6 @@ module.exports = { writeFile, createDir, readCacheFile, + writeCacheFile, readAccessListFile } diff --git a/monitor/utils/getValidatorsList.js b/monitor/utils/getValidatorsList.js new file mode 100644 index 00000000..57a609bc --- /dev/null +++ b/monitor/utils/getValidatorsList.js @@ -0,0 +1,93 @@ +const { REWARDABLE_VALIDATORS_ABI, processValidatorsEvents } = require('../../commons') +const { getPastEvents } = require('./web3Cache') + +const VALIDATORS_INDEXED_EVENTS_ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + name: 'validator', + type: 'address' + } + ], + name: 'ValidatorRemoved', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + name: 'validator', + type: 'address' + } + ], + name: 'ValidatorAdded', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + name: 'validator', + type: 'address' + }, + { + indexed: true, + name: 'reward', + type: 'address' + } + ], + name: 'ValidatorAdded', + type: 'event' + } +] + +const tryCall = async (method, fallbackValue) => { + try { + return await method.call() + } catch (e) { + return fallbackValue + } +} + +const getValidatorList = async (address, eth, options) => { + const { logger } = options + logger.debug('getting validatorList') + + const validatorsContract = new eth.Contract(REWARDABLE_VALIDATORS_ABI, address) // in monitor, BRIDGE_VALIDATORS_ABI was used + const validators = await tryCall(validatorsContract.methods.validatorList(), []) + + if (validators.length) { + return validators + } + + logger.debug('getting validatorsEvents') + + options.fromBlock = Number(await tryCall(validatorsContract.methods.deployedAtBlock(), 0)) + + const contract = new eth.Contract(VALIDATORS_INDEXED_EVENTS_ABI, address) + + const validatorsEvents = [ + ...(await getPastEvents(contract, { + event: 'ValidatorAdded(address)', + ...options + })), + ...(await getPastEvents(contract, { + event: 'ValidatorAdded(address,address)', + ...options + })), + ...(await getPastEvents(contract, { + event: 'ValidatorRemoved(address)', + ...options + })) + ].sort((a, b) => a.blockNumber - b.blockNumber || a.transactionIndex - b.transactionIndex) + + return processValidatorsEvents(validatorsEvents) +} + +module.exports = { + getValidatorList +} diff --git a/monitor/utils/web3.js b/monitor/utils/web3.js index 863da23d..23cff4a8 100644 --- a/monitor/utils/web3.js +++ b/monitor/utils/web3.js @@ -9,7 +9,19 @@ const web3Home = new Web3(homeProvider) const foreignProvider = new Web3.providers.HttpProvider(COMMON_FOREIGN_RPC_URL) const web3Foreign = new Web3(foreignProvider) +function blockNumberWrapper(web3) { + let blockNumber = null + return async () => { + if (!blockNumber) { + blockNumber = await web3.eth.getBlockNumber() + } + return blockNumber + } +} + module.exports = { web3Home, - web3Foreign + web3Foreign, + getHomeBlockNumber: blockNumberWrapper(web3Home), + getForeignBlockNumber: blockNumberWrapper(web3Foreign) } diff --git a/monitor/utils/web3Cache.js b/monitor/utils/web3Cache.js index 3dc13277..17fab65a 100644 --- a/monitor/utils/web3Cache.js +++ b/monitor/utils/web3Cache.js @@ -1,10 +1,13 @@ const logger = require('../logger')('web3Cache') -const { readCacheFile, writeFile } = require('./file') +const { readCacheFile, writeCacheFile } = require('./file') const { web3Home } = require('./web3') +const { getPastEvents: commonGetPastEvents } = require('../../commons') + +const { MONITOR_BRIDGE_NAME, MONITOR_CACHE_EVENTS } = process.env let isDirty = false -const homeTxSendersCacheFile = './cache/homeTxSenders.json' +const homeTxSendersCacheFile = `./cache/${MONITOR_BRIDGE_NAME}/home/txSenders.json` const cachedHomeTxSenders = readCacheFile(homeTxSendersCacheFile) || {} async function getHomeTxSender(txHash) { @@ -16,14 +19,115 @@ async function getHomeTxSender(txHash) { return cachedHomeTxSenders[txHash] } +async function getPastEvents(contract, options) { + if (MONITOR_CACHE_EVENTS !== 'true') { + return commonGetPastEvents(contract, options) + } + + const contractAddr = contract.options.address + + let eventSignature + if (options.event.includes('(')) { + eventSignature = options.event + options.event = web3Home.utils.sha3(eventSignature) + const eventABI = contract.options.jsonInterface.find(e => e.type === 'event' && e.signature === options.event) + if (!eventABI) { + throw new Error(`Event ${eventSignature} not found`) + } + } else { + const eventABI = contract.options.jsonInterface.find( + e => e.type === 'event' && (e.name === options.event || e.signature === options.event) + ) + if (!eventABI) { + throw new Error(`Event ${options.event} not found`) + } + eventSignature = `${eventABI.name}(${eventABI.inputs.map(i => i.type).join(',')})` + } + + const cacheFile = `./cache/${MONITOR_BRIDGE_NAME}/${options.chain}/${contractAddr}/${eventSignature}.json` + + const { fromBlock, toBlock } = options + const { fromBlock: cachedFromBlock, toBlock: cachedToBlock, events: cachedEvents } = readCacheFile(cacheFile) || { + fromBlock: 0, + toBlock: 0, + events: [] + } + + let result + if (cachedFromBlock > toBlock || fromBlock > cachedToBlock) { + // requested: A...B + // cached: C...D + // OR + // requested: A...B + // cached: C...D + logger.debug(`Fetching events for blocks ${fromBlock}...${toBlock}`) + result = await commonGetPastEvents(contract, options) + } else if (fromBlock < cachedFromBlock && toBlock <= cachedToBlock) { + // requested: A...B + // cached: C...D + logger.debug(`Cache hit for blocks ${cachedFromBlock}...${toBlock}`) + logger.debug(`Fetching events for blocks ${fromBlock}...${cachedFromBlock - 1}`) + result = [ + ...(await commonGetPastEvents(contract, { ...options, toBlock: cachedFromBlock - 1 })), + ...cachedEvents.filter(e => e.blockNumber <= toBlock) + ] + } else if (fromBlock < cachedFromBlock && cachedToBlock < toBlock) { + // requested: A.....B + // cached: C.D + logger.debug(`Cache hit for blocks ${cachedFromBlock}...${cachedToBlock}`) + logger.debug(`Fetching events for blocks ${fromBlock}...${cachedFromBlock - 1}`) + logger.debug(`Fetching events for blocks ${cachedToBlock + 1}...${toBlock}`) + result = [ + ...(await commonGetPastEvents(contract, { ...options, toBlock: cachedFromBlock - 1 })), + ...cachedEvents, + ...(await commonGetPastEvents(contract, { ...options, fromBlock: cachedToBlock + 1 })) + ] + } else if (cachedFromBlock <= fromBlock && toBlock <= cachedToBlock) { + // requested: A.B + // cached: C.....D + logger.debug(`Cache hit for blocks ${fromBlock}...${toBlock}`) + result = cachedEvents.filter(e => fromBlock <= e.blockNumber && e.blockNumber <= toBlock) + } else if (fromBlock >= cachedFromBlock && toBlock > cachedToBlock) { + // requested: A...B + // cached: C...D + logger.debug(`Cache hit for blocks ${fromBlock}...${cachedToBlock}`) + logger.debug(`Fetching events for blocks ${cachedToBlock + 1}...${toBlock}`) + result = [ + ...cachedEvents.filter(e => e.blockNumber >= fromBlock), + ...(await commonGetPastEvents(contract, { ...options, fromBlock: cachedToBlock + 1 })) + ] + } else { + throw new Error( + `Something is broken with cache resolution for getPastEvents, + requested blocks ${fromBlock}...${toBlock}, + cached blocks ${cachedFromBlock}...${cachedToBlock}` + ) + } + + // it is not safe to cache events with too low block confirmations + // so, only events from finalized blocks are included into the cache + const safeToBlock = options.safeToBlock || toBlock + const cacheToSave = result.filter(e => e.blockNumber <= safeToBlock) + logger.debug( + `Saving events cache for ${MONITOR_BRIDGE_NAME}/${options.chain}/${contractAddr}/${eventSignature} on disk` + ) + writeCacheFile(cacheFile, { + fromBlock, + toBlock: safeToBlock, + events: cacheToSave + }) + return result +} + function saveCache() { if (isDirty) { logger.debug('Saving cache on disk') - writeFile(homeTxSendersCacheFile, cachedHomeTxSenders) + writeCacheFile(homeTxSendersCacheFile, cachedHomeTxSenders) } } module.exports = { getHomeTxSender, + getPastEvents, saveCache } diff --git a/monitor/validators.js b/monitor/validators.js index c6b4ea7b..ae32bad1 100644 --- a/monitor/validators.js +++ b/monitor/validators.js @@ -2,9 +2,9 @@ require('dotenv').config() const Web3Utils = require('web3').utils const fetch = require('node-fetch') const logger = require('./logger')('validators') -const { getBridgeABIs, BRIDGE_VALIDATORS_ABI, getValidatorList, gasPriceFromSupplier } = require('../commons') -const { getBlockNumber } = require('./utils/contract') -const { web3Home, web3Foreign } = require('./utils/web3') +const { getBridgeABIs, BRIDGE_VALIDATORS_ABI, gasPriceFromSupplier } = require('../commons') +const { web3Home, web3Foreign, getHomeBlockNumber, getForeignBlockNumber } = require('./utils/web3') +const { getValidatorList } = require('./utils/getValidatorsList') const { COMMON_HOME_BRIDGE_ADDRESS, @@ -18,8 +18,6 @@ const { COMMON_FOREIGN_GAS_PRICE_FALLBACK, COMMON_FOREIGN_GAS_PRICE_FACTOR } = process.env -const MONITOR_HOME_START_BLOCK = Number(process.env.MONITOR_HOME_START_BLOCK) || 0 -const MONITOR_FOREIGN_START_BLOCK = Number(process.env.MONITOR_FOREIGN_START_BLOCK) || 0 const MONITOR_VALIDATOR_HOME_TX_LIMIT = Number(process.env.MONITOR_VALIDATOR_HOME_TX_LIMIT) || 0 const MONITOR_VALIDATOR_FOREIGN_TX_LIMIT = Number(process.env.MONITOR_VALIDATOR_FOREIGN_TX_LIMIT) || 0 @@ -49,7 +47,12 @@ async function main(bridgeMode) { const homeBridgeValidators = new web3Home.eth.Contract(BRIDGE_VALIDATORS_ABI, homeValidatorsAddress) logger.debug('getting last block numbers') - const [homeBlockNumber, foreignBlockNumber] = await getBlockNumber(web3Home, web3Foreign) + const homeBlockNumber = await getHomeBlockNumber() + const foreignBlockNumber = await getForeignBlockNumber() + const homeConfirmations = await homeBridge.methods.requiredBlockConfirmations().call() + const foreignConfirmations = await foreignBridge.methods.requiredBlockConfirmations().call() + const homeDelayedBlockNumber = homeBlockNumber - homeConfirmations + const foreignDelayedBlockNumber = foreignBlockNumber - foreignConfirmations logger.debug('calling foreignBridge.methods.validatorContract().call()') const foreignValidatorsAddress = await foreignBridge.methods.validatorContract().call() @@ -57,16 +60,18 @@ async function main(bridgeMode) { logger.debug('calling foreignBridgeValidators getValidatorList()') const foreignValidators = (await getValidatorList(foreignValidatorsAddress, web3Foreign.eth, { - from: MONITOR_FOREIGN_START_BLOCK, - to: foreignBlockNumber, - logger + toBlock: foreignBlockNumber, + logger, + chain: 'foreign', + safeToBlock: foreignDelayedBlockNumber })).map(web3Foreign.utils.toChecksumAddress) logger.debug('calling homeBridgeValidators getValidatorList()') const homeValidators = (await getValidatorList(homeValidatorsAddress, web3Home.eth, { - from: MONITOR_HOME_START_BLOCK, - to: homeBlockNumber, - logger + toBlock: homeBlockNumber, + logger, + chain: 'home', + safeToBlock: homeDelayedBlockNumber })).map(web3Home.utils.toChecksumAddress) const foreignVBalances = {} diff --git a/yarn.lock b/yarn.lock index cf385a04..d44dc750 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2914,13 +2914,6 @@ dependencies: "@babel/types" "^7.3.0" -"@types/bignumber.js@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/bignumber.js/-/bignumber.js-5.0.0.tgz#d9f1a378509f3010a3255e9cc822ad0eeb4ab969" - integrity sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA== - 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.5": version "4.11.6" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" @@ -3079,6 +3072,13 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.59.tgz#9e34261f30183f9777017a13d185dfac6b899e04" integrity sha512-8RkBivJrDCyPpBXhVZcjh7cQxVBSmRk9QM7hOketZzp6Tg79c0N8kkpAIito9bnJ3HCVCHVYz+KHTEbfQNfeVQ== +"@types/pbkdf2@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== + dependencies: + "@types/node" "*" + "@types/promise-retry@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@types/promise-retry/-/promise-retry-1.1.3.tgz#baab427419da9088a1d2f21bf56249c21b3dd43c" @@ -3153,6 +3153,13 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== +"@types/secp256k1@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.1.tgz#fb3aa61a1848ad97d7425ff9dcba784549fca5a4" + integrity sha512-+ZjSA8ELlOp8SlKi0YLB2tz9d5iPNEmOBd+8Rz21wTMdaXQIa9b6TEnD6l5qKOCypE7FSyPyck12qZJxSDNoog== + dependencies: + "@types/node" "*" + "@types/solidity-parser-antlr@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@types/solidity-parser-antlr/-/solidity-parser-antlr-0.2.3.tgz#bb2d9c6511bf483afe4fc3e2714da8a924e59e3f" @@ -3529,6 +3536,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + "@zkochan/cmd-shim@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz#2ab8ed81f5bb5452a85f25758eb9b8681982fd2e" @@ -3767,13 +3779,6 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" -ansi-colors@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" - integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== - dependencies: - ansi-wrap "^0.1.0" - ansi-colors@^3.0.0: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" @@ -3791,13 +3796,6 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.11.0" -ansi-gray@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" - integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE= - dependencies: - ansi-wrap "0.1.0" - ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" @@ -3843,11 +3841,6 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: "@types/color-name" "^1.1.1" color-convert "^2.0.1" -ansi-wrap@0.1.0, ansi-wrap@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" - integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= - ansicolors@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" @@ -3884,13 +3877,6 @@ app-module-path@^2.2.0: resolved "https://registry.yarnpkg.com/app-module-path/-/app-module-path-2.2.0.tgz#641aa55dfb7d6a6f0a8141c4b9c0aa50b6c24dd5" integrity sha1-ZBqlXft9am8KgUHEucCqULbCTdU= -append-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" - integrity sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE= - dependencies: - buffer-equal "^1.0.0" - append-transform@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" @@ -3971,25 +3957,11 @@ arr-diff@^4.0.0: resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-filter@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/arr-filter/-/arr-filter-1.1.2.tgz#43fdddd091e8ef11aa4c45d9cdc18e2dff1711ee" - integrity sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4= - dependencies: - make-iterator "^1.0.0" - arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== -arr-map@^2.0.0, arr-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/arr-map/-/arr-map-2.0.2.tgz#3a77345ffc1cf35e2a91825601f9e58f2e24cac4" - integrity sha1-Onc0X/wc814qkYJWAfnljy4kysQ= - dependencies: - make-iterator "^1.0.0" - arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" @@ -4000,11 +3972,6 @@ array-differ@^2.0.3: resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-2.1.0.tgz#4b9c1c3f14b906757082925769e8ab904f4801b1" integrity sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w== -array-each@^1.0.0, array-each@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" - integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= - array-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" @@ -4057,21 +4024,6 @@ array-includes@^3.1.1: es-abstract "^1.17.0" is-string "^1.0.5" -array-initial@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/array-initial/-/array-initial-1.1.0.tgz#2fa74b26739371c3947bd7a7adc73be334b3d795" - integrity sha1-L6dLJnOTccOUe9enrcc74zSz15U= - dependencies: - array-slice "^1.0.0" - is-number "^4.0.0" - -array-last@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array-last/-/array-last-1.3.0.tgz#7aa77073fec565ddab2493f5f88185f404a9d336" - integrity sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg== - dependencies: - is-number "^4.0.0" - array-map@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" @@ -4082,20 +4034,6 @@ array-reduce@~0.0.0: resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= -array-slice@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" - integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== - -array-sort@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a" - integrity sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg== - dependencies: - default-compare "^1.0.0" - get-value "^2.0.6" - kind-of "^5.0.2" - array-union@^1.0.1, array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -4185,16 +4123,6 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -async-done@^1.2.0, async-done@^1.2.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/async-done/-/async-done-1.3.2.tgz#5e15aa729962a4b07414f528a88cdf18e0b290a2" - integrity sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.2" - process-nextick-args "^2.0.0" - stream-exhaust "^1.0.1" - async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" @@ -4217,13 +4145,6 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== -async-settle@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-settle/-/async-settle-1.0.0.tgz#1d0a914bb02575bec8a8f3a74e5080f72b2c0c6b" - integrity sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs= - dependencies: - async-done "^1.2.2" - async@1.x, async@^1.4.2, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -4979,21 +4900,6 @@ babylon@^6.18.0: resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== -bach@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/bach/-/bach-1.2.0.tgz#4b3ce96bf27134f79a1b414a51c14e34c3bd9880" - integrity sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA= - dependencies: - arr-filter "^1.1.1" - arr-flatten "^1.0.1" - arr-map "^2.0.0" - array-each "^1.0.0" - array-initial "^1.0.0" - array-last "^1.1.1" - async-done "^1.2.2" - async-settle "^1.0.0" - now-and-later "^2.0.0" - backoff@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" @@ -5058,11 +4964,6 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -bignumber.js@*, bignumber.js@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" - integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== - bignumber.js@7.2.1, bignumber.js@^7.2.1: version "7.2.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" @@ -5073,6 +4974,11 @@ bignumber.js@^6.0.0: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-6.0.0.tgz#bbfa047644609a5af093e9cbd83b0461fa3f6002" integrity sha512-x247jIuy60/+FtMRvscqfxtVHQf8AGx2hm9c6btkgC0x/hp9yt+teISNhvF8WlwRkCc5yF2fDECH8SIMe8j+GA== +bignumber.js@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" + integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== + bignumber.js@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5" @@ -5155,6 +5061,11 @@ bl@^4.0.1: inherits "^2.0.4" readable-stream "^3.4.0" +blakejs@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.0.tgz#69df92ef953aa88ca51a32df6ab1c54a155fc7a5" + integrity sha1-ad+S75U6qIylGjLfarHFShVfx6U= + block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" @@ -5310,7 +5221,7 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6: +browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6, browserify-aes@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== @@ -5454,11 +5365,6 @@ buffer-crc32@~0.2.3: resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= -buffer-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" - integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= - buffer-fill@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" @@ -6062,11 +5968,6 @@ cliui@^5.0.0: strip-ansi "^5.2.0" wrap-ansi "^5.1.0" -clone-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" - integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= - clone-deep@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" @@ -6095,12 +5996,7 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" -clone-stats@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" - integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= - -clone@2.1.2, clone@^2.0.0, clone@^2.1.1: +clone@2.1.2, clone@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= @@ -6110,15 +6006,6 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -cloneable-readable@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" - integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== - dependencies: - inherits "^2.0.1" - process-nextick-args "^2.0.0" - readable-stream "^2.3.5" - cluster-key-slot@^1.0.6: version "1.0.12" resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.0.12.tgz#d5deff2a520717bc98313979b687309b2d368e29" @@ -6151,15 +6038,6 @@ coinstring@^2.0.0: bs58 "^2.0.1" create-hash "^1.1.1" -collection-map@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c" - integrity sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw= - dependencies: - arr-map "^2.0.2" - for-own "^1.0.0" - make-iterator "^1.0.0" - collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -6200,11 +6078,6 @@ color-string@^1.5.2: color-name "^1.0.0" simple-swizzle "^0.2.2" -color-support@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - color@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/color/-/color-3.1.1.tgz#7abf5c0d38e89378284e873c207ae2172dcc8a61" @@ -6546,13 +6419,6 @@ convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.1: dependencies: safe-buffer "~5.1.1" -convert-source-map@^1.5.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -6585,14 +6451,6 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -copy-props@^2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/copy-props/-/copy-props-2.0.4.tgz#93bb1cadfafd31da5bb8a9d4b41f471ec3a72dfe" - integrity sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A== - dependencies: - each-props "^1.3.0" - is-plain-object "^2.0.1" - copy-to-clipboard@^3: version "3.2.0" resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.2.0.tgz#d2724a3ccbfed89706fac8a894872c979ac74467" @@ -6668,15 +6526,15 @@ cosmiconfig@^5.0.0, cosmiconfig@^5.0.7, cosmiconfig@^5.1.0, cosmiconfig@^5.2.0: parse-json "^4.0.0" coveralls@^3.0.6: - version "3.0.11" - resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.11.tgz#e141da0922b632fcc66620f334460c3f0026a4ce" - integrity sha512-LZPWPR2NyGKyaABnc49dR0fpeP6UqhvGq4B5nUrTQ1UBy55z96+ga7r+/ChMdMJUwBgyJDXBi88UBgz2rs9IiQ== + version "3.1.0" + resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.1.0.tgz#13c754d5e7a2dd8b44fe5269e21ca394fb4d615b" + integrity sha512-sHxOu2ELzW8/NC1UP5XVLbZDzO4S3VxfFye3XYCznopHy02YjNkHcj5bKaVw2O7hVaBdBjEdQGpie4II1mWhuQ== dependencies: js-yaml "^3.13.1" lcov-parse "^1.0.0" log-driver "^1.2.7" minimist "^1.2.5" - request "^2.88.0" + request "^2.88.2" create-ecdh@^4.0.0: version "4.0.3" @@ -6704,7 +6562,7 @@ create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2, create-hash@^1.2.0: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -7295,13 +7153,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= -default-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" - integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ== - dependencies: - kind-of "^5.0.2" - default-gateway@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" @@ -7317,11 +7168,6 @@ default-require-extensions@^1.0.0: dependencies: strip-bom "^2.0.0" -default-resolution@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684" - integrity sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ= - defaults@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" @@ -7433,11 +7279,6 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= - detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" @@ -7739,14 +7580,6 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" -each-props@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333" - integrity sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA== - dependencies: - is-plain-object "^2.0.1" - object.defaults "^1.1.0" - ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -7961,7 +7794,7 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50: +es5-ext@^0.10.35, es5-ext@^0.10.50: version "0.10.53" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== @@ -7970,7 +7803,7 @@ es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50: es6-symbol "~3.1.3" next-tick "~1.0.0" -es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: +es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= @@ -8004,16 +7837,6 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3: d "^1.0.1" ext "^1.1.2" -es6-weak-map@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" - integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== - dependencies: - d "1" - es5-ext "^0.10.46" - es6-iterator "^2.0.3" - es6-symbol "^3.1.1" - escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -8638,18 +8461,6 @@ eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: json-rpc-random-id "^1.0.0" xtend "^4.0.1" -eth-sig-util@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.3.0.tgz#c54a6ac8e8796f7e25f59cf436982a930e645231" - integrity sha512-ugD1AvaggvKaZDgnS19W5qOfepjGc7qHrt7TrAaL54gJw9SHvgIXJ3r2xOMW30RWJZNP+1GlTOy5oye7yXA4xA== - dependencies: - buffer "^5.2.1" - elliptic "^6.4.0" - ethereumjs-abi "0.6.5" - ethereumjs-util "^5.1.1" - tweetnacl "^1.0.0" - tweetnacl-util "^0.15.0" - eth-sig-util@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210" @@ -8658,6 +8469,18 @@ eth-sig-util@^1.4.2: ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" ethereumjs-util "^5.1.1" +eth-sig-util@^2.0.0: + version "2.5.3" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.3.tgz#6938308b38226e0b3085435474900b03036abcbe" + integrity sha512-KpXbCKmmBUNUTGh9MRKmNkIPietfhzBqqYqysDavLseIiMUGl95k6UcPEkALAZlj41e9E6yioYXc1PC333RKqw== + dependencies: + buffer "^5.2.1" + elliptic "^6.4.0" + ethereumjs-abi "0.6.5" + ethereumjs-util "^5.1.1" + tweetnacl "^1.0.0" + tweetnacl-util "^0.15.0" + eth-tx-summary@^3.1.2: version "3.2.4" resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c" @@ -8701,6 +8524,27 @@ ethereum-common@^0.0.18: resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= +ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + ethereum-types@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/ethereum-types/-/ethereum-types-2.1.6.tgz#57d9d515fad86ab987c0f6962c4203be37da8579" @@ -8717,14 +8561,6 @@ ethereumjs-abi@0.6.5: bn.js "^4.10.0" ethereumjs-util "^4.3.0" -ethereumjs-abi@0.6.7: - version "0.6.7" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.7.tgz#d1d1c5cdb8d910a7d97645ba9e93be5d153bba2e" - integrity sha512-EMLOA8ICO5yAaXDhjVEfYjsJIXYutY8ufTE93eEKwsVtp2usQreKwsDTJ9zvam3omYqNuffr8IONIqb2uUslGQ== - dependencies: - bn.js "^4.11.8" - ethereumjs-util "^6.0.0" - ethereumjs-abi@0.6.8, "ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": version "0.6.8" resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#1cfbb13862f90f0b391d8a699544d5fe4dfb8c7b" @@ -8848,6 +8684,19 @@ ethereumjs-util@6.2.0, ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.0: rlp "^2.2.3" secp256k1 "^3.0.1" +ethereumjs-util@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + ethereumjs-util@^4.0.1, ethereumjs-util@^4.3.0: version "4.5.0" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz#3e9428b317eebda3d7260d854fddda954b1f1bc6" @@ -8859,10 +8708,23 @@ ethereumjs-util@^4.0.1, ethereumjs-util@^4.3.0: rlp "^2.0.0" secp256k1 "^3.0.1" -ethereumjs-vm@4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-4.1.3.tgz#dc8eb45f47d775da9f0b2437d5e20896fdf66f37" - integrity sha512-RTrD0y7My4O6Qr1P2ZIsMfD6RzL6kU/RhBZ0a5XrPzAeR61crBS7or66ohDrvxDI/rDBxMi+6SnsELih6fzalw== +ethereumjs-util@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" + integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== + dependencies: + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "^0.1.3" + rlp "^2.0.0" + safe-buffer "^5.1.1" + +ethereumjs-vm@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz#e885e861424e373dbc556278f7259ff3fca5edab" + integrity sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA== dependencies: async "^2.1.2" async-eventemitter "^0.2.2" @@ -8897,18 +8759,18 @@ ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: rustbn.js "~0.2.0" safe-buffer "^5.1.1" -ethereumjs-wallet@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.3.tgz#b0eae6f327637c2aeb9ccb9047b982ac542e6ab1" - integrity sha512-qiXPiZOsStem+Dj/CQHbn5qex+FVkuPmGH7SvSnA9F3tdRDt8dLMyvIj3+U05QzVZNPYh4HXEdnzoYI4dZkr9w== +ethereumjs-wallet@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz#685e9091645cee230ad125c007658833991ed474" + integrity sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA== dependencies: aes-js "^3.1.1" bs58check "^2.1.2" + ethereum-cryptography "^0.1.3" ethereumjs-util "^6.0.0" - hdkey "^1.1.0" randombytes "^2.0.6" safe-buffer "^5.1.2" - scrypt.js "^0.3.0" + scryptsy "^1.2.1" utf8 "^3.0.0" uuid "^3.3.2" @@ -9069,13 +8931,6 @@ expand-tilde@^1.2.2: dependencies: os-homedir "^1.0.1" -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= - dependencies: - homedir-polyfill "^1.0.1" - expect-puppeteer@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/expect-puppeteer/-/expect-puppeteer-4.4.0.tgz#1c948af08acdd6c8cbdb7f90e617f44d86888886" @@ -9222,16 +9077,6 @@ fake-merkle-patricia-tree@^1.0.1: dependencies: checkpoint-store "^1.1.0" -fancy-log@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" - integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== - dependencies: - ansi-gray "^0.1.1" - color-support "^1.1.3" - parse-node-version "^1.0.0" - time-stamp "^1.0.0" - fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" @@ -9514,41 +9359,13 @@ find-up@^4.0.0: locate-path "^5.0.0" path-exists "^4.0.0" -findup-sync@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" - integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= +find-yarn-workspace-root@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" + integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== dependencies: - detect-file "^1.0.0" - is-glob "^3.1.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - -findup-sync@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" - integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - -fined@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b" - integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== - dependencies: - expand-tilde "^2.0.2" - is-plain-object "^2.0.3" - object.defaults "^1.1.0" - object.pick "^1.2.0" - parse-filepath "^1.0.1" - -flagged-respawn@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" - integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== + fs-extra "^4.0.3" + micromatch "^3.1.4" flat-cache@^2.0.1: version "2.0.1" @@ -9584,7 +9401,7 @@ flow-stoplight@^1.0.0: resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b" integrity sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s= -flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: +flush-write-stream@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== @@ -9717,7 +9534,7 @@ fs-exists-sync@^0.1.0: resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0= -fs-extra@7.0.1, fs-extra@^7.0.0: +fs-extra@7.0.1, fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== @@ -9745,7 +9562,7 @@ fs-extra@^2.0.0, fs-extra@^2.1.2: graceful-fs "^4.1.2" jsonfile "^2.1.0" -fs-extra@^4.0.2: +fs-extra@^4.0.2, fs-extra@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== @@ -9779,14 +9596,6 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" -fs-mkdirp-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" - integrity sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes= - dependencies: - graceful-fs "^4.1.11" - through2 "^2.0.3" - fs-promise@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/fs-promise/-/fs-promise-2.0.3.tgz#f64e4f854bcf689aa8bddcba268916db3db46854" @@ -9865,9 +9674,9 @@ ganache-cli@^6.6.0: yargs "13.2.4" ganache-core@^2.6.0: - version "2.10.2" - resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.10.2.tgz#17c171c6c0195b6734a0dd741a9d2afd4f74e292" - integrity sha512-4XEO0VsqQ1+OW7Za5fQs9/Kk7o8M0T1sRfFSF8h9NeJ2ABaqMO5waqxf567ZMcSkRKaTjUucBSz83xNfZv1HDg== + version "2.13.1" + resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.13.1.tgz#bf60399a2dd084e1090db91cbbc7ed3885dc01e4" + integrity sha512-Ewg+kNcDqXtOohe7jCcP+ZUv9EMzOx2MoqOYYP3BCfxrDh3KjBXXaKK+Let7li0TghAs9lxmBgevZku35j5YzA== dependencies: abstract-leveldown "3.0.0" async "2.6.2" @@ -9876,27 +9685,30 @@ ganache-core@^2.6.0: clone "2.1.2" debug "3.2.6" encoding-down "5.0.4" - eth-sig-util "2.3.0" - ethereumjs-abi "0.6.7" + eth-sig-util "^2.0.0" + ethereumjs-abi "0.6.8" ethereumjs-account "3.0.0" ethereumjs-block "2.2.2" ethereumjs-common "1.5.0" ethereumjs-tx "2.1.2" - ethereumjs-util "6.2.0" - ethereumjs-vm "4.1.3" + ethereumjs-util "6.2.1" + ethereumjs-vm "4.2.0" heap "0.2.6" + keccak "3.0.1" level-sublevel "6.6.4" levelup "3.1.1" - lodash "4.17.14" - merkle-patricia-tree "2.3.2" + lodash "4.17.20" + lru-cache "5.1.1" + merkle-patricia-tree "3.0.0" + patch-package "6.2.2" seedrandom "3.0.1" source-map-support "0.5.12" tmp "0.1.0" web3-provider-engine "14.2.1" - websocket "1.0.29" + websocket "1.0.32" optionalDependencies: - ethereumjs-wallet "0.6.3" - web3 "1.2.4" + ethereumjs-wallet "0.6.5" + web3 "1.2.11" gas-price-oracle@^0.1.5: version "0.1.5" @@ -10106,39 +9918,11 @@ glob-parent@^5.0.0, glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" -glob-stream@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" - integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ= - dependencies: - extend "^3.0.0" - glob "^7.1.1" - glob-parent "^3.1.0" - is-negated-glob "^1.0.0" - ordered-read-streams "^1.0.0" - pumpify "^1.3.5" - readable-stream "^2.1.5" - remove-trailing-separator "^1.0.1" - to-absolute-glob "^2.0.0" - unique-stream "^2.0.2" - glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= -glob-watcher@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-5.0.3.tgz#88a8abf1c4d131eb93928994bc4a593c2e5dd626" - integrity sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg== - dependencies: - anymatch "^2.0.0" - async-done "^1.2.0" - chokidar "^2.0.0" - is-negated-glob "^1.0.0" - just-debounce "^1.0.0" - object.defaults "^1.1.0" - glob@7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" @@ -10208,15 +9992,6 @@ global-modules@^0.2.3: global-prefix "^0.1.4" is-windows "^0.2.0" -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - global-prefix@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" @@ -10227,17 +10002,6 @@ global-prefix@^0.1.4: is-windows "^0.2.0" which "^1.2.12" -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - global-prefix@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" @@ -10319,13 +10083,6 @@ globule@^1.0.0: lodash "~4.17.12" minimatch "~3.0.2" -glogg@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f" - integrity sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA== - dependencies: - sparkles "^1.0.0" - got@7.1.0, got@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" @@ -10380,11 +10137,6 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^4.0.0, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== - graceful-fs@^4.1.10, graceful-fs@^4.1.2: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" @@ -10395,6 +10147,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.6: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== +graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" @@ -10410,47 +10167,6 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -gulp-cli@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.2.0.tgz#5533126eeb7fe415a7e3e84a297d334d5cf70ebc" - integrity sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA== - dependencies: - ansi-colors "^1.0.1" - archy "^1.0.0" - array-sort "^1.0.0" - color-support "^1.1.3" - concat-stream "^1.6.0" - copy-props "^2.0.1" - fancy-log "^1.3.2" - gulplog "^1.0.0" - interpret "^1.1.0" - isobject "^3.0.1" - liftoff "^3.1.0" - matchdep "^2.0.0" - mute-stdout "^1.0.0" - pretty-hrtime "^1.0.0" - replace-homedir "^1.0.0" - semver-greatest-satisfied-range "^1.1.0" - v8flags "^3.0.1" - yargs "^7.1.0" - -gulp@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/gulp/-/gulp-4.0.2.tgz#543651070fd0f6ab0a0650c6a3e6ff5a7cb09caa" - integrity sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA== - dependencies: - glob-watcher "^5.0.3" - gulp-cli "^2.2.0" - undertaker "^1.2.1" - vinyl-fs "^3.0.0" - -gulplog@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" - integrity sha1-4oxNRdBey77YGDY86PnFkmIp/+U= - dependencies: - glogg "^1.0.0" - gzip-size@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.0.0.tgz#a55ecd99222f4c48fd8c01c625ce3b349d0a0e80" @@ -10613,7 +10329,7 @@ hash.js@1.1.3: inherits "^2.0.3" minimalistic-assert "^1.0.0" -hash.js@^1.0.0, hash.js@^1.0.3: +hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== @@ -10655,15 +10371,6 @@ hdkey@^0.7.1: coinstring "^2.0.0" secp256k1 "^3.0.1" -hdkey@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/hdkey/-/hdkey-1.1.1.tgz#c2b3bfd5883ff9529b72f2f08b28be0972a9f64a" - integrity sha512-DvHZ5OuavsfWs5yfVJZestsnc3wzPvLWNk6c2nRUfo6X+OtxypGt20vDDf7Ba+MJzjL3KS1og2nw2eBbLCOUTA== - dependencies: - coinstring "^2.0.0" - safe-buffer "^5.1.1" - secp256k1 "^3.0.1" - he@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" @@ -10744,7 +10451,7 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" -homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: +homedir-polyfill@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== @@ -11262,7 +10969,7 @@ internal-slot@^1.0.2: has "^1.0.3" side-channel "^1.0.2" -interpret@^1.0.0, interpret@^1.1.0: +interpret@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== @@ -11333,14 +11040,6 @@ is-absolute-url@^2.0.0: resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= -is-absolute@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" - integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== - dependencies: - is-relative "^1.0.0" - is-windows "^1.0.1" - is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -11582,11 +11281,6 @@ is-natural-number@^4.0.1: resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg= -is-negated-glob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" - integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= - is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" @@ -11703,13 +11397,6 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= -is-relative@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" - integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== - dependencies: - is-unc-path "^1.0.0" - is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" @@ -11768,29 +11455,17 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-unc-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" - integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== - dependencies: - unc-path-regex "^0.1.2" - -is-utf8@^0.2.0, is-utf8@^0.2.1: +is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-valid-glob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" - integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao= - is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" integrity sha1-3hqm1j6indJIc3tp8f+LgALSEIw= -is-windows@^1.0.0, is-windows@^1.0.1, is-windows@^1.0.2: +is-windows@^1.0.0, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -12706,16 +12381,19 @@ jszip@^3.1.3: readable-stream "~2.3.6" set-immediate-shim "~1.0.1" -just-debounce@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.0.0.tgz#87fccfaeffc0b68cd19d55f6722943f929ea35ea" - integrity sha1-h/zPrv/AtozRnVX2cilD+SnqNeo= - just-extend@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== +keccak@3.0.1, keccak@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" + integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + keccak@^1.0.2: version "1.4.0" resolved "https://registry.yarnpkg.com/keccak/-/keccak-1.4.0.tgz#572f8a6dbee8e7b3aa421550f9e6408ca2186f80" @@ -12777,7 +12455,7 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" -kind-of@^5.0.0, kind-of@^5.0.2: +kind-of@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== @@ -12787,6 +12465,13 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" @@ -12807,14 +12492,6 @@ last-call-webpack-plugin@^3.0.0: lodash "^4.17.5" webpack-sources "^1.1.0" -last-run@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b" - integrity sha1-RblpQsF7HHnHchmCWbqUO+v4yls= - dependencies: - default-resolution "^2.0.0" - es6-weak-map "^2.0.1" - latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" @@ -12832,13 +12509,6 @@ lazy-cache@^1.0.3: resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= -lazystream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" - integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= - dependencies: - readable-stream "^2.0.5" - lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -12858,13 +12528,6 @@ lcov-parse@^1.0.0: resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-1.0.0.tgz#eb0d46b54111ebc561acb4c408ef9363bdc8f7e0" integrity sha1-6w1GtUER68VhrLTECO+TY73I9+A= -lead@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" - integrity sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI= - dependencies: - flush-write-stream "^1.0.2" - left-pad@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" @@ -12999,6 +12662,15 @@ level-ws@0.0.0: readable-stream "~1.0.15" xtend "~2.1.1" +level-ws@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-1.0.0.tgz#19a22d2d4ac57b18cc7c6ecc4bd23d899d8f603b" + integrity sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q== + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.8" + xtend "^4.0.1" + levelup@3.1.1, levelup@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189" @@ -13042,20 +12714,6 @@ lie@~3.3.0: dependencies: immediate "~3.0.5" -liftoff@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3" - integrity sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog== - dependencies: - extend "^3.0.0" - findup-sync "^3.0.0" - fined "^1.0.1" - flagged-respawn "^1.0.0" - is-plain-object "^2.0.4" - object.map "^1.0.0" - rechoir "^0.6.2" - resolve "^1.1.7" - load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -13301,10 +12959,10 @@ lodash.values@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= -lodash@4.17.14: - version "4.17.14" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" - integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== +lodash@4.17.20: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== "lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.5.1, lodash@~4.17.12: version "4.17.15" @@ -13371,6 +13029,13 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lru-cache@5.1.1, lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru-cache@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee" @@ -13386,13 +13051,6 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - ltgt@^2.1.2, ltgt@~2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" @@ -13445,13 +13103,6 @@ make-fetch-happen@^5.0.0: socks-proxy-agent "^4.0.0" ssri "^6.0.0" -make-iterator@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" - integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== - dependencies: - kind-of "^6.0.2" - makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -13471,7 +13122,7 @@ map-age-cleaner@^0.1.1: dependencies: p-defer "^1.0.0" -map-cache@^0.2.0, map-cache@^0.2.2: +map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= @@ -13515,16 +13166,6 @@ marked@^0.7.0: resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== -matchdep@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e" - integrity sha1-xvNINKDY28OzfCfui7yyfHd1WC4= - dependencies: - findup-sync "^2.0.0" - micromatch "^3.0.4" - resolve "^1.4.0" - stack-trace "0.0.10" - math-random@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" @@ -13693,7 +13334,20 @@ merge2@^1.2.3: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== -merkle-patricia-tree@2.3.2, merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: +merkle-patricia-tree@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz#448d85415565df72febc33ca362b8b614f5a58f8" + integrity sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ== + dependencies: + async "^2.6.1" + ethereumjs-util "^5.2.0" + level-mem "^3.0.1" + level-ws "^1.0.0" + readable-stream "^3.0.6" + rlp "^2.0.0" + semaphore ">=1.0.1" + +merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a" integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g== @@ -13736,7 +13390,7 @@ micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: +micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -14119,11 +13773,6 @@ multimatch@^3.0.0: arrify "^1.0.1" minimatch "^3.0.4" -mute-stdout@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" - integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== - mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -14254,6 +13903,11 @@ node-abi@^2.7.0: dependencies: semver "^5.4.1" +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + node-emoji@^1.4.1: version "1.10.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" @@ -14293,6 +13947,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@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" + integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== + 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" @@ -14548,13 +14207,6 @@ normalize-url@^4.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== -now-and-later@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c" - integrity sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ== - dependencies: - once "^1.3.2" - npm-bundled@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" @@ -14751,7 +14403,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.0.4, object.assign@^4.1.0: +object.assign@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== @@ -14761,16 +14413,6 @@ object.assign@^4.0.4, object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.defaults@^1.0.0, object.defaults@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" - integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= - dependencies: - array-each "^1.0.1" - array-slice "^1.0.0" - for-own "^1.0.0" - isobject "^3.0.0" - object.entries@^1.0.4: version "1.1.0" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" @@ -14819,14 +14461,6 @@ object.getownpropertydescriptors@^2.0.3: define-properties "^1.1.2" es-abstract "^1.5.1" -object.map@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" - integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc= - dependencies: - for-own "^1.0.0" - make-iterator "^1.0.0" - object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -14835,21 +14469,13 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" -object.pick@^1.2.0, object.pick@^1.3.0: +object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" -object.reduce@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object.reduce/-/object.reduce-1.0.1.tgz#6fe348f2ac7fa0f95ca621226599096825bb03ad" - integrity sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60= - dependencies: - for-own "^1.0.0" - make-iterator "^1.0.0" - object.values@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" @@ -14913,7 +14539,7 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: +once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -14993,13 +14619,6 @@ optionator@^0.8.3: type-check "~0.3.2" word-wrap "~1.2.3" -ordered-read-streams@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" - integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4= - dependencies: - readable-stream "^2.0.1" - original-require@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/original-require/-/original-require-1.0.1.tgz#0f130471584cd33511c5ec38c8d59213f9ac5e20" @@ -15260,15 +14879,6 @@ parse-code-context@^1.0.0: resolved "https://registry.yarnpkg.com/parse-code-context/-/parse-code-context-1.0.0.tgz#718c295c593d0d19a37f898473268cc75e98de1e" integrity sha512-OZQaqKaQnR21iqhlnPfVisFjBWjhnMl5J9MgbP8xC+EwoVqbXrq78lp+9Zb3ahmLzrIX5Us/qbvBnaS3hkH6OA== -parse-filepath@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" - integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= - dependencies: - is-absolute "^1.0.0" - map-cache "^0.2.0" - path-root "^0.1.1" - parse-github-repo-url@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" @@ -15307,11 +14917,6 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-node-version@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" - integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== - parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -15355,6 +14960,24 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +patch-package@6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39" + integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^2.4.2" + cross-spawn "^6.0.5" + find-yarn-workspace-root "^1.2.1" + fs-extra "^7.0.1" + is-ci "^2.0.0" + klaw-sync "^6.0.0" + minimist "^1.2.0" + rimraf "^2.6.3" + semver "^5.6.0" + slash "^2.0.0" + tmp "^0.0.33" + path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" @@ -15402,18 +15025,6 @@ path-parse@^1.0.5, path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== -path-root-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" - integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= - -path-root@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" - integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= - dependencies: - path-root-regex "^0.1.0" - path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -15454,6 +15065,17 @@ pathval@^1.1.0: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= +pbkdf2@^3.0.17: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + pbkdf2@^3.0.3, pbkdf2@^3.0.9: version "3.0.17" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" @@ -16395,17 +16017,12 @@ pretty-format@^25.1.0: ansi-styles "^4.0.0" react-is "^16.12.0" -pretty-hrtime@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" - integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= - private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== -process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: +process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== @@ -16667,7 +16284,7 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -pumpify@^1.3.3, pumpify@^1.3.5: +pumpify@^1.3.3: version "1.5.1" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== @@ -17202,7 +16819,7 @@ read@1, read@~1.0.1: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^2.0.1, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.5: +readable-stream@^2.0.1, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.2.8, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.5: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -17477,24 +17094,7 @@ relateurl@0.2.x: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= -remove-bom-buffer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" - integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ== - dependencies: - is-buffer "^1.1.5" - is-utf8 "^0.2.1" - -remove-bom-stream@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523" - integrity sha1-BfGlk/FuQuH7kOv1nejlaVJflSM= - dependencies: - remove-bom-buffer "^3.0.0" - safe-buffer "^5.1.0" - through2 "^2.0.3" - -remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0: +remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= @@ -17527,20 +17127,11 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -replace-ext@1.0.0, replace-ext@^1.0.0: +replace-ext@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= -replace-homedir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c" - integrity sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw= - dependencies: - homedir-polyfill "^1.0.1" - is-absolute "^1.0.0" - remove-trailing-separator "^1.1.0" - req-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc" @@ -17588,7 +17179,7 @@ request-promise@^4.2.2: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.67.0, request@^2.85.0, request@^2.87.0, request@^2.88.0: +request@^2.67.0, request@^2.85.0, request@^2.87.0, request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -17685,14 +17276,6 @@ resolve-dir@^0.1.0: expand-tilde "^1.2.2" global-modules "^0.2.3" -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - resolve-from@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" @@ -17708,13 +17291,6 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-options@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" - integrity sha1-MrueOcBtZzONyTeMDW1gdFZq0TE= - dependencies: - value-or-function "^3.0.0" - resolve-pathname@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879" @@ -17749,13 +17325,6 @@ resolve@^1.1.6, resolve@^1.10.1, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1, dependencies: path-parse "^1.0.6" -resolve@^1.1.7, resolve@^1.12.0, resolve@^1.15.1, resolve@^1.4.0, resolve@~1.15.1: - version "1.15.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== - dependencies: - path-parse "^1.0.6" - resolve@^1.10.0: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" @@ -17763,6 +17332,13 @@ resolve@^1.10.0: dependencies: path-parse "^1.0.6" +resolve@^1.12.0, resolve@^1.15.1, resolve@~1.15.1: + version "1.15.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" + integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== + dependencies: + path-parse "^1.0.6" + resolve@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" @@ -18031,7 +17607,7 @@ 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: +scrypt-js@^3.0.0, 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== @@ -18044,15 +17620,6 @@ scrypt.js@0.2.0: scrypt "^6.0.2" scryptsy "^1.2.1" -scrypt.js@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/scrypt.js/-/scrypt.js-0.3.0.tgz#6c62d61728ad533c8c376a2e5e3e86d41a95c4c0" - integrity sha512-42LTc1nyFsyv/o0gcHtDztrn+aqpkaCNt5Qh7ATBZfhEZU7IC/0oT/qbBH+uRNoAPvs2fwiOId68FDEoSRA8/A== - dependencies: - scryptsy "^1.2.1" - optionalDependencies: - scrypt "^6.0.2" - scrypt@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/scrypt/-/scrypt-6.0.3.tgz#04e014a5682b53fa50c2d5cce167d719c06d870d" @@ -18094,6 +17661,15 @@ secp256k1@^3.0.1: nan "^2.14.0" safe-buffer "^5.1.2" +secp256k1@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" + integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== + dependencies: + elliptic "^6.5.2" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + seedrandom@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" @@ -18145,13 +17721,6 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -semver-greatest-satisfied-range@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b" - integrity sha1-E+jCZYq5aRywzXEJMkAoDTb3els= - dependencies: - sver-compat "^1.5.0" - "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -18687,11 +18256,6 @@ space-separated-tokens@^1.0.0: resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.4.tgz#27910835ae00d0adfcdbd0ad7e611fb9544351fa" integrity sha512-UyhMSmeIqZrQn2UdjYpxEkwY9JUrn8pP+7L4f91zRzOQuI8MF1FGLfYU9DKCYeLdo7LXMxwrX5zKFy7eeeVHuA== -sparkles@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" - integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw== - spawn-command@^0.0.2-1: version "0.0.2-1" resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" @@ -18828,11 +18392,6 @@ stable@^0.1.8: resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== -stack-trace@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= - stack-utils@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" @@ -18879,11 +18438,6 @@ stream-each@^1.1.0: end-of-stream "^1.1.0" stream-shift "^1.0.0" -stream-exhaust@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d" - integrity sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw== - stream-http@^2.7.2: version "2.8.3" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" @@ -19234,14 +18788,6 @@ supports-hyperlinks@^1.0.1: has-flag "^2.0.0" supports-color "^5.0.0" -sver-compat@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8" - integrity sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg= - dependencies: - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" - svgo@^1.0.0, svgo@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.2.2.tgz#0253d34eccf2aed4ad4f283e11ee75198f9d7316" @@ -19281,24 +18827,6 @@ swarm-js@0.1.37: tar.gz "^1.0.5" xhr-request-promise "^0.1.2" -swarm-js@0.1.39: - version "0.1.39" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.39.tgz#79becb07f291d4b2a178c50fee7aa6e10342c0e8" - integrity sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg== - dependencies: - bluebird "^3.5.0" - buffer "^5.0.5" - decompress "^4.0.0" - eth-lib "^0.1.26" - fs-extra "^4.0.2" - got "^7.1.0" - mime-types "^2.1.16" - mkdirp-promise "^5.0.1" - mock-fs "^4.1.0" - setimmediate "^1.0.5" - tar "^4.0.2" - xhr-request-promise "^0.1.2" - swarm-js@^0.1.40: version "0.1.40" resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99" @@ -19600,15 +19128,7 @@ throat@^4.0.0, throat@^4.1.0: resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= -through2-filter@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" - integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== - dependencies: - through2 "~2.0.0" - xtend "~4.0.0" - -through2@^2.0.0, through2@^2.0.2, through2@^2.0.3, through2@~2.0.0: +through2@^2.0.0, through2@^2.0.2, through2@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -19633,11 +19153,6 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826" integrity sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow== -time-stamp@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= - timed-out@^4.0.0, timed-out@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" @@ -19696,14 +19211,6 @@ tmpl@1.0.x: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= -to-absolute-glob@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" - integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs= - dependencies: - is-absolute "^1.0.0" - is-negated-glob "^1.0.0" - to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -19761,13 +19268,6 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -to-through@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6" - integrity sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY= - dependencies: - through2 "^2.0.3" - toggle-selection@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" @@ -20073,11 +19573,6 @@ unbzip2-stream@^1.3.3: buffer "^5.2.1" through "^2.3.8" -unc-path-regex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" - integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= - undefsafe@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" @@ -20095,26 +19590,6 @@ underscore@1.9.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== -undertaker-registry@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50" - integrity sha1-XkvaMI5KiirlhPm5pDWaSZglzFA= - -undertaker@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/undertaker/-/undertaker-1.2.1.tgz#701662ff8ce358715324dfd492a4f036055dfe4b" - integrity sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA== - dependencies: - arr-flatten "^1.0.1" - arr-map "^2.0.0" - bach "^1.0.0" - collection-map "^1.0.0" - es6-weak-map "^2.0.1" - last-run "^1.1.0" - object.defaults "^1.0.0" - object.reduce "^1.0.0" - undertaker-registry "^1.0.0" - 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" @@ -20186,14 +19661,6 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" -unique-stream@^2.0.2: - version "2.3.1" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" - integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== - dependencies: - json-stable-stringify-without-jsonify "^1.0.1" - through2-filter "^3.0.0" - unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" @@ -20447,13 +19914,6 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== -v8flags@^3.0.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8" - integrity sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w== - dependencies: - homedir-polyfill "^1.0.1" - valid-url@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" @@ -20484,11 +19944,6 @@ value-equal@^1.0.1: resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== -value-or-function@^3.0.0: - version "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" @@ -20549,54 +20004,6 @@ vfile@^4.0.0: unist-util-stringify-position "^2.0.0" vfile-message "^2.0.0" -vinyl-fs@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" - integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng== - dependencies: - fs-mkdirp-stream "^1.0.0" - glob-stream "^6.1.0" - graceful-fs "^4.0.0" - is-valid-glob "^1.0.0" - lazystream "^1.0.0" - lead "^1.0.0" - object.assign "^4.0.4" - pumpify "^1.3.5" - readable-stream "^2.3.3" - remove-bom-buffer "^3.0.0" - remove-bom-stream "^1.2.0" - resolve-options "^1.1.0" - through2 "^2.0.0" - to-through "^2.0.0" - value-or-function "^3.0.0" - vinyl "^2.0.0" - vinyl-sourcemap "^1.1.0" - -vinyl-sourcemap@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16" - integrity sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY= - dependencies: - append-buffer "^1.0.2" - convert-source-map "^1.5.0" - graceful-fs "^4.1.6" - normalize-path "^2.1.1" - now-and-later "^2.0.0" - remove-bom-buffer "^3.0.0" - vinyl "^2.0.0" - -vinyl@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" - integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== - dependencies: - clone "^2.1.1" - clone-buffer "^1.0.0" - clone-stats "^1.0.0" - cloneable-readable "^1.0.0" - remove-trailing-separator "^1.0.1" - replace-ext "^1.0.0" - vm-browserify@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" @@ -20710,14 +20117,14 @@ web3-bzz@1.0.0-beta.34: swarm-js "0.1.37" underscore "1.8.3" -web3-bzz@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.4.tgz#a4adb7a8cba3d260de649bdb1f14ed359bfb3821" - integrity sha512-MqhAo/+0iQSMBtt3/QI1rU83uvF08sYq8r25+OUZ+4VtihnYsmkkca+rdU0QbRyrXY2/yGIpI46PFdh0khD53A== +web3-bzz@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f" + integrity sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg== dependencies: - "@types/node" "^10.12.18" + "@types/node" "^12.12.6" got "9.6.0" - swarm-js "0.1.39" + swarm-js "^0.1.40" underscore "1.9.1" web3-bzz@1.2.7: @@ -20758,14 +20165,14 @@ web3-core-helpers@1.0.0-beta.34: web3-eth-iban "1.0.0-beta.34" web3-utils "1.0.0-beta.34" -web3-core-helpers@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.4.tgz#ffd425861f4d66b3f38df032afdb39ea0971fc0f" - integrity sha512-U7wbsK8IbZvF3B7S+QMSNP0tni/6VipnJkB0tZVEpHEIV2WWeBHYmZDnULWcsS/x/jn9yKhJlXIxWGsEAMkjiw== +web3-core-helpers@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99" + integrity sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A== dependencies: underscore "1.9.1" - web3-eth-iban "1.2.4" - web3-utils "1.2.4" + web3-eth-iban "1.2.11" + web3-utils "1.2.11" web3-core-helpers@1.2.7: version "1.2.7" @@ -20807,16 +20214,17 @@ web3-core-method@1.0.0-beta.34: web3-core-subscriptions "1.0.0-beta.34" web3-utils "1.0.0-beta.34" -web3-core-method@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.4.tgz#a0fbc50b8ff5fd214021435cc2c6d1e115807aed" - integrity sha512-8p9kpL7di2qOVPWgcM08kb+yKom0rxRCMv6m/K+H+yLSxev9TgMbCgMSbPWAHlyiF3SJHw7APFKahK5Z+8XT5A== +web3-core-method@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.11.tgz#f880137d1507a0124912bf052534f168b8d8fbb6" + integrity sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw== dependencies: + "@ethersproject/transactions" "^5.0.0-beta.135" underscore "1.9.1" - web3-core-helpers "1.2.4" - web3-core-promievent "1.2.4" - web3-core-subscriptions "1.2.4" - web3-utils "1.2.4" + web3-core-helpers "1.2.11" + web3-core-promievent "1.2.11" + web3-core-subscriptions "1.2.11" + web3-utils "1.2.11" web3-core-method@1.2.7: version "1.2.7" @@ -20857,13 +20265,12 @@ web3-core-promievent@1.0.0-beta.34: any-promise "1.3.0" eventemitter3 "1.1.1" -web3-core-promievent@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.4.tgz#75e5c0f2940028722cdd21ba503ebd65272df6cb" - integrity sha512-gEUlm27DewUsfUgC3T8AxkKi8Ecx+e+ZCaunB7X4Qk3i9F4C+5PSMGguolrShZ7Zb6717k79Y86f3A00O0VAZw== +web3-core-promievent@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz#51fe97ca0ddec2f99bf8c3306a7a8e4b094ea3cf" + integrity sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA== dependencies: - any-promise "1.3.0" - eventemitter3 "3.1.2" + eventemitter3 "4.0.4" web3-core-promievent@1.2.7: version "1.2.7" @@ -20901,16 +20308,16 @@ web3-core-requestmanager@1.0.0-beta.34: web3-providers-ipc "1.0.0-beta.34" web3-providers-ws "1.0.0-beta.34" -web3-core-requestmanager@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.4.tgz#0a7020a23fb91c6913c611dfd3d8c398d1e4b4a8" - integrity sha512-eZJDjyNTDtmSmzd3S488nR/SMJtNnn/GuwxnMh3AzYCqG3ZMfOylqTad2eYJPvc2PM5/Gj1wAMQcRpwOjjLuPg== +web3-core-requestmanager@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a" + integrity sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA== dependencies: underscore "1.9.1" - web3-core-helpers "1.2.4" - web3-providers-http "1.2.4" - web3-providers-ipc "1.2.4" - web3-providers-ws "1.2.4" + web3-core-helpers "1.2.11" + web3-providers-http "1.2.11" + web3-providers-ipc "1.2.11" + web3-providers-ws "1.2.11" web3-core-requestmanager@1.2.7: version "1.2.7" @@ -20952,14 +20359,14 @@ web3-core-subscriptions@1.0.0-beta.34: underscore "1.8.3" web3-core-helpers "1.0.0-beta.34" -web3-core-subscriptions@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.4.tgz#0dc095b5cfd82baa527a39796e3515a846b21b99" - integrity sha512-3D607J2M8ymY9V+/WZq4MLlBulwCkwEjjC2U+cXqgVO1rCyVqbxZNCmHyNYHjDDCxSEbks9Ju5xqJxDSxnyXEw== +web3-core-subscriptions@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz#beca908fbfcb050c16f45f3f0f4c205e8505accd" + integrity sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg== dependencies: - eventemitter3 "3.1.2" + eventemitter3 "4.0.4" underscore "1.9.1" - web3-core-helpers "1.2.4" + web3-core-helpers "1.2.11" web3-core-subscriptions@1.2.7: version "1.2.7" @@ -20999,18 +20406,18 @@ web3-core@1.0.0-beta.34: web3-core-requestmanager "1.0.0-beta.34" web3-utils "1.0.0-beta.34" -web3-core@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.4.tgz#2df13b978dcfc59c2abaa887d27f88f21ad9a9d6" - integrity sha512-CHc27sMuET2cs1IKrkz7xzmTdMfZpYswe7f0HcuyneTwS1yTlTnHyqjAaTy0ZygAb/x4iaVox+Gvr4oSAqSI+A== +web3-core@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7" + integrity sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ== dependencies: - "@types/bignumber.js" "^5.0.0" - "@types/bn.js" "^4.11.4" - "@types/node" "^12.6.1" - web3-core-helpers "1.2.4" - web3-core-method "1.2.4" - web3-core-requestmanager "1.2.4" - web3-utils "1.2.4" + "@types/bn.js" "^4.11.5" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.2.11" + web3-core-method "1.2.11" + web3-core-requestmanager "1.2.11" + web3-utils "1.2.11" web3-core@1.2.7: version "1.2.7" @@ -21058,14 +20465,14 @@ web3-eth-abi@1.0.0-beta.34: web3-core-helpers "1.0.0-beta.34" web3-utils "1.0.0-beta.34" -web3-eth-abi@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.4.tgz#5b73e5ef70b03999227066d5d1310b168845e2b8" - integrity sha512-8eLIY4xZKoU3DSVu1pORluAw9Ru0/v4CGdw5so31nn+7fR8zgHMgwbFe0aOqWQ5VU42PzMMXeIJwt4AEi2buFg== +web3-eth-abi@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz#a887494e5d447c2926d557a3834edd66e17af9b0" + integrity sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg== dependencies: - ethers "4.0.0-beta.3" + "@ethersproject/abi" "5.0.0-beta.153" underscore "1.9.1" - web3-utils "1.2.4" + web3-utils "1.2.11" web3-eth-abi@1.2.7: version "1.2.7" @@ -21126,23 +20533,22 @@ web3-eth-accounts@1.0.0-beta.34: web3-core-method "1.0.0-beta.34" web3-utils "1.0.0-beta.34" -web3-eth-accounts@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.4.tgz#ada6edc49542354328a85cafab067acd7f88c288" - integrity sha512-04LzT/UtWmRFmi4hHRewP5Zz43fWhuHiK5XimP86sUQodk/ByOkXQ3RoXyGXFMNoRxdcAeRNxSfA2DpIBc9xUw== +web3-eth-accounts@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz#a9e3044da442d31903a7ce035a86d8fa33f90520" + integrity sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw== dependencies: - "@web3-js/scrypt-shim" "^0.1.0" - any-promise "1.3.0" crypto-browserify "3.12.0" - eth-lib "0.2.7" + 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.2.4" - web3-core-helpers "1.2.4" - web3-core-method "1.2.4" - web3-utils "1.2.4" + web3-core "1.2.11" + web3-core-helpers "1.2.11" + web3-core-method "1.2.11" + web3-utils "1.2.11" web3-eth-accounts@1.2.7: version "1.2.7" @@ -21206,20 +20612,20 @@ web3-eth-contract@1.0.0-beta.34: web3-eth-abi "1.0.0-beta.34" web3-utils "1.0.0-beta.34" -web3-eth-contract@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.4.tgz#68ef7cc633232779b0a2c506a810fbe903575886" - integrity sha512-b/9zC0qjVetEYnzRA1oZ8gF1OSSUkwSYi5LGr4GeckLkzXP7osEnp9lkO/AQcE4GpG+l+STnKPnASXJGZPgBRQ== +web3-eth-contract@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz#917065902bc27ce89da9a1da26e62ef663663b90" + integrity sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow== dependencies: - "@types/bn.js" "^4.11.4" + "@types/bn.js" "^4.11.5" underscore "1.9.1" - web3-core "1.2.4" - web3-core-helpers "1.2.4" - web3-core-method "1.2.4" - web3-core-promievent "1.2.4" - web3-core-subscriptions "1.2.4" - web3-eth-abi "1.2.4" - web3-utils "1.2.4" + web3-core "1.2.11" + web3-core-helpers "1.2.11" + web3-core-method "1.2.11" + web3-core-promievent "1.2.11" + web3-core-subscriptions "1.2.11" + web3-eth-abi "1.2.11" + web3-utils "1.2.11" web3-eth-contract@1.2.7: version "1.2.7" @@ -21251,19 +20657,20 @@ web3-eth-contract@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" - integrity sha512-g8+JxnZlhdsCzCS38Zm6R/ngXhXzvc3h7bXlxgKU4coTzLLoMpgOAEz71GxyIJinWTFbLXk/WjNY0dazi9NwVw== +web3-eth-ens@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz#26d4d7f16d6cbcfff918e39832b939edc3162532" + integrity sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA== dependencies: + content-hash "^2.5.2" eth-ens-namehash "2.0.8" underscore "1.9.1" - web3-core "1.2.4" - web3-core-helpers "1.2.4" - web3-core-promievent "1.2.4" - web3-eth-abi "1.2.4" - web3-eth-contract "1.2.4" - web3-utils "1.2.4" + web3-core "1.2.11" + web3-core-helpers "1.2.11" + web3-core-promievent "1.2.11" + web3-eth-abi "1.2.11" + web3-eth-contract "1.2.11" + web3-utils "1.2.11" web3-eth-ens@1.2.7: version "1.2.7" @@ -21310,13 +20717,13 @@ web3-eth-iban@1.0.0-beta.34: bn.js "4.11.6" web3-utils "1.0.0-beta.34" -web3-eth-iban@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.4.tgz#8e0550fd3fd8e47a39357d87fe27dee9483ee476" - integrity sha512-D9HIyctru/FLRpXakRwmwdjb5bWU2O6UE/3AXvRm6DCOf2e+7Ve11qQrPtaubHfpdW3KWjDKvlxV9iaFv/oTMQ== +web3-eth-iban@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz#f5f73298305bc7392e2f188bf38a7362b42144ef" + integrity sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ== dependencies: - bn.js "4.11.8" - web3-utils "1.2.4" + bn.js "^4.11.9" + web3-utils "1.2.11" web3-eth-iban@1.2.7: version "1.2.7" @@ -21356,17 +20763,17 @@ web3-eth-personal@1.0.0-beta.34: web3-net "1.0.0-beta.34" web3-utils "1.0.0-beta.34" -web3-eth-personal@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.4.tgz#3224cca6851c96347d9799b12c1b67b2a6eb232b" - integrity sha512-5Russ7ZECwHaZXcN3DLuLS7390Vzgrzepl4D87SD6Sn1DHsCZtvfdPIYwoTmKNp69LG3mORl7U23Ga5YxqkICw== +web3-eth-personal@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz#a38b3942a1d87a62070ce0622a941553c3d5aa70" + integrity sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw== dependencies: - "@types/node" "^12.6.1" - web3-core "1.2.4" - web3-core-helpers "1.2.4" - web3-core-method "1.2.4" - web3-net "1.2.4" - web3-utils "1.2.4" + "@types/node" "^12.12.6" + web3-core "1.2.11" + web3-core-helpers "1.2.11" + web3-core-method "1.2.11" + web3-net "1.2.11" + web3-utils "1.2.11" web3-eth-personal@1.2.7: version "1.2.7" @@ -21428,24 +20835,24 @@ web3-eth@1.0.0-beta.34: web3-net "1.0.0-beta.34" web3-utils "1.0.0-beta.34" -web3-eth@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.4.tgz#24c3b1f1ac79351bbfb808b2ab5c585fa57cdd00" - integrity sha512-+j+kbfmZsbc3+KJpvHM16j1xRFHe2jBAniMo1BHKc3lho6A8Sn9Buyut6odubguX2AxoRArCdIDCkT9hjUERpA== +web3-eth@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793" + integrity sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ== dependencies: underscore "1.9.1" - web3-core "1.2.4" - web3-core-helpers "1.2.4" - web3-core-method "1.2.4" - web3-core-subscriptions "1.2.4" - web3-eth-abi "1.2.4" - web3-eth-accounts "1.2.4" - web3-eth-contract "1.2.4" - web3-eth-ens "1.2.4" - web3-eth-iban "1.2.4" - web3-eth-personal "1.2.4" - web3-net "1.2.4" - web3-utils "1.2.4" + web3-core "1.2.11" + web3-core-helpers "1.2.11" + web3-core-method "1.2.11" + web3-core-subscriptions "1.2.11" + web3-eth-abi "1.2.11" + web3-eth-accounts "1.2.11" + web3-eth-contract "1.2.11" + web3-eth-ens "1.2.11" + web3-eth-iban "1.2.11" + web3-eth-personal "1.2.11" + web3-net "1.2.11" + web3-utils "1.2.11" web3-eth@1.2.7: version "1.2.7" @@ -21503,14 +20910,14 @@ web3-net@1.0.0-beta.34: web3-core-method "1.0.0-beta.34" web3-utils "1.0.0-beta.34" -web3-net@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.4.tgz#1d246406d3aaffbf39c030e4e98bce0ca5f25458" - integrity sha512-wKOsqhyXWPSYTGbp7ofVvni17yfRptpqoUdp3SC8RAhDmGkX6irsiT9pON79m6b3HUHfLoBilFQyt/fTUZOf7A== +web3-net@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b" + integrity sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg== dependencies: - web3-core "1.2.4" - web3-core-method "1.2.4" - web3-utils "1.2.4" + web3-core "1.2.11" + web3-core-method "1.2.11" + web3-utils "1.2.11" web3-net@1.2.7: version "1.2.7" @@ -21599,12 +21006,12 @@ web3-providers-http@1.0.0-beta.34: web3-core-helpers "1.0.0-beta.34" xhr2 "0.1.4" -web3-providers-http@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.4.tgz#514fcad71ae77832c2c15574296282fbbc5f4a67" - integrity sha512-dzVCkRrR/cqlIrcrWNiPt9gyt0AZTE0J+MfAu9rR6CyIgtnm1wFUVVGaxYRxuTGQRO4Dlo49gtoGwaGcyxqiTw== +web3-providers-http@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.11.tgz#1cd03442c61670572d40e4dcdf1faff8bd91e7c6" + integrity sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA== dependencies: - web3-core-helpers "1.2.4" + web3-core-helpers "1.2.11" xhr2-cookies "1.1.0" web3-providers-http@1.2.7: @@ -21641,14 +21048,14 @@ web3-providers-ipc@1.0.0-beta.34: underscore "1.8.3" web3-core-helpers "1.0.0-beta.34" -web3-providers-ipc@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.4.tgz#9d6659f8d44943fb369b739f48df09092be459bd" - integrity sha512-8J3Dguffin51gckTaNrO3oMBo7g+j0UNk6hXmdmQMMNEtrYqw4ctT6t06YOf9GgtOMjSAc1YEh3LPrvgIsR7og== +web3-providers-ipc@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21" + integrity sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ== dependencies: oboe "2.1.4" underscore "1.9.1" - web3-core-helpers "1.2.4" + web3-core-helpers "1.2.11" web3-providers-ipc@1.2.7: version "1.2.7" @@ -21686,14 +21093,15 @@ web3-providers-ws@1.0.0-beta.34: web3-core-helpers "1.0.0-beta.34" websocket "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible" -web3-providers-ws@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.4.tgz#099ee271ee03f6ea4f5df9cfe969e83f4ce0e36f" - integrity sha512-F/vQpDzeK+++oeeNROl1IVTufFCwCR2hpWe5yRXN0ApLwHqXrMI7UwQNdJ9iyibcWjJf/ECbauEEQ8CHgE+MYQ== +web3-providers-ws@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz#a1dfd6d9778d840561d9ec13dd453046451a96bb" + integrity sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg== dependencies: - "@web3-js/websocket" "^1.0.29" + eventemitter3 "4.0.4" underscore "1.9.1" - web3-core-helpers "1.2.4" + web3-core-helpers "1.2.11" + websocket "^1.0.31" web3-providers-ws@1.2.7: version "1.2.7" @@ -21735,15 +21143,15 @@ web3-shh@1.0.0-beta.34: web3-core-subscriptions "1.0.0-beta.34" web3-net "1.0.0-beta.34" -web3-shh@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.4.tgz#5c8ff5ab624a3b14f08af0d24d2b16c10e9f70dd" - integrity sha512-z+9SCw0dE+69Z/Hv8809XDbLj7lTfEv9Sgu8eKEIdGntZf4v7ewj5rzN5bZZSz8aCvfK7Y6ovz1PBAu4QzS4IQ== +web3-shh@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f" + integrity sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg== dependencies: - web3-core "1.2.4" - web3-core-method "1.2.4" - web3-core-subscriptions "1.2.4" - web3-net "1.2.4" + web3-core "1.2.11" + web3-core-method "1.2.11" + web3-core-subscriptions "1.2.11" + web3-net "1.2.11" web3-shh@1.2.7: version "1.2.7" @@ -21791,13 +21199,13 @@ web3-utils@1.0.0-beta.34: underscore "1.8.3" utf8 "2.1.1" -web3-utils@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.4.tgz#96832a39a66b05bf8862a5b0bdad2799d709d951" - integrity sha512-+S86Ip+jqfIPQWvw2N/xBQq5JNqCO0dyvukGdJm8fEWHZbckT4WxSpHbx+9KLEWY4H4x9pUwnoRkK87pYyHfgQ== +web3-utils@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" + integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ== dependencies: - bn.js "4.11.8" - eth-lib "0.2.7" + 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" @@ -21873,19 +21281,18 @@ web3@1.0.0-beta.34: web3-shh "1.0.0-beta.34" web3-utils "1.0.0-beta.34" -web3@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.4.tgz#6e7ab799eefc9b4648c2dab63003f704a1d5e7d9" - integrity sha512-xPXGe+w0x0t88Wj+s/dmAdASr3O9wmA9mpZRtixGZxmBexAF0MjfqYM+MS4tVl5s11hMTN3AZb8cDD4VLfC57A== +web3@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975" + integrity sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ== dependencies: - "@types/node" "^12.6.1" - web3-bzz "1.2.4" - web3-core "1.2.4" - web3-eth "1.2.4" - web3-eth-personal "1.2.4" - web3-net "1.2.4" - web3-shh "1.2.4" - web3-utils "1.2.4" + web3-bzz "1.2.11" + web3-core "1.2.11" + web3-eth "1.2.11" + web3-eth-personal "1.2.11" + web3-net "1.2.11" + web3-shh "1.2.11" + web3-utils "1.2.11" web3@1.2.7: version "1.2.7" @@ -22032,15 +21439,16 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== -websocket@1.0.29: - version "1.0.29" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.29.tgz#3f83e49d3279657c58b02a22d90749c806101b98" - integrity sha512-WhU8jKXC8sTh6ocLSqpZRlOKMNYGwUvjA5+XcIgIk/G3JCaDfkZUr0zA19sVSxJ0TEvm0i5IBzr54RZC4vzW7g== +websocket@1.0.32, websocket@^1.0.31, 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" - gulp "^4.0.2" - nan "^2.11.0" + es5-ext "^0.10.50" typedarray-to-buffer "^3.1.5" + utf-8-validate "^5.0.2" yaeti "^0.0.6" websocket@^1.0.28: @@ -22053,18 +21461,6 @@ 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" @@ -22129,7 +21525,7 @@ which-pm-runs@^1.0.0: resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= -which@1, which@^1.1.1, which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: +which@1, which@^1.1.1, which@^1.2.12, which@^1.2.9, which@^1.3.0, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -22748,7 +22144,7 @@ yargs@^13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" -yargs@^7.0.0, yargs@^7.1.0: +yargs@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= From ce29b95729ea76d2c5a6d31a79e3b7acf2479daa Mon Sep 17 00:00:00 2001 From: Kirill Fedoseev Date: Wed, 4 Nov 2020 22:16:43 +0300 Subject: [PATCH 07/10] Support AMB manual lane and allowance/block lists in the monitor (#484) --- e2e-commons/up.sh | 18 +++++++++++++++++- monitor-e2e/periodically-check-all.sh | 18 +++++++++++++----- monitor-e2e/run-tests.sh | 22 +++++++++++++++++++--- monitor-e2e/test/amb.js | 12 +++++++++++- monitor-e2e/test/ercToNative.js | 8 ++++---- monitor-e2e/utils.js | 8 ++++++-- monitor-e2e/wait-for-monitor.sh | 16 ++++++++++++---- monitor/getShortEventStats.js | 13 +++++++++++-- monitor/utils/message.js | 21 ++++++++++++++++++++- 9 files changed, 113 insertions(+), 23 deletions(-) diff --git a/e2e-commons/up.sh b/e2e-commons/up.sh index 7b3c7afe..0bdf21a2 100755 --- a/e2e-commons/up.sh +++ b/e2e-commons/up.sh @@ -100,7 +100,23 @@ while [ "$1" != "" ]; do fi if [ "$1" == "monitor" ]; then - docker-compose up -d monitor monitor-erc20 monitor-erc20-native monitor-amb + case "$MODE" in + amb) + docker-compose up -d monitor-amb + ;; + native-to-erc) + docker-compose up -d monitor + ;; + erc-to-erc) + docker-compose up -d monitor-erc20 + ;; + erc-to-native) + docker-compose up -d monitor-erc20-native + ;; + *) + docker-compose up -d monitor monitor-erc20 monitor-erc20-native monitor-amb + ;; + esac fi if [ "$1" == "alm-e2e" ]; then diff --git a/monitor-e2e/periodically-check-all.sh b/monitor-e2e/periodically-check-all.sh index dd5e0c98..1b01de9a 100755 --- a/monitor-e2e/periodically-check-all.sh +++ b/monitor-e2e/periodically-check-all.sh @@ -1,7 +1,15 @@ while true; do - sleep 5 - docker-compose -f ../e2e-commons/docker-compose.yml exec -d monitor yarn check-all - docker-compose -f ../e2e-commons/docker-compose.yml exec -d monitor-erc20 yarn check-all - docker-compose -f ../e2e-commons/docker-compose.yml exec -d monitor-erc20-native yarn check-all - docker-compose -f ../e2e-commons/docker-compose.yml exec -d monitor-amb yarn check-all + docker-compose -f ../e2e-commons/docker-compose.yml exec -T monitor yarn check-all + pid1=$! + docker-compose -f ../e2e-commons/docker-compose.yml exec -T monitor-erc20 yarn check-all + pid2=$! + docker-compose -f ../e2e-commons/docker-compose.yml exec -T monitor-erc20-native yarn check-all + pid3=$! + docker-compose -f ../e2e-commons/docker-compose.yml exec -T monitor-amb yarn check-all + pid4=$! + + wait $pid1 + wait $pid2 + wait $pid3 + wait $pid4 done diff --git a/monitor-e2e/run-tests.sh b/monitor-e2e/run-tests.sh index d54a504f..136a4c2b 100755 --- a/monitor-e2e/run-tests.sh +++ b/monitor-e2e/run-tests.sh @@ -1,12 +1,28 @@ cd $(dirname $0) -../e2e-commons/up.sh deploy blocks monitor +mode="$1" +case "$mode" in + amb) + script=./test/amb.js + ;; + native-to-erc) + script=./test/nativeToErc.js + ;; + erc-to-erc) + script=./test/ercToErc.js + ;; + erc-to-native) + script=./test/ercToNative.js + ;; +esac -./wait-for-monitor.sh +MODE="$mode" ../e2e-commons/up.sh deploy blocks monitor + +MODE="$mode" ./wait-for-monitor.sh nohup ./periodically-check-all.sh < /dev/null > /dev/null 2>&1 & checkPID=$! -docker-compose -f ../e2e-commons/docker-compose.yml run e2e yarn workspace monitor-e2e run start +docker-compose -f ../e2e-commons/docker-compose.yml run e2e yarn workspace monitor-e2e run start $script rc=$? ../e2e-commons/down.sh diff --git a/monitor-e2e/test/amb.js b/monitor-e2e/test/amb.js index 59b22fe5..5ed13641 100644 --- a/monitor-e2e/test/amb.js +++ b/monitor-e2e/test/amb.js @@ -25,6 +25,7 @@ describe('AMB', () => { describe('general', async () => { it('should contain fromHomeToForeignDiff', () => assert(data.fromHomeToForeignDiff === 0)) + it('should contain fromHomeToForeignPBUDiff', () => assert(data.fromHomeToForeignPBUDiff === 0)) it('should contain fromForeignToHomeDiff', () => assert(data.fromForeignToHomeDiff === 0)) it('should contain lastChecked', () => assert(data.lastChecked >= 0)) it('should contain timeDiff', () => assert(data.timeDiff >= 0)) @@ -114,7 +115,16 @@ describe('AMB', () => { await waitUntil(async () => { ;({ data } = await axios.get(`${baseUrl}`)) - return data.fromHomeToForeignDiff !== 0 + return data.fromHomeToForeignDiff === 1 && data.fromHomeToForeignPBUDiff === 0 + }) + }) + it('should change fromHomeToForeignPBUDiff', async () => { + // send message + await sendAMBMessage(homeRPC.URL, user, amb.homeBox, amb.home, amb.foreignBox, true) + + await waitUntil(async () => { + ;({ data } = await axios.get(`${baseUrl}`)) + return data.fromHomeToForeignDiff === 1 && data.fromHomeToForeignPBUDiff === 1 }) }) it('should change validatorsMatch', async () => { diff --git a/monitor-e2e/test/ercToNative.js b/monitor-e2e/test/ercToNative.js index 7810ed39..f8770453 100644 --- a/monitor-e2e/test/ercToNative.js +++ b/monitor-e2e/test/ercToNative.js @@ -54,16 +54,16 @@ describe('ERC TO NATIVE with changing state of contracts', () => { }) it('should consider chai token balance', async function() { - this.timeout(60000) + this.timeout(120000) await initializeChaiToken(foreignRPC.URL, ercToNativeBridge.foreign) await sendTokens(foreignRPC.URL, user, ercToNativeBridge.foreignToken, ercToNativeBridge.foreign) await waitUntil(async () => { ;({ data } = await axios.get(`${baseUrl}`)) - const { erc20Balance, investedErc20Balance, accumulatedInterest } = data.foreign if (!data.foreign) { return false } + const { erc20Balance, investedErc20Balance, accumulatedInterest } = data.foreign return ( data.balanceDiff === 0.02 && erc20Balance === '0.02' && @@ -77,10 +77,10 @@ describe('ERC TO NATIVE with changing state of contracts', () => { await waitUntil(async () => { ;({ data } = await axios.get(`${baseUrl}`)) - const { erc20Balance, investedErc20Balance, accumulatedInterest } = data.foreign if (!data.foreign) { return false } + const { erc20Balance, investedErc20Balance, accumulatedInterest } = data.foreign return ( data.balanceDiff === 0.02 && erc20Balance === '0.01' && @@ -94,10 +94,10 @@ describe('ERC TO NATIVE with changing state of contracts', () => { await waitUntil(async () => { ;({ data } = await axios.get(`${baseUrl}`)) - const { erc20Balance, investedErc20Balance, accumulatedInterest } = data.foreign if (!data.foreign) { return false } + const { erc20Balance, investedErc20Balance, accumulatedInterest } = data.foreign return ( data.balanceDiff === 0.02 && erc20Balance === '0.005' && diff --git a/monitor-e2e/utils.js b/monitor-e2e/utils.js index c7a9428a..52efbb53 100644 --- a/monitor-e2e/utils.js +++ b/monitor-e2e/utils.js @@ -44,12 +44,16 @@ const sendTokens = async (rpcUrl, account, tokenAddress, recipientAddress) => { }) } -const sendAMBMessage = async (rpcUrl, account, boxAddress, bridgeAddress, boxOtherSideAddress) => { +const sendAMBMessage = async (rpcUrl, account, boxAddress, bridgeAddress, boxOtherSideAddress, manualLane = false) => { const web3 = new Web3(new Web3.providers.HttpProvider(rpcUrl)) web3.eth.accounts.wallet.add(account.privateKey) const homeBox = new web3.eth.Contract(BOX_ABI, boxAddress) - await homeBox.methods.setValueOnOtherNetwork(3, bridgeAddress, boxOtherSideAddress).send({ + await homeBox.methods[manualLane ? 'setValueOnOtherNetworkUsingManualLane' : 'setValueOnOtherNetwork']( + 3, + bridgeAddress, + boxOtherSideAddress + ).send({ from: account.address, gas: '400000' }) diff --git a/monitor-e2e/wait-for-monitor.sh b/monitor-e2e/wait-for-monitor.sh index 2b33b215..b68e54de 100755 --- a/monitor-e2e/wait-for-monitor.sh +++ b/monitor-e2e/wait-for-monitor.sh @@ -6,10 +6,18 @@ check_files_exist() { rc=0 for f in "${FILES[@]}"; do command="test -f responses/bridge/$f" - (docker-compose -f ../e2e-commons/docker-compose.yml exec -T monitor /bin/bash -c "$command") || rc=1 - (docker-compose -f ../e2e-commons/docker-compose.yml exec -T monitor-erc20 /bin/bash -c "$command") || rc=1 - (docker-compose -f ../e2e-commons/docker-compose.yml exec -T monitor-erc20-native /bin/bash -c "$command") || rc=1 - (docker-compose -f ../e2e-commons/docker-compose.yml exec -T monitor-amb /bin/bash -c "$command") || rc=1 + if [[ -z "$MODE" || "$MODE" == native-to-erc ]]; then + (docker-compose -f ../e2e-commons/docker-compose.yml exec -T monitor /bin/bash -c "$command") || rc=1 + fi + if [[ -z "$MODE" || "$MODE" == erc-to-erc ]]; then + (docker-compose -f ../e2e-commons/docker-compose.yml exec -T monitor-erc20 /bin/bash -c "$command") || rc=1 + fi + if [[ -z "$MODE" || "$MODE" == erc-to-native ]]; then + (docker-compose -f ../e2e-commons/docker-compose.yml exec -T monitor-erc20-native /bin/bash -c "$command") || rc=1 + fi + if [[ -z "$MODE" || "$MODE" == amb ]]; then + (docker-compose -f ../e2e-commons/docker-compose.yml exec -T monitor-amb /bin/bash -c "$command") || rc=1 + fi done return $rc } diff --git a/monitor/getShortEventStats.js b/monitor/getShortEventStats.js index c9777285..1b6607ce 100644 --- a/monitor/getShortEventStats.js +++ b/monitor/getShortEventStats.js @@ -1,7 +1,12 @@ require('dotenv').config() const BN = require('bignumber.js') const Web3Utils = require('web3').utils -const { eventWithoutReference, unclaimedHomeToForeignRequests } = require('./utils/message') +const { + eventWithoutReference, + deliveredMsgNotProcessed, + unclaimedHomeToForeignRequests, + manuallyProcessedAMBHomeToForeignRequests +} = require('./utils/message') const { BRIDGE_MODES } = require('../commons') const { getHomeTxSender } = require('./utils/web3Cache') @@ -20,8 +25,12 @@ async function main(bridgeMode, eventsInfo) { } = eventsInfo if (bridgeMode === BRIDGE_MODES.ARBITRARY_MESSAGE) { + const onlyInHomeRequests = homeToForeignRequests.filter(deliveredMsgNotProcessed(homeToForeignConfirmations)) + const manuallyProcessedRequests = onlyInHomeRequests.filter(manuallyProcessedAMBHomeToForeignRequests()) return { - fromHomeToForeignDiff: homeToForeignRequests.length - homeToForeignConfirmations.length, + fromHomeToForeignDiff: + homeToForeignRequests.length - homeToForeignConfirmations.length - manuallyProcessedRequests.length, + fromHomeToForeignPBUDiff: manuallyProcessedRequests.length, fromForeignToHomeDiff: foreignToHomeConfirmations.length - foreignToHomeRequests.length, home: { toForeign: homeToForeignRequests.length, diff --git a/monitor/utils/message.js b/monitor/utils/message.js index 46282b1f..fe840628 100644 --- a/monitor/utils/message.js +++ b/monitor/utils/message.js @@ -66,10 +66,29 @@ const unclaimedHomeToForeignRequests = () => { } } +const manuallyProcessedAMBHomeToForeignRequests = () => { + if (MONITOR_HOME_TO_FOREIGN_ALLOWANCE_LIST) { + const allowanceList = readAccessListFile(MONITOR_HOME_TO_FOREIGN_ALLOWANCE_LIST) + return e => { + const { sender, executor, decodedDataType } = normalizeAMBMessage(e) + return (!allowanceList.includes(sender) && !allowanceList.includes(executor)) || decodedDataType.manualLane + } + } else if (MONITOR_HOME_TO_FOREIGN_BLOCK_LIST) { + const blockList = readAccessListFile(MONITOR_HOME_TO_FOREIGN_BLOCK_LIST) + return e => { + const { sender, executor, decodedDataType } = normalizeAMBMessage(e) + return blockList.includes(sender) || blockList.includes(executor) || decodedDataType.manualLane + } + } else { + return e => normalizeAMBMessage(e).decodedDataType.manualLane + } +} + module.exports = { deliveredMsgNotProcessed, processedMsgNotDelivered, normalizeEventInformation, eventWithoutReference, - unclaimedHomeToForeignRequests + unclaimedHomeToForeignRequests, + manuallyProcessedAMBHomeToForeignRequests } From dd2075c35143922218ed3676bc9811496429af2a Mon Sep 17 00:00:00 2001 From: Alexander Kolotov Date: Sat, 7 Nov 2020 13:15:35 +0300 Subject: [PATCH 08/10] Security Audit report by Quantstamp added (#485) --- ...tracts-5.4.1-security-assessment-report.pdf | Bin 0 -> 441134 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 audit/quantstamp/POA-Network-TokenBridge-contracts-5.4.1-security-assessment-report.pdf diff --git a/audit/quantstamp/POA-Network-TokenBridge-contracts-5.4.1-security-assessment-report.pdf b/audit/quantstamp/POA-Network-TokenBridge-contracts-5.4.1-security-assessment-report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e31121f5f9cab302a8b8b876b4b46f9697f7ce9b GIT binary patch literal 441134 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
    ;d!Dk=SI2ib}6mv;gK5BG> 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%0Am5`M7^xfG@xQG^aLCKFH33io0-_Kc$Lx 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 literal 0 HcmV?d00001 From 683fa0728dfde42df72b6a8ae23434e8ef96c55b Mon Sep 17 00:00:00 2001 From: Alexander Kolotov Date: Sat, 7 Nov 2020 16:22:53 +0300 Subject: [PATCH 09/10] Update the contract's submodule to the release 5.5.0 (#486) --- contracts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts b/contracts index 1748f947..835742df 160000 --- a/contracts +++ b/contracts @@ -1 +1 @@ -Subproject commit 1748f94757c07ce99d13d99a0a5d1d738b292354 +Subproject commit 835742dfd8f1c869d4e7b61582155d250d6cf094 From 12269d74269cb7fe9a24b471922466e9a282c149 Mon Sep 17 00:00:00 2001 From: Kirill Fedoseev Date: Sun, 8 Nov 2020 01:11:21 +0300 Subject: [PATCH 10/10] Remove access lists tests from ultimate test suites (#488) --- oracle-e2e/test/amb.js | 65 ++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 31 deletions(-) diff --git a/oracle-e2e/test/amb.js b/oracle-e2e/test/amb.js index 3e194a75..66c73c80 100644 --- a/oracle-e2e/test/amb.js +++ b/oracle-e2e/test/amb.js @@ -80,43 +80,46 @@ describe('arbitrary message bridging', () => { }) }) - it('should confirm but not relay message from blocked contract', async () => { - const newValue = 4 + // allowance/block lists files are not mounted to the host during the ultimate test + if (process.env.ULTIMATE !== 'true') { + it('should confirm but not relay message from blocked contract', async () => { + const newValue = 4 - const initialValue = await foreignBox.methods.value().call() - assert(!toBN(initialValue).eq(toBN(newValue)), 'initial value should be different from new value') + const initialValue = await foreignBox.methods.value().call() + assert(!toBN(initialValue).eq(toBN(newValue)), 'initial value should be different from new value') - const signatures = await homeBridge.getPastEvents('SignedForUserRequest', { - fromBlock: 0, - toBlock: 'latest' - }) - - await blockHomeBox.methods - .setValueOnOtherNetwork(newValue, amb.home, amb.foreignBox) - .send({ - from: user.address, - gas: '400000' - }) - .catch(e => { - console.error(e) + const signatures = await homeBridge.getPastEvents('SignedForUserRequest', { + fromBlock: 0, + toBlock: 'latest' }) - await delay(5000) + await blockHomeBox.methods + .setValueOnOtherNetwork(newValue, amb.home, amb.foreignBox) + .send({ + from: user.address, + gas: '400000' + }) + .catch(e => { + console.error(e) + }) - const newSignatures = await homeBridge.getPastEvents('SignedForUserRequest', { - fromBlock: 0, - toBlock: 'latest' + await delay(5000) + + const newSignatures = await homeBridge.getPastEvents('SignedForUserRequest', { + fromBlock: 0, + toBlock: 'latest' + }) + + assert( + newSignatures.length === signatures.length + requiredSignatures, + `Incorrect amount of signatures submitted, got ${newSignatures.length}, expected ${signatures.length + + requiredSignatures}` + ) + + const value = await foreignBox.methods.value().call() + assert(!toBN(value).eq(toBN(newValue)), 'Message should not be relayed by oracle automatically') }) - - assert( - newSignatures.length === signatures.length + requiredSignatures, - `Incorrect amount of signatures submitted, got ${newSignatures.length}, expected ${signatures.length + - requiredSignatures}` - ) - - const value = await foreignBox.methods.value().call() - assert(!toBN(value).eq(toBN(newValue)), 'Message should not be relayed by oracle automatically') - }) + } it('should confirm but not relay message from manual lane', async () => { const newValue = 5