Compare commits

...

29 Commits

Author SHA1 Message Date
Moody Salem
5c10a7f61d move environment variables to the .env files 2020-05-26 20:06:18 -04:00
Noah Zinsmeister
97079055b4 add OPQ to broken tokens list 2020-05-18 17:26:00 -04:00
Callil Capuozzo
648f30be9b Update title 2020-05-18 10:27:52 -04:00
Callil Capuozzo
121d862fd0 Tweak banner links and copy 2020-05-18 09:59:35 -04:00
Noah Zinsmeister
c3fcffff4c Merge branch 'prod' into beta 2020-05-12 23:46:49 -04:00
Noah Zinsmeister
8fd0747a0b add tokens, remove UNI-V1:SAI (#758) 2020-05-12 23:45:04 -04:00
Kartik Talwar
9a8edc2c26 Update local env setup documentation (#706)
Updated the variable name from `REACT_APP_NETWORK_ID` to `REACT_APP_CHAIN_ID` in the setup docs to reflect the latest env variable names from PR #621
2020-05-04 20:32:07 -04:00
Ian Lapham
d720d4490c add SENT to broken tokens (#697) 2020-04-27 20:36:30 -04:00
Ian Lapham
6f505e45cc add SENT to broken token list (return bug) (#694) 2020-04-27 20:04:25 -04:00
Ian Lapham
cb2fcf3538 allow solo ETH output in query params (#690) (#693) 2020-04-27 12:38:00 -04:00
Ian Lapham
608421453b allow solo ETH output in query params (#690) 2020-04-27 12:32:44 -04:00
Micah Zoltu
b825900a1f Adds warning about ERC-777 tokens and the like. (#686) 2020-04-20 10:18:07 -04:00
Ian Lapham
10510cf975 Disable adding for ERC-777 tokens (#684) 2020-04-19 19:57:51 -04:00
Noah Zinsmeister
8fe0eb6bfe remove imBTC 2020-04-18 03:51:32 -04:00
Noah Zinsmeister
b54c20d56b add BTC++ 2020-04-14 10:56:09 -04:00
Noah Zinsmeister
bcfa2ed6ce add UBT 2020-04-14 10:54:39 -04:00
Chaitanya Potti
18b4c487f8 Integrate Torus (#554)
* torus integration done

* add torus-connector

* bump torus connector
2020-04-08 13:56:35 -04:00
Noah Zinsmeister
40491d5e39 Merge branch 'alekskuzmin-add-translations' into beta 2020-03-23 12:35:20 -04:00
Noah Zinsmeister
d6b2066d33 fix lint error 2020-03-23 12:34:08 -04:00
Noah Zinsmeister
e709779de2 Merge branch 'add-translations' of https://github.com/alekskuzmin/uniswap-frontend into alekskuzmin-add-translations 2020-03-23 12:31:33 -04:00
dependabot[bot]
90213bda78 Bump acorn from 5.7.3 to 5.7.4 (#656)
Bumps [acorn](https://github.com/acornjs/acorn) from 5.7.3 to 5.7.4.
- [Release notes](https://github.com/acornjs/acorn/releases)
- [Commits](https://github.com/acornjs/acorn/compare/5.7.3...5.7.4)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-03-23 10:47:09 -04:00
Ian Lapham
0f107ebad5 Add extra warning text on add liquidity page (#655)
* add extra warning text on add liquidity
2020-03-23 10:44:48 -04:00
ianlapham
b907055402 hide ETH on remove page 2020-03-23 10:44:47 -04:00
Noah Zinsmeister
72ffd5c78e add missing optional chaining operators 2020-03-03 11:12:58 -05:00
Noah Zinsmeister
ffee859741 Balances (#650)
* improve balances context

add ts

* invalidate caches after timeout
2020-03-03 11:07:13 -05:00
Noah Zinsmeister
218e3567f5 add SXP (#651)
add TRB (closes #541)

add KEY

add USDx (closes #643)

add HEDG

add MCX

add CEL

add FXC
2020-03-02 19:06:46 -05:00
Gregory Markou
8dc763f82b Prioritize exact token symbol matches (#631)
* add dai prioritiy

* remove log

* ran linter

* fix comments

* fix lint

* preserve previous sort
2020-02-19 11:29:31 -07:00
Alex Kuzmin
aae42b9fca Fix formatting with Prettier 2020-02-17 12:38:19 +03:00
Alex Kuzmin
b861101a8f Replace hardcoded strings with translations 2020-02-17 11:53:02 +03:00
28 changed files with 1424 additions and 417 deletions

4
.env Normal file
View File

@@ -0,0 +1,4 @@
REACT_APP_CHAIN_ID="1"
REACT_APP_NETWORK_URL="https://mainnet.infura.io/v3/b8800ce81b8c451698081d269b86692b"
REACT_APP_PORTIS_ID=""
REACT_APP_FORTMATIC_KEY=""

View File

@@ -1,5 +0,0 @@
REACT_APP_CHAIN_ID="1"
REACT_APP_NETWORK_URL=""
REACT_APP_PORTIS_ID=""
REACT_APP_FORTMATIC_KEY=""
REACT_APP_IS_PRODUCTION_DEPLOY="false"

4
.env.production Normal file
View File

@@ -0,0 +1,4 @@
REACT_APP_CHAIN_ID="1"
REACT_APP_NETWORK_URL="https://mainnet.infura.io/v3/2acb2baa4c06402792e0c701a3697d10"
REACT_APP_PORTIS_ID="c0e2bf01-4b08-4fd5-ac7b-8e26b58cd236"
REACT_APP_FORTMATIC_KEY="pk_live_F937DF033A1666BF"

View File

@@ -25,3 +25,6 @@ Test `removeLiquidity` transaction:
Are you willing to add liquidity to the liquidity pool for this token? (Y/N):
If so, how much liquidity are you willing to add?:
# WARNING
Uniswap v1 is not compatible with any token that issues untrusted callbacks as part of a token transfer! This includes all ERC-777 tokens. Such a token will appear to work, but it will be suseptible to theft by attackers.

1
.gitignore vendored
View File

@@ -11,7 +11,6 @@
# misc
.DS_Store
.env
.env.local
.env.development.local
.env.test.local

View File

@@ -40,7 +40,7 @@ Rename `.env.local.example` to `.env.local` and fill in the appropriate variable
yarn start
```
To run on a testnet, make a copy of `.env.local.example` named `.env.local`, change `REACT_APP_NETWORK_ID` to `"{yourNetworkId}"`, and change `REACT_APP_NETWORK_URL` to e.g. `"https://{yourNetwork}.infura.io/v3/{yourKey}"`.
To run on a testnet, make a copy of `.env.local.example` named `.env.local`, change `REACT_APP_CHAIN_ID` to `"{yourChainId}"`, and change `REACT_APP_NETWORK_URL` to e.g. `"https://{yourNetwork}.infura.io/v3/{yourKey}"`.
If deploying with Github Pages, be aware that there's some [tricky client-side routing behavior with `create-react-app`](https://create-react-app.dev/docs/deployment#notes-on-client-side-routing).

View File

@@ -12,9 +12,3 @@
from = "/*"
to = "/index.html"
status = 200
[build.environment]
REACT_APP_IS_PRODUCTION_DEPLOY = "false"
[context.production.environment]
REACT_APP_IS_PRODUCTION_DEPLOY = "true"

View File

@@ -7,11 +7,16 @@
"dependencies": {
"@reach/dialog": "^0.2.8",
"@reach/tooltip": "^0.2.0",
"@types/jest": "^25.1.3",
"@types/node": "^13.7.4",
"@types/react": "^16.9.22",
"@types/react-dom": "^16.9.5",
"@uniswap/sdk": "^1.0.0-beta.4",
"@web3-react/core": "^6.0.2",
"@web3-react/fortmatic-connector": "^6.0.2",
"@web3-react/injected-connector": "^6.0.3",
"@web3-react/network-connector": "^6.0.4",
"@web3-react/torus-connector": "^6.0.8",
"@web3-react/portis-connector": "^6.0.2",
"@web3-react/walletconnect-connector": "^6.0.2",
"@web3-react/walletlink-connector": "^6.0.2",
@@ -36,7 +41,8 @@
"react-spring": "^8.0.27",
"react-switch": "^5.0.1",
"react-use-gesture": "^6.0.14",
"styled-components": "^4.2.0"
"styled-components": "^4.2.0",
"typescript": "^3.8.2"
},
"scripts": {
"start": "react-scripts start",

View File

@@ -20,7 +20,7 @@
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>Uniswap Exchange</title>
<title>Uniswap V1 Interface</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>

View File

@@ -8,6 +8,7 @@
"swap": "Swap",
"swapAnyway": "Swap Anyway",
"send": "Send",
"connectToWallet": "Connect to a Wallet",
"sendAnyway": "Send Anyway",
"pool": "Pool",
"betaWarning": "This project is in beta. Use at your own risk.",
@@ -65,7 +66,8 @@
"totalSupplyIs0": "Current total supply of liquidity tokens is 0.",
"tokenWorth": "At current exchange rate, each pool token is worth",
"firstLiquidity": "You are the first person to add liquidity!",
"initialExchangeRate": "The initial exchange rate will be set based on your deposits. Please make sure that your ETH and {{ label }} deposits have the same fiat value.",
"initialExchangeRate": "The initial exchange rate will be set based on your deposits. Please make sure that your ETH and {{ label }} deposits have the same fiat value. ",
"initialWarning": "A few improperly implemented ERC20 tokens have caused the remove liquidity function to break, permanently locking funds. As the first liquidity provider we recommend testing both add and remove with small amounts before adding a large amounts.",
"removeLiquidity": "Remove Liquidity",
"poolTokens": "Pool Tokens",
"enterLabelCont": "Enter a {{ label }} value to continue.",
@@ -84,5 +86,6 @@
"enterTokenCont": "Enter a token address to continue",
"priceChange": "Expected price slippage",
"forAtLeast": "for at least ",
"brokenToken": "The selected token is not compatible with Uniswap V1. Adding liquidity will result in locked funds."
"brokenToken": "The selected token is not compatible with Uniswap V1. Adding liquidity will result in locked funds.",
"broken777": "ERC-777 tokens are not supported in Uniswap V1."
}

View File

@@ -71,5 +71,6 @@
"tokenAddress": "Адрес токена",
"label": "Название",
"decimals": "Десятичное значение",
"enterTokenCont": "Чтобы продолжить, введите адрес токена"
"enterTokenCont": "Чтобы продолжить, введите адрес токена",
"connectToWallet": "Подключиться к кошельку"
}

BIN
src/assets/images/torus.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -7,11 +7,12 @@ import Transaction from './Transaction'
import { SUPPORTED_WALLETS } from '../../constants'
import { ReactComponent as Close } from '../../assets/images/x.svg'
import { getEtherscanLink } from '../../utils'
import { injected, walletconnect, walletlink, fortmatic, portis } from '../../connectors'
import { injected, walletconnect, walletlink, fortmatic, portis, torus } from '../../connectors'
import CoinbaseWalletIcon from '../../assets/images/coinbaseWalletIcon.svg'
import WalletConnectIcon from '../../assets/images/walletConnectIcon.svg'
import FortmaticIcon from '../../assets/images/fortmaticIcon.png'
import PortisIcon from '../../assets/images/portisIcon.png'
import TorusIcon from '../../assets/images/torus.png'
import Identicon from '../Identicon'
import { Link } from '../../theme'
@@ -296,6 +297,12 @@ export default function AccountDetails({
</IconWrapper>
</>
)
} else if (connector === torus) {
return (
<IconWrapper size={16}>
<img src={TorusIcon} alt={''} /> {formatConnectorName()}
</IconWrapper>
)
}
}

View File

@@ -289,7 +289,8 @@ export default function CurrencyInputPanel({
selectedTokenAddress = '',
showUnlock,
value,
urlAddedTokens
urlAddedTokens,
hideETH = false
}) {
const { t } = useTranslation()
@@ -439,13 +440,14 @@ export default function CurrencyInputPanel({
urlAddedTokens={urlAddedTokens}
onTokenSelect={onCurrencySelected}
allBalances={allBalances}
hideETH={hideETH}
/>
)}
</InputPanel>
)
}
function CurrencySelectModal({ isOpen, onDismiss, onTokenSelect, urlAddedTokens }) {
function CurrencySelectModal({ isOpen, onDismiss, onTokenSelect, urlAddedTokens, hideETH }) {
const { t } = useTranslation()
const [searchQuery, setSearchQuery] = useState('')
@@ -459,12 +461,13 @@ function CurrencySelectModal({ isOpen, onDismiss, onTokenSelect, urlAddedTokens
const ethPrice = useETHPriceInUSD()
// all balances for both account and exchanges
let allBalances = useAllBalances()
const allBalances = useAllBalances()
const _usdAmounts = Object.keys(allTokens).map(k => {
if (ethPrice && allBalances[account] && allBalances[account][k] && allBalances[account][k].value) {
let ethRate = 1 // default for ETH
let exchangeDetails = allBalances[allTokens[k].exchangeAddress]
if (
exchangeDetails &&
exchangeDetails[k] &&
@@ -472,14 +475,17 @@ function CurrencySelectModal({ isOpen, onDismiss, onTokenSelect, urlAddedTokens
exchangeDetails['ETH'] &&
exchangeDetails['ETH'].value
) {
const tokenBalance = new BigNumber(exchangeDetails[k].value.toString())
const ethBalance = new BigNumber(exchangeDetails['ETH'].value.toString())
ethRate = ethBalance.div(tokenBalance)
const tokenBalance = new BigNumber(exchangeDetails[k].value)
const ethBalance = new BigNumber(exchangeDetails['ETH'].value)
ethRate = ethBalance
.times(new BigNumber(10).pow(allTokens[k].decimals))
.div(tokenBalance)
.div(new BigNumber(10).pow(18))
}
const USDRate = ethPrice
.times(ethRate)
.times(new BigNumber(10).pow(allTokens[k].decimals).div(new BigNumber(10).pow(18)))
const balanceBigNumber = new BigNumber(allBalances[account][k].value.toString())
const USDRate = ethPrice.times(ethRate)
const balanceBigNumber = new BigNumber(allBalances[account][k].value)
const usdBalance = balanceBigNumber.times(USDRate).div(new BigNumber(10).pow(allTokens[k].decimals))
return usdBalance
} else {
@@ -531,10 +537,10 @@ function CurrencySelectModal({ isOpen, onDismiss, onTokenSelect, urlAddedTokens
let usdBalance
// only update if we have data
if (k === 'ETH' && allBalances[account] && allBalances[account][k] && allBalances[account][k].value) {
balance = formatEthBalance(allBalances[account][k].value)
balance = formatEthBalance(ethers.utils.bigNumberify(allBalances[account][k].value))
usdBalance = usdAmounts[k]
} else if (allBalances[account] && allBalances[account][k] && allBalances[account][k].value) {
balance = formatTokenBalance(allBalances[account][k].value, allTokens[k].decimals)
balance = formatTokenBalance(ethers.utils.bigNumberify(allBalances[account][k].value), allTokens[k].decimals)
usdBalance = usdAmounts[k]
}
return {
@@ -548,7 +554,7 @@ function CurrencySelectModal({ isOpen, onDismiss, onTokenSelect, urlAddedTokens
}, [allBalances, allTokens, usdAmounts, account])
const filteredTokenList = useMemo(() => {
return tokenList.filter(tokenEntry => {
const list = tokenList.filter(tokenEntry => {
const inputIsAddress = searchQuery.slice(0, 2) === '0x'
// check the regex for each field
@@ -568,6 +574,11 @@ function CurrencySelectModal({ isOpen, onDismiss, onTokenSelect, urlAddedTokens
})
return regexMatches.some(m => m)
})
// If the user has not inputted anything, preserve previous sort
if (searchQuery === '') return list
return list.sort((a, b) => {
return a.symbol.toLowerCase() === searchQuery.toLowerCase() ? -1 : 1
})
}, [tokenList, searchQuery])
function _onTokenSelect(address) {
@@ -602,6 +613,10 @@ function CurrencySelectModal({ isOpen, onDismiss, onTokenSelect, urlAddedTokens
!INITIAL_TOKENS_CONTEXT[chainId].hasOwnProperty(address) &&
!urlAdded
if (hideETH && address === 'ETH') {
return null
}
return (
<TokenModalRow key={address} onClick={() => _onTokenSelect(address)}>
<TokenRowLeft>
@@ -663,7 +678,7 @@ function CurrencySelectModal({ isOpen, onDismiss, onTokenSelect, urlAddedTokens
>
<TokenModal>
<ModalHeader>
<p>Select Token</p>
<p>{t('selectToken')}</p>
<CloseIcon onClick={clearInputAndDismiss}>
<CloseColor alt={'close icon'} />
</CloseIcon>

View File

@@ -127,10 +127,10 @@ function getInitialSwapState(state) {
independentValue: state.exactFieldURL && state.exactAmountURL ? state.exactAmountURL : '', // this is a user input
dependentValue: '', // this is a calculated number
independentField: state.exactFieldURL === 'output' ? OUTPUT : INPUT,
inputCurrency: state.inputCurrencyURL ? state.inputCurrencyURL : 'ETH',
inputCurrency: state.inputCurrencyURL ? state.inputCurrencyURL : state.outputCurrencyURL === 'ETH' ? '' : 'ETH',
outputCurrency: state.outputCurrencyURL
? state.outputCurrencyURL === 'ETH'
? state.inputCurrencyURL && state.inputCurrencyURL !== 'ETH'
? !state.inputCurrencyURL || (state.inputCurrencyURL && state.inputCurrencyURL !== 'ETH')
? 'ETH'
: ''
: state.outputCurrencyURL
@@ -920,7 +920,7 @@ export default function ExchangePage({ initialCurrency, sending = false, params
{brokenTokenWarning
? 'Swap'
: !account
? 'Connect to a Wallet'
? t('connectToWallet')
: sending
? highSlippageWarning || customSlippageError === 'warning'
? t('sendAnyway')

View File

@@ -9,20 +9,55 @@ const HeaderFrame = styled.div`
display: flex;
align-items: center;
justify-content: space-between;
flex-direction: column;
width: 100%;
z-index: 2;
`
const HeaderSpan = styled.span`
width: 100%;
display: flex;
justify-content: space-between;
`
const MigrateBanner = styled.div`
width: 100%;
padding: 12px 0;
display: flex;
justify-content: center;
background-color: ${({ theme }) => theme.uniswapPink};
color: ${({ theme }) => theme.inputBackground};
font-weight: 400;
text-align: center;
a {
color: ${({ theme }) => theme.inputBackground};
text-decoration: underline;
}
`
const MigrateBannerSmall = styled(MigrateBanner)`
@media (min-width: 960px) {
display: none;
}
`
const MigrateBannerLarge = styled(MigrateBanner)`
@media (max-width: 960px) {
display: none;
}
`
const HeaderElement = styled.div`
margin: 1.25rem;
display: flex;
min-width: 0;
display: flex;
align-items: center;
`
const Nod = styled.span`
transform: rotate(0deg);
transition: transform 150ms ease-out;
margin-right: 4px;
:hover {
transform: rotate(-10deg);
@@ -52,26 +87,76 @@ const Title = styled.div`
}
`
const TestnetWrapper = styled.div`
white-space: nowrap;
width: fit-content;
margin-left: 10px;
`
const VersionLabel = styled.span`
padding: ${({ isV1 }) => (isV1 ? '0.15rem 0.5rem 0.15rem 0.5rem' : '0.15rem 0.25rem 0.13rem 0.5rem')};
border-radius: 14px;
background: ${({ theme, isV1 }) => (isV1 ? theme.uniswapPink : 'none')};
color: ${({ theme, isV1 }) => (isV1 ? theme.inputBackground : theme.uniswapPink)};
font-size: 0.825rem;
font-weight: 400;
`
const VersionToggle = styled.a`
border-radius: 16px;
border: 1px solid ${({ theme }) => theme.uniswapPink};
color: ${({ theme }) => theme.uniswapPink};
display: flex;
width: fit-content;
cursor: pointer;
text-decoration: none;
:hover {
text-decoration: none;
}
`
export default function Header() {
return (
<HeaderFrame>
<HeaderElement>
<Title>
<Nod>
<MigrateBannerSmall>
<b>V2 is here!&nbsp;</b> <Link href="https://migrate.uniswap.exchange/">Migrate your liquidity&nbsp;</Link>or{' '}
<Link href="https://uniswap.exchange"> &nbsp;use V2 ↗</Link>
</MigrateBannerSmall>
<MigrateBannerLarge>
<b>Uniswap V2 is here!&nbsp;</b> Move your liquidity now using the&nbsp;
<Link href="https://migrate.uniswap.exchange/">
<b>migration helper</b>
</Link>
&nbsp;or use the&nbsp;
<Link href="https://uniswap.exchange">
<b>Uniswap V2 Interface </b>
</Link>
</MigrateBannerLarge>
<HeaderSpan>
<HeaderElement>
<Title>
<Nod>
<Link id="link" href="https://uniswap.io">
<span role="img" aria-label="unicorn">
🦄{' '}
</span>
</Link>
</Nod>
<Link id="link" href="https://uniswap.io">
<span role="img" aria-label="unicorn">
🦄{' '}
</span>
<h1 id="title">Uniswap</h1>
</Link>
</Nod>
<Link id="link" href="https://uniswap.io">
<h1 id="title">Uniswap</h1>
</Link>
</Title>
</HeaderElement>
<HeaderElement>
<Web3Status />
</HeaderElement>
</Title>
<TestnetWrapper>
<VersionToggle target="_self" href="https://v2.uniswap.exchange">
<VersionLabel isV1={false}>V2</VersionLabel>
<VersionLabel isV1={true}>V1</VersionLabel>
</VersionToggle>
</TestnetWrapper>
</HeaderElement>
<HeaderElement>
<Web3Status />
</HeaderElement>
</HeaderSpan>
</HeaderFrame>
)
}

View File

@@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react'
import ReactGA from 'react-ga'
import styled from 'styled-components'
import { isMobile } from 'react-device-detect'
import { useTranslation } from 'react-i18next'
import { useWeb3React, UnsupportedChainIdError } from '@web3-react/core'
import { URI_AVAILABLE } from '@web3-react/walletconnect-connector'
@@ -125,6 +126,8 @@ export default function WalletModal({ pendingTransactions, confirmedTransactions
const walletModalOpen = useWalletModalOpen()
const toggleWalletModal = useWalletModalToggle()
const { t } = useTranslation()
// always reset to account view
useEffect(() => {
if (walletModalOpen) {
@@ -194,7 +197,7 @@ export default function WalletModal({ pendingTransactions, confirmedTransactions
const option = SUPPORTED_WALLETS[key]
// check for mobile options
if (isMobile) {
//disable portis on mobile for now
// disable portis on mobile for now
if (option.connector === portis) {
return null
}
@@ -234,7 +237,7 @@ export default function WalletModal({ pendingTransactions, confirmedTransactions
/>
)
} else {
return null //dont want to return install twice
return null // dont want to return install twice
}
}
// don't return metamask if injected provider isn't metamask
@@ -262,7 +265,7 @@ export default function WalletModal({ pendingTransactions, confirmedTransactions
color={option.color}
link={option.href}
header={option.name}
subheader={null} //use option.descriptio to bring back multi-line
subheader={null} // use option.descriptio to bring back multi-line
icon={require('../../assets/images/' + option.iconName)}
/>
)
@@ -317,7 +320,7 @@ export default function WalletModal({ pendingTransactions, confirmedTransactions
</HeaderRow>
) : (
<HeaderRow>
<HoverText>Connect To A Wallet</HoverText>
<HoverText>{t('connectToWallet')}</HoverText>
</HeaderRow>
)}
<ContentWrapper>

View File

@@ -12,11 +12,12 @@ import { useAllTransactions } from '../../contexts/Transactions'
import { useWalletModalToggle } from '../../contexts/Application'
import { Spinner } from '../../theme'
import Circle from '../../assets/images/circle.svg'
import { injected, walletconnect, walletlink, fortmatic, portis } from '../../connectors'
import { injected, walletconnect, walletlink, fortmatic, portis, torus } from '../../connectors'
import WalletConnectIcon from '../../assets/images/walletConnectIcon.svg'
import CoinbaseWalletIcon from '../../assets/images/coinbaseWalletIcon.svg'
import FortmaticIcon from '../../assets/images/fortmaticIcon.png'
import PortisIcon from '../../assets/images/portisIcon.png'
import TorusIcon from '../../assets/images/torus.png'
import { NetworkContextName } from '../../constants'
import Identicon from '../Identicon'
@@ -161,6 +162,12 @@ export default function Web3Status() {
<img src={PortisIcon} alt={''} />
</IconWrapper>
)
} else if (connector === torus) {
return (
<IconWrapper size={16}>
<img src={TorusIcon} alt={''} />
</IconWrapper>
)
}
}
@@ -183,7 +190,7 @@ export default function Web3Status() {
} else {
return (
<Web3StatusConnect onClick={toggleWalletModal} faded={!account}>
<Text>{t('Connect to a Wallet')}</Text>
<Text>{t('connectToWallet')}</Text>
</Web3StatusConnect>
)
}

View File

@@ -2,6 +2,7 @@ import { InjectedConnector } from '@web3-react/injected-connector'
import { WalletConnectConnector } from '@web3-react/walletconnect-connector'
import { WalletLinkConnector } from '@web3-react/walletlink-connector'
import { PortisConnector } from '@web3-react/portis-connector'
import { TorusConnector } from '@web3-react/torus-connector'
import { NetworkConnector } from './Network'
import { FortmaticConnector } from './Fortmatic'
@@ -41,6 +42,13 @@ export const portis = new PortisConnector({
networks: [1]
})
export const torus = new TorusConnector({
chainId: 1,
initOptions: {
showTorusButton: false
}
})
// mainnet only
export const walletlink = new WalletLinkConnector({
url: NETWORK_URL,

View File

@@ -1,4 +1,4 @@
import { injected, walletconnect, walletlink, fortmatic, portis } from '../connectors'
import { injected, walletconnect, walletlink, fortmatic, portis, torus } from '../connectors'
export const FACTORY_ADDRESSES = {
1: '0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95',
@@ -89,6 +89,15 @@ export const SUPPORTED_WALLETS =
href: null,
color: '#4A6C9B',
mobile: true
},
Torus: {
connector: torus,
name: 'Torus',
iconName: 'torus.png',
description: 'Login via Google, Facebook and others',
href: null,
color: '#5495F7',
mobile: true
}
}
}
@@ -98,7 +107,23 @@ export const brokenTokens = [
'0xB8c77482e45F1F44dE1745F52C74426C631bDD52',
'0x95dAaaB98046846bF4B2853e23cba236fa394A31',
'0x55296f69f40Ea6d20E478533C15A6B08B654E758',
'0xc3761EB917CD790B30dAD99f6Cc5b4Ff93C4F9eA'
'0xc3761EB917CD790B30dAD99f6Cc5b4Ff93C4F9eA',
'0x5C406D99E04B8494dc253FCc52943Ef82bcA7D75',
'0xa44E5137293E855B1b7bC7E2C6f8cD796fFCB037',
'0x77599D2C6DB170224243e255e6669280F11F1473'
]
export const broken777Tokens = [
'0x58e8a6c0e0b58bca809f1faee01f1662c9fc460e',
'0xbdfa65533074b0b23ebc18c7190be79fa74b30c2',
'0x5228a22e72ccc52d415ecfd199f99d0665e7733b',
'0x9b869c2eaae08136c43d824ea75a2f376f1aa983',
'0x09a8f2041be23e8ec3c72790c9a92089bc70fbca',
'0x49d716dfe60b37379010a75329ae09428f17118d',
'0x30e0c58c5670e0bdec98f29f66b092e43e98d699',
'0x3212b29e33587a00fb1c83346f5dbfa69a458923',
'0x5cffc0b73df80144f0f3f5bf75672777af2bbbfe',
'0x0d31444c3f3cd583f30ca1b7cedc973db4bf5abf'
]
export const NetworkContextName = 'NETWORK'

View File

@@ -1,310 +0,0 @@
import React, { createContext, useContext, useReducer, useMemo, useCallback, useEffect, useRef, useState } from 'react'
import { BigNumber } from '@uniswap/sdk'
import { useWeb3React } from '../hooks'
import { safeAccess, isAddress, getEtherBalance, getTokenBalance } from '../utils'
import { useBlockNumber } from './Application'
import { useTokenDetails, useAllTokenDetails } from './Tokens'
import { getUSDPrice } from '../utils/price'
const UPDATE = 'UPDATE'
const UPDATE_ALL_FOR_ACCOUNT = 'UPDATE_ALL_FOR_ACCOUNT'
const UPDATE_ALL_FOR_EXCHANGES = 'UPDATE_ALL_FOR_EXCHANGES'
const BalancesContext = createContext()
function useBalancesContext() {
return useContext(BalancesContext)
}
function reducer(state, { type, payload }) {
switch (type) {
case UPDATE: {
const { networkId, address, tokenAddress, value, blockNumber } = payload
return {
...state,
[networkId]: {
...(safeAccess(state, [networkId]) || {}),
[address]: {
...(safeAccess(state, [networkId, address]) || {}),
[tokenAddress]: {
value,
blockNumber
}
}
}
}
}
case UPDATE_ALL_FOR_ACCOUNT: {
const { networkId, address, tokenAddresses, values } = payload
return {
...state,
[networkId]: {
...(safeAccess(state, [networkId]) || {}),
[address]: {
...tokenAddresses.reduce((accumulator, currentValue, i) => {
accumulator[currentValue] = { value: values[i] }
return accumulator
}, {}),
...(safeAccess(state, [networkId, address]) || {})
}
}
}
}
case UPDATE_ALL_FOR_EXCHANGES: {
const { networkId, exchangeAddresses, tokenAddresses, values } = payload
return {
...state,
[networkId]: {
...(safeAccess(state, [networkId]) || {}),
...exchangeAddresses.reduce((accumulator, currentValue, i) => {
accumulator[currentValue] = {
...safeAccess(state, [networkId, currentValue]),
[tokenAddresses[i]]: {
value: values[i]
}
}
return accumulator
}, {})
}
}
}
default: {
throw Error(`Unexpected action type in BalancesContext reducer: '${type}'.`)
}
}
}
export default function Provider({ children }) {
const [state, dispatch] = useReducer(reducer, {})
const update = useCallback((networkId, address, tokenAddress, value, blockNumber) => {
dispatch({ type: UPDATE, payload: { networkId, address, tokenAddress, value, blockNumber } })
}, [])
const updateAllForAccount = useCallback((networkId, address, tokenAddresses, values) => {
dispatch({ type: UPDATE_ALL_FOR_ACCOUNT, payload: { networkId, address, tokenAddresses, values } })
}, [])
const updateAllForExchanges = useCallback((networkId, exchangeAddresses, tokenAddresses, values) => {
dispatch({ type: UPDATE_ALL_FOR_EXCHANGES, payload: { networkId, exchangeAddresses, tokenAddresses, values } })
}, [])
return (
<BalancesContext.Provider
value={useMemo(() => [state, { update, updateAllForAccount, updateAllForExchanges }], [
state,
update,
updateAllForAccount,
updateAllForExchanges
])}
>
{children}
</BalancesContext.Provider>
)
}
const STAGGER_TIME = 2500
export function Updater() {
const { library, chainId, account } = useWeb3React()
const allTokens = useAllTokenDetails()
const [state, { updateAllForAccount, updateAllForExchanges }] = useBalancesContext()
const stateRef = useRef(state)
stateRef.current = state
useEffect(() => {
const getData = async () => {
if (chainId && library && account) {
// get 1 eth + all token balances for the account
Promise.all(
Object.keys(allTokens).map(async tokenAddress => {
await new Promise(resolve => setTimeout(resolve, STAGGER_TIME * Math.random()))
const { value: existingValue } = safeAccess(stateRef.current, [chainId, account, tokenAddress]) || {}
return (
existingValue ||
(await (tokenAddress === 'ETH'
? getEtherBalance(account, library).catch(() => null)
: getTokenBalance(tokenAddress, account, library).catch(() => null)))
)
})
).then(balances => {
updateAllForAccount(chainId, account, Object.keys(allTokens), balances)
})
const allTokensWithAnExchange = Object.keys(allTokens).filter(tokenAddress => tokenAddress !== 'ETH')
// get all eth balances for all exchanges
Promise.all(
allTokensWithAnExchange.map(async tokenAddress => {
await new Promise(resolve => setTimeout(resolve, STAGGER_TIME * Math.random()))
const exchangeAddress = allTokens[tokenAddress].exchangeAddress
const { value: existingValue } = safeAccess(stateRef.current, [chainId, exchangeAddress, 'ETH']) || {}
return existingValue || (await getEtherBalance(exchangeAddress, library).catch(() => null))
})
).then(ethBalances => {
updateAllForExchanges(
chainId,
allTokensWithAnExchange.map(tokenAddress => allTokens[tokenAddress].exchangeAddress),
Array(allTokensWithAnExchange.length).fill('ETH'),
ethBalances
)
})
// get all token balances for all exchanges
Promise.all(
allTokensWithAnExchange.map(async tokenAddress => {
await new Promise(resolve => setTimeout(resolve, STAGGER_TIME * Math.random()))
const exchangeAddress = allTokens[tokenAddress].exchangeAddress
const { value: existingValue } =
safeAccess(stateRef.current, [chainId, exchangeAddress, tokenAddress]) || {}
return existingValue || (await getTokenBalance(tokenAddress, exchangeAddress, library).catch(() => null))
})
).then(tokenBalances => {
updateAllForExchanges(
chainId,
allTokensWithAnExchange.map(tokenAddress => allTokens[tokenAddress].exchangeAddress),
allTokensWithAnExchange.map(tokenAddress => tokenAddress),
tokenBalances
)
})
}
}
getData()
}, [chainId, library, account, allTokens, updateAllForAccount, updateAllForExchanges])
return null
}
export function useAllBalances() {
const { chainId } = useWeb3React()
const [state] = useBalancesContext()
const balances = safeAccess(state, [chainId]) || {}
return balances
}
export function useAddressBalance(address, tokenAddress) {
const { library, chainId } = useWeb3React()
const globalBlockNumber = useBlockNumber()
const [state, { update }] = useBalancesContext()
const { value, blockNumber } = safeAccess(state, [chainId, address, tokenAddress]) || {}
useEffect(() => {
if (
isAddress(address) &&
(tokenAddress === 'ETH' || isAddress(tokenAddress)) &&
(value === undefined || blockNumber !== globalBlockNumber) &&
(chainId || chainId === 0) &&
library
) {
let stale = false
;(tokenAddress === 'ETH' ? getEtherBalance(address, library) : getTokenBalance(tokenAddress, address, library))
.then(value => {
if (!stale) {
update(chainId, address, tokenAddress, value, globalBlockNumber)
}
})
.catch(() => {
if (!stale) {
update(chainId, address, tokenAddress, null, globalBlockNumber)
}
})
return () => {
stale = true
}
}
}, [address, tokenAddress, value, blockNumber, globalBlockNumber, chainId, library, update])
return value
}
export function useExchangeReserves(tokenAddress) {
const { exchangeAddress } = useTokenDetails(tokenAddress)
const reserveETH = useAddressBalance(exchangeAddress, 'ETH')
const reserveToken = useAddressBalance(exchangeAddress, tokenAddress)
return { reserveETH, reserveToken }
}
const buildReserveObject = (chainId, tokenAddress, ethReserveAmount, tokenReserveAmount, decimals) => ({
token: {
chainId,
address: tokenAddress,
decimals
},
ethReserve: {
token: {
chainId,
decimals: 18
},
amount: ethReserveAmount
},
tokenReserve: {
token: {
chainId,
address: tokenAddress,
decimals
},
amount: tokenReserveAmount
}
})
const daiTokenAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F'
const daiExchangeAddress = '0x2a1530C4C41db0B0b2bB646CB5Eb1A67b7158667'
const usdcTokenAddress = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'
const usdcExchangeAddress = '0x97deC872013f6B5fB443861090ad931542878126'
const tusdTokenAddress = '0x0000000000085d4780B73119b644AE5ecd22b376'
const tusdExchangeAddress = '0x5048b9d01097498Fd72F3F14bC9Bc74A5aAc8fA7'
export function useETHPriceInUSD() {
const { chainId } = useWeb3React()
let daiReserveETH = useAddressBalance(daiExchangeAddress, 'ETH')
let daiReserveToken = useAddressBalance(daiExchangeAddress, daiTokenAddress)
let usdcReserveETH = useAddressBalance(usdcExchangeAddress, 'ETH')
let usdcReserveToken = useAddressBalance(usdcExchangeAddress, usdcTokenAddress)
let tusdReserveETH = useAddressBalance(tusdExchangeAddress, 'ETH')
let tusdReserveToken = useAddressBalance(tusdExchangeAddress, tusdTokenAddress)
const [price, setPrice] = useState()
useEffect(() => {
if (daiReserveETH && daiReserveToken && usdcReserveETH && usdcReserveToken && tusdReserveETH && tusdReserveToken) {
const daiReservesObject = buildReserveObject(
chainId,
daiTokenAddress,
new BigNumber(daiReserveETH.toString()),
new BigNumber(daiReserveToken.toString()),
18
)
const tusdReservesObject = buildReserveObject(
chainId,
tusdTokenAddress,
new BigNumber(tusdReserveETH.toString()),
new BigNumber(tusdReserveToken.toString()),
18
)
const usdcReservesObject = buildReserveObject(
chainId,
usdcTokenAddress,
new BigNumber(usdcReserveETH.toString()),
new BigNumber(usdcReserveToken.toString()),
6
)
const stablecoinReserves = [daiReservesObject, usdcReservesObject, tusdReservesObject]
try {
setPrice(getUSDPrice(stablecoinReserves))
} catch {
setPrice(null)
}
}
}, [daiReserveETH, daiReserveToken, usdcReserveETH, usdcReserveToken, tusdReserveETH, tusdReserveToken, chainId])
return price
}

531
src/contexts/Balances.tsx Normal file
View File

@@ -0,0 +1,531 @@
import React, {
createContext,
useContext,
useReducer,
useState,
useRef,
useMemo,
useCallback,
useEffect,
ReactNode
} from 'react'
import { BigNumber } from '@uniswap/sdk'
import { ethers } from 'ethers'
import { useWeb3React, useDebounce } from '../hooks'
import { getEtherBalance, getTokenBalance, isAddress } from '../utils'
import { useBlockNumber } from './Application'
import { useTokenDetails, useAllTokenDetails } from './Tokens'
import { getUSDPrice } from '../utils/price'
const LOCAL_STORAGE_KEY = 'BALANCES'
const SHORT_BLOCK_TIMEOUT = (60 * 2) / 15 // in seconds, represented as a block number delta
const LONG_BLOCK_TIMEOUT = (60 * 15) / 15 // in seconds, represented as a block number delta
const EXCHANGES_BLOCK_TIMEOUT = (60 * 5) / 15 // in seconds, represented as a block number delta
interface BalancesState {
[chainId: number]: {
[address: string]: {
[tokenAddress: string]: {
value?: string | null
blockNumber?: number
listenerCount: number
}
}
}
}
function initialize(): BalancesState {
try {
return JSON.parse(window.localStorage.getItem(LOCAL_STORAGE_KEY) as string)
} catch {
return {}
}
}
enum Action {
START_LISTENING,
STOP_LISTENING,
UPDATE,
BATCH_UPDATE_ACCOUNT,
BATCH_UPDATE_EXCHANGES
}
function reducer(state: BalancesState, { type, payload }: { type: Action; payload: any }) {
switch (type) {
case Action.START_LISTENING: {
const { chainId, address, tokenAddress } = payload
const uninitialized = !!!state?.[chainId]?.[address]?.[tokenAddress]
return {
...state,
[chainId]: {
...state?.[chainId],
[address]: {
...state?.[chainId]?.[address],
[tokenAddress]: uninitialized
? {
listenerCount: 1
}
: {
...state[chainId][address][tokenAddress],
listenerCount: state[chainId][address][tokenAddress].listenerCount + 1
}
}
}
}
}
case Action.STOP_LISTENING: {
const { chainId, address, tokenAddress } = payload
return {
...state,
[chainId]: {
...state?.[chainId],
[address]: {
...state?.[chainId]?.[address],
[tokenAddress]: {
...state?.[chainId]?.[address]?.[tokenAddress],
listenerCount: state[chainId][address][tokenAddress].listenerCount - 1
}
}
}
}
}
case Action.UPDATE: {
const { chainId, address, tokenAddress, value, blockNumber } = payload
return {
...state,
[chainId]: {
...state?.[chainId],
[address]: {
...state?.[chainId]?.[address],
[tokenAddress]: {
...state?.[chainId]?.[address]?.[tokenAddress],
value,
blockNumber
}
}
}
}
}
case Action.BATCH_UPDATE_ACCOUNT: {
const { chainId, address, tokenAddresses, values, blockNumber } = payload
return {
...state,
[chainId]: {
...state?.[chainId],
[address]: {
...state?.[chainId]?.[address],
...tokenAddresses.reduce((accumulator: any, tokenAddress: string, i: number) => {
const value = values[i]
accumulator[tokenAddress] = {
...state?.[chainId]?.[address]?.[tokenAddress],
value,
blockNumber
}
return accumulator
}, {})
}
}
}
}
case Action.BATCH_UPDATE_EXCHANGES: {
const { chainId, exchangeAddresses, tokenAddresses, values, blockNumber } = payload
return {
...state,
[chainId]: {
...state?.[chainId],
...exchangeAddresses.reduce((accumulator: any, exchangeAddress: string, i: number) => {
const tokenAddress = tokenAddresses[i]
const value = values[i]
accumulator[exchangeAddress] = {
...state?.[chainId]?.[exchangeAddress],
...accumulator?.[exchangeAddress],
[tokenAddress]: {
...state?.[chainId]?.[exchangeAddress]?.[tokenAddress],
value,
blockNumber
}
}
return accumulator
}, {})
}
}
}
default: {
throw Error(`Unexpected action type in BalancesContext reducer: '${type}'.`)
}
}
}
const BalancesContext = createContext<[BalancesState, { [k: string]: (...args: any) => void }]>([{}, {}])
function useBalancesContext() {
return useContext(BalancesContext)
}
export default function Provider({ children }: { children: ReactNode }) {
const [state, dispatch] = useReducer(reducer, undefined, initialize)
const startListening = useCallback((chainId, address, tokenAddress) => {
dispatch({ type: Action.START_LISTENING, payload: { chainId, address, tokenAddress } })
}, [])
const stopListening = useCallback((chainId, address, tokenAddress) => {
dispatch({ type: Action.STOP_LISTENING, payload: { chainId, address, tokenAddress } })
}, [])
const update = useCallback((chainId, address, tokenAddress, value, blockNumber) => {
dispatch({ type: Action.UPDATE, payload: { chainId, address, tokenAddress, value, blockNumber } })
}, [])
const batchUpdateAccount = useCallback((chainId, address, tokenAddresses, values, blockNumber) => {
dispatch({ type: Action.BATCH_UPDATE_ACCOUNT, payload: { chainId, address, tokenAddresses, values, blockNumber } })
}, [])
const batchUpdateExchanges = useCallback((chainId, exchangeAddresses, tokenAddresses, values, blockNumber) => {
dispatch({
type: Action.BATCH_UPDATE_EXCHANGES,
payload: { chainId, exchangeAddresses, tokenAddresses, values, blockNumber }
})
}, [])
return (
<BalancesContext.Provider
value={useMemo(
() => [state, { startListening, stopListening, update, batchUpdateAccount, batchUpdateExchanges }],
[state, startListening, stopListening, update, batchUpdateAccount, batchUpdateExchanges]
)}
>
{children}
</BalancesContext.Provider>
)
}
export function Updater() {
const { chainId, account, library } = useWeb3React()
const blockNumber = useBlockNumber()
const [state, { update, batchUpdateAccount, batchUpdateExchanges }] = useBalancesContext()
// debounce state a little bit to prevent useEffect craziness
const debouncedState = useDebounce(state, 1000)
// cache this debounced state in localstorage
useEffect(() => {
window.localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(debouncedState))
}, [debouncedState])
// (slightly janky) balances-wide cache to prevent double/triple/etc. fetching
const fetchedAsOfCache = useRef<{
[chainId: number]: {
[address: string]: {
[tokenAddress: string]: number
}
}
}>({})
// generic balances fetcher abstracting away difference between fetching ETH + token balances
const fetchBalance = useCallback(
(address: string, tokenAddress: string) =>
(tokenAddress === 'ETH' ? getEtherBalance(address, library) : getTokenBalance(tokenAddress, address, library))
.then(value => {
return value.toString()
})
.catch(() => {
return null
}),
[library]
)
// ensure that all balances with >=1 listeners are updated every block
useEffect(() => {
if (typeof chainId === 'number' && typeof blockNumber === 'number') {
for (const address of Object.keys(debouncedState?.[chainId] ?? {})) {
for (const tokenAddress of Object.keys(debouncedState?.[chainId][address])) {
const active = debouncedState[chainId][address][tokenAddress].listenerCount > 0
if (active) {
const cachedFetchedAsOf = fetchedAsOfCache.current?.[chainId]?.[address]?.[tokenAddress]
const fetchedAsOf = debouncedState[chainId][address][tokenAddress]?.blockNumber ?? cachedFetchedAsOf
if (fetchedAsOf !== blockNumber) {
// fetch the balance...
fetchBalance(address, tokenAddress).then(value => {
update(chainId, address, tokenAddress, value, blockNumber)
})
// ...and cache the fetch
fetchedAsOfCache.current = {
...fetchedAsOfCache.current,
[chainId]: {
...fetchedAsOfCache.current?.[chainId],
[address]: {
...fetchedAsOfCache.current?.[chainId]?.[address],
[tokenAddress]: blockNumber
}
}
}
}
}
}
}
}
}, [chainId, blockNumber, debouncedState, fetchBalance, update])
// get a state ref for batch updates
const stateRef = useRef(state)
useEffect(() => {
stateRef.current = state
}, [state])
const allTokenDetails = useAllTokenDetails()
// ensure that we have the user balances for all tokens
const allTokens = useMemo(() => Object.keys(allTokenDetails), [allTokenDetails])
useEffect(() => {
if (typeof chainId === 'number' && typeof account === 'string' && typeof blockNumber === 'number') {
Promise.all(
allTokens
.filter(tokenAddress => {
const hasValue = !!stateRef.current?.[chainId]?.[account]?.[tokenAddress]?.value
const cachedFetchedAsOf = fetchedAsOfCache.current?.[chainId]?.[account]?.[tokenAddress]
const fetchedAsOf = stateRef.current?.[chainId]?.[account]?.[tokenAddress]?.blockNumber ?? cachedFetchedAsOf
// if there's no value, and it's not being fetched, we need to fetch!
if (!hasValue && typeof cachedFetchedAsOf !== 'number') {
return true
// else, if there's a value, check if it's stale
} else if (hasValue) {
const blocksElapsedSinceLastCheck = blockNumber - fetchedAsOf
const stale =
blocksElapsedSinceLastCheck >=
(stateRef.current[chainId][account][tokenAddress].value === '0'
? LONG_BLOCK_TIMEOUT
: SHORT_BLOCK_TIMEOUT)
return stale
} else {
return false
}
})
.map(async tokenAddress => {
fetchedAsOfCache.current = {
...fetchedAsOfCache.current,
[chainId]: {
...fetchedAsOfCache.current?.[chainId],
[account]: {
...fetchedAsOfCache.current?.[chainId]?.[account],
[tokenAddress]: blockNumber
}
}
}
return fetchBalance(account, tokenAddress).then(value => ({ tokenAddress, value }))
})
).then(results => {
batchUpdateAccount(
chainId,
account,
results.map(result => result.tokenAddress),
results.map(result => result.value),
blockNumber
)
})
}
}, [chainId, account, blockNumber, allTokens, fetchBalance, batchUpdateAccount])
// ensure that we have the eth and token balances for all exchanges
const allExchanges = useMemo(
() =>
Object.keys(allTokenDetails)
.filter(tokenAddress => tokenAddress !== 'ETH')
.map(tokenAddress => ({
tokenAddress,
exchangeAddress: allTokenDetails[tokenAddress].exchangeAddress
})),
[allTokenDetails]
)
useEffect(() => {
if (typeof chainId === 'number' && typeof blockNumber === 'number') {
Promise.all(
allExchanges
.filter(({ exchangeAddress, tokenAddress }) => {
const hasValueToken = !!stateRef.current?.[chainId]?.[exchangeAddress]?.[tokenAddress]?.value
const hasValueETH = !!stateRef.current?.[chainId]?.[exchangeAddress]?.['ETH']?.value
const cachedFetchedAsOfToken = fetchedAsOfCache.current?.[chainId]?.[exchangeAddress]?.[tokenAddress]
const cachedFetchedAsOfETH = fetchedAsOfCache.current?.[chainId]?.[exchangeAddress]?.['ETH']
const fetchedAsOfToken =
stateRef.current?.[chainId]?.[exchangeAddress]?.[tokenAddress]?.blockNumber ?? cachedFetchedAsOfToken
const fetchedAsOfETH =
stateRef.current?.[chainId]?.[exchangeAddress]?.['ETH']?.blockNumber ?? cachedFetchedAsOfETH
// if there's no values, and they're not being fetched, we need to fetch!
if (
(!hasValueToken || !hasValueETH) &&
(typeof cachedFetchedAsOfToken !== 'number' || typeof cachedFetchedAsOfETH !== 'number')
) {
return true
// else, if there are values, check if they's stale
} else if (hasValueToken && hasValueETH) {
const blocksElapsedSinceLastCheckToken = blockNumber - fetchedAsOfToken
const blocksElapsedSinceLastCheckETH = blockNumber - fetchedAsOfETH
const stale =
fetchedAsOfToken !== fetchedAsOfETH ||
blocksElapsedSinceLastCheckToken >= EXCHANGES_BLOCK_TIMEOUT ||
blocksElapsedSinceLastCheckETH >= EXCHANGES_BLOCK_TIMEOUT
return stale
} else {
return false
}
})
.map(async ({ exchangeAddress, tokenAddress }) => {
fetchedAsOfCache.current = {
...fetchedAsOfCache.current,
[chainId]: {
...fetchedAsOfCache.current?.[chainId],
[exchangeAddress]: {
...fetchedAsOfCache.current?.[chainId]?.[exchangeAddress],
[tokenAddress]: blockNumber,
ETH: blockNumber
}
}
}
return Promise.all([
fetchBalance(exchangeAddress, tokenAddress),
fetchBalance(exchangeAddress, 'ETH')
]).then(([valueToken, valueETH]) => ({ exchangeAddress, tokenAddress, valueToken, valueETH }))
})
).then(results => {
batchUpdateExchanges(
chainId,
results.flatMap(result => [result.exchangeAddress, result.exchangeAddress]),
results.flatMap(result => [result.tokenAddress, 'ETH']),
results.flatMap(result => [result.valueToken, result.valueETH]),
blockNumber
)
})
}
}, [chainId, account, blockNumber, allExchanges, fetchBalance, batchUpdateExchanges])
return null
}
export function useAllBalances() {
const { chainId } = useWeb3React()
const [state] = useBalancesContext()
return useMemo(() => (typeof chainId === 'number' ? state?.[chainId] ?? {} : {}), [chainId, state])
}
export function useAddressBalance(address: string, tokenAddress: string): ethers.utils.BigNumber | undefined | null {
const { chainId } = useWeb3React()
const [state, { startListening, stopListening }] = useBalancesContext()
useEffect(() => {
if (typeof chainId === 'number' && isAddress(address) && isAddress(tokenAddress)) {
startListening(chainId, address, tokenAddress)
return () => {
stopListening(chainId, address, tokenAddress)
}
}
}, [chainId, address, tokenAddress, startListening, stopListening])
const value = typeof chainId === 'number' ? state?.[chainId]?.[address]?.[tokenAddress]?.value : undefined
return useMemo(() => (typeof value === 'string' ? ethers.utils.bigNumberify(value) : value), [value])
}
export function useExchangeReserves(tokenAddress: string) {
const { exchangeAddress } = useTokenDetails(tokenAddress)
const reserveETH = useAddressBalance(exchangeAddress, 'ETH')
const reserveToken = useAddressBalance(exchangeAddress, tokenAddress)
return { reserveETH, reserveToken }
}
const buildReserveObject = (
chainId: number,
tokenAddress: string,
ethReserveAmount: any,
tokenReserveAmount: any,
decimals: number
) => ({
token: {
chainId,
address: tokenAddress,
decimals
},
ethReserve: {
token: {
chainId,
decimals: 18
},
amount: ethReserveAmount
},
tokenReserve: {
token: {
chainId,
address: tokenAddress,
decimals
},
amount: tokenReserveAmount
}
})
const daiTokenAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F'
const daiExchangeAddress = '0x2a1530C4C41db0B0b2bB646CB5Eb1A67b7158667'
const usdcTokenAddress = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'
const usdcExchangeAddress = '0x97deC872013f6B5fB443861090ad931542878126'
const tusdTokenAddress = '0x0000000000085d4780B73119b644AE5ecd22b376'
const tusdExchangeAddress = '0x5048b9d01097498Fd72F3F14bC9Bc74A5aAc8fA7'
export function useETHPriceInUSD() {
const { chainId } = useWeb3React()
let daiReserveETH = useAddressBalance(daiExchangeAddress, 'ETH')
let daiReserveToken = useAddressBalance(daiExchangeAddress, daiTokenAddress)
let usdcReserveETH = useAddressBalance(usdcExchangeAddress, 'ETH')
let usdcReserveToken = useAddressBalance(usdcExchangeAddress, usdcTokenAddress)
let tusdReserveETH = useAddressBalance(tusdExchangeAddress, 'ETH')
let tusdReserveToken = useAddressBalance(tusdExchangeAddress, tusdTokenAddress)
const [price, setPrice] = useState<undefined | null>()
useEffect(() => {
if (
chainId &&
daiReserveETH &&
daiReserveToken &&
usdcReserveETH &&
usdcReserveToken &&
tusdReserveETH &&
tusdReserveToken
) {
const daiReservesObject = buildReserveObject(
chainId,
daiTokenAddress,
new BigNumber(daiReserveETH.toString()),
new BigNumber(daiReserveToken.toString()),
18
)
const tusdReservesObject = buildReserveObject(
chainId,
tusdTokenAddress,
new BigNumber(tusdReserveETH.toString()),
new BigNumber(tusdReserveToken.toString()),
18
)
const usdcReservesObject = buildReserveObject(
chainId,
usdcTokenAddress,
new BigNumber(usdcReserveETH.toString()),
new BigNumber(usdcReserveToken.toString()),
6
)
const stablecoinReserves = [daiReservesObject, usdcReservesObject, tusdReservesObject]
try {
setPrice(getUSDPrice(stablecoinReserves))
} catch {
setPrice(null)
}
}
}, [daiReserveETH, daiReserveToken, usdcReserveETH, usdcReserveToken, tusdReserveETH, tusdReserveToken, chainId])
return price
}

View File

@@ -64,6 +64,12 @@ export const INITIAL_TOKENS_CONTEXT = {
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0x077d52B047735976dfdA76feF74d4d988AC25196'
},
'0xBA11D00c5f74255f56a5E366F4F77f5A186d7f55': {
[NAME]: 'BandToken',
[SYMBOL]: 'BAND',
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0x88616Cf228FFb3fB8ba336592A79A53De53D05eF'
},
'0x0D8775F648430679A709E98d2b0Cb6250d2887EF': {
[NAME]: 'Basic Attention Token',
[SYMBOL]: 'BAT',
@@ -82,6 +88,12 @@ export const INITIAL_TOKENS_CONTEXT = {
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0x87d80DBD37E551F58680B4217b23aF6a752DA83F'
},
'0x0327112423F3A68efdF1fcF402F6c5CB9f7C33fd': {
[NAME]: 'PieDAO BTC++',
[SYMBOL]: 'BTC++',
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0x0b5e26829B72654620cD431E685FD71ad956E58E'
},
'0x26E75307Fc0C021472fEb8F727839531F112f317': {
[NAME]: 'Crypto20',
[SYMBOL]: 'C20',
@@ -106,6 +118,12 @@ export const INITIAL_TOKENS_CONTEXT = {
[DECIMALS]: 8,
[EXCHANGE_ADDRESS]: '0x34E89740adF97C3A9D3f63Cc2cE4a914382c230b'
},
'0xaaAEBE6Fe48E54f431b0C390CfaF0b017d09D42d': {
[NAME]: 'Celsius',
[SYMBOL]: 'CEL',
[DECIMALS]: 4,
[EXCHANGE_ADDRESS]: '0x91dEbb54De02872a259C17699D9B794Bc949fed2'
},
'0x06AF07097C9Eeb7fD685c692751D5C66dB49c215': {
[NAME]: 'Chai',
[SYMBOL]: 'CHAI',
@@ -184,6 +202,12 @@ export const INITIAL_TOKENS_CONTEXT = {
[DECIMALS]: 8,
[EXCHANGE_ADDRESS]: '0x60a87cC7Fca7E53867facB79DA73181B1bB4238B'
},
'0x4a57E687b9126435a9B19E4A802113e266AdeBde': {
[NAME]: 'Flexacoin',
[SYMBOL]: 'FXC',
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0xB878876e0627E362fD3d1AFeEBdf0Bd69BbA1911'
},
'0x543Ff227F64Aa17eA132Bf9886cAb5DB55DCAddf': {
[NAME]: 'DAOstack',
[SYMBOL]: 'GEN',
@@ -208,8 +232,14 @@ export const INITIAL_TOKENS_CONTEXT = {
[DECIMALS]: 2,
[EXCHANGE_ADDRESS]: '0x929507CD3D90Ab11eC4822E9eB5A48eb3a178F19'
},
'0xF1290473E210b2108A85237fbCd7b6eb42Cc654F': {
[NAME]: 'HedgeTrade',
[SYMBOL]: 'HEDG',
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0xb5b46A2521048D7F2f9D9603eEB1B7aBf7d18886'
},
'0x493C57C4763932315A328269E1ADaD09653B9081': {
[NAME]: 'Fulcrum DAI iToken ',
[NAME]: 'Fulcrum DAI iToken',
[SYMBOL]: 'iDAI',
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0x3E0349F5D38414008B9Bb1907ea422739BE7CD4C'
@@ -220,18 +250,18 @@ export const INITIAL_TOKENS_CONTEXT = {
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0x81eeD7F1EcbD7FA9978fcc7584296Fb0C215Dc5C'
},
'0x3212b29E33587A00FB1C83346f5dBFA69A458923': {
[NAME]: 'The Tokenized Bitcoin',
[SYMBOL]: 'imBTC',
[DECIMALS]: 8,
[EXCHANGE_ADDRESS]: '0xFFcf45b540e6C9F094Ae656D2e34aD11cdfdb187'
},
'0x6fB3e0A217407EFFf7Ca062D46c26E5d60a14d69': {
[NAME]: 'IoTeX Network',
[SYMBOL]: 'IOTX',
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0x084f002671a5f03D5498B1e5fb15fc0cfee9a470'
},
'0x4Cd988AfBad37289BAAf53C13e98E2BD46aAEa8c': {
[NAME]: 'KEY',
[SYMBOL]: 'KEY',
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0x5780BcD22e3C08c4b6b5c47c406EA6DC53E278be'
},
'0x818Fc6C2Ec5986bc6E2CBf00939d90556aB12ce5': {
[NAME]: 'Kin',
[SYMBOL]: 'KIN',
@@ -304,6 +334,18 @@ export const INITIAL_TOKENS_CONTEXT = {
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0xE1b7AeC3639068b474bFbcB916580fc28A20717B'
},
'0xd15eCDCF5Ea68e3995b2D0527A0aE0a3258302F8': {
[NAME]: 'MachiX Token',
[SYMBOL]: 'MCX',
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0xc4c18dEC88A6576A8E345887fb1a229e97BA55E7'
},
'0xa3d58c4E56fedCae3a7c43A725aeE9A71F0ece4e': {
[NAME]: 'Metronome',
[SYMBOL]: 'MET',
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0x006B6e89eE1531cfE5b6d32da0d80CC30506A339'
},
'0x80f222a749a2e18Eb7f676D371F19ad7EFEEe3b7': {
[NAME]: 'Magnolia Token',
[SYMBOL]: 'MGN',
@@ -340,6 +382,12 @@ export const INITIAL_TOKENS_CONTEXT = {
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0x2Bf5A5bA29E60682fC56B2Fcf9cE07Bef4F6196f'
},
'0x985dd3D42De1e256d09e1c10F112bCCB8015AD41': {
[NAME]: 'OceanToken',
[SYMBOL]: 'OCEAN',
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0xa59cC1618D144ccAC2bfb46F61272CEbf00D90d5'
},
'0x4575f41308EC1483f3d399aa9a2826d74Da13Deb': {
[NAME]: 'Orchid',
[SYMBOL]: 'OXT',
@@ -382,6 +430,12 @@ export const INITIAL_TOKENS_CONTEXT = {
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0x755899F0540c3548b99E68C59AdB0f15d2695188'
},
'0x4a220E6096B25EADb88358cb44068A3248254675': {
[NAME]: 'Quant',
[SYMBOL]: 'QNT',
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0xc7EB739E2651484DAA1717433dE1736A6529cFcC'
},
'0x99ea4dB9EE77ACD40B119BD1dC4E33e1C070b80d': {
[NAME]: 'Quantstamp Token',
[SYMBOL]: 'QSP',
@@ -490,6 +544,12 @@ export const INITIAL_TOKENS_CONTEXT = {
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0xB944d13b2f4047fc7bd3F7013bcf01b115fb260d'
},
'0x8CE9137d39326AD0cD6491fb5CC0CbA0e089b6A9': {
[NAME]: 'Swipe',
[SYMBOL]: 'SXP',
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0x03c341408d0EDF502E702b9b24Ec305819357C56'
},
'0x00006100F7090010005F1bd7aE6122c3C2CF0090': {
[NAME]: 'TrueAUD',
[SYMBOL]: 'TAUD',
@@ -520,6 +580,12 @@ export const INITIAL_TOKENS_CONTEXT = {
[DECIMALS]: 8,
[EXCHANGE_ADDRESS]: '0xb6cFBf322db47D39331E306005DC7E5e6549942B'
},
'0x0Ba45A8b5d5575935B8158a88C631E9F9C95a2e5': {
[NAME]: 'Tellor Tributes',
[SYMBOL]: 'TRB',
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0xe28ffAC44B0c430aa3e62a9bC211f7d825D6c1f9'
},
'0xCb94be6f13A1182E4A4B6140cb7bf2025d28e41B': {
[NAME]: 'Trustcoin',
[SYMBOL]: 'TRST',
@@ -538,11 +604,17 @@ export const INITIAL_TOKENS_CONTEXT = {
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0x5048b9d01097498Fd72F3F14bC9Bc74A5aAc8fA7'
},
'0x09cabEC1eAd1c0Ba254B09efb3EE13841712bE14': {
[NAME]: 'Uniswap V1',
[SYMBOL]: 'UNI-V1:SAI',
'0x8400D94A5cb0fa0D041a3788e395285d61c9ee5e': {
[NAME]: 'UniBright',
[SYMBOL]: 'UBT',
[DECIMALS]: 8,
[EXCHANGE_ADDRESS]: '0xfc96e234d4B31C63051E707105fCC4aba37807Fa'
},
'0x04Fa0d235C4abf4BcF4787aF4CF447DE572eF828': {
[NAME]: 'UMA Voting Token v1',
[SYMBOL]: 'UMA',
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0x601c32E0580D3aef9437dB52D09f5a5D7E60eC22'
[EXCHANGE_ADDRESS]: '0x6264C8d158F32Bd8C01B8A0102b57dfcFCfb8561'
},
'0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48': {
[NAME]: 'USD//C',
@@ -556,6 +628,12 @@ export const INITIAL_TOKENS_CONTEXT = {
[DECIMALS]: 6,
[EXCHANGE_ADDRESS]: '0x7Ef7191AB91dDB4D7cC347fbFA170355acbaf02D'
},
'0xeb269732ab75A6fD61Ea60b06fE994cD32a83549': {
[NAME]: 'dForce',
[SYMBOL]: 'USDx',
[DECIMALS]: 18,
[EXCHANGE_ADDRESS]: '0xE5A69D694d0dF71a5EeA63432EE74f2c4465A56F'
},
'0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374': {
[NAME]: 'Veritaseum',
[SYMBOL]: 'VERI',

View File

@@ -13,7 +13,7 @@ import { ReactComponent as Plus } from '../../assets/images/plus-blue.svg'
import WarningCard from '../../components/WarningCard'
import { useWeb3React, useExchangeContract } from '../../hooks'
import { brokenTokens } from '../../constants'
import { brokenTokens, broken777Tokens } from '../../constants'
import { amountFormatter, calculateGasMargin } from '../../utils'
import { useTransactionAdder } from '../../contexts/Transactions'
import { useTokenDetails, INITIAL_TOKENS_CONTEXT } from '../../contexts/Tokens'
@@ -39,14 +39,14 @@ const BlueSpan = styled.span`
const NewExchangeWarning = styled.div`
margin-top: 1rem;
padding: 1rem;
margin-bottom: 2rem;
border: 1px solid rgba($pizazz-orange, 0.4);
background-color: rgba($pizazz-orange, 0.1);
border-radius: 1rem;
`
const NewExchangeWarningText = styled.div`
font-size: 0.75rem;
font-size: 0.8rem;
line-height: 1rem;
text-align: center;
@@ -228,6 +228,7 @@ export default function AddLiquidity({ params }) {
const [zeroDecimalError, setZeroDecimalError] = useState()
const [brokenTokenWarning, setBrokenTokenWarning] = useState()
const [broken777Warning, setBroken777Warning] = useState()
const { symbol, decimals, exchangeAddress } = useTokenDetails(outputCurrency)
const exchangeContract = useExchangeContract(exchangeAddress)
@@ -358,6 +359,9 @@ export default function AddLiquidity({ params }) {
if (brokenTokenWarning) {
contextualInfo = t('brokenToken')
isError = true
} else if (broken777Warning) {
contextualInfo = t('broken777')
isError = true
} else if (zeroDecimalError) {
contextualInfo = zeroDecimalError
} else if (inputError || outputError) {
@@ -443,6 +447,15 @@ export default function AddLiquidity({ params }) {
}
}, [outputCurrency])
useEffect(() => {
setBroken777Warning(false)
for (let i = 0; i < broken777Tokens.length; i++) {
if (broken777Tokens[i].toLowerCase() === outputCurrency.toLowerCase()) {
setBroken777Warning(true)
}
}
}, [outputCurrency])
useEffect(() => {
if (isNewExchange) {
setZeroDecimalError()
@@ -601,17 +614,6 @@ export default function AddLiquidity({ params }) {
}, [newOutputDetected, setShowOutputWarning])
return (
<>
{isNewExchange ? (
<NewExchangeWarning>
<NewExchangeWarningText>
<span role="img" aria-label="first-liquidity">
🚰
</span>{' '}
{t('firstLiquidity')}
</NewExchangeWarningText>
<NewExchangeWarningText>{t('initialExchangeRate', { symbol })}</NewExchangeWarningText>
</NewExchangeWarning>
) : null}
{showOutputWarning && (
<WarningCard
onDismiss={() => {
@@ -712,6 +714,24 @@ export default function AddLiquidity({ params }) {
</SummaryPanel>
</OversizedPanel>
{renderSummary()}
{isNewExchange ? (
<NewExchangeWarning>
<NewExchangeWarningText>
<span role="img" aria-label="first-liquidity">
🚰
</span>{' '}
{t('firstLiquidity')}
</NewExchangeWarningText>
<NewExchangeWarningText style={{ marginTop: '10px' }}>
{t('initialExchangeRate', { symbol })}
</NewExchangeWarningText>
</NewExchangeWarning>
) : null}
{isNewExchange && (
<NewExchangeWarningText style={{ textAlign: 'center', marginTop: '10px' }}>
{t('initialWarning')}
</NewExchangeWarningText>
)}
<Flex>
<Button disabled={!isValid} onClick={onAddLiquidity}>
{t('addLiquidity')}

View File

@@ -406,6 +406,7 @@ export default function RemoveLiquidity({ params }) {
value={value}
errorMessage={inputError}
selectedTokenAddress={outputCurrency}
hideETH={true}
/>
<OversizedPanel>
<DownArrowBackground>

1
src/react-app-env.d.ts vendored Normal file
View File

@@ -0,0 +1 @@
/// <reference types="react-scripts" />

25
tsconfig.json Normal file
View File

@@ -0,0 +1,25 @@
{
"compilerOptions": {
"target": "es5",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react"
},
"include": [
"src"
]
}

546
yarn.lock
View File

@@ -1072,6 +1072,11 @@
lodash "^4.17.13"
to-fast-properties "^2.0.0"
"@chaitanyapotti/random-id@^1.0.3":
version "1.0.3"
resolved "https://registry.yarnpkg.com/@chaitanyapotti/random-id/-/random-id-1.0.3.tgz#f52f647cfe9f79fc7723ea2b01b0ad3889204002"
integrity sha512-xiVWA2vTL3jQeuZ+yebXAtwIeEbh/13RAFxvRq0YxeUc02RBOGyC9eyDKXjwlN0uxPtnEwWxsELkSwnaH5kxjg==
"@cnakazawa/watch@^1.0.3":
version "1.0.3"
resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef"
@@ -1359,6 +1364,16 @@
"@types/istanbul-reports" "^1.1.1"
"@types/yargs" "^13.0.0"
"@jest/types@^25.1.0":
version "25.1.0"
resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.1.0.tgz#b26831916f0d7c381e11dbb5e103a72aed1b4395"
integrity sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA==
dependencies:
"@types/istanbul-lib-coverage" "^2.0.0"
"@types/istanbul-reports" "^1.1.1"
"@types/yargs" "^15.0.0"
chalk "^3.0.0"
"@ledgerhq/devices@^4.78.0":
version "4.78.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-4.78.0.tgz#149b572f0616096e2bd5eb14ce14d0061c432be6"
@@ -1677,6 +1692,49 @@
dependencies:
defer-to-connect "^1.0.1"
"@toruslabs/fetch-node-details@^2.0.1":
version "2.0.1"
resolved "https://registry.yarnpkg.com/@toruslabs/fetch-node-details/-/fetch-node-details-2.0.1.tgz#7caa15c54a2ace9f41fe0bb36babeb092be19d70"
integrity sha512-1rm0tO9bMms7qtvwtY8Znz6lOhqtaXe0TEgFvcceYJjkgU8HAMcYZDriooanDiHrdZ0DDvY4GypKVDidmZSBTw==
dependencies:
web3-eth-contract "^1.2.5"
web3-utils "^1.2.5"
"@toruslabs/torus-embed@^0.2.14":
version "0.2.14"
resolved "https://registry.yarnpkg.com/@toruslabs/torus-embed/-/torus-embed-0.2.14.tgz#cf2a01f5553c8e86b28f3b487da39d094f8d7266"
integrity sha512-c/AVy2FzvukVceNzAUcO8f500fl6wR+nfavUfD+BMq8qhka5uMKwdyxda21wVudgwdgfcIu+SDga8iDlY+W1bQ==
dependencies:
"@chaitanyapotti/random-id" "^1.0.3"
"@toruslabs/fetch-node-details" "^2.0.1"
"@toruslabs/torus.js" "^1.0.6"
eth-json-rpc-errors "^2.0.1"
fast-deep-equal "^3.1.1"
json-rpc-engine "^5.1.6"
json-rpc-middleware-stream "^2.1.1"
loglevel "^1.6.6"
obj-multiplex "^1.0.0"
obs-store "^4.0.3"
post-message-stream "^3.0.0"
pump "^3.0.0"
readable-stream "^3.5.0"
safe-event-emitter "^1.0.1"
sri-toolbox "^0.2.0"
through2 "^3.0.1"
web3 "^0.20.7"
"@toruslabs/torus.js@^1.0.6":
version "1.0.6"
resolved "https://registry.yarnpkg.com/@toruslabs/torus.js/-/torus.js-1.0.6.tgz#b8ad8b47c49946072695db537234811b82c70bf0"
integrity sha512-5vC3e5Q4J1I7NvGaTpnb3i77/88i/x5dS5b1I0HYZaBYhHbixWOCHisCWie7PuHh3/oSG66qiJiiCw0Y4xyp5g==
dependencies:
bn.js "^5.1.1"
eccrypto "^1.1.3"
elliptic "^6.5.2"
json-stable-stringify "^1.0.1"
loglevel "^1.6.6"
web3-utils "^1.2.5"
"@types/babel__core@^7.1.0":
version "7.1.3"
resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30"
@@ -1717,6 +1775,18 @@
dependencies:
"@types/node" "*"
"@types/bn.js@^4.11.4":
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==
dependencies:
"@types/node" "*"
"@types/color-name@^1.1.1":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
"@types/eslint-visitor-keys@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d"
@@ -1770,6 +1840,14 @@
"@types/istanbul-lib-coverage" "*"
"@types/istanbul-lib-report" "*"
"@types/jest@^25.1.3":
version "25.1.3"
resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.1.3.tgz#9b0b5addebccfb631175870be8ba62182f1bc35a"
integrity sha512-jqargqzyJWgWAJCXX96LBGR/Ei7wQcZBvRv0PLEu9ZByMfcs23keUJrKv9FMR6YZf9YCbfqDqgmY+JUBsnqhrg==
dependencies:
jest-diff "^25.1.0"
pretty-format "^25.1.0"
"@types/json-schema@^7.0.3":
version "7.0.4"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339"
@@ -1790,6 +1868,16 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.13.tgz#ccebcdb990bd6139cd16e84c39dc2fb1023ca90c"
integrity sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg==
"@types/node@^12.6.1":
version "12.12.32"
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.32.tgz#0ccc836d273e8a3cddf568daf22729cfa57c1925"
integrity sha512-44/reuCrwiQEsXud3I5X3sqI5jIXAmHB5xoiyKUw965olNHF3IWKjBLKK3F9LOSUZmK+oDt8jmyO637iX+hMgA==
"@types/node@^13.7.4":
version "13.7.4"
resolved "https://registry.yarnpkg.com/@types/node/-/node-13.7.4.tgz#76c3cb3a12909510f52e5dc04a6298cdf9504ffd"
integrity sha512-oVeL12C6gQS/GAExndigSaLxTrKpQPxewx9bOcwfvJiJge4rr7wNaph4J+ns5hrmIV2as5qxqN8YKthn9qh0jw==
"@types/parse-json@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
@@ -1805,6 +1893,13 @@
resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==
"@types/react-dom@^16.9.5":
version "16.9.5"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.5.tgz#5de610b04a35d07ffd8f44edad93a71032d9aaa7"
integrity sha512-BX6RQ8s9D+2/gDhxrj8OW+YD4R+8hj7FEM/OJHGNR0KipE1h1mSsf39YeyC81qafkq+N3rU3h3RFbLSwE5VqUg==
dependencies:
"@types/react" "*"
"@types/react@*":
version "16.9.17"
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.17.tgz#58f0cc0e9ec2425d1441dd7b623421a867aa253e"
@@ -1813,6 +1908,14 @@
"@types/prop-types" "*"
csstype "^2.2.0"
"@types/react@^16.9.22":
version "16.9.22"
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.22.tgz#f0288c92d94e93c4b43e3f5633edf788b2c040ae"
integrity sha512-7OSt4EGiLvy0h5R7X+r0c7S739TCU/LvWbkNOrm10lUwNHe7XPz5OLhLOSZeCkqO9JSCly1NkYJ7ODTUqVnHJQ==
dependencies:
"@types/prop-types" "*"
csstype "^2.2.0"
"@types/stack-utils@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e"
@@ -1837,6 +1940,13 @@
dependencies:
"@types/yargs-parser" "*"
"@types/yargs@^15.0.0":
version "15.0.3"
resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.3.tgz#41453a0bc7ab393e995d1f5451455638edbd2baf"
integrity sha512-XCMQRK6kfpNBixHLyHUsGmXrpEmFFxzMrcnSXFMziHd8CoNJo8l16FkHyQq4x+xbM7E2XL83/O78OD8u+iZTdQ==
dependencies:
"@types/yargs-parser" "*"
"@typescript-eslint/eslint-plugin@^2.8.0":
version "2.14.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.14.0.tgz#c74447400537d4eb7aae1e31879ab43e6c662a8a"
@@ -1941,6 +2051,17 @@
web3-provider-engine "github:walletconnect/web3-provider-engine"
xhr2-cookies "^1.1.0"
"@web3-js/websocket@^1.0.29":
version "1.0.30"
resolved "https://registry.yarnpkg.com/@web3-js/websocket/-/websocket-1.0.30.tgz#9ea15b7b582cf3bf3e8bc1f4d3d54c0731a87f87"
integrity sha512-fDwrD47MiDrzcJdSeTLF75aCcxVVt8B1N74rA+vh2XCAvFy4tEWJjtnUtj2QG7/zlQ6g9cQ88bZFBxwd9/FmtA==
dependencies:
debug "^2.2.0"
es5-ext "^0.10.50"
nan "^2.14.0"
typedarray-to-buffer "^3.1.5"
yaeti "^0.0.6"
"@web3-react/abstract-connector@^6.0.2":
version "6.0.2"
resolved "https://registry.yarnpkg.com/@web3-react/abstract-connector/-/abstract-connector-6.0.2.tgz#df4b5af805364283fdfb54e1174ced537783d790"
@@ -1948,6 +2069,13 @@
dependencies:
"@web3-react/types" "^6.0.2"
"@web3-react/abstract-connector@^6.0.7":
version "6.0.7"
resolved "https://registry.yarnpkg.com/@web3-react/abstract-connector/-/abstract-connector-6.0.7.tgz#401b3c045f1e0fab04256311be49d5144e9badc6"
integrity sha512-RhQasA4Ox8CxUC0OENc1AJJm8UTybu/oOCM61Zjg6y0iF7Z0sqv1Ai1VdhC33hrQpA8qSBgoXN9PaP8jKmtdqg==
dependencies:
"@web3-react/types" "^6.0.7"
"@web3-react/core@^6.0.2":
version "6.0.2"
resolved "https://registry.yarnpkg.com/@web3-react/core/-/core-6.0.2.tgz#3824187557159b1015d861bd6bdbb8a6a13209d0"
@@ -1997,11 +2125,25 @@
"@web3-react/types" "^6.0.2"
tiny-invariant "^1.0.6"
"@web3-react/torus-connector@^6.0.8":
version "6.0.8"
resolved "https://registry.yarnpkg.com/@web3-react/torus-connector/-/torus-connector-6.0.8.tgz#7b087c5238d06f76ca7db0e777585261383ffa40"
integrity sha512-jbQBbOHME3YU0MFBt2UHIpS5M3xNNRF9xBG325YIC3UkJEM1fqPgD+q0niAQyRGpK/BHHAmm/7lxF6VEtO9pgQ==
dependencies:
"@toruslabs/torus-embed" "^0.2.14"
"@web3-react/abstract-connector" "^6.0.7"
"@web3-react/types" "^6.0.7"
"@web3-react/types@^6.0.2":
version "6.0.2"
resolved "https://registry.yarnpkg.com/@web3-react/types/-/types-6.0.2.tgz#fe451383cc6fd88128c7608e3cdfe3b0c42caff3"
integrity sha512-zDPcjWdYONgpL6o3SQPMQE+pIDBcIsWMP/FqFRIFmPjB9h+ONHXNID74pf3h++gZGfIkl9cDtTvF8kQudn5Lew==
"@web3-react/types@^6.0.7":
version "6.0.7"
resolved "https://registry.yarnpkg.com/@web3-react/types/-/types-6.0.7.tgz#34a6204224467eedc6123abaf55fbb6baeb2809f"
integrity sha512-ofGmfDhxmNT1/P/MgVa8IKSkCStFiyvXe+U5tyZurKdrtTDFU+wJ/LxClPDtFerWpczNFPUSrKcuhfPX1sI6+A==
"@web3-react/walletconnect-connector@^6.0.2":
version "6.0.2"
resolved "https://registry.yarnpkg.com/@web3-react/walletconnect-connector/-/walletconnect-connector-6.0.2.tgz#4f43528dc6dbf90f0464dc64a45a2a8b5b701326"
@@ -2241,21 +2383,21 @@ acorn-walk@^6.0.1:
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c"
integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==
acorn@7.1.0, acorn@^7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c"
integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==
acorn@^5.5.3:
version "5.7.3"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
version "5.7.4"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e"
integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==
acorn@^6.0.1, acorn@^6.0.4, acorn@^6.2.1:
version "6.4.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784"
integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==
acorn@^7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c"
integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==
address@1.1.2, address@^1.0.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6"
@@ -2383,6 +2525,14 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1:
dependencies:
color-convert "^1.9.0"
ansi-styles@^4.0.0, ansi-styles@^4.1.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
dependencies:
"@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"
@@ -3467,6 +3617,10 @@ bignumber.js@^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@git+https://github.com/frozeman/bignumber.js-nolookahead.git":
version "2.0.7"
resolved "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934"
bignumber.js@~8.0.2:
version "8.0.2"
resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-8.0.2.tgz#d8c4e1874359573b1ef03011a2d861214aeef137"
@@ -3548,7 +3702,7 @@ 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.
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
bn.js@^5.0.0:
bn.js@^5.0.0, bn.js@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.1.tgz#48efc4031a9c4041b9c99c6941d903463ab62eb5"
integrity sha512-IUTD/REb78Z2eodka1QZyyEk66pciRcP6Sroka0aI3tG/iwIdYLrBD62RsubR7vqdt3WyX8p4jxeatzmRSphtA==
@@ -4038,6 +4192,14 @@ chalk@^1.1.3:
strip-ansi "^3.0.0"
supports-color "^2.0.0"
chalk@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
dependencies:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
chardet@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
@@ -4269,12 +4431,19 @@ color-convert@^1.3.0, color-convert@^1.9.0, color-convert@^1.9.1:
dependencies:
color-name "1.1.3"
color-convert@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
dependencies:
color-name "~1.1.4"
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
color-name@^1.0.0:
color-name@^1.0.0, color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
@@ -4627,6 +4796,11 @@ crypto-browserify@3.12.0, crypto-browserify@^3.11.0:
randombytes "^2.0.0"
randomfill "^1.0.3"
crypto-js@^3.1.4:
version "3.1.8"
resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.1.8.tgz#715f070bf6014f2ae992a98b3929258b713f08d5"
integrity sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=
css-blank-pseudo@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5"
@@ -5180,6 +5354,11 @@ diff-sequences@^24.9.0:
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5"
integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==
diff-sequences@^25.1.0:
version "25.1.0"
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.1.0.tgz#fd29a46f1c913fd66c22645dc75bffbe43051f32"
integrity sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==
diffie-hellman@^5.0.0:
version "5.0.3"
resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
@@ -5366,6 +5545,18 @@ ecc-jsbn@~0.1.1:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
eccrypto@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/eccrypto/-/eccrypto-1.1.3.tgz#010cb4e9d239ce9752b82c0ac6d8af207fffaf3e"
integrity sha512-Xtyj039Xp2NDZwoe9IcD7pT1EwM4DILdxPCN2H7Rk1wgJNtTkFpk+cpX1QpuHTMaIhkatOBlGGKzGw/DUCDdqg==
dependencies:
acorn "7.1.0"
elliptic "6.5.1"
es6-promise "4.2.8"
nan "2.14.0"
optionalDependencies:
secp256k1 "3.7.1"
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@@ -5386,7 +5577,20 @@ elliptic@6.3.3:
hash.js "^1.0.0"
inherits "^2.0.1"
elliptic@6.5.2, elliptic@^6.0.0, elliptic@^6.4.0, elliptic@^6.5.2:
elliptic@6.5.1:
version "6.5.1"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.1.tgz#c380f5f909bf1b9b4428d028cd18d3b0efd6b52b"
integrity sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==
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.5.2, elliptic@^6.0.0, elliptic@^6.4.0, elliptic@^6.4.1, elliptic@^6.5.2:
version "6.5.2"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762"
integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==
@@ -5437,7 +5641,7 @@ encoding@^0.1.11:
dependencies:
iconv-lite "~0.4.13"
end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.0, end-of-stream@^1.4.1:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
@@ -5521,6 +5725,11 @@ es6-iterator@2.0.3, es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.
es5-ext "^0.10.35"
es6-symbol "^3.1.1"
es6-promise@4.2.8:
version "4.2.8"
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
es6-symbol@^3.1.1, es6-symbol@~3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
@@ -5830,6 +6039,13 @@ eth-json-rpc-errors@^2.0.0:
dependencies:
fast-safe-stringify "^2.0.6"
eth-json-rpc-errors@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/eth-json-rpc-errors/-/eth-json-rpc-errors-2.0.1.tgz#e7a4c4e3c76913dff26dbc021966c72b2822e0f2"
integrity sha512-ldF9fdzkdHAgTWmqh/bgHi7uH+8icAyjcEdFOBGD32zTWd7J66VDo0rBaiaQPowXitiyAcs1R23Mje1gkdIofA==
dependencies:
fast-safe-stringify "^2.0.6"
eth-json-rpc-filters@^4.0.2:
version "4.1.1"
resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-4.1.1.tgz#15277c66790236d85f798f4d7dc6bab99a798cd2"
@@ -5985,6 +6201,13 @@ ethashjs@~0.0.7:
ethereumjs-util "^4.0.1"
miller-rabin "^4.0.0"
ethereum-bloom-filters@^1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.6.tgz#9cdebb3ec20de96ec4a434c6bad6ea5a513037aa"
integrity sha512-dE9CGNzgOOsdh7msZirvv8qjHtnHpvBlKe2647kM8v+yeF71IRso55jpojemvHV+jMjr48irPWxMRaHuOWzAFA==
dependencies:
js-sha3 "^0.8.0"
ethereum-common@0.0.18, ethereum-common@^0.0.18:
version "0.0.18"
resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f"
@@ -6534,6 +6757,11 @@ fast-deep-equal@^2.0.1:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
fast-deep-equal@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4"
integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==
fast-glob@^2.0.2:
version "2.2.7"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d"
@@ -7415,6 +7643,11 @@ has-flag@^3.0.0:
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
has-flag@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
has-symbol-support-x@^1.4.1:
version "1.4.2"
resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
@@ -8530,6 +8763,16 @@ jest-diff@^24.9.0:
jest-get-type "^24.9.0"
pretty-format "^24.9.0"
jest-diff@^25.1.0:
version "25.1.0"
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.1.0.tgz#58b827e63edea1bc80c1de952b80cec9ac50e1ad"
integrity sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==
dependencies:
chalk "^3.0.0"
diff-sequences "^25.1.0"
jest-get-type "^25.1.0"
pretty-format "^25.1.0"
jest-docblock@^24.3.0:
version "24.9.0"
resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2"
@@ -8585,6 +8828,11 @@ jest-get-type@^24.9.0:
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e"
integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==
jest-get-type@^25.1.0:
version "25.1.0"
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.1.0.tgz#1cfe5fc34f148dc3a8a3b7275f6b9ce9e2e8a876"
integrity sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==
jest-haste-map@^24.9.0:
version "24.9.0"
resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d"
@@ -8865,6 +9113,11 @@ js-sha3@^0.7.0:
resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.7.0.tgz#0a5c57b36f79882573b2d84051f8bb85dd1bd63a"
integrity sha512-Wpks3yBDm0UcL5qlVhwW9Jr9n9i4FfeWBFOOXP5puDS/SiudJGhw7DPyBqn3487qD4F0lsC0q3zxink37f7zeA==
js-sha3@^0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -8999,6 +9252,16 @@ json-rpc-engine@^5.0.0, json-rpc-engine@^5.1.3:
promise-to-callback "^1.0.0"
safe-event-emitter "^1.0.1"
json-rpc-engine@^5.1.6:
version "5.1.6"
resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.1.6.tgz#3823c1e227657ac5f22a36351db5bb76fa70cf38"
integrity sha512-9nDeIIu6o7cvzWRrHNuNi+TiGe+YWOp3ZQkHtpPnQzXuX8Y5ZU2Oot3FDI+DaQyXIqQ6SjtM6rixDOJTjjA8NA==
dependencies:
async "^2.0.1"
eth-json-rpc-errors "^2.0.0"
promise-to-callback "^1.0.0"
safe-event-emitter "^1.0.1"
json-rpc-error@2.0.0, json-rpc-error@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02"
@@ -9006,6 +9269,14 @@ json-rpc-error@2.0.0, json-rpc-error@^2.0.0:
dependencies:
inherits "^2.0.1"
json-rpc-middleware-stream@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/json-rpc-middleware-stream/-/json-rpc-middleware-stream-2.1.1.tgz#06e5409e201e7ddeae47bef29f7059eafd4d5325"
integrity sha512-WZheufPN+/RKkjXQP3lK5tFYblqG0n+oYv5qpammwwY2vsJRB7mM4Txhr4ajzvYEZi1UkENnplrmaYiqaqafaA==
dependencies:
readable-stream "^2.3.3"
safe-event-emitter "^1.0.1"
json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8"
@@ -9539,7 +9810,7 @@ lodash@4.17.14:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
loglevel@^1.6.4:
loglevel@^1.6.4, loglevel@^1.6.6:
version "1.6.6"
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.6.tgz#0ee6300cc058db6b3551fa1c4bf73b83bb771312"
integrity sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==
@@ -10084,7 +10355,7 @@ nan@2.13.2:
resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7"
integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==
nan@^2.0.8, nan@^2.11.0, nan@^2.12.1, nan@^2.13.2, nan@^2.14.0, nan@^2.2.1:
nan@2.14.0, nan@^2.0.8, nan@^2.11.0, nan@^2.12.1, nan@^2.13.2, nan@^2.14.0, nan@^2.2.1:
version "2.14.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
@@ -10350,6 +10621,15 @@ oauth-sign@~0.9.0:
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
obj-multiplex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/obj-multiplex/-/obj-multiplex-1.0.0.tgz#2f2ae6bfd4ae11befe742ea9ea5b36636eabffc1"
integrity sha1-Lyrmv9SuEb7+dC6p6ls2Y26r/8E=
dependencies:
end-of-stream "^1.4.0"
once "^1.4.0"
readable-stream "^2.3.3"
object-assign@^4, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
@@ -10489,6 +10769,16 @@ oboe@2.1.4:
dependencies:
http-https "^1.0.0"
obs-store@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/obs-store/-/obs-store-4.0.3.tgz#b632ec7814baa604fae084a4c97e87c0b7a6d14c"
integrity sha512-+mm13kCRDv6IcvUDKTw0LIy5+dQhIktYaR/RwwZUFzOTi/fjMaNBnk42Adb94qZqJ00qWkjhQSZH7MXlKnTi8A==
dependencies:
readable-stream "^2.2.2"
safe-event-emitter "^1.0.1"
through2 "^2.0.3"
xtend "^4.0.1"
obuf@^1.0.0, obuf@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
@@ -11070,6 +11360,13 @@ posix-character-classes@^0.1.0:
resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
post-message-stream@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/post-message-stream/-/post-message-stream-3.0.0.tgz#90d9f54bd209e6b6f5d74795b87588205b547048"
integrity sha1-kNn1S9IJ5rb110eVuHWIIFtUcEg=
dependencies:
readable-stream "^2.1.4"
postcss-attribute-case-insensitive@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.1.tgz#b2a721a0d279c2f9103a36331c88981526428cc7"
@@ -11801,6 +12098,16 @@ pretty-format@^24.9.0:
ansi-styles "^3.2.0"
react-is "^16.8.4"
pretty-format@^25.1.0:
version "25.1.0"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.1.0.tgz#ed869bdaec1356fc5ae45de045e2c8ec7b07b0c8"
integrity sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==
dependencies:
"@jest/types" "^25.1.0"
ansi-regex "^5.0.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"
@@ -12073,7 +12380,7 @@ raf@^3.4.1:
dependencies:
performance-now "^2.1.0"
randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6:
randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
@@ -12224,7 +12531,7 @@ react-i18next@^10.7.0:
"@babel/runtime" "^7.3.1"
html-parse-stringify2 "2.0.1"
react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4:
react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4:
version "16.12.0"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c"
integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==
@@ -12422,7 +12729,7 @@ read-pkg@^3.0.0:
normalize-package-data "^2.3.2"
path-type "^3.0.0"
"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
version "2.3.6"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
@@ -12435,6 +12742,15 @@ read-pkg@^3.0.0:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
"readable-stream@2 || 3", readable-stream@^3.0.1, readable-stream@^3.0.6, readable-stream@^3.1.1:
version "3.4.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc"
integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
readable-stream@^1.0.33:
version "1.1.14"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
@@ -12445,10 +12761,10 @@ readable-stream@^1.0.33:
isarray "0.0.1"
string_decoder "~0.10.x"
readable-stream@^3.0.1, readable-stream@^3.0.6, readable-stream@^3.1.1:
version "3.4.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc"
integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==
readable-stream@^3.5.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.5.0.tgz#465d70e6d1087f6162d079cd0b5db7fbebfd1606"
integrity sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
@@ -13079,6 +13395,20 @@ scryptsy@^1.2.1:
dependencies:
pbkdf2 "^3.0.3"
secp256k1@3.7.1:
version "3.7.1"
resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.7.1.tgz#12e473e0e9a7c2f2d4d4818e722ad0e14cc1e2f1"
integrity sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==
dependencies:
bindings "^1.5.0"
bip66 "^1.1.5"
bn.js "^4.11.8"
create-hash "^1.2.0"
drbg.js "^1.0.1"
elliptic "^6.4.1"
nan "^2.14.0"
safe-buffer "^5.1.2"
secp256k1@^3.0.1:
version "3.8.0"
resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d"
@@ -13552,6 +13882,11 @@ sprintf-js@~1.0.2:
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
sri-toolbox@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/sri-toolbox/-/sri-toolbox-0.2.0.tgz#a7fea5c3fde55e675cf1c8c06f3ebb5c2935835e"
integrity sha1-p/6lw/3lXmdc8cjAbz67XCk1g14=
sshpk@^1.7.0:
version "1.16.1"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
@@ -13911,6 +14246,13 @@ supports-color@^6.1.0:
dependencies:
has-flag "^3.0.0"
supports-color@^7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
dependencies:
has-flag "^4.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"
@@ -14122,6 +14464,13 @@ through2@^2.0.0, through2@^2.0.3, through2@~2.0.0:
readable-stream "~2.3.6"
xtend "~4.0.1"
through2@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a"
integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==
dependencies:
readable-stream "2 || 3"
through@^2.3.6, through@^2.3.8, through@~2.3.4, through@~2.3.8:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
@@ -14372,6 +14721,11 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
typescript@^3.8.2:
version "3.8.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.2.tgz#91d6868aaead7da74f493c553aeff76c0c0b1d5a"
integrity sha512-EgOVgL/4xfVrCMbhYKUQTdF37SQn4Iw73H5BgCrF1Abdun7Kwy/QZsE/ssAy0y4LxBbvua3PIbFsbRczWWnDdQ==
typewise-core@^1.2, typewise-core@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195"
@@ -14641,6 +14995,11 @@ utf8@3.0.0, utf8@^3.0.0:
resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1"
integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==
utf8@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.2.tgz#1fa0d9270e9be850d9b05027f63519bf46457d96"
integrity sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=
util-deprecate@^1.0.1, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
@@ -14872,6 +15231,15 @@ web3-core-helpers@1.2.1:
web3-eth-iban "1.2.1"
web3-utils "1.2.1"
web3-core-helpers@1.2.6:
version "1.2.6"
resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.6.tgz#7aacd25bf8015adcdfc0f3243d0dcfdff0373f7d"
integrity sha512-gYKWmC2HmO7RcDzpo4L1K8EIoy5L8iubNDuTC6q69UxczwqKF/Io0kbK/1Z10Av++NlzOSiuyGp2gc4t4UOsDw==
dependencies:
underscore "1.9.1"
web3-eth-iban "1.2.6"
web3-utils "1.2.6"
web3-core-method@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.1.tgz#9df1bafa2cd8be9d9937e01c6a47fc768d15d90a"
@@ -14883,6 +15251,17 @@ web3-core-method@1.2.1:
web3-core-subscriptions "1.2.1"
web3-utils "1.2.1"
web3-core-method@1.2.6:
version "1.2.6"
resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.6.tgz#f5a3e4d304abaf382923c8ab88ec8eeef45c1b3b"
integrity sha512-r2dzyPEonqkBg7Mugq5dknhV5PGaZTHBZlS/C+aMxNyQs3T3eaAsCTqlQDitwNUh/sUcYPEGF0Vo7ahYK4k91g==
dependencies:
underscore "1.9.1"
web3-core-helpers "1.2.6"
web3-core-promievent "1.2.6"
web3-core-subscriptions "1.2.6"
web3-utils "1.2.6"
web3-core-promievent@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.1.tgz#003e8a3eb82fb27b6164a6d5b9cad04acf733838"
@@ -14891,6 +15270,14 @@ web3-core-promievent@1.2.1:
any-promise "1.3.0"
eventemitter3 "3.1.2"
web3-core-promievent@1.2.6:
version "1.2.6"
resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.6.tgz#b1550a3a4163e48b8b704c1fe4b0084fc2dad8f5"
integrity sha512-km72kJef/qtQNiSjDJJVHIZvoVOm6ytW3FCYnOcCs7RIkviAb5JYlPiye0o4pJOLzCXYID7DK7Q9bhY8qWb1lw==
dependencies:
any-promise "1.3.0"
eventemitter3 "3.1.2"
web3-core-requestmanager@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.1.tgz#fa2e2206c3d738db38db7c8fe9c107006f5c6e3d"
@@ -14902,6 +15289,17 @@ web3-core-requestmanager@1.2.1:
web3-providers-ipc "1.2.1"
web3-providers-ws "1.2.1"
web3-core-requestmanager@1.2.6:
version "1.2.6"
resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.6.tgz#5808c0edc0d6e2991a87b65508b3a1ab065b68ec"
integrity sha512-QU2cbsj9Dm0r6om40oSwk8Oqbp3wTa08tXuMpSmeOTkGZ3EMHJ1/4LiJ8shwg1AvPMrKVU0Nri6+uBNCdReZ+g==
dependencies:
underscore "1.9.1"
web3-core-helpers "1.2.6"
web3-providers-http "1.2.6"
web3-providers-ipc "1.2.6"
web3-providers-ws "1.2.6"
web3-core-subscriptions@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.1.tgz#8c2368a839d4eec1c01a4b5650bbeb82d0e4a099"
@@ -14911,6 +15309,15 @@ web3-core-subscriptions@1.2.1:
underscore "1.9.1"
web3-core-helpers "1.2.1"
web3-core-subscriptions@1.2.6:
version "1.2.6"
resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.6.tgz#9d44189e2321f8f1abc31f6c09103b5283461b57"
integrity sha512-M0PzRrP2Ct13x3wPulFtc5kENH4UtnPxO9YxkfQlX2WRKENWjt4Rfq+BCVGYEk3rTutDfWrjfzjmqMRvXqEY5Q==
dependencies:
eventemitter3 "3.1.2"
underscore "1.9.1"
web3-core-helpers "1.2.6"
web3-core@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.1.tgz#7278b58fb6495065e73a77efbbce781a7fddf1a9"
@@ -14921,6 +15328,18 @@ web3-core@1.2.1:
web3-core-requestmanager "1.2.1"
web3-utils "1.2.1"
web3-core@1.2.6:
version "1.2.6"
resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.6.tgz#bb42a1d7ae49a7258460f0d95ddb00906f59ef92"
integrity sha512-y/QNBFtr5cIR8vxebnotbjWJpOnO8LDYEAzZjeRRUJh2ijmhjoYk7dSNx9ExgC0UCfNFRoNCa9dGRu/GAxwRlw==
dependencies:
"@types/bn.js" "^4.11.4"
"@types/node" "^12.6.1"
web3-core-helpers "1.2.6"
web3-core-method "1.2.6"
web3-core-requestmanager "1.2.6"
web3-utils "1.2.6"
web3-eth-abi@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.1.tgz#9b915b1c9ebf82f70cca631147035d5419064689"
@@ -14930,6 +15349,15 @@ web3-eth-abi@1.2.1:
underscore "1.9.1"
web3-utils "1.2.1"
web3-eth-abi@1.2.6:
version "1.2.6"
resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.6.tgz#b495383cc5c0d8e2857b26e7fe25606685983b25"
integrity sha512-w9GAyyikn8nSifSDZxAvU9fxtQSX+W2xQWMmrtTXmBGCaE4/ywKOSPAO78gq8AoU4Wq5yqVGKZLLbfpt7/sHlA==
dependencies:
ethers "4.0.0-beta.3"
underscore "1.9.1"
web3-utils "1.2.6"
web3-eth-accounts@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.1.tgz#2741a8ef337a7219d57959ac8bd118b9d68d63cf"
@@ -14961,6 +15389,21 @@ web3-eth-contract@1.2.1:
web3-eth-abi "1.2.1"
web3-utils "1.2.1"
web3-eth-contract@^1.2.5:
version "1.2.6"
resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.6.tgz#39111543960035ed94c597a239cf5aa1da796741"
integrity sha512-ak4xbHIhWgsbdPCkSN+HnQc1SH4c856y7Ly+S57J/DQVzhFZemK5HvWdpwadJrQTcHET3ZeId1vq3kmW7UYodw==
dependencies:
"@types/bn.js" "^4.11.4"
underscore "1.9.1"
web3-core "1.2.6"
web3-core-helpers "1.2.6"
web3-core-method "1.2.6"
web3-core-promievent "1.2.6"
web3-core-subscriptions "1.2.6"
web3-eth-abi "1.2.6"
web3-utils "1.2.6"
web3-eth-ens@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.1.tgz#a0e52eee68c42a8b9865ceb04e5fb022c2d971d5"
@@ -14983,6 +15426,14 @@ web3-eth-iban@1.2.1:
bn.js "4.11.8"
web3-utils "1.2.1"
web3-eth-iban@1.2.6:
version "1.2.6"
resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.6.tgz#0b22191fd1aa6e27f7ef0820df75820bfb4ed46b"
integrity sha512-TPMc3BW9Iso7H+9w+ytbqHK9wgOmtocyCD3PaAe5Eie50KQ/j7ThA60dGJnxItVo6yyRv5pZAYxPVob9x/fJlg==
dependencies:
bn.js "4.11.8"
web3-utils "1.2.6"
web3-eth-personal@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.1.tgz#244e9911b7b482dc17c02f23a061a627c6e47faf"
@@ -15110,6 +15561,14 @@ web3-providers-http@1.2.1:
web3-core-helpers "1.2.1"
xhr2-cookies "1.1.0"
web3-providers-http@1.2.6:
version "1.2.6"
resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.6.tgz#3c7b1252751fb37e53b873fce9dbb6340f5e31d9"
integrity sha512-2+SaFCspb5f82QKuHB3nEPQOF9iSWxRf7c18fHtmnLNVkfG9SwLN1zh67bYn3tZGUdOI3gj8aX4Uhfpwx9Ezpw==
dependencies:
web3-core-helpers "1.2.6"
xhr2-cookies "1.1.0"
web3-providers-ipc@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.1.tgz#017bfc687a8fc5398df2241eb98f135e3edd672c"
@@ -15119,6 +15578,15 @@ web3-providers-ipc@1.2.1:
underscore "1.9.1"
web3-core-helpers "1.2.1"
web3-providers-ipc@1.2.6:
version "1.2.6"
resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.6.tgz#adabab5ac66b3ff8a26c7dc97af3f1a6a7609701"
integrity sha512-b0Es+/GTZyk5FG3SgUDW+2/mBwJAXWt5LuppODptiOas8bB2khLjG6+Gm1K4uwOb+1NJGPt5mZZ8Wi7vibtQ+A==
dependencies:
oboe "2.1.4"
underscore "1.9.1"
web3-core-helpers "1.2.6"
web3-providers-ws@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.1.tgz#2d941eaf3d5a8caa3214eff8dc16d96252b842cb"
@@ -15128,6 +15596,15 @@ 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.6:
version "1.2.6"
resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.6.tgz#3cecc49f7c99f07a75076d3c54247050bc4f7e11"
integrity sha512-20waSYX+gb5M5yKhug5FIwxBBvkKzlJH7sK6XEgdOx6BZ9YYamLmvg9wcRVtnSZO8hV/3cWenO/tRtTrHVvIgQ==
dependencies:
"@web3-js/websocket" "^1.0.29"
underscore "1.9.1"
web3-core-helpers "1.2.6"
web3-shh@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.1.tgz#4460e3c1e07faf73ddec24ccd00da46f89152b0c"
@@ -15151,6 +15628,20 @@ web3-utils@1.2.1:
underscore "1.9.1"
utf8 "3.0.0"
web3-utils@1.2.6, web3-utils@^1.2.5:
version "1.2.6"
resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.6.tgz#b9a25432da00976457fcc1094c4af8ac6d486db9"
integrity sha512-8/HnqG/l7dGmKMgEL9JeKPTtjScxOePTzopv5aaKFExPfaBrYRkgoMqhoowCiAl/s16QaTn4DoIF1QC4YsT7Mg==
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@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.1.tgz#5d8158bcca47838ab8c2b784a2dee4c3ceb4179b"
@@ -15164,6 +15655,17 @@ web3@1.2.1:
web3-shh "1.2.1"
web3-utils "1.2.1"
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"
@@ -15645,7 +16147,7 @@ xmlchars@^2.1.1:
resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
xmlhttprequest@1.8.0:
xmlhttprequest@*, xmlhttprequest@1.8.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc"
integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=