Commit 01684977 authored by Zach Pomerantz's avatar Zach Pomerantz Committed by GitHub

test: add a 'hardhat' mock window.ethereum (#6395)

parent 025a84de
import { getTestSelector } from '../utils' import { getTestSelector } from '../utils'
import { CONNECTED_WALLET_USER_STATE } from '../utils/user-state'
describe('Landing Page', () => { describe('Landing Page', () => {
it('shows landing page when no selectedWallet', () => { it('shows landing page when no user state exists', () => {
cy.visit('/', { noWallet: true }) cy.visit('/', { userState: {} })
cy.get(getTestSelector('landing-page')) cy.get(getTestSelector('landing-page'))
cy.screenshot() cy.screenshot()
}) })
it('redirects to swap page when selectedWallet is INJECTED', () => { it('redirects to swap page when a user has already connected a wallet', () => {
cy.visit('/', { selectedWallet: 'INJECTED' }) cy.visit('/', { userState: CONNECTED_WALLET_USER_STATE })
cy.get('#swap-page') cy.get('#swap-page')
cy.url().should('include', '/swap') cy.url().should('include', '/swap')
cy.screenshot() cy.screenshot()
}) })
it('shows landing page when selectedWallet is INJECTED and ?intro=true is in query', () => { it('shows landing page when a user has already connected a wallet but ?intro=true is in query', () => {
cy.visit('/?intro=true', { selectedWallet: 'INJECTED' }) cy.visit('/?intro=true', { userState: CONNECTED_WALLET_USER_STATE })
cy.get(getTestSelector('landing-page')) cy.get(getTestSelector('landing-page'))
}) })
......
import { USDC_MAINNET } from '../../src/constants/tokens'
import { WETH_GOERLI } from '../fixtures/constants' import { WETH_GOERLI } from '../fixtures/constants'
import { HardhatProvider } from '../support/hardhat'
import { getTestSelector } from '../utils' import { getTestSelector } from '../utils'
describe('Swap', () => { describe('Swap', () => {
let hardhat: HardhatProvider
const verifyAmount = (field: 'input' | 'output', amountText: string | null) => { const verifyAmount = (field: 'input' | 'output', amountText: string | null) => {
if (amountText === null) { if (amountText === null) {
cy.get(`#swap-currency-${field} .token-amount-input`).should('not.have.value') cy.get(`#swap-currency-${field} .token-amount-input`).should('not.have.value')
...@@ -43,7 +46,9 @@ describe('Swap', () => { ...@@ -43,7 +46,9 @@ describe('Swap', () => {
} }
before(() => { before(() => {
cy.visit('/swap') cy.visit('/swap', { ethereum: 'hardhat' }).then((window) => {
hardhat = window.hardhat
})
}) })
it('starts with ETH selected by default', () => { it('starts with ETH selected by default', () => {
...@@ -73,6 +78,33 @@ describe('Swap', () => { ...@@ -73,6 +78,33 @@ describe('Swap', () => {
cy.get('#swap-currency-output .token-amount-input').clear().type('0.0').should('have.value', '0.0') cy.get('#swap-currency-output .token-amount-input').clear().type('0.0').should('have.value', '0.0')
}) })
it('can swap ETH for USDC', () => {
const TOKEN_ADDRESS = USDC_MAINNET.address
const BALANCE_INCREMENT = 1
cy.then(() => hardhat.utils.getBalance(hardhat.wallet.address, USDC_MAINNET))
.then((balance) => Number(balance.toFixed(1)))
.then((initialBalance) => {
cy.get('#swap-currency-output .open-currency-select-button').click()
cy.get('[data-testid="token-search-input"]').clear().type(TOKEN_ADDRESS)
cy.contains('USDC').click()
cy.get('#swap-currency-output .token-amount-input').clear().type(BALANCE_INCREMENT.toString())
cy.get('#swap-currency-input .token-amount-input').should('not.equal', '')
cy.get('#swap-button').click()
cy.get('#confirm-swap-or-send').click()
cy.get('[data-testid="dismiss-tx-confirmation"]').click()
// ui check
cy.get('#swap-currency-output [data-testid="balance-text"]').should(
'have.text',
`Balance: ${initialBalance + BALANCE_INCREMENT}`
)
// chain state check
cy.then(() => hardhat.utils.getBalance(hardhat.wallet.address, USDC_MAINNET))
.then((balance) => Number(balance.toFixed(1)))
.should('eq', initialBalance + BALANCE_INCREMENT)
})
})
it('should have the correct default input/output and token selection should work', () => { it('should have the correct default input/output and token selection should work', () => {
cy.visit('/swap') cy.visit('/swap')
verifyToken('input', 'ETH') verifyToken('input', 'ETH')
......
...@@ -18,7 +18,7 @@ describe('Universal search bar', () => { ...@@ -18,7 +18,7 @@ describe('Universal search bar', () => {
.and('contain.text', 'UNI') .and('contain.text', 'UNI')
.and('contain.text', '$') .and('contain.text', '$')
.and('contain.text', '%') .and('contain.text', '%')
cy.get('[data-cy="searchbar-token-row-UNI"]').click() cy.get('[data-cy="searchbar-token-row-UNI"]').first().click()
cy.get('div').contains('Uniswap').should('exist') cy.get('div').contains('Uniswap').should('exist')
// Stats should have: TVL, 24H Volume, 52W low, 52W high. // Stats should have: TVL, 24H Volume, 52W low, 52W high.
......
...@@ -5,25 +5,43 @@ ...@@ -5,25 +5,43 @@
// https://on.cypress.io/configuration // https://on.cypress.io/configuration
// *********************************************************** // ***********************************************************
// Import commands.ts using ES2015 syntax:
import '@cypress/code-coverage/support' import '@cypress/code-coverage/support'
import { Eip1193Bridge } from '@ethersproject/experimental/lib/eip1193-bridge'
import assert from 'assert' import assert from 'assert'
import { Network } from 'cypress-hardhat/lib/browser'
import { FeatureFlag } from '../../src/featureFlags/flags/featureFlags' import { FeatureFlag } from '../../src/featureFlags/flags/featureFlags'
import { UserState } from '../../src/state/user/reducer'
import { CONNECTED_WALLET_USER_STATE } from '../utils/user-state'
import { injected } from './ethereum' import { injected } from './ethereum'
import { HardhatProvider } from './hardhat'
declare global { declare global {
// eslint-disable-next-line @typescript-eslint/no-namespace // eslint-disable-next-line @typescript-eslint/no-namespace
namespace Cypress { namespace Cypress {
interface ApplicationWindow { interface ApplicationWindow {
ethereum: typeof injected ethereum: Eip1193Bridge
hardhat: HardhatProvider
} }
interface VisitOptions { interface VisitOptions {
serviceWorker?: true serviceWorker?: true
featureFlags?: Array<FeatureFlag> featureFlags?: Array<FeatureFlag>
selectedWallet?: string /**
noWallet?: boolean * The mock ethereum provider to inject into the page.
* @default 'goerli'
*/
// TODO(INFRA-175): Migrate all usage of 'goerli' to 'hardhat'.
ethereum?: 'goerli' | 'hardhat'
/**
* Initial user state.
* @default {@type import('../utils/user-state').CONNECTED_WALLET_USER_STATE}
*/
userState?: Partial<UserState>
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
interface Chainable<Subject> {
task(event: 'hardhat'): Chainable<Network>
} }
} }
} }
...@@ -35,37 +53,46 @@ Cypress.Commands.overwrite( ...@@ -35,37 +53,46 @@ Cypress.Commands.overwrite(
(original, url: string | Partial<Cypress.VisitOptions>, options?: Partial<Cypress.VisitOptions>) => { (original, url: string | Partial<Cypress.VisitOptions>, options?: Partial<Cypress.VisitOptions>) => {
assert(typeof url === 'string') assert(typeof url === 'string')
cy.intercept('/service-worker.js', options?.serviceWorker ? undefined : { statusCode: 404 }).then(() => { // Add a hash in the URL if it is not present (to use hash-based routing correctly with queryParams).
let hashUrl = url.startsWith('/') && url.length > 2 && !url.startsWith('/#') ? `/#${url}` : url
if (options?.ethereum === 'goerli') hashUrl += `${url.includes('?') ? '&' : '?'}chain=goerli`
return cy
.intercept('/service-worker.js', options?.serviceWorker ? undefined : { statusCode: 404 })
.task('hardhat')
.then((network) =>
original({ original({
...options, ...options,
url: url: hashUrl,
(url.startsWith('/') && url.length > 2 && !url.startsWith('/#') ? `/#${url}` : url) +
`${url.includes('?') ? '&' : '?'}chain=goerli`,
onBeforeLoad(win) { onBeforeLoad(win) {
options?.onBeforeLoad?.(win) options?.onBeforeLoad?.(win)
// We want to test from a clean state, so we clear the local storage (which clears redux).
win.localStorage.clear() win.localStorage.clear()
const userState = { // Set initial user state.
selectedWallet: options?.noWallet !== true ? options?.selectedWallet || 'INJECTED' : undefined, win.localStorage.setItem(
fiatOnrampDismissed: true, 'redux_localstorage_simple_user', // storage key for the user reducer using 'redux-localstorage-simple'
} JSON.stringify(options?.userState ?? CONNECTED_WALLET_USER_STATE)
win.localStorage.setItem('redux_localstorage_simple_user', JSON.stringify(userState)) )
// Set feature flags, if configured.
if (options?.featureFlags) { if (options?.featureFlags) {
const featureFlags = options.featureFlags.reduce( const featureFlags = options.featureFlags.reduce((flags, flag) => ({ ...flags, [flag]: 'enabled' }), {})
(flags, flag) => ({
...flags,
[flag]: 'enabled',
}),
{}
)
win.localStorage.setItem('featureFlags', JSON.stringify(featureFlags)) win.localStorage.setItem('featureFlags', JSON.stringify(featureFlags))
} }
// Inject the mock ethereum provider.
if (options?.ethereum === 'hardhat') {
// The provider is exposed via hardhat to allow mocking / network manipulation.
win.hardhat = new HardhatProvider(network)
win.ethereum = win.hardhat
} else {
win.ethereum = injected win.ethereum = injected
}
}, },
}) })
}) )
} }
) )
...@@ -88,6 +115,10 @@ beforeEach(() => { ...@@ -88,6 +115,10 @@ beforeEach(() => {
res.headers['origin'] = 'https://app.uniswap.org' res.headers['origin'] = 'https://app.uniswap.org'
res.continue() res.continue()
}) })
cy.intercept('https://api.uniswap.org/v1/amplitude-proxy', (res) => {
res.reply(JSON.stringify({}))
})
}) })
Cypress.on('uncaught:exception', () => { Cypress.on('uncaught:exception', () => {
......
import { Eip1193Bridge } from '@ethersproject/experimental/lib/eip1193-bridge'
import { JsonRpcProvider } from '@ethersproject/providers'
import { Wallet } from '@ethersproject/wallet'
import { HardhatUtils, Network } from 'cypress-hardhat/lib/browser'
export class HardhatProvider extends Eip1193Bridge {
readonly utils: HardhatUtils
readonly chainId: string
readonly wallet: Wallet
isMetaMask = true
constructor(network: Network) {
const utils = new HardhatUtils(network)
const wallet = new Wallet(utils.account.privateKey, utils.provider)
super(wallet, utils.provider)
this.utils = utils
this.chainId = `0x${network.chainId.toString(16)}`
this.wallet = wallet
}
async sendAsync(...args: any[]) {
return this.send(...args)
}
async send(...args: any[]) {
console.debug('hardhat:send', ...args)
// Parse callback form.
const isCallbackForm = typeof args[0] === 'object' && typeof args[1] === 'function'
let callback = <T>(error: Error | null, result?: { result: T }) => {
if (error) throw error
return result?.result
}
let method
let params
if (isCallbackForm) {
callback = args[1]
method = args[0].method
params = args[0].params
} else {
method = args[0]
params = args[1]
}
let result
try {
switch (method) {
case 'eth_requestAccounts':
case 'eth_accounts':
result = [this.wallet.address]
break
case 'eth_chainId':
result = this.chainId
break
case 'eth_sendTransaction': {
// Eip1193Bridge doesn't support .gas and .from directly, so we massage it to satisfy ethers' expectations.
// See https://github.com/ethers-io/ethers.js/issues/1683.
params[0].gasLimit = params[0].gas
delete params[0].gas
delete params[0].from
const req = JsonRpcProvider.hexlifyTransaction(params[0])
req.gasLimit = req.gas
delete req.gas
result = (await this.signer.sendTransaction(req)).hash
break
}
default:
result = await super.send(method, params)
}
console.debug('hardhat:receive', method, result)
return callback(null, { result })
} catch (error) {
console.debug('hardhat:error', method, error)
return callback(error as Error)
}
}
}
import { UserState } from '../../src/state/user/reducer'
export const CONNECTED_WALLET_USER_STATE: Partial<UserState> = { selectedWallet: 'INJECTED' }
/* eslint-env node */ /* eslint-env node */
require('dotenv').config() require('dotenv').config()
// Block selection is arbitrary, as e2e tests will build up their own state.
// The only requirement is that all infrastructure under test (eg Permit2 contracts) are already deployed.
const BLOCK_NUMBER = 17023328
const mainnetFork = { const mainnetFork = {
url: `https://mainnet.infura.io/v3/${process.env.REACT_APP_INFURA_KEY}`, url: `https://mainnet.infura.io/v3/${process.env.REACT_APP_INFURA_KEY}`,
blockNumber: 17023328, blockNumber: BLOCK_NUMBER,
httpHeaders: { httpHeaders: {
Origin: 'localhost:3000', // infura allowlists requests by origin Origin: 'localhost:3000', // infura allowlists requests by origin
}, },
......
...@@ -311,6 +311,7 @@ export default function SwapCurrencyInputPanel({ ...@@ -311,6 +311,7 @@ export default function SwapCurrencyInputPanel({
{account ? ( {account ? (
<RowFixed style={{ height: '17px' }}> <RowFixed style={{ height: '17px' }}>
<ThemedText.DeprecatedBody <ThemedText.DeprecatedBody
data-testid="balance-text"
color={theme.textSecondary} color={theme.textSecondary}
fontWeight={400} fontWeight={400}
fontSize={14} fontSize={14}
......
...@@ -227,6 +227,7 @@ export function CurrencySearch({ ...@@ -227,6 +227,7 @@ export function CurrencySearch({
<SearchInput <SearchInput
type="text" type="text"
id="token-search-input" id="token-search-input"
data-testid="token-search-input"
placeholder={t`Search name or paste address`} placeholder={t`Search name or paste address`}
autoComplete="off" autoComplete="off"
value={searchQuery} value={searchQuery}
......
...@@ -153,7 +153,7 @@ function TransactionSubmittedContent({ ...@@ -153,7 +153,7 @@ function TransactionSubmittedContent({
)} )}
</ButtonLight> </ButtonLight>
)} )}
<ButtonPrimary onClick={onDismiss} style={{ margin: '20px 0 0 0' }}> <ButtonPrimary onClick={onDismiss} style={{ margin: '20px 0 0 0' }} data-testid="dismiss-tx-confirmation">
<Text fontWeight={600} fontSize={20} color={theme.accentTextLightPrimary}> <Text fontWeight={600} fontSize={20} color={theme.accentTextLightPrimary}>
{inline ? <Trans>Return</Trans> : <Trans>Close</Trans>} {inline ? <Trans>Return</Trans> : <Trans>Close</Trans>}
</Text> </Text>
......
import { Currency, Ether, NativeCurrency, Token, WETH9 } from '@uniswap/sdk-core' import { Currency, Ether, NativeCurrency, Token, WETH9 } from '@uniswap/sdk-core'
import { SupportedChainId } from 'constants/chains'
import invariant from 'tiny-invariant' import invariant from 'tiny-invariant'
import { UNI_ADDRESS } from './addresses' import { UNI_ADDRESS } from './addresses'
import { SupportedChainId } from './chains'
export const NATIVE_CHAIN_ID = 'NATIVE' export const NATIVE_CHAIN_ID = 'NATIVE'
......
...@@ -83,7 +83,7 @@ ...@@ -83,7 +83,7 @@
resolved "https://registry.yarnpkg.com/@amplitude/ua-parser-js/-/ua-parser-js-0.7.31.tgz#749bf7cb633cfcc7ff3c10805bad7c5f6fbdbc61" resolved "https://registry.yarnpkg.com/@amplitude/ua-parser-js/-/ua-parser-js-0.7.31.tgz#749bf7cb633cfcc7ff3c10805bad7c5f6fbdbc61"
integrity sha512-+z8UGRaj13Pt5NDzOnkTBy49HE2CX64jeL0ArB86HAtilpnfkPB7oqkigN7Lf2LxscMg4QhFD7mmCfedh3rqTg== integrity sha512-+z8UGRaj13Pt5NDzOnkTBy49HE2CX64jeL0ArB86HAtilpnfkPB7oqkigN7Lf2LxscMg4QhFD7mmCfedh3rqTg==
"@ampproject/remapping@^2.1.0", "@ampproject/remapping@^2.2.0": "@ampproject/remapping@^2.2.0":
version "2.2.1" version "2.2.1"
resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630"
integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==
...@@ -161,7 +161,7 @@ ...@@ -161,7 +161,7 @@
dependencies: dependencies:
"@babel/highlight" "^7.18.6" "@babel/highlight" "^7.18.6"
"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.20.0", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.21.4": "@babel/compat-data@^7.12.1", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.21.4":
version "7.21.4" version "7.21.4"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.4.tgz#457ffe647c480dff59c2be092fc3acf71195c87f" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.4.tgz#457ffe647c480dff59c2be092fc3acf71195c87f"
integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==
...@@ -209,7 +209,7 @@ ...@@ -209,7 +209,7 @@
json5 "^2.2.2" json5 "^2.2.2"
semver "^6.3.0" semver "^6.3.0"
"@babel/generator@^7.11.6", "@babel/generator@^7.12.1", "@babel/generator@^7.14.0", "@babel/generator@^7.18.13", "@babel/generator@^7.20.5", "@babel/generator@^7.21.4": "@babel/generator@^7.11.6", "@babel/generator@^7.12.1", "@babel/generator@^7.14.0", "@babel/generator@^7.18.13", "@babel/generator@^7.21.4":
version "7.21.4" version "7.21.4"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.4.tgz#64a94b7448989f421f919d5239ef553b37bb26bc" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.4.tgz#64a94b7448989f421f919d5239ef553b37bb26bc"
integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==
...@@ -307,7 +307,7 @@ ...@@ -307,7 +307,7 @@
dependencies: dependencies:
"@babel/types" "^7.18.6" "@babel/types" "^7.18.6"
"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.2", "@babel/helper-module-transforms@^7.21.2": "@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.21.2":
version "7.21.2" version "7.21.2"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2"
integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==
...@@ -384,7 +384,7 @@ ...@@ -384,7 +384,7 @@
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2"
integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==
"@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.16.7", "@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": "@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.16.7", "@babel/helper-validator-option@^7.21.0":
version "7.21.0" version "7.21.0"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180"
integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==
...@@ -399,7 +399,7 @@ ...@@ -399,7 +399,7 @@
"@babel/traverse" "^7.16.8" "@babel/traverse" "^7.16.8"
"@babel/types" "^7.16.8" "@babel/types" "^7.16.8"
"@babel/helpers@^7.12.1", "@babel/helpers@^7.20.5", "@babel/helpers@^7.21.0": "@babel/helpers@^7.12.1", "@babel/helpers@^7.21.0":
version "7.21.0" version "7.21.0"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e"
integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==
...@@ -417,7 +417,7 @@ ...@@ -417,7 +417,7 @@
chalk "^2.0.0" chalk "^2.0.0"
js-tokens "^4.0.0" js-tokens "^4.0.0"
"@babel/parser@^7.1.0", "@babel/parser@^7.11.5", "@babel/parser@^7.12.3", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.8", "@babel/parser@^7.18.10", "@babel/parser@^7.20.5", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4", "@babel/parser@^7.7.0": "@babel/parser@^7.1.0", "@babel/parser@^7.11.5", "@babel/parser@^7.12.3", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.8", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4", "@babel/parser@^7.7.0":
version "7.21.4" version "7.21.4"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17"
integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==
...@@ -1174,7 +1174,7 @@ ...@@ -1174,7 +1174,7 @@
"@babel/parser" "^7.20.7" "@babel/parser" "^7.20.7"
"@babel/types" "^7.20.7" "@babel/types" "^7.20.7"
"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": "@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.19.1", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0":
version "7.21.4" version "7.21.4"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.4.tgz#a836aca7b116634e97a6ed99976236b3282c9d36" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.4.tgz#a836aca7b116634e97a6ed99976236b3282c9d36"
integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==
...@@ -1190,7 +1190,7 @@ ...@@ -1190,7 +1190,7 @@
debug "^4.1.0" debug "^4.1.0"
globals "^11.1.0" globals "^11.1.0"
"@babel/types@^7.0.0", "@babel/types@^7.11.5", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.18.10", "@babel/types@^7.18.13", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": "@babel/types@^7.0.0", "@babel/types@^7.11.5", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.18.13", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0":
version "7.21.4" version "7.21.4"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4"
integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==
...@@ -1392,7 +1392,7 @@ ...@@ -1392,7 +1392,7 @@
"@emotion/utils" "0.11.3" "@emotion/utils" "0.11.3"
babel-plugin-emotion "^10.0.27" babel-plugin-emotion "^10.0.27"
"@emotion/hash@0.8.0", "@emotion/hash@^0.8.0": "@emotion/hash@0.8.0":
version "0.8.0" version "0.8.0"
resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413"
integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==
...@@ -2947,14 +2947,6 @@ ...@@ -2947,14 +2947,6 @@
"@babel/runtime" "^7.7.2" "@babel/runtime" "^7.7.2"
regenerator-runtime "^0.13.3" regenerator-runtime "^0.13.3"
"@jridgewell/gen-mapping@^0.1.0":
version "0.1.1"
resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996"
integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==
dependencies:
"@jridgewell/set-array" "^1.0.0"
"@jridgewell/sourcemap-codec" "^1.4.10"
"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
version "0.3.3" version "0.3.3"
resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
...@@ -2969,7 +2961,7 @@ ...@@ -2969,7 +2961,7 @@
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": "@jridgewell/set-array@^1.0.1":
version "1.1.2" version "1.1.2"
resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
...@@ -9054,10 +9046,10 @@ cyclist@^1.0.1: ...@@ -9054,10 +9046,10 @@ cyclist@^1.0.1:
resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
cypress-hardhat@^1.0.0: cypress-hardhat@^1.0.1:
version "1.0.0" version "1.0.1"
resolved "https://registry.yarnpkg.com/cypress-hardhat/-/cypress-hardhat-1.0.0.tgz#0ced21363ac045d40b377695ecb6b031e38f475c" resolved "https://registry.yarnpkg.com/cypress-hardhat/-/cypress-hardhat-1.0.1.tgz#11b86653282769dadc0bd0c65ca41011865b0762"
integrity sha512-dj8fkqFLsbdZTuN0irezZlD4kDP/yqJzoHdalbv9+pufoXCl2wWCaTfI4EgctM5Vrph6IbxdmO84NGCeCpqqdw== integrity sha512-eGD7fNM8BXShXEsDbO/m2jv9mx7jHs44bnuWKYxO29ySXX5Soz9+AFYelhzKDvh/T+MJy1YqApPbif9+PNA++g==
cypress@*, cypress@10.3.1: cypress@*, cypress@10.3.1:
version "10.3.1" version "10.3.1"
...@@ -9546,7 +9538,7 @@ deep-is@^0.1.3, deep-is@~0.1.3: ...@@ -9546,7 +9538,7 @@ deep-is@^0.1.3, deep-is@~0.1.3:
resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz"
integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
deep-object-diff@^1.1.0, deep-object-diff@^1.1.9: deep-object-diff@^1.1.9:
version "1.1.9" version "1.1.9"
resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.9.tgz#6df7ef035ad6a0caa44479c536ed7b02570f4595" resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.9.tgz#6df7ef035ad6a0caa44479c536ed7b02570f4595"
integrity sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA== integrity sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==
...@@ -13912,7 +13904,7 @@ json5@^1.0.1: ...@@ -13912,7 +13904,7 @@ json5@^1.0.1:
dependencies: dependencies:
minimist "^1.2.0" minimist "^1.2.0"
json5@^2.1.2, json5@^2.2.1, json5@^2.2.2: json5@^2.1.2, json5@^2.2.2:
version "2.2.3" version "2.2.3"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
...@@ -15020,17 +15012,12 @@ nano-time@1.0.0: ...@@ -15020,17 +15012,12 @@ nano-time@1.0.0:
dependencies: dependencies:
big-integer "^1.6.16" big-integer "^1.6.16"
nanocolors@^0.2.2:
version "0.2.12"
resolved "https://registry.yarnpkg.com/nanocolors/-/nanocolors-0.2.12.tgz#4d05932e70116078673ea4cc6699a1c56cc77777"
integrity sha512-SFNdALvzW+rVlzqexid6epYdt8H9Zol7xDoQarioEFcFN0JHo4CYNztAxmtfgGTVRCmFlEOqqhBpoFGKqSAMug==
nanoid@3.3.3: nanoid@3.3.3:
version "3.3.3" version "3.3.3"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25"
integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==
nanoid@^3.1.25, nanoid@^3.3.6: nanoid@^3.3.6:
version "3.3.6" version "3.3.6"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
...@@ -18722,11 +18709,6 @@ source-map-explorer@^2.5.3: ...@@ -18722,11 +18709,6 @@ source-map-explorer@^2.5.3:
temp "^0.9.4" temp "^0.9.4"
yargs "^16.2.0" yargs "^16.2.0"
source-map-js@^0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e"
integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==
source-map-js@^1.0.2: source-map-js@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
......
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