1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00

Replace abi-decoder with ethers (#9290)

* replace abi-decoder with ethers

* handle transaction parsing errors

* update token param getter function names

* add docstrings
This commit is contained in:
Erik Marks 2020-08-21 19:29:19 -07:00 committed by GitHub
parent e08a55c8bc
commit 3aaa41ef44
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 527 additions and 167 deletions

View File

@ -5,7 +5,7 @@ import Transaction from 'ethereumjs-tx'
import EthQuery from 'ethjs-query'
import { ethErrors } from 'eth-json-rpc-errors'
import abi from 'human-standard-token-abi'
import abiDecoder from 'abi-decoder'
import { ethers } from 'ethers'
import NonceTracker from 'nonce-tracker'
import log from 'loglevel'
import {
@ -30,7 +30,7 @@ import {
TRANSACTION_STATUS_APPROVED,
} from './enums'
abiDecoder.addABI(abi)
const hstInterface = new ethers.utils.Interface(abi)
const SIMPLE_GAS_COST = '0x5208' // Hex for 21000, cost of a simple send.
const MAX_MEMSTORE_TX_LIST_SIZE = 100 // Number of transactions (by unique nonces) to keep in memory
@ -698,7 +698,13 @@ export default class TransactionController extends EventEmitter {
*/
async _determineTransactionCategory (txParams) {
const { data, to } = txParams
const { name } = (data && abiDecoder.decodeMethod(data)) || {}
let name
try {
name = data && hstInterface.parseTransaction({ data }).name
} catch (error) {
log.debug('Failed to parse transaction data.', error, data)
}
const tokenMethodName = [
TOKEN_METHOD_APPROVE,
TOKEN_METHOD_TRANSFER,

View File

@ -78,7 +78,6 @@
"@sentry/browser": "^5.11.1",
"@sentry/integrations": "^5.11.1",
"@zxing/library": "^0.8.0",
"abi-decoder": "^1.2.0",
"abortcontroller-polyfill": "^1.4.0",
"await-semaphore": "^0.1.1",
"bignumber.js": "^4.1.0",
@ -112,6 +111,7 @@
"ethereumjs-tx": "1.3.7",
"ethereumjs-util": "5.1.0",
"ethereumjs-wallet": "^0.6.0",
"ethers": "^5.0.8",
"ethjs": "^0.4.0",
"ethjs-contract": "^0.2.3",
"ethjs-ens": "^2.0.0",

View File

@ -368,7 +368,6 @@ export function setTransactionToConfirm (transactionId) {
const tokenData = getTokenData(data)
dispatch(updateTokenData(tokenData))
}
if (txParams.nonce) {

View File

@ -137,14 +137,30 @@ export function calcTokenValue (value, decimals) {
return new BigNumber(String(value)).times(multiplier)
}
export function getTokenValue (tokenParams = []) {
const valueData = tokenParams.find((param) => param.name === '_value')
return valueData && valueData.value
/**
* Attempts to get the address parameter of the given token transaction data
* (i.e. function call) per the Human Standard Token ABI, in the following
* order:
* - The '_to' parameter, if present
* - The first parameter, if present
*
* @param {Object} tokenData - ethers Interface token data.
* @returns {string | undefined} A lowercase address string.
*/
export function getTokenAddressParam (tokenData = {}) {
const value = tokenData?.args?.['_to'] || tokenData?.args?.[0]
return value?.toString().toLowerCase()
}
export function getTokenToAddress (tokenParams = []) {
const toAddressData = tokenParams.find((param) => param.name === '_to')
return toAddressData ? toAddressData.value : tokenParams[0].value
/**
* Gets the '_value' parameter of the given token transaction data
* (i.e function call) per the Human Standard Token ABI, if present.
*
* @param {Object} tokenData - ethers Interface token data.
* @returns {string | undefined} A decimal string value.
*/
export function getTokenValueParam (tokenData = {}) {
return tokenData?.args?.['_value']?.toString()
}
/**

View File

@ -1,7 +1,7 @@
import ethUtil from 'ethereumjs-util'
import MethodRegistry from 'eth-method-registry'
import abi from 'human-standard-token-abi'
import abiDecoder from 'abi-decoder'
import { ethers } from 'ethers'
import log from 'loglevel'
import {
TRANSACTION_TYPE_CANCEL,
@ -29,10 +29,31 @@ import fetchWithCache from './fetch-with-cache'
import { addCurrencies } from './conversion-util'
abiDecoder.addABI(abi)
const hstInterface = new ethers.utils.Interface(abi)
export function getTokenData (data = '') {
return abiDecoder.decodeMethod(data)
/**
* @typedef EthersContractCall
* @type object
* @property {any[]} args - The args/params to the function call.
* An array-like object with numerical and string indices.
* @property {string} name - The name of the function.
* @property {string} signature - The function signature.
* @property {string} sighash - The function signature hash.
* @property {EthersBigNumber} value - The ETH value associated with the call.
* @property {FunctionFragment} functionFragment - The Ethers function fragment
* representation of the function.
*/
/**
* @returns {EthersContractCall | undefined}
*/
export function getTokenData (data) {
try {
return hstInterface.parseTransaction({ data })
} catch (error) {
log.debug('Failed to parse transaction data.', error, data)
return undefined
}
}
async function getMethodFrom4Byte (fourBytePrefix) {

View File

@ -6,13 +6,12 @@ describe('Transactions utils', function () {
it('should return token data', function () {
const tokenData = utils.getTokenData('0xa9059cbb00000000000000000000000050a9d56c2b8ba9a5c7f2c08c3d26e0499f23a7060000000000000000000000000000000000000000000000000000000000004e20')
assert.ok(tokenData)
const { name, params } = tokenData
const { name, args } = tokenData
assert.equal(name, 'transfer')
const [to, value] = params
assert.equal(to.name, '_to')
assert.equal(to.type, 'address')
assert.equal(value.name, '_value')
assert.equal(value.type, 'uint256')
const to = args._to
const value = args._value.toString()
assert.equal(to, '0x50A9D56C2B8BA9A5c7f2C08C3d26E0499F23a706')
assert.equal(value, '20000')
})
it('should not throw errors when called without arguments', function () {

View File

@ -1,4 +1,5 @@
import assert from 'assert'
import { ethers } from 'ethers'
import { renderHook } from '@testing-library/react-hooks'
import { useTokenData } from '../useTokenData'
@ -7,17 +8,9 @@ const tests = [
data: '0xa9059cbb000000000000000000000000ffe5bc4e8f1f969934d773fa67da095d2e491a970000000000000000000000000000000000000000000000000000000000003a98',
tokenData: {
'name': 'transfer',
'params': [
{
'name': '_to',
'value': '0xffe5bc4e8f1f969934d773fa67da095d2e491a97',
'type': 'address',
},
{
'name': '_value',
'value': '15000',
'type': 'uint256',
},
'args': [
'0xffe5bc4e8f1f969934d773fa67da095d2e491a97',
ethers.BigNumber.from(15000),
],
},
},
@ -25,17 +18,9 @@ const tests = [
data: '0xa9059cbb000000000000000000000000ffe5bc4e8f1f969934d773fa67da095d2e491a9700000000000000000000000000000000000000000000000000000000000061a8',
tokenData: {
'name': 'transfer',
'params': [
{
'name': '_to',
'value': '0xffe5bc4e8f1f969934d773fa67da095d2e491a97',
'type': 'address',
},
{
'name': '_value',
'value': '25000',
'type': 'uint256',
},
'args': [
'0xffe5bc4e8f1f969934d773fa67da095d2e491a97',
ethers.BigNumber.from(25000),
],
},
},
@ -43,17 +28,9 @@ const tests = [
data: '0xa9059cbb000000000000000000000000ffe5bc4e8f1f969934d773fa67da095d2e491a970000000000000000000000000000000000000000000000000000000000002710',
tokenData: {
'name': 'transfer',
'params': [
{
'name': '_to',
'value': '0xffe5bc4e8f1f969934d773fa67da095d2e491a97',
'type': 'address',
},
{
'name': '_value',
'value': '10000',
'type': 'uint256',
},
'args': [
'0xffe5bc4e8f1f969934d773fa67da095d2e491a97',
ethers.BigNumber.from(10000),
],
},
},
@ -67,10 +44,16 @@ describe('useTokenData', function () {
tests.forEach((test) => {
const testTitle = test.tokenData === null
? `should return null when no data provided`
: `should return properly decoded data with _value ${test.tokenData.params[1].value}`
: `should return properly decoded data with _value ${test.tokenData.args[1].value}`
it(testTitle, function () {
const { result } = renderHook(() => useTokenData(test.data))
assert.deepEqual(result.current, test.tokenData)
if (test.tokenData) {
assert.equal(result.current.name, test.tokenData.name)
assert.equal(result.current.args[0].toLowerCase(), test.tokenData.args[0])
assert.ok(test.tokenData.args[1].eq(result.current.args[1]))
} else {
assert.equal(result.current, test.tokenData)
}
})
})
})

View File

@ -12,7 +12,7 @@ const tests = [
decimals: 18,
},
tokenData: {
params: 'decoded-params1',
args: 'decoded-params1',
},
tokenValue: '1000000000000000000',
displayValue: '1',
@ -23,7 +23,7 @@ const tests = [
decimals: 18,
},
tokenData: {
params: 'decoded-params2',
args: 'decoded-params2',
},
tokenValue: '10000000000000000000',
displayValue: '10',
@ -34,7 +34,7 @@ const tests = [
decimals: 18,
},
tokenData: {
params: 'decoded-params3',
args: 'decoded-params3',
},
tokenValue: '1500000000000000000',
displayValue: '1.5',
@ -45,7 +45,7 @@ const tests = [
decimals: 18,
},
tokenData: {
params: 'decoded-params4',
args: 'decoded-params4',
},
tokenValue: '1756000000000000000',
displayValue: '1.756',
@ -56,7 +56,7 @@ const tests = [
decimals: 18,
},
tokenData: {
params: 'decoded-params5',
args: 'decoded-params5',
},
tokenValue: '25500000000000000000',
displayValue: '25.5',
@ -67,7 +67,7 @@ const tests = [
decimals: 6,
},
tokenData: {
params: 'decoded-params6',
args: 'decoded-params6',
},
tokenValue: '1000000',
displayValue: '1',
@ -78,7 +78,7 @@ const tests = [
decimals: 6,
},
tokenData: {
params: 'decoded-params7',
args: 'decoded-params7',
},
tokenValue: '10000000',
displayValue: '10',
@ -89,7 +89,7 @@ const tests = [
decimals: 6,
},
tokenData: {
params: 'decoded-params8',
args: 'decoded-params8',
},
tokenValue: '1500000',
displayValue: '1.5',
@ -100,7 +100,7 @@ const tests = [
decimals: 6,
},
tokenData: {
params: 'decoded-params9',
args: 'decoded-params9',
},
tokenValue: '1756000',
displayValue: '1.756',
@ -111,7 +111,7 @@ const tests = [
decimals: 6,
},
tokenData: {
params: 'decoded-params10',
args: 'decoded-params10',
},
tokenValue: '25500000',
displayValue: '25.5',
@ -122,7 +122,7 @@ describe('useTokenDisplayValue', function () {
tests.forEach((test, idx) => {
describe(`when input is decimals: ${test.token.decimals} and value: ${test.tokenValue}`, function () {
it(`should return ${test.displayValue} as displayValue`, function () {
const getTokenValueStub = sinon.stub(tokenUtil, 'getTokenValue')
const getTokenValueStub = sinon.stub(tokenUtil, 'getTokenValueParam')
const getTokenDataStub = sinon.stub(txUtil, 'getTokenData')
getTokenDataStub.callsFake(() => test.tokenData)
getTokenValueStub.callsFake(() => test.tokenValue)

View File

@ -1,5 +1,5 @@
import { useMemo } from 'react'
import { getTokenValue, calcTokenAmount } from '../helpers/utils/token-util'
import { getTokenValueParam, calcTokenAmount } from '../helpers/utils/token-util'
import { useTokenData } from './useTokenData'
/**
@ -34,14 +34,14 @@ export function useTokenDisplayValue (transactionData, token, isTokenTransaction
// and a token object has been provided
token &&
// and we are able to parse the token details from the raw data
tokenData?.params?.length,
tokenData?.args?.length,
)
const displayValue = useMemo(() => {
if (!shouldCalculateTokenValue) {
return null
}
const tokenValue = getTokenValue(tokenData.params)
const tokenValue = getTokenValueParam(tokenData)
return calcTokenAmount(tokenValue, token.decimals).toString()
}, [shouldCalculateTokenValue, tokenData, token])

View File

@ -3,7 +3,7 @@ import { getKnownMethodData } from '../selectors/selectors'
import { getTransactionActionKey, getStatusKey } from '../helpers/utils/transactions.util'
import { camelCaseToCapitalize } from '../helpers/utils/common.util'
import { PRIMARY, SECONDARY } from '../helpers/constants/common'
import { getTokenToAddress } from '../helpers/utils/token-util'
import { getTokenAddressParam } from '../helpers/utils/token-util'
import { formatDateWithYearContext, shortenAddress, stripHttpSchemes } from '../helpers/utils/util'
import {
CONTRACT_INTERACTION_KEY,
@ -122,7 +122,7 @@ export function useTransactionDisplayData (transactionGroup) {
} else if (transactionCategory === TOKEN_METHOD_TRANSFER_FROM || transactionCategory === TOKEN_METHOD_TRANSFER) {
category = TRANSACTION_CATEGORY_SEND
title = t('sendSpecifiedTokens', [token?.symbol || t('token')])
recipientAddress = getTokenToAddress(tokenData.params)
recipientAddress = getTokenAddressParam(tokenData)
subtitle = t('toAddress', [shortenAddress(recipientAddress)])
} else if (transactionCategory === SEND_ETHER_ACTION_KEY) {
category = TRANSACTION_CATEGORY_SEND

View File

@ -8,8 +8,8 @@ import {
} from '../../helpers/utils/transactions.util'
import {
calcTokenAmount,
getTokenToAddress,
getTokenValue,
getTokenAddressParam,
getTokenValueParam,
} from '../../helpers/utils/token-util'
import { useTokenTracker } from '../../hooks/useTokenTracker'
import { getTokens } from '../../ducks/metamask/metamask'
@ -54,8 +54,8 @@ export default function ConfirmApprove () {
const tokenSymbol = currentToken?.symbol
const decimals = Number(currentToken?.decimals)
const tokenData = getTokenData(data)
const tokenValue = tokenData && getTokenValue(tokenData.params)
const toAddress = tokenData && getTokenToAddress(tokenData.params)
const tokenValue = getTokenValueParam(tokenData)
const toAddress = getTokenAddressParam(tokenData)
const tokenAmount = tokenData && calcTokenAmount(tokenValue, decimals).toString(10)
const [customPermissionAmount, setCustomPermissionAmount] = useState('')

View File

@ -1,5 +1,5 @@
import { decimalToHex } from '../../helpers/utils/conversions.util'
import { calcTokenValue } from '../../helpers/utils/token-util'
import { calcTokenValue, getTokenAddressParam } from '../../helpers/utils/token-util'
import { getTokenData } from '../../helpers/utils/transactions.util'
export function getCustomTxParamsData (data, { customPermissionAmount, decimals }) {
@ -10,7 +10,7 @@ export function getCustomTxParamsData (data, { customPermissionAmount, decimals
} else if (tokenData.name !== 'approve') {
throw new Error(`Invalid data; should be 'approve' method, but instead is '${tokenData.name}'`)
}
let spender = tokenData.params[0].value
let spender = getTokenAddressParam(tokenData)
if (spender.startsWith('0x')) {
spender = spender.substring(2)
}

View File

@ -4,6 +4,7 @@ import { withRouter } from 'react-router-dom'
import { clearConfirmTransaction } from '../../ducks/confirm-transaction/confirm-transaction.duck'
import { updateSend, showSendTokenPage } from '../../store/actions'
import { conversionUtil } from '../../helpers/utils/conversion-util'
import { getTokenValueParam, getTokenAddressParam } from '../../helpers/utils/token-util'
import { sendTokenTokenAmountAndToAddressSelector } from '../../selectors'
import ConfirmSendToken from './confirm-send-token.component'
@ -29,9 +30,8 @@ const mapDispatchToProps = (dispatch) => {
} = {},
} = txData
const { params = [] } = tokenData
const { value: to } = params[0] || {}
const { value: tokenAmountInDec } = params[1] || {}
const to = getTokenValueParam(tokenData)
const tokenAmountInDec = getTokenAddressParam(tokenData)
const tokenAmountInHex = conversionUtil(tokenAmountInDec, {
fromNumericBase: 'dec',

View File

@ -11,8 +11,8 @@ import {
} from '../../helpers/utils/transactions.util'
import {
calcTokenAmount,
getTokenToAddress,
getTokenValue,
getTokenAddressParam,
getTokenValueParam,
} from '../../helpers/utils/token-util'
import ConfirmTokenTransactionBase from './confirm-token-transaction-base.component'
@ -42,8 +42,8 @@ const mapStateToProps = (state, ownProps) => {
const { decimals, symbol: tokenSymbol } = currentToken || {}
const tokenData = getTokenData(data)
const tokenValue = tokenData && getTokenValue(tokenData.params)
const toAddress = tokenData && getTokenToAddress(tokenData.params)
const tokenValue = getTokenValueParam(tokenData)
const toAddress = getTokenAddressParam(tokenData)
const tokenAmount = tokenData && calcTokenAmount(tokenValue, decimals).toNumber()
const contractExchangeRate = contractExchangeRateSelector(state)

View File

@ -135,9 +135,9 @@ const tokenDecimalsSelector = createSelector(
(tokenProps) => tokenProps && tokenProps.tokenDecimals,
)
const tokenDataParamsSelector = createSelector(
const tokenDataArgsSelector = createSelector(
tokenDataSelector,
(tokenData) => (tokenData && tokenData.params) || [],
(tokenData) => (tokenData && tokenData.args) || [],
)
const txParamsSelector = createSelector(
@ -155,17 +155,17 @@ const TOKEN_PARAM_TO = '_to'
const TOKEN_PARAM_VALUE = '_value'
export const tokenAmountAndToAddressSelector = createSelector(
tokenDataParamsSelector,
tokenDataArgsSelector,
tokenDecimalsSelector,
(params, tokenDecimals) => {
(args, tokenDecimals) => {
let toAddress = ''
let tokenAmount = 0
if (params && params.length) {
const toParam = params.find((param) => param.name === TOKEN_PARAM_TO)
const valueParam = params.find((param) => param.name === TOKEN_PARAM_VALUE)
toAddress = toParam ? toParam.value : params[0].value
const value = valueParam ? Number(valueParam.value) : Number(params[1].value)
if (args && args.length) {
const toParam = args[TOKEN_PARAM_TO]
const valueParam = args[TOKEN_PARAM_VALUE]
toAddress = toParam || args[0]
const value = valueParam ? valueParam.toNumber() : args[1].toNumber()
if (tokenDecimals) {
tokenAmount = calcTokenAmount(value, tokenDecimals).toNumber()
@ -182,15 +182,15 @@ export const tokenAmountAndToAddressSelector = createSelector(
)
export const approveTokenAmountAndToAddressSelector = createSelector(
tokenDataParamsSelector,
tokenDataArgsSelector,
tokenDecimalsSelector,
(params, tokenDecimals) => {
(args, tokenDecimals) => {
let toAddress = ''
let tokenAmount = 0
if (params && params.length) {
toAddress = params.find((param) => param.name === TOKEN_PARAM_SPENDER).value
const value = Number(params.find((param) => param.name === TOKEN_PARAM_VALUE).value)
if (args && args.length) {
toAddress = args[TOKEN_PARAM_SPENDER]
const value = args[TOKEN_PARAM_VALUE].toNumber()
if (tokenDecimals) {
tokenAmount = calcTokenAmount(value, tokenDecimals).toNumber()
@ -207,15 +207,15 @@ export const approveTokenAmountAndToAddressSelector = createSelector(
)
export const sendTokenTokenAmountAndToAddressSelector = createSelector(
tokenDataParamsSelector,
tokenDataArgsSelector,
tokenDecimalsSelector,
(params, tokenDecimals) => {
(args, tokenDecimals) => {
let toAddress = ''
let tokenAmount = 0
if (params && params.length) {
toAddress = params.find((param) => param.name === TOKEN_PARAM_TO).value
let value = Number(params.find((param) => param.name === TOKEN_PARAM_VALUE).value)
if (args && args.length) {
toAddress = args[TOKEN_PARAM_TO]
let value = args[TOKEN_PARAM_VALUE].toNumber()
if (tokenDecimals) {
value = calcTokenAmount(value, tokenDecimals).toNumber()

View File

@ -8,6 +8,15 @@ import {
conversionRateSelector,
} from '../confirm-transaction'
const getEthersArrayLikeFromObj = (obj) => {
const arr = []
Object.keys(obj).forEach((key) => {
arr.push([obj[key]])
arr[key] = obj[key]
})
return arr
}
describe('Confirm Transaction Selector', function () {
describe('unconfirmedTransactionsCountSelector', function () {
@ -32,7 +41,6 @@ describe('Confirm Transaction Selector', function () {
it('returns number of txs in unapprovedTxs state with the same network plus unapproved signing method counts', function () {
assert.equal(unconfirmedTransactionsCountSelector(state), 4)
})
})
describe('tokenAmountAndToAddressSelector', function () {
@ -41,18 +49,10 @@ describe('Confirm Transaction Selector', function () {
confirmTransaction: {
tokenData: {
name: 'transfer',
params: [
{
name: '_to',
value: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
type: 'address',
},
{
name: '_value',
value: '1',
type: 'uint256',
},
],
args: getEthersArrayLikeFromObj({
'_to': '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
'_value': { toNumber: () => '1' },
}),
},
tokenProps: {
tokenDecimals: '2',
@ -65,7 +65,6 @@ describe('Confirm Transaction Selector', function () {
assert.deepEqual(tokenAmountAndToAddressSelector(state),
{ toAddress: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', tokenAmount: 0.01 })
})
})
describe('approveTokenAmountAndToAddressSelector', function () {
@ -74,18 +73,10 @@ describe('Confirm Transaction Selector', function () {
confirmTransaction: {
tokenData: {
name: 'approve',
params: [
{
name: '_spender',
value: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
type: 'address',
},
{
name: '_value',
value: '1',
type: 'uint256',
},
],
args: getEthersArrayLikeFromObj({
'_spender': '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
'_value': { toNumber: () => '1' },
}),
},
tokenProps: {
tokenDecimals: '2',
@ -98,7 +89,6 @@ describe('Confirm Transaction Selector', function () {
assert.deepEqual(approveTokenAmountAndToAddressSelector(state),
{ toAddress: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', tokenAmount: 0.01 })
})
})
describe('sendTokenTokenAmountAndToAddressSelector', function () {
@ -107,18 +97,10 @@ describe('Confirm Transaction Selector', function () {
confirmTransaction: {
tokenData: {
name: 'transfer',
params: [
{
name: '_to',
value: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
type: 'address',
},
{
name: '_value',
value: '1',
type: 'uint256',
},
],
args: getEthersArrayLikeFromObj({
'_to': '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
'_value': { toNumber: () => '1' },
}),
},
tokenProps: {
tokenDecimals: '2',

402
yarn.lock
View File

@ -1318,6 +1318,336 @@
resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46"
integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==
"@ethersproject/abi@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.2.tgz#7fe8f080aa1483fe32cd27bb5b8f2019266af1e2"
integrity sha512-Z+5f7xOgtRLu/W2l9Ry5xF7ehh9QVQ0m1vhynmTcS7DMfHgqTd1/PDFC62aw91ZPRCRZsYdZJu8ymokC5e1JSw==
dependencies:
"@ethersproject/address" "^5.0.0"
"@ethersproject/bignumber" "^5.0.0"
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/constants" "^5.0.0"
"@ethersproject/hash" "^5.0.0"
"@ethersproject/keccak256" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
"@ethersproject/properties" "^5.0.0"
"@ethersproject/strings" "^5.0.0"
"@ethersproject/abstract-provider@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.0.2.tgz#9b4e8f4870f0691463e8d5b092c95dd5275c635d"
integrity sha512-U1s60+nG02x8FKNMoVNI6MG8SguWCoG9HJtwOqWZ38LBRMsDV4c0w4izKx98kcsN3wXw4U2/YAyJ9LlH7+/hkg==
dependencies:
"@ethersproject/bignumber" "^5.0.0"
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
"@ethersproject/networks" "^5.0.0"
"@ethersproject/properties" "^5.0.0"
"@ethersproject/transactions" "^5.0.0"
"@ethersproject/web" "^5.0.0"
"@ethersproject/abstract-signer@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.0.2.tgz#5776f888fda816de1d08ddb0e74778ecb9590f69"
integrity sha512-CzzXbeqKlgayE4YTnvvreGBG3n+HxakGXrxaGM6LjBZnOOIVSYi6HMFG8ZXls7UspRY4hvMrtnKEJKDCOngSBw==
dependencies:
"@ethersproject/abstract-provider" "^5.0.0"
"@ethersproject/bignumber" "^5.0.0"
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
"@ethersproject/properties" "^5.0.0"
"@ethersproject/address@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.2.tgz#80d0ddfb7d4bd0d32657747fa4bdd2defef2e00a"
integrity sha512-+rz26RKj7ujGfQynys4V9VJRbR+wpC6eL8F22q3raWMH3152Ha31GwJPWzxE/bEA+43M/zTNVwY0R53gn53L2Q==
dependencies:
"@ethersproject/bignumber" "^5.0.0"
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/keccak256" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
"@ethersproject/rlp" "^5.0.0"
bn.js "^4.4.0"
"@ethersproject/base64@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.0.2.tgz#48b3bb8d640a963bd8ee196cfeacd592155a0ca8"
integrity sha512-0FE5RH5cUDddOiQEDpWtyHjkSW4D5/rdJzA3KTZo8Fk5ab/Y8vdzqbamsXPyPsXU3gS+zCE5Qq4EKVOWlWLLTA==
dependencies:
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/basex@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.0.2.tgz#13029ce0ad63674f4d4dbebf6763181fb22f0e6d"
integrity sha512-p4m2CeQqI9vma3XipRbP2iDf6zTsbroE0MEXBAYXidsoJQSvePKrC6MVRKfTzfcHej1b9wfmjVBzqhqn3FRhIA==
dependencies:
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/properties" "^5.0.0"
"@ethersproject/bignumber@^5.0.0":
version "5.0.5"
resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.5.tgz#31bd7e75aad46ace345fae69b1f5bb120906af1b"
integrity sha512-24ln7PV0g8ZzjcVZiLW9Wod0i+XCmK6zKkAaxw5enraTIT1p7gVOcSXFSzNQ9WYAwtiFQPvvA+TIO2oEITZNJA==
dependencies:
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
bn.js "^4.4.0"
"@ethersproject/bytes@^5.0.0":
version "5.0.3"
resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.3.tgz#b3769963ae0188a35713d343890a903bda20af9c"
integrity sha512-AyPMAlY+Amaw4Zfp8OAivm1xYPI8mqiUYmEnSUk1CnS2NrQGHEMmFJFiOJdS3gDDpgSOFhWIjZwxKq2VZpqNTA==
dependencies:
"@ethersproject/logger" "^5.0.0"
"@ethersproject/constants@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.2.tgz#f7ac0b320e2bbec1a5950da075015f8bc4e8fed1"
integrity sha512-nNoVlNP6bgpog7pQ2EyD1xjlaXcy1Cl4kK5v1KoskHj58EtB6TK8M8AFGi3GgHTdMldfT4eN3OsoQ/CdOTVNFA==
dependencies:
"@ethersproject/bignumber" "^5.0.0"
"@ethersproject/contracts@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.0.2.tgz#f19ed8335ceeb6abb60f5d45641f0a2a62b6fbc5"
integrity sha512-Ud3oW8mBNIWE+WHRjvwVEwfvshn7lfYWSSKG0fPSb6baRN9mLOoNguX+VIv3W5Sne9w2utnBmxLF2ESXitw64A==
dependencies:
"@ethersproject/abi" "^5.0.0"
"@ethersproject/abstract-provider" "^5.0.0"
"@ethersproject/abstract-signer" "^5.0.0"
"@ethersproject/address" "^5.0.0"
"@ethersproject/bignumber" "^5.0.0"
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/constants" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
"@ethersproject/properties" "^5.0.0"
"@ethersproject/hash@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.0.2.tgz#6d69558786961836d530b8b4a8714eac5388aec7"
integrity sha512-dWGvNwmVRX2bxoQQ3ciMw46Vzl1nqfL+5R8+2ZxsRXD3Cjgw1dL2mdjJF7xMMWPvPdrlhKXWSK0gb8VLwHZ8Cw==
dependencies:
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/keccak256" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
"@ethersproject/strings" "^5.0.0"
"@ethersproject/hdnode@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.0.2.tgz#c4f2152590a64822d0c0feb90f09cc247af657e0"
integrity sha512-QAUI5tfseTFqv00Vnbwzofqse81wN9TaL+x5GufTHIHJXgVdguxU+l39E3VYDCmO+eVAA6RCn5dJgeyra+PU2g==
dependencies:
"@ethersproject/abstract-signer" "^5.0.0"
"@ethersproject/basex" "^5.0.0"
"@ethersproject/bignumber" "^5.0.0"
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
"@ethersproject/pbkdf2" "^5.0.0"
"@ethersproject/properties" "^5.0.0"
"@ethersproject/sha2" "^5.0.0"
"@ethersproject/signing-key" "^5.0.0"
"@ethersproject/strings" "^5.0.0"
"@ethersproject/transactions" "^5.0.0"
"@ethersproject/wordlists" "^5.0.0"
"@ethersproject/json-wallets@^5.0.0":
version "5.0.4"
resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.0.4.tgz#e09bf2d34279c6dd2b4a4d4c44db65471bacc68b"
integrity sha512-jqtb+X3rJXWG/w+Qyr7vq1V+fdc5jiLlyc6akwI3SQIHTfcuuyF+eZRd9u2/455urNwV3nuCsnrgxs2NrtHHIw==
dependencies:
"@ethersproject/abstract-signer" "^5.0.0"
"@ethersproject/address" "^5.0.0"
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/hdnode" "^5.0.0"
"@ethersproject/keccak256" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
"@ethersproject/pbkdf2" "^5.0.0"
"@ethersproject/properties" "^5.0.0"
"@ethersproject/random" "^5.0.0"
"@ethersproject/strings" "^5.0.0"
"@ethersproject/transactions" "^5.0.0"
aes-js "3.0.0"
scrypt-js "3.0.1"
"@ethersproject/keccak256@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.2.tgz#7ed4a95bb45ee502cf4532223833740a83602797"
integrity sha512-MbroXutc0gPNYIrUjS4Aw0lDuXabdzI7+l7elRWr1G6G+W0v00e/3gbikWkCReGtt2Jnt4lQSgnflhDwQGcIhA==
dependencies:
"@ethersproject/bytes" "^5.0.0"
js-sha3 "0.5.7"
"@ethersproject/logger@^5.0.0":
version "5.0.4"
resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.4.tgz#09fa4765b5691233e3afb6617cb38a700f9dd2e4"
integrity sha512-alA2LiAy1LdQ/L1SA9ajUC7MvGAEQLsICEfKK4erX5qhkXE1LwLSPIzobtOWFsMHf2yrXGKBLnnpuVHprI3sAw==
"@ethersproject/networks@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.0.2.tgz#a49e82cf071e3618e87e3c5d69fdbcf54dc6766c"
integrity sha512-T7HVd62D4izNU2tDHf6xUDo7k4JOGX4Lk7vDmVcDKrepSWwL2OmGWrqSlkRe2a1Dnz4+1VPE6fb6+KsmSRe82g==
dependencies:
"@ethersproject/logger" "^5.0.0"
"@ethersproject/pbkdf2@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.0.2.tgz#d12c5f434bbdf6f52401eddb7d753a713dd9e4ea"
integrity sha512-OJFxdX/VtGI5M04lAzXKEOb76XBzjCOzGyko3/bMWat3ePAw7RveBOLyhm79SBs2fh21MSYgdG6JScEMHoSImw==
dependencies:
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/sha2" "^5.0.0"
"@ethersproject/properties@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.2.tgz#2facb62d2f2d968c7b3d0befa5bcc884cc565d3b"
integrity sha512-FxAisPGAOACQjMJzewl9OJG6lsGCPTm5vpUMtfeoxzAlAb2lv+kHzQPUh9h4jfAILzE8AR1jgXMzRmlhwyra1Q==
dependencies:
"@ethersproject/logger" "^5.0.0"
"@ethersproject/providers@^5.0.0":
version "5.0.5"
resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.0.5.tgz#fa28498ce9683d1d99f6cb11e1a7fe8d4886e0ce"
integrity sha512-ZR3yFg/m8qDl7317yXOHE7tKeGfoyZIZ/imhVC4JqAH+SX1rb6bdZcSjhJfet7rLmnJSsnYLTgIiVIT85aVLgg==
dependencies:
"@ethersproject/abstract-provider" "^5.0.0"
"@ethersproject/abstract-signer" "^5.0.0"
"@ethersproject/address" "^5.0.0"
"@ethersproject/bignumber" "^5.0.0"
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/constants" "^5.0.0"
"@ethersproject/hash" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
"@ethersproject/networks" "^5.0.0"
"@ethersproject/properties" "^5.0.0"
"@ethersproject/random" "^5.0.0"
"@ethersproject/rlp" "^5.0.0"
"@ethersproject/strings" "^5.0.0"
"@ethersproject/transactions" "^5.0.0"
"@ethersproject/web" "^5.0.0"
ws "7.2.3"
"@ethersproject/random@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.0.2.tgz#bb58aca69a85e8de506686117f050d03dac69023"
integrity sha512-kLeS+6bwz37WR2zbe69gudyoGVoUzljQO0LhifnATsZ7rW0JZ9Zgt0h5aXY7tqFDo9TvdqeCwUFdp1t3T5Fkhg==
dependencies:
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
"@ethersproject/rlp@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.2.tgz#d6b550a2ac5e484f15f0f63337e522004d2e78cd"
integrity sha512-oE0M5jqQ67fi2SuMcrpoewOpEuoXaD8M9JeR9md1bXRMvDYgKXUtDHs22oevpEOdnO2DPIRabp6MVHa4aDuWmw==
dependencies:
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
"@ethersproject/sha2@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.0.2.tgz#baefc78c071be8729b180759eb29267129314252"
integrity sha512-VFl4qSStjQZaygpqoAHswaCY59qBm1Sm0rf8iv0tmgVsRf0pBg2nJaNf9NXXvcuJ9AYPyXl57dN8kozdC4z5Cg==
dependencies:
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
hash.js "1.1.3"
"@ethersproject/signing-key@^5.0.0":
version "5.0.3"
resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.0.3.tgz#adb84360e147bfd336cb2fe114100120732dc10a"
integrity sha512-5QPZaBRGCLzfVMbFb3LcVjNR0UbTXnwDHASnQYfbzwUOnFYHKxHsrcbl/5ONGoppgi8yXgOocKqlPCFycJJVWQ==
dependencies:
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
"@ethersproject/properties" "^5.0.0"
elliptic "6.5.3"
"@ethersproject/solidity@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.0.2.tgz#431cee341ec51e022bd897b93fef04521f414756"
integrity sha512-RygurUe1hPW1LDYAPXy4471AklGWNnxgFWc3YUE6H11gzkit26jr6AyZH4Yyjw38eBBL6j0AOfQzMWm+NhxZ9g==
dependencies:
"@ethersproject/bignumber" "^5.0.0"
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/keccak256" "^5.0.0"
"@ethersproject/sha2" "^5.0.0"
"@ethersproject/strings" "^5.0.0"
"@ethersproject/strings@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.2.tgz#1753408c3c889813fd0992abd76393e3e47a2619"
integrity sha512-oNa+xvSqsFU96ndzog0IBTtsRFGOqGpzrXJ7shXLBT7juVeSEyZA/sYs0DMZB5mJ9FEjHdZKxR/rTyBY91vuXg==
dependencies:
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/constants" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
"@ethersproject/transactions@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.2.tgz#590ede71fc87b45be7bd46002e18ae52246a2347"
integrity sha512-jZp0ZbbJlq4JLZY6qoMzNtp2HQsX6USQposi3ns0MPUdn3OdZJBDtrcO15r/2VS5t/K1e1GE5MI1HmMKlcTbbQ==
dependencies:
"@ethersproject/address" "^5.0.0"
"@ethersproject/bignumber" "^5.0.0"
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/constants" "^5.0.0"
"@ethersproject/keccak256" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
"@ethersproject/properties" "^5.0.0"
"@ethersproject/rlp" "^5.0.0"
"@ethersproject/signing-key" "^5.0.0"
"@ethersproject/units@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.0.2.tgz#de1461ff3ad2587e57bf367d056b6b72cfceda78"
integrity sha512-PSuzycBA1zmRysTtKtp+XYZ3HIJfbmfRdZchOUxdyeGo5siUi9H6mYQcxdJHv82oKp/FniMj8qS8qtLQThhOEg==
dependencies:
"@ethersproject/bignumber" "^5.0.0"
"@ethersproject/constants" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
"@ethersproject/wallet@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.0.2.tgz#714ca8324c1b3b66e51b9b4e0358c882e88caf1d"
integrity sha512-gg86ynLV5k5caNnYpJoYc6WyIUHKMTjOITCk5zXGyVbbkXE07y/fGql4A51W0C6mWkeb5Mzz8AKqzHZECdH30w==
dependencies:
"@ethersproject/abstract-provider" "^5.0.0"
"@ethersproject/abstract-signer" "^5.0.0"
"@ethersproject/address" "^5.0.0"
"@ethersproject/bignumber" "^5.0.0"
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/hash" "^5.0.0"
"@ethersproject/hdnode" "^5.0.0"
"@ethersproject/json-wallets" "^5.0.0"
"@ethersproject/keccak256" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
"@ethersproject/properties" "^5.0.0"
"@ethersproject/random" "^5.0.0"
"@ethersproject/signing-key" "^5.0.0"
"@ethersproject/transactions" "^5.0.0"
"@ethersproject/wordlists" "^5.0.0"
"@ethersproject/web@^5.0.0":
version "5.0.3"
resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.0.3.tgz#f5673923009bb855302f0296ddb932da8e42f0a1"
integrity sha512-9WoIWNxbFOk+8TiWqQMQbYJUIFeC1Z7zNr7oCHpVyhxF0EY54ZVXlP/Y7VJ7KzK++A/iMGOuTIGeL5sMqa2QMg==
dependencies:
"@ethersproject/base64" "^5.0.0"
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
"@ethersproject/properties" "^5.0.0"
"@ethersproject/strings" "^5.0.0"
"@ethersproject/wordlists@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.0.2.tgz#eded47314509c8608373fc2b22879ee2b71b7c7c"
integrity sha512-6vKDQcjjpnfdSCr0+jNxpFH3ieKxUPkm29tQX2US7a3zT/sJU/BGlKBR7D8oOpwdE0hpkHhJyMlypRBK+A2avA==
dependencies:
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/hash" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
"@ethersproject/properties" "^5.0.0"
"@ethersproject/strings" "^5.0.0"
"@formatjs/intl-relativetimeformat@^5.2.6":
version "5.2.6"
resolved "https://registry.yarnpkg.com/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-5.2.6.tgz#3d67b75a900e7b5416615beeb2d0eeff33a1e01a"
@ -3047,13 +3377,6 @@ abbrev@1:
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
abi-decoder@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/abi-decoder/-/abi-decoder-1.2.0.tgz#c42882dbb91b444805f0cd203a87a5cc3c22f4a8"
integrity sha512-y2OKSEW4gf2838Eavc56vQY9V46zaXkf3Jl1WpTfUBbzAVrXSr4JRZAAWv55Tv9s5WNz1rVgBgz5d2aJIL1QCg==
dependencies:
web3 "^0.18.4"
abort-controller@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
@ -5310,10 +5633,6 @@ bignumber.js@^8.0.1, bignumber.js@^8.0.2, bignumber.js@^8.1.1:
resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-8.1.1.tgz#4b072ae5aea9c20f6730e4e5d529df1271c4d885"
integrity sha512-QD46ppGintwPGuL1KqmwhR0O+N2cZUg8JG/VzwI2e28sM9TqHjQB10lI4QAaMHVbLzwVLLAwEglpKPViWX+5NQ==
"bignumber.js@git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2":
version "2.0.7"
resolved "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2"
"bignumber.js@git+https://github.com/frozeman/bignumber.js-nolookahead.git":
version "2.0.7"
resolved "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934"
@ -9181,7 +9500,7 @@ element-resize-detector@^1.2.1:
dependencies:
batch-processor "1.0.0"
elliptic@6.3.3, elliptic@=3.0.3, elliptic@^6.0.0, elliptic@^6.4.0, elliptic@^6.4.1, elliptic@^6.5.3:
elliptic@6.3.3, elliptic@6.5.3, elliptic@=3.0.3, elliptic@^6.0.0, elliptic@^6.4.0, elliptic@^6.4.1, 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==
@ -10650,6 +10969,42 @@ ethers@^4.0.20, ethers@^4.0.28:
uuid "2.0.1"
xmlhttprequest "1.8.0"
ethers@^5.0.8:
version "5.0.8"
resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.0.8.tgz#c13d0fdf5e66db8085e2036d3309ed2f8a17ed89"
integrity sha512-of/rPgJ7E3yyBADUv5A7Gtkd7EB8ta/T9NS5CCG9tj9cifnXcI3KIdYQ7d8AS+9vm38pR1g6S5I+Q/mRnlQZlg==
dependencies:
"@ethersproject/abi" "^5.0.0"
"@ethersproject/abstract-provider" "^5.0.0"
"@ethersproject/abstract-signer" "^5.0.0"
"@ethersproject/address" "^5.0.0"
"@ethersproject/base64" "^5.0.0"
"@ethersproject/basex" "^5.0.0"
"@ethersproject/bignumber" "^5.0.0"
"@ethersproject/bytes" "^5.0.0"
"@ethersproject/constants" "^5.0.0"
"@ethersproject/contracts" "^5.0.0"
"@ethersproject/hash" "^5.0.0"
"@ethersproject/hdnode" "^5.0.0"
"@ethersproject/json-wallets" "^5.0.0"
"@ethersproject/keccak256" "^5.0.0"
"@ethersproject/logger" "^5.0.0"
"@ethersproject/networks" "^5.0.0"
"@ethersproject/pbkdf2" "^5.0.0"
"@ethersproject/properties" "^5.0.0"
"@ethersproject/providers" "^5.0.0"
"@ethersproject/random" "^5.0.0"
"@ethersproject/rlp" "^5.0.0"
"@ethersproject/sha2" "^5.0.0"
"@ethersproject/signing-key" "^5.0.0"
"@ethersproject/solidity" "^5.0.0"
"@ethersproject/strings" "^5.0.0"
"@ethersproject/transactions" "^5.0.0"
"@ethersproject/units" "^5.0.0"
"@ethersproject/wallet" "^5.0.0"
"@ethersproject/web" "^5.0.0"
"@ethersproject/wordlists" "^5.0.0"
ethjs-abi@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/ethjs-abi/-/ethjs-abi-0.2.0.tgz#d3e2c221011520fc499b71682036c14fcc2f5b25"
@ -23810,6 +24165,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.1"
resolved "https://registry.yarnpkg.com/scrypt.js/-/scrypt.js-0.2.1.tgz#cc3f751933d6bac7a4bedf5301d7596e8146cdcd"
@ -27651,17 +28011,6 @@ web3@1.2.4:
web3-shh "1.2.4"
web3-utils "1.2.4"
web3@^0.18.4:
version "0.18.4"
resolved "https://registry.yarnpkg.com/web3/-/web3-0.18.4.tgz#81ec1784145491f2eaa8955b31c06049e07c5e7d"
integrity sha1-gewXhBRUkfLqqJVbMcBgSeB8Xn0=
dependencies:
bignumber.js "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2"
crypto-js "^3.1.4"
utf8 "^2.1.1"
xhr2 "*"
xmlhttprequest "*"
web3@^0.20.7:
version "0.20.7"
resolved "https://registry.yarnpkg.com/web3/-/web3-0.20.7.tgz#1605e6d81399ed6f85a471a4f3da0c8be57df2f7"
@ -28048,6 +28397,11 @@ ws@6.1.2:
dependencies:
async-limiter "~1.0.0"
ws@7.2.3:
version "7.2.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46"
integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==
ws@^1.1.0:
version "1.1.5"
resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51"
@ -28123,7 +28477,7 @@ xhr2-cookies@1.1.0, xhr2-cookies@^1.1.0:
dependencies:
cookiejar "^2.1.1"
xhr2@*, xhr2@0.1.3:
xhr2@0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.3.tgz#cbfc4759a69b4a888e78cf4f20b051038757bd11"
integrity sha1-y/xHWaabSoiOeM9PILBRA4dXvRE=