Commit db0d3cf3 authored by Vignesh Mohankumar's avatar Vignesh Mohankumar Committed by GitHub

feat: upgrade to web3-react v8 (#3759)

* initial

* comment more stuff out for now

* more changes

* more temp

* remove walletconnect bug logic

* switch to provider not connector

* remove fortmatic

* remove some usage of network connector

* fix initialize connector

* more changes

* remove switch to network

* connect eagerly

* active -> isActive

* add initial option cards

* upgrade web3-react

* delete tryActivation

* delete pending view, reset option code

* fix hooks

* library -> provider

* rm getLibrary

* eagerly connect

* comment all this code for now

* add back app

* dont connect eagerly here

* deactivate

* switchToNetwork

* switch to useWeb3React

* rm Web3ReactManager

* add back og wallet modal code

* switch back to old option logic

* add account logic back

* add back more network switch logic

* Revert "switch to useWeb3React"

This reverts commit 08ac6319d40207c31c72bf3b16b9f22223fc1ddc.

* add back skip disconnect logic

* check for network connector

* use promise.then again

* remove unnecessary pending error logic

* reset useAddTokenToMetamask

* upgrade packages

* use watchAsset

* add gnosis

* rm fortmatic

* close on disconnection

* add Wallet enum

* remove fortmatic imports

* add wallet state

* set/clear override wallet

* resolve empty

* remove some wallet modal view logic

* useWeb3ReactListener

* move to use effect

* add setwalletoverride in deactivate for now

* start to fix the wallet modal bug

* back button should open options

* connect eagerly to all

* Revert "add setwalletoverride in deactivate for now"

This reverts commit fbc990a9245c68460b1f29e368174b5327aa586c.

* useSelectedIsActive

* switch the enum to not be a bug

* actually dispatch the wallet override

* remove connection useEffect for now

* Revert "remove connection useEffect for now"

This reverts commit 0b92eee6894586e08079c1e4092e098b579cb768.

* add back the activation useeffect

* handle resetting eagerly connecting

* dont disconnect from coinbase wallet

* disconnect except for coinbase wallet, bc their reload breaks things

* handle eager activation edge case

* backfill wallet override

* rename wrapper components

* update test

* network if override undefined

* npx deduplicate

* comment for why coinbase wallet special cased

* connectorPrevious -> previousConnector

* Array.find instead of forEach

* useState instead of useReducer

* add comments and simplify

* Web3Wrapper component

* add type guard

* check for watchAsset

* revert Option.tsx changes

* set -> updateWalletOverride

* generalize connector type usage

* rm comment

* eagerlyConnect comment

* null -> undefined

* add comment for wallet override

* add back pendingError logic

* merge conflicts

* remove provider dep

* add back connect a wallet

* move active prop out of base props

* add back account details test

* add type of isActiveMap

* add back eslint

* add TODO

* Web3Provider

* return null from Updater

* update comment

* integration tests initial

* try updating test

* check for gnosis safe

* fix gnosis safe check

* pr comments

* pr comments

* don't eagerly connect to any wallets other than gnosis or walletOverride

* remove unused branch

* pendingError from hook

* eslint-disable-line

* try connecting to wallets if not backfilled

* move eager connection logic

* remove connect eagerly set logic

* disconnect on change

* simplify ConnectorState

* better solution for changing wallet priority

* merge fixes

* fix tests

* try fixing test again

* add comment

* add fortmatic back

* set walletOverride for fortmatic

* hide other chains

* handle eager connection

* connect everything eagerly if not backfilled

* fix chain switching

* async

* rm error console

* fortmatic update

* log errors

* don't eagerly connect to fortmatic

* onSelectChain + switchChain

* typo

* don't disconnect from coinbase wallet for now

* upgrade web3-react

* close on disconnection/connection again

* simplify account change check

* comment fix

* comment

* fortmatic icon

* comment for fortmatic in network selector

* consolidate useEffect hooks in walletmodal for connection/disconnection

* switchToChain

* comment

* isEagerlyConnecting instead of eagerlyConnectingWallets

* update web3-react

* close modal fortmatic

* remove error log

* chainIdNotAllowed

* handle useToken

* update SupportedChainId

* move if statements around

* move to wallet reducer

* close as error

* export fix

* add back history change

* add back popular

* fortmatic key

* persist wallet

* remove eagerly connect

* call connect eagerly

* handle modal errors

* handle fortmatic close properly

* connector error changes

* go back to options

* change redux wallets

* simplify reducer

* fix eagerly connect / disconnect

* remove account change hook

* simplify connect eagerly

* remove unused var

* revert chain

* walletOverride reducer

* update web3-react

* fix compile errors for now

* show disconnect button

* clear pending connector

* clear error state

* add back skip toggle check

* MAINNET provider for ENS

* add coinbase wallet sdk

* fix test

* add back style but fix syntax highlighting

* dont create separate json rpc provider

* don't use selected hooks

* dont export

* dispatch first

* useConnectors

* comment

* simplify activeMap

* useIsActiveMap

* prettier

* prop change

* move comment

* useCallback

* coinbase wallet link fix

* rm ModalWallet type

* reportError

* isChainAllowed

* NETWORK_SELECTOR_CHAINS

* mainnet provider

* remove unused wallet views

* add back default case

* selected wallet

* comment change

* !chainAllowed

* rm ensResolver

* rm forEach

* re-define reportError

* move effects arounds

* change error message for switching chain

* simplify Web3Provider

* delete use isActive map

* fix test?

* rm disconnect test for now

* error message updates

* const -> function

* move fn

* undo changes for showing connect wallet state

* clear error before activating

* remove special case for fortmatic error

* backfillable/selectable wallets

* log wallet

* Revert "rm disconnect test for now"

This reverts commit 225bc7dc5622ae918d8a8b70e4425c648d1a1fac.

* check if account exists

* unused dep

* remove reload piece of test

* update connect a wallet default state

* headerRow
parent ace4276b
REACT_APP_INFURA_KEY="4bf032f2d38a4ed6bb975b80d6340847" REACT_APP_INFURA_KEY="4bf032f2d38a4ed6bb975b80d6340847"
REACT_APP_LOCALES="locales" REACT_APP_FORTMATIC_KEY="pk_live_357F77728B8EB880"
\ No newline at end of file REACT_APP_LOCALES="locales"
import { TEST_ADDRESS_NEVER_USE_SHORTENED } from '../support/ethereum'
describe('Landing Page', () => { describe('Landing Page', () => {
beforeEach(() => cy.visit('/')) beforeEach(() => cy.visit('/'))
it('loads swap page', () => { it('loads swap page', () => {
...@@ -15,9 +13,4 @@ describe('Landing Page', () => { ...@@ -15,9 +13,4 @@ describe('Landing Page', () => {
cy.get('#pool-nav-link').click() cy.get('#pool-nav-link').click()
cy.url().should('include', '/pool') cy.url().should('include', '/pool')
}) })
it('is connected', () => {
cy.get('#web3-status-connected').click()
cy.get('#web3-account-identifier-row').contains(TEST_ADDRESS_NEVER_USE_SHORTENED)
})
}) })
import { TEST_ADDRESS_NEVER_USE_SHORTENED } from '../support/ethereum'
describe('Wallet', () => {
before(() => {
cy.visit('/')
})
it('displays account details', () => {
cy.get('#web3-status-connected').contains(TEST_ADDRESS_NEVER_USE_SHORTENED).click()
})
it('displays account view in wallet modal', () => {
cy.get('#web3-account-identifier-row').contains(TEST_ADDRESS_NEVER_USE_SHORTENED)
})
it('changes back to the options grid', () => {
cy.get('[data-cy=wallet-change]').click()
cy.get('[data-cy=option-grid]').should('exist')
})
it('selects injected wallet option', () => {
cy.contains('Injected').click()
cy.get('#web3-account-identifier-row').contains(TEST_ADDRESS_NEVER_USE_SHORTENED)
})
it('shows connect buttons after disconnect', () => {
cy.get('[data-cy=wallet-disconnect]').click()
cy.get('[data-cy=option-grid]').should('exist')
})
})
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
] ]
}, },
"dependencies": { "dependencies": {
"@coinbase/wallet-sdk": "^3.2.0",
"@ethersproject/experimental": "^5.4.0", "@ethersproject/experimental": "^5.4.0",
"@fontsource/ibm-plex-mono": "^4.5.1", "@fontsource/ibm-plex-mono": "^4.5.1",
"@fontsource/inter": "^4.5.1", "@fontsource/inter": "^4.5.1",
...@@ -115,13 +116,17 @@ ...@@ -115,13 +116,17 @@
"@uniswap/v3-core": "1.0.0", "@uniswap/v3-core": "1.0.0",
"@uniswap/v3-periphery": "^1.1.1", "@uniswap/v3-periphery": "^1.1.1",
"@uniswap/v3-sdk": "^3.8.2", "@uniswap/v3-sdk": "^3.8.2",
"@web3-react/core": "^8.0.23-beta.0", "@walletconnect/ethereum-provider": "1.7.1",
"@web3-react/eip1193": "^8.0.18-beta.0", "@web3-react/coinbase-wallet": "^8.0.33-beta.0",
"@web3-react/empty": "^8.0.12-beta.0", "@web3-react/core": "^8.0.33-beta.0",
"@web3-react/metamask": "^8.0.19-beta.0", "@web3-react/eip1193": "^8.0.25-beta.0",
"@web3-react/types": "^8.0.12-beta.0", "@web3-react/empty": "^8.0.19-beta.0",
"@web3-react/url": "^8.0.17-beta.0", "@web3-react/gnosis-safe": "^8.0.5-beta.0",
"@web3-react/walletconnect": "^8.0.26-beta.0", "@web3-react/metamask": "^8.0.26-beta.0",
"@web3-react/network": "^8.0.26-beta.0",
"@web3-react/types": "^8.0.19-beta.0",
"@web3-react/url": "^8.0.24-beta.0",
"@web3-react/walletconnect": "^8.0.34-beta.0",
"ajv": "^6.12.3", "ajv": "^6.12.3",
"array.prototype.flat": "^1.2.4", "array.prototype.flat": "^1.2.4",
"array.prototype.flatmap": "^1.2.4", "array.prototype.flatmap": "^1.2.4",
...@@ -140,6 +145,7 @@ ...@@ -140,6 +145,7 @@
"eslint-plugin-unused-imports": "^2.0.0", "eslint-plugin-unused-imports": "^2.0.0",
"ethers": "^5.1.4", "ethers": "^5.1.4",
"firebase": "^9.1.3", "firebase": "^9.1.3",
"fortmatic": "^2.4.0",
"graphql": "^15.5.0", "graphql": "^15.5.0",
"graphql-request": "^3.4.0", "graphql-request": "^3.4.0",
"immer": "^9.0.6", "immer": "^9.0.6",
...@@ -187,14 +193,6 @@ ...@@ -187,14 +193,6 @@
"use-resize-observer": "^8.0.0", "use-resize-observer": "^8.0.0",
"wcag-contrast": "^3.0.0", "wcag-contrast": "^3.0.0",
"web-vitals": "^2.1.0", "web-vitals": "^2.1.0",
"web3-react-abstract-connector": "npm:@web3-react/abstract-connector@^6.0.7",
"web3-react-core": "npm:@web3-react/core@^6.0.9",
"web3-react-fortmatic-connector": "npm:@web3-react/fortmatic-connector@^6.0.9",
"web3-react-injected-connector": "npm:@web3-react/injected-connector@^6.0.7",
"web3-react-types": "npm:@web3-react/types@^6.0.7",
"web3-react-walletconnect-connector": "npm:@web3-react/walletconnect-connector@^7.0.2-alpha.0",
"web3-react-walletlink-connector": "npm:@web3-react/walletlink-connector@^6.2.13",
"wicg-inert": "^3.1.1",
"workbox-core": "^6.1.0", "workbox-core": "^6.1.0",
"workbox-navigation-preload": "^6.1.0", "workbox-navigation-preload": "^6.1.0",
"workbox-precaching": "^6.1.0", "workbox-precaching": "^6.1.0",
......
...@@ -5,11 +5,11 @@ import useActiveWeb3React from 'hooks/useActiveWeb3React' ...@@ -5,11 +5,11 @@ import useActiveWeb3React from 'hooks/useActiveWeb3React'
import { useCallback, useContext } from 'react' import { useCallback, useContext } from 'react'
import { ExternalLink as LinkIcon } from 'react-feather' import { ExternalLink as LinkIcon } from 'react-feather'
import { useAppDispatch } from 'state/hooks' import { useAppDispatch } from 'state/hooks'
import { updateSelectedWallet } from 'state/user/reducer'
import styled, { ThemeContext } from 'styled-components/macro' import styled, { ThemeContext } from 'styled-components/macro'
import { AbstractConnector } from 'web3-react-abstract-connector'
import { ReactComponent as Close } from '../../assets/images/x.svg' import { ReactComponent as Close } from '../../assets/images/x.svg'
import { injected, walletlink } from '../../connectors' import { coinbaseWallet, injected } from '../../connectors'
import { SUPPORTED_WALLETS } from '../../constants/wallet' import { SUPPORTED_WALLETS } from '../../constants/wallet'
import { clearAllTransactions } from '../../state/transactions/reducer' import { clearAllTransactions } from '../../state/transactions/reducer'
import { ExternalLink, LinkStyledButton, ThemedText } from '../../theme' import { ExternalLink, LinkStyledButton, ThemedText } from '../../theme'
...@@ -177,7 +177,7 @@ const IconWrapper = styled.div<{ size?: number }>` ...@@ -177,7 +177,7 @@ const IconWrapper = styled.div<{ size?: number }>`
`}; `};
` `
function WrappedStatusIcon({ connector }: { connector: AbstractConnector | Connector }) { function WrappedStatusIcon({ connector }: { connector: Connector }) {
return ( return (
<IconWrapper size={16}> <IconWrapper size={16}>
<StatusIcon connector={connector} /> <StatusIcon connector={connector} />
...@@ -265,12 +265,16 @@ export default function AccountDetails({ ...@@ -265,12 +265,16 @@ export default function AccountDetails({
<AccountGroupingRow> <AccountGroupingRow>
{formatConnectorName()} {formatConnectorName()}
<div> <div>
{connector !== injected && connector !== walletlink && ( {/* Coinbase Wallet reloads the page right now, which breaks the selectedWallet from being set properly on localStorage */}
{connector !== coinbaseWallet && (
<WalletAction <WalletAction
style={{ fontSize: '.825rem', fontWeight: 400, marginRight: '8px' }} style={{ fontSize: '.825rem', fontWeight: 400, marginRight: '8px' }}
onClick={() => { onClick={() => {
;(connector as any).close() connector.deactivate ? connector.deactivate() : connector.resetState()
dispatch(updateSelectedWallet({ wallet: undefined }))
openOptions()
}} }}
data-cy="wallet-disconnect"
> >
<Trans>Disconnect</Trans> <Trans>Disconnect</Trans>
</WalletAction> </WalletAction>
...@@ -280,6 +284,7 @@ export default function AccountDetails({ ...@@ -280,6 +284,7 @@ export default function AccountDetails({
onClick={() => { onClick={() => {
openOptions() openOptions()
}} }}
data-cy="wallet-change"
> >
<Trans>Change</Trans> <Trans>Change</Trans>
</WalletAction> </WalletAction>
......
import { Trans } from '@lingui/macro' import { Trans } from '@lingui/macro'
import { getWalletForConnector } from 'connectors'
import { CHAIN_INFO } from 'constants/chainInfo' import { CHAIN_INFO } from 'constants/chainInfo'
import { CHAIN_IDS_TO_NAMES, SupportedChainId } from 'constants/chains' import { CHAIN_IDS_TO_NAMES, SupportedChainId } from 'constants/chains'
import useActiveWeb3React from 'hooks/useActiveWeb3React' import useActiveWeb3React from 'hooks/useActiveWeb3React'
...@@ -11,12 +12,12 @@ import { ArrowDownCircle, ChevronDown } from 'react-feather' ...@@ -11,12 +12,12 @@ import { ArrowDownCircle, ChevronDown } from 'react-feather'
import { useHistory } from 'react-router-dom' import { useHistory } from 'react-router-dom'
import { useModalOpen, useToggleModal } from 'state/application/hooks' import { useModalOpen, useToggleModal } from 'state/application/hooks'
import { addPopup, ApplicationModal } from 'state/application/reducer' import { addPopup, ApplicationModal } from 'state/application/reducer'
import { useAppDispatch } from 'state/hooks'
import { updateWalletError } from 'state/wallet/reducer'
import styled from 'styled-components/macro' import styled from 'styled-components/macro'
import { ExternalLink, MEDIA_WIDTHS } from 'theme' import { ExternalLink, MEDIA_WIDTHS } from 'theme'
import { replaceURLParam } from 'utils/routes' import { replaceURLParam } from 'utils/routes'
import { isChainAllowed, switchChain } from 'utils/switchChain'
import { useAppDispatch } from '../../state/hooks'
import { switchToNetwork } from '../../utils/switchToNetwork'
const ActiveRowLinkList = styled.div` const ActiveRowLinkList = styled.div`
display: flex; display: flex;
...@@ -184,8 +185,8 @@ function Row({ ...@@ -184,8 +185,8 @@ function Row({
targetChain: SupportedChainId targetChain: SupportedChainId
onSelectChain: (targetChain: number) => void onSelectChain: (targetChain: number) => void
}) { }) {
const { library, chainId } = useActiveWeb3React() const { provider, chainId } = useActiveWeb3React()
if (!library || !chainId) { if (!provider || !chainId) {
return null return null
} }
const active = chainId === targetChain const active = chainId === targetChain
...@@ -257,8 +258,16 @@ const getChainNameFromId = (id: string | number) => { ...@@ -257,8 +258,16 @@ const getChainNameFromId = (id: string | number) => {
return CHAIN_IDS_TO_NAMES[id as SupportedChainId] || '' return CHAIN_IDS_TO_NAMES[id as SupportedChainId] || ''
} }
const NETWORK_SELECTOR_CHAINS = [
SupportedChainId.MAINNET,
SupportedChainId.POLYGON,
SupportedChainId.OPTIMISM,
SupportedChainId.ARBITRUM_ONE,
]
export default function NetworkSelector() { export default function NetworkSelector() {
const { chainId, library } = useActiveWeb3React() const dispatch = useAppDispatch()
const { chainId, provider, connector } = useActiveWeb3React()
const parsedQs = useParsedQueryString() const parsedQs = useParsedQueryString()
const { urlChain, urlChainId } = getParsedChainId(parsedQs) const { urlChain, urlChainId } = getParsedChainId(parsedQs)
const prevChainId = usePrevious(chainId) const prevChainId = usePrevious(chainId)
...@@ -271,37 +280,39 @@ export default function NetworkSelector() { ...@@ -271,37 +280,39 @@ export default function NetworkSelector() {
const info = chainId ? CHAIN_INFO[chainId] : undefined const info = chainId ? CHAIN_INFO[chainId] : undefined
const dispatch = useAppDispatch() const onSelectChain = useCallback(
async (targetChain: number, skipToggle?: boolean) => {
if (!connector) return
const wallet = getWalletForConnector(connector)
const handleChainSwitch = useCallback( try {
(targetChain: number, skipToggle?: boolean) => { dispatch(updateWalletError({ wallet, error: undefined }))
if (!library?.provider) return await switchChain(connector, targetChain)
switchToNetwork({ provider: library.provider, chainId: targetChain }) if (!skipToggle) {
.then(() => { toggle()
if (!skipToggle) { }
toggle() history.replace({
} search: replaceURLParam(history.location.search, 'chain', getChainNameFromId(targetChain)),
history.replace({
search: replaceURLParam(history.location.search, 'chain', getChainNameFromId(targetChain)),
})
}) })
.catch((error) => { } catch (error) {
console.error('Failed to switch networks', error) console.error('Failed to switch networks', error)
// we want app network <-> chainId param to be in sync, so if user changes the network by changing the URL // we want app network <-> chainId param to be in sync, so if user changes the network by changing the URL
// but the request fails, revert the URL back to current chainId // but the request fails, revert the URL back to current chainId
if (chainId) { if (chainId) {
history.replace({ search: replaceURLParam(history.location.search, 'chain', getChainNameFromId(chainId)) }) history.replace({ search: replaceURLParam(history.location.search, 'chain', getChainNameFromId(chainId)) })
} }
if (!skipToggle) { if (!skipToggle) {
toggle() toggle()
} }
dispatch(addPopup({ content: { failedSwitchNetwork: targetChain }, key: `failed-network-switch` })) dispatch(updateWalletError({ wallet, error: error.message }))
}) dispatch(addPopup({ content: { failedSwitchNetwork: targetChain }, key: `failed-network-switch` }))
}
}, },
[dispatch, library, toggle, history, chainId] [connector, toggle, dispatch, history, chainId]
) )
useEffect(() => { useEffect(() => {
...@@ -312,9 +323,9 @@ export default function NetworkSelector() { ...@@ -312,9 +323,9 @@ export default function NetworkSelector() {
history.replace({ search: replaceURLParam(history.location.search, 'chain', getChainNameFromId(chainId)) }) history.replace({ search: replaceURLParam(history.location.search, 'chain', getChainNameFromId(chainId)) })
// otherwise assume network change originates from URL // otherwise assume network change originates from URL
} else if (urlChainId && urlChainId !== chainId) { } else if (urlChainId && urlChainId !== chainId) {
handleChainSwitch(urlChainId, true) onSelectChain(urlChainId, true)
} }
}, [chainId, urlChainId, prevChainId, handleChainSwitch, history]) }, [chainId, urlChainId, prevChainId, onSelectChain, history])
// set chain parameter on initial load if not there // set chain parameter on initial load if not there
useEffect(() => { useEffect(() => {
...@@ -323,7 +334,7 @@ export default function NetworkSelector() { ...@@ -323,7 +334,7 @@ export default function NetworkSelector() {
} }
}, [chainId, history, urlChainId, urlChain]) }, [chainId, history, urlChainId, urlChain])
if (!chainId || !info || !library) { if (!chainId || !info || !provider) {
return null return null
} }
...@@ -340,10 +351,11 @@ export default function NetworkSelector() { ...@@ -340,10 +351,11 @@ export default function NetworkSelector() {
<FlyoutHeader> <FlyoutHeader>
<Trans>Select a network</Trans> <Trans>Select a network</Trans>
</FlyoutHeader> </FlyoutHeader>
<Row onSelectChain={handleChainSwitch} targetChain={SupportedChainId.MAINNET} /> {NETWORK_SELECTOR_CHAINS.map((chainId: SupportedChainId) =>
<Row onSelectChain={handleChainSwitch} targetChain={SupportedChainId.POLYGON} /> isChainAllowed(connector, chainId) ? (
<Row onSelectChain={handleChainSwitch} targetChain={SupportedChainId.OPTIMISM} /> <Row onSelectChain={onSelectChain} targetChain={chainId} key={chainId} />
<Row onSelectChain={handleChainSwitch} targetChain={SupportedChainId.ARBITRUM_ONE} /> ) : null
)}
</FlyoutMenuContents> </FlyoutMenuContents>
</FlyoutMenu> </FlyoutMenu>
)} )}
......
...@@ -13,6 +13,7 @@ import { useUserHasSubmittedClaim } from 'state/transactions/hooks' ...@@ -13,6 +13,7 @@ import { useUserHasSubmittedClaim } from 'state/transactions/hooks'
import { useDarkModeManager } from 'state/user/hooks' import { useDarkModeManager } from 'state/user/hooks'
import { useNativeCurrencyBalances } from 'state/wallet/hooks' import { useNativeCurrencyBalances } from 'state/wallet/hooks'
import styled from 'styled-components/macro' import styled from 'styled-components/macro'
import { isChainAllowed } from 'utils/switchChain'
import { ReactComponent as Logo } from '../../assets/svg/logo.svg' import { ReactComponent as Logo } from '../../assets/svg/logo.svg'
import { ExternalLink, ThemedText } from '../../theme' import { ExternalLink, ThemedText } from '../../theme'
...@@ -76,7 +77,7 @@ const HeaderElement = styled.div` ...@@ -76,7 +77,7 @@ const HeaderElement = styled.div`
margin-left: 0.5em; margin-left: 0.5em;
} }
/* addresses safari's lack of support for "gap" */ /* addresses safaris lack of support for "gap" */
& > *:not(:first-child) { & > *:not(:first-child) {
margin-left: 8px; margin-left: 8px;
} }
...@@ -246,7 +247,9 @@ const StyledExternalLink = styled(ExternalLink).attrs({ ...@@ -246,7 +247,9 @@ const StyledExternalLink = styled(ExternalLink).attrs({
` `
export default function Header() { export default function Header() {
const { account, chainId } = useActiveWeb3React() const { account, chainId, connector } = useActiveWeb3React()
const chainAllowed = chainId && isChainAllowed(connector, chainId)
const userEthBalance = useNativeCurrencyBalances(account ? [account] : [])?.[account ?? ''] const userEthBalance = useNativeCurrencyBalances(account ? [account] : [])?.[account ?? '']
const [darkMode] = useDarkModeManager() const [darkMode] = useDarkModeManager()
...@@ -265,7 +268,7 @@ export default function Header() { ...@@ -265,7 +268,7 @@ export default function Header() {
const { const {
infoLink, infoLink,
nativeCurrency: { symbol: nativeCurrencySymbol }, nativeCurrency: { symbol: nativeCurrencySymbol },
} = CHAIN_INFO[chainId ? chainId : SupportedChainId.MAINNET] } = CHAIN_INFO[!chainId || !chainAllowed ? SupportedChainId.MAINNET : chainId]
return ( return (
<HeaderFrame showBackground={scrollY > 45}> <HeaderFrame showBackground={scrollY > 45}>
......
import { Connector } from '@web3-react/types' import { Connector } from '@web3-react/types'
import { AbstractConnector } from 'web3-react-abstract-connector'
import CoinbaseWalletIcon from '../../assets/images/coinbaseWalletIcon.svg' import CoinbaseWalletIcon from '../../assets/images/coinbaseWalletIcon.svg'
import FortmaticIcon from '../../assets/images/fortmaticIcon.png' import FortmaticIcon from '../../assets/images/fortmaticIcon.png'
import WalletConnectIcon from '../../assets/images/walletConnectIcon.svg' import WalletConnectIcon from '../../assets/images/walletConnectIcon.svg'
import { fortmatic, injected, walletconnect, walletlink } from '../../connectors' import { coinbaseWallet, fortmatic, injected, walletConnect } from '../../connectors'
import Identicon from '../Identicon' import Identicon from '../Identicon'
export default function StatusIcon({ connector }: { connector: AbstractConnector | Connector }) { export default function StatusIcon({ connector }: { connector: Connector }) {
switch (connector) { switch (connector) {
case injected: case injected:
return <Identicon /> return <Identicon />
case walletconnect: case walletConnect:
return <img src={WalletConnectIcon} alt={'WalletConnect'} /> return <img src={WalletConnectIcon} alt="WalletConnect" />
case walletlink: case coinbaseWallet:
return <img src={CoinbaseWalletIcon} alt={'Coinbase Wallet'} /> return <img src={CoinbaseWalletIcon} alt="Coinbase Wallet" />
case fortmatic: case fortmatic:
return <img src={FortmaticIcon} alt={'Fortmatic'} /> return <img src={FortmaticIcon} alt="Fortmatic" />
default: default:
return null return null
} }
......
...@@ -4,15 +4,14 @@ import Badge from 'components/Badge' ...@@ -4,15 +4,14 @@ import Badge from 'components/Badge'
import { CHAIN_INFO } from 'constants/chainInfo' import { CHAIN_INFO } from 'constants/chainInfo'
import { L2_CHAIN_IDS, SupportedL2ChainId } from 'constants/chains' import { L2_CHAIN_IDS, SupportedL2ChainId } from 'constants/chains'
import useActiveWeb3React from 'hooks/useActiveWeb3React' import useActiveWeb3React from 'hooks/useActiveWeb3React'
import useAddTokenToMetamask from 'hooks/useAddTokenToMetamask' import useCurrencyLogoURIs from 'lib/hooks/useCurrencyLogoURIs'
import { ReactNode, useContext } from 'react' import { ReactNode, useCallback, useContext, useState } from 'react'
import { AlertCircle, AlertTriangle, ArrowUpCircle, CheckCircle } from 'react-feather' import { AlertCircle, AlertTriangle, ArrowUpCircle, CheckCircle } from 'react-feather'
import { Text } from 'rebass' import { Text } from 'rebass'
import { useIsTransactionConfirmed, useTransaction } from 'state/transactions/hooks' import { useIsTransactionConfirmed, useTransaction } from 'state/transactions/hooks'
import styled, { ThemeContext } from 'styled-components/macro' import styled, { ThemeContext } from 'styled-components/macro'
import Circle from '../../assets/images/blue-loader.svg' import Circle from '../../assets/images/blue-loader.svg'
import MetaMaskLogo from '../../assets/images/metamask.png'
import { ExternalLink } from '../../theme' import { ExternalLink } from '../../theme'
import { CloseIcon, CustomLightSpinner } from '../../theme' import { CloseIcon, CustomLightSpinner } from '../../theme'
import { ExplorerDataType, getExplorerLink } from '../../utils/getExplorerLink' import { ExplorerDataType, getExplorerLink } from '../../utils/getExplorerLink'
...@@ -97,9 +96,25 @@ function TransactionSubmittedContent({ ...@@ -97,9 +96,25 @@ function TransactionSubmittedContent({
}) { }) {
const theme = useContext(ThemeContext) const theme = useContext(ThemeContext)
const { library } = useActiveWeb3React() const { connector } = useActiveWeb3React()
const { addToken, success } = useAddTokenToMetamask(currencyToAdd) const token = currencyToAdd?.wrapped
const logoURL = useCurrencyLogoURIs(token)[0]
const [success, setSuccess] = useState<boolean | undefined>()
const addToken = useCallback(() => {
if (!token?.symbol || !connector.watchAsset) return
connector
.watchAsset({
address: token.address,
symbol: token.symbol,
decimals: token.decimals,
image: logoURL,
})
.then(() => setSuccess(true))
.catch(() => setSuccess(false))
}, [connector, logoURL, token])
return ( return (
<Wrapper> <Wrapper>
...@@ -124,13 +139,11 @@ function TransactionSubmittedContent({ ...@@ -124,13 +139,11 @@ function TransactionSubmittedContent({
</Text> </Text>
</ExternalLink> </ExternalLink>
)} )}
{currencyToAdd && library?.provider?.isMetaMask && ( {currencyToAdd && connector.watchAsset && (
<ButtonLight mt="12px" padding="6px 12px" width="fit-content" onClick={addToken}> <ButtonLight mt="12px" padding="6px 12px" width="fit-content" onClick={addToken}>
{!success ? ( {!success ? (
<RowFixed> <RowFixed>
<Trans> <Trans>Add {currencyToAdd.symbol}</Trans>
Add {currencyToAdd.symbol} to Metamask <StyledLogo src={MetaMaskLogo} />
</Trans>
</RowFixed> </RowFixed>
) : ( ) : (
<RowFixed> <RowFixed>
......
import { Trans } from '@lingui/macro' import { Trans } from '@lingui/macro'
import { Connector } from '@web3-react/types'
import { ButtonEmpty, ButtonPrimary } from 'components/Button' import { ButtonEmpty, ButtonPrimary } from 'components/Button'
import styled from 'styled-components/macro' import styled from 'styled-components/macro'
import { ThemedText } from 'theme' import { ThemedText } from 'theme'
import { AbstractConnector } from 'web3-react-abstract-connector'
import Loader from '../Loader' import Loader from '../Loader'
...@@ -49,15 +49,13 @@ const LoadingWrapper = styled.div` ...@@ -49,15 +49,13 @@ const LoadingWrapper = styled.div`
export default function PendingView({ export default function PendingView({
connector, connector,
error = false, error = false,
setPendingError,
tryActivation, tryActivation,
resetAccountView, openOptions,
}: { }: {
connector?: AbstractConnector connector: Connector
error?: boolean error?: boolean
setPendingError: (error: boolean) => void tryActivation: (connector: Connector) => void
tryActivation: (connector: AbstractConnector) => void openOptions: () => void
resetAccountView: () => void
}) { }) {
return ( return (
<PendingSection> <PendingSection>
...@@ -77,14 +75,13 @@ export default function PendingView({ ...@@ -77,14 +75,13 @@ export default function PendingView({
$borderRadius="12px" $borderRadius="12px"
padding="12px" padding="12px"
onClick={() => { onClick={() => {
setPendingError(false) tryActivation(connector)
connector && tryActivation(connector)
}} }}
> >
<Trans>Try Again</Trans> <Trans>Try Again</Trans>
</ButtonPrimary> </ButtonPrimary>
<ButtonEmpty width="fit-content" padding="0" marginTop={20}> <ButtonEmpty width="fit-content" padding="0" marginTop={20}>
<ThemedText.Link fontSize={12} onClick={resetAccountView}> <ThemedText.Link fontSize={12} onClick={openOptions}>
<Trans>Back to wallet selection</Trans> <Trans>Back to wallet selection</Trans>
</ThemedText.Link> </ThemedText.Link>
</ButtonEmpty> </ButtonEmpty>
......
import { Trans } from '@lingui/macro' import { Trans } from '@lingui/macro'
import { useWeb3React } from '@web3-react/core'
import { Connector } from '@web3-react/types'
import { sendEvent } from 'components/analytics' import { sendEvent } from 'components/analytics'
import { AutoColumn } from 'components/Column' import { AutoColumn } from 'components/Column'
import { PrivacyPolicy } from 'components/PrivacyPolicy' import { AutoRow } from 'components/Row'
import Row, { AutoRow } from 'components/Row'
import { useCallback, useEffect, useState } from 'react' import { useCallback, useEffect, useState } from 'react'
import { ArrowLeft } from 'react-feather' import { ArrowLeft } from 'react-feather'
import { useAppDispatch, useAppSelector } from 'state/hooks'
import { updateSelectedWallet } from 'state/user/reducer'
import { updateWalletError } from 'state/wallet/reducer'
import styled from 'styled-components/macro' import styled from 'styled-components/macro'
import { AbstractConnector } from 'web3-react-abstract-connector'
import { UnsupportedChainIdError, useWeb3React } from 'web3-react-core'
import { WalletConnectConnector } from 'web3-react-walletconnect-connector'
import MetamaskIcon from '../../assets/images/metamask.png' import MetamaskIcon from '../../assets/images/metamask.png'
import TallyIcon from '../../assets/images/tally.png' import TallyIcon from '../../assets/images/tally.png'
import { ReactComponent as Close } from '../../assets/images/x.svg' import { ReactComponent as Close } from '../../assets/images/x.svg'
import { fortmatic, injected } from '../../connectors' import { fortmatic, getWalletForConnector, injected } from '../../connectors'
import { OVERLAY_READY } from '../../connectors/Fortmatic'
import { SUPPORTED_WALLETS } from '../../constants/wallet' import { SUPPORTED_WALLETS } from '../../constants/wallet'
import usePrevious from '../../hooks/usePrevious'
import { useModalOpen, useWalletModalToggle } from '../../state/application/hooks' import { useModalOpen, useWalletModalToggle } from '../../state/application/hooks'
import { ApplicationModal } from '../../state/application/reducer' import { ApplicationModal } from '../../state/application/reducer'
import { ExternalLink, ThemedText } from '../../theme' import { ExternalLink, ThemedText } from '../../theme'
...@@ -65,24 +64,20 @@ const ContentWrapper = styled.div` ...@@ -65,24 +64,20 @@ const ContentWrapper = styled.div`
padding: 0 1rem 1rem 1rem; padding: 0 1rem 1rem 1rem;
border-bottom-left-radius: 20px; border-bottom-left-radius: 20px;
border-bottom-right-radius: 20px; border-bottom-right-radius: 20px;
${({ theme }) => theme.mediaWidth.upToMedium`padding: 0 1rem 1rem 1rem`}; ${({ theme }) => theme.mediaWidth.upToMedium`padding: 0 1rem 1rem 1rem`};
` `
const UpperSection = styled.div` const UpperSection = styled.div`
position: relative; position: relative;
h5 { h5 {
margin: 0; margin: 0;
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
font-size: 1rem; font-size: 1rem;
font-weight: 400; font-weight: 400;
} }
h5:last-child { h5:last-child {
margin-bottom: 0px; margin-bottom: 0px;
} }
h4 { h4 {
margin-top: 0; margin-top: 0;
font-weight: 500; font-weight: 500;
...@@ -111,10 +106,8 @@ const HoverText = styled.div` ...@@ -111,10 +106,8 @@ const HoverText = styled.div`
const WALLET_VIEWS = { const WALLET_VIEWS = {
OPTIONS: 'options', OPTIONS: 'options',
OPTIONS_SECONDARY: 'options_secondary',
ACCOUNT: 'account', ACCOUNT: 'account',
PENDING: 'pending', PENDING: 'pending',
LEGAL: 'legal',
} }
export default function WalletModal({ export default function WalletModal({
...@@ -126,78 +119,68 @@ export default function WalletModal({ ...@@ -126,78 +119,68 @@ export default function WalletModal({
confirmedTransactions: string[] // hashes of confirmed confirmedTransactions: string[] // hashes of confirmed
ENSName?: string ENSName?: string
}) { }) {
// important that these are destructed from the account-specific web3-react context const dispatch = useAppDispatch()
const { account, connector, activate, error } = useWeb3React() const { connector, account } = useWeb3React()
const [walletView, setWalletView] = useState(WALLET_VIEWS.ACCOUNT) const [walletView, setWalletView] = useState(WALLET_VIEWS.ACCOUNT)
const previousWalletView = usePrevious(walletView)
const [pendingWallet, setPendingWallet] = useState<AbstractConnector | undefined>()
const [pendingError, setPendingError] = useState<boolean>() const [pendingConnector, setPendingConnector] = useState<Connector | undefined>()
const pendingError = useAppSelector((state) =>
pendingConnector ? state.wallet.errorByWallet[getWalletForConnector(pendingConnector)] : undefined
)
const walletModalOpen = useModalOpen(ApplicationModal.WALLET) const walletModalOpen = useModalOpen(ApplicationModal.WALLET)
const toggleWalletModal = useWalletModalToggle() const toggleWalletModal = useWalletModalToggle()
const previousAccount = usePrevious(account) const openOptions = useCallback(() => {
setWalletView(WALLET_VIEWS.OPTIONS)
}, [setWalletView])
const resetAccountView = useCallback(() => {
setPendingError(false)
setWalletView(WALLET_VIEWS.ACCOUNT)
}, [setPendingError, setWalletView])
// close on connection, when logged out before
useEffect(() => { useEffect(() => {
if (account && !previousAccount && walletModalOpen) { if (walletModalOpen) {
toggleWalletModal() setWalletView(account ? WALLET_VIEWS.ACCOUNT : WALLET_VIEWS.OPTIONS)
} }
}, [account, previousAccount, toggleWalletModal, walletModalOpen]) }, [walletModalOpen, setWalletView, account])
// always reset to account view
useEffect(() => { useEffect(() => {
if (walletModalOpen) { if (pendingConnector && walletView !== WALLET_VIEWS.PENDING) {
resetAccountView() updateWalletError({ wallet: getWalletForConnector(pendingConnector), error: undefined })
setPendingConnector(undefined)
} }
}, [walletModalOpen, resetAccountView]) }, [pendingConnector, walletView])
const tryActivation = async (connector: AbstractConnector | undefined) => { const tryActivation = useCallback(
let name = '' async (connector: Connector) => {
Object.keys(SUPPORTED_WALLETS).map((key) => { const wallet = getWalletForConnector(connector)
if (connector === SUPPORTED_WALLETS[key].connector) {
return (name = SUPPORTED_WALLETS[key].name)
}
return true
})
// log selected wallet
sendEvent({
category: 'Wallet',
action: 'Change Wallet',
label: name,
})
setPendingWallet(connector) // set wallet for pending view
setWalletView(WALLET_VIEWS.PENDING)
// if the connector is walletconnect and the user has already tried to connect, manually reset the connector // log selected wallet
if (connector instanceof WalletConnectConnector) { sendEvent({
connector.walletConnectProvider = undefined category: 'Wallet',
} action: 'Change Wallet',
label: wallet,
})
connector && try {
activate(connector, undefined, true).catch((error) => { // Fortmatic opens it's own modal on activation to log in. This modal has a tabIndex
if (error instanceof UnsupportedChainIdError) { // collision into the WalletModal, so we special case by closing the modal.
activate(connector) // a little janky...can't use setError because the connector isn't set if (connector === fortmatic) {
} else { toggleWalletModal()
setPendingError(true)
} }
})
}
// close wallet modal if fortmatic modal is active setPendingConnector(connector)
useEffect(() => { setWalletView(WALLET_VIEWS.PENDING)
fortmatic.on(OVERLAY_READY, () => { dispatch(updateWalletError({ wallet, error: undefined }))
toggleWalletModal()
}) await connector.activate()
}, [toggleWalletModal])
dispatch(updateSelectedWallet({ wallet }))
} catch (error) {
console.debug(`web3-react connection error: ${error}`)
dispatch(updateWalletError({ wallet, error: error.message }))
}
},
[dispatch, toggleWalletModal]
)
// get wallets user can switch too, depending on device/browser // get wallets user can switch too, depending on device/browser
function getOptions() { function getOptions() {
...@@ -205,22 +188,30 @@ export default function WalletModal({ ...@@ -205,22 +188,30 @@ export default function WalletModal({
const isTally = !!window.ethereum?.isTally const isTally = !!window.ethereum?.isTally
return Object.keys(SUPPORTED_WALLETS).map((key) => { return Object.keys(SUPPORTED_WALLETS).map((key) => {
const option = SUPPORTED_WALLETS[key] const option = SUPPORTED_WALLETS[key]
const isActive = option.connector === connector
const optionProps = {
active: isActive,
id: `connect-${key}`,
link: option.href,
header: option.name,
color: option.color,
key,
icon: option.iconURL,
}
// check for mobile options // check for mobile options
if (isMobile) { if (isMobile) {
if (!window.web3 && !window.ethereum && option.mobile) { if (!window.web3 && !window.ethereum && option.mobile) {
return ( return (
<Option <Option
{...optionProps}
onClick={() => { onClick={() => {
option.connector !== connector && !option.href && tryActivation(option.connector) if (!isActive && !option.href && !!option.connector) {
tryActivation(option.connector)
}
}} }}
id={`connect-${key}`}
key={key}
active={option.connector && option.connector === connector}
color={option.color}
link={option.href}
header={option.name}
subheader={null} subheader={null}
icon={option.iconURL}
/> />
) )
} }
...@@ -262,7 +253,7 @@ export default function WalletModal({ ...@@ -262,7 +253,7 @@ export default function WalletModal({
onClick={() => { onClick={() => {
option.connector === connector option.connector === connector
? setWalletView(WALLET_VIEWS.ACCOUNT) ? setWalletView(WALLET_VIEWS.ACCOUNT)
: !option.href && tryActivation(option.connector) : !option.href && option.connector && tryActivation(option.connector)
}} }}
color={'#E8831D'} color={'#E8831D'}
header={<Trans>Tally</Trans>} header={<Trans>Tally</Trans>}
...@@ -280,19 +271,13 @@ export default function WalletModal({ ...@@ -280,19 +271,13 @@ export default function WalletModal({
!isMobile && !isMobile &&
!option.mobileOnly && ( !option.mobileOnly && (
<Option <Option
id={`connect-${key}`} {...optionProps}
onClick={() => { onClick={() => {
option.connector === connector option.connector === connector
? setWalletView(WALLET_VIEWS.ACCOUNT) ? setWalletView(WALLET_VIEWS.ACCOUNT)
: !option.href && tryActivation(option.connector) : !option.href && option.connector && tryActivation(option.connector)
}} }}
key={key}
active={option.connector === connector}
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={option.iconURL}
/> />
) )
) )
...@@ -300,93 +285,56 @@ export default function WalletModal({ ...@@ -300,93 +285,56 @@ export default function WalletModal({
} }
function getModalContent() { function getModalContent() {
if (error) { if (walletView === WALLET_VIEWS.ACCOUNT) {
return (
<UpperSection>
<CloseIcon onClick={toggleWalletModal}>
<CloseColor />
</CloseIcon>
<HeaderRow>
{error instanceof UnsupportedChainIdError ? <Trans>Wrong Network</Trans> : <Trans>Error connecting</Trans>}
</HeaderRow>
<ContentWrapper>
{error instanceof UnsupportedChainIdError ? (
<h5>
<Trans>Please connect to a supported network in the dropdown menu or in your wallet.</Trans>
</h5>
) : (
<Trans>Error connecting. Try refreshing the page.</Trans>
)}
</ContentWrapper>
</UpperSection>
)
}
if (walletView === WALLET_VIEWS.LEGAL) {
return (
<UpperSection>
<HeaderRow>
<HoverText
onClick={() => {
setWalletView(
(previousWalletView === WALLET_VIEWS.LEGAL ? WALLET_VIEWS.ACCOUNT : previousWalletView) ??
WALLET_VIEWS.ACCOUNT
)
}}
>
<ArrowLeft />
</HoverText>
<Row justify="center">
<ThemedText.MediumHeader>
<Trans>Legal & Privacy</Trans>
</ThemedText.MediumHeader>
</Row>
</HeaderRow>
<PrivacyPolicy />
</UpperSection>
)
}
if (account && walletView === WALLET_VIEWS.ACCOUNT) {
return ( return (
<AccountDetails <AccountDetails
toggleWalletModal={toggleWalletModal} toggleWalletModal={toggleWalletModal}
pendingTransactions={pendingTransactions} pendingTransactions={pendingTransactions}
confirmedTransactions={confirmedTransactions} confirmedTransactions={confirmedTransactions}
ENSName={ENSName} ENSName={ENSName}
openOptions={() => setWalletView(WALLET_VIEWS.OPTIONS)} openOptions={openOptions}
/> />
) )
} }
let headerRow
if (walletView === WALLET_VIEWS.PENDING) {
headerRow = null
} else if (walletView === WALLET_VIEWS.ACCOUNT || !!account) {
headerRow = (
<HeaderRow color="blue">
<HoverText onClick={() => setWalletView(account ? WALLET_VIEWS.ACCOUNT : WALLET_VIEWS.OPTIONS)}>
<ArrowLeft />
</HoverText>
</HeaderRow>
)
} else {
headerRow = (
<HeaderRow>
<HoverText>
<Trans>Connect a wallet</Trans>
</HoverText>
</HeaderRow>
)
}
return ( return (
<UpperSection> <UpperSection>
<CloseIcon onClick={toggleWalletModal}> <CloseIcon onClick={toggleWalletModal}>
<CloseColor /> <CloseColor />
</CloseIcon> </CloseIcon>
{walletView !== WALLET_VIEWS.ACCOUNT ? ( {headerRow}
<HeaderRow color="blue">
<HoverText onClick={resetAccountView}>
<ArrowLeft />
</HoverText>
</HeaderRow>
) : (
<HeaderRow>
<HoverText>
<Trans>Connect a wallet</Trans>
</HoverText>
</HeaderRow>
)}
<ContentWrapper> <ContentWrapper>
<AutoColumn gap="16px"> <AutoColumn gap="16px">
{walletView === WALLET_VIEWS.PENDING && ( {walletView === WALLET_VIEWS.PENDING && pendingConnector && (
<PendingView <PendingView
connector={pendingWallet} openOptions={openOptions}
error={pendingError} connector={pendingConnector}
setPendingError={setPendingError} error={!!pendingError}
tryActivation={tryActivation} tryActivation={tryActivation}
resetAccountView={resetAccountView}
/> />
)} )}
{walletView !== WALLET_VIEWS.PENDING && <OptionGrid>{getOptions()}</OptionGrid>} {walletView !== WALLET_VIEWS.PENDING && <OptionGrid data-cy="option-grid">{getOptions()}</OptionGrid>}
{!pendingError && ( {!pendingError && (
<LightCard> <LightCard>
<AutoRow style={{ flexWrap: 'nowrap' }}> <AutoRow style={{ flexWrap: 'nowrap' }}>
......
import { Web3ReactProvider } from '@web3-react/core'
import { Connector } from '@web3-react/types'
import { BACKFILLABLE_WALLETS, getConnectorForWallet, gnosisSafe, network, useConnectors } from 'connectors'
import { ReactNode, useEffect } from 'react'
import { useAppSelector } from 'state/hooks'
const connect = async (connector: Connector) => {
try {
if (connector.connectEagerly) {
await connector.connectEagerly()
} else {
await connector.activate()
}
} catch (error) {
console.debug(`web3-react eager connection error: ${error}`)
}
}
export default function Web3Provider({ children }: { children: ReactNode }) {
const selectedWalletBackfilled = useAppSelector((state) => state.user.selectedWalletBackfilled)
const selectedWallet = useAppSelector((state) => state.user.selectedWallet)
const connectors = useConnectors(selectedWallet)
useEffect(() => {
connect(gnosisSafe)
connect(network)
if (selectedWallet) {
connect(getConnectorForWallet(selectedWallet))
} else if (!selectedWalletBackfilled) {
BACKFILLABLE_WALLETS.map(getConnectorForWallet).forEach(connect)
}
// The dependency list is empty so this is only run once on mount
}, []) // eslint-disable-line react-hooks/exhaustive-deps
return <Web3ReactProvider connectors={connectors}>{children}</Web3ReactProvider>
}
import { Trans } from '@lingui/macro'
import { useEffect } from 'react'
import styled from 'styled-components/macro'
import { useWeb3React } from 'web3-react-core'
import { network } from '../../connectors'
import { NetworkContextName } from '../../constants/misc'
import { useEagerConnect, useInactiveListener } from '../../hooks/web3'
const MessageWrapper = styled.div`
display: flex;
align-items: center;
justify-content: center;
height: 20rem;
`
const Message = styled.h2`
color: ${({ theme }) => theme.secondary1};
`
export default function Web3ReactManager({ children }: { children: JSX.Element }) {
const { active } = useWeb3React()
const { active: networkActive, error: networkError, activate: activateNetwork } = useWeb3React(NetworkContextName)
// try to eagerly connect to an injected provider, if it exists and has granted access already
const triedEager = useEagerConnect()
// after eagerly trying injected, if the network connect ever isn't active or in an error state, activate itd
useEffect(() => {
if (triedEager && !networkActive && !networkError && !active) {
activateNetwork(network)
}
}, [triedEager, networkActive, networkError, activateNetwork, active])
// when there's no account connected, react to logins (broadly speaking) on the injected provider, if it exists
useInactiveListener(!triedEager)
// if the account context isn't active, and there's an error on the network context, it's an irrecoverable error
if (triedEager && !active && networkError) {
return (
<MessageWrapper>
<Message>
<Trans>
Oops! An unknown error occurred. Please refresh the page, or visit from another browser or device.
</Trans>
</Message>
</MessageWrapper>
)
}
return children
}
// eslint-disable-next-line no-restricted-imports // eslint-disable-next-line no-restricted-imports
import { t, Trans } from '@lingui/macro' import { t, Trans } from '@lingui/macro'
import { useWeb3React } from '@web3-react/core'
import { Connector } from '@web3-react/types' import { Connector } from '@web3-react/types'
import { getWalletForConnector } from 'connectors'
import { darken } from 'polished' import { darken } from 'polished'
import { useMemo } from 'react' import { useMemo } from 'react'
import { Activity } from 'react-feather' import { Activity } from 'react-feather'
import { useAppSelector } from 'state/hooks'
import styled, { css } from 'styled-components/macro' import styled, { css } from 'styled-components/macro'
import { AbstractConnector } from 'web3-react-abstract-connector' import { isChainAllowed } from 'utils/switchChain'
import { UnsupportedChainIdError, useWeb3React } from 'web3-react-core'
import { NetworkContextName } from '../../constants/misc'
import useENSName from '../../hooks/useENSName'
import { useHasSocks } from '../../hooks/useSocksBalance' import { useHasSocks } from '../../hooks/useSocksBalance'
import { useWalletModalToggle } from '../../state/application/hooks' import { useWalletModalToggle } from '../../state/application/hooks'
import { isTransactionRecent, useAllTransactions } from '../../state/transactions/hooks' import { isTransactionRecent, useAllTransactions } from '../../state/transactions/hooks'
...@@ -131,7 +131,7 @@ function Sock() { ...@@ -131,7 +131,7 @@ function Sock() {
) )
} }
function WrappedStatusIcon({ connector }: { connector: AbstractConnector | Connector }) { function WrappedStatusIcon({ connector }: { connector: Connector }) {
return ( return (
<IconWrapper size={16}> <IconWrapper size={16}>
<StatusIcon connector={connector} /> <StatusIcon connector={connector} />
...@@ -140,9 +140,11 @@ function WrappedStatusIcon({ connector }: { connector: AbstractConnector | Conne ...@@ -140,9 +140,11 @@ function WrappedStatusIcon({ connector }: { connector: AbstractConnector | Conne
} }
function Web3StatusInner() { function Web3StatusInner() {
const { account, connector, error } = useWeb3React() const { account, connector, chainId, ENSName } = useWeb3React()
const { ENSName } = useENSName(account ?? undefined) const error = useAppSelector((state) => state.wallet.errorByWallet[getWalletForConnector(connector)])
const chainAllowed = chainId && isChainAllowed(connector, chainId)
const allTransactions = useAllTransactions() const allTransactions = useAllTransactions()
...@@ -157,7 +159,27 @@ function Web3StatusInner() { ...@@ -157,7 +159,27 @@ function Web3StatusInner() {
const hasSocks = useHasSocks() const hasSocks = useHasSocks()
const toggleWalletModal = useWalletModalToggle() const toggleWalletModal = useWalletModalToggle()
if (account) { if (!chainId) {
return null
} else if (!chainAllowed) {
return (
<Web3StatusError onClick={toggleWalletModal}>
<NetworkIcon />
<Text>
<Trans>Wrong Network</Trans>
</Text>
</Web3StatusError>
)
} else if (error) {
return (
<Web3StatusError onClick={toggleWalletModal}>
<NetworkIcon />
<Text>
<Trans>Error</Trans>
</Text>
</Web3StatusError>
)
} else if (account) {
return ( return (
<Web3StatusConnected id="web3-status-connected" onClick={toggleWalletModal} pending={hasPendingTransactions}> <Web3StatusConnected id="web3-status-connected" onClick={toggleWalletModal} pending={hasPendingTransactions}>
{hasPendingTransactions ? ( {hasPendingTransactions ? (
...@@ -176,13 +198,6 @@ function Web3StatusInner() { ...@@ -176,13 +198,6 @@ function Web3StatusInner() {
{!hasPendingTransactions && connector && <WrappedStatusIcon connector={connector} />} {!hasPendingTransactions && connector && <WrappedStatusIcon connector={connector} />}
</Web3StatusConnected> </Web3StatusConnected>
) )
} else if (error) {
return (
<Web3StatusError onClick={toggleWalletModal}>
<NetworkIcon />
<Text>{error instanceof UnsupportedChainIdError ? <Trans>Wrong Network</Trans> : <Trans>Error</Trans>}</Text>
</Web3StatusError>
)
} else { } else {
return ( return (
<Web3StatusConnect id="connect-wallet" onClick={toggleWalletModal} faded={!account}> <Web3StatusConnect id="connect-wallet" onClick={toggleWalletModal} faded={!account}>
...@@ -195,10 +210,7 @@ function Web3StatusInner() { ...@@ -195,10 +210,7 @@ function Web3StatusInner() {
} }
export default function Web3Status() { export default function Web3Status() {
const { active, account } = useWeb3React() const { ENSName } = useWeb3React()
const contextNetwork = useWeb3React(NetworkContextName)
const { ENSName } = useENSName(account ?? undefined)
const allTransactions = useAllTransactions() const allTransactions = useAllTransactions()
...@@ -213,9 +225,7 @@ export default function Web3Status() { ...@@ -213,9 +225,7 @@ export default function Web3Status() {
return ( return (
<> <>
<Web3StatusInner /> <Web3StatusInner />
{(contextNetwork.active || active) && ( <WalletModal ENSName={ENSName ?? undefined} pendingTransactions={pending} confirmedTransactions={confirmed} />
<WalletModal ENSName={ENSName ?? undefined} pendingTransactions={pending} confirmedTransactions={confirmed} />
)}
</> </>
) )
} }
...@@ -53,7 +53,7 @@ interface StakingModalProps { ...@@ -53,7 +53,7 @@ interface StakingModalProps {
} }
export default function StakingModal({ isOpen, onDismiss, stakingInfo, userLiquidityUnstaked }: StakingModalProps) { export default function StakingModal({ isOpen, onDismiss, stakingInfo, userLiquidityUnstaked }: StakingModalProps) {
const { library } = useActiveWeb3React() const { provider } = useActiveWeb3React()
// track and parse user input // track and parse user input
const [typedValue, setTypedValue] = useState('') const [typedValue, setTypedValue] = useState('')
...@@ -144,7 +144,7 @@ export default function StakingModal({ isOpen, onDismiss, stakingInfo, userLiqui ...@@ -144,7 +144,7 @@ export default function StakingModal({ isOpen, onDismiss, stakingInfo, userLiqui
}, [maxAmountInput, onUserInput]) }, [maxAmountInput, onUserInput])
async function onAttemptToApprove() { async function onAttemptToApprove() {
if (!pairContract || !library || !deadline) throw new Error('missing dependencies') if (!pairContract || !provider || !deadline) throw new Error('missing dependencies')
if (!parsedAmount) throw new Error('missing liquidity amount') if (!parsedAmount) throw new Error('missing liquidity amount')
if (gatherPermitSignature) { if (gatherPermitSignature) {
......
import { FortmaticConnector as FortmaticConnectorCore } from 'web3-react-fortmatic-connector'
export const OVERLAY_READY = 'OVERLAY_READY'
type FormaticSupportedChains = 1 | 3 | 4 | 42
const CHAIN_ID_NETWORK_ARGUMENT: { readonly [chainId in FormaticSupportedChains]: string | undefined } = {
1: undefined,
3: 'ropsten',
4: 'rinkeby',
42: 'kovan',
}
export class FortmaticConnector extends FortmaticConnectorCore {
async activate() {
if (!this.fortmatic) {
const { default: Fortmatic } = await import('fortmatic')
const { apiKey, chainId } = this as any
if (chainId in CHAIN_ID_NETWORK_ARGUMENT) {
this.fortmatic = new Fortmatic(apiKey, CHAIN_ID_NETWORK_ARGUMENT[chainId as FormaticSupportedChains])
} else {
throw new Error(`Unsupported network ID: ${chainId}`)
}
}
const provider = this.fortmatic.getProvider()
const pollForOverlayReady = new Promise<void>((resolve) => {
const interval = setInterval(() => {
if (provider.overlayReady) {
clearInterval(interval)
this.emit(OVERLAY_READY)
resolve()
}
}, 200)
})
const [account] = await Promise.all([
provider.enable().then((accounts: string[]) => accounts[0]),
pollForOverlayReady,
])
return { provider: this.fortmatic.getProvider(), chainId: (this as any).chainId, account }
}
}
import invariant from 'tiny-invariant'
import { AbstractConnector } from 'web3-react-abstract-connector'
import { ConnectorUpdate } from 'web3-react-types'
interface NetworkConnectorArguments {
urls: { [chainId: number]: string }
defaultChainId?: number
}
// taken from ethers.js, compatible interface with web3 provider
type AsyncSendable = {
isMetaMask?: boolean
host?: string
path?: string
sendAsync?: (request: any, callback: (error: any, response: any) => void) => void
send?: (request: any, callback: (error: any, response: any) => void) => void
}
class RequestError extends Error {
constructor(message: string, public code: number, public data?: unknown) {
super(message)
}
}
interface BatchItem {
request: { jsonrpc: '2.0'; id: number; method: string; params: unknown }
resolve: (result: any) => void
reject: (error: Error) => void
}
class MiniRpcProvider implements AsyncSendable {
public readonly isMetaMask: false = false
public readonly chainId: number
public readonly url: string
public readonly host: string
public readonly path: string
public readonly batchWaitTimeMs: number
private readonly connector: NetworkConnector
private nextId = 1
private batchTimeoutId: ReturnType<typeof setTimeout> | null = null
private batch: BatchItem[] = []
constructor(connector: NetworkConnector, chainId: number, url: string, batchWaitTimeMs?: number) {
this.connector = connector
this.chainId = chainId
this.url = url
const parsed = new URL(url)
this.host = parsed.host
this.path = parsed.pathname
// how long to wait to batch calls
this.batchWaitTimeMs = batchWaitTimeMs ?? 50
}
public readonly clearBatch = async () => {
console.debug('Clearing batch', this.batch)
let batch = this.batch
batch = batch.filter((b) => {
if (b.request.method === 'wallet_switchEthereumChain') {
try {
this.connector.changeChainId(parseInt((b.request.params as [{ chainId: string }])[0].chainId))
b.resolve({ id: b.request.id })
} catch (error) {
b.reject(error)
}
return false
}
return true
})
this.batch = []
this.batchTimeoutId = null
let response: Response
try {
response = await fetch(this.url, {
method: 'POST',
headers: { 'content-type': 'application/json', accept: 'application/json' },
body: JSON.stringify(batch.map((item) => item.request)),
})
} catch (error) {
batch.forEach(({ reject }) => reject(new Error('Failed to send batch call')))
return
}
if (!response.ok) {
batch.forEach(({ reject }) => reject(new RequestError(`${response.status}: ${response.statusText}`, -32000)))
return
}
let json
try {
json = await response.json()
} catch (error) {
batch.forEach(({ reject }) => reject(new Error('Failed to parse JSON response')))
return
}
const byKey = batch.reduce<{ [id: number]: BatchItem }>((memo, current) => {
memo[current.request.id] = current
return memo
}, {})
for (const result of json) {
const {
resolve,
reject,
request: { method },
} = byKey[result.id]
if ('error' in result) {
reject(new RequestError(result?.error?.message, result?.error?.code, result?.error?.data))
} else if ('result' in result && resolve) {
resolve(result.result)
} else {
reject(new RequestError(`Received unexpected JSON-RPC response to ${method} request.`, -32000, result))
}
}
}
public readonly sendAsync = (
request: {
jsonrpc: '2.0'
id: number | string | null
method: string
params?: unknown[] | Record<string, unknown>
},
callback: (error: any, response: any) => void
): void => {
this.request(request.method, request.params)
.then((result) => callback(null, { jsonrpc: '2.0', id: request.id, result }))
.catch((error) => callback(error, null))
}
public readonly request = async (
method: string | { method: string; params: unknown[] },
params?: unknown[] | Record<string, unknown>
): Promise<unknown> => {
if (typeof method !== 'string') {
return this.request(method.method, method.params)
}
if (method === 'eth_chainId') {
return `0x${this.chainId.toString(16)}`
}
const promise = new Promise((resolve, reject) => {
this.batch.push({
request: {
jsonrpc: '2.0',
id: this.nextId++,
method,
params,
},
resolve,
reject,
})
})
this.batchTimeoutId = this.batchTimeoutId ?? setTimeout(this.clearBatch, this.batchWaitTimeMs)
return promise
}
}
export class NetworkConnector extends AbstractConnector {
private readonly providers: { [chainId: number]: MiniRpcProvider }
private currentChainId: number
constructor({ urls, defaultChainId }: NetworkConnectorArguments) {
invariant(defaultChainId || Object.keys(urls).length === 1, 'defaultChainId is a required argument with >1 url')
super({ supportedChainIds: Object.keys(urls).map((k): number => Number(k)) })
this.currentChainId = defaultChainId ?? Number(Object.keys(urls)[0])
this.providers = Object.keys(urls).reduce<{ [chainId: number]: MiniRpcProvider }>((accumulator, chainId) => {
accumulator[Number(chainId)] = new MiniRpcProvider(this, Number(chainId), urls[Number(chainId)])
return accumulator
}, {})
}
public get provider(): MiniRpcProvider {
return this.providers[this.currentChainId]
}
public async activate(): Promise<ConnectorUpdate> {
return { provider: this.providers[this.currentChainId], chainId: this.currentChainId, account: null }
}
public async getProvider(): Promise<MiniRpcProvider> {
return this.providers[this.currentChainId]
}
public async getChainId(): Promise<number> {
return this.currentChainId
}
public async getAccount(): Promise<null> {
return null
}
public deactivate() {
return
}
/**
* Meant to be called only by MiniRpcProvider
* @param chainId the new chain id
*/
public changeChainId(chainId: number) {
if (chainId in this.providers) {
this.currentChainId = chainId
this.emitUpdate({
chainId,
account: null,
provider: this.providers[chainId],
})
} else {
throw new Error(`Unsupported chain ID: ${chainId}`)
}
}
}
import { Web3Provider } from '@ethersproject/providers' import { CoinbaseWallet } from '@web3-react/coinbase-wallet'
import { SafeAppConnector } from '@gnosis.pm/safe-apps-web3-react' import { initializeConnector, Web3ReactHooks } from '@web3-react/core'
import { ALL_SUPPORTED_CHAIN_IDS, SupportedChainId } from 'constants/chains' import { EIP1193 } from '@web3-react/eip1193'
import { GnosisSafe } from '@web3-react/gnosis-safe'
import { MetaMask } from '@web3-react/metamask'
import { Network } from '@web3-react/network'
import { Connector } from '@web3-react/types'
import { WalletConnect } from '@web3-react/walletconnect'
import { SupportedChainId } from 'constants/chains'
import { INFURA_NETWORK_URLS } from 'constants/infura' import { INFURA_NETWORK_URLS } from 'constants/infura'
import { InjectedConnector } from 'web3-react-injected-connector' import Fortmatic from 'fortmatic'
import { WalletConnectConnector } from 'web3-react-walletconnect-connector' import { useMemo } from 'react'
import { WalletLinkConnector } from 'web3-react-walletlink-connector'
import UNISWAP_LOGO_URL from '../assets/svg/logo.svg' import UNISWAP_LOGO_URL from '../assets/svg/logo.svg'
import getLibrary from '../utils/getLibrary'
import { FortmaticConnector } from './Fortmatic' export enum Wallet {
import { NetworkConnector } from './NetworkConnector' INJECTED = 'INJECTED',
COINBASE_WALLET = 'COINBASE_WALLET',
const FORMATIC_KEY = process.env.REACT_APP_FORTMATIC_KEY WALLET_CONNECT = 'WALLET_CONNECT',
FORTMATIC = 'FORTMATIC',
export const network = new NetworkConnector({ NETWORK = 'NETWORK',
urls: INFURA_NETWORK_URLS, GNOSIS_SAFE = 'GNOSIS_SAFE',
defaultChainId: 1, }
})
export const BACKFILLABLE_WALLETS = [Wallet.COINBASE_WALLET, Wallet.WALLET_CONNECT, Wallet.INJECTED]
let networkLibrary: Web3Provider | undefined export const SELECTABLE_WALLETS = [...BACKFILLABLE_WALLETS, Wallet.FORTMATIC]
export function getNetworkLibrary(): Web3Provider {
return (networkLibrary = networkLibrary ?? getLibrary(network.provider)) function onError(error: Error) {
} console.debug(`web3-react error: ${error}`)
}
export const injected = new InjectedConnector({
supportedChainIds: ALL_SUPPORTED_CHAIN_IDS, export function getWalletForConnector(connector: Connector) {
}) switch (connector) {
case injected:
export const gnosisSafe = new SafeAppConnector() return Wallet.INJECTED
case coinbaseWallet:
export const walletconnect = new WalletConnectConnector({ return Wallet.COINBASE_WALLET
supportedChainIds: ALL_SUPPORTED_CHAIN_IDS, case walletConnect:
rpc: INFURA_NETWORK_URLS, return Wallet.WALLET_CONNECT
qrcode: true, case fortmatic:
}) return Wallet.FORTMATIC
case network:
// mainnet only return Wallet.NETWORK
export const fortmatic = new FortmaticConnector({ case gnosisSafe:
apiKey: FORMATIC_KEY ?? '', return Wallet.GNOSIS_SAFE
chainId: 1, default:
}) throw Error('unsupported connector')
}
export const walletlink = new WalletLinkConnector({ }
url: INFURA_NETWORK_URLS[SupportedChainId.MAINNET],
appName: 'Uniswap', export function getConnectorForWallet(wallet: Wallet) {
appLogoUrl: UNISWAP_LOGO_URL, switch (wallet) {
supportedChainIds: ALL_SUPPORTED_CHAIN_IDS, case Wallet.INJECTED:
}) return injected
case Wallet.COINBASE_WALLET:
return coinbaseWallet
case Wallet.WALLET_CONNECT:
return walletConnect
case Wallet.FORTMATIC:
return fortmatic
case Wallet.NETWORK:
return network
case Wallet.GNOSIS_SAFE:
return gnosisSafe
}
}
function getHooksForWallet(wallet: Wallet) {
switch (wallet) {
case Wallet.INJECTED:
return injectedHooks
case Wallet.COINBASE_WALLET:
return coinbaseWalletHooks
case Wallet.WALLET_CONNECT:
return walletConnectHooks
case Wallet.FORTMATIC:
return fortmaticHooks
case Wallet.NETWORK:
return networkHooks
case Wallet.GNOSIS_SAFE:
return gnosisSafeHooks
}
}
export const [network, networkHooks] = initializeConnector<Network>(
(actions) => new Network({ actions, urlMap: INFURA_NETWORK_URLS, defaultChainId: 1 })
)
export const [injected, injectedHooks] = initializeConnector<MetaMask>((actions) => new MetaMask({ actions, onError }))
export const [gnosisSafe, gnosisSafeHooks] = initializeConnector<GnosisSafe>((actions) => new GnosisSafe({ actions }))
export const [walletConnect, walletConnectHooks] = initializeConnector<WalletConnect>(
(actions) =>
new WalletConnect({
actions,
options: {
rpc: INFURA_NETWORK_URLS,
qrcode: true,
},
onError,
})
)
export const [fortmatic, fortmaticHooks] = initializeConnector<EIP1193>(
(actions) => new EIP1193({ actions, provider: new Fortmatic(process.env.REACT_APP_FORTMATIC_KEY).getProvider() })
)
export const [coinbaseWallet, coinbaseWalletHooks] = initializeConnector<CoinbaseWallet>(
(actions) =>
new CoinbaseWallet({
actions,
options: {
url: INFURA_NETWORK_URLS[SupportedChainId.MAINNET],
appName: 'Uniswap',
appLogoUrl: UNISWAP_LOGO_URL,
},
onError,
})
)
interface ConnectorListItem {
connector: Connector
hooks: Web3ReactHooks
}
function getConnectorListItemForWallet(wallet: Wallet) {
return {
connector: getConnectorForWallet(wallet),
hooks: getHooksForWallet(wallet),
}
}
export function useConnectors(selectedWallet: Wallet | undefined) {
return useMemo(() => {
const connectors: ConnectorListItem[] = [{ connector: gnosisSafe, hooks: gnosisSafeHooks }]
if (selectedWallet) {
connectors.push(getConnectorListItemForWallet(selectedWallet))
}
connectors.push(
...SELECTABLE_WALLETS.filter((wallet) => wallet !== selectedWallet).map(getConnectorListItemForWallet)
)
connectors.push({ connector: network, hooks: networkHooks })
const web3ReactConnectors: [Connector, Web3ReactHooks][] = connectors.map(({ connector, hooks }) => [
connector,
hooks,
])
return web3ReactConnectors
}, [selectedWallet])
}
import { JsonRpcProvider } from '@ethersproject/providers'
import { SupportedChainId } from './chains' import { SupportedChainId } from './chains'
const INFURA_KEY = process.env.REACT_APP_INFURA_KEY const INFURA_KEY = process.env.REACT_APP_INFURA_KEY
...@@ -5,6 +7,8 @@ if (typeof INFURA_KEY === 'undefined') { ...@@ -5,6 +7,8 @@ if (typeof INFURA_KEY === 'undefined') {
throw new Error(`REACT_APP_INFURA_KEY must be a defined environment variable`) throw new Error(`REACT_APP_INFURA_KEY must be a defined environment variable`)
} }
export const MAINNET_PROVIDER = new JsonRpcProvider(`https://mainnet.infura.io/v3/${INFURA_KEY}`)
/** /**
* These are the network URLs used by the interface when there is not another available source of chain data * These are the network URLs used by the interface when there is not another available source of chain data
*/ */
......
import { AbstractConnector } from 'web3-react-abstract-connector' import { Connector } from '@web3-react/types'
import INJECTED_ICON_URL from '../assets/images/arrow-right.svg' import INJECTED_ICON_URL from '../assets/images/arrow-right.svg'
import COINBASE_ICON_URL from '../assets/images/coinbaseWalletIcon.svg' import COINBASE_ICON_URL from '../assets/images/coinbaseWalletIcon.svg'
import FORTMATIC_ICON_URL from '../assets/images/fortmaticIcon.png' import FORTMATIC_ICON_URL from '../assets/images/fortmaticIcon.png'
import METAMASK_ICON_URL from '../assets/images/metamask.png' import METAMASK_ICON_URL from '../assets/images/metamask.png'
import WALLETCONNECT_ICON_URL from '../assets/images/walletConnectIcon.svg' import WALLETCONNECT_ICON_URL from '../assets/images/walletConnectIcon.svg'
import { fortmatic, injected, walletconnect, walletlink } from '../connectors' import { coinbaseWallet, fortmatic, injected, Wallet, walletConnect } from '../connectors'
interface WalletInfo { interface WalletInfo {
connector?: AbstractConnector connector?: Connector
wallet?: Wallet
name: string name: string
iconURL: string iconURL: string
description: string description: string
...@@ -22,6 +23,7 @@ interface WalletInfo { ...@@ -22,6 +23,7 @@ interface WalletInfo {
export const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = { export const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = {
INJECTED: { INJECTED: {
connector: injected, connector: injected,
wallet: Wallet.INJECTED,
name: 'Injected', name: 'Injected',
iconURL: INJECTED_ICON_URL, iconURL: INJECTED_ICON_URL,
description: 'Injected web3 provider.', description: 'Injected web3 provider.',
...@@ -31,6 +33,7 @@ export const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = { ...@@ -31,6 +33,7 @@ export const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = {
}, },
METAMASK: { METAMASK: {
connector: injected, connector: injected,
wallet: Wallet.INJECTED,
name: 'MetaMask', name: 'MetaMask',
iconURL: METAMASK_ICON_URL, iconURL: METAMASK_ICON_URL,
description: 'Easy-to-use browser extension.', description: 'Easy-to-use browser extension.',
...@@ -38,7 +41,8 @@ export const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = { ...@@ -38,7 +41,8 @@ export const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = {
color: '#E8831D', color: '#E8831D',
}, },
WALLET_CONNECT: { WALLET_CONNECT: {
connector: walletconnect, connector: walletConnect,
wallet: Wallet.WALLET_CONNECT,
name: 'WalletConnect', name: 'WalletConnect',
iconURL: WALLETCONNECT_ICON_URL, iconURL: WALLETCONNECT_ICON_URL,
description: 'Connect to Trust Wallet, Rainbow Wallet and more...', description: 'Connect to Trust Wallet, Rainbow Wallet and more...',
...@@ -46,8 +50,9 @@ export const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = { ...@@ -46,8 +50,9 @@ export const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = {
color: '#4196FC', color: '#4196FC',
mobile: true, mobile: true,
}, },
WALLET_LINK: { COINBASE_WALLET: {
connector: walletlink, connector: coinbaseWallet,
wallet: Wallet.COINBASE_WALLET,
name: 'Coinbase Wallet', name: 'Coinbase Wallet',
iconURL: COINBASE_ICON_URL, iconURL: COINBASE_ICON_URL,
description: 'Use Coinbase Wallet app on mobile device', description: 'Use Coinbase Wallet app on mobile device',
...@@ -65,6 +70,7 @@ export const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = { ...@@ -65,6 +70,7 @@ export const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = {
}, },
FORTMATIC: { FORTMATIC: {
connector: fortmatic, connector: fortmatic,
wallet: Wallet.FORTMATIC,
name: 'Fortmatic', name: 'Fortmatic',
iconURL: FORTMATIC_ICON_URL, iconURL: FORTMATIC_ICON_URL,
description: 'Login using Fortmatic hosted wallet', description: 'Login using Fortmatic hosted wallet',
......
/* eslint-disable react-hooks/rules-of-hooks */ // TODO(vm): Rm this file once #3759 is merged.
import { Web3Provider } from '@ethersproject/providers' import { useWeb3React } from '@web3-react/core'
import { useWeb3React } from 'web3-react-core'
import { NetworkContextName } from '../constants/misc'
export default function useActiveWeb3React() { export default function useActiveWeb3React() {
const interfaceContext = useWeb3React<Web3Provider>() return useWeb3React()
const interfaceNetworkContext = useWeb3React<Web3Provider>(
process.env.REACT_APP_IS_WIDGET ? undefined : NetworkContextName
)
if (interfaceContext.active) {
return interfaceContext
}
return interfaceNetworkContext
} }
import { Currency, Token } from '@uniswap/sdk-core'
import useActiveWeb3React from 'hooks/useActiveWeb3React'
import useCurrencyLogoURIs from 'lib/hooks/useCurrencyLogoURIs'
import { useCallback, useState } from 'react'
export default function useAddTokenToMetamask(currencyToAdd: Currency | undefined): {
addToken: () => void
success: boolean | undefined
} {
const { library } = useActiveWeb3React()
const token: Token | undefined = currencyToAdd?.wrapped
const [success, setSuccess] = useState<boolean | undefined>()
const logoURL = useCurrencyLogoURIs(token)[0]
const addToken = useCallback(() => {
if (library && library?.provider?.isMetaMask && library.provider.request && token) {
library.provider
.request({
method: 'wallet_watchAsset',
params: {
//@ts-ignore // need this for incorrect ethers provider type
type: 'ERC20',
options: {
address: token.address,
symbol: token.symbol,
decimals: token.decimals,
image: logoURL,
},
},
})
.then((success) => {
setSuccess(success)
})
.catch(() => setSuccess(false))
} else {
setSuccess(false)
}
}, [library, logoURL, token])
return { addToken, success }
}
...@@ -48,21 +48,21 @@ export function useContract<T extends Contract = Contract>( ...@@ -48,21 +48,21 @@ export function useContract<T extends Contract = Contract>(
ABI: any, ABI: any,
withSignerIfPossible = true withSignerIfPossible = true
): T | null { ): T | null {
const { library, account, chainId } = useActiveWeb3React() const { provider, account, chainId } = useActiveWeb3React()
return useMemo(() => { return useMemo(() => {
if (!addressOrAddressMap || !ABI || !library || !chainId) return null if (!addressOrAddressMap || !ABI || !provider || !chainId) return null
let address: string | undefined let address: string | undefined
if (typeof addressOrAddressMap === 'string') address = addressOrAddressMap if (typeof addressOrAddressMap === 'string') address = addressOrAddressMap
else address = addressOrAddressMap[chainId] else address = addressOrAddressMap[chainId]
if (!address) return null if (!address) return null
try { try {
return getContract(address, ABI, library, withSignerIfPossible && account ? account : undefined) return getContract(address, ABI, provider, withSignerIfPossible && account ? account : undefined)
} catch (error) { } catch (error) {
console.error('Failed to get contract', error) console.error('Failed to get contract', error)
return null return null
} }
}, [addressOrAddressMap, ABI, library, chainId, withSignerIfPossible, account]) as T }, [addressOrAddressMap, ABI, provider, chainId, withSignerIfPossible, account]) as T
} }
export function useV2MigratorContract() { export function useV2MigratorContract() {
......
...@@ -126,7 +126,7 @@ export function useERC20Permit( ...@@ -126,7 +126,7 @@ export function useERC20Permit(
state: UseERC20PermitState state: UseERC20PermitState
gatherPermitSignature: null | (() => Promise<void>) gatherPermitSignature: null | (() => Promise<void>)
} { } {
const { account, chainId, library } = useActiveWeb3React() const { account, chainId, provider } = useActiveWeb3React()
const tokenAddress = currencyAmount?.currency?.isToken ? currencyAmount.currency.address : undefined const tokenAddress = currencyAmount?.currency?.isToken ? currencyAmount.currency.address : undefined
const eip2612Contract = useEIP2612Contract(tokenAddress) const eip2612Contract = useEIP2612Contract(tokenAddress)
const isArgentWallet = useIsArgentWallet() const isArgentWallet = useIsArgentWallet()
...@@ -145,7 +145,7 @@ export function useERC20Permit( ...@@ -145,7 +145,7 @@ export function useERC20Permit(
!account || !account ||
!chainId || !chainId ||
!transactionDeadline || !transactionDeadline ||
!library || !provider ||
!tokenNonceState.valid || !tokenNonceState.valid ||
!tokenAddress || !tokenAddress ||
!spender || !spender ||
...@@ -221,7 +221,7 @@ export function useERC20Permit( ...@@ -221,7 +221,7 @@ export function useERC20Permit(
message, message,
}) })
return library return provider
.send('eth_signTypedData_v4', [account, data]) .send('eth_signTypedData_v4', [account, data])
.then(splitSignature) .then(splitSignature)
.then((signature) => { .then((signature) => {
...@@ -248,7 +248,7 @@ export function useERC20Permit( ...@@ -248,7 +248,7 @@ export function useERC20Permit(
chainId, chainId,
isArgentWallet, isArgentWallet,
transactionDeadline, transactionDeadline,
library, provider,
tokenNonceState.loading, tokenNonceState.loading,
tokenNonceState.valid, tokenNonceState.valid,
tokenNonceState.result, tokenNonceState.result,
......
import { nanoid } from '@reduxjs/toolkit' import { nanoid } from '@reduxjs/toolkit'
import { TokenList } from '@uniswap/token-lists' import { TokenList } from '@uniswap/token-lists'
import useActiveWeb3React from 'hooks/useActiveWeb3React' import { MAINNET_PROVIDER } from 'constants/infura'
import getTokenList from 'lib/hooks/useTokenList/fetchTokenList' import getTokenList from 'lib/hooks/useTokenList/fetchTokenList'
import resolveENSContentHash from 'lib/utils/resolveENSContentHash' import resolveENSContentHash from 'lib/utils/resolveENSContentHash'
import { useCallback } from 'react' import { useCallback } from 'react'
import { useAppDispatch } from 'state/hooks' import { useAppDispatch } from 'state/hooks'
import { getNetworkLibrary } from '../connectors'
import { fetchTokenList } from '../state/lists/actions' import { fetchTokenList } from '../state/lists/actions'
export function useFetchListCallback(): (listUrl: string, sendDispatch?: boolean) => Promise<TokenList> { export function useFetchListCallback(): (listUrl: string, sendDispatch?: boolean) => Promise<TokenList> {
const { chainId, library } = useActiveWeb3React()
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const ensResolver = useCallback(
async (ensName: string) => {
if (!library || chainId !== 1) {
const networkLibrary = getNetworkLibrary()
const network = await networkLibrary.getNetwork()
if (networkLibrary && network.chainId === 1) {
return resolveENSContentHash(ensName, networkLibrary)
}
throw new Error('Could not construct mainnet ENS resolver')
}
return resolveENSContentHash(ensName, library)
},
[chainId, library]
)
// note: prevent dispatch if using for list search or unsupported list // note: prevent dispatch if using for list search or unsupported list
return useCallback( return useCallback(
async (listUrl: string, sendDispatch = true) => { async (listUrl: string, sendDispatch = true) => {
const requestId = nanoid() const requestId = nanoid()
sendDispatch && dispatch(fetchTokenList.pending({ requestId, url: listUrl })) sendDispatch && dispatch(fetchTokenList.pending({ requestId, url: listUrl }))
return getTokenList(listUrl, ensResolver) return getTokenList(listUrl, (ensName: string) => resolveENSContentHash(ensName, MAINNET_PROVIDER))
.then((tokenList) => { .then((tokenList) => {
sendDispatch && dispatch(fetchTokenList.fulfilled({ url: listUrl, tokenList, requestId })) sendDispatch && dispatch(fetchTokenList.fulfilled({ url: listUrl, tokenList, requestId }))
return tokenList return tokenList
...@@ -44,6 +27,6 @@ export function useFetchListCallback(): (listUrl: string, sendDispatch?: boolean ...@@ -44,6 +27,6 @@ export function useFetchListCallback(): (listUrl: string, sendDispatch?: boolean
throw error throw error
}) })
}, },
[dispatch, ensResolver] [dispatch]
) )
} }
...@@ -39,7 +39,7 @@ export function useSwapCallArguments( ...@@ -39,7 +39,7 @@ export function useSwapCallArguments(
deadline: BigNumber | undefined, deadline: BigNumber | undefined,
feeOptions: FeeOptions | undefined feeOptions: FeeOptions | undefined
): SwapCall[] { ): SwapCall[] {
const { account, chainId, library } = useActiveWeb3React() const { account, chainId, provider } = useActiveWeb3React()
const { address: recipientAddress } = useENS(recipientAddressOrName) const { address: recipientAddress } = useENS(recipientAddressOrName)
const recipient = recipientAddressOrName === null ? account : recipientAddress const recipient = recipientAddressOrName === null ? account : recipientAddress
...@@ -47,7 +47,7 @@ export function useSwapCallArguments( ...@@ -47,7 +47,7 @@ export function useSwapCallArguments(
const argentWalletContract = useArgentWalletContract() const argentWalletContract = useArgentWalletContract()
return useMemo(() => { return useMemo(() => {
if (!trade || !recipient || !library || !account || !chainId || !deadline) return [] if (!trade || !recipient || !provider || !account || !chainId || !deadline) return []
if (trade instanceof V2Trade) { if (trade instanceof V2Trade) {
if (!routerContract) return [] if (!routerContract) return []
...@@ -175,7 +175,7 @@ export function useSwapCallArguments( ...@@ -175,7 +175,7 @@ export function useSwapCallArguments(
chainId, chainId,
deadline, deadline,
feeOptions, feeOptions,
library, provider,
recipient, recipient,
routerContract, routerContract,
signatureData, signatureData,
......
import type { EthereumProvider } from 'lib/ethereum'
import { useEffect, useState } from 'react'
import { useWeb3React } from 'web3-react-core'
import { gnosisSafe, injected } from '../connectors'
import { IS_IN_IFRAME } from '../constants/misc'
import { isMobile } from '../utils/userAgent'
export function useEagerConnect() {
const { activate, active } = useWeb3React()
const [tried, setTried] = useState(false)
// gnosisSafe.isSafeApp() races a timeout against postMessage, so it delays pageload if we are not in a safe app;
// if we are not embedded in an iframe, it is not worth checking
const [triedSafe, setTriedSafe] = useState(!IS_IN_IFRAME)
// first, try connecting to a gnosis safe
useEffect(() => {
if (!triedSafe) {
gnosisSafe.isSafeApp().then((loadedInSafe) => {
if (loadedInSafe) {
activate(gnosisSafe, undefined, true).catch(() => {
setTriedSafe(true)
})
} else {
setTriedSafe(true)
}
})
}
}, [activate, setTriedSafe, triedSafe])
// then, if that fails, try connecting to an injected connector
useEffect(() => {
if (!active && triedSafe) {
injected.isAuthorized().then((isAuthorized) => {
if (isAuthorized) {
activate(injected, undefined, true).catch(() => {
setTried(true)
})
} else {
if (isMobile && window.ethereum) {
activate(injected, undefined, true).catch(() => {
setTried(true)
})
} else {
setTried(true)
}
}
})
}
}, [activate, active, triedSafe])
// wait until we get confirmation of a connection to flip the flag
useEffect(() => {
if (active) {
setTried(true)
}
}, [active])
return tried
}
/**
* Use for network and injected - logs user in
* and out after checking what network theyre on
*/
export function useInactiveListener(suppress = false) {
const { active, error, activate } = useWeb3React()
useEffect(() => {
const ethereum = window.ethereum as EthereumProvider | undefined
if (ethereum && ethereum.on && !active && !error && !suppress) {
const handleChainChanged = () => {
// eat errors
activate(injected, undefined, true).catch((error) => {
console.error('Failed to activate after chain changed', error)
})
}
const handleAccountsChanged = (accounts: string[]) => {
if (accounts.length > 0) {
// eat errors
activate(injected, undefined, true).catch((error) => {
console.error('Failed to activate after accounts changed', error)
})
}
}
ethereum.on('chainChanged', handleChainChanged)
ethereum.on('accountsChanged', handleAccountsChanged)
return () => {
if (ethereum.removeListener) {
ethereum.removeListener('chainChanged', handleChainChanged)
ethereum.removeListener('accountsChanged', handleAccountsChanged)
}
}
}
return undefined
}, [active, error, suppress, activate])
}
...@@ -9,10 +9,9 @@ import { StrictMode } from 'react' ...@@ -9,10 +9,9 @@ import { StrictMode } from 'react'
import ReactDOM from 'react-dom' import ReactDOM from 'react-dom'
import { Provider } from 'react-redux' import { Provider } from 'react-redux'
import { HashRouter } from 'react-router-dom' import { HashRouter } from 'react-router-dom'
import { createWeb3ReactRoot, Web3ReactProvider } from 'web3-react-core'
import Blocklist from './components/Blocklist' import Blocklist from './components/Blocklist'
import { NetworkContextName } from './constants/misc' import Web3Provider from './components/Web3Provider'
import { LanguageProvider } from './i18n' import { LanguageProvider } from './i18n'
import App from './pages/App' import App from './pages/App'
import * as serviceWorkerRegistration from './serviceWorkerRegistration' import * as serviceWorkerRegistration from './serviceWorkerRegistration'
...@@ -24,9 +23,6 @@ import TransactionUpdater from './state/transactions/updater' ...@@ -24,9 +23,6 @@ import TransactionUpdater from './state/transactions/updater'
import UserUpdater from './state/user/updater' import UserUpdater from './state/user/updater'
import ThemeProvider, { ThemedGlobalStyle } from './theme' import ThemeProvider, { ThemedGlobalStyle } from './theme'
import RadialGradientByChainUpdater from './theme/RadialGradientByChainUpdater' import RadialGradientByChainUpdater from './theme/RadialGradientByChainUpdater'
import getLibrary from './utils/getLibrary'
const Web3ProviderNetwork = createWeb3ReactRoot(NetworkContextName)
if (!!window.ethereum) { if (!!window.ethereum) {
window.ethereum.autoRefreshOnNetworkChange = false window.ethereum.autoRefreshOnNetworkChange = false
...@@ -51,19 +47,17 @@ ReactDOM.render( ...@@ -51,19 +47,17 @@ ReactDOM.render(
<Provider store={store}> <Provider store={store}>
<HashRouter> <HashRouter>
<LanguageProvider> <LanguageProvider>
<Web3ReactProvider getLibrary={getLibrary}> <Web3Provider>
<Web3ProviderNetwork getLibrary={getLibrary}> <Blocklist>
<Blocklist> <BlockNumberProvider>
<BlockNumberProvider> <Updaters />
<Updaters /> <ThemeProvider>
<ThemeProvider> <ThemedGlobalStyle />
<ThemedGlobalStyle /> <App />
<App /> </ThemeProvider>
</ThemeProvider> </BlockNumberProvider>
</BlockNumberProvider> </Blocklist>
</Blocklist> </Web3Provider>
</Web3ProviderNetwork>
</Web3ReactProvider>
</LanguageProvider> </LanguageProvider>
</HashRouter> </HashRouter>
</Provider> </Provider>
......
...@@ -42,7 +42,7 @@ export function useSwapCallback({ ...@@ -42,7 +42,7 @@ export function useSwapCallback({
deadline, deadline,
feeOptions, feeOptions,
}: UseSwapCallbackArgs): UseSwapCallbackReturns { }: UseSwapCallbackArgs): UseSwapCallbackReturns {
const { account, chainId, library } = useActiveWeb3React() const { account, chainId, provider } = useActiveWeb3React()
const swapCalls = useSwapCallArguments( const swapCalls = useSwapCallArguments(
trade, trade,
...@@ -52,13 +52,13 @@ export function useSwapCallback({ ...@@ -52,13 +52,13 @@ export function useSwapCallback({
deadline, deadline,
feeOptions feeOptions
) )
const { callback } = useSendSwapTransaction(account, chainId, library, trade, swapCalls) const { callback } = useSendSwapTransaction(account, chainId, provider, trade, swapCalls)
const { address: recipientAddress } = useENS(recipientAddressOrName) const { address: recipientAddress } = useENS(recipientAddressOrName)
const recipient = recipientAddressOrName === null ? account : recipientAddress const recipient = recipientAddressOrName === null ? account : recipientAddress
return useMemo(() => { return useMemo(() => {
if (!trade || !library || !account || !chainId || !callback) { if (!trade || !provider || !account || !chainId || !callback) {
return { state: SwapCallbackState.INVALID, error: <Trans>Missing dependencies</Trans> } return { state: SwapCallbackState.INVALID, error: <Trans>Missing dependencies</Trans> }
} }
if (!recipient) { if (!recipient) {
...@@ -73,5 +73,5 @@ export function useSwapCallback({ ...@@ -73,5 +73,5 @@ export function useSwapCallback({
state: SwapCallbackState.VALID, state: SwapCallbackState.VALID,
callback: async () => callback(), callback: async () => callback(),
} }
}, [trade, library, account, chainId, callback, recipient, recipientAddressOrName]) }, [trade, provider, account, chainId, callback, recipient, recipientAddressOrName])
} }
...@@ -45,18 +45,18 @@ interface UpdaterProps { ...@@ -45,18 +45,18 @@ interface UpdaterProps {
} }
export default function Updater({ pendingTransactions, onCheck, onReceipt }: UpdaterProps): null { export default function Updater({ pendingTransactions, onCheck, onReceipt }: UpdaterProps): null {
const { chainId, library } = useActiveWeb3React() const { chainId, provider } = useActiveWeb3React()
const lastBlockNumber = useBlockNumber() const lastBlockNumber = useBlockNumber()
const fastForwardBlockNumber = useFastForwardBlockNumber() const fastForwardBlockNumber = useFastForwardBlockNumber()
const getReceipt = useCallback( const getReceipt = useCallback(
(hash: string) => { (hash: string) => {
if (!library || !chainId) throw new Error('No library or chainId') if (!provider || !chainId) throw new Error('No provider or chainId')
const retryOptions = RETRY_OPTIONS_BY_CHAIN_ID[chainId] ?? DEFAULT_RETRY_OPTIONS const retryOptions = RETRY_OPTIONS_BY_CHAIN_ID[chainId] ?? DEFAULT_RETRY_OPTIONS
return retry( return retry(
() => () =>
library.getTransactionReceipt(hash).then((receipt) => { provider.getTransactionReceipt(hash).then((receipt) => {
if (receipt === null) { if (receipt === null) {
console.debug(`Retrying tranasaction receipt for ${hash}`) console.debug(`Retrying tranasaction receipt for ${hash}`)
throw new RetryableError() throw new RetryableError()
...@@ -66,11 +66,11 @@ export default function Updater({ pendingTransactions, onCheck, onReceipt }: Upd ...@@ -66,11 +66,11 @@ export default function Updater({ pendingTransactions, onCheck, onReceipt }: Upd
retryOptions retryOptions
) )
}, },
[chainId, library] [chainId, provider]
) )
useEffect(() => { useEffect(() => {
if (!chainId || !library || !lastBlockNumber) return if (!chainId || !provider || !lastBlockNumber) return
const cancels = Object.keys(pendingTransactions) const cancels = Object.keys(pendingTransactions)
.filter((hash) => shouldCheck(lastBlockNumber, pendingTransactions[hash])) .filter((hash) => shouldCheck(lastBlockNumber, pendingTransactions[hash]))
...@@ -95,7 +95,7 @@ export default function Updater({ pendingTransactions, onCheck, onReceipt }: Upd ...@@ -95,7 +95,7 @@ export default function Updater({ pendingTransactions, onCheck, onReceipt }: Upd
return () => { return () => {
cancels.forEach((cancel) => cancel()) cancels.forEach((cancel) => cancel())
} }
}, [chainId, library, lastBlockNumber, getReceipt, fastForwardBlockNumber, onReceipt, onCheck, pendingTransactions]) }, [chainId, provider, lastBlockNumber, getReceipt, fastForwardBlockNumber, onReceipt, onCheck, pendingTransactions])
return null return null
} }
...@@ -29,7 +29,7 @@ export function useFastForwardBlockNumber(): (block: number) => void { ...@@ -29,7 +29,7 @@ export function useFastForwardBlockNumber(): (block: number) => void {
} }
export function BlockNumberProvider({ children }: { children: ReactNode }) { export function BlockNumberProvider({ children }: { children: ReactNode }) {
const { chainId: activeChainId, library } = useActiveWeb3React() const { chainId: activeChainId, provider } = useActiveWeb3React()
const [{ chainId, block }, setChainBlock] = useState<{ chainId?: number; block?: number }>({ chainId: activeChainId }) const [{ chainId, block }, setChainBlock] = useState<{ chainId?: number; block?: number }>({ chainId: activeChainId })
const onBlock = useCallback( const onBlock = useCallback(
...@@ -48,24 +48,24 @@ export function BlockNumberProvider({ children }: { children: ReactNode }) { ...@@ -48,24 +48,24 @@ export function BlockNumberProvider({ children }: { children: ReactNode }) {
const windowVisible = useIsWindowVisible() const windowVisible = useIsWindowVisible()
useEffect(() => { useEffect(() => {
if (library && activeChainId && windowVisible) { if (provider && activeChainId && windowVisible) {
// If chainId hasn't changed, don't clear the block. This prevents re-fetching still valid data. // If chainId hasn't changed, don't clear the block. This prevents re-fetching still valid data.
setChainBlock((chainBlock) => (chainBlock.chainId === activeChainId ? chainBlock : { chainId: activeChainId })) setChainBlock((chainBlock) => (chainBlock.chainId === activeChainId ? chainBlock : { chainId: activeChainId }))
library provider
.getBlockNumber() .getBlockNumber()
.then(onBlock) .then(onBlock)
.catch((error) => { .catch((error) => {
console.error(`Failed to get block number for chainId ${activeChainId}`, error) console.error(`Failed to get block number for chainId ${activeChainId}`, error)
}) })
library.on('block', onBlock) provider.on('block', onBlock)
return () => { return () => {
library.removeListener('block', onBlock) provider.removeListener('block', onBlock)
} }
} }
return undefined return undefined
}, [activeChainId, library, onBlock, setChainBlock, windowVisible]) }, [activeChainId, provider, onBlock, setChainBlock, windowVisible])
const value = useMemo( const value = useMemo(
() => ({ () => ({
......
...@@ -6,6 +6,7 @@ import { useBytes32TokenContract, useTokenContract } from 'hooks/useContract' ...@@ -6,6 +6,7 @@ import { useBytes32TokenContract, useTokenContract } from 'hooks/useContract'
import { NEVER_RELOAD, useSingleCallResult } from 'lib/hooks/multicall' import { NEVER_RELOAD, useSingleCallResult } from 'lib/hooks/multicall'
import useNativeCurrency from 'lib/hooks/useNativeCurrency' import useNativeCurrency from 'lib/hooks/useNativeCurrency'
import { useMemo } from 'react' import { useMemo } from 'react'
import { isChainAllowed } from 'utils/switchChain'
import { TOKEN_SHORTHANDS } from '../../constants/tokens' import { TOKEN_SHORTHANDS } from '../../constants/tokens'
import { isAddress } from '../../utils' import { isAddress } from '../../utils'
...@@ -29,7 +30,8 @@ function parseStringOrBytes32(str: string | undefined, bytes32: string | undefin ...@@ -29,7 +30,8 @@ function parseStringOrBytes32(str: string | undefined, bytes32: string | undefin
* Returns undefined if tokenAddress is invalid or token does not exist. * Returns undefined if tokenAddress is invalid or token does not exist.
*/ */
export function useTokenFromNetwork(tokenAddress: string | null | undefined): Token | null | undefined { export function useTokenFromNetwork(tokenAddress: string | null | undefined): Token | null | undefined {
const { chainId } = useActiveWeb3React() const { chainId, connector } = useActiveWeb3React()
const chainAllowed = chainId && isChainAllowed(connector, chainId)
const formattedAddress = isAddress(tokenAddress) const formattedAddress = isAddress(tokenAddress)
...@@ -43,7 +45,7 @@ export function useTokenFromNetwork(tokenAddress: string | null | undefined): To ...@@ -43,7 +45,7 @@ export function useTokenFromNetwork(tokenAddress: string | null | undefined): To
const decimals = useSingleCallResult(tokenContract, 'decimals', undefined, NEVER_RELOAD) const decimals = useSingleCallResult(tokenContract, 'decimals', undefined, NEVER_RELOAD)
return useMemo(() => { return useMemo(() => {
if (typeof tokenAddress !== 'string' || !chainId || !formattedAddress) return undefined if (typeof tokenAddress !== 'string' || !chainAllowed || !formattedAddress) return undefined
if (decimals.loading || symbol.loading || tokenName.loading) return null if (decimals.loading || symbol.loading || tokenName.loading) return null
if (decimals.result) { if (decimals.result) {
return new Token( return new Token(
...@@ -58,6 +60,7 @@ export function useTokenFromNetwork(tokenAddress: string | null | undefined): To ...@@ -58,6 +60,7 @@ export function useTokenFromNetwork(tokenAddress: string | null | undefined): To
}, [ }, [
formattedAddress, formattedAddress,
chainId, chainId,
chainAllowed,
decimals.loading, decimals.loading,
decimals.result, decimals.result,
symbol.loading, symbol.loading,
...@@ -93,7 +96,7 @@ export function useTokenFromMapOrNetwork(tokens: TokenMap, tokenAddress?: string ...@@ -93,7 +96,7 @@ export function useTokenFromMapOrNetwork(tokens: TokenMap, tokenAddress?: string
*/ */
export function useCurrencyFromMap(tokens: TokenMap, currencyId?: string | null): Currency | null | undefined { export function useCurrencyFromMap(tokens: TokenMap, currencyId?: string | null): Currency | null | undefined {
const nativeCurrency = useNativeCurrency() const nativeCurrency = useNativeCurrency()
const { chainId } = useActiveWeb3React() const { chainId, connector } = useActiveWeb3React()
const isNative = Boolean(nativeCurrency && currencyId?.toUpperCase() === 'ETH') const isNative = Boolean(nativeCurrency && currencyId?.toUpperCase() === 'ETH')
const shorthandMatchAddress = useMemo(() => { const shorthandMatchAddress = useMemo(() => {
const chain = supportedChainId(chainId) const chain = supportedChainId(chainId)
...@@ -102,7 +105,8 @@ export function useCurrencyFromMap(tokens: TokenMap, currencyId?: string | null) ...@@ -102,7 +105,8 @@ export function useCurrencyFromMap(tokens: TokenMap, currencyId?: string | null)
const token = useTokenFromMapOrNetwork(tokens, isNative ? undefined : shorthandMatchAddress ?? currencyId) const token = useTokenFromMapOrNetwork(tokens, isNative ? undefined : shorthandMatchAddress ?? currencyId)
if (currencyId === null || currencyId === undefined) return currencyId const chainAllowed = chainId && isChainAllowed(connector, chainId)
if (currencyId === null || currencyId === undefined || !chainAllowed) return null
// this case so we use our builtin wrapped token instead of wrapped tokens on token lists // this case so we use our builtin wrapped token instead of wrapped tokens on token lists
const wrappedNative = nativeCurrency?.wrapped const wrappedNative = nativeCurrency?.wrapped
......
...@@ -81,7 +81,7 @@ export default function AddLiquidity({ ...@@ -81,7 +81,7 @@ export default function AddLiquidity({
}, },
history, history,
}: RouteComponentProps<{ currencyIdA?: string; currencyIdB?: string; feeAmount?: string; tokenId?: string }>) { }: RouteComponentProps<{ currencyIdA?: string; currencyIdB?: string; feeAmount?: string; tokenId?: string }>) {
const { account, chainId, library } = useActiveWeb3React() const { account, chainId, provider } = useActiveWeb3React()
const theme = useContext(ThemeContext) const theme = useContext(ThemeContext)
const toggleWalletModal = useWalletModalToggle() // toggle wallet when disconnected const toggleWalletModal = useWalletModalToggle() // toggle wallet when disconnected
const expertMode = useIsExpertMode() const expertMode = useIsExpertMode()
...@@ -225,7 +225,7 @@ export default function AddLiquidity({ ...@@ -225,7 +225,7 @@ export default function AddLiquidity({
) )
async function onAdd() { async function onAdd() {
if (!chainId || !library || !account) return if (!chainId || !provider || !account) return
if (!positionManager || !baseCurrency || !quoteCurrency) { if (!positionManager || !baseCurrency || !quoteCurrency) {
return return
...@@ -281,7 +281,7 @@ export default function AddLiquidity({ ...@@ -281,7 +281,7 @@ export default function AddLiquidity({
setAttemptingTxn(true) setAttemptingTxn(true)
library provider
.getSigner() .getSigner()
.estimateGas(txn) .estimateGas(txn)
.then((estimate) => { .then((estimate) => {
...@@ -290,7 +290,7 @@ export default function AddLiquidity({ ...@@ -290,7 +290,7 @@ export default function AddLiquidity({
gasLimit: calculateGasMargin(estimate), gasLimit: calculateGasMargin(estimate),
} }
return library return provider
.getSigner() .getSigner()
.sendTransaction(newTxn) .sendTransaction(newTxn)
.then((response: TransactionResponse) => { .then((response: TransactionResponse) => {
......
...@@ -53,7 +53,7 @@ export default function AddLiquidity({ ...@@ -53,7 +53,7 @@ export default function AddLiquidity({
}, },
history, history,
}: RouteComponentProps<{ currencyIdA?: string; currencyIdB?: string }>) { }: RouteComponentProps<{ currencyIdA?: string; currencyIdB?: string }>) {
const { account, chainId, library } = useActiveWeb3React() const { account, chainId, provider } = useActiveWeb3React()
const theme = useContext(ThemeContext) const theme = useContext(ThemeContext)
...@@ -137,7 +137,7 @@ export default function AddLiquidity({ ...@@ -137,7 +137,7 @@ export default function AddLiquidity({
const addTransaction = useTransactionAdder() const addTransaction = useTransactionAdder()
async function onAdd() { async function onAdd() {
if (!chainId || !library || !account || !router) return if (!chainId || !provider || !account || !router) return
const { [Field.CURRENCY_A]: parsedAmountA, [Field.CURRENCY_B]: parsedAmountB } = parsedAmounts const { [Field.CURRENCY_A]: parsedAmountA, [Field.CURRENCY_B]: parsedAmountB } = parsedAmounts
if (!parsedAmountA || !parsedAmountB || !currencyA || !currencyB || !deadline) { if (!parsedAmountA || !parsedAmountB || !currencyA || !currencyB || !deadline) {
......
...@@ -11,7 +11,6 @@ import ErrorBoundary from '../components/ErrorBoundary' ...@@ -11,7 +11,6 @@ import ErrorBoundary from '../components/ErrorBoundary'
import Header from '../components/Header' import Header from '../components/Header'
import Polling from '../components/Header/Polling' import Polling from '../components/Header/Polling'
import Popups from '../components/Popups' import Popups from '../components/Popups'
import Web3ReactManager from '../components/Web3ReactManager'
import DarkModeQueryParamReader from '../theme/DarkModeQueryParamReader' import DarkModeQueryParamReader from '../theme/DarkModeQueryParamReader'
import AddLiquidity from './AddLiquidity' import AddLiquidity from './AddLiquidity'
import { RedirectDuplicateTokenIds } from './AddLiquidity/redirects' import { RedirectDuplicateTokenIds } from './AddLiquidity/redirects'
...@@ -81,67 +80,60 @@ export default function App() { ...@@ -81,67 +80,60 @@ export default function App() {
<ErrorBoundary> <ErrorBoundary>
<Route component={DarkModeQueryParamReader} /> <Route component={DarkModeQueryParamReader} />
<Route component={ApeModeQueryParamReader} /> <Route component={ApeModeQueryParamReader} />
<Web3ReactManager> <AppWrapper>
<AppWrapper> <HeaderWrapper>
<HeaderWrapper> <Header />
<Header /> </HeaderWrapper>
</HeaderWrapper> <BodyWrapper>
<BodyWrapper> <Popups />
<Popups /> <Polling />
<Polling /> <TopLevelModals />
<TopLevelModals /> <Suspense fallback={<Loader />}>
<Suspense fallback={<Loader />}> <Switch>
<Switch> <Route strict path="/vote" component={Vote} />
<Route strict path="/vote" component={Vote} /> <Route exact strict path="/create-proposal">
<Route exact strict path="/create-proposal"> <Redirect to="/vote/create-proposal" />
<Redirect to="/vote/create-proposal" /> </Route>
</Route> <Route exact strict path="/claim" component={OpenClaimAddressModalAndRedirectToSwap} />
<Route exact strict path="/claim" component={OpenClaimAddressModalAndRedirectToSwap} /> <Route exact strict path="/uni" component={Earn} />
<Route exact strict path="/uni" component={Earn} /> <Route exact strict path="/uni/:currencyIdA/:currencyIdB" component={Manage} />
<Route exact strict path="/uni/:currencyIdA/:currencyIdB" component={Manage} />
<Route exact strict path="/send" component={RedirectPathToSwapOnly} />
<Route exact strict path="/send" component={RedirectPathToSwapOnly} /> <Route exact strict path="/swap/:outputCurrency" component={RedirectToSwap} />
<Route exact strict path="/swap/:outputCurrency" component={RedirectToSwap} /> <Route exact strict path="/swap" component={Swap} />
<Route exact strict path="/swap" component={Swap} />
<Route exact strict path="/pool/v2/find" component={PoolFinder} />
<Route exact strict path="/pool/v2/find" component={PoolFinder} /> <Route exact strict path="/pool/v2" component={PoolV2} />
<Route exact strict path="/pool/v2" component={PoolV2} /> <Route exact strict path="/pool" component={Pool} />
<Route exact strict path="/pool" component={Pool} /> <Route exact strict path="/pool/:tokenId" component={PositionPage} />
<Route exact strict path="/pool/:tokenId" component={PositionPage} />
<Route exact strict path="/add/v2/:currencyIdA?/:currencyIdB?" component={RedirectDuplicateTokenIdsV2} />
<Route <Route
exact exact
strict strict
path="/add/v2/:currencyIdA?/:currencyIdB?" path="/add/:currencyIdA?/:currencyIdB?/:feeAmount?"
component={RedirectDuplicateTokenIdsV2} component={RedirectDuplicateTokenIds}
/> />
<Route
exact <Route
strict exact
path="/add/:currencyIdA?/:currencyIdB?/:feeAmount?" strict
component={RedirectDuplicateTokenIds} path="/increase/:currencyIdA?/:currencyIdB?/:feeAmount?/:tokenId?"
/> component={AddLiquidity}
/>
<Route
exact <Route exact strict path="/remove/v2/:currencyIdA/:currencyIdB" component={RemoveLiquidity} />
strict <Route exact strict path="/remove/:tokenId" component={RemoveLiquidityV3} />
path="/increase/:currencyIdA?/:currencyIdB?/:feeAmount?/:tokenId?"
component={AddLiquidity} <Route exact strict path="/migrate/v2" component={MigrateV2} />
/> <Route exact strict path="/migrate/v2/:address" component={MigrateV2Pair} />
<Route exact strict path="/remove/v2/:currencyIdA/:currencyIdB" component={RemoveLiquidity} /> <Route component={RedirectPathToSwapOnly} />
<Route exact strict path="/remove/:tokenId" component={RemoveLiquidityV3} /> </Switch>
</Suspense>
<Route exact strict path="/migrate/v2" component={MigrateV2} /> <Marginer />
<Route exact strict path="/migrate/v2/:address" component={MigrateV2Pair} /> </BodyWrapper>
</AppWrapper>
<Route component={RedirectPathToSwapOnly} />
</Switch>
</Suspense>
<Marginer />
</BodyWrapper>
</AppWrapper>
</Web3ReactManager>
</ErrorBoundary> </ErrorBoundary>
) )
} }
...@@ -318,7 +318,7 @@ export function PositionPage({ ...@@ -318,7 +318,7 @@ export function PositionPage({
params: { tokenId: tokenIdFromUrl }, params: { tokenId: tokenIdFromUrl },
}, },
}: RouteComponentProps<{ tokenId?: string }>) { }: RouteComponentProps<{ tokenId?: string }>) {
const { chainId, account, library } = useActiveWeb3React() const { chainId, account, provider } = useActiveWeb3React()
const theme = useTheme() const theme = useTheme()
const parsedTokenId = tokenIdFromUrl ? BigNumber.from(tokenIdFromUrl) : undefined const parsedTokenId = tokenIdFromUrl ? BigNumber.from(tokenIdFromUrl) : undefined
...@@ -433,7 +433,7 @@ export function PositionPage({ ...@@ -433,7 +433,7 @@ export function PositionPage({
!positionManager || !positionManager ||
!account || !account ||
!tokenId || !tokenId ||
!library !provider
) )
return return
...@@ -454,7 +454,7 @@ export function PositionPage({ ...@@ -454,7 +454,7 @@ export function PositionPage({
value, value,
} }
library provider
.getSigner() .getSigner()
.estimateGas(txn) .estimateGas(txn)
.then((estimate) => { .then((estimate) => {
...@@ -463,7 +463,7 @@ export function PositionPage({ ...@@ -463,7 +463,7 @@ export function PositionPage({
gasLimit: calculateGasMargin(estimate), gasLimit: calculateGasMargin(estimate),
} }
return library return provider
.getSigner() .getSigner()
.sendTransaction(newTxn) .sendTransaction(newTxn)
.then((response: TransactionResponse) => { .then((response: TransactionResponse) => {
...@@ -497,7 +497,7 @@ export function PositionPage({ ...@@ -497,7 +497,7 @@ export function PositionPage({
account, account,
tokenId, tokenId,
addTransaction, addTransaction,
library, provider,
]) ])
const owner = useSingleCallResult(!!tokenId ? positionManager : null, 'ownerOf', [tokenId]).result?.[0] const owner = useSingleCallResult(!!tokenId ? positionManager : null, 'ownerOf', [tokenId]).result?.[0]
......
...@@ -66,7 +66,7 @@ export default function RemoveLiquidityV3({ ...@@ -66,7 +66,7 @@ export default function RemoveLiquidityV3({
function Remove({ tokenId }: { tokenId: BigNumber }) { function Remove({ tokenId }: { tokenId: BigNumber }) {
const { position } = useV3PositionFromTokenId(tokenId) const { position } = useV3PositionFromTokenId(tokenId)
const theme = useTheme() const theme = useTheme()
const { account, chainId, library } = useActiveWeb3React() const { account, chainId, provider } = useActiveWeb3React()
// flag for receiving WETH // flag for receiving WETH
const [receiveWETH, setReceiveWETH] = useState(false) const [receiveWETH, setReceiveWETH] = useState(false)
...@@ -111,7 +111,7 @@ function Remove({ tokenId }: { tokenId: BigNumber }) { ...@@ -111,7 +111,7 @@ function Remove({ tokenId }: { tokenId: BigNumber }) {
!chainId || !chainId ||
!positionSDK || !positionSDK ||
!liquidityPercentage || !liquidityPercentage ||
!library !provider
) { ) {
return return
} }
...@@ -136,7 +136,7 @@ function Remove({ tokenId }: { tokenId: BigNumber }) { ...@@ -136,7 +136,7 @@ function Remove({ tokenId }: { tokenId: BigNumber }) {
value, value,
} }
library provider
.getSigner() .getSigner()
.estimateGas(txn) .estimateGas(txn)
.then((estimate) => { .then((estimate) => {
...@@ -145,7 +145,7 @@ function Remove({ tokenId }: { tokenId: BigNumber }) { ...@@ -145,7 +145,7 @@ function Remove({ tokenId }: { tokenId: BigNumber }) {
gasLimit: calculateGasMargin(estimate), gasLimit: calculateGasMargin(estimate),
} }
return library return provider
.getSigner() .getSigner()
.sendTransaction(newTxn) .sendTransaction(newTxn)
.then((response: TransactionResponse) => { .then((response: TransactionResponse) => {
...@@ -180,7 +180,7 @@ function Remove({ tokenId }: { tokenId: BigNumber }) { ...@@ -180,7 +180,7 @@ function Remove({ tokenId }: { tokenId: BigNumber }) {
feeValue1, feeValue1,
positionSDK, positionSDK,
liquidityPercentage, liquidityPercentage,
library, provider,
tokenId, tokenId,
allowedSlippage, allowedSlippage,
addTransaction, addTransaction,
......
...@@ -52,7 +52,7 @@ export default function RemoveLiquidity({ ...@@ -52,7 +52,7 @@ export default function RemoveLiquidity({
}, },
}: RouteComponentProps<{ currencyIdA: string; currencyIdB: string }>) { }: RouteComponentProps<{ currencyIdA: string; currencyIdB: string }>) {
const [currencyA, currencyB] = [useCurrency(currencyIdA) ?? undefined, useCurrency(currencyIdB) ?? undefined] const [currencyA, currencyB] = [useCurrency(currencyIdA) ?? undefined, useCurrency(currencyIdB) ?? undefined]
const { account, chainId, library } = useActiveWeb3React() const { account, chainId, provider } = useActiveWeb3React()
const [tokenA, tokenB] = useMemo(() => [currencyA?.wrapped, currencyB?.wrapped], [currencyA, currencyB]) const [tokenA, tokenB] = useMemo(() => [currencyA?.wrapped, currencyB?.wrapped], [currencyA, currencyB])
const theme = useContext(ThemeContext) const theme = useContext(ThemeContext)
...@@ -105,7 +105,7 @@ export default function RemoveLiquidity({ ...@@ -105,7 +105,7 @@ export default function RemoveLiquidity({
const [approval, approveCallback] = useApproveCallback(parsedAmounts[Field.LIQUIDITY], router?.address) const [approval, approveCallback] = useApproveCallback(parsedAmounts[Field.LIQUIDITY], router?.address)
async function onAttemptToApprove() { async function onAttemptToApprove() {
if (!pairContract || !pair || !library || !deadline) throw new Error('missing dependencies') if (!pairContract || !pair || !provider || !deadline) throw new Error('missing dependencies')
const liquidityAmount = parsedAmounts[Field.LIQUIDITY] const liquidityAmount = parsedAmounts[Field.LIQUIDITY]
if (!liquidityAmount) throw new Error('missing liquidity amount') if (!liquidityAmount) throw new Error('missing liquidity amount')
...@@ -148,7 +148,7 @@ export default function RemoveLiquidity({ ...@@ -148,7 +148,7 @@ export default function RemoveLiquidity({
const addTransaction = useTransactionAdder() const addTransaction = useTransactionAdder()
async function onRemove() { async function onRemove() {
if (!chainId || !library || !account || !deadline || !router) throw new Error('missing dependencies') if (!chainId || !provider || !account || !deadline || !router) throw new Error('missing dependencies')
const { [Field.CURRENCY_A]: currencyAmountA, [Field.CURRENCY_B]: currencyAmountB } = parsedAmounts const { [Field.CURRENCY_A]: currencyAmountA, [Field.CURRENCY_B]: currencyAmountB } = parsedAmounts
if (!currencyAmountA || !currencyAmountB) { if (!currencyAmountA || !currencyAmountB) {
throw new Error('missing currency amounts') throw new Error('missing currency amounts')
......
...@@ -22,7 +22,7 @@ function useQueryCacheInvalidator() { ...@@ -22,7 +22,7 @@ function useQueryCacheInvalidator() {
} }
export default function Updater(): null { export default function Updater(): null {
const { chainId, library } = useActiveWeb3React() const { chainId, provider } = useActiveWeb3React()
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const windowVisible = useIsWindowVisible() const windowVisible = useIsWindowVisible()
...@@ -31,10 +31,10 @@ export default function Updater(): null { ...@@ -31,10 +31,10 @@ export default function Updater(): null {
useQueryCacheInvalidator() useQueryCacheInvalidator()
useEffect(() => { useEffect(() => {
if (library && chainId && windowVisible) { if (provider && chainId && windowVisible) {
setActiveChainId(chainId) setActiveChainId(chainId)
} }
}, [dispatch, chainId, library, windowVisible]) }, [dispatch, chainId, provider, windowVisible])
const debouncedChainId = useDebounce(activeChainId, 100) const debouncedChainId = useDebounce(activeChainId, 100)
......
...@@ -155,7 +155,7 @@ export function useClaimCallback(account: string | null | undefined): { ...@@ -155,7 +155,7 @@ export function useClaimCallback(account: string | null | undefined): {
claimCallback: () => Promise<string> claimCallback: () => Promise<string>
} { } {
// get claim data for this account // get claim data for this account
const { library, chainId } = useActiveWeb3React() const { provider, chainId } = useActiveWeb3React()
const claimData = useUserClaimData(account) const claimData = useUserClaimData(account)
// used for popup summary // used for popup summary
...@@ -164,7 +164,7 @@ export function useClaimCallback(account: string | null | undefined): { ...@@ -164,7 +164,7 @@ export function useClaimCallback(account: string | null | undefined): {
const distributorContract = useMerkleDistributorContract() const distributorContract = useMerkleDistributorContract()
const claimCallback = async function () { const claimCallback = async function () {
if (!claimData || !account || !library || !chainId || !distributorContract) return if (!claimData || !account || !provider || !chainId || !distributorContract) return
const args = [claimData.index, account, claimData.amount, claimData.proof] const args = [claimData.index, account, claimData.amount, claimData.proof]
......
...@@ -384,14 +384,14 @@ export function useUserVotesAsOfBlock(block: number | undefined): CurrencyAmount ...@@ -384,14 +384,14 @@ export function useUserVotesAsOfBlock(block: number | undefined): CurrencyAmount
} }
export function useDelegateCallback(): (delegatee: string | undefined) => undefined | Promise<string> { export function useDelegateCallback(): (delegatee: string | undefined) => undefined | Promise<string> {
const { account, chainId, library } = useActiveWeb3React() const { account, chainId, provider } = useActiveWeb3React()
const addTransaction = useTransactionAdder() const addTransaction = useTransactionAdder()
const uniContract = useUniContract() const uniContract = useUniContract()
return useCallback( return useCallback(
(delegatee: string | undefined) => { (delegatee: string | undefined) => {
if (!library || !chainId || !account || !delegatee || !isAddress(delegatee ?? '')) return undefined if (!provider || !chainId || !account || !delegatee || !isAddress(delegatee ?? '')) return undefined
const args = [delegatee] const args = [delegatee]
if (!uniContract) throw new Error('No UNI Contract!') if (!uniContract) throw new Error('No UNI Contract!')
return uniContract.estimateGas.delegate(...args, {}).then((estimatedGasLimit) => { return uniContract.estimateGas.delegate(...args, {}).then((estimatedGasLimit) => {
...@@ -406,7 +406,7 @@ export function useDelegateCallback(): (delegatee: string | undefined) => undefi ...@@ -406,7 +406,7 @@ export function useDelegateCallback(): (delegatee: string | undefined) => undefi
}) })
}) })
}, },
[account, addTransaction, chainId, library, uniContract] [account, addTransaction, chainId, provider, uniContract]
) )
} }
......
...@@ -16,6 +16,7 @@ import { routingApi } from './routing/slice' ...@@ -16,6 +16,7 @@ import { routingApi } from './routing/slice'
import swap from './swap/reducer' import swap from './swap/reducer'
import transactions from './transactions/reducer' import transactions from './transactions/reducer'
import user from './user/reducer' import user from './user/reducer'
import wallet from './wallet/reducer'
const PERSISTED_KEYS: string[] = ['user', 'transactions', 'lists'] const PERSISTED_KEYS: string[] = ['user', 'transactions', 'lists']
...@@ -23,6 +24,7 @@ const store = configureStore({ ...@@ -23,6 +24,7 @@ const store = configureStore({
reducer: { reducer: {
application, application,
user, user,
wallet,
transactions, transactions,
swap, swap,
mint, mint,
......
...@@ -13,7 +13,7 @@ import { acceptListUpdate, enableList } from './actions' ...@@ -13,7 +13,7 @@ import { acceptListUpdate, enableList } from './actions'
import { useActiveListUrls } from './hooks' import { useActiveListUrls } from './hooks'
export default function Updater(): null { export default function Updater(): null {
const { chainId, library } = useActiveWeb3React() const { chainId, provider } = useActiveWeb3React()
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const isWindowVisible = useIsWindowVisible() const isWindowVisible = useIsWindowVisible()
...@@ -37,8 +37,8 @@ export default function Updater(): null { ...@@ -37,8 +37,8 @@ export default function Updater(): null {
dispatch(enableList(ARBITRUM_LIST)) dispatch(enableList(ARBITRUM_LIST))
} }
}, [chainId, dispatch]) }, [chainId, dispatch])
// fetch all lists every 10 minutes, but only after we initialize library // fetch all lists every 10 minutes, but only after we initialize provider
useInterval(fetchAllListsCallback, library ? 1000 * 60 * 10 : null) useInterval(fetchAllListsCallback, provider ? 1000 * 60 * 10 : null)
// whenever a list is not loaded and not loading, try again to load it // whenever a list is not loaded and not loading, try again to load it
useEffect(() => { useEffect(() => {
...@@ -48,7 +48,7 @@ export default function Updater(): null { ...@@ -48,7 +48,7 @@ export default function Updater(): null {
fetchList(listUrl).catch((error) => console.debug('list added fetching error', error)) fetchList(listUrl).catch((error) => console.debug('list added fetching error', error))
} }
}) })
}, [dispatch, fetchList, library, lists]) }, [dispatch, fetchList, lists])
// if any lists from unsupported lists are loaded, check them too (in case new updates since last visit) // if any lists from unsupported lists are loaded, check them too (in case new updates since last visit)
useEffect(() => { useEffect(() => {
...@@ -58,7 +58,7 @@ export default function Updater(): null { ...@@ -58,7 +58,7 @@ export default function Updater(): null {
fetchList(listUrl).catch((error) => console.debug('list added fetching error', error)) fetchList(listUrl).catch((error) => console.debug('list added fetching error', error))
} }
}) })
}, [dispatch, fetchList, library, lists]) }, [dispatch, fetchList, lists])
// automatically update lists if versions are minor/patch // automatically update lists if versions are minor/patch
useEffect(() => { useEffect(() => {
......
...@@ -10,7 +10,7 @@ import { isHistoricalLog, keyToFilter } from './utils' ...@@ -10,7 +10,7 @@ import { isHistoricalLog, keyToFilter } from './utils'
export default function Updater(): null { export default function Updater(): null {
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const state = useAppSelector((state) => state.logs) const state = useAppSelector((state) => state.logs)
const { chainId, library } = useActiveWeb3React() const { chainId, provider } = useActiveWeb3React()
const blockNumber = useBlockNumber() const blockNumber = useBlockNumber()
...@@ -34,7 +34,7 @@ export default function Updater(): null { ...@@ -34,7 +34,7 @@ export default function Updater(): null {
}, [blockNumber, chainId, state]) }, [blockNumber, chainId, state])
useEffect(() => { useEffect(() => {
if (!library || !chainId || typeof blockNumber !== 'number' || filtersNeedFetch.length === 0) return if (!provider || !chainId || typeof blockNumber !== 'number' || filtersNeedFetch.length === 0) return
dispatch(fetchingLogs({ chainId, filters: filtersNeedFetch, blockNumber })) dispatch(fetchingLogs({ chainId, filters: filtersNeedFetch, blockNumber }))
filtersNeedFetch.forEach((filter) => { filtersNeedFetch.forEach((filter) => {
...@@ -43,7 +43,7 @@ export default function Updater(): null { ...@@ -43,7 +43,7 @@ export default function Updater(): null {
let toBlock = filter.toBlock ?? blockNumber let toBlock = filter.toBlock ?? blockNumber
if (typeof fromBlock === 'string') fromBlock = Number.parseInt(fromBlock) if (typeof fromBlock === 'string') fromBlock = Number.parseInt(fromBlock)
if (typeof toBlock === 'string') toBlock = Number.parseInt(toBlock) if (typeof toBlock === 'string') toBlock = Number.parseInt(toBlock)
library provider
.getLogs({ .getLogs({
...filter, ...filter,
fromBlock, fromBlock,
...@@ -69,7 +69,7 @@ export default function Updater(): null { ...@@ -69,7 +69,7 @@ export default function Updater(): null {
) )
}) })
}) })
}, [blockNumber, chainId, dispatch, filtersNeedFetch, library]) }, [blockNumber, chainId, dispatch, filtersNeedFetch, provider])
return null return null
} }
import { createSlice } from '@reduxjs/toolkit' import { createSlice } from '@reduxjs/toolkit'
import { Wallet } from 'connectors'
import { SupportedLocale } from 'constants/locales' import { SupportedLocale } from 'constants/locales'
import { DEFAULT_DEADLINE_FROM_NOW } from '../../constants/misc' import { DEFAULT_DEADLINE_FROM_NOW } from '../../constants/misc'
...@@ -8,6 +9,13 @@ import { SerializedPair, SerializedToken } from './types' ...@@ -8,6 +9,13 @@ import { SerializedPair, SerializedToken } from './types'
const currentTimestamp = () => new Date().getTime() const currentTimestamp = () => new Date().getTime()
export interface UserState { export interface UserState {
// We want the user to be able to define which wallet they want to use, even if there are multiple connected wallets via web3-react.
// If a user had previously connected a wallet but didn't have a wallet override set (because they connected prior to this field being added),
// we want to handle that case by backfilling them manually. Once we backfill, we set the backfilled field to `true`.
// After some period of time, our active users will have this property set so we can likely remove the backfilling logic.
selectedWalletBackfilled: boolean
selectedWallet?: Wallet
// the timestamp of the last updateVersion action // the timestamp of the last updateVersion action
lastUpdateVersionTimestamp?: number lastUpdateVersionTimestamp?: number
...@@ -57,6 +65,8 @@ function pairKey(token0Address: string, token1Address: string) { ...@@ -57,6 +65,8 @@ function pairKey(token0Address: string, token1Address: string) {
} }
export const initialState: UserState = { export const initialState: UserState = {
selectedWallet: undefined,
selectedWalletBackfilled: false,
matchesDarkMode: false, matchesDarkMode: false,
userDarkMode: null, userDarkMode: null,
userExpertMode: false, userExpertMode: false,
...@@ -78,6 +88,10 @@ const userSlice = createSlice({ ...@@ -78,6 +88,10 @@ const userSlice = createSlice({
name: 'user', name: 'user',
initialState, initialState,
reducers: { reducers: {
updateSelectedWallet(state, { payload: { wallet } }) {
state.selectedWallet = wallet
state.selectedWalletBackfilled = true
},
updateUserDarkMode(state, action) { updateUserDarkMode(state, action) {
state.userDarkMode = action.payload.userDarkMode state.userDarkMode = action.payload.userDarkMode
state.timestamp = currentTimestamp() state.timestamp = currentTimestamp()
...@@ -188,6 +202,7 @@ const userSlice = createSlice({ ...@@ -188,6 +202,7 @@ const userSlice = createSlice({
}) })
export const { export const {
updateSelectedWallet,
addSerializedPair, addSerializedPair,
addSerializedToken, addSerializedToken,
removeSerializedPair, removeSerializedPair,
......
import { createSlice } from '@reduxjs/toolkit'
import { Wallet } from 'connectors'
export interface WalletState {
errorByWallet: Record<Wallet, string | undefined>
}
export const initialState: WalletState = {
errorByWallet: {
[Wallet.INJECTED]: undefined,
[Wallet.FORTMATIC]: undefined,
[Wallet.WALLET_CONNECT]: undefined,
[Wallet.COINBASE_WALLET]: undefined,
[Wallet.NETWORK]: undefined,
[Wallet.GNOSIS_SAFE]: undefined,
},
}
const walletSlice = createSlice({
name: 'wallet',
initialState,
reducers: {
updateWalletError(
state,
{ payload: { wallet, error } }: { payload: { wallet: Wallet; error: string | undefined } }
) {
state.errorByWallet[wallet] = error
},
},
})
export const { updateWalletError } = walletSlice.actions
export default walletSlice.reducer
import { Web3Provider } from '@ethersproject/providers'
import ms from 'ms.macro'
export default function getLibrary(provider: any): Web3Provider {
const library = new Web3Provider(
provider,
typeof provider.chainId === 'number'
? provider.chainId
: typeof provider.chainId === 'string'
? parseInt(provider.chainId)
: 'any'
)
library.pollingInterval = ms`15s`
return library
}
import { BigNumber } from '@ethersproject/bignumber' import { Connector } from '@web3-react/types'
import { hexStripZeros } from '@ethersproject/bytes' import { coinbaseWallet, fortmatic, gnosisSafe, injected, network, walletConnect } from 'connectors'
import { ExternalProvider } from '@ethersproject/providers'
import { CHAIN_INFO } from 'constants/chainInfo' import { CHAIN_INFO } from 'constants/chainInfo'
import { SupportedChainId } from 'constants/chains' import { ALL_SUPPORTED_CHAIN_IDS, SupportedChainId } from 'constants/chains'
import { INFURA_NETWORK_URLS } from 'constants/infura' import { INFURA_NETWORK_URLS } from 'constants/infura'
interface SwitchNetworkArguments {
provider: ExternalProvider
chainId: SupportedChainId
}
function getRpcUrls(chainId: SupportedChainId): [string] { function getRpcUrls(chainId: SupportedChainId): [string] {
switch (chainId) { switch (chainId) {
case SupportedChainId.MAINNET: case SupportedChainId.MAINNET:
...@@ -36,48 +30,35 @@ function getRpcUrls(chainId: SupportedChainId): [string] { ...@@ -36,48 +30,35 @@ function getRpcUrls(chainId: SupportedChainId): [string] {
throw new Error('RPC URLs must use public endpoints') throw new Error('RPC URLs must use public endpoints')
} }
// provider.request returns Promise<any>, but wallet_switchEthereumChain must return null or throw export function isChainAllowed(connector: Connector, chainId: number) {
// see https://github.com/rekmarks/EIPs/blob/3326-create/EIPS/eip-3326.md for more info on wallet_switchEthereumChain switch (connector) {
export async function switchToNetwork({ provider, chainId }: SwitchNetworkArguments): Promise<null | void> { case fortmatic:
if (!provider.request) { return chainId === SupportedChainId.MAINNET
return case injected:
case coinbaseWallet:
case walletConnect:
case network:
case gnosisSafe:
return ALL_SUPPORTED_CHAIN_IDS.includes(chainId)
default:
return false
} }
const formattedChainId = hexStripZeros(BigNumber.from(chainId).toHexString()) }
try {
await provider.request({
method: 'wallet_switchEthereumChain',
params: [{ chainId: formattedChainId }],
})
} catch (error) {
// 4902 is the error code for attempting to switch to an unrecognized chainId
if (error.code === 4902) {
const info = CHAIN_INFO[chainId]
await provider.request({ export const switchChain = async (connector: Connector, chainId: number) => {
method: 'wallet_addEthereumChain', if (!isChainAllowed(connector, chainId)) {
params: [ throw new Error(`Chain ${chainId} not supported for connector (${typeof connector})`)
{ } else if (connector === walletConnect || connector === network) {
chainId: formattedChainId, await connector.activate(chainId)
chainName: info.label, } else {
rpcUrls: getRpcUrls(chainId), const info = CHAIN_INFO[chainId]
nativeCurrency: info.nativeCurrency, const addChainParameter = {
blockExplorerUrls: [info.explorer], chainId,
}, chainName: info.label,
], rpcUrls: getRpcUrls(chainId),
}) nativeCurrency: info.nativeCurrency,
// metamask (only known implementer) automatically switches after a network is added blockExplorerUrls: [info.explorer],
// the second call is done here because that behavior is not a part of the spec and cannot be relied upon in the future
// metamask's behavior when switching to the current network is just to return null (a no-op)
try {
await provider.request({
method: 'wallet_switchEthereumChain',
params: [{ chainId: formattedChainId }],
})
} catch (error) {
console.debug('Added network but could not switch chains', error)
}
} else {
throw error
} }
await connector.activate(addChainParameter)
} }
} }
...@@ -1208,13 +1208,6 @@ ...@@ -1208,13 +1208,6 @@
dependencies: dependencies:
regenerator-runtime "^0.13.4" regenerator-runtime "^0.13.4"
"@babel/runtime@7.3.4":
version "7.3.4"
resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.4.tgz"
integrity sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g==
dependencies:
regenerator-runtime "^0.12.0"
"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
version "7.17.0" version "7.17.0"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.0.tgz#b8d142fc0f7664fb3d9b5833fd40dcbab89276c0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.0.tgz#b8d142fc0f7664fb3d9b5833fd40dcbab89276c0"
...@@ -1292,6 +1285,28 @@ ...@@ -1292,6 +1285,28 @@
exec-sh "^0.3.2" exec-sh "^0.3.2"
minimist "^1.2.0" minimist "^1.2.0"
"@coinbase/wallet-sdk@^3.2.0":
version "3.3.0"
resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-3.3.0.tgz#e77383bce1388e5367dc35f8309702e73be47503"
integrity sha512-Prmxs5eYRxe5i+kDSsny97oPG4Pa5PhLmNDx8f7UQrvlPowGy5Tg0gHOqCie6ck2shVMdW8sKJ+RCLIRZ9kIjA==
dependencies:
"@metamask/safe-event-emitter" "2.0.0"
bind-decorator "^1.0.11"
bn.js "^5.1.1"
buffer "^6.0.3"
clsx "^1.1.0"
eth-block-tracker "4.4.3"
eth-json-rpc-filters "4.2.2"
eth-rpc-errors "4.0.2"
js-sha256 "0.9.0"
json-rpc-engine "6.1.0"
keccak "^3.0.1"
preact "^10.5.9"
qs "^6.10.3"
rxjs "^6.6.3"
stream-browserify "^3.0.0"
util "^0.12.4"
"@colors/colors@1.5.0": "@colors/colors@1.5.0":
version "1.5.0" version "1.5.0"
resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9"
...@@ -1511,6 +1526,21 @@ ...@@ -1511,6 +1526,21 @@
"@ethersproject/properties" "^5.6.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/strings" "^5.6.0" "@ethersproject/strings" "^5.6.0"
"@ethersproject/abi@5.6.3", "@ethersproject/abi@^5.6.3":
version "5.6.3"
resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.3.tgz#2d643544abadf6e6b63150508af43475985c23db"
integrity sha512-CxKTdoZY4zDJLWXG6HzNH6znWK0M79WzzxHegDoecE3+K32pzfHOzuXg2/oGSTecZynFgpkjYXNPOqXVJlqClw==
dependencies:
"@ethersproject/address" "^5.6.1"
"@ethersproject/bignumber" "^5.6.2"
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/constants" "^5.6.1"
"@ethersproject/hash" "^5.6.1"
"@ethersproject/keccak256" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
"@ethersproject/properties" "^5.6.0"
"@ethersproject/strings" "^5.6.1"
"@ethersproject/abstract-provider@5.6.0", "@ethersproject/abstract-provider@^5.6.0": "@ethersproject/abstract-provider@5.6.0", "@ethersproject/abstract-provider@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.0.tgz#0c4ac7054650dbd9c476cf5907f588bbb6ef3061" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.0.tgz#0c4ac7054650dbd9c476cf5907f588bbb6ef3061"
...@@ -1524,6 +1554,19 @@ ...@@ -1524,6 +1554,19 @@
"@ethersproject/transactions" "^5.6.0" "@ethersproject/transactions" "^5.6.0"
"@ethersproject/web" "^5.6.0" "@ethersproject/web" "^5.6.0"
"@ethersproject/abstract-provider@5.6.1", "@ethersproject/abstract-provider@^5.6.1":
version "5.6.1"
resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.1.tgz#02ddce150785caf0c77fe036a0ebfcee61878c59"
integrity sha512-BxlIgogYJtp1FS8Muvj8YfdClk3unZH0vRMVX791Z9INBNT/kuACZ9GzaY1Y4yFq+YSy6/w4gzj3HCRKrK9hsQ==
dependencies:
"@ethersproject/bignumber" "^5.6.2"
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
"@ethersproject/networks" "^5.6.3"
"@ethersproject/properties" "^5.6.0"
"@ethersproject/transactions" "^5.6.2"
"@ethersproject/web" "^5.6.1"
"@ethersproject/abstract-signer@5.6.0", "@ethersproject/abstract-signer@^5.6.0": "@ethersproject/abstract-signer@5.6.0", "@ethersproject/abstract-signer@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.0.tgz#9cd7ae9211c2b123a3b29bf47aab17d4d016e3e7" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.0.tgz#9cd7ae9211c2b123a3b29bf47aab17d4d016e3e7"
...@@ -1535,6 +1578,17 @@ ...@@ -1535,6 +1578,17 @@
"@ethersproject/logger" "^5.6.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/properties" "^5.6.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/abstract-signer@5.6.2", "@ethersproject/abstract-signer@^5.6.2":
version "5.6.2"
resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.2.tgz#491f07fc2cbd5da258f46ec539664713950b0b33"
integrity sha512-n1r6lttFBG0t2vNiI3HoWaS/KdOt8xyDjzlP2cuevlWLG6EX0OwcKLyG/Kp/cuwNxdy/ous+R/DEMdTUwWQIjQ==
dependencies:
"@ethersproject/abstract-provider" "^5.6.1"
"@ethersproject/bignumber" "^5.6.2"
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
"@ethersproject/properties" "^5.6.0"
"@ethersproject/address@5.6.0", "@ethersproject/address@^5", "@ethersproject/address@^5.0.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.6.0": "@ethersproject/address@5.6.0", "@ethersproject/address@^5", "@ethersproject/address@^5.0.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.0.tgz#13c49836d73e7885fc148ad633afad729da25012" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.0.tgz#13c49836d73e7885fc148ad633afad729da25012"
...@@ -1546,6 +1600,17 @@ ...@@ -1546,6 +1600,17 @@
"@ethersproject/logger" "^5.6.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/rlp" "^5.6.0" "@ethersproject/rlp" "^5.6.0"
"@ethersproject/address@5.6.1", "@ethersproject/address@^5.6.1":
version "5.6.1"
resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.1.tgz#ab57818d9aefee919c5721d28cd31fd95eff413d"
integrity sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==
dependencies:
"@ethersproject/bignumber" "^5.6.2"
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/keccak256" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
"@ethersproject/rlp" "^5.6.1"
"@ethersproject/base64@5.6.0", "@ethersproject/base64@^5.6.0": "@ethersproject/base64@5.6.0", "@ethersproject/base64@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.0.tgz#a12c4da2a6fb86d88563216b0282308fc15907c9" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.0.tgz#a12c4da2a6fb86d88563216b0282308fc15907c9"
...@@ -1553,6 +1618,13 @@ ...@@ -1553,6 +1618,13 @@
dependencies: dependencies:
"@ethersproject/bytes" "^5.6.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/base64@5.6.1", "@ethersproject/base64@^5.6.1":
version "5.6.1"
resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.1.tgz#2c40d8a0310c9d1606c2c37ae3092634b41d87cb"
integrity sha512-qB76rjop6a0RIYYMiB4Eh/8n+Hxu2NIZm8S/Q7kNo5pmZfXhHGHmS4MinUainiBC54SCyRnwzL+KZjj8zbsSsw==
dependencies:
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/basex@5.6.0", "@ethersproject/basex@^5.6.0": "@ethersproject/basex@5.6.0", "@ethersproject/basex@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.0.tgz#9ea7209bf0a1c3ddc2a90f180c3a7f0d7d2e8a69" resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.0.tgz#9ea7209bf0a1c3ddc2a90f180c3a7f0d7d2e8a69"
...@@ -1561,6 +1633,14 @@ ...@@ -1561,6 +1633,14 @@
"@ethersproject/bytes" "^5.6.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/properties" "^5.6.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/basex@5.6.1", "@ethersproject/basex@^5.6.1":
version "5.6.1"
resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.1.tgz#badbb2f1d4a6f52ce41c9064f01eab19cc4c5305"
integrity sha512-a52MkVz4vuBXR06nvflPMotld1FJWSj2QT0985v7P/emPZO00PucFAkbcmq2vpVU7Ts7umKiSI6SppiLykVWsA==
dependencies:
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/properties" "^5.6.0"
"@ethersproject/bignumber@5.6.0", "@ethersproject/bignumber@^5.6.0": "@ethersproject/bignumber@5.6.0", "@ethersproject/bignumber@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.0.tgz#116c81b075c57fa765a8f3822648cf718a8a0e26" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.0.tgz#116c81b075c57fa765a8f3822648cf718a8a0e26"
...@@ -1570,7 +1650,16 @@ ...@@ -1570,7 +1650,16 @@
"@ethersproject/logger" "^5.6.0" "@ethersproject/logger" "^5.6.0"
bn.js "^4.11.9" bn.js "^4.11.9"
"@ethersproject/bytes@5.6.1", "@ethersproject/bytes@^5.6.0": "@ethersproject/bignumber@5.6.2", "@ethersproject/bignumber@^5.6.2":
version "5.6.2"
resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.2.tgz#72a0717d6163fab44c47bcc82e0c550ac0315d66"
integrity sha512-v7+EEUbhGqT3XJ9LMPsKvXYHFc8eHxTowFCG/HgJErmq4XHJ2WR7aeyICg3uTOAQ7Icn0GFHAohXEhxQHq4Ubw==
dependencies:
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
bn.js "^5.2.1"
"@ethersproject/bytes@5.6.1", "@ethersproject/bytes@^5.6.0", "@ethersproject/bytes@^5.6.1":
version "5.6.1" version "5.6.1"
resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7"
integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g==
...@@ -1584,6 +1673,13 @@ ...@@ -1584,6 +1673,13 @@
dependencies: dependencies:
"@ethersproject/bignumber" "^5.6.0" "@ethersproject/bignumber" "^5.6.0"
"@ethersproject/constants@5.6.1", "@ethersproject/constants@^5.6.1":
version "5.6.1"
resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.1.tgz#e2e974cac160dd101cf79fdf879d7d18e8cb1370"
integrity sha512-QSq9WVnZbxXYFftrjSjZDUshp6/eKp6qrtdBtUCm0QxCV5z1fG/w3kdlcsjMCQuQHUnAclKoK7XpXMezhRDOLg==
dependencies:
"@ethersproject/bignumber" "^5.6.2"
"@ethersproject/contracts@5.6.0": "@ethersproject/contracts@5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.0.tgz#60f2cfc7addd99a865c6c8cfbbcec76297386067" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.0.tgz#60f2cfc7addd99a865c6c8cfbbcec76297386067"
...@@ -1600,6 +1696,22 @@ ...@@ -1600,6 +1696,22 @@
"@ethersproject/properties" "^5.6.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/transactions" "^5.6.0" "@ethersproject/transactions" "^5.6.0"
"@ethersproject/contracts@5.6.2":
version "5.6.2"
resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.2.tgz#20b52e69ebc1b74274ff8e3d4e508de971c287bc"
integrity sha512-hguUA57BIKi6WY0kHvZp6PwPlWF87MCeB4B7Z7AbUpTxfFXFdn/3b0GmjZPagIHS+3yhcBJDnuEfU4Xz+Ks/8g==
dependencies:
"@ethersproject/abi" "^5.6.3"
"@ethersproject/abstract-provider" "^5.6.1"
"@ethersproject/abstract-signer" "^5.6.2"
"@ethersproject/address" "^5.6.1"
"@ethersproject/bignumber" "^5.6.2"
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/constants" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
"@ethersproject/properties" "^5.6.0"
"@ethersproject/transactions" "^5.6.2"
"@ethersproject/experimental@^5.4.0": "@ethersproject/experimental@^5.4.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/experimental/-/experimental-5.6.0.tgz#c72ef00a79b746c522eb79736712169d71c55f64" resolved "https://registry.yarnpkg.com/@ethersproject/experimental/-/experimental-5.6.0.tgz#c72ef00a79b746c522eb79736712169d71c55f64"
...@@ -1623,6 +1735,20 @@ ...@@ -1623,6 +1735,20 @@
"@ethersproject/properties" "^5.6.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/strings" "^5.6.0" "@ethersproject/strings" "^5.6.0"
"@ethersproject/hash@5.6.1", "@ethersproject/hash@^5.6.1":
version "5.6.1"
resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.1.tgz#224572ea4de257f05b4abf8ae58b03a67e99b0f4"
integrity sha512-L1xAHurbaxG8VVul4ankNX5HgQ8PNCTrnVXEiFnE9xoRnaUcgfD12tZINtDinSllxPLCtGwguQxJ5E6keE84pA==
dependencies:
"@ethersproject/abstract-signer" "^5.6.2"
"@ethersproject/address" "^5.6.1"
"@ethersproject/bignumber" "^5.6.2"
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/keccak256" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
"@ethersproject/properties" "^5.6.0"
"@ethersproject/strings" "^5.6.1"
"@ethersproject/hdnode@5.6.0", "@ethersproject/hdnode@^5.6.0": "@ethersproject/hdnode@5.6.0", "@ethersproject/hdnode@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.0.tgz#9dcbe8d629bbbcf144f2cae476337fe92d320998" resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.0.tgz#9dcbe8d629bbbcf144f2cae476337fe92d320998"
...@@ -1641,6 +1767,24 @@ ...@@ -1641,6 +1767,24 @@
"@ethersproject/transactions" "^5.6.0" "@ethersproject/transactions" "^5.6.0"
"@ethersproject/wordlists" "^5.6.0" "@ethersproject/wordlists" "^5.6.0"
"@ethersproject/hdnode@5.6.2", "@ethersproject/hdnode@^5.6.2":
version "5.6.2"
resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.2.tgz#26f3c83a3e8f1b7985c15d1db50dc2903418b2d2"
integrity sha512-tERxW8Ccf9CxW2db3WsN01Qao3wFeRsfYY9TCuhmG0xNpl2IO8wgXU3HtWIZ49gUWPggRy4Yg5axU0ACaEKf1Q==
dependencies:
"@ethersproject/abstract-signer" "^5.6.2"
"@ethersproject/basex" "^5.6.1"
"@ethersproject/bignumber" "^5.6.2"
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
"@ethersproject/pbkdf2" "^5.6.1"
"@ethersproject/properties" "^5.6.0"
"@ethersproject/sha2" "^5.6.1"
"@ethersproject/signing-key" "^5.6.2"
"@ethersproject/strings" "^5.6.1"
"@ethersproject/transactions" "^5.6.2"
"@ethersproject/wordlists" "^5.6.1"
"@ethersproject/json-wallets@5.6.0", "@ethersproject/json-wallets@^5.6.0": "@ethersproject/json-wallets@5.6.0", "@ethersproject/json-wallets@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.0.tgz#4c2fc27f17e36c583e7a252fb938bc46f98891e5" resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.0.tgz#4c2fc27f17e36c583e7a252fb938bc46f98891e5"
...@@ -1660,7 +1804,26 @@ ...@@ -1660,7 +1804,26 @@
aes-js "3.0.0" aes-js "3.0.0"
scrypt-js "3.0.1" scrypt-js "3.0.1"
"@ethersproject/keccak256@5.6.0", "@ethersproject/keccak256@^5.0.0-beta.130", "@ethersproject/keccak256@^5.6.0": "@ethersproject/json-wallets@5.6.1", "@ethersproject/json-wallets@^5.6.1":
version "5.6.1"
resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.1.tgz#3f06ba555c9c0d7da46756a12ac53483fe18dd91"
integrity sha512-KfyJ6Zwz3kGeX25nLihPwZYlDqamO6pfGKNnVMWWfEVVp42lTfCZVXXy5Ie8IZTN0HKwAngpIPi7gk4IJzgmqQ==
dependencies:
"@ethersproject/abstract-signer" "^5.6.2"
"@ethersproject/address" "^5.6.1"
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/hdnode" "^5.6.2"
"@ethersproject/keccak256" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
"@ethersproject/pbkdf2" "^5.6.1"
"@ethersproject/properties" "^5.6.0"
"@ethersproject/random" "^5.6.1"
"@ethersproject/strings" "^5.6.1"
"@ethersproject/transactions" "^5.6.2"
aes-js "3.0.0"
scrypt-js "3.0.1"
"@ethersproject/keccak256@5.6.0", "@ethersproject/keccak256@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.0.tgz#fea4bb47dbf8f131c2e1774a1cecbfeb9d606459" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.0.tgz#fea4bb47dbf8f131c2e1774a1cecbfeb9d606459"
integrity sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w== integrity sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w==
...@@ -1668,6 +1831,14 @@ ...@@ -1668,6 +1831,14 @@
"@ethersproject/bytes" "^5.6.0" "@ethersproject/bytes" "^5.6.0"
js-sha3 "0.8.0" js-sha3 "0.8.0"
"@ethersproject/keccak256@5.6.1", "@ethersproject/keccak256@^5.6.1":
version "5.6.1"
resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.1.tgz#b867167c9b50ba1b1a92bccdd4f2d6bd168a91cc"
integrity sha512-bB7DQHCTRDooZZdL3lk9wpL0+XuG3XLGHLh3cePnybsO3V0rdCAOQGpn/0R3aODmnTOOkCATJiD2hnL+5bwthA==
dependencies:
"@ethersproject/bytes" "^5.6.1"
js-sha3 "0.8.0"
"@ethersproject/logger@5.6.0", "@ethersproject/logger@^5.6.0": "@ethersproject/logger@5.6.0", "@ethersproject/logger@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a"
...@@ -1680,6 +1851,13 @@ ...@@ -1680,6 +1851,13 @@
dependencies: dependencies:
"@ethersproject/logger" "^5.6.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/networks@5.6.3", "@ethersproject/networks@^5.6.3":
version "5.6.3"
resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.3.tgz#3ee3ab08f315b433b50c99702eb32e0cf31f899f"
integrity sha512-QZxRH7cA5Ut9TbXwZFiCyuPchdWi87ZtVNHWZd0R6YFgYtes2jQ3+bsslJ0WdyDe0i6QumqtoYqvY3rrQFRZOQ==
dependencies:
"@ethersproject/logger" "^5.6.0"
"@ethersproject/pbkdf2@5.6.0", "@ethersproject/pbkdf2@^5.6.0": "@ethersproject/pbkdf2@5.6.0", "@ethersproject/pbkdf2@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.0.tgz#04fcc2d7c6bff88393f5b4237d906a192426685a" resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.0.tgz#04fcc2d7c6bff88393f5b4237d906a192426685a"
...@@ -1688,6 +1866,14 @@ ...@@ -1688,6 +1866,14 @@
"@ethersproject/bytes" "^5.6.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/sha2" "^5.6.0" "@ethersproject/sha2" "^5.6.0"
"@ethersproject/pbkdf2@5.6.1", "@ethersproject/pbkdf2@^5.6.1":
version "5.6.1"
resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.1.tgz#f462fe320b22c0d6b1d72a9920a3963b09eb82d1"
integrity sha512-k4gRQ+D93zDRPNUfmduNKq065uadC2YjMP/CqwwX5qG6R05f47boq6pLZtV/RnC4NZAYOPH1Cyo54q0c9sshRQ==
dependencies:
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/sha2" "^5.6.1"
"@ethersproject/properties@5.6.0", "@ethersproject/properties@^5.6.0": "@ethersproject/properties@5.6.0", "@ethersproject/properties@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04"
...@@ -1720,6 +1906,32 @@ ...@@ -1720,6 +1906,32 @@
bech32 "1.1.4" bech32 "1.1.4"
ws "7.4.6" ws "7.4.6"
"@ethersproject/providers@5.6.8":
version "5.6.8"
resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.8.tgz#22e6c57be215ba5545d3a46cf759d265bb4e879d"
integrity sha512-Wf+CseT/iOJjrGtAOf3ck9zS7AgPmr2fZ3N97r4+YXN3mBePTG2/bJ8DApl9mVwYL+RpYbNxMEkEp4mPGdwG/w==
dependencies:
"@ethersproject/abstract-provider" "^5.6.1"
"@ethersproject/abstract-signer" "^5.6.2"
"@ethersproject/address" "^5.6.1"
"@ethersproject/base64" "^5.6.1"
"@ethersproject/basex" "^5.6.1"
"@ethersproject/bignumber" "^5.6.2"
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/constants" "^5.6.1"
"@ethersproject/hash" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
"@ethersproject/networks" "^5.6.3"
"@ethersproject/properties" "^5.6.0"
"@ethersproject/random" "^5.6.1"
"@ethersproject/rlp" "^5.6.1"
"@ethersproject/sha2" "^5.6.1"
"@ethersproject/strings" "^5.6.1"
"@ethersproject/transactions" "^5.6.2"
"@ethersproject/web" "^5.6.1"
bech32 "1.1.4"
ws "7.4.6"
"@ethersproject/random@5.6.0", "@ethersproject/random@^5.6.0": "@ethersproject/random@5.6.0", "@ethersproject/random@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.0.tgz#1505d1ab6a250e0ee92f436850fa3314b2cb5ae6" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.0.tgz#1505d1ab6a250e0ee92f436850fa3314b2cb5ae6"
...@@ -1728,6 +1940,14 @@ ...@@ -1728,6 +1940,14 @@
"@ethersproject/bytes" "^5.6.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/logger" "^5.6.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/random@5.6.1", "@ethersproject/random@^5.6.1":
version "5.6.1"
resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.1.tgz#66915943981bcd3e11bbd43733f5c3ba5a790255"
integrity sha512-/wtPNHwbmng+5yi3fkipA8YBT59DdkGRoC2vWk09Dci/q5DlgnMkhIycjHlavrvrjJBkFjO/ueLyT+aUDfc4lA==
dependencies:
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
"@ethersproject/rlp@5.6.0", "@ethersproject/rlp@^5.6.0": "@ethersproject/rlp@5.6.0", "@ethersproject/rlp@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.0.tgz#55a7be01c6f5e64d6e6e7edb6061aa120962a717" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.0.tgz#55a7be01c6f5e64d6e6e7edb6061aa120962a717"
...@@ -1736,6 +1956,14 @@ ...@@ -1736,6 +1956,14 @@
"@ethersproject/bytes" "^5.6.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/logger" "^5.6.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/rlp@5.6.1", "@ethersproject/rlp@^5.6.1":
version "5.6.1"
resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.1.tgz#df8311e6f9f24dcb03d59a2bac457a28a4fe2bd8"
integrity sha512-uYjmcZx+DKlFUk7a5/W9aQVaoEC7+1MOBgNtvNg13+RnuUwT4F0zTovC0tmay5SmRslb29V1B7Y5KCri46WhuQ==
dependencies:
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
"@ethersproject/sha2@5.6.0", "@ethersproject/sha2@^5.6.0": "@ethersproject/sha2@5.6.0", "@ethersproject/sha2@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.0.tgz#364c4c11cc753bda36f31f001628706ebadb64d9" resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.0.tgz#364c4c11cc753bda36f31f001628706ebadb64d9"
...@@ -1745,6 +1973,15 @@ ...@@ -1745,6 +1973,15 @@
"@ethersproject/logger" "^5.6.0" "@ethersproject/logger" "^5.6.0"
hash.js "1.1.7" hash.js "1.1.7"
"@ethersproject/sha2@5.6.1", "@ethersproject/sha2@^5.6.1":
version "5.6.1"
resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.1.tgz#211f14d3f5da5301c8972a8827770b6fd3e51656"
integrity sha512-5K2GyqcW7G4Yo3uenHegbXRPDgARpWUiXc6RiF7b6i/HXUoWlb7uCARh7BAHg7/qT/Q5ydofNwiZcim9qpjB6g==
dependencies:
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
hash.js "1.1.7"
"@ethersproject/signing-key@5.6.0", "@ethersproject/signing-key@^5.6.0": "@ethersproject/signing-key@5.6.0", "@ethersproject/signing-key@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.0.tgz#4f02e3fb09e22b71e2e1d6dc4bcb5dafa69ce042" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.0.tgz#4f02e3fb09e22b71e2e1d6dc4bcb5dafa69ce042"
...@@ -1757,6 +1994,18 @@ ...@@ -1757,6 +1994,18 @@
elliptic "6.5.4" elliptic "6.5.4"
hash.js "1.1.7" hash.js "1.1.7"
"@ethersproject/signing-key@5.6.2", "@ethersproject/signing-key@^5.6.2":
version "5.6.2"
resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.2.tgz#8a51b111e4d62e5a62aee1da1e088d12de0614a3"
integrity sha512-jVbu0RuP7EFpw82vHcL+GP35+KaNruVAZM90GxgQnGqB6crhBqW/ozBfFvdeImtmb4qPko0uxXjn8l9jpn0cwQ==
dependencies:
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
"@ethersproject/properties" "^5.6.0"
bn.js "^5.2.1"
elliptic "6.5.4"
hash.js "1.1.7"
"@ethersproject/solidity@5.6.0", "@ethersproject/solidity@^5.0.0", "@ethersproject/solidity@^5.0.9": "@ethersproject/solidity@5.6.0", "@ethersproject/solidity@^5.0.0", "@ethersproject/solidity@^5.0.9":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.0.tgz#64657362a596bf7f5630bdc921c07dd78df06dc3" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.0.tgz#64657362a596bf7f5630bdc921c07dd78df06dc3"
...@@ -1769,6 +2018,18 @@ ...@@ -1769,6 +2018,18 @@
"@ethersproject/sha2" "^5.6.0" "@ethersproject/sha2" "^5.6.0"
"@ethersproject/strings" "^5.6.0" "@ethersproject/strings" "^5.6.0"
"@ethersproject/solidity@5.6.1":
version "5.6.1"
resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.1.tgz#5845e71182c66d32e6ec5eefd041fca091a473e2"
integrity sha512-KWqVLkUUoLBfL1iwdzUVlkNqAUIFMpbbeH0rgCfKmJp0vFtY4AsaN91gHKo9ZZLkC4UOm3cI3BmMV4N53BOq4g==
dependencies:
"@ethersproject/bignumber" "^5.6.2"
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/keccak256" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
"@ethersproject/sha2" "^5.6.1"
"@ethersproject/strings" "^5.6.1"
"@ethersproject/strings@5.6.0", "@ethersproject/strings@^5.6.0": "@ethersproject/strings@5.6.0", "@ethersproject/strings@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.0.tgz#9891b26709153d996bf1303d39a7f4bc047878fd" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.0.tgz#9891b26709153d996bf1303d39a7f4bc047878fd"
...@@ -1778,6 +2039,15 @@ ...@@ -1778,6 +2039,15 @@
"@ethersproject/constants" "^5.6.0" "@ethersproject/constants" "^5.6.0"
"@ethersproject/logger" "^5.6.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/strings@5.6.1", "@ethersproject/strings@^5.6.1":
version "5.6.1"
resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.1.tgz#dbc1b7f901db822b5cafd4ebf01ca93c373f8952"
integrity sha512-2X1Lgk6Jyfg26MUnsHiT456U9ijxKUybz8IM1Vih+NJxYtXhmvKBcHOmvGqpFSVJ0nQ4ZCoIViR8XlRw1v/+Cw==
dependencies:
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/constants" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
"@ethersproject/transactions@5.6.0", "@ethersproject/transactions@^5.6.0": "@ethersproject/transactions@5.6.0", "@ethersproject/transactions@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.0.tgz#4b594d73a868ef6e1529a2f8f94a785e6791ae4e" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.0.tgz#4b594d73a868ef6e1529a2f8f94a785e6791ae4e"
...@@ -1793,6 +2063,21 @@ ...@@ -1793,6 +2063,21 @@
"@ethersproject/rlp" "^5.6.0" "@ethersproject/rlp" "^5.6.0"
"@ethersproject/signing-key" "^5.6.0" "@ethersproject/signing-key" "^5.6.0"
"@ethersproject/transactions@5.6.2", "@ethersproject/transactions@^5.6.2":
version "5.6.2"
resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.2.tgz#793a774c01ced9fe7073985bb95a4b4e57a6370b"
integrity sha512-BuV63IRPHmJvthNkkt9G70Ullx6AcM+SDc+a8Aw/8Yew6YwT51TcBKEp1P4oOQ/bP25I18JJr7rcFRgFtU9B2Q==
dependencies:
"@ethersproject/address" "^5.6.1"
"@ethersproject/bignumber" "^5.6.2"
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/constants" "^5.6.1"
"@ethersproject/keccak256" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
"@ethersproject/properties" "^5.6.0"
"@ethersproject/rlp" "^5.6.1"
"@ethersproject/signing-key" "^5.6.2"
"@ethersproject/units@5.6.0": "@ethersproject/units@5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.0.tgz#e5cbb1906988f5740254a21b9ded6bd51e826d9c" resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.0.tgz#e5cbb1906988f5740254a21b9ded6bd51e826d9c"
...@@ -1802,6 +2087,15 @@ ...@@ -1802,6 +2087,15 @@
"@ethersproject/constants" "^5.6.0" "@ethersproject/constants" "^5.6.0"
"@ethersproject/logger" "^5.6.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/units@5.6.1":
version "5.6.1"
resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.1.tgz#ecc590d16d37c8f9ef4e89e2005bda7ddc6a4e6f"
integrity sha512-rEfSEvMQ7obcx3KWD5EWWx77gqv54K6BKiZzKxkQJqtpriVsICrktIQmKl8ReNToPeIYPnFHpXvKpi068YFZXw==
dependencies:
"@ethersproject/bignumber" "^5.6.2"
"@ethersproject/constants" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
"@ethersproject/wallet@5.6.0": "@ethersproject/wallet@5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.0.tgz#33d11a806d783864208f348709a5a3badac8e22a" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.0.tgz#33d11a806d783864208f348709a5a3badac8e22a"
...@@ -1823,6 +2117,27 @@ ...@@ -1823,6 +2117,27 @@
"@ethersproject/transactions" "^5.6.0" "@ethersproject/transactions" "^5.6.0"
"@ethersproject/wordlists" "^5.6.0" "@ethersproject/wordlists" "^5.6.0"
"@ethersproject/wallet@5.6.2":
version "5.6.2"
resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.2.tgz#cd61429d1e934681e413f4bc847a5f2f87e3a03c"
integrity sha512-lrgh0FDQPuOnHcF80Q3gHYsSUODp6aJLAdDmDV0xKCN/T7D99ta1jGVhulg3PY8wiXEngD0DfM0I2XKXlrqJfg==
dependencies:
"@ethersproject/abstract-provider" "^5.6.1"
"@ethersproject/abstract-signer" "^5.6.2"
"@ethersproject/address" "^5.6.1"
"@ethersproject/bignumber" "^5.6.2"
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/hash" "^5.6.1"
"@ethersproject/hdnode" "^5.6.2"
"@ethersproject/json-wallets" "^5.6.1"
"@ethersproject/keccak256" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
"@ethersproject/properties" "^5.6.0"
"@ethersproject/random" "^5.6.1"
"@ethersproject/signing-key" "^5.6.2"
"@ethersproject/transactions" "^5.6.2"
"@ethersproject/wordlists" "^5.6.1"
"@ethersproject/web@5.6.0", "@ethersproject/web@^5.6.0": "@ethersproject/web@5.6.0", "@ethersproject/web@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.0.tgz#4bf8b3cbc17055027e1a5dd3c357e37474eaaeb8" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.0.tgz#4bf8b3cbc17055027e1a5dd3c357e37474eaaeb8"
...@@ -1834,6 +2149,17 @@ ...@@ -1834,6 +2149,17 @@
"@ethersproject/properties" "^5.6.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/strings" "^5.6.0" "@ethersproject/strings" "^5.6.0"
"@ethersproject/web@5.6.1", "@ethersproject/web@^5.6.1":
version "5.6.1"
resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.1.tgz#6e2bd3ebadd033e6fe57d072db2b69ad2c9bdf5d"
integrity sha512-/vSyzaQlNXkO1WV+RneYKqCJwualcUdx/Z3gseVovZP0wIlOFcCE1hkRhKBH8ImKbGQbMl9EAAyJFrJu7V0aqA==
dependencies:
"@ethersproject/base64" "^5.6.1"
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
"@ethersproject/properties" "^5.6.0"
"@ethersproject/strings" "^5.6.1"
"@ethersproject/wordlists@5.6.0", "@ethersproject/wordlists@^5.6.0": "@ethersproject/wordlists@5.6.0", "@ethersproject/wordlists@^5.6.0":
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.0.tgz#79e62c5276e091d8575f6930ba01a29218ded032" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.0.tgz#79e62c5276e091d8575f6930ba01a29218ded032"
...@@ -1845,6 +2171,17 @@ ...@@ -1845,6 +2171,17 @@
"@ethersproject/properties" "^5.6.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/strings" "^5.6.0" "@ethersproject/strings" "^5.6.0"
"@ethersproject/wordlists@5.6.1", "@ethersproject/wordlists@^5.6.1":
version "5.6.1"
resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.1.tgz#1e78e2740a8a21e9e99947e47979d72e130aeda1"
integrity sha512-wiPRgBpNbNwCQFoCr8bcWO8o5I810cqO6mkdtKfLKFlLxeCWcnzDi4Alu8iyNzlhYuS9npCwivMbRWF19dyblw==
dependencies:
"@ethersproject/bytes" "^5.6.1"
"@ethersproject/hash" "^5.6.1"
"@ethersproject/logger" "^5.6.0"
"@ethersproject/properties" "^5.6.0"
"@ethersproject/strings" "^5.6.1"
"@firebase/analytics-compat@0.1.3": "@firebase/analytics-compat@0.1.3":
version "0.1.3" version "0.1.3"
resolved "https://registry.yarnpkg.com/@firebase/analytics-compat/-/analytics-compat-0.1.3.tgz#20a67a9583cf9cc87a04a762e96d697c9ecc08d7" resolved "https://registry.yarnpkg.com/@firebase/analytics-compat/-/analytics-compat-0.1.3.tgz#20a67a9583cf9cc87a04a762e96d697c9ecc08d7"
...@@ -2223,11 +2560,27 @@ ...@@ -2223,11 +2560,27 @@
"@gnosis.pm/safe-apps-sdk" "4.0.0" "@gnosis.pm/safe-apps-sdk" "4.0.0"
events "^3.3.0" events "^3.3.0"
"@gnosis.pm/safe-apps-provider@^0.11.0":
version "0.11.0"
resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-apps-provider/-/safe-apps-provider-0.11.0.tgz#e8fece9bb09dc5179895bb8f3a75f8cddcfdf18c"
integrity sha512-XTEXa5iCk0XOZQkgwHcpzP3sOmT9kYsieY5Bfmlrj7GSuApxnn8PnA7tQuzCOrrH2PbT+nspY04h4aBDDJaKrw==
dependencies:
"@gnosis.pm/safe-apps-sdk" "7.3.0"
events "^3.3.0"
"@gnosis.pm/safe-apps-sdk@4.0.0": "@gnosis.pm/safe-apps-sdk@4.0.0":
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-apps-sdk/-/safe-apps-sdk-4.0.0.tgz#2fa53ba3e6a88c606787cc7c4d7836181e256024" resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-apps-sdk/-/safe-apps-sdk-4.0.0.tgz#2fa53ba3e6a88c606787cc7c4d7836181e256024"
integrity sha512-D+jFrRnhzmDbuA3D6tLH615WXdOtBEsv3qCAbBfXFDUiDbXFPVZbMdgnWUowA8he6PBbBYTn7LbSJaq/K5T3ZA== integrity sha512-D+jFrRnhzmDbuA3D6tLH615WXdOtBEsv3qCAbBfXFDUiDbXFPVZbMdgnWUowA8he6PBbBYTn7LbSJaq/K5T3ZA==
"@gnosis.pm/safe-apps-sdk@7.3.0", "@gnosis.pm/safe-apps-sdk@^7.3.0":
version "7.3.0"
resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-apps-sdk/-/safe-apps-sdk-7.3.0.tgz#3a3ed38b75657a7d5cd58d5a6884ec60087b05a8"
integrity sha512-1f6VHJWqPRKAEg/m+fbO1XiaDrsTcI3PQg31A0ciHATlVVoh35BYXryijaQxXblLzz4eDgbbIXQdNAH683j87Q==
dependencies:
"@gnosis.pm/safe-react-gateway-sdk" "^2.10.0"
ethers "^5.4.7"
"@gnosis.pm/safe-apps-web3-react@^0.6.0": "@gnosis.pm/safe-apps-web3-react@^0.6.0":
version "0.6.0" version "0.6.0"
resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-apps-web3-react/-/safe-apps-web3-react-0.6.0.tgz#ac77f569ee7bafe3bb6b4492e94905177a0f2e5d" resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-apps-web3-react/-/safe-apps-web3-react-0.6.0.tgz#ac77f569ee7bafe3bb6b4492e94905177a0f2e5d"
...@@ -2237,6 +2590,13 @@ ...@@ -2237,6 +2590,13 @@
"@gnosis.pm/safe-apps-sdk" "4.0.0" "@gnosis.pm/safe-apps-sdk" "4.0.0"
"@web3-react/abstract-connector" "6.0.7" "@web3-react/abstract-connector" "6.0.7"
"@gnosis.pm/safe-react-gateway-sdk@^2.10.0":
version "2.10.3"
resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-react-gateway-sdk/-/safe-react-gateway-sdk-2.10.3.tgz#4537442a78eb0508c483aabcac19296335a77ac3"
integrity sha512-ukaLACozdJQb2YGSAZgBUkF4CT9iKVjpnKFCKUnGGghXqp+Yyn9jpdcfFK0VYQJ6ZSwAm40tHtQaN3K9817Bcg==
dependencies:
cross-fetch "^3.1.5"
"@graphql-codegen/cli@1.21.5": "@graphql-codegen/cli@1.21.5":
version "1.21.5" version "1.21.5"
resolved "https://registry.yarnpkg.com/@graphql-codegen/cli/-/cli-1.21.5.tgz#b9041553747cfb2dee7c3473a2e2461ec3e7ada5" resolved "https://registry.yarnpkg.com/@graphql-codegen/cli/-/cli-1.21.5.tgz#b9041553747cfb2dee7c3473a2e2461ec3e7ada5"
...@@ -4822,7 +5182,7 @@ ...@@ -4822,7 +5182,7 @@
resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.0.tgz#c4545869fa9c389ec88c364e1a5f8178e8ab5034" resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.0.tgz#c4545869fa9c389ec88c364e1a5f8178e8ab5034"
integrity sha512-4BwqyWy6KpSvkocSaV7WR3BlZfrxLbJSLkg+j7Gl6pTDE+U55lLhJvQaMuDVazXYxcjBsG09k7UlH7cGiUI5vQ== integrity sha512-4BwqyWy6KpSvkocSaV7WR3BlZfrxLbJSLkg+j7Gl6pTDE+U55lLhJvQaMuDVazXYxcjBsG09k7UlH7cGiUI5vQ==
"@walletconnect/ethereum-provider@1.7.1", "@walletconnect/ethereum-provider@^1.5.4": "@walletconnect/ethereum-provider@1.7.1":
version "1.7.1" version "1.7.1"
resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-1.7.1.tgz#706bbb18659bd6475750fed7e5a93438c97a9fa9" resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-1.7.1.tgz#706bbb18659bd6475750fed7e5a93438c97a9fa9"
integrity sha512-r01XPO8NHs0n/rjU77VXXgCtxC/hL8F34bu+UHGXmkMUHZGCSY2uKN4VCe2uptkCVYUQ9gCEDyCOUyQSQzULjw== integrity sha512-r01XPO8NHs0n/rjU77VXXgCtxC/hL8F34bu+UHGXmkMUHZGCSY2uKN4VCe2uptkCVYUQ9gCEDyCOUyQSQzULjw==
...@@ -4959,81 +5319,105 @@ ...@@ -4959,81 +5319,105 @@
dependencies: dependencies:
"@walletconnect/window-getters" "^1.0.0" "@walletconnect/window-getters" "^1.0.0"
"@web3-react/abstract-connector@6.0.7", "@web3-react/abstract-connector@^6.0.7", "web3-react-abstract-connector@npm:@web3-react/abstract-connector@^6.0.7": "@web3-react/abstract-connector@6.0.7":
version "6.0.7" version "6.0.7"
resolved "https://registry.yarnpkg.com/@web3-react/abstract-connector/-/abstract-connector-6.0.7.tgz#401b3c045f1e0fab04256311be49d5144e9badc6" resolved "https://registry.yarnpkg.com/@web3-react/abstract-connector/-/abstract-connector-6.0.7.tgz#401b3c045f1e0fab04256311be49d5144e9badc6"
integrity sha512-RhQasA4Ox8CxUC0OENc1AJJm8UTybu/oOCM61Zjg6y0iF7Z0sqv1Ai1VdhC33hrQpA8qSBgoXN9PaP8jKmtdqg== integrity sha512-RhQasA4Ox8CxUC0OENc1AJJm8UTybu/oOCM61Zjg6y0iF7Z0sqv1Ai1VdhC33hrQpA8qSBgoXN9PaP8jKmtdqg==
dependencies: dependencies:
"@web3-react/types" "^6.0.7" "@web3-react/types" "^6.0.7"
"@web3-react/core@^8.0.23-beta.0": "@web3-react/coinbase-wallet@^8.0.33-beta.0":
version "8.0.23-beta.0" version "8.0.33-beta.0"
resolved "https://registry.yarnpkg.com/@web3-react/core/-/core-8.0.23-beta.0.tgz#3a33234fbe25459ae2ce82b8bada5077386961f1" resolved "https://registry.yarnpkg.com/@web3-react/coinbase-wallet/-/coinbase-wallet-8.0.33-beta.0.tgz#65db92da057e9e4d2c63d689cc42874eaa9989e0"
integrity sha512-NmVWUKSzYr+Yk0nbZdOLMtidtgXs6qOCR1DcxLF4Aa0zJ/8hRrX23siFfrVNTSpck4fgyURv8QVzE5+VHQx2HA== integrity sha512-bi+lm5g8PbLkXjrSS8cKXUuU4yg4A8OJp9M+BAuEWiQ++f7er+XtVF9+o/S81F411YkQH+NTP4VtJmo4V0kWIw==
dependencies: dependencies:
"@web3-react/store" "^8.0.17-beta.0" "@web3-react/types" "^8.0.19-beta.0"
"@web3-react/types" "^8.0.12-beta.0"
zustand "^4.0.0-beta.3" "@web3-react/core@^8.0.33-beta.0":
version "8.0.33-beta.0"
resolved "https://registry.yarnpkg.com/@web3-react/core/-/core-8.0.33-beta.0.tgz#018686511e9dcff1001965048d5e16c9ae60268a"
integrity sha512-qif/t5zycmlercIGPGNLpxM0+qiRZpbBIVFHgTGSS67bssgZoeBAXwafesbD1KRjiubATMgYBsKy16KskjxwTA==
dependencies:
"@web3-react/store" "^8.0.24-beta.0"
"@web3-react/types" "^8.0.19-beta.0"
zustand "^4.0.0-rc.0"
optionalDependencies: optionalDependencies:
"@ethersproject/providers" "^5" "@ethersproject/providers" "^5"
"@web3-react/eip1193@^8.0.18-beta.0": "@web3-react/eip1193@^8.0.25-beta.0":
version "8.0.18-beta.0" version "8.0.25-beta.0"
resolved "https://registry.yarnpkg.com/@web3-react/eip1193/-/eip1193-8.0.18-beta.0.tgz#4c1af5c50f19d65bb221bf5d0512bcab9bd16a6f" resolved "https://registry.yarnpkg.com/@web3-react/eip1193/-/eip1193-8.0.25-beta.0.tgz#1df94b7c5ecef1ea97181015f0717a26b0a08bc7"
integrity sha512-GsPLRP6VUw+uBhesYOrentD51gdj3yDK6oBsUKZLDwgcVaIWgmGjf0J7PTEWyOhs484ezewSaSmoitmWG19rZg== integrity sha512-L96B+xWjklR23bYyxYCvDWWcBsoThgY076oKmjJDel+3BnuEK7IH92aWcB1wUo3oLKzETdOm7eWi0ZyjBoM3Ag==
dependencies: dependencies:
"@web3-react/types" "^8.0.12-beta.0" "@web3-react/types" "^8.0.19-beta.0"
"@web3-react/empty@^8.0.12-beta.0": "@web3-react/empty@^8.0.19-beta.0":
version "8.0.12-beta.0" version "8.0.19-beta.0"
resolved "https://registry.yarnpkg.com/@web3-react/empty/-/empty-8.0.12-beta.0.tgz#e71cb6a6085876177a8aa7bac224de2eee4c3d91" resolved "https://registry.yarnpkg.com/@web3-react/empty/-/empty-8.0.19-beta.0.tgz#884114cbdc5a82a2cd2e8e661162d2e69284a2ba"
integrity sha512-gUOuaeOaf5brx3Qi38vPShajOsnBPXeZBDbMNBEIaWmXf5RYYcwLnjdmauLTfRcvja+8FszPuMCs2GLNQOdEag== integrity sha512-AAAeaS3Hn6PHdoP86vgx4O0ZjWQ9RFYAID+rJy84DDjLUodl9XLLYidGZmotEdv7kpKw5B5OtxnTjiMrSw64ag==
dependencies: dependencies:
"@web3-react/types" "^8.0.12-beta.0" "@web3-react/types" "^8.0.19-beta.0"
"@web3-react/metamask@^8.0.19-beta.0": "@web3-react/gnosis-safe@^8.0.5-beta.0":
version "8.0.19-beta.0" version "8.0.5-beta.0"
resolved "https://registry.yarnpkg.com/@web3-react/metamask/-/metamask-8.0.19-beta.0.tgz#7d7c306c1245ada7dff2e1c4bdae871abb126956" resolved "https://registry.yarnpkg.com/@web3-react/gnosis-safe/-/gnosis-safe-8.0.5-beta.0.tgz#519a3ab0796d34c8c362709b4fe57b533df9afbb"
integrity sha512-KRW+uvOnEadQEWAhX//o/OsCHuQCGuHmRUwcH8o5Q1jnjXtelTA9HmjWt8tyLQchPM7PHgrxfY1OH/Li05XTEA== integrity sha512-bM3pTPX/B251J411c2eo0ZGn05ySWEiErB0TvY2hNRdYRiAebrho9QgX+Npo6eCZ7TrxZJW4UlFN/UBQtQtjww==
dependencies:
"@gnosis.pm/safe-apps-provider" "^0.11.0"
"@gnosis.pm/safe-apps-sdk" "^7.3.0"
"@web3-react/types" "^8.0.19-beta.0"
"@web3-react/metamask@^8.0.26-beta.0":
version "8.0.26-beta.0"
resolved "https://registry.yarnpkg.com/@web3-react/metamask/-/metamask-8.0.26-beta.0.tgz#c22dfec8d09be95493668fbb140e5d3a6ff45a8e"
integrity sha512-srYzA4nvMBWlH7kJLCunYueyucbTLmGqDUOK3QquVmQ+avvwOlYVzyvKPQrHf4M2+6f6GpzWYuw6AjNknvfaIA==
dependencies: dependencies:
"@metamask/detect-provider" "^1.2.0" "@metamask/detect-provider" "^1.2.0"
"@web3-react/types" "^8.0.12-beta.0" "@web3-react/types" "^8.0.19-beta.0"
"@web3-react/store@^8.0.17-beta.0": "@web3-react/network@^8.0.26-beta.0":
version "8.0.17-beta.0" version "8.0.26-beta.0"
resolved "https://registry.yarnpkg.com/@web3-react/store/-/store-8.0.17-beta.0.tgz#a059b6e761598e108c25dfccabb227682b32899d" resolved "https://registry.yarnpkg.com/@web3-react/network/-/network-8.0.26-beta.0.tgz#43582d7652ae3a3785df0d3c3e582b03e6672e72"
integrity sha512-1JGkYs8HCd7ixLB5Yb7TZzz98QmCTvg0vhR+7s2m29wbp9ADsJN/EI9Avr1Kxi0UbRXTrXnEfgvl68HHmAC0GQ== integrity sha512-8VSYbWYHpGvlJOSXgUduSp+UDUaUU1tx+/9ivMb96TOgeyUqmkbERJzzPiaE3d3Ehe+7y/uvu0+v20tQqlx8Uw==
dependencies:
"@ethersproject/providers" "^5"
"@web3-react/types" "^8.0.19-beta.0"
"@web3-react/store@^8.0.24-beta.0":
version "8.0.24-beta.0"
resolved "https://registry.yarnpkg.com/@web3-react/store/-/store-8.0.24-beta.0.tgz#fb7e25d8478fce8ae95e6f50d7310f97876dc591"
integrity sha512-R2MA1lByr9LwQKhso3PYq31GRYEPbM1HKC4uWGGAY42JBXG+Fnhf/0fUIDcdJzdT6tonGBKRgqXKXQ+8HEjgzA==
dependencies: dependencies:
"@ethersproject/address" "^5" "@ethersproject/address" "^5"
"@web3-react/types" "^8.0.12-beta.0" "@web3-react/types" "^8.0.19-beta.0"
zustand "^4.0.0-beta.3" zustand "^4.0.0-rc.0"
"@web3-react/types@^6.0.7", "web3-react-types@npm:@web3-react/types@^6.0.7": "@web3-react/types@^6.0.7":
version "6.0.7" version "6.0.7"
resolved "https://registry.yarnpkg.com/@web3-react/types/-/types-6.0.7.tgz#34a6204224467eedc6123abaf55fbb6baeb2809f" resolved "https://registry.yarnpkg.com/@web3-react/types/-/types-6.0.7.tgz#34a6204224467eedc6123abaf55fbb6baeb2809f"
integrity sha512-ofGmfDhxmNT1/P/MgVa8IKSkCStFiyvXe+U5tyZurKdrtTDFU+wJ/LxClPDtFerWpczNFPUSrKcuhfPX1sI6+A== integrity sha512-ofGmfDhxmNT1/P/MgVa8IKSkCStFiyvXe+U5tyZurKdrtTDFU+wJ/LxClPDtFerWpczNFPUSrKcuhfPX1sI6+A==
"@web3-react/types@^8.0.12-beta.0": "@web3-react/types@^8.0.19-beta.0":
version "8.0.12-beta.0" version "8.0.19-beta.0"
resolved "https://registry.yarnpkg.com/@web3-react/types/-/types-8.0.12-beta.0.tgz#787c7ca8b4dfd66bed0e4801fef7039ba42db59e" resolved "https://registry.yarnpkg.com/@web3-react/types/-/types-8.0.19-beta.0.tgz#07daeef090cb252302f3bdf138d133df99826fb1"
integrity sha512-BWz8RnpO0gdySjL62iURcn41ZDGxq4kokV2qbgqgASHwst5/uZ7RI2MJHTzn8vH0AUrCsg/y6E8oeTNsCAQvfg== integrity sha512-tM63N3IiL5E61HBvx62kDmQlQ/zCfnlYAkJCQnLWFpzQ2Kafcfpi0qAynvFye8DqSgy4E3d6kQah/NIs6BL+qw==
dependencies: dependencies:
zustand "^4.0.0-beta.3" zustand "^4.0.0-rc.0"
"@web3-react/url@^8.0.17-beta.0": "@web3-react/url@^8.0.24-beta.0":
version "8.0.17-beta.0" version "8.0.24-beta.0"
resolved "https://registry.yarnpkg.com/@web3-react/url/-/url-8.0.17-beta.0.tgz#c972c0e5445902d05a5562bef3cdd3e8f0a32ea5" resolved "https://registry.yarnpkg.com/@web3-react/url/-/url-8.0.24-beta.0.tgz#7417cdb37bace531aa0fe76ccc4ccef8ed55c0e9"
integrity sha512-03fGMa22wdabeCNrD2sIr/IePn+VoL0Bbpyz0jJrh9dUfrDEgsLrtcdmktLhfM4LCtGAye1W1FZpi/65mczSXA== integrity sha512-+pAMWVKNqg2h0iCRQ6b8zETdmSk903Vg3jinjMwwWSdxLAArCPlUoMgCtnxIFonQzwphynCEIo9w55uQBrOglA==
dependencies: dependencies:
"@ethersproject/providers" "^5" "@ethersproject/providers" "^5"
"@web3-react/types" "^8.0.12-beta.0" "@web3-react/types" "^8.0.19-beta.0"
"@web3-react/walletconnect@^8.0.26-beta.0": "@web3-react/walletconnect@^8.0.34-beta.0":
version "8.0.26-beta.0" version "8.0.34-beta.0"
resolved "https://registry.yarnpkg.com/@web3-react/walletconnect/-/walletconnect-8.0.26-beta.0.tgz#0dd903bcb90c986876e142a948c8c92d51e65072" resolved "https://registry.yarnpkg.com/@web3-react/walletconnect/-/walletconnect-8.0.34-beta.0.tgz#b0dee4d8e37dbb8783b46f6e181cbb7c317084d8"
integrity sha512-v7cdAmVjIxqMhH8xTuOFJOKphb089SOYHlk61GhOZCEyLcfbbc+rFuGkKiY0lFtD1/ET3cHJjRok2buXOJRn8g== integrity sha512-CG6dc6Lq0QVNvTp5lCFycIaHoPPV+X/6ay3swd5t2LD9R9Ao8sSzF0zU9Fi1iq41UDCue6WO4u2Lp7uHNAIcxw==
dependencies: dependencies:
"@web3-react/types" "^8.0.12-beta.0" "@web3-react/types" "^8.0.19-beta.0"
eventemitter3 "^4.0.7" eventemitter3 "^4.0.7"
"@webassemblyjs/ast@1.9.0": "@webassemblyjs/ast@1.9.0":
...@@ -5696,6 +6080,11 @@ autoprefixer@^9.6.1: ...@@ -5696,6 +6080,11 @@ autoprefixer@^9.6.1:
postcss "^7.0.32" postcss "^7.0.32"
postcss-value-parser "^4.1.0" postcss-value-parser "^4.1.0"
available-typed-arrays@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7"
integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
await-timeout@^1.1.1: await-timeout@^1.1.1:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/await-timeout/-/await-timeout-1.1.1.tgz#d42062ee6bc4eb271fe4d4f851eb658dae7e3906" resolved "https://registry.yarnpkg.com/await-timeout/-/await-timeout-1.1.1.tgz#d42062ee6bc4eb271fe4d4f851eb658dae7e3906"
...@@ -6146,6 +6535,11 @@ bn.js@^5.0.0, bn.js@^5.1.1: ...@@ -6146,6 +6535,11 @@ bn.js@^5.0.0, bn.js@^5.1.1:
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==
bn.js@^5.2.1:
version "5.2.1"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70"
integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
body-parser@1.19.0: body-parser@1.19.0:
version "1.19.0" version "1.19.0"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
...@@ -6408,6 +6802,14 @@ buffer@^5.2.0, buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0, buffer@^5.7.0: ...@@ -6408,6 +6802,14 @@ buffer@^5.2.0, buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0, buffer@^5.7.0:
base64-js "^1.3.1" base64-js "^1.3.1"
ieee754 "^1.1.13" ieee754 "^1.1.13"
buffer@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
dependencies:
base64-js "^1.3.1"
ieee754 "^1.2.1"
builtin-modules@^3.1.0: builtin-modules@^3.1.0:
version "3.2.0" version "3.2.0"
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887"
...@@ -7448,6 +7850,13 @@ cross-fetch@3.1.4, cross-fetch@^3.0.4, cross-fetch@^3.0.6, cross-fetch@^3.1.4: ...@@ -7448,6 +7850,13 @@ cross-fetch@3.1.4, cross-fetch@^3.0.4, cross-fetch@^3.0.6, cross-fetch@^3.1.4:
dependencies: dependencies:
node-fetch "2.6.1" node-fetch "2.6.1"
cross-fetch@^3.1.5:
version "3.1.5"
resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f"
integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==
dependencies:
node-fetch "2.6.7"
cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2: cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2:
version "7.0.3" version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
...@@ -8264,6 +8673,14 @@ define-properties@^1.1.2, define-properties@^1.1.3: ...@@ -8264,6 +8673,14 @@ define-properties@^1.1.2, define-properties@^1.1.3:
dependencies: dependencies:
object-keys "^1.0.12" object-keys "^1.0.12"
define-properties@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1"
integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==
dependencies:
has-property-descriptors "^1.0.0"
object-keys "^1.1.1"
define-property@^0.2.5: define-property@^0.2.5:
version "0.2.5" version "0.2.5"
resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
...@@ -8759,6 +9176,35 @@ es-abstract@^1.17.2, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es- ...@@ -8759,6 +9176,35 @@ es-abstract@^1.17.2, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-
string.prototype.trimstart "^1.0.4" string.prototype.trimstart "^1.0.4"
unbox-primitive "^1.0.1" unbox-primitive "^1.0.1"
es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.0:
version "1.20.1"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814"
integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==
dependencies:
call-bind "^1.0.2"
es-to-primitive "^1.2.1"
function-bind "^1.1.1"
function.prototype.name "^1.1.5"
get-intrinsic "^1.1.1"
get-symbol-description "^1.0.0"
has "^1.0.3"
has-property-descriptors "^1.0.0"
has-symbols "^1.0.3"
internal-slot "^1.0.3"
is-callable "^1.2.4"
is-negative-zero "^2.0.2"
is-regex "^1.1.4"
is-shared-array-buffer "^1.0.2"
is-string "^1.0.7"
is-weakref "^1.0.2"
object-inspect "^1.12.0"
object-keys "^1.1.1"
object.assign "^4.1.2"
regexp.prototype.flags "^1.4.3"
string.prototype.trimend "^1.0.5"
string.prototype.trimstart "^1.0.5"
unbox-primitive "^1.0.2"
es-to-primitive@^1.2.1: es-to-primitive@^1.2.1:
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
...@@ -9305,6 +9751,42 @@ ethers@^5.1.4, ethers@^5.6.0: ...@@ -9305,6 +9751,42 @@ ethers@^5.1.4, ethers@^5.6.0:
"@ethersproject/web" "5.6.0" "@ethersproject/web" "5.6.0"
"@ethersproject/wordlists" "5.6.0" "@ethersproject/wordlists" "5.6.0"
ethers@^5.4.7:
version "5.6.8"
resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.8.tgz#d36b816b4896341a80a8bbd2a44e8cb6e9b98dd4"
integrity sha512-YxIGaltAOdvBFPZwIkyHnXbW40f1r8mHUgapW6dxkO+6t7H6wY8POUn0Kbxrd/N7I4hHxyi7YCddMAH/wmho2w==
dependencies:
"@ethersproject/abi" "5.6.3"
"@ethersproject/abstract-provider" "5.6.1"
"@ethersproject/abstract-signer" "5.6.2"
"@ethersproject/address" "5.6.1"
"@ethersproject/base64" "5.6.1"
"@ethersproject/basex" "5.6.1"
"@ethersproject/bignumber" "5.6.2"
"@ethersproject/bytes" "5.6.1"
"@ethersproject/constants" "5.6.1"
"@ethersproject/contracts" "5.6.2"
"@ethersproject/hash" "5.6.1"
"@ethersproject/hdnode" "5.6.2"
"@ethersproject/json-wallets" "5.6.1"
"@ethersproject/keccak256" "5.6.1"
"@ethersproject/logger" "5.6.0"
"@ethersproject/networks" "5.6.3"
"@ethersproject/pbkdf2" "5.6.1"
"@ethersproject/properties" "5.6.0"
"@ethersproject/providers" "5.6.8"
"@ethersproject/random" "5.6.1"
"@ethersproject/rlp" "5.6.1"
"@ethersproject/sha2" "5.6.1"
"@ethersproject/signing-key" "5.6.2"
"@ethersproject/solidity" "5.6.1"
"@ethersproject/strings" "5.6.1"
"@ethersproject/transactions" "5.6.2"
"@ethersproject/units" "5.6.1"
"@ethersproject/wallet" "5.6.2"
"@ethersproject/web" "5.6.1"
"@ethersproject/wordlists" "5.6.1"
ethjs-util@0.1.6, ethjs-util@^0.1.3: ethjs-util@0.1.6, ethjs-util@^0.1.3:
version "0.1.6" version "0.1.6"
resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz" resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz"
...@@ -9877,6 +10359,13 @@ follow-redirects@^1.0.0, follow-redirects@^1.10.0: ...@@ -9877,6 +10359,13 @@ follow-redirects@^1.0.0, follow-redirects@^1.10.0:
resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz" resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz"
integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==
for-each@^0.3.3:
version "0.3.3"
resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
dependencies:
is-callable "^1.1.3"
for-in@^1.0.2: for-in@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
...@@ -9927,12 +10416,10 @@ form-data@~2.3.2: ...@@ -9927,12 +10416,10 @@ form-data@~2.3.2:
combined-stream "^1.0.6" combined-stream "^1.0.6"
mime-types "^2.1.12" mime-types "^2.1.12"
fortmatic@^1.0.0: fortmatic@^2.4.0:
version "1.1.3" version "2.4.0"
resolved "https://registry.npmjs.org/fortmatic/-/fortmatic-1.1.3.tgz" resolved "https://registry.yarnpkg.com/fortmatic/-/fortmatic-2.4.0.tgz#0546803d5c6187c06b3367eba66235cf4a195ece"
integrity sha512-70gPiTuwfqEQNg4fFK5MVf3gRAW+mo2tHdiMSEt2OLKcoHWrAn63e/r245dPJAw4Qvz7PhkYF/bTx6ga50zWog== integrity sha512-4LVxybyWcz8eFkTjIW12JRyRCUV9/qih435l0+5ncTVIb+zzXjvjQ5dZU0eBAXXyAgmV9BIRYkQL9H/lc76w/w==
dependencies:
"@babel/runtime" "7.3.4"
forwarded@0.2.0: forwarded@0.2.0:
version "0.2.0" version "0.2.0"
...@@ -10027,11 +10514,26 @@ function-bind@^1.1.1: ...@@ -10027,11 +10514,26 @@ function-bind@^1.1.1:
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
function.prototype.name@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621"
integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
es-abstract "^1.19.0"
functions-have-names "^1.2.2"
functional-red-black-tree@^1.0.1: functional-red-black-tree@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
functions-have-names@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
fuzzaldrin@^2.1.0: fuzzaldrin@^2.1.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.npmjs.org/fuzzaldrin/-/fuzzaldrin-2.1.0.tgz" resolved "https://registry.npmjs.org/fuzzaldrin/-/fuzzaldrin-2.1.0.tgz"
...@@ -10378,6 +10880,11 @@ has-bigints@^1.0.1: ...@@ -10378,6 +10880,11 @@ has-bigints@^1.0.1:
resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==
has-bigints@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
has-flag@^3.0.0: has-flag@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
...@@ -10388,11 +10895,23 @@ has-flag@^4.0.0: ...@@ -10388,11 +10895,23 @@ has-flag@^4.0.0:
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
has-property-descriptors@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861"
integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
dependencies:
get-intrinsic "^1.1.1"
has-symbols@^1.0.1, has-symbols@^1.0.2: has-symbols@^1.0.1, has-symbols@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
has-symbols@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
has-tostringtag@^1.0.0: has-tostringtag@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
...@@ -10750,7 +11269,7 @@ identity-obj-proxy@3.0.0: ...@@ -10750,7 +11269,7 @@ identity-obj-proxy@3.0.0:
dependencies: dependencies:
harmony-reflect "^1.4.6" harmony-reflect "^1.4.6"
ieee754@^1.1.13, ieee754@^1.1.4: ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1:
version "1.2.1" version "1.2.1"
resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
...@@ -11075,7 +11594,7 @@ is-buffer@^1.1.4, is-buffer@^1.1.5: ...@@ -11075,7 +11594,7 @@ is-buffer@^1.1.4, is-buffer@^1.1.5:
resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz"
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
is-callable@^1.1.4, is-callable@^1.2.4: is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4:
version "1.2.4" version "1.2.4"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
...@@ -11211,6 +11730,13 @@ is-generator-fn@^2.0.0: ...@@ -11211,6 +11730,13 @@ is-generator-fn@^2.0.0:
resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
is-generator-function@^1.0.7:
version "1.0.10"
resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72"
integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
dependencies:
has-tostringtag "^1.0.0"
is-glob@4.0.1, is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: is-glob@4.0.1, is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
version "4.0.1" version "4.0.1"
resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz"
...@@ -11265,6 +11791,11 @@ is-negative-zero@^2.0.1: ...@@ -11265,6 +11791,11 @@ is-negative-zero@^2.0.1:
resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24"
integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==
is-negative-zero@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
is-number-object@^1.0.4: is-number-object@^1.0.4:
version "1.0.6" version "1.0.6"
resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0"
...@@ -11387,6 +11918,13 @@ is-shared-array-buffer@^1.0.1: ...@@ -11387,6 +11918,13 @@ is-shared-array-buffer@^1.0.1:
resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6"
integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==
is-shared-array-buffer@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
dependencies:
call-bind "^1.0.2"
is-stream@^1.1.0: is-stream@^1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
...@@ -11411,6 +11949,17 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: ...@@ -11411,6 +11949,17 @@ is-symbol@^1.0.2, is-symbol@^1.0.3:
dependencies: dependencies:
has-symbols "^1.0.2" has-symbols "^1.0.2"
is-typed-array@^1.1.3, is-typed-array@^1.1.9:
version "1.1.9"
resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.9.tgz#246d77d2871e7d9f5aeb1d54b9f52c71329ece67"
integrity sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==
dependencies:
available-typed-arrays "^1.0.5"
call-bind "^1.0.2"
es-abstract "^1.20.0"
for-each "^0.3.3"
has-tostringtag "^1.0.0"
is-typedarray@1.0.0, is-typedarray@^1.0.0, is-typedarray@~1.0.0: is-typedarray@1.0.0, is-typedarray@^1.0.0, is-typedarray@~1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"
...@@ -11442,6 +11991,13 @@ is-weakref@^1.0.1: ...@@ -11442,6 +11991,13 @@ is-weakref@^1.0.1:
dependencies: dependencies:
call-bind "^1.0.0" call-bind "^1.0.0"
is-weakref@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
dependencies:
call-bind "^1.0.2"
is-whitespace-character@^1.0.0: is-whitespace-character@^1.0.0:
version "1.0.4" version "1.0.4"
resolved "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz" resolved "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz"
...@@ -13358,7 +13914,7 @@ node-fetch@2.6.5: ...@@ -13358,7 +13914,7 @@ node-fetch@2.6.5:
dependencies: dependencies:
whatwg-url "^5.0.0" whatwg-url "^5.0.0"
node-fetch@^2.6.1: node-fetch@2.6.7, node-fetch@^2.6.1:
version "2.6.7" version "2.6.7"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
...@@ -13570,6 +14126,11 @@ object-inspect@^1.11.0, object-inspect@^1.9.0: ...@@ -13570,6 +14126,11 @@ object-inspect@^1.11.0, object-inspect@^1.9.0:
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1"
integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==
object-inspect@^1.12.0:
version "1.12.2"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea"
integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==
object-is@^1.0.1: object-is@^1.0.1:
version "1.1.5" version "1.1.5"
resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
...@@ -15207,6 +15768,13 @@ qs@6.7.0: ...@@ -15207,6 +15768,13 @@ qs@6.7.0:
resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
qs@^6.10.3:
version "6.10.5"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.5.tgz#974715920a80ff6a262264acd2c7e6c2a53282b4"
integrity sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ==
dependencies:
side-channel "^1.0.4"
qs@^6.9.4: qs@^6.9.4:
version "6.10.1" version "6.10.1"
resolved "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz" resolved "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz"
...@@ -15780,11 +16348,6 @@ regenerator-runtime@^0.11.0: ...@@ -15780,11 +16348,6 @@ regenerator-runtime@^0.11.0:
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
regenerator-runtime@^0.12.0:
version "0.12.1"
resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz"
integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==
regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7:
version "0.13.9" version "0.13.9"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
...@@ -15818,6 +16381,15 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: ...@@ -15818,6 +16381,15 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1:
call-bind "^1.0.2" call-bind "^1.0.2"
define-properties "^1.1.3" define-properties "^1.1.3"
regexp.prototype.flags@^1.4.3:
version "1.4.3"
resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac"
integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
functions-have-names "^1.2.2"
regexpp@^3.1.0: regexpp@^3.1.0:
version "3.2.0" version "3.2.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
...@@ -17140,6 +17712,15 @@ string.prototype.trimend@^1.0.4: ...@@ -17140,6 +17712,15 @@ string.prototype.trimend@^1.0.4:
call-bind "^1.0.2" call-bind "^1.0.2"
define-properties "^1.1.3" define-properties "^1.1.3"
string.prototype.trimend@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0"
integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.4"
es-abstract "^1.19.5"
string.prototype.trimstart@^1.0.4: string.prototype.trimstart@^1.0.4:
version "1.0.4" version "1.0.4"
resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed"
...@@ -17148,6 +17729,15 @@ string.prototype.trimstart@^1.0.4: ...@@ -17148,6 +17729,15 @@ string.prototype.trimstart@^1.0.4:
call-bind "^1.0.2" call-bind "^1.0.2"
define-properties "^1.1.3" define-properties "^1.1.3"
string.prototype.trimstart@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef"
integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.4"
es-abstract "^1.19.5"
string_decoder@^1.0.0, string_decoder@^1.1.1: string_decoder@^1.0.0, string_decoder@^1.1.1:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
...@@ -17577,7 +18167,7 @@ timsort@^0.3.0: ...@@ -17577,7 +18167,7 @@ timsort@^0.3.0:
resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
tiny-invariant@^1.0.2, tiny-invariant@^1.0.6, tiny-invariant@^1.1.0, tiny-invariant@^1.2.0: tiny-invariant@^1.0.2, tiny-invariant@^1.1.0, tiny-invariant@^1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9"
integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==
...@@ -17941,6 +18531,16 @@ unbox-primitive@^1.0.1: ...@@ -17941,6 +18531,16 @@ unbox-primitive@^1.0.1:
has-symbols "^1.0.2" has-symbols "^1.0.2"
which-boxed-primitive "^1.0.2" which-boxed-primitive "^1.0.2"
unbox-primitive@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"
integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
dependencies:
call-bind "^1.0.2"
has-bigints "^1.0.2"
has-symbols "^1.0.3"
which-boxed-primitive "^1.0.2"
unc-path-regex@^0.1.2: unc-path-regex@^0.1.2:
version "0.1.2" version "0.1.2"
resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
...@@ -18209,10 +18809,10 @@ use-sidecar@^1.0.1: ...@@ -18209,10 +18809,10 @@ use-sidecar@^1.0.1:
detect-node-es "^1.1.0" detect-node-es "^1.1.0"
tslib "^1.9.3" tslib "^1.9.3"
use-sync-external-store@1.0.0: use-sync-external-store@1.1.0:
version "1.0.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.0.0.tgz#d98f4a9c2e73d0f958e7e2d2c2bfb5f618cbd8fd" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.1.0.tgz#3343c3fe7f7e404db70f8c687adf5c1652d34e82"
integrity sha512-AFVsxg5GkFg8GDcxnl+Z0lMAz9rE8DGJCc28qnBuQF7lac57B5smLcT37aXpXIIPz75rW4g3eXHPjhHwdGskOw== integrity sha512-SEnieB2FPKEVne66NpXPd1Np4R1lTNKfjuy3XdIoPQKYBAFdzbzSZlSn1KJZUiihQLQC5Znot4SBz1EOTBwQAQ==
use@^3.1.0: use@^3.1.0:
version "3.1.1" version "3.1.1"
...@@ -18263,6 +18863,18 @@ util@^0.11.0: ...@@ -18263,6 +18863,18 @@ util@^0.11.0:
dependencies: dependencies:
inherits "2.0.3" inherits "2.0.3"
util@^0.12.4:
version "0.12.4"
resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253"
integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==
dependencies:
inherits "^2.0.3"
is-arguments "^1.0.4"
is-generator-function "^1.0.7"
is-typed-array "^1.1.3"
safe-buffer "^5.1.2"
which-typed-array "^1.1.2"
utila@~0.4: utila@~0.4:
version "0.4.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
...@@ -18392,25 +19004,6 @@ walker@^1.0.7, walker@~1.0.5: ...@@ -18392,25 +19004,6 @@ walker@^1.0.7, walker@~1.0.5:
dependencies: dependencies:
makeerror "1.0.x" makeerror "1.0.x"
walletlink@^2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/walletlink/-/walletlink-2.5.0.tgz#b8db10f4d9f124084feb16d1e2b2d08ba8c20d21"
integrity sha512-PBJmK5tZmonwKPABBI2/optaZ11O4kKmkmnU5eLKhk4XRlal5qJ1igZ4U5j3w6w8wxxdhCWpLMHzGWt3n/p7mw==
dependencies:
"@metamask/safe-event-emitter" "2.0.0"
bind-decorator "^1.0.11"
bn.js "^5.1.1"
clsx "^1.1.0"
eth-block-tracker "4.4.3"
eth-json-rpc-filters "4.2.2"
eth-rpc-errors "4.0.2"
js-sha256 "0.9.0"
json-rpc-engine "6.1.0"
keccak "^3.0.1"
preact "^10.5.9"
rxjs "^6.6.3"
stream-browserify "^3.0.0"
warning@^4.0.2, warning@^4.0.3: warning@^4.0.2, warning@^4.0.3:
version "4.0.3" version "4.0.3"
resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz"
...@@ -18462,55 +19055,6 @@ web-vitals@^2.1.0: ...@@ -18462,55 +19055,6 @@ web-vitals@^2.1.0:
resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-2.1.0.tgz#ebf5428875ab5bfc1056c2e80cd177001287de7b" resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-2.1.0.tgz#ebf5428875ab5bfc1056c2e80cd177001287de7b"
integrity sha512-npEyJP8jHf3J71t1tRTEtz9FeKp8H2udWJUUq5ykfPhhstr//TUxiYhIEzLNwk4zv2ybAilMn7v7N6Mxmuitmg== integrity sha512-npEyJP8jHf3J71t1tRTEtz9FeKp8H2udWJUUq5ykfPhhstr//TUxiYhIEzLNwk4zv2ybAilMn7v7N6Mxmuitmg==
"web3-react-core@npm:@web3-react/core@^6.0.9":
version "6.1.9"
resolved "https://registry.yarnpkg.com/@web3-react/core/-/core-6.1.9.tgz#5f5daa0545a8ea07770a699580ced552583afc97"
integrity sha512-P877DslsbAkWIlMANpWiK7pCvNwlz0kJC0EGckuVh0wlA23J4UnFxq6xyOaxkxaDCu14rA/tAO0NbwjcXTQgSA==
dependencies:
"@ethersproject/keccak256" "^5.0.0-beta.130"
"@web3-react/abstract-connector" "^6.0.7"
"@web3-react/types" "^6.0.7"
tiny-invariant "^1.0.6"
tiny-warning "^1.0.3"
"web3-react-fortmatic-connector@npm:@web3-react/fortmatic-connector@^6.0.9":
version "6.1.6"
resolved "https://registry.yarnpkg.com/@web3-react/fortmatic-connector/-/fortmatic-connector-6.1.6.tgz#99836c4ff4428432e34ed859b55c5842b02726a5"
integrity sha512-AKiEVvKlZPpRj5pADXyucl2FBt3ymf7PSsRhraHeI8hJCfCEACQ2+bq7okvJq9sNqaeUKukzwUYJmgBYn0qkYQ==
dependencies:
"@web3-react/abstract-connector" "^6.0.7"
"@web3-react/types" "^6.0.7"
fortmatic "^1.0.0"
tiny-invariant "^1.0.6"
"web3-react-injected-connector@npm:@web3-react/injected-connector@^6.0.7":
version "6.0.7"
resolved "https://registry.yarnpkg.com/@web3-react/injected-connector/-/injected-connector-6.0.7.tgz#1e0be23f51fa07fe6547fe986768a46b74c3a426"
integrity sha512-Y7aJSz6pg+MWKtvdyuqyy6LWuH+4Tqtph1LWfiyVms9II9ar/9B/de4R8wh4wjg91wmHkU+D75yP09E/Soh2RA==
dependencies:
"@web3-react/abstract-connector" "^6.0.7"
"@web3-react/types" "^6.0.7"
tiny-warning "^1.0.3"
"web3-react-walletconnect-connector@npm:@web3-react/walletconnect-connector@^7.0.2-alpha.0":
version "7.0.2-alpha.0"
resolved "https://registry.yarnpkg.com/@web3-react/walletconnect-connector/-/walletconnect-connector-7.0.2-alpha.0.tgz#dacd59db626b42137a1e4f34ea23ef1f04cc8b99"
integrity sha512-Qr+AecDt5/gbAb8sFfW5kbMo0nberCAU/6AB9KmmwCm2YGEEqJrj8fW3Kin7SGxv8pgDxgXwPYsW7qMUzayXEQ==
dependencies:
"@walletconnect/ethereum-provider" "^1.5.4"
"@web3-react/abstract-connector" "^6.0.7"
"@web3-react/types" "^6.0.7"
tiny-invariant "^1.0.6"
"web3-react-walletlink-connector@npm:@web3-react/walletlink-connector@^6.2.13":
version "6.2.13"
resolved "https://registry.yarnpkg.com/@web3-react/walletlink-connector/-/walletlink-connector-6.2.13.tgz#7de4c0a02a8372fed9282ee56a0abeb76b8e811d"
integrity sha512-rMjppw8167pNKphOYQcodIvuUgv3z/N1vLbGqmy1P70alhn4ZXCr/Ft7TR8zT6LUtkrqCSbWXbUt/lZSssE+xA==
dependencies:
"@web3-react/abstract-connector" "^6.0.7"
"@web3-react/types" "^6.0.7"
walletlink "^2.5.0"
webidl-conversions@^3.0.0: webidl-conversions@^3.0.0:
version "3.0.1" version "3.0.1"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
...@@ -18700,6 +19244,18 @@ which-module@^2.0.0: ...@@ -18700,6 +19244,18 @@ which-module@^2.0.0:
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
which-typed-array@^1.1.2:
version "1.1.8"
resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.8.tgz#0cfd53401a6f334d90ed1125754a42ed663eb01f"
integrity sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==
dependencies:
available-typed-arrays "^1.0.5"
call-bind "^1.0.2"
es-abstract "^1.20.0"
for-each "^0.3.3"
has-tostringtag "^1.0.0"
is-typed-array "^1.1.9"
which@^1.2.9, which@^1.3.1: which@^1.2.9, which@^1.3.1:
version "1.3.1" version "1.3.1"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
...@@ -18714,11 +19270,6 @@ which@^2.0.1, which@^2.0.2: ...@@ -18714,11 +19270,6 @@ which@^2.0.1, which@^2.0.2:
dependencies: dependencies:
isexe "^2.0.0" isexe "^2.0.0"
wicg-inert@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/wicg-inert/-/wicg-inert-3.1.1.tgz#b033fd4fbfb9e3fd709e5d84becbdf2e06e5c229"
integrity sha512-PhBaNh8ur9Xm4Ggy4umelwNIP6pPP1bv3EaWaKqfb/QNme2rdLjm7wIInvV4WhxVHhzA4Spgw9qNSqWtB/ca2A==
widest-line@^2.0.0: widest-line@^2.0.0:
version "2.0.1" version "2.0.1"
resolved "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz" resolved "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz"
...@@ -19191,9 +19742,9 @@ yocto-queue@^0.1.0: ...@@ -19191,9 +19742,9 @@ yocto-queue@^0.1.0:
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
zustand@^4.0.0-beta.3: zustand@^4.0.0-rc.0:
version "4.0.0-beta.3" version "4.0.0-rc.1"
resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.0.0-beta.3.tgz#16dc82b48b65ed61fe2bae5dea4501f49bd450c7" resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.0.0-rc.1.tgz#ec30a3afc03728adec7e1bd7bcc3592176372201"
integrity sha512-cVDcspaK0CXgVmGcXB/oenhT7EFaKqD46pTmg30ciMsOoQN0ZuxEuHzpNIy9ejah0gzBL8aqHN89IMT2uFNOaA== integrity sha512-qgcs7zLqBdHu0PuT3GW4WCIY5SgXdsv30GQMu9Qpp1BA2aS+sNS8l4x0hWuyEhjXkN+701aGWawhKDv6oWJAcw==
dependencies: dependencies:
use-sync-external-store "1.0.0" use-sync-external-store "1.1.0"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment