Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5c10a7f61d | ||
|
|
97079055b4 | ||
|
|
648f30be9b | ||
|
|
121d862fd0 | ||
|
|
c3fcffff4c | ||
|
|
8fd0747a0b | ||
|
|
9a8edc2c26 | ||
|
|
d720d4490c | ||
|
|
6f505e45cc | ||
|
|
cb2fcf3538 | ||
|
|
608421453b | ||
|
|
b825900a1f | ||
|
|
10510cf975 | ||
|
|
8fe0eb6bfe | ||
|
|
b54c20d56b | ||
|
|
bcfa2ed6ce | ||
|
|
18b4c487f8 | ||
|
|
40491d5e39 | ||
|
|
d6b2066d33 | ||
|
|
e709779de2 | ||
|
|
90213bda78 | ||
|
|
0f107ebad5 | ||
|
|
b907055402 | ||
|
|
72ffd5c78e | ||
|
|
ffee859741 | ||
|
|
218e3567f5 | ||
|
|
8dc763f82b | ||
|
|
aae42b9fca | ||
|
|
b861101a8f |
4
.env
Normal file
4
.env
Normal 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=""
|
||||
@@ -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
4
.env.production
Normal 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"
|
||||
3
.github/ISSUE_TEMPLATE/token-request.md
vendored
3
.github/ISSUE_TEMPLATE/token-request.md
vendored
@@ -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
1
.gitignore
vendored
@@ -11,7 +11,6 @@
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
.env
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
|
||||
@@ -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).
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
|
||||
@@ -71,5 +71,6 @@
|
||||
"tokenAddress": "Адрес токена",
|
||||
"label": "Название",
|
||||
"decimals": "Десятичное значение",
|
||||
"enterTokenCont": "Чтобы продолжить, введите адрес токена"
|
||||
"enterTokenCont": "Чтобы продолжить, введите адрес токена",
|
||||
"connectToWallet": "Подключиться к кошельку"
|
||||
}
|
||||
|
||||
BIN
src/assets/images/torus.png
Normal file
BIN
src/assets/images/torus.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
@@ -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>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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! </b> <Link href="https://migrate.uniswap.exchange/">Migrate your liquidity </Link>or{' '}
|
||||
<Link href="https://uniswap.exchange"> use V2 ↗</Link>
|
||||
</MigrateBannerSmall>
|
||||
<MigrateBannerLarge>
|
||||
<b>Uniswap V2 is here! </b> Move your liquidity now using the
|
||||
<Link href="https://migrate.uniswap.exchange/">
|
||||
<b>migration helper</b>
|
||||
</Link>
|
||||
or use the
|
||||
<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>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
531
src/contexts/Balances.tsx
Normal 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
|
||||
}
|
||||
@@ -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',
|
||||
|
||||
@@ -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')}
|
||||
|
||||
@@ -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
1
src/react-app-env.d.ts
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/// <reference types="react-scripts" />
|
||||
25
tsconfig.json
Normal file
25
tsconfig.json
Normal 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
546
yarn.lock
@@ -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=
|
||||
|
||||
Reference in New Issue
Block a user