Allow to load Safe Apps with ENS names (#911)

* Remove ethereum-ens in favour of web3.eth.ens

* Allow load Apps from ENS names

* remove comment

* review changes

* replace REACT_APP_IPFS_NODE by REACT_APP_IPFS_GATEWAY

* review fixes

* TS Errors

* fix paths

* Fix validtor

* Apps: Move App form to a separate file

* re-build

* review changes

* fix iframeEl type

* remove validation

* fix type

* update web3 version

* remove type in getContentFromENS

Co-authored-by: lukasschor <lukas.schor@gnosis.pm>
Co-authored-by: Mati Dastugue <matias.dastugue@altoros.com>
Co-authored-by: Fernando <fernando.greco@gmail.com>
Co-authored-by: Mikhail Mikheev <mmvsha73@gmail.com>
This commit is contained in:
nicolas 2020-05-28 12:50:08 -03:00 committed by GitHub
parent 7a20aaac42
commit 4065d5a007
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 300 additions and 464 deletions

View File

@ -9,6 +9,7 @@ REACT_APP_GOOGLE_ANALYTICS_ID_MAINNET=
# For all environments
REACT_APP_INFURA_TOKEN=
REACT_APP_IPFS_GATEWAY=https://ipfs.io/ipfs
PUBLIC_URL=/app/
# For production environments

View File

@ -167,10 +167,9 @@
"electron-is-dev": "^1.1.0",
"electron-log": "4.1.2",
"electron-updater": "4.3.1",
"ethereum-ens": "0.8.0",
"express": "^4.17.1",
"final-form-calculate": "^1.3.1",
"final-form": "4.19.1",
"final-form-calculate": "^1.3.1",
"history": "4.10.1",
"immortal-db": "^1.0.2",
"immutable": "^4.0.0-rc.9",
@ -182,9 +181,10 @@
"polished": "3.6.3",
"qrcode.react": "1.0.0",
"query-string": "6.12.1",
"react": "16.13.1",
"react-dom": "16.13.1",
"react-final-form-listeners": "^1.0.2",
"react-final-form": "6.4.0",
"react-final-form-listeners": "^1.0.2",
"react-ga": "^2.7.0",
"react-hot-loader": "4.12.21",
"react-qr-reader": "^2.2.1",
@ -192,16 +192,15 @@
"react-router-dom": "5.2.0",
"react-scripts": "^3.4.1",
"react-window": "^1.8.5",
"react": "16.13.1",
"recompose": "^0.30.0",
"redux": "4.0.5",
"redux-actions": "^2.6.5",
"redux-thunk": "^2.3.0",
"redux": "4.0.5",
"reselect": "^4.0.0",
"semver": "7.3.2",
"styled-components": "^5.0.1",
"truffle-contract": "4.0.31",
"web3": "1.2.7"
"web3": "1.2.8"
},
"devDependencies": {
"@testing-library/jest-dom": "^4.2.4",
@ -209,24 +208,24 @@
"@testing-library/user-event": "^7.1.2",
"@types/jest": "^25.2.1",
"@types/node": "^13.11.0",
"@types/react-dom": "^16.9.6",
"@types/react": "^16.9.32",
"@types/react-dom": "^16.9.6",
"@typescript-eslint/eslint-plugin": "^2.34.0",
"@typescript-eslint/parser": "^2.34.0",
"autoprefixer": "9.7.6",
"cross-env": "^7.0.2",
"dotenv-expand": "^5.1.0",
"dotenv": "^8.2.0",
"dotenv-expand": "^5.1.0",
"electron": "7.1.8",
"electron-builder": "22.2.0",
"electron-notarize": "^0.2.1",
"electron": "7.1.8",
"eslint": "^6.8.0",
"eslint-config-prettier": "6.11.0",
"eslint-plugin-import": "2.20.2",
"eslint-plugin-jsx-a11y": "^6.2.3",
"eslint-plugin-prettier": "^3.1.2",
"eslint-plugin-react": "^7.18.3",
"eslint-plugin-sort-destructure-keys": "1.3.4",
"eslint": "^6.8.0",
"ethereumjs-abi": "0.6.8",
"husky": "^4.2.2",
"lint-staged": "10.2.2",
@ -234,7 +233,7 @@
"prettier": "2.0.5",
"react-app-rewired": "^2.1.6",
"truffle": "5.1.23",
"typescript": "~3.7.2" ,
"typescript": "~3.7.2",
"wait-on": "5.0.0"
}
}

View File

@ -13,7 +13,19 @@ export const simpleMemoize = (fn) => {
}
}
export const required = (value?: string) => (value && value.trim() !== '' ? undefined : 'Required')
export const required = (value?: string) => {
const required = 'Required'
if (!value) {
return required
}
if (typeof value === 'string' && !value.trim().length) {
return required
}
return undefined
}
export const mustBeInteger = (value: string) =>
!Number.isInteger(Number(value)) || value.includes('.') ? 'Must be an integer' : undefined

View File

@ -13,7 +13,7 @@ import { getWeb3 } from 'src/logic/wallets/getWeb3'
*/
const generateBatchRequests = ({ abi, address, batch, context, methods }: any): any => {
const web3 = getWeb3()
const contractInstance = new web3.eth.Contract(abi, address)
const contractInstance: any = new web3.eth.Contract(abi, address)
const localBatch = batch ? null : new web3.BatchRequest()
const values = methods.map((methodObject) => {

View File

@ -29,7 +29,7 @@ export const estimateTxGasCosts = async (safeAddress, to, data, tx?: any, preApp
try {
const web3 = getWeb3()
const from = await getAccountFrom(web3)
const safeInstance = new web3.eth.Contract(GnosisSafeSol.abi as any, safeAddress)
const safeInstance: any = new web3.eth.Contract(GnosisSafeSol.abi as any, safeAddress)
const nonce = await safeInstance.methods.nonce().call()
const threshold = await safeInstance.methods.getThreshold().call()

View File

@ -40,7 +40,7 @@ export const getApprovalTransaction = async ({
try {
const web3 = getWeb3()
const contract = new web3.eth.Contract(GnosisSafeSol.abi as any, safeInstance.address)
const contract: any = new web3.eth.Contract(GnosisSafeSol.abi as any, safeInstance.address)
return contract.methods.approveHash(txHash)
} catch (err) {
@ -64,7 +64,7 @@ export const getExecutionTransaction = async ({
}) => {
try {
const web3 = getWeb3()
const contract = new web3.eth.Contract(GnosisSafeSol.abi as any, safeInstance.address)
const contract: any = new web3.eth.Contract(GnosisSafeSol.abi as any, safeInstance.address)
return contract.methods.execTransaction(
to,

View File

@ -59,7 +59,7 @@ export const isAddressAToken = async (tokenAddress) => {
export const hasDecimalsMethod = async (address) => {
try {
const web3 = getWeb3()
const token = new web3.eth.Contract(ERC20Detailed.abi as any, address)
const token: any = new web3.eth.Contract(ERC20Detailed.abi as any, address)
await token.methods.decimals().call()
return true
} catch (e) {

View File

@ -1,4 +1,3 @@
import ENS from 'ethereum-ens'
import Web3 from 'web3'
import { sameAddress } from './ethAddresses'
@ -116,10 +115,9 @@ export const getProviderInfo = async (web3Provider, providerName = 'Wallet') =>
}
}
export const getAddressFromENS = async (name) => {
const ens = new ENS(web3)
return await ens.resolver(name).addr()
}
export const getAddressFromENS = (name: string) => web3.eth.ens.getAddress(name)
export const getContentFromENS = (name: string) => web3.eth.ens.getContenthash(name)
export const setWeb3 = (provider) => {
web3 = new Web3(provider)

View File

@ -0,0 +1,203 @@
import { Checkbox, Text, TextField } from '@gnosis.pm/safe-react-components'
import memoize from 'lodash.memoize'
import React, { useState } from 'react'
import { FormSpy } from 'react-final-form'
import styled from 'styled-components'
import Field from 'src/components/forms/Field'
import DebounceValidationField from 'src/components/forms/Field/DebounceValidationField'
import GnoForm from 'src/components/forms/GnoForm'
import { required } from 'src/components/forms/validator'
import Img from 'src/components/layout/Img'
import { getContentFromENS } from 'src/logic/wallets/getWeb3'
import appsIconSvg from 'src/routes/safe/components/Transactions/TxsTable/TxType/assets/appsIcon.svg'
import { isValid as isURLValid } from 'src/utils/url'
import { getAppInfoFromUrl } from './utils'
import { SafeApp } from './types'
const APP_INFO: SafeApp = {
id: undefined,
url: '',
name: '',
iconUrl: appsIconSvg,
error: false,
}
const StyledText = styled(Text)`
margin-bottom: 19px;
`
const StyledTextFileAppName = styled(TextField)`
&& {
width: 335px;
}
`
const AppInfo = styled.div`
margin: 36px 0 24px 0;
img {
margin-right: 10px;
}
`
const StyledCheckbox = styled(Checkbox)`
margin: 0;
`
const uniqueAppValidator = memoize((appList, value) => {
const exists = appList.some((a) => {
try {
const currentUrl = new URL(a.url)
const newUrl = new URL(value)
return currentUrl.href === newUrl.href
} catch (error) {
return 'There was a problem trying to validate the URL existence.'
}
})
return exists ? 'This app is already registered.' : undefined
})
const getIpfsLinkFromEns = memoize(async (name) => {
try {
const content = await getContentFromENS(name)
if (content && content.protocolType === 'ipfs') {
return `${process.env.REACT_APP_IPFS_GATEWAY}/${content.decoded}/`
}
} catch (error) {
console.error(error)
return undefined
}
})
const getUrlFromFormValue = memoize(async (value: string) => {
const isUrlValid = isURLValid(value)
let ensContent
if (!isUrlValid) {
ensContent = await getIpfsLinkFromEns(value)
}
if (!isUrlValid && ensContent === undefined) {
return undefined
}
return isUrlValid ? value : ensContent
})
const curriedSafeAppValidator = memoize((appList) => async (value: string) => {
const url = await getUrlFromFormValue(value)
if (!url) {
return 'Provide a valid url or ENS name.'
}
const appExistsRes = uniqueAppValidator(appList, url)
if (appExistsRes) {
return appExistsRes
}
const appInfo = await getAppInfoFromUrl(url)
if (appInfo.error) {
return 'This is not a valid Safe app.'
}
})
const composeValidatorsApps = (...validators: Function[]) => (value, values, meta) => {
if (!meta.modified) {
return
}
return validators.reduce((error, validator) => error || validator(value), undefined)
}
type Props = {
formId: string
appList: Array<SafeApp>
closeModal: () => void
onAppAdded: (app: SafeApp) => void
setIsSubmitDisabled: (status: boolean) => void
}
const AddAppForm = ({ appList, formId, closeModal, onAppAdded, setIsSubmitDisabled }: Props) => {
const [appInfo, setAppInfo] = useState<SafeApp>(APP_INFO)
const safeAppValidator = curriedSafeAppValidator(appList)
const onFormStatusChange = async ({ pristine, valid, validating, values, errors }) => {
if (!pristine) {
setIsSubmitDisabled(validating || !valid)
}
if (validating) {
return
}
if (!values.appUrl || !values.appUrl.length || errors.appUrl) {
setAppInfo(APP_INFO)
return
}
const url = await getUrlFromFormValue(values.appUrl)
const appInfo = await getAppInfoFromUrl(url)
setAppInfo({ ...appInfo })
}
const handleSubmit = () => {
closeModal()
onAppAdded(appInfo)
}
return (
<GnoForm
initialValues={{
appUrl: '',
agreed: false,
}}
// submit is triggered from ManageApps Component
onSubmit={handleSubmit}
testId={formId}
>
{() => (
<>
<StyledText size="xl">Add custom app</StyledText>
<DebounceValidationField
component={TextField}
label="App URL"
name="appUrl"
placeholder="App URL"
type="text"
validate={composeValidatorsApps(required, safeAppValidator)}
/>
<AppInfo>
<Img alt="Token image" height={55} src={appInfo.iconUrl} />
<StyledTextFileAppName label="App name" readOnly value={appInfo.name} />
</AppInfo>
<FormSpy
onChange={onFormStatusChange}
subscription={{
values: true,
valid: true,
errors: true,
pristine: true,
validating: true,
}}
/>
<Field
component={StyledCheckbox}
label={
<p>
This app is not a Gnosis product and I agree to use this app <br /> at my own risk.
</p>
}
name="agreed"
type="checkbox"
validate={required}
/>
</>
)}
</GnoForm>
)
}
export default AddAppForm

View File

@ -1,166 +1,22 @@
import { ButtonLink, Checkbox, ManageListModal, Text, TextField } from '@gnosis.pm/safe-react-components'
import { ButtonLink, ManageListModal } from '@gnosis.pm/safe-react-components'
import React, { useState } from 'react'
import { FormSpy } from 'react-final-form'
import styled from 'styled-components'
import { getAppInfoFromUrl } from './utils'
import Field from 'src/components/forms/Field'
import DebounceValidationField from 'src/components/forms/Field/DebounceValidationField'
import GnoForm from 'src/components/forms/GnoForm'
import { required } from 'src/components/forms/validator'
import Img from 'src/components/layout/Img'
import appsIconSvg from 'src/routes/safe/components/Transactions/TxsTable/TxType/assets/appsIcon.svg'
import { isValid as isURLValid } from 'src/utils/url'
import AddAppFrom from './AddAppForm'
import { SafeApp } from './types'
const FORM_ID = 'add-apps-form'
const StyledText = styled(Text)`
margin-bottom: 19px;
`
const StyledTextFileAppName = styled(TextField)`
&& {
width: 335px;
}
`
const AppInfo = styled.div`
margin: 36px 0 24px 0;
img {
margin-right: 10px;
}
`
const StyledCheckbox = styled(Checkbox)`
margin: 0;
`
const APP_INFO = { iconUrl: appsIconSvg, name: '', error: false }
const urlValidator = (value) => {
return isURLValid(value) ? undefined : 'Please, provide a valid url'
type Props = {
appList: Array<SafeApp>
onAppAdded: (app: any) => void
onAppToggle: (appId: string, enabled: boolean) => void
}
const composeValidatorsApps = (...validators) => (value, values, meta) => {
if (!meta.modified) {
return
}
return validators.reduce((error, validator) => error || validator(value), undefined)
}
const ManageApps = ({ appList, onAppAdded, onAppToggle }) => {
const ManageApps = ({ appList, onAppAdded, onAppToggle }: Props) => {
const [isOpen, setIsOpen] = useState(false)
const [appInfo, setAppInfo] = useState(APP_INFO)
const [isSubmitDisabled, setIsSubmitDisabled] = useState(true)
const onItemToggle = (itemId, checked) => {
onAppToggle(itemId, checked)
}
const handleSubmit = () => {
setIsOpen(false)
onAppAdded(appInfo)
}
const cleanAppInfo = () => setAppInfo(APP_INFO)
const safeAppValidator = async (value) => {
const appInfo = await getAppInfoFromUrl(value)
if (appInfo.error) {
setAppInfo(APP_INFO)
return 'This is not a valid Safe app.'
}
setAppInfo({ ...appInfo })
}
const uniqueAppValidator = (value) => {
const exists = appList.find((a) => {
try {
const currentUrl = new URL(a.url)
const newUrl = new URL(value)
return currentUrl.href === newUrl.href
} catch (error) {
return 'There was a problem trying to validate the URL existence.'
}
})
return exists ? 'This app is already registered.' : undefined
}
const onFormStatusChange = ({ pristine, valid, validating }) => {
if (!pristine) {
setIsSubmitDisabled(validating || !valid || appInfo.error)
}
}
const customRequiredValidator = (value) => {
if (!value || !value.length) {
setAppInfo(APP_INFO)
return 'Required'
}
}
const getAddAppForm = () => {
return (
<GnoForm
initialValues={{
appUrl: '',
agreed: false,
}}
onSubmit={handleSubmit}
testId={FORM_ID}
>
{() => (
<>
<StyledText size="xl">Add custom app</StyledText>
<DebounceValidationField
component={TextField}
label="App URL"
name="appUrl"
placeholder="App URL"
type="text"
validate={composeValidatorsApps(
customRequiredValidator,
urlValidator,
uniqueAppValidator,
safeAppValidator,
)}
/>
<AppInfo>
<Img alt="Token image" height={55} src={appInfo.iconUrl} />
<StyledTextFileAppName label="App name" readOnly value={appInfo.name} />
</AppInfo>
<FormSpy
onChange={onFormStatusChange}
subscription={{
valid: true,
pristine: true,
validating: true,
}}
/>
<Field
component={StyledCheckbox}
label={
<p>
This app is not a Gnosis product and I agree to use this app <br /> at my own risk.
</p>
}
name="agreed"
type="checkbox"
validate={required}
/>
</>
)}
</GnoForm>
)
}
const onSubmitForm = () => {
// This sucks, but it's the way the docs suggest
// https://github.com/final-form/react-final-form/blob/master/docs/faq.md#via-documentgetelementbyid
@ -169,16 +25,17 @@ const ManageApps = ({ appList, onAppAdded, onAppToggle }) => {
const toggleOpen = () => setIsOpen(!isOpen)
const closeModal = () => {
setIsOpen(false)
cleanAppInfo()
}
const closeModal = () => setIsOpen(false)
const getItemList = () =>
appList.map((a) => {
return { ...a, checked: !a.disabled }
})
const onItemToggle = (itemId, checked) => {
onAppToggle(itemId, checked)
}
const ButtonLinkAux: any = ButtonLink
return (
@ -190,7 +47,15 @@ const ManageApps = ({ appList, onAppAdded, onAppToggle }) => {
<ManageListModal
addButtonLabel="Add custom app"
defaultIconUrl={appsIconSvg}
formBody={getAddAppForm()}
formBody={
<AddAppFrom
formId={FORM_ID}
appList={appList}
closeModal={closeModal}
onAppAdded={onAppAdded}
setIsSubmitDisabled={setIsSubmitDisabled}
/>
}
isSubmitFormDisabled={isSubmitDisabled}
itemList={getItemList()}
onClose={closeModal}

View File

@ -21,6 +21,7 @@ import {
} from 'src/routes/safe/store/selectors'
import { loadFromStorage, saveToStorage } from 'src/utils/storage'
import { isSameHref } from 'src/utils/url'
import { SafeApp } from './types'
const APPS_STORAGE_KEY = 'APPS_STORAGE_KEY'
const APPS_LEGAL_DISCLAIMER_STORAGE_KEY = 'APPS_LEGAL_DISCLAIMER_STORAGE_KEY'
@ -43,12 +44,13 @@ const operations = {
}
function Apps({ closeModal, closeSnackbar, enqueueSnackbar, openModal }) {
const [appList, setAppList] = useState([])
const [appList, setAppList] = useState<Array<SafeApp>>([])
const [legalDisclaimerAccepted, setLegalDisclaimerAccepted] = useState(false)
const [selectedApp, setSelectedApp] = useState()
const [selectedApp, setSelectedApp] = useState<string>()
const [loading, setLoading] = useState(true)
const [appIsLoading, setAppIsLoading] = useState(true)
const [iframeEl, setIframeEl] = useState(null)
const [iframeEl, setIframeEl] = useState<HTMLIFrameElement | null>(null)
const history = useHistory()
const granted = useSelector(grantedSelector)
const safeName = useSelector(safeNameSelector)
@ -145,7 +147,7 @@ function Apps({ closeModal, closeSnackbar, enqueueSnackbar, openModal }) {
)
}
const onAppAdded = (app) => {
const onAppAdded = (app: SafeApp) => {
const newAppList = [
{ url: app.url, disabled: false },
...appList.map((a) => ({

View File

@ -17,7 +17,7 @@ const multiSendAbi = [
const sendTransactions = (dispatch, safeAddress, txs, enqueueSnackbar, closeSnackbar, origin) => {
const web3 = getWeb3()
const multiSend = new web3.eth.Contract(multiSendAbi as any, multiSendAddress)
const multiSend: any = new web3.eth.Contract(multiSendAbi as any, multiSendAddress)
const joinedTxs = txs
.map((tx) =>

View File

@ -0,0 +1,8 @@
export type SafeApp = {
id: string | undefined
url: string
name: string
iconUrl: string
disabled?: boolean
error: boolean
}

View File

@ -2,6 +2,8 @@ import axios from 'axios'
import appsIconSvg from 'src/routes/safe/components/Transactions/TxsTable/TxType/assets/appsIcon.svg'
import { SafeApp } from './types'
const removeLastTrailingSlash = (url) => {
if (url.substr(-1) === '/') {
return url.substr(0, url.length - 1)
@ -10,7 +12,7 @@ const removeLastTrailingSlash = (url) => {
}
const gnosisAppsUrl = removeLastTrailingSlash(process.env.REACT_APP_GNOSIS_APPS_URL)
export const staticAppsList = [
export const staticAppsList: Array<{ url: string; disabled: boolean }> = [
{ url: `${gnosisAppsUrl}/compound`, disabled: false },
{ url: `${gnosisAppsUrl}/aave`, disabled: false },
{ url: `${gnosisAppsUrl}/pool-together`, disabled: false },
@ -28,10 +30,10 @@ export const getAppInfoFromOrigin = (origin) => {
}
}
export const getAppInfoFromUrl = async (appUrl) => {
export const getAppInfoFromUrl = async (appUrl: string): Promise<SafeApp> => {
let res = { id: undefined, url: appUrl, name: 'unknown', iconUrl: appsIconSvg, error: true }
if (!appUrl) {
if (!appUrl.length) {
return res
}

View File

@ -50,7 +50,7 @@ export const formMutators = {
export const createTxObject = (method, contractAddress, values) => {
const web3 = getWeb3()
const contract = new web3.eth.Contract([method], contractAddress)
const contract: any = new web3.eth.Contract([method], contractAddress)
const { inputs, name } = method
const args = inputs.map(({ type }, index) => values[`methodInput-${name}_${index}_${type}`])

284
yarn.lock
View File

@ -3918,7 +3918,7 @@ bluebird-lst@^1.0.9:
dependencies:
bluebird "^3.5.5"
bluebird@^3.4.7, bluebird@^3.5.0, bluebird@^3.5.5:
bluebird@^3.5.0, bluebird@^3.5.5:
version "3.7.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
@ -6722,7 +6722,7 @@ eth-block-tracker@^4.2.0, eth-block-tracker@^4.4.1, eth-block-tracker@^4.4.2:
pify "^3.0.0"
safe-event-emitter "^1.0.1"
eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.0:
eth-ens-namehash@2.0.8:
version "2.0.8"
resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf"
integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88=
@ -6907,18 +6907,6 @@ ethereum-common@0.2.0:
resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca"
integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==
ethereum-ens@0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/ethereum-ens/-/ethereum-ens-0.8.0.tgz#6d0f79acaa61fdbc87d2821779c4e550243d4c57"
integrity sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==
dependencies:
bluebird "^3.4.7"
eth-ens-namehash "^2.0.0"
js-sha3 "^0.5.7"
pako "^1.0.4"
underscore "^1.8.3"
web3 "^1.0.0-beta.34"
ethereum-private-key-to-address@0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/ethereum-private-key-to-address/-/ethereum-private-key-to-address-0.0.3.tgz#1f1dccaefd1198c2dcde55501f331a846bd0aad0"
@ -11935,7 +11923,7 @@ pad@^3.2.0:
dependencies:
wcwidth "^1.0.1"
pako@^1.0.4, pako@~1.0.5:
pako@~1.0.5:
version "1.0.11"
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
@ -16094,11 +16082,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==
underscore@^1.8.3:
version "1.10.2"
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.10.2.tgz#73d6aa3668f3188e4adb0f1943bd12cfd7efaaaf"
integrity sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==
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"
@ -16535,16 +16518,6 @@ web3-bzz@1.2.1:
swarm-js "0.1.39"
underscore "1.9.1"
web3-bzz@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.7.tgz#aa0f3d162f0777a5f35367dc5b70012dd1e129d0"
integrity sha512-iTIWBR+Z+Bn09WprtKm46LmyNOasg2lUn++AjXkBTB8UNxlUybxtza84yl2ETTZUs0zuFzdSSAEgbjhygG+9oA==
dependencies:
"@types/node" "^10.12.18"
got "9.6.0"
swarm-js "^0.1.40"
underscore "1.9.1"
web3-bzz@1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.8.tgz#7ff2c2de362f82ae3825e48c70ec63b3aca2b8ef"
@ -16564,15 +16537,6 @@ web3-core-helpers@1.2.1:
web3-eth-iban "1.2.1"
web3-utils "1.2.1"
web3-core-helpers@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.7.tgz#522f859775ea0d15e7e40359c46d4efc5da92aee"
integrity sha512-bdU++9QATGeCetVrMp8pV97aQtVkN5oLBf/TWu/qumC6jK/YqrvLlBJLdwbz0QveU8zOSap6GCvJbqKvmmbV2A==
dependencies:
underscore "1.9.1"
web3-eth-iban "1.2.7"
web3-utils "1.2.7"
web3-core-helpers@1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.8.tgz#86776d8f658b63bb630c84a314686661e599aa68"
@ -16593,17 +16557,6 @@ web3-core-method@1.2.1:
web3-core-subscriptions "1.2.1"
web3-utils "1.2.1"
web3-core-method@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.7.tgz#73fd80d2bf0765ff6efc454db49ac83d1769a45e"
integrity sha512-e1TI0QUnByDMbQ8QHwnjxfjKw0LIgVRY4TYrlPijET9ebqUJU1HCayn/BHIMpV6LKyR1fQj9EldWyT64wZQXkg==
dependencies:
underscore "1.9.1"
web3-core-helpers "1.2.7"
web3-core-promievent "1.2.7"
web3-core-subscriptions "1.2.7"
web3-utils "1.2.7"
web3-core-method@1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.8.tgz#f28a79935432aebfa019e4a50f9b6ae6c9ef4297"
@ -16623,13 +16576,6 @@ web3-core-promievent@1.2.1:
any-promise "1.3.0"
eventemitter3 "3.1.2"
web3-core-promievent@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.7.tgz#fc7fa489f4cf76a040800f3dfd4b45c51bd3a39f"
integrity sha512-jNmsM/czCeMGQqKKwM9/HZVTJVIF96hdMVNN/V9TGvp+EEE7vDhB4pUocDnc/QF9Z/5QFBCVmvNWttlRgZmU0A==
dependencies:
eventemitter3 "3.1.2"
web3-core-promievent@1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.8.tgz#a93ca2a19cae8b60883412619e04e69e11804eb5"
@ -16648,17 +16594,6 @@ web3-core-requestmanager@1.2.1:
web3-providers-ipc "1.2.1"
web3-providers-ws "1.2.1"
web3-core-requestmanager@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.7.tgz#9da0efce898ead7004d4ac50f748f5131cfe4d79"
integrity sha512-HJb/txjHixu1dxIebiZQKBoJCaNu4gsh7mq/uj6Z/w6tIHbybL90s/7ADyMED353yyJ2tDWtYJqeMVAR+KtdaA==
dependencies:
underscore "1.9.1"
web3-core-helpers "1.2.7"
web3-providers-http "1.2.7"
web3-providers-ipc "1.2.7"
web3-providers-ws "1.2.7"
web3-core-requestmanager@1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.8.tgz#da7259e72a433858d04c59b999c5116bfb797c09"
@ -16679,15 +16614,6 @@ web3-core-subscriptions@1.2.1:
underscore "1.9.1"
web3-core-helpers "1.2.1"
web3-core-subscriptions@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.7.tgz#30c64aede03182832883b17c77e21cbb0933c86e"
integrity sha512-W/CzQYOUawdMDvkgA/fmLsnG5aMpbjrs78LZMbc0MFXLpH3ofqAgO2by4QZrrTShUUTeWS0ZuEkFFL/iFrSObw==
dependencies:
eventemitter3 "3.1.2"
underscore "1.9.1"
web3-core-helpers "1.2.7"
web3-core-subscriptions@1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.8.tgz#50945498fb0bd655f842cbcc13873d96956aa93e"
@ -16707,19 +16633,6 @@ web3-core@1.2.1:
web3-core-requestmanager "1.2.1"
web3-utils "1.2.1"
web3-core@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.7.tgz#9248b04331e458c76263d758c51b0cc612953900"
integrity sha512-QA0MTae0gXcr3KHe3cQ4x56+Wh43ZKWfMwg1gfCc3NNxPRM1jJ8qudzyptCAUcxUGXWpDG8syLIn1APDz5J8BQ==
dependencies:
"@types/bn.js" "^4.11.4"
"@types/node" "^12.6.1"
bignumber.js "^9.0.0"
web3-core-helpers "1.2.7"
web3-core-method "1.2.7"
web3-core-requestmanager "1.2.7"
web3-utils "1.2.7"
web3-core@1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.8.tgz#2a488bb11519b71e7738265329bddc00fc200dd3"
@ -16742,15 +16655,6 @@ web3-eth-abi@1.2.1:
underscore "1.9.1"
web3-utils "1.2.1"
web3-eth-abi@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.7.tgz#6f3471b578649fddd844a14d397a3dd430fc44a5"
integrity sha512-4FnlT1q+D0XBkxSMXlIb/eG337uQeMaUdtVQ4PZ3XzxqpcoDuMgXm4o+3NRxnWmr4AMm6QKjM+hcC7c0mBKcyg==
dependencies:
ethers "4.0.0-beta.3"
underscore "1.9.1"
web3-utils "1.2.7"
web3-eth-abi@1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.8.tgz#7537138f3e5cd1ccf98233fa07f388aa8dc1fff1"
@ -16777,23 +16681,6 @@ web3-eth-accounts@1.2.1:
web3-core-method "1.2.1"
web3-utils "1.2.1"
web3-eth-accounts@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.7.tgz#087f55d04a01b815b93151aac2fc1677436b9c59"
integrity sha512-AE7QWi/iIQIjXwlAPtlMabm/OPFF0a1PhxT1EiTckpYNP8fYs6jW7lYxEtJPPJIKqfMjoi1xkEqTVR1YZQ88lg==
dependencies:
"@web3-js/scrypt-shim" "^0.1.0"
crypto-browserify "3.12.0"
eth-lib "^0.2.8"
ethereumjs-common "^1.3.2"
ethereumjs-tx "^2.1.1"
underscore "1.9.1"
uuid "3.3.2"
web3-core "1.2.7"
web3-core-helpers "1.2.7"
web3-core-method "1.2.7"
web3-utils "1.2.7"
web3-eth-accounts@1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.8.tgz#e63afc6d4902f2beb0cf60e6b755c86fa5b5ccd7"
@ -16825,21 +16712,6 @@ web3-eth-contract@1.2.1:
web3-eth-abi "1.2.1"
web3-utils "1.2.1"
web3-eth-contract@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.7.tgz#13d7f6003d6221f9a5fd61c2d3b5d039477c9674"
integrity sha512-uW23Y0iL7XroRNbf9fWZ1N6OYhEYTJX8gTuYASuRnpYrISN5QGiQML6pq/NCzqypR1bl5E0fuINZQSK/xefIVw==
dependencies:
"@types/bn.js" "^4.11.4"
underscore "1.9.1"
web3-core "1.2.7"
web3-core-helpers "1.2.7"
web3-core-method "1.2.7"
web3-core-promievent "1.2.7"
web3-core-subscriptions "1.2.7"
web3-eth-abi "1.2.7"
web3-utils "1.2.7"
web3-eth-contract@1.2.8, web3-eth-contract@^1.2.7:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.8.tgz#ff75920ac698a70781edcebbf75287a6d0f14499"
@ -16869,20 +16741,6 @@ web3-eth-ens@1.2.1:
web3-eth-contract "1.2.1"
web3-utils "1.2.1"
web3-eth-ens@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.7.tgz#0bfa7d4b6c7753abbb31a2eb01a364b538f4c860"
integrity sha512-SPRnvUNWQ0CnnTDBteGIJkvFWEizJcAHlVsrFLICwcwFZu+appjX1UOaoGu2h3GXWtc/XZlu7B451Gi+Os2cTg==
dependencies:
eth-ens-namehash "2.0.8"
underscore "1.9.1"
web3-core "1.2.7"
web3-core-helpers "1.2.7"
web3-core-promievent "1.2.7"
web3-eth-abi "1.2.7"
web3-eth-contract "1.2.7"
web3-utils "1.2.7"
web3-eth-ens@1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.8.tgz#247daddfdbf7533adb0f45cd2f75c75e52f7e678"
@ -16906,14 +16764,6 @@ web3-eth-iban@1.2.1:
bn.js "4.11.8"
web3-utils "1.2.1"
web3-eth-iban@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.7.tgz#832809c28586be3c667a713b77a2bcba11b7970f"
integrity sha512-2NrClz1PoQ3nSJBd+91ylCOVga9qbTxjRofq/oSCoHVAEvz3WZyttx9k5DC+0rWqwJF1h69ufFvdHAAlmN/4lg==
dependencies:
bn.js "4.11.8"
web3-utils "1.2.7"
web3-eth-iban@1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.8.tgz#414e80a7fb2d1ea16490bc2c8fc29a996aec5612"
@ -16933,18 +16783,6 @@ web3-eth-personal@1.2.1:
web3-net "1.2.1"
web3-utils "1.2.1"
web3-eth-personal@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.7.tgz#322cc2b14c37737b21772a53e4185686a04bf9be"
integrity sha512-2OAa1Spz0uB29dwCM8+1y0So7E47A4gKznjBEwXIYEcUIsvwT5X7ofFhC2XxyRpqlIWZSQAxRSSJFyupRRXzyw==
dependencies:
"@types/node" "^12.6.1"
web3-core "1.2.7"
web3-core-helpers "1.2.7"
web3-core-method "1.2.7"
web3-net "1.2.7"
web3-utils "1.2.7"
web3-eth-personal@1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.8.tgz#8ebb27210b4c9c9555a30c5bb2ce8db12f84cd24"
@ -16976,25 +16814,6 @@ web3-eth@1.2.1:
web3-net "1.2.1"
web3-utils "1.2.1"
web3-eth@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.7.tgz#9427daefd3641200679c2946f77fc184dbfb5b4c"
integrity sha512-ljLd0oB4IjWkzFGVan4HkYhJXhSXgn9iaSaxdJixKGntZPgWMJfxeA+uLwTrlxrWzhvy4f+39WnT7wCh5e9TGg==
dependencies:
underscore "1.9.1"
web3-core "1.2.7"
web3-core-helpers "1.2.7"
web3-core-method "1.2.7"
web3-core-subscriptions "1.2.7"
web3-eth-abi "1.2.7"
web3-eth-accounts "1.2.7"
web3-eth-contract "1.2.7"
web3-eth-ens "1.2.7"
web3-eth-iban "1.2.7"
web3-eth-personal "1.2.7"
web3-net "1.2.7"
web3-utils "1.2.7"
web3-eth@1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.8.tgz#cf6a16fae4d7c12b90cfb6ef570cb1a2acc34c1b"
@ -17023,15 +16842,6 @@ web3-net@1.2.1:
web3-core-method "1.2.1"
web3-utils "1.2.1"
web3-net@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.7.tgz#c355621a8769c9c1a967c801e7db90c92a0e3808"
integrity sha512-j9qeZrS1FNyCeA0BfdLojkxOZQz3FKa1DJI+Dw9fEVhZS68vLOFANu2RB96gR9BoPHo5+k5D3NsKOoxt1gw3Gg==
dependencies:
web3-core "1.2.7"
web3-core-method "1.2.7"
web3-utils "1.2.7"
web3-net@1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.8.tgz#582fc2d4ba32c2e5c7761624e4be7c5434142d66"
@ -17130,14 +16940,6 @@ web3-providers-http@1.2.1:
web3-core-helpers "1.2.1"
xhr2-cookies "1.1.0"
web3-providers-http@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.7.tgz#31eb15390c103169b3d7d31bdb1ccae9e3f1629d"
integrity sha512-vazGx5onuH/zogrwkUaLFJwFcJ6CckP65VFSHoiV+GTQdkOqgoDIha7StKkslvDz4XJ2FuY/zOZHbtuOYeltXQ==
dependencies:
web3-core-helpers "1.2.7"
xhr2-cookies "1.1.0"
web3-providers-http@1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.8.tgz#cd7fc4d49df6980b5dd0fb1b5a808bc4b6a0069d"
@ -17155,15 +16957,6 @@ web3-providers-ipc@1.2.1:
underscore "1.9.1"
web3-core-helpers "1.2.1"
web3-providers-ipc@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.7.tgz#4e6716e8723d431df3d6bfa1acd2f7c04e7071ad"
integrity sha512-/zc0y724H2zbkV4UbGGMhsEiLfafjagIzfrsWZnyTZUlSB0OGRmmFm2EkLJAgtXrLiodaHHyXKM0vB8S24bxdA==
dependencies:
oboe "2.1.4"
underscore "1.9.1"
web3-core-helpers "1.2.7"
web3-providers-ipc@1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.8.tgz#47be918ddd077999aa14703169b76c807f45d894"
@ -17182,16 +16975,6 @@ web3-providers-ws@1.2.1:
web3-core-helpers "1.2.1"
websocket "github:web3-js/WebSocket-Node#polyfill/globalThis"
web3-providers-ws@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.7.tgz#95b1cc5dc25e9b9d6630d6754f9354313b62f532"
integrity sha512-b5XzqDpRkNVe6MFs5K6iqOEyjQikHtg3KuU2/ClCDV37hm0WN4xCRVMC0LwegulbDXZej3zT9+1CYzGaGFREzA==
dependencies:
"@web3-js/websocket" "^1.0.29"
eventemitter3 "^4.0.0"
underscore "1.9.1"
web3-core-helpers "1.2.7"
web3-providers-ws@1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.8.tgz#9e6454edc82d753d398c8d1e044632c234434a46"
@ -17212,16 +16995,6 @@ web3-shh@1.2.1:
web3-core-subscriptions "1.2.1"
web3-net "1.2.1"
web3-shh@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.7.tgz#5382c7bc2f39539eb2841c4576d23ade25720461"
integrity sha512-f6PAgcpG0ZAo98KqCmeHoDEx5qzm3d5plet18DkT4U6WIeYowKdec8vZaLPRR7c2XreXFJ2gQf45CB7oqR7U/w==
dependencies:
web3-core "1.2.7"
web3-core-method "1.2.7"
web3-core-subscriptions "1.2.7"
web3-net "1.2.7"
web3-shh@1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.8.tgz#5162d9d13bc6838d390df1cd39e5f87235c1c2ae"
@ -17245,20 +17018,6 @@ web3-utils@1.2.1:
underscore "1.9.1"
utf8 "3.0.0"
web3-utils@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.7.tgz#b68e232917e4376f81cf38ef79878e5903d18e93"
integrity sha512-FBh/CPJND+eiPeUF9KVbTyTZtXNWxPWtByBaWS6e2x4ACazPX711EeNaZaChIOGSLGe6se2n7kg6wnawe/MjuQ==
dependencies:
bn.js "4.11.8"
eth-lib "0.2.7"
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-utils@1.2.8, web3-utils@^1.2.7:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.8.tgz#5321d91715cd4c0869005705a33c4c042a532b18"
@ -17286,31 +17045,7 @@ web3@1.2.1:
web3-shh "1.2.1"
web3-utils "1.2.1"
web3@1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.7.tgz#fcb83571036c1c6f475bc984785982a444e8d78e"
integrity sha512-jAAJHMfUlTps+jH2li1ckDFEpPrEEriU/ubegSTGRl3KRdNhEqT93+3kd7FHJTn3NgjcyURo2+f7Da1YcZL8Mw==
dependencies:
web3-bzz "1.2.7"
web3-core "1.2.7"
web3-eth "1.2.7"
web3-eth-personal "1.2.7"
web3-net "1.2.7"
web3-shh "1.2.7"
web3-utils "1.2.7"
web3@^0.20.7:
version "0.20.7"
resolved "https://registry.yarnpkg.com/web3/-/web3-0.20.7.tgz#1605e6d81399ed6f85a471a4f3da0c8be57df2f7"
integrity sha512-VU6/DSUX93d1fCzBz7WP/SGCQizO1rKZi4Px9j/3yRyfssHyFcZamMw2/sj4E8TlfMXONvZLoforR8B4bRoyTQ==
dependencies:
bignumber.js "git+https://github.com/frozeman/bignumber.js-nolookahead.git"
crypto-js "^3.1.4"
utf8 "^2.1.1"
xhr2-cookies "^1.1.0"
xmlhttprequest "*"
web3@^1.0.0-beta.34:
web3@1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.8.tgz#20b24baa769e0224a708ef5bf196a5b83d19540b"
integrity sha512-rXUn16VKxn2aIe9v0KX+bSm2JXdq/Vnj3lZ0Rub2Q5YUSycHdCBaDtJRukl/jB5ygAdyr5/cUwvJzhNDJSYsGw==
@ -17323,6 +17058,17 @@ web3@^1.0.0-beta.34:
web3-shh "1.2.8"
web3-utils "1.2.8"
web3@^0.20.7:
version "0.20.7"
resolved "https://registry.yarnpkg.com/web3/-/web3-0.20.7.tgz#1605e6d81399ed6f85a471a4f3da0c8be57df2f7"
integrity sha512-VU6/DSUX93d1fCzBz7WP/SGCQizO1rKZi4Px9j/3yRyfssHyFcZamMw2/sj4E8TlfMXONvZLoforR8B4bRoyTQ==
dependencies:
bignumber.js "git+https://github.com/frozeman/bignumber.js-nolookahead.git"
crypto-js "^3.1.4"
utf8 "^2.1.1"
xhr2-cookies "^1.1.0"
xmlhttprequest "*"
webidl-conversions@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"