diff --git a/package.json b/package.json index 41b3b100a6..ad5dc725c3 100644 --- a/package.json +++ b/package.json @@ -61,9 +61,8 @@ "@graphql-codegen/typescript-operations": "^1.18.2", "@graphql-codegen/typescript-rtk-query": "^1.1.1", "@lingui/cli": "^3.9.0", - "@testing-library/jest-dom": "^5.14.1", - "@testing-library/react": "^12.0.0", - "@testing-library/react-hooks": "^7.0.2", + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/react": "^13.1", "@typechain/ethers-v5": "^7.0.0", "@types/array.prototype.flat": "^1.2.1", "@types/array.prototype.flatmap": "^1.2.2", @@ -76,10 +75,10 @@ "@types/multicodec": "^1.0.0", "@types/node": "^13.13.5", "@types/qs": "^6.9.2", - "@types/react": "^17.0.2", - "@types/react-dom": "^17.0.1", - "@types/react-redux": "^7.1.16", - "@types/react-router-dom": "^5.0.0", + "@types/react": "^18.0.15", + "@types/react-dom": "^18.0.6", + "@types/react-redux": "^7.1.24", + "@types/react-router-dom": "^5.3.3", "@types/react-virtualized-auto-sizer": "^1.0.0", "@types/react-window": "^1.8.2", "@types/rebass": "^4.0.7", @@ -110,9 +109,9 @@ "@coinbase/wallet-sdk": "^3.3.0", "@fontsource/ibm-plex-mono": "^4.5.1", "@fontsource/inter": "^4.5.1", - "@lingui/core": "^3.9.0", - "@lingui/macro": "^3.9.0", - "@lingui/react": "^3.9.0", + "@lingui/core": "^3.14.0", + "@lingui/macro": "^3.14.0", + "@lingui/react": "^3.14.0", "@metamask/jazzicon": "^2.0.0", "@popperjs/core": "^2.4.4", "@reach/dialog": "^0.10.3", @@ -169,15 +168,15 @@ "popper-max-size-modifier": "^0.2.0", "prettier": "^2.2.1", "qs": "^6.9.4", - "react": "^17.0.1", + "react": "^18.2.0", "react-confetti": "^6.0.0", - "react-dom": "^17.0.1", + "react-dom": "^18.2.0", "react-feather": "^2.0.8", "react-ga4": "^1.4.1", "react-is": "^17.0.2", "react-markdown": "^4.3.1", "react-popper": "^2.2.3", - "react-redux": "^7.2.2", + "react-redux": "^8.0.2", "react-router-dom": "^5.0.0", "react-spring": "^8.0.27", "react-use-gesture": "^6.0.14", diff --git a/src/components/AccountDetails/index.tsx b/src/components/AccountDetails/index.tsx index 565f1e75e6..8f85236ac5 100644 --- a/src/components/AccountDetails/index.tsx +++ b/src/components/AccountDetails/index.tsx @@ -2,10 +2,11 @@ import { Trans } from '@lingui/macro' import { useWeb3React } from '@web3-react/core' import CopyHelper from 'components/AccountDetails/Copy' import { getConnection, getConnectionName, getIsCoinbaseWallet, getIsMetaMask } from 'connection/utils' -import { useCallback, useContext } from 'react' +import { Context, useCallback, useContext } from 'react' import { ExternalLink as LinkIcon } from 'react-feather' import { useAppDispatch } from 'state/hooks' import { updateSelectedWallet } from 'state/user/reducer' +import { DefaultTheme } from 'styled-components/macro' import styled, { ThemeContext } from 'styled-components/macro' import { isMobile } from 'utils/userAgent' @@ -205,7 +206,7 @@ export default function AccountDetails({ const { chainId, account, connector } = useWeb3React() const connectionType = getConnection(connector).type - const theme = useContext(ThemeContext) + const theme = useContext(ThemeContext as Context) const dispatch = useAppDispatch() const isMetaMask = getIsMetaMask() diff --git a/src/components/AddressInputPanel/index.tsx b/src/components/AddressInputPanel/index.tsx index b04628e3a9..345f5474cf 100644 --- a/src/components/AddressInputPanel/index.tsx +++ b/src/components/AddressInputPanel/index.tsx @@ -2,8 +2,8 @@ import { Trans } from '@lingui/macro' // eslint-disable-next-line no-restricted-imports import { t } from '@lingui/macro' import { useWeb3React } from '@web3-react/core' -import { ReactNode, useCallback, useContext } from 'react' -import styled, { ThemeContext } from 'styled-components/macro' +import { ChangeEvent, Context, ReactNode, useCallback, useContext } from 'react' +import styled, { DefaultTheme, ThemeContext } from 'styled-components/macro' import useENS from '../../hooks/useENS' import { ExternalLink, ThemedText } from '../../theme' @@ -87,12 +87,12 @@ export default function AddressInputPanel({ onChange: (value: string) => void }) { const { chainId } = useWeb3React() - const theme = useContext(ThemeContext) + const theme = useContext(ThemeContext as Context) const { address, loading, name } = useENS(value) const handleInput = useCallback( - (event) => { + (event: ChangeEvent) => { const input = event.target.value const withoutSpaces = input.replace(/\s+/g, '') onChange(withoutSpaces) diff --git a/src/components/ErrorBoundary/index.tsx b/src/components/ErrorBoundary/index.tsx index 8f56affd6d..c1fbfdd745 100644 --- a/src/components/ErrorBoundary/index.tsx +++ b/src/components/ErrorBoundary/index.tsx @@ -1,6 +1,6 @@ import { Trans } from '@lingui/macro' import { sendEvent } from 'components/analytics' -import React, { ErrorInfo } from 'react' +import React, { ErrorInfo, PropsWithChildren } from 'react' import styled from 'styled-components/macro' import store, { AppState } from '../../state' @@ -56,8 +56,8 @@ async function updateServiceWorker(): Promise { return ready.update() as unknown as Promise } -export default class ErrorBoundary extends React.Component { - constructor(props: unknown) { +export default class ErrorBoundary extends React.Component, ErrorBoundaryState> { + constructor(props: PropsWithChildren) { super(props) this.state = { error: null } } diff --git a/src/components/LiquidityChartRangeInput/index.tsx b/src/components/LiquidityChartRangeInput/index.tsx index a377d93c1f..df4b77cfa8 100644 --- a/src/components/LiquidityChartRangeInput/index.tsx +++ b/src/components/LiquidityChartRangeInput/index.tsx @@ -103,7 +103,7 @@ export default function LiquidityChartRangeInput({ }) const onBrushDomainChangeEnded = useCallback( - (domain, mode) => { + (domain: [number, number], mode: string | undefined) => { let leftRangeValue = Number(domain[0]) const rightRangeValue = Number(domain[1]) diff --git a/src/components/Menu/index.tsx b/src/components/Menu/index.tsx index d17092a93c..b6247077b4 100644 --- a/src/components/Menu/index.tsx +++ b/src/components/Menu/index.tsx @@ -6,7 +6,7 @@ import { L2_CHAIN_IDS } from 'constants/chains' import { LOCALE_LABEL, SUPPORTED_LOCALES, SupportedLocale } from 'constants/locales' import { useActiveLocale } from 'hooks/useActiveLocale' import { useLocationLinkProps } from 'hooks/useLocationLinkProps' -import React, { useEffect, useRef, useState } from 'react' +import { FunctionComponent, PropsWithChildren, useEffect, useRef, useState } from 'react' import { BookOpen, Check, @@ -311,7 +311,7 @@ export default function Menu() { interface NewMenuProps { flyoutAlignment?: FlyoutAlignment - ToggleUI?: React.FunctionComponent + ToggleUI?: FunctionComponent> menuItems: { content: any link: string diff --git a/src/components/RoutingDiagram/RoutingDiagram.test.tsx b/src/components/RoutingDiagram/RoutingDiagram.test.tsx index 5f6e9338e9..f0f0960c8c 100644 --- a/src/components/RoutingDiagram/RoutingDiagram.test.tsx +++ b/src/components/RoutingDiagram/RoutingDiagram.test.tsx @@ -1,10 +1,11 @@ import { Protocol } from '@uniswap/router-sdk' import { Currency, Percent } from '@uniswap/sdk-core' import { FeeAmount } from '@uniswap/v3-sdk' +import { RoutingDiagramEntry } from 'components/swap/SwapRoute' import { DAI, USDC_MAINNET, WBTC } from 'constants/tokens' import { render } from 'test-utils' -import RoutingDiagram, { RoutingDiagramEntry } from './RoutingDiagram' +import RoutingDiagram from './RoutingDiagram' const percent = (strings: TemplateStringsArray) => new Percent(parseInt(strings[0]), 100) diff --git a/src/components/SearchModal/CurrencyList/index.tsx b/src/components/SearchModal/CurrencyList/index.tsx index 7fb9ea0d37..7069493f4f 100644 --- a/src/components/SearchModal/CurrencyList/index.tsx +++ b/src/components/SearchModal/CurrencyList/index.tsx @@ -197,6 +197,12 @@ function BreakLineComponent({ style }: { style: CSSProperties }) { ) } +interface TokenRowProps { + data: Array + index: number + style: CSSProperties +} + const formatAnalyticsEventProperties = ( token: Token, index: number, @@ -253,7 +259,7 @@ export default function CurrencyList({ }, [currencies, otherListTokens]) const Row = useCallback( - function TokenRow({ data, index, style }) { + function TokenRow({ data, index, style }: TokenRowProps) { const row: Currency | BreakLine = data[index] if (isBreakLine(row)) { diff --git a/src/components/SearchModal/CurrencySearch.tsx b/src/components/SearchModal/CurrencySearch.tsx index f3957a00af..0103a2b67a 100644 --- a/src/components/SearchModal/CurrencySearch.tsx +++ b/src/components/SearchModal/CurrencySearch.tsx @@ -12,7 +12,7 @@ import useToggle from 'hooks/useToggle' import useNativeCurrency from 'lib/hooks/useNativeCurrency' import { getTokenFilter } from 'lib/hooks/useTokenList/filtering' import { tokenComparator, useSortTokensByQuery } from 'lib/hooks/useTokenList/sorting' -import { KeyboardEvent, RefObject, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { ChangeEvent, KeyboardEvent, RefObject, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { Edit } from 'react-feather' import AutoSizer from 'react-virtualized-auto-sizer' import { FixedSizeList } from 'react-window' @@ -146,7 +146,7 @@ export function CurrencySearch({ // manage focus on modal show const inputRef = useRef() - const handleInput = useCallback((event) => { + const handleInput = useCallback((event: ChangeEvent) => { const input = event.target.value const checksummedInput = isAddress(input) setSearchQuery(checksummedInput || input) diff --git a/src/components/SearchModal/ManageLists.tsx b/src/components/SearchModal/ManageLists.tsx index b28b52372b..0978bbdcfd 100644 --- a/src/components/SearchModal/ManageLists.tsx +++ b/src/components/SearchModal/ManageLists.tsx @@ -8,7 +8,7 @@ import { UNSUPPORTED_LIST_URLS } from 'constants/lists' import { useListColor } from 'hooks/useColor' import parseENSAddress from 'lib/utils/parseENSAddress' import uriToHttp from 'lib/utils/uriToHttp' -import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { ChangeEvent, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { CheckCircle, Settings } from 'react-feather' import { usePopper } from 'react-popper' import { useAppDispatch, useAppSelector } from 'state/hooks' @@ -266,7 +266,7 @@ export function ManageLists({ // sort by active but only if not visible const activeListUrls = useActiveListUrls() - const handleInput = useCallback((e) => { + const handleInput = useCallback((e: ChangeEvent) => { setListUrlInput(e.target.value) }, []) diff --git a/src/components/SearchModal/ManageTokens.tsx b/src/components/SearchModal/ManageTokens.tsx index bc53dfc9ec..6d0821b476 100644 --- a/src/components/SearchModal/ManageTokens.tsx +++ b/src/components/SearchModal/ManageTokens.tsx @@ -6,7 +6,7 @@ import Column from 'components/Column' import CurrencyLogo from 'components/CurrencyLogo' import Row, { RowBetween, RowFixed } from 'components/Row' import { useToken } from 'hooks/Tokens' -import { RefObject, useCallback, useMemo, useRef, useState } from 'react' +import { ChangeEvent, RefObject, useCallback, useMemo, useRef, useState } from 'react' import { useRemoveUserAddedToken, useUserAddedTokens } from 'state/user/hooks' import styled from 'styled-components/macro' import { ButtonText, ExternalLink, ExternalLinkIcon, ThemedText, TrashIcon } from 'theme' @@ -51,7 +51,7 @@ export default function ManageTokens({ // manage focus on modal show const inputRef = useRef() - const handleInput = useCallback((event) => { + const handleInput = useCallback((event: ChangeEvent) => { const input = event.target.value const checksummedInput = isAddress(input) setSearchQuery(checksummedInput || input) diff --git a/src/components/Slider/index.tsx b/src/components/Slider/index.tsx index 9a51b481c4..e865d26aee 100644 --- a/src/components/Slider/index.tsx +++ b/src/components/Slider/index.tsx @@ -1,4 +1,4 @@ -import { useCallback } from 'react' +import { ChangeEvent, useCallback } from 'react' import styled from 'styled-components/macro' const StyledRangeInput = styled.input<{ size: number }>` @@ -106,7 +106,7 @@ export default function Slider({ ...rest }: InputSliderProps) { const changeCallback = useCallback( - (e) => { + (e: ChangeEvent) => { onChange(parseInt(e.target.value)) }, [onChange] diff --git a/src/components/TextInput/index.tsx b/src/components/TextInput/index.tsx index 21993b504a..8182509626 100644 --- a/src/components/TextInput/index.tsx +++ b/src/components/TextInput/index.tsx @@ -1,4 +1,4 @@ -import React, { memo, useCallback, useRef } from 'react' +import React, { ChangeEvent, memo, useCallback, useRef } from 'react' import styled from 'styled-components/macro' const Input = styled.input<{ error?: boolean; fontSize?: string }>` @@ -77,7 +77,7 @@ export const TextInput = ({ fontSize: string }) => { const handleInput = useCallback( - (event) => { + (event: ChangeEvent) => { onUserInput(event.target.value) }, [onUserInput] @@ -117,7 +117,7 @@ export const ResizingTextArea = memo( const inputRef = useRef(document.createElement('textarea')) const handleInput = useCallback( - (event) => { + (event: ChangeEvent) => { inputRef.current.style.height = 'auto' inputRef.current.style.height = inputRef.current.scrollHeight + 'px' onUserInput(event.target.value) diff --git a/src/hooks/useBestTrade.test.ts b/src/hooks/useBestTrade.test.ts index 0cf1759131..33332648a9 100644 --- a/src/hooks/useBestTrade.test.ts +++ b/src/hooks/useBestTrade.test.ts @@ -1,4 +1,4 @@ -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { CurrencyAmount, TradeType } from '@uniswap/sdk-core' import { DAI, USDC_MAINNET } from 'constants/tokens' import { TradeState } from 'state/routing/types' @@ -45,7 +45,7 @@ beforeEach(() => { }) describe('#useBestV3Trade ExactIn', () => { - it('does not compute routing api trade when routing API is not supported', () => { + it('does not compute routing api trade when routing API is not supported', async () => { mockUseAutoRouterSupported.mockReturnValue(false) expectRouterMock(TradeState.INVALID) expectClientSideMock(TradeState.VALID) @@ -57,7 +57,7 @@ describe('#useBestV3Trade ExactIn', () => { expect(result.current).toEqual({ state: TradeState.VALID, trade: undefined }) }) - it('does not compute routing api trade when window is not focused', () => { + it('does not compute routing api trade when window is not focused', async () => { mockUseIsWindowVisible.mockReturnValue(false) expectRouterMock(TradeState.NO_ROUTE_FOUND) expectClientSideMock(TradeState.VALID) diff --git a/src/hooks/useCopyClipboard.ts b/src/hooks/useCopyClipboard.ts index 2317753f7e..4c93a2042e 100644 --- a/src/hooks/useCopyClipboard.ts +++ b/src/hooks/useCopyClipboard.ts @@ -4,7 +4,7 @@ import { useCallback, useEffect, useState } from 'react' export default function useCopyClipboard(timeout = 500): [boolean, (toCopy: string) => void] { const [isCopied, setIsCopied] = useState(false) - const staticCopy = useCallback((text) => { + const staticCopy = useCallback((text: string) => { const didCopy = copy(text) setIsCopied(didCopy) }, []) diff --git a/src/index.tsx b/src/index.tsx index 14d95c20ee..ac949ee804 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -6,7 +6,7 @@ import 'components/analytics' import { BlockNumberProvider } from 'lib/hooks/useBlockNumber' import { MulticallUpdater } from 'lib/state/multicall' import { StrictMode } from 'react' -import ReactDOM from 'react-dom' +import { createRoot } from 'react-dom/client' import { Provider } from 'react-redux' import { HashRouter } from 'react-router-dom' @@ -42,7 +42,9 @@ function Updaters() { ) } -ReactDOM.render( +const container = document.getElementById('root') as HTMLElement + +createRoot(container).render( @@ -61,8 +63,7 @@ ReactDOM.render( - , - document.getElementById('root') + ) if (process.env.REACT_APP_SERVICE_WORKER !== 'false') { diff --git a/src/pages/Swap/index.tsx b/src/pages/Swap/index.tsx index c95ea1e528..50ff2ce74f 100644 --- a/src/pages/Swap/index.tsx +++ b/src/pages/Swap/index.tsx @@ -14,12 +14,12 @@ import { MouseoverTooltip } from 'components/Tooltip' import { useSwapCallback } from 'hooks/useSwapCallback' import useTransactionDeadline from 'hooks/useTransactionDeadline' import JSBI from 'jsbi' -import { useCallback, useContext, useEffect, useMemo, useState } from 'react' +import { Context, useCallback, useContext, useEffect, useMemo, useState } from 'react' import { ArrowDown, CheckCircle, HelpCircle } from 'react-feather' import { RouteComponentProps } from 'react-router-dom' import { Text } from 'rebass' import { TradeState } from 'state/routing/types' -import styled, { ThemeContext } from 'styled-components/macro' +import styled, { DefaultTheme, ThemeContext } from 'styled-components/macro' import AddressInputPanel from '../../components/AddressInputPanel' import { ButtonConfirmed, ButtonError, ButtonLight, ButtonPrimary } from '../../components/Button' @@ -104,7 +104,7 @@ export default function Swap({ history }: RouteComponentProps) { [chainId, defaultTokens, urlLoadedTokens] ) - const theme = useContext(ThemeContext) + const theme = useContext(ThemeContext as Context) // toggle wallet when disconnected const toggleWalletModal = useToggleWalletModal() @@ -149,6 +149,7 @@ export default function Swap({ history }: RouteComponentProps) { () => [!trade?.swaps, TradeState.LOADING === tradeState, TradeState.SYNCING === tradeState], [trade, tradeState] ) + // show price estimates based on wrap trade const inputValue = showWrap ? parsedAmount : trade?.inputAmount const outputValue = showWrap ? parsedAmount : trade?.outputAmount @@ -373,7 +374,7 @@ export default function Swap({ history }: RouteComponentProps) { }, [attemptingTxn, showConfirm, swapErrorMessage, trade, txHash]) const handleInputSelect = useCallback( - (inputCurrency) => { + (inputCurrency: Currency) => { setApprovalSubmitted(false) // reset 2 step UI for approvals onCurrencySelection(Field.INPUT, inputCurrency) }, @@ -389,7 +390,7 @@ export default function Swap({ history }: RouteComponentProps) { }, [maxInputAmount, onUserInput]) const handleOutputSelect = useCallback( - (outputCurrency) => onCurrencySelection(Field.OUTPUT, outputCurrency), + (outputCurrency: Currency) => onCurrencySelection(Field.OUTPUT, outputCurrency), [onCurrencySelection] ) diff --git a/src/state/transactions/types.ts b/src/state/transactions/types.ts index 9a649b0e42..16cbc83d73 100644 --- a/src/state/transactions/types.ts +++ b/src/state/transactions/types.ts @@ -2,7 +2,7 @@ import { TradeType } from '@uniswap/sdk-core' import { VoteOption } from '../governance/types' -interface SerializableTransactionReceipt { +export interface SerializableTransactionReceipt { to: string from: string contractAddress: string diff --git a/src/state/transactions/updater.tsx b/src/state/transactions/updater.tsx index dbca6e0336..392f1f62ba 100644 --- a/src/state/transactions/updater.tsx +++ b/src/state/transactions/updater.tsx @@ -7,6 +7,7 @@ import { useAppDispatch, useAppSelector } from 'state/hooks' import { L2_CHAIN_IDS } from '../../constants/chains' import { useAddPopup } from '../application/hooks' import { checkedTransaction, finalizeTransaction } from './reducer' +import { SerializableTransactionReceipt } from './types' export default function Updater() { const { chainId } = useWeb3React() @@ -16,11 +17,12 @@ export default function Updater() { const dispatch = useAppDispatch() const onCheck = useCallback( - ({ chainId, hash, blockNumber }) => dispatch(checkedTransaction({ chainId, hash, blockNumber })), + ({ chainId, hash, blockNumber }: { chainId: number; hash: string; blockNumber: number }) => + dispatch(checkedTransaction({ chainId, hash, blockNumber })), [dispatch] ) const onReceipt = useCallback( - ({ chainId, hash, receipt }) => { + ({ chainId, hash, receipt }: { chainId: number; hash: string; receipt: SerializableTransactionReceipt }) => { dispatch( finalizeTransaction({ chainId, diff --git a/yarn.lock b/yarn.lock index f1b74c571a..d16c5b6a0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2820,10 +2820,10 @@ pseudolocale "^1.1.0" ramda "^0.27.1" -"@lingui/conf@^3.9.0": - version "3.9.0" - resolved "https://registry.npmjs.org/@lingui/conf/-/conf-3.9.0.tgz" - integrity sha512-dsn0nxsNdmGIVVGJZ/K+dg4SqnF+gAYJhcx5y35wG/wrmmRdWLkWczVPmZ8W7JVLB/9PgRqPJL4MomaqPBUDzg== +"@lingui/conf@^3.14.0", "@lingui/conf@^3.9.0": + version "3.14.0" + resolved "https://registry.yarnpkg.com/@lingui/conf/-/conf-3.14.0.tgz#1b2c20d556b6ea78e530a07a934be219a0d6c662" + integrity sha512-5GMAbIRad9FavqYsfZCRAwjcOLzE7tONDJe9lSYE5SSJbbG01RI5kR5P0B84DUhTI6cGXau+1dAcP9K+JbEx+g== dependencies: "@babel/runtime" "^7.11.2" "@endemolshinegroup/cosmiconfig-typescript-loader" "^3.0.2" @@ -2832,31 +2832,31 @@ jest-validate "^26.5.2" lodash.get "^4.4.2" -"@lingui/core@^3.9.0": - version "3.9.0" - resolved "https://registry.npmjs.org/@lingui/core/-/core-3.9.0.tgz" - integrity sha512-tbOBqou4fPzHB5aivir1fuikFoMYFcvpWk68Pysg34KN0xagPtyj0Dnz3clmq6Vnuf4SaK4LJdXwNUPWXpah7A== +"@lingui/core@^3.14.0": + version "3.14.0" + resolved "https://registry.yarnpkg.com/@lingui/core/-/core-3.14.0.tgz#62e6b5e3d17b3f2ecd84b3f821d591763055aa89" + integrity sha512-ertREq9oi9B/umxpd/pInm9uFO8FLK2/0FXfDmMqvH5ydswWn/c9nY5YO4W1h4/8LWO45mewypOIyjoue4De1w== dependencies: "@babel/runtime" "^7.11.2" make-plural "^6.2.2" messageformat-parser "^4.1.3" -"@lingui/macro@^3.9.0": - version "3.9.0" - resolved "https://registry.npmjs.org/@lingui/macro/-/macro-3.9.0.tgz" - integrity sha512-3KwlBpeuEsXWnwoFxk3Pj8tFy8ERUxktlXLnjo6NqTEXP4iA98Hl+frwpY9/xCw2VWy+mpXWInpa7wHkcsMr/w== +"@lingui/macro@^3.14.0": + version "3.14.0" + resolved "https://registry.yarnpkg.com/@lingui/macro/-/macro-3.14.0.tgz#4d97cd548967c2b4b2b2f92715eec4d69e84545c" + integrity sha512-NxTRrhrZ/cUO9PX/4vWys90Ku58+ExxHuE30IuDnnDldWhWlOdycmjDt9tB+yIiUdFym/veSxBs+h114FzG5mA== dependencies: "@babel/runtime" "^7.11.2" - "@lingui/conf" "^3.9.0" + "@lingui/conf" "^3.14.0" ramda "^0.27.1" -"@lingui/react@^3.9.0": - version "3.9.0" - resolved "https://registry.npmjs.org/@lingui/react/-/react-3.9.0.tgz" - integrity sha512-VG+sQyttrIouhBq0h6aTtzxKO3kKWRjJPiBnaFs3gVNcmodIpzdTA9YqbFusu3+Q/+w6LYP9HuSv5eMM5jQ5Cw== +"@lingui/react@^3.14.0": + version "3.14.0" + resolved "https://registry.yarnpkg.com/@lingui/react/-/react-3.14.0.tgz#e3e6732a9d172c8ecb4f82fb8558b1766f5cee31" + integrity sha512-ow9Mtru7f0T2S9AwnPWRejppcucCW0LmoDR3P4wqHjL+eH5f8a6nxd2doxGieC91/2i4qqW88y4K/zXJxwRSQw== dependencies: "@babel/runtime" "^7.11.2" - "@lingui/core" "^3.9.0" + "@lingui/core" "^3.14.0" "@metamask/detect-provider@^1.2.0": version "1.2.0" @@ -3356,28 +3356,28 @@ lz-string "^1.4.4" pretty-format "^26.6.2" -"@testing-library/dom@^8.0.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.1.0.tgz#f8358b1883844ea569ba76b7e94582168df5370d" - integrity sha512-kmW9alndr19qd6DABzQ978zKQ+J65gU2Rzkl8hriIetPnwpesRaK4//jEQyYh8fEALmGhomD/LBQqt+o+DL95Q== +"@testing-library/dom@^8.5.0": + version "8.16.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.16.0.tgz#d6fc50250aed17b1035ca1bd64655e342db3936a" + integrity sha512-uxF4zmnLHHDlmW4l+0WDjcgLVwCvH+OVLpD8Dfp+Bjfz85prwxWGbwXgJdLtkgjD0qfOzkJF9SmA6YZPsMYX4w== dependencies: "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.12.5" "@types/aria-query" "^4.2.0" - aria-query "^4.2.2" + aria-query "^5.0.0" chalk "^4.1.0" - dom-accessibility-api "^0.5.6" + dom-accessibility-api "^0.5.9" lz-string "^1.4.4" pretty-format "^27.0.2" -"@testing-library/jest-dom@^5.14.1": - version "5.14.1" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.14.1.tgz#8501e16f1e55a55d675fe73eecee32cdaddb9766" - integrity sha512-dfB7HVIgTNCxH22M1+KU6viG5of2ldoA5ly8Ar8xkezKHKXjRvznCdbMbqjYGgO2xjRbwnR+rR8MLUIqF3kKbQ== +"@testing-library/jest-dom@^5.16.4": + version "5.16.4" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.4.tgz#938302d7b8b483963a3ae821f1c0808f872245cd" + integrity sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA== dependencies: "@babel/runtime" "^7.9.2" "@types/testing-library__jest-dom" "^5.9.1" - aria-query "^4.2.2" + aria-query "^5.0.0" chalk "^3.0.0" css "^3.0.0" css.escape "^1.5.1" @@ -3385,24 +3385,14 @@ lodash "^4.17.15" redent "^3.0.0" -"@testing-library/react-hooks@^7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@testing-library/react-hooks/-/react-hooks-7.0.2.tgz#3388d07f562d91e7f2431a4a21b5186062ecfee0" - integrity sha512-dYxpz8u9m4q1TuzfcUApqi8iFfR6R0FaMbr2hjZJy1uC8z+bO/K4v8Gs9eogGKYQop7QsrBTFkv/BCF7MzD2Cg== +"@testing-library/react@^13.1": + version "13.3.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.3.0.tgz#bf298bfbc5589326bbcc8052b211f3bb097a97c5" + integrity sha512-DB79aA426+deFgGSjnf5grczDPiL4taK3hFaa+M5q7q20Kcve9eQottOG5kZ74KEr55v0tU2CQormSSDK87zYQ== dependencies: "@babel/runtime" "^7.12.5" - "@types/react" ">=16.9.0" - "@types/react-dom" ">=16.9.0" - "@types/react-test-renderer" ">=16.9.0" - react-error-boundary "^3.1.0" - -"@testing-library/react@^12.0.0": - version "12.0.0" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.0.0.tgz#9aeb2264521522ab9b68f519eaf15136148f164a" - integrity sha512-sh3jhFgEshFyJ/0IxGltRhwZv2kFKfJ3fN1vTZ6hhMXzz9ZbbcTgmDYM4e+zJv+oiVKKEWZPyqPAh4MQBI65gA== - dependencies: - "@babel/runtime" "^7.12.5" - "@testing-library/dom" "^8.0.0" + "@testing-library/dom" "^8.5.0" + "@types/react-dom" "^18.0.0" "@tootallnate/once@1": version "1.1.2" @@ -3738,12 +3728,12 @@ dependencies: "@types/node" "*" -"@types/history@*": - version "4.7.9" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.9.tgz#1cfb6d60ef3822c589f18e70f8b12f9a28ce8724" - integrity sha512-MUc6zSmU3tEVnkQ78q0peeEjKWPUADMlC/t++2bI8WnAG2tvYRPIgHG8lWkXwqc8MsUF6Z2MOf+Mh5sazOmhiQ== +"@types/history@*", "@types/history@^4.7.11": + version "4.7.11" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" + integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== -"@types/hoist-non-react-statics@*", "@types/hoist-non-react-statics@^3.3.0": +"@types/hoist-non-react-statics@*", "@types/hoist-non-react-statics@^3.3.0", "@types/hoist-non-react-statics@^3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== @@ -3920,29 +3910,29 @@ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== -"@types/react-dom@>=16.9.0", "@types/react-dom@^17.0.1": - version "17.0.9" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.9.tgz#441a981da9d7be117042e1a6fd3dac4b30f55add" - integrity sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg== +"@types/react-dom@^18.0.0", "@types/react-dom@^18.0.6": + version "18.0.6" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.6.tgz#36652900024842b74607a17786b6662dd1e103a1" + integrity sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA== dependencies: "@types/react" "*" -"@types/react-redux@^7.1.16": - version "7.1.18" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.18.tgz#2bf8fd56ebaae679a90ebffe48ff73717c438e04" - integrity sha512-9iwAsPyJ9DLTRH+OFeIrm9cAbIj1i2ANL3sKQFATqnPWRbg+jEFXyZOKHiQK/N86pNRXbb4HRxAxo0SIX1XwzQ== +"@types/react-redux@^7.1.24": + version "7.1.24" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.24.tgz#6caaff1603aba17b27d20f8ad073e4c077e975c0" + integrity sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ== dependencies: "@types/hoist-non-react-statics" "^3.3.0" "@types/react" "*" hoist-non-react-statics "^3.3.0" redux "^4.0.0" -"@types/react-router-dom@^5.0.0": - version "5.1.8" - resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.8.tgz#bf3e1c8149b3d62eaa206d58599de82df0241192" - integrity sha512-03xHyncBzG0PmDmf8pf3rehtjY0NpUj7TIN46FrT5n1ZWHPZvXz32gUyNboJ+xsL8cpg8bQVLcllptcQHvocrw== +"@types/react-router-dom@^5.3.3": + version "5.3.3" + resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" + integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== dependencies: - "@types/history" "*" + "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router" "*" @@ -3954,13 +3944,6 @@ "@types/history" "*" "@types/react" "*" -"@types/react-test-renderer@>=16.9.0": - version "17.0.1" - resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-17.0.1.tgz#3120f7d1c157fba9df0118dae20cb0297ee0e06b" - integrity sha512-3Fi2O6Zzq/f3QR9dRnlnHso9bMl7weKCviFmfF6B4LS1Uat6Hkm15k0ZAQuDz+UBq6B3+g+NM6IT2nr5QgPzCw== - dependencies: - "@types/react" "*" - "@types/react-virtualized-auto-sizer@^1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz#b3187dae1dfc4c15880c9cfc5b45f2719ea6ebd4" @@ -3975,10 +3958,10 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@>=16.9.0", "@types/react@^17.0.2": - version "17.0.20" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.20.tgz#a4284b184d47975c71658cd69e759b6bd37c3b8c" - integrity sha512-wWZrPlihslrPpcKyCSlmIlruakxr57/buQN1RjlIeaaTWDLtJkTtRW429MoQJergvVKc4IWBpRhWw7YNh/7GVA== +"@types/react@*", "@types/react@^18.0.15": + version "18.0.15" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.15.tgz#d355644c26832dc27f3e6cbf0c4f4603fc4ab7fe" + integrity sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -4098,6 +4081,11 @@ dependencies: source-map "^0.6.1" +"@types/use-sync-external-store@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" + integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== + "@types/warning@^3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz" @@ -5289,6 +5277,11 @@ aria-query@^4.2.2: "@babel/runtime" "^7.10.2" "@babel/runtime-corejs3" "^7.10.2" +aria-query@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.0.tgz#210c21aaf469613ee8c9a62c7f86525e058db52c" + integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg== + arity-n@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" @@ -8142,10 +8135,10 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-accessibility-api@^0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.6.tgz#3f5d43b52c7a3bd68b5fb63fa47b4e4c1fdf65a9" - integrity sha512-DplGLZd8L1lN64jlT27N9TVSESFR5STaEJvX+thCby7fuCHonfPpAlodYc3vuUYbDuDec5w8AMP7oCM5TWFsqw== +dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: + version "0.5.14" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz#56082f71b1dc7aac69d83c4285eef39c15d93f56" + integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg== dom-converter@^0.2.0: version "0.2.0" @@ -15014,21 +15007,13 @@ react-dev-utils@^11.0.3: strip-ansi "6.0.0" text-table "0.2.0" -react-dom@^17.0.1: - version "17.0.2" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-error-boundary@^3.1.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-3.1.3.tgz#276bfa05de8ac17b863587c9e0647522c25e2a0b" - integrity sha512-A+F9HHy9fvt9t8SNDlonq01prnU8AmkjvGKV4kk8seB9kU3xMEO8J/PQlLVmoOIDODl5U2kufSBs4vrWIqhsAA== - dependencies: - "@babel/runtime" "^7.12.5" + scheduler "^0.23.0" react-error-overlay@^6.0.9: version "6.0.9" @@ -15064,7 +15049,7 @@ react-ga4@^1.4.1: resolved "https://registry.yarnpkg.com/react-ga4/-/react-ga4-1.4.1.tgz#6ee2a2db115ed235b2f2092bc746b4eeeca9e206" integrity sha512-ioBMEIxd4ePw4YtaloTUgqhQGqz5ebDdC4slEpLgy2sLx1LuZBC9iYCwDymTXzcntw6K1dHX183ulP32nNdG7w== -react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6: +react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -15074,6 +15059,11 @@ react-is@^17.0.1, react-is@^17.0.2: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + react-markdown@^4.3.1: version "4.3.1" resolved "https://registry.npmjs.org/react-markdown/-/react-markdown-4.3.1.tgz" @@ -15096,17 +15086,17 @@ react-popper@^2.2.3: react-fast-compare "^3.0.1" warning "^4.0.2" -react-redux@^7.2.2: - version "7.2.4" - resolved "https://registry.npmjs.org/react-redux/-/react-redux-7.2.4.tgz" - integrity sha512-hOQ5eOSkEJEXdpIKbnRyl04LhaWabkDPV+Ix97wqQX3T3d2NQ8DUblNXXtNMavc7DpswyQM6xfaN4HQDKNY2JA== +react-redux@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.0.2.tgz#bc2a304bb21e79c6808e3e47c50fe1caf62f7aad" + integrity sha512-nBwiscMw3NoP59NFCXFf02f8xdo+vSHT/uZ1ldDwF7XaTpzm+Phk97VT4urYBl5TYAPNVaFm12UHAEyzkpNzRA== dependencies: "@babel/runtime" "^7.12.1" - "@types/react-redux" "^7.1.16" + "@types/hoist-non-react-statics" "^3.3.1" + "@types/use-sync-external-store" "^0.0.3" hoist-non-react-statics "^3.3.2" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-is "^16.13.1" + react-is "^18.0.0" + use-sync-external-store "^1.1.0" react-refresh@^0.8.3: version "0.8.3" @@ -15262,13 +15252,12 @@ react-window@^1.8.5: "@babel/runtime" "^7.0.0" memoize-one ">=3.1.1 <6" -react@^17.0.1: - version "17.0.2" - resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== +react@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" read-pkg-up@^3.0.0: version "3.0.0" @@ -15990,13 +15979,12 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" schema-utils@^1.0.0: version "1.0.0"