diff --git a/.github/workflows/ci-cd-trigger.yml b/.github/workflows/ci-cd-trigger.yml index 381e7696f..23450bda5 100644 --- a/.github/workflows/ci-cd-trigger.yml +++ b/.github/workflows/ci-cd-trigger.yml @@ -26,7 +26,7 @@ jobs: with: path: node_modules key: ${{ runner.os }}-cache-node-modules-${{ hashFiles('yarn.lock') }} - # comment out "resotre-keys" if you need to rebuild yarn from 0 + # comment out "restore-keys" if you need to rebuild yarn from 0 restore-keys: | ${{ runner.os }}-cache-node-modules- @@ -50,7 +50,7 @@ jobs: secrets: inherit lint-test-build: - timeout-minutes: 20 + timeout-minutes: 35 needs: node-modules runs-on: ubuntu-22.04 name: '(CI) lint + unit test + build' diff --git a/.github/workflows/cypress-run.yml b/.github/workflows/cypress-run.yml index 15edc3967..2b14e0b44 100644 --- a/.github/workflows/cypress-run.yml +++ b/.github/workflows/cypress-run.yml @@ -20,7 +20,7 @@ jobs: project: ${{ fromJSON(inputs.projects) }} name: ${{ matrix.project }} runs-on: self-hosted-runner - timeout-minutes: 30 + timeout-minutes: 40 steps: # Checks if skip cache was requested - name: Set skip-nx-cache flag @@ -91,5 +91,7 @@ jobs: - uses: actions/upload-artifact@v3 if: ${{ failure() }} with: - name: logs-${{ matrix.project }} - path: /home/runner/.vegacapsule/testnet/logs + name: test-report-and-logs-${{ matrix.project }} + path: | + /home/runner/.vegacapsule/testnet/logs + frontend-monorepo/apps/trading-e2e/cypress/reports diff --git a/.github/workflows/publish-dist.yml b/.github/workflows/publish-dist.yml index 5b878bf87..a81b29fe7 100644 --- a/.github/workflows/publish-dist.yml +++ b/.github/workflows/publish-dist.yml @@ -15,7 +15,7 @@ jobs: app: ${{ fromJSON(inputs.projects) }} name: ${{ matrix.app }} runs-on: ubuntu-22.04 - timeout-minutes: 20 + timeout-minutes: 25 steps: - name: Check out code uses: actions/checkout@v3 diff --git a/.gitignore b/.gitignore index b00636407..e7a708d80 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,6 @@ cypress.env.json # Next.js .next + +#cypress +/apps/trading-e2e/cypress/reports/ diff --git a/apps/explorer-e2e/cypress.config.js b/apps/explorer-e2e/cypress.config.js index 94f67efec..9b91a7946 100644 --- a/apps/explorer-e2e/cypress.config.js +++ b/apps/explorer-e2e/cypress.config.js @@ -21,6 +21,7 @@ module.exports = defineConfig({ chromeWebSecurity: false, viewportWidth: 1440, viewportHeight: 900, + testIsolation: false, }, env: { environment: 'CUSTOM', diff --git a/apps/explorer/src/app/components/markets/market-details.tsx b/apps/explorer/src/app/components/markets/market-details.tsx index 4395782e6..218371b63 100644 --- a/apps/explorer/src/app/components/markets/market-details.tsx +++ b/apps/explorer/src/app/components/markets/market-details.tsx @@ -60,9 +60,11 @@ export const MarketDetails = ({ market }: { market: MarketInfoWithData }) => { <> cy.get(`[data-testid="${ethWallet}"]:visible`); +const getVegaWallet = () => cy.get(`[data-testid="${vegaWallet}"]:visible`); + context( 'Staking Tab - with eth and vega wallets connected', { tags: '@slow' }, function () { // 2001-STKE-002, 2001-STKE-032 before('visit staking tab and connect vega wallet', function () { + cy.clearAllLocalStorage(); cy.visit('/'); ethereumWalletConnect(); // this is a workaround for #2422 which can be removed once issue is resolved @@ -187,31 +191,35 @@ context( .should('contain', 1.0, txTimeout); closeStakingDialog(); navigateTo(navigation.validators); - cy.get(`[row-id="${0}"]`).within(() => { - cy.getByTestId(stakeValidatorListTotalStake) - .should('have.text', '2.00') - .and('be.visible'); - cy.getByTestId(stakeValidatorListTotalShare) - .should('have.text', '66.67%') - .and('be.visible'); - cy.getByTestId(stakeValidatorListTotalStake) - .scrollIntoView() - .should('have.text', '2.00') - .and('be.visible'); - }); - cy.get(`[row-id="${1}"]`).within(() => { - cy.getByTestId(stakeValidatorListTotalStake) - .scrollIntoView() - .should('have.text', '1.00') - .and('be.visible'); - cy.getByTestId(stakeValidatorListTotalShare) - .should('have.text', '33.33%') - .and('be.visible'); - cy.getByTestId(stakeValidatorListTotalStake) - .scrollIntoView() - .should('have.text', '1.00') - .and('be.visible'); - }); + cy.get(`[row-id="${0}"]`) + .eq(1) + .within(() => { + cy.getByTestId(stakeValidatorListTotalStake) + .should('have.text', '2.00') + .and('be.visible'); + cy.getByTestId(stakeValidatorListTotalShare) + .should('have.text', '66.67%') + .and('be.visible'); + cy.getByTestId(stakeValidatorListTotalStake) + .scrollIntoView() + .should('have.text', '2.00') + .and('be.visible'); + }); + cy.get(`[row-id="${1}"]`) + .eq(1) + .within(() => { + cy.getByTestId(stakeValidatorListTotalStake) + .scrollIntoView() + .should('have.text', '1.00') + .and('be.visible'); + cy.getByTestId(stakeValidatorListTotalShare) + .should('have.text', '33.33%') + .and('be.visible'); + cy.getByTestId(stakeValidatorListTotalStake) + .scrollIntoView() + .should('have.text', '1.00') + .and('be.visible'); + }); }); // 2001-STKE-041 @@ -329,11 +337,11 @@ context( verifyStakedBalance(2.0); closeStakingDialog(); stakingPageDisassociateAllTokens(); - cy.getByTestId(ethWalletContainer).within(() => { + getEthereumWallet().within(() => { cy.contains(vegaWalletPublicKeyShort, txTimeout).should('not.exist'); }); verifyEthWalletTotalAssociatedBalance('0.0'); - cy.getByTestId(vegaWallet).within(() => { + getVegaWallet().within(() => { cy.getByTestId(vegaWalletAssociatedBalance, txTimeout).should( 'contain', '0.00' @@ -357,11 +365,11 @@ context( verifyStakedBalance(2.0); closeStakingDialog(); stakingPageDisassociateAllTokens('contract'); - cy.getByTestId(ethWalletContainer).within(() => { + getEthereumWallet().within(() => { cy.contains(vegaWalletPublicKeyShort, txTimeout).should('not.exist'); }); verifyEthWalletTotalAssociatedBalance('0.0'); - cy.getByTestId(vegaWallet).within(() => { + getVegaWallet().within(() => { cy.getByTestId(vegaWalletAssociatedBalance, txTimeout).should( 'contain', '0.00' @@ -386,7 +394,7 @@ context( closeStakingDialog(); stakingPageDisassociateTokens('1'); verifyEthWalletTotalAssociatedBalance('2.0'); - cy.getByTestId(vegaWallet).within(() => { + getVegaWallet().within(() => { cy.getByTestId(vegaWalletAssociatedBalance, txTimeout).should( 'contain', '2.00' @@ -453,7 +461,7 @@ context( verifyUnstakedBalance(0.0); closeStakingDialog(); stakingPageAssociateTokens('6'); - cy.getByTestId(vegaWallet).within(() => { + getVegaWallet().within(() => { cy.getByTestId(vegaWalletAssociatedBalance, txTimeout).should( 'contain', '12.00' diff --git a/apps/governance-e2e/src/integration/view/proposal.cy.ts b/apps/governance-e2e/src/integration/view/proposal.cy.ts index cf13f0a2b..bc78e151a 100644 --- a/apps/governance-e2e/src/integration/view/proposal.cy.ts +++ b/apps/governance-e2e/src/integration/view/proposal.cy.ts @@ -3,11 +3,14 @@ import { navigation, verifyPageHeader, verifyTabHighlighted, - waitForSpinner, } from '../../support/common.functions'; +import { + goToMakeNewProposal, + governanceProposalType, +} from '../../support/governance.functions'; +import { mockNetworkUpgradeProposal } from '../../support/proposal.functions'; const proposalDocumentationLink = '[data-testid="proposal-documentation-link"]'; -const newProposalButton = '[data-testid="new-proposal-link"]'; const newProposalLink = '[data-testid="new-proposal-link"]'; const governanceDocsUrl = 'https://vega.xyz/governance'; const connectToVegaWalletButton = '[data-testid="connect-to-vega-wallet-btn"]'; @@ -21,56 +24,140 @@ context( navigateTo(navigation.proposals); }); - describe('with no network change proposals', function () { - it('should have governance tab highlighted', function () { - verifyTabHighlighted(navigation.proposals); + it('should have governance tab highlighted', function () { + verifyTabHighlighted(navigation.proposals); + }); + + it('should have GOVERNANCE header visible', function () { + verifyPageHeader('Proposals'); + }); + + it('should be able to see a working link for - find out more about Vega governance', function () { + // 3001-VOTE-001 + cy.get(proposalDocumentationLink) + .should('be.visible') + .and('have.text', 'Find out more about Vega governance') + .and('have.attr', 'href') + .and('equal', governanceDocsUrl); + + // 3002-PROP-001 + cy.request(governanceDocsUrl) + .its('body') + .then((body) => { + if (!body.includes('Govern the network')) { + assert.include( + body, + 'Govern the network', + `Checking that governance link destination includes 'Govern the network' text` + ); + } + }); + }); + + it('should be able to see button for - new proposal', function () { + // 3001-VOTE-002 + cy.get(newProposalLink) + .should('be.visible') + .and('have.text', 'New proposal') + .and('have.attr', 'href') + .and('equal', '/proposals/propose'); + }); + + it('should be able to see a connect wallet button - if vega wallet disconnected and user is submitting new proposal', function () { + goToMakeNewProposal(governanceProposalType.NETWORK_PARAMETER); + cy.get(connectToVegaWalletButton) + .should('be.visible') + .and('have.text', 'Connect Vega wallet'); + }); + + it('should see open network upgrade proposal on homepage', function () { + mockNetworkUpgradeProposal(); + cy.visit('/'); + cy.getByTestId('home-proposal-list').within(() => { + cy.getByTestId('protocol-upgrade-proposals-list-item').should('exist'); + cy.getByTestId('protocol-upgrade-proposal-title').should( + 'have.text', + 'Vega release v1' + ); }); + }); - it('should have GOVERNANCE header visible', function () { - verifyPageHeader('Proposals'); - }); - - it('should be able to see a working link for - find out more about Vega governance', function () { - // 3001-VOTE-001 - cy.get(proposalDocumentationLink) - .should('be.visible') - .and('have.text', 'Find out more about Vega governance') - .and('have.attr', 'href') - .and('equal', governanceDocsUrl); - - // 3002-PROP-001 - cy.request(governanceDocsUrl) - .its('body') - .then((body) => { - if (!body.includes('Govern the network')) { - assert.include( - body, - 'Govern the network', - `Checking that governance link destination includes 'Govern the network' text` - ); - } + it('should see network upgrade proposals in proposals list', function () { + mockNetworkUpgradeProposal(); + navigateTo(navigation.proposals); + cy.getByTestId('open-proposals').within(() => { + cy.get('li') + .eq(0) + .should( + 'have.attr', + 'data-testid', + 'protocol-upgrade-proposals-list-item' + ) + .within(() => { + cy.get('h2').should('have.text', 'Vega release v1'); + cy.getByTestId('protocol-upgrade-proposal-type').should( + 'have.text', + 'Network Upgrade' + ); + cy.getByTestId('protocol-upgrade-proposal-release-tag').should( + 'have.text', + 'Vega release tagv1' + ); + cy.getByTestId('protocol-upgrade-proposal-block-height').should( + 'have.text', + 'Upgrade block height2015942' + ); + cy.getByTestId('protocol-upgrade-proposal-status').should( + 'have.text', + 'Approved' + ); }); }); - - it('should be able to see button for - new proposal', function () { - // 3001-VOTE-002 - cy.get(newProposalLink) - .should('be.visible') - .and('have.text', 'New proposal') - .and('have.attr', 'href') - .and('equal', '/proposals/propose'); + cy.getByTestId('closed-proposals').within(() => { + cy.getByTestId('protocol-upgrade-proposals-list-item').should( + 'have.length', + 1 + ); }); + }); - // Skipping this test for now, the new proposal button no longer takes a user directly - // to a proposal form, instead it takes them to a page where they can select a proposal type. - // Keeping this test here for now as it can be repurposed to test the new proposal forms. - it.skip('should be able to see a connect wallet button - if vega wallet disconnected and new proposal button selected', function () { - cy.get(newProposalButton).should('be.visible').click(); - cy.get(connectToVegaWalletButton) - .should('be.visible') - .and('have.text', 'Connect Vega wallet'); - navigateTo(navigation.proposals); - waitForSpinner(); + it('should see details of network upgrade proposal', function () { + mockNetworkUpgradeProposal(); + navigateTo(navigation.proposals); + cy.getByTestId('protocol-upgrade-proposals-list-item') + .first() + .find('[data-testid="view-proposal-btn"]') + .click(); + cy.getByTestId('protocol-upgrade-proposal').within(() => { + cy.get('h1').should('have.text', 'Vega Release v1'); + cy.getByTestId('protocol-upgrade-block-height').should( + 'have.text', + '2015942 (currently 2014133)' + ); + cy.getByTestId('protocol-upgrade-state').should( + 'have.text', + 'Approved' + ); + cy.getByTestId('protocol-upgrade-release-tag').should( + 'have.text', + 'v1' + ); + cy.getByTestId('protocol-upgrade-approval-status') + .should('contain.text', '99.98% approval (% validator voting power)') + .and('contain.text', '(67% voting power required)'); + cy.get('h2').should('contain.text', 'Approvers (4/4 validators)'); + cy.getByTestId('validator-name') + .should('have.length', 4) + .each(($validator) => { + cy.wrap($validator).find('a').should('have.attr', 'href'); + }); + cy.getByTestId('validator-voting-power').each( + ($validatorVotingPower) => { + cy.wrap($validatorVotingPower) + .invoke('text') + .should('contain', '%'); + } + ); }); }); } diff --git a/apps/governance-e2e/src/integration/view/pubkey-view.cy.ts b/apps/governance-e2e/src/integration/view/pubkey-view.cy.ts index 45ed99a6b..8727ab164 100644 --- a/apps/governance-e2e/src/integration/view/pubkey-view.cy.ts +++ b/apps/governance-e2e/src/integration/view/pubkey-view.cy.ts @@ -45,10 +45,12 @@ context('View functionality with public key', { tags: '@smoke' }, function () { navigateTo(navigation.proposals); goToMakeNewProposal('Freeform'); enterUniqueFreeFormProposalBody('50', 'pub key proposal test'); - cy.getByTestId('dialog-content').within(() => { - cy.get('h1').should('have.text', 'Transaction failed'); - cy.getByTestId('Error').should('have.text', expectedErrorTxt); - }); + cy.getByTestId('dialog-content') + .first() + .within(() => { + cy.get('h1').should('have.text', 'Transaction failed'); + cy.getByTestId('Error').should('have.text', expectedErrorTxt); + }); }); it('Able to disconnect via banner', function () { diff --git a/apps/governance-e2e/src/integration/view/rewards.cy.ts b/apps/governance-e2e/src/integration/view/rewards.cy.ts index d7f0aaa4b..856caeae3 100644 --- a/apps/governance-e2e/src/integration/view/rewards.cy.ts +++ b/apps/governance-e2e/src/integration/view/rewards.cy.ts @@ -3,6 +3,7 @@ import { navigation, verifyPageHeader, } from '../../support/common.functions'; +import { waitForBeginningOfEpoch } from '../../support/staking.functions'; const viewToggle = '[data-testid="epoch-reward-view-toggle-total"]'; const warning = '[data-testid="callout"]'; @@ -37,6 +38,41 @@ context( it('should have toggle for seeing total vs individual rewards', function () { cy.get(viewToggle).should('be.visible'); }); + + // Skipping due to bug #3471 causing flaky failuress + it.skip('should have option to view go to next and previous page', function () { + waitForBeginningOfEpoch(); + cy.getByTestId('page-info') + .should('contain.text', 'Page ') + .invoke('text') + .then(($currentPage) => { + const currentPageNumber = Number($currentPage.slice(5)); + cy.getByTestId('goto-next-page').click(); + cy.getByTestId('page-info') + .invoke('text') + .then(($newPageNumber) => { + const newPageNumber = Number($newPageNumber.slice(5)); + expect(newPageNumber).to.be.greaterThan(currentPageNumber); + cy.getByTestId('goto-previous-page').click(); + cy.getByTestId('page-info').should( + 'contain.text', + $currentPage + ); + }); + }); + }); + + it('should have option to go to last and newest page', function () { + waitForBeginningOfEpoch(); + cy.getByTestId('goto-last-page').click(); + cy.getByTestId('epoch-total-rewards-table') + .last() + .find('h2') + .first() + .should('have.text', 'EPOCH 1'); + cy.getByTestId('goto-first-page').click(); + cy.get('h2').should('not.contain.text', 'EPOCH 1'); + }); }); } ); diff --git a/apps/governance-e2e/src/integration/view/validators.cy.ts b/apps/governance-e2e/src/integration/view/validators.cy.ts index 8f1e22fff..d167c98c0 100644 --- a/apps/governance-e2e/src/integration/view/validators.cy.ts +++ b/apps/governance-e2e/src/integration/view/validators.cy.ts @@ -1,7 +1,6 @@ /// import { - navigateTo, navigation, verifyPageHeader, verifyTabHighlighted, @@ -34,8 +33,8 @@ const stakeNumberRegex = /^\d*\.?\d*$/; context('Validators Page - verify elements on page', function () { before('navigate to validators page', function () { - cy.visit('/'); - navigateTo(navigation.validators); + cy.clearAllLocalStorage(); + cy.visit('/validators'); }); describe('with wallets disconnected', { tags: '@smoke' }, function () { diff --git a/apps/governance-e2e/src/integration/view/vesting.cy.ts b/apps/governance-e2e/src/integration/view/vesting.cy.ts index 82f6ff113..14f118693 100644 --- a/apps/governance-e2e/src/integration/view/vesting.cy.ts +++ b/apps/governance-e2e/src/integration/view/vesting.cy.ts @@ -43,23 +43,25 @@ context( // 1005-VEST-020 1005-VEST-021 it('Tokens in vesting contract for eth wallet is displayed on wallet window', function () { - cy.getByTestId('vega-in-vesting-contract').within(() => { - cy.getByTestId('currency-title') - .should('contain.text', 'VEGA') - .and('contain.text', 'In vesting contract'); - cy.get('[data-testid="currency-value"]:visible').should( - 'have.text', - lockedTokensInVestingContract - ); - cy.get('[data-testid="currency-locked"]:visible').should( - 'have.text', - lockedTokensInVestingContract - ); - cy.get('[data-testid="currency-unlocked"]:visible').should( - 'have.text', - '0.00' - ); - }); + cy.get('[data-testid="vega-in-vesting-contract"]:visible').within( + () => { + cy.getByTestId('currency-title') + .should('contain.text', 'VEGA') + .and('contain.text', 'In vesting contract'); + cy.get('[data-testid="currency-value"]:visible').should( + 'have.text', + lockedTokensInVestingContract + ); + cy.get('[data-testid="currency-locked"]:visible').should( + 'have.text', + lockedTokensInVestingContract + ); + cy.get('[data-testid="currency-unlocked"]:visible').should( + 'have.text', + '0.00' + ); + } + ); }); // 1005-VEST-022 1005-VEST-023 it('Tokens amount displayed in vesting page', function () { diff --git a/apps/governance-e2e/src/integration/view/wallet-eth.cy.ts b/apps/governance-e2e/src/integration/view/wallet-eth.cy.ts index cac1af3c9..5d294c325 100644 --- a/apps/governance-e2e/src/integration/view/wallet-eth.cy.ts +++ b/apps/governance-e2e/src/integration/view/wallet-eth.cy.ts @@ -17,7 +17,7 @@ const vegaInWallet = '[data-testid="vega-in-wallet"]:visible'; const progressBar = '[data-testid="progress-bar"]:visible'; const currencyLocked = '[data-testid="currency-locked"]:visible'; const currencyUnlocked = '[data-testid="currency-unlocked"]:visible'; -const dialog = '[role="dialog"]'; +const dialog = '[role="dialog"]:visible'; const dialogHeader = '[data-testid="dialog-title"]'; const dialogCloseBtn = '[data-testid="dialog-close"]'; @@ -68,8 +68,10 @@ context( it('should have connector list visible', function () { const connectList = [ 'Unknown', - 'MetaMask, Brave or other injected web wallet', + 'MetaMask', + 'Coinbase', 'WalletConnect', + 'WalletConnect Legacy', ]; cy.get(connectorList).within(() => { cy.get('button').each(($btn, i) => { diff --git a/apps/governance-e2e/src/integration/view/wallet-vega.cy.ts b/apps/governance-e2e/src/integration/view/wallet-vega.cy.ts index 39d94b647..e69ebbbd6 100644 --- a/apps/governance-e2e/src/integration/view/wallet-vega.cy.ts +++ b/apps/governance-e2e/src/integration/view/wallet-vega.cy.ts @@ -7,7 +7,7 @@ const walletContainer = 'aside [data-testid="vega-wallet"]'; const walletHeader = '[data-testid="wallet-header"] h1'; const connectButton = '[data-testid="connect-vega-wallet"]'; const getVegaLink = '[data-testid="link"]'; -const dialog = '[role="dialog"]'; +const dialog = '[role="dialog"]:visible'; const dialogHeader = '[data-testid="dialog-title"]'; const walletDialogHeader = '[data-testid="wallet-dialog-title"]'; const connectorsList = '[data-testid="connectors-list"]'; @@ -35,6 +35,7 @@ context( { tags: '@regression' }, () => { before('visit token home page', () => { + cy.clearAllLocalStorage(); cy.visit('/'); cy.get(walletContainer, { timeout: 60000 }).should('be.visible'); }); diff --git a/apps/governance-e2e/src/support/common.functions.ts b/apps/governance-e2e/src/support/common.functions.ts index bcbe7b5a1..d095e43d6 100644 --- a/apps/governance-e2e/src/support/common.functions.ts +++ b/apps/governance-e2e/src/support/common.functions.ts @@ -26,9 +26,11 @@ const topLevelRoutes = [ export function navigateTo(page: navigation) { if (!topLevelRoutes.includes(page)) { cy.getByTestId(tokenDropDown, { timeout: 10000 }).eq(0).click(); - cy.getByTestId('token-dropdown').within(() => { - cy.get(page).eq(0).click(); - }); + cy.getByTestId('token-dropdown') + .first() + .within(() => { + cy.get(page).eq(0).click(); + }); } else { return cy.get(navigation.section, { timeout: 10000 }).within(() => { cy.get(page).eq(0).click(); diff --git a/apps/governance-e2e/src/support/proposal.functions.ts b/apps/governance-e2e/src/support/proposal.functions.ts index 45760aa57..42253c670 100644 --- a/apps/governance-e2e/src/support/proposal.functions.ts +++ b/apps/governance-e2e/src/support/proposal.functions.ts @@ -1,5 +1,9 @@ import { addSeconds, millisecondsToSeconds } from 'date-fns'; import type { ProposalSubmissionBody } from '@vegaprotocol/wallet'; +import { aliasGQLQuery } from '@vegaprotocol/cypress'; +import { upgradeProposalsData } from '../fixtures/mocks/network-upgrade'; +import { proposalsData } from '../fixtures/mocks/proposals'; +import { nodeData } from '../fixtures/mocks/nodes'; export function createUpdateNetworkProposalTxBody(): ProposalSubmissionBody { const MIN_CLOSE_SEC = 5; @@ -80,3 +84,11 @@ export function createFreeFormProposalTxBody(): ProposalSubmissionBody { }, }; } + +export function mockNetworkUpgradeProposal() { + cy.mockGQL((req) => { + aliasGQLQuery(req, 'Nodes', nodeData); + aliasGQLQuery(req, 'Proposals', proposalsData); + aliasGQLQuery(req, 'ProtocolUpgrades', upgradeProposalsData); + }); +} diff --git a/apps/governance-e2e/src/support/staking.functions.ts b/apps/governance-e2e/src/support/staking.functions.ts index 1e08b5afa..b34ed6ef5 100644 --- a/apps/governance-e2e/src/support/staking.functions.ts +++ b/apps/governance-e2e/src/support/staking.functions.ts @@ -184,16 +184,18 @@ export function validateValidatorListTotalStakeAndShare( ) { cy.contains('Loading...', epochTimeout).should('not.exist'); waitForBeginningOfEpoch(); - cy.get(`[row-id="${positionOnList}"]`).within(() => { - cy.getByTestId(stakeValidatorListTotalStake, epochTimeout).should( - 'have.text', - expectedTotalStake - ); - cy.getByTestId(stakeValidatorListTotalShare, epochTimeout).should( - 'have.text', - expectedTotalShare - ); - }); + cy.get(`[row-id="${positionOnList}"]:visible`) + .eq(1) + .within(() => { + cy.getByTestId(stakeValidatorListTotalStake, epochTimeout).should( + 'have.text', + expectedTotalStake + ); + cy.getByTestId(stakeValidatorListTotalShare, epochTimeout).should( + 'have.text', + expectedTotalShare + ); + }); } export function ensureSpecifiedUnstakedTokensAreAssociated( @@ -218,13 +220,15 @@ export function ensureSpecifiedUnstakedTokensAreAssociated( } export function closeStakingDialog() { - cy.getByTestId('dialog-title').should( + cy.get('[data-testid="dialog-title"]:visible').should( 'contain.text', 'At the beginning of the next epoch' ); - cy.getByTestId('dialog-content').within(() => { - cy.get('a').should('have.text', 'Back to Staking').click(); - }); + cy.get('[data-testid="dialog-content"]:visible') + .first() + .within(() => { + cy.get('a').should('have.text', 'Back to Staking').click(); + }); } export function validateWalletCurrency( diff --git a/apps/governance-e2e/src/support/wallet-teardown.functions.ts b/apps/governance-e2e/src/support/wallet-teardown.functions.ts index be36d19de..7d1366e83 100644 --- a/apps/governance-e2e/src/support/wallet-teardown.functions.ts +++ b/apps/governance-e2e/src/support/wallet-teardown.functions.ts @@ -9,7 +9,7 @@ import { import { ethers, Wallet } from 'ethers'; const associatedAmountInWallet = '[data-testid="associated-amount"]:visible'; -const vegaWalletContainer = 'aside [data-testid="vega-wallet"]'; +const vegaWalletContainer = 'aside [data-testid="vega-wallet"]:visible'; const vegaWalletMnemonic = Cypress.env('vegaWalletMnemonic'); const vegaWalletPubKey = Cypress.env('vegaWalletPublicKey'); const vegaTokenContractAddress = Cypress.env('vegaTokenContractAddress'); diff --git a/apps/governance/.env b/apps/governance/.env index 23a2cdcd6..6ced39e1c 100644 --- a/apps/governance/.env +++ b/apps/governance/.env @@ -14,6 +14,7 @@ NX_VEGA_DOCS_URL=https://docs.vega.xyz/testnet NX_DELEGATIONS_PAGINATION=50 NX_TRANCHES_SERVICE_URL=https://tranches-stagnet3-k8s.ops.vega.xyz NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/main/announcements.json +NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72 #Test configuration variables CYPRESS_FAIRGROUND=false diff --git a/apps/governance/.env.capsule b/apps/governance/.env.capsule index b478ffef8..d5c67898a 100644 --- a/apps/governance/.env.capsule +++ b/apps/governance/.env.capsule @@ -20,3 +20,4 @@ NX_TRANCHES_SERVICE_URL=https://tranches-stagnet3-k8s.ops.vega.xyz #Test configuration variables CYPRESS_FAIRGROUND=false + diff --git a/apps/governance/src/app.tsx b/apps/governance/src/app.tsx index 525b6f6b2..f8d3d9cb7 100644 --- a/apps/governance/src/app.tsx +++ b/apps/governance/src/app.tsx @@ -17,6 +17,12 @@ import { AppStateProvider } from './contexts/app-state/app-state-provider'; import { ContractsProvider } from './contexts/contracts/contracts-provider'; import { AppRouter } from './routes'; import type { EthereumConfig } from '@vegaprotocol/web3'; +import { + createConnectors, + useEthTransactionManager, + useEthWithdrawApprovalsManager, + useWeb3ConnectStore, +} from '@vegaprotocol/web3'; import { Web3Provider } from '@vegaprotocol/web3'; import { VegaWalletDialogs } from './components/vega-wallet-dialogs'; import { VegaWalletProvider } from '@vegaprotocol/wallet'; @@ -27,10 +33,10 @@ import { NetworkLoader, useInitializeEnv, } from '@vegaprotocol/environment'; -import { createConnectors } from './lib/web3-connectors'; -import { ENV } from './config/env'; +import { ENV } from './config'; import type { InMemoryCacheConfig } from '@apollo/client'; import { WithdrawalDialog } from '@vegaprotocol/withdraws'; +import { SplashLoader } from './components/splash-loader'; const cache: InMemoryCacheConfig = { typePolicies: { @@ -70,20 +76,52 @@ const cache: InMemoryCacheConfig = { const Web3Container = ({ chainId, - providerUrl, }: { chainId: number; providerUrl: string; }) => { + const InitializeHandlers = () => { + useEthTransactionManager(); + useEthWithdrawApprovalsManager(); + return null; + }; + const [connectors, initializeConnectors] = useWeb3ConnectStore((store) => [ + store.connectors, + store.initialize, + ]); + const { ETHEREUM_PROVIDER_URL, ETH_LOCAL_PROVIDER_URL, ETH_WALLET_MNEMONIC } = + useEnvironment(); + useEffect(() => { + if (chainId) { + return initializeConnectors( + createConnectors( + ETHEREUM_PROVIDER_URL, + Number(chainId), + ETH_LOCAL_PROVIDER_URL, + ETH_WALLET_MNEMONIC + ), + Number(chainId) + ); + } + }, [ + chainId, + ETHEREUM_PROVIDER_URL, + initializeConnectors, + ETH_LOCAL_PROVIDER_URL, + ETH_WALLET_MNEMONIC, + ]); const sideBar = React.useMemo(() => { return [, ]; }, []); - const Connectors = React.useMemo(() => { - return createConnectors(providerUrl, Number(chainId)); - }, [chainId, providerUrl]); + + if (connectors.length === 0) { + // Prevent loading when the connectors are not initialized + return ; + } + return ( - - + + @@ -97,6 +135,7 @@ const Web3Container = ({ + diff --git a/apps/governance/src/components/eth-wallet/eth-wallet.tsx b/apps/governance/src/components/eth-wallet/eth-wallet.tsx index 071ce9a6b..f095ed20a 100644 --- a/apps/governance/src/components/eth-wallet/eth-wallet.tsx +++ b/apps/governance/src/components/eth-wallet/eth-wallet.tsx @@ -26,6 +26,7 @@ import { import { Loader } from '@vegaprotocol/ui-toolkit'; import colors from 'tailwindcss/colors'; import { useBalances } from '../../lib/balances/balances-store'; +import { useWeb3Disconnect } from '@vegaprotocol/web3'; const removeLeadingAddressSymbol = (key: string) => { if (key && key.length > 2 && key.slice(0, 2) === '0x') { @@ -184,6 +185,7 @@ export const EthWallet = () => { const { appDispatch } = useAppState(); const { account, connector } = useWeb3React(); const pendingTxs = usePendingTransactions(); + const disconnect = useWeb3Disconnect(connector); return ( @@ -239,7 +241,7 @@ export const EthWallet = () => {
+
); @@ -80,7 +87,7 @@ export const Web3Content = ({ children, appChainId }: Web3ContentProps) => {

This app only works on {getChainName(appChainId)}

- + ); diff --git a/apps/governance/src/i18n/translations/dev.json b/apps/governance/src/i18n/translations/dev.json index 952d6886b..597361a04 100644 --- a/apps/governance/src/i18n/translations/dev.json +++ b/apps/governance/src/i18n/translations/dev.json @@ -595,6 +595,7 @@ "noPercentage": "No percentage", "proposalTerms": "Proposal terms", "currentlySetTo": "Currently expected to ", + "currently": "currently", "finalOutcomeMayDiffer": "Final outcome may differ", "votingPower": "Voting power", "normalisedVotingPower": "Normalised voting power", @@ -767,7 +768,7 @@ "performancePenalty": "Performance penalty", "overstaked": "Overstaked", "overstakedPenalty": "Overstaked penalty", - "homeProposalsIntro": "Decisions on the Vega network are on-chain, with tokenholders creating proposals that other tokenholders vote to approve or reject.", + "homeProposalsIntro": "Decisions on the Vega network are on-chain, with tokenholders creating proposals that other tokenholders vote to approve or reject. Network upgrades are proposed and approved by validators.", "homeProposalsButtonText": "Browse, vote, and propose", "homeValidatorsIntro": "Vega runs on a delegated proof of stake blockchain, where validators earn fees for validating block transactions. Tokenholders can nominate validators by staking tokens to them.", "homeValidatorsButtonText": "Browse, and stake", @@ -775,5 +776,19 @@ "homeRewardsButtonText": "See rewards", "homeVegaTokenIntro": "VEGA Token is a governance asset used to make and vote on proposals, and nominate validators.", "homeVegaTokenButtonText": "Manage tokens", - "downloadProposalJson": "Download proposal as JSON" + "downloadProposalJson": "Download proposal as JSON", + "networkUpgrade": "Network Upgrade", + "PROTOCOL_UPGRADE_PROPOSAL_STATUS_APPROVED": "Approved", + "PROTOCOL_UPGRADE_PROPOSAL_STATUS_PENDING": "Pending", + "PROTOCOL_UPGRADE_PROPOSAL_STATUS_REJECTED": "Rejected", + "PROTOCOL_UPGRADE_PROPOSAL_STATUS_UNSPECIFIED": "Unspecified", + "vegaRelease{release}": "Vega Release {{release}}", + "upgradeBlockHeight": "Upgrade block height", + "vegaReleaseTag": "Vega release tag", + "approvalStatus": "Approval status", + "approvers": "Approvers", + "approval (% validator voting power)": "approval (% validator voting power)", + "67% voting power required": "67% voting power required", + "Token": "Token", + "associateVegaNow": "Associate $VEGA now" } diff --git a/apps/governance/src/lib/web3-connectors.ts b/apps/governance/src/lib/web3-connectors.ts index 62d9c266e..8f7c19b83 100644 --- a/apps/governance/src/lib/web3-connectors.ts +++ b/apps/governance/src/lib/web3-connectors.ts @@ -1,20 +1,17 @@ import { ethers } from 'ethers'; import type { Web3ReactHooks } from '@web3-react/core'; -import { initializeConnector } from '@web3-react/core'; -import { MetaMask } from '@web3-react/metamask'; -import { WalletConnect } from '@web3-react/walletconnect'; import type { Connector } from '@web3-react/types'; import { ENV } from '../config/env'; -import { UrlConnector } from '@vegaprotocol/web3'; +import { + initializeMetaMaskConnector, + initializeWalletConnector, + initializeWalletConnectLegacyConnector, + initializeCoinbaseConnector, + WALLETCONNECT_PROJECT_ID, + initializeUrlConnector, +} from '@vegaprotocol/web3'; -const [metamask, metamaskHooks] = initializeConnector( - (actions) => new MetaMask(actions) -); - -const [urlConnector, urlHooks] = initializeConnector( - (actions) => - new UrlConnector(actions, ENV.localProviderUrl, ENV.ethWalletMnemonic) -); +initializeUrlConnector(ENV.localProviderUrl, ENV.ethWalletMnemonic); export const createDefaultProvider = (providerUrl: string, chainId: number) => { return new ethers.providers.JsonRpcProvider(providerUrl, chainId); @@ -24,19 +21,14 @@ export const createConnectors = (providerUrl: string, chainId: number) => { if (isNaN(chainId)) { throw new Error('Invalid Ethereum chain ID for environment'); } - const [walletconnect, walletconnectHooks] = - initializeConnector( - (actions) => - new WalletConnect(actions, { - rpc: { - [chainId]: providerUrl, - }, - }), - [chainId] - ); + return [ - ENV.urlConnect ? [urlConnector, urlHooks] : null, - [metamask, metamaskHooks], - [walletconnect, walletconnectHooks], - ].filter(Boolean) as [Connector, Web3ReactHooks][]; + ENV.urlConnect + ? initializeUrlConnector(ENV.localProviderUrl, ENV.ethWalletMnemonic) + : null, + initializeMetaMaskConnector(), + initializeCoinbaseConnector(providerUrl), + initializeWalletConnector(WALLETCONNECT_PROJECT_ID, chainId, providerUrl), + initializeWalletConnectLegacyConnector(chainId, providerUrl), + ].filter(Boolean) as unknown as [Connector, Web3ReactHooks][]; }; diff --git a/apps/governance/src/routes/home/index.tsx b/apps/governance/src/routes/home/index.tsx index 6f3b2acb1..3f5751ccf 100644 --- a/apps/governance/src/routes/home/index.tsx +++ b/apps/governance/src/routes/home/index.tsx @@ -10,23 +10,31 @@ import { import { useDocumentTitle } from '../../hooks/use-document-title'; import { useRefreshAfterEpoch } from '../../hooks/use-refresh-after-epoch'; import { ProposalsListItem } from '../proposals/components/proposals-list-item'; +import { ProtocolUpgradeProposalsListItem } from '../proposals/components/protocol-upgrade-proposals-list-item/protocol-upgrade-proposals-list-item'; import Routes from '../routes'; import { ExternalLinks, removePaginationWrapper } from '@vegaprotocol/utils'; import { useNodesQuery } from '../staking/home/__generated__/Nodes'; import { useProposalsQuery } from '../proposals/proposals/__generated__/Proposals'; -import { getNotRejectedProposals } from '../proposals/proposals/proposals-container'; +import { useProtocolUpgradesQuery } from '../proposals/protocol-upgrade/__generated__/ProtocolUpgradeProposals'; +import { + getNotRejectedProposals, + getNotRejectedProtocolUpgradeProposals, +} from '../proposals/proposals/proposals-container'; import { Heading } from '../../components/heading'; import * as Schema from '@vegaprotocol/types'; import type { RouteChildProps } from '..'; import type { ProposalFieldsFragment } from '../proposals/proposals/__generated__/Proposals'; import type { NodesFragmentFragment } from '../staking/home/__generated__/Nodes'; +import type { ProtocolUpgradeProposalFieldsFragment } from '../proposals/protocol-upgrade/__generated__/ProtocolUpgradeProposals'; const nodesToShow = 6; const HomeProposals = ({ proposals, + protocolUpgradeProposals, }: { proposals: ProposalFieldsFragment[]; + protocolUpgradeProposals: ProtocolUpgradeProposalFieldsFragment[]; }) => { const { t } = useTranslation(); @@ -47,6 +55,10 @@ const HomeProposals = ({ data-testid="home-proposal-list" className="grid md:grid-cols-2 lg:grid-cols-1 xl:grid-cols-2 gap-6" > + {protocolUpgradeProposals.map((proposal, index) => ( + + ))} + {proposals.map((proposal) => ( ))} @@ -107,20 +119,7 @@ const HomeNodes = ({ {trimmedActiveNodes.map(({ id, avatarUrl, name }) => (
- - -
- {avatarUrl && ( - {`Avatar - )} - {name} -
-
- +
))} @@ -136,6 +135,35 @@ const HomeNodes = ({ ); }; +interface ValidatorDetailsLinkProps { + id: string; + avatarUrl: string | null | undefined; + name: string; +} + +export const ValidatorDetailsLink = ({ + id, + avatarUrl, + name, +}: ValidatorDetailsLinkProps) => { + return ( + + +
+ {avatarUrl && ( + {`Avatar + )} + {name} +
+
+ + ); +}; + const GovernanceHome = ({ name }: RouteChildProps) => { useDocumentTitle(name); const { t } = useTranslation(); @@ -149,6 +177,16 @@ const GovernanceHome = ({ name }: RouteChildProps) => { errorPolicy: 'ignore', }); + const { + data: protocolUpgradesData, + loading: protocolUpgradesLoading, + error: protocolUpgradesError, + } = useProtocolUpgradesQuery({ + pollInterval: 5000, + fetchPolicy: 'network-only', + errorPolicy: 'ignore', + }); + const { data: validatorsData, error: validatorsError, @@ -163,11 +201,38 @@ const GovernanceHome = ({ name }: RouteChildProps) => { proposalsData ? getNotRejectedProposals( proposalsData.proposalsConnection - ).slice(0, 3) + ) : [], [proposalsData] ); + const protocolUpgradeProposals = useMemo( + () => + protocolUpgradesData + ? getNotRejectedProtocolUpgradeProposals( + protocolUpgradesData.protocolUpgradeProposals + ).filter( + (p) => + Number(p.upgradeBlockHeight) > + Number(protocolUpgradesData.lastBlockHeight) + ) + : [], + [protocolUpgradesData] + ); + + const totalProposalsDesired = 4; + const protocolUpgradeProposalsToShow = protocolUpgradeProposals.slice( + 0, + totalProposalsDesired + ); + const proposalsToShow = + protocolUpgradeProposalsToShow.length === totalProposalsDesired + ? [] + : proposals.slice( + 0, + totalProposalsDesired - protocolUpgradeProposalsToShow.length + ); + const activeNodes = removePaginationWrapper( validatorsData?.nodesConnection.edges ); @@ -182,11 +247,14 @@ const GovernanceHome = ({ name }: RouteChildProps) => { return ( - + ( - + diff --git a/apps/governance/src/routes/proposals/components/proposals-list/proposals-list.tsx b/apps/governance/src/routes/proposals/components/proposals-list/proposals-list.tsx index ab09aef1f..f31921db5 100644 --- a/apps/governance/src/routes/proposals/components/proposals-list/proposals-list.tsx +++ b/apps/governance/src/routes/proposals/components/proposals-list/proposals-list.tsx @@ -3,17 +3,21 @@ import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Heading, SubHeading } from '../../../../components/heading'; import { ProposalsListItem } from '../proposals-list-item'; +import { ProtocolUpgradeProposalsListItem } from '../protocol-upgrade-proposals-list-item/protocol-upgrade-proposals-list-item'; import { ProposalsListFilter } from '../proposals-list-filter'; import Routes from '../../../routes'; import { Button } from '@vegaprotocol/ui-toolkit'; import { Link } from 'react-router-dom'; -import type { ProposalQuery } from '../../proposal/__generated__/Proposal'; -import type { ProposalFieldsFragment } from '../../proposals/__generated__/Proposals'; import { ExternalLinks } from '@vegaprotocol/utils'; import { ExternalLink } from '@vegaprotocol/ui-toolkit'; +import type { ProposalQuery } from '../../proposal/__generated__/Proposal'; +import type { ProposalFieldsFragment } from '../../proposals/__generated__/Proposals'; +import type { ProtocolUpgradeProposalFieldsFragment } from '../../protocol-upgrade/__generated__/ProtocolUpgradeProposals'; interface ProposalsListProps { proposals: Array; + protocolUpgradeProposals: ProtocolUpgradeProposalFieldsFragment[]; + lastBlockHeight?: string; } interface SortedProposalsProps { @@ -21,7 +25,16 @@ interface SortedProposalsProps { closed: Array; } -export const ProposalsList = ({ proposals }: ProposalsListProps) => { +interface SortedProtocolUpgradeProposalsProps { + open: ProtocolUpgradeProposalFieldsFragment[]; + closed: ProtocolUpgradeProposalFieldsFragment[]; +} + +export const ProposalsList = ({ + proposals, + protocolUpgradeProposals, + lastBlockHeight, +}: ProposalsListProps) => { const { t } = useTranslation(); const [filterString, setFilterString] = useState(''); const sortedProposals = proposals.reduce( @@ -39,6 +52,21 @@ export const ProposalsList = ({ proposals }: ProposalsListProps) => { } ); + const sortedProtocolUpgradeProposals = protocolUpgradeProposals.reduce( + (acc: SortedProtocolUpgradeProposalsProps, proposal) => { + if (Number(proposal?.upgradeBlockHeight) > Number(lastBlockHeight)) { + acc.open.push(proposal); + } else { + acc.closed.push(proposal); + } + return acc; + }, + { + open: [], + closed: [], + } + ); + const filterPredicate = ( p: ProposalFieldsFragment | ProposalQuery['proposal'] ) => @@ -65,7 +93,7 @@ export const ProposalsList = ({ proposals }: ProposalsListProps) => {

{t( - `The Vega network is governed by the community. View active proposals, vote on them or propose changes to the network.` + `The Vega network is governed by the community. View active proposals, vote on them or propose changes to the network. Network upgrades are proposed and approved by validators.` )}{' '} { )}

- {sortedProposals.open.length > 0 ? ( + {sortedProposals.open.length > 0 || + sortedProtocolUpgradeProposals.open.length > 0 ? (
    + {sortedProtocolUpgradeProposals.open.map((proposal) => ( + + ))} {sortedProposals.open.filter(filterPredicate).map((proposal) => ( ))} @@ -94,8 +129,16 @@ export const ProposalsList = ({ proposals }: ProposalsListProps) => {
- {sortedProposals.closed.length > 0 ? ( + {sortedProposals.closed.length > 0 || + sortedProtocolUpgradeProposals.closed.length > 0 ? (
    + {sortedProtocolUpgradeProposals.closed.map((proposal) => ( + + ))} + {sortedProposals.closed.filter(filterPredicate).map((proposal) => ( ))} diff --git a/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-approvals/index.tsx b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-approvals/index.tsx new file mode 100644 index 000000000..a877bea87 --- /dev/null +++ b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-approvals/index.tsx @@ -0,0 +1 @@ +export * from './protocol-update-proposal-detail-approvals'; diff --git a/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-approvals/protocol-update-proposal-detail-approvals.tsx b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-approvals/protocol-update-proposal-detail-approvals.tsx new file mode 100644 index 000000000..4c4bcb9a4 --- /dev/null +++ b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-approvals/protocol-update-proposal-detail-approvals.tsx @@ -0,0 +1,81 @@ +import { useTranslation } from 'react-i18next'; +import { + RoundedWrapper, + KeyValueTable, + KeyValueTableRow, +} from '@vegaprotocol/ui-toolkit'; +import { SubHeading } from '../../../../components/heading'; +import { ValidatorDetailsLink } from '../../../home'; +import { getNormalisedVotingPower } from '../../../staking/shared'; +import type { NodesFragmentFragment } from '../../../staking/home/__generated__/Nodes'; + +export interface ProtocolUpdateProposalDetailApprovalsProps { + totalConsensusValidators: number; + // Consensus validators that have approved the proposal + consensusApprovals: NodesFragmentFragment[]; + consensusApprovalsVotingPowerPercentage: string; +} + +export const ProtocolUpdateProposalDetailApprovals = ({ + totalConsensusValidators, + consensusApprovals, + consensusApprovalsVotingPowerPercentage, +}: ProtocolUpdateProposalDetailApprovalsProps) => { + const { t } = useTranslation(); + + return ( + <> +
    + + + + + {`${consensusApprovalsVotingPowerPercentage} ${t( + 'approval (% validator voting power)' + )}`} + ({t('67% voting power required')}) + + + +
    + +
    + + + + +
    {t('validator')}
    +
    {t('votingPower')}
    +
    + + {consensusApprovals.map((validator, index) => ( + +
    + +
    + + + {getNormalisedVotingPower( + validator.rankingScore.votingPower, + 2 + )} + +
    + ))} +
    +
    +
    + + ); +}; diff --git a/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-approvals/protocol-upgrade-proposal-detail-approvals.spec.tsx b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-approvals/protocol-upgrade-proposal-detail-approvals.spec.tsx new file mode 100644 index 000000000..a5c72b750 --- /dev/null +++ b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-approvals/protocol-upgrade-proposal-detail-approvals.spec.tsx @@ -0,0 +1,86 @@ +import { render, screen } from '@testing-library/react'; +import { BrowserRouter } from 'react-router-dom'; +import * as Schema from '@vegaprotocol/types'; +import { ProtocolUpdateProposalDetailApprovals } from './protocol-update-proposal-detail-approvals'; +import { getNormalisedVotingPower } from '../../../staking/shared'; +import type { ProtocolUpdateProposalDetailApprovalsProps } from './protocol-update-proposal-detail-approvals'; +import type { NodesFragmentFragment } from '../../../staking/home/__generated__/Nodes'; + +describe('ProtocolUpdateProposalDetailApprovals', () => { + const mockValidators: NodesFragmentFragment[] = [ + { + id: 'ccc022b7e63a4d0a6d3a193c3940c88574060e58a184964c994998d86835a1b4', + name: 'Marvin', + avatarUrl: + 'https://upload.wikimedia.org/wikipedia/en/2/25/Marvin-TV-3.jpg', + pubkey: + '6abc23391a9f888ab240415bf63d6844b03fc360be822f4a1d2cd832d87b2917', + stakedTotal: '14182454495731682635157', + stakedByOperator: '1000000000000000000000', + stakedByDelegates: '13182454495731682635157', + pendingStake: '0', + rankingScore: { + rankingScore: '0.67845061012234727427532760837568', + stakeScore: '0.3392701644525644', + performanceScore: '0.9998677767864936', + votingPower: '3500', + status: Schema.ValidatorStatus.VALIDATOR_NODE_STATUS_TENDERMINT, + __typename: 'RankingScore', + }, + __typename: 'Node', + }, + ]; + + const defaultProps = { + totalConsensusValidators: 3, + consensusApprovals: mockValidators, + consensusApprovalsVotingPowerPercentage: '75%', + }; + + const renderComponent = ( + props: Partial = {} + ) => { + const mergedProps = { + ...defaultProps, + ...props, + }; + return render( + + + + ); + }; + + it('renders without crashing', () => { + renderComponent(); + expect( + screen.getByTestId('protocol-upgrade-approval-status') + ).toBeInTheDocument(); + expect( + screen.getByTestId('protocol-upgrade-approvers') + ).toBeInTheDocument(); + }); + + it('renders the correct number of consensus approvers', () => { + renderComponent(); + const validators = screen.getAllByTestId(/validator-name/); + expect(validators.length).toBe(mockValidators.length); + }); + + it('renders the correct approval status with the required percentage', () => { + renderComponent(); + expect(screen.getByText(/75% approval/i)).toBeInTheDocument(); + expect(screen.getByText(/67% voting power required/i)).toBeInTheDocument(); + }); + + it('renders the correct voting power for each validator', () => { + renderComponent(); + mockValidators.forEach((validator) => { + const normalisedVotingPower = getNormalisedVotingPower( + validator.rankingScore.votingPower, + 2 + ); + expect(screen.getByText(normalisedVotingPower)).toBeInTheDocument(); + }); + }); +}); diff --git a/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-header/index.tsx b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-header/index.tsx new file mode 100644 index 000000000..8ad369de8 --- /dev/null +++ b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-header/index.tsx @@ -0,0 +1 @@ +export * from './protocol-upgrade-proposal-detail-header'; diff --git a/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-header/protocol-upgrade-proposal-detail-header.spec.tsx b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-header/protocol-upgrade-proposal-detail-header.spec.tsx new file mode 100644 index 000000000..2d7f8e978 --- /dev/null +++ b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-header/protocol-upgrade-proposal-detail-header.spec.tsx @@ -0,0 +1,18 @@ +import { render } from '@testing-library/react'; +import { ProtocolUpgradeProposalDetailHeader } from './protocol-upgrade-proposal-detail-header'; + +describe('ProtocolUpgradeProposalDetailHeader', () => { + it('should render successfully', () => { + const { baseElement } = render( + + ); + expect(baseElement).toBeTruthy(); + }); + + it('should render the release tag', () => { + const { getByText } = render( + + ); + expect(getByText('Vega Release v1.0.0')).toBeTruthy(); + }); +}); diff --git a/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-header/protocol-upgrade-proposal-detail-header.tsx b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-header/protocol-upgrade-proposal-detail-header.tsx new file mode 100644 index 000000000..c788bd751 --- /dev/null +++ b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-header/protocol-upgrade-proposal-detail-header.tsx @@ -0,0 +1,21 @@ +import { useTranslation } from 'react-i18next'; +import { Intent, Lozenge } from '@vegaprotocol/ui-toolkit'; +import { Heading } from '../../../../components/heading'; + +export interface ProtocolUpgradeProposalDetailHeaderProps { + releaseTag: string; +} + +export const ProtocolUpgradeProposalDetailHeader = ({ + releaseTag, +}: ProtocolUpgradeProposalDetailHeaderProps) => { + const { t } = useTranslation(); + return ( + <> + +
    + {t('networkUpgrade')} +
    + + ); +}; diff --git a/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-info/index.tsx b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-info/index.tsx new file mode 100644 index 000000000..ea34734b2 --- /dev/null +++ b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-info/index.tsx @@ -0,0 +1 @@ +export * from './protocol-upgrade-proposal-detail-info'; diff --git a/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-info/protocol-upgrade-proposal-detail-info.spec.tsx b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-info/protocol-upgrade-proposal-detail-info.spec.tsx new file mode 100644 index 000000000..2ec6b2f65 --- /dev/null +++ b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-info/protocol-upgrade-proposal-detail-info.spec.tsx @@ -0,0 +1,44 @@ +// jest tests for the protocol upgrade proposal detail info component + +import { render } from '@testing-library/react'; +import { ProtocolUpgradeProposalStatus } from '@vegaprotocol/types'; +import { ProtocolUpgradeProposalDetailInfo } from './protocol-upgrade-proposal-detail-info'; + +const renderComponent = () => + render( + + ); + +describe('ProtocolUpgradeProposalDetailInfo', () => { + it('should render successfully', () => { + const { baseElement } = renderComponent(); + expect(baseElement).toBeTruthy(); + }); + + it('should render the upgrade block height', () => { + const { getByTestId } = renderComponent(); + expect(getByTestId('protocol-upgrade-block-height')).toHaveTextContent( + '12345' + ); + }); + + it('should render the state', () => { + const { getByTestId } = renderComponent(); + expect(getByTestId('protocol-upgrade-state')).toHaveTextContent('Pending'); + }); + + it('should render the vega release tag', () => { + const { getByTestId } = renderComponent(); + expect(getByTestId('protocol-upgrade-release-tag')).toHaveTextContent( + 'v0.1.234' + ); + }); +}); diff --git a/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-info/protocol-upgrade-proposal-detail-info.tsx b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-info/protocol-upgrade-proposal-detail-info.tsx new file mode 100644 index 000000000..3aace79fd --- /dev/null +++ b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposal-detail-info/protocol-upgrade-proposal-detail-info.tsx @@ -0,0 +1,58 @@ +import { useTranslation } from 'react-i18next'; +import { + KeyValueTable, + KeyValueTableRow, + RoundedWrapper, +} from '@vegaprotocol/ui-toolkit'; +import { SubHeading } from '../../../../components/heading'; +import type { ProtocolUpgradeProposalFieldsFragment } from '../../protocol-upgrade/__generated__/ProtocolUpgradeProposals'; + +export interface ProtocolUpgradeProposalDetailInfoProps { + proposal: ProtocolUpgradeProposalFieldsFragment; + lastBlockHeight?: string; +} + +export const ProtocolUpgradeProposalDetailInfo = ({ + proposal, + lastBlockHeight, +}: ProtocolUpgradeProposalDetailInfoProps) => { + const { t } = useTranslation(); + + return ( +
    + + + + + {t('upgradeBlockHeight')} + + + {proposal.upgradeBlockHeight}{' '} + {lastBlockHeight && ( + <> + ({t('currently')} {lastBlockHeight}) + + )} + + + + + {t('state')} + + + {t(`${proposal.status}`)} + + + + + {t('vegaReleaseTag')} + + + {proposal.vegaReleaseTag} + + + + +
    + ); +}; diff --git a/apps/governance/src/routes/proposals/components/protocol-upgrade-proposals-list-item/protocol-upgrade-proposals-list-item.spec.tsx b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposals-list-item/protocol-upgrade-proposals-list-item.spec.tsx new file mode 100644 index 000000000..65b78c073 --- /dev/null +++ b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposals-list-item/protocol-upgrade-proposals-list-item.spec.tsx @@ -0,0 +1,69 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import { BrowserRouter } from 'react-router-dom'; +import { ProtocolUpgradeProposalsListItem } from './protocol-upgrade-proposals-list-item'; +import { ProtocolUpgradeProposalStatus } from '@vegaprotocol/types'; +import type { ProtocolUpgradeProposalFieldsFragment } from '../../protocol-upgrade/__generated__/ProtocolUpgradeProposals'; + +const proposal = { + status: + ProtocolUpgradeProposalStatus.PROTOCOL_UPGRADE_PROPOSAL_STATUS_PENDING, + vegaReleaseTag: 'v1.0.0', + upgradeBlockHeight: '12345', +} as ProtocolUpgradeProposalFieldsFragment; + +const renderComponent = (proposal: ProtocolUpgradeProposalFieldsFragment) => + render( + + + + ); + +describe('ProtocolUpgradeProposalsListItem', () => { + it('renders the correct status icon for each proposal status', () => { + const statuses = [ + { + status: + ProtocolUpgradeProposalStatus.PROTOCOL_UPGRADE_PROPOSAL_STATUS_REJECTED, + icon: 'protocol-upgrade-proposal-status-icon-rejected', + }, + { + status: + ProtocolUpgradeProposalStatus.PROTOCOL_UPGRADE_PROPOSAL_STATUS_PENDING, + icon: 'protocol-upgrade-proposal-status-icon-pending', + }, + { + status: + ProtocolUpgradeProposalStatus.PROTOCOL_UPGRADE_PROPOSAL_STATUS_APPROVED, + icon: 'protocol-upgrade-proposal-status-icon-approved', + }, + { + status: + ProtocolUpgradeProposalStatus.PROTOCOL_UPGRADE_PROPOSAL_STATUS_UNSPECIFIED, + icon: 'protocol-upgrade-proposal-status-icon-unspecified', + }, + ]; + + statuses.forEach(({ status, icon }) => { + renderComponent({ ...proposal, status }); + const statusIcon = screen.getByTestId(icon); + expect(statusIcon).toBeInTheDocument(); + }); + }); + + it('renders the correct Vega release tag', () => { + renderComponent(proposal); + const releaseTag = screen.getByTestId( + 'protocol-upgrade-proposal-release-tag' + ); + expect(releaseTag).toHaveTextContent(proposal.vegaReleaseTag); + }); + + it('renders the correct upgrade block height', () => { + renderComponent(proposal); + const blockHeight = screen.getByTestId( + 'protocol-upgrade-proposal-block-height' + ); + expect(blockHeight).toHaveTextContent(proposal.upgradeBlockHeight); + }); +}); diff --git a/apps/governance/src/routes/proposals/components/protocol-upgrade-proposals-list-item/protocol-upgrade-proposals-list-item.tsx b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposals-list-item/protocol-upgrade-proposals-list-item.tsx new file mode 100644 index 000000000..c4be5acda --- /dev/null +++ b/apps/governance/src/routes/proposals/components/protocol-upgrade-proposals-list-item/protocol-upgrade-proposals-list-item.tsx @@ -0,0 +1,124 @@ +import { useTranslation } from 'react-i18next'; +import { Link } from 'react-router-dom'; +import { + Button, + Icon, + Intent, + Lozenge, + RoundedWrapper, +} from '@vegaprotocol/ui-toolkit'; +import { stripFullStops } from '@vegaprotocol/utils'; +import { ProtocolUpgradeProposalStatus } from '@vegaprotocol/types'; +import { SubHeading } from '../../../../components/heading'; +import type { ReactNode } from 'react'; +import type { ProtocolUpgradeProposalFieldsFragment } from '../../protocol-upgrade/__generated__/ProtocolUpgradeProposals'; +import Routes from '../../../routes'; + +interface ProtocolProposalsListItemProps { + proposal: ProtocolUpgradeProposalFieldsFragment; +} + +export const ProtocolUpgradeProposalsListItem = ({ + proposal, +}: ProtocolProposalsListItemProps) => { + const { t } = useTranslation(); + if (!proposal || !proposal.upgradeBlockHeight) return null; + + let proposalStatusIcon: ReactNode; + + switch (proposal.status) { + case ProtocolUpgradeProposalStatus.PROTOCOL_UPGRADE_PROPOSAL_STATUS_REJECTED: + proposalStatusIcon = ( +
    + +
    + ); + break; + case ProtocolUpgradeProposalStatus.PROTOCOL_UPGRADE_PROPOSAL_STATUS_PENDING: + proposalStatusIcon = ( +
    + +
    + ); + break; + case ProtocolUpgradeProposalStatus.PROTOCOL_UPGRADE_PROPOSAL_STATUS_APPROVED: + proposalStatusIcon = ( +
    + +
    + ); + break; + case ProtocolUpgradeProposalStatus.PROTOCOL_UPGRADE_PROPOSAL_STATUS_UNSPECIFIED: + proposalStatusIcon = ( +
    + +
    + ); + break; + } + + return ( +
  • + +
    + +
    + +
    +
    + {t('networkUpgrade')} +
    + +
    + {t('vegaReleaseTag')} + {proposal.vegaReleaseTag} +
    + +
    + {t('upgradeBlockHeight')} + {proposal.upgradeBlockHeight} +
    + +
    +
    +
    + {t(`${proposal.status}`)} + {proposalStatusIcon} +
    +
    + +
    + + + +
    +
    +
    +
    +
  • + ); +}; diff --git a/apps/governance/src/routes/proposals/proposals/proposals-container.tsx b/apps/governance/src/routes/proposals/proposals/proposals-container.tsx index 5bc93df4e..4a92bd5d9 100644 --- a/apps/governance/src/routes/proposals/proposals/proposals-container.tsx +++ b/apps/governance/src/routes/proposals/proposals/proposals-container.tsx @@ -5,13 +5,18 @@ import { useTranslation } from 'react-i18next'; import { SplashLoader } from '../../../components/splash-loader'; import { ProposalsList } from '../components/proposals-list'; import { useProposalsQuery } from './__generated__/Proposals'; -import type { ProposalFieldsFragment } from './__generated__/Proposals'; -import type { NodeConnection, NodeEdge } from '@vegaprotocol/utils'; import { getNodes } from '@vegaprotocol/utils'; import flow from 'lodash/flow'; -import { ProposalState } from '@vegaprotocol/types'; +import { + ProposalState, + ProtocolUpgradeProposalStatus, +} from '@vegaprotocol/types'; +import type { NodeConnection, NodeEdge } from '@vegaprotocol/utils'; +import type { ProposalFieldsFragment } from './__generated__/Proposals'; +import type { ProtocolUpgradeProposalFieldsFragment } from '../protocol-upgrade/__generated__/ProtocolUpgradeProposals'; import orderBy from 'lodash/orderBy'; +import { useProtocolUpgradesQuery } from '../protocol-upgrade/__generated__/ProtocolUpgradeProposals'; const orderByDate = (arr: ProposalFieldsFragment[]) => orderBy( @@ -20,6 +25,15 @@ const orderByDate = (arr: ProposalFieldsFragment[]) => ['desc', 'desc'] ); +const orderByUpgradeBlockHeight = ( + arr: ProtocolUpgradeProposalFieldsFragment[] +) => + orderBy( + arr, + [(p) => p?.upgradeBlockHeight, (p) => p.vegaReleaseTag], + ['desc', 'desc'] + ); + export function getNotRejectedProposals( data?: NodeConnection> | null ): T[] { @@ -32,6 +46,21 @@ export function getNotRejectedProposals( ])(data); } +export function getNotRejectedProtocolUpgradeProposals< + T extends ProtocolUpgradeProposalFieldsFragment +>(data?: NodeConnection> | null): T[] { + return flow([ + (data) => + getNodes(data, (p) => + p + ? p.status !== + ProtocolUpgradeProposalStatus.PROTOCOL_UPGRADE_PROPOSAL_STATUS_REJECTED + : false + ), + orderByUpgradeBlockHeight, + ])(data); +} + export const ProposalsContainer = () => { const { t } = useTranslation(); const { data, loading, error } = useProposalsQuery({ @@ -40,6 +69,16 @@ export const ProposalsContainer = () => { errorPolicy: 'ignore', }); + const { + data: protocolUpgradesData, + loading: protocolUpgradesLoading, + error: protocolUpgradesError, + } = useProtocolUpgradesQuery({ + pollInterval: 5000, + fetchPolicy: 'network-only', + errorPolicy: 'ignore', + }); + const proposals = useMemo( () => getNotRejectedProposals( @@ -48,15 +87,25 @@ export const ProposalsContainer = () => { [data] ); - if (error) { + const protocolUpgradeProposals = useMemo( + () => + protocolUpgradesData + ? getNotRejectedProtocolUpgradeProposals( + protocolUpgradesData.protocolUpgradeProposals + ) + : [], + [protocolUpgradesData] + ); + + if (error || protocolUpgradesError) { return ( -
    {error.message}
    +
    {error?.message || protocolUpgradesError?.message}
    ); } - if (loading) { + if (loading || protocolUpgradesLoading) { return ( @@ -64,5 +113,11 @@ export const ProposalsContainer = () => { ); } - return ; + return ( + + ); }; diff --git a/apps/governance/src/routes/proposals/protocol-upgrade/ProtocolUpgradeProposals.graphql b/apps/governance/src/routes/proposals/protocol-upgrade/ProtocolUpgradeProposals.graphql new file mode 100644 index 000000000..35959a69f --- /dev/null +++ b/apps/governance/src/routes/proposals/protocol-upgrade/ProtocolUpgradeProposals.graphql @@ -0,0 +1,17 @@ +fragment ProtocolUpgradeProposalFields on ProtocolUpgradeProposal { + upgradeBlockHeight + vegaReleaseTag + approvers + status +} + +query ProtocolUpgrades { + lastBlockHeight + protocolUpgradeProposals { + edges { + node { + ...ProtocolUpgradeProposalFields + } + } + } +} diff --git a/apps/governance/src/routes/proposals/protocol-upgrade/__generated__/ProtocolUpgradeProposals.ts b/apps/governance/src/routes/proposals/protocol-upgrade/__generated__/ProtocolUpgradeProposals.ts new file mode 100644 index 000000000..ef5f9928f --- /dev/null +++ b/apps/governance/src/routes/proposals/protocol-upgrade/__generated__/ProtocolUpgradeProposals.ts @@ -0,0 +1,59 @@ +import * as Types from '@vegaprotocol/types'; + +import { gql } from '@apollo/client'; +import * as Apollo from '@apollo/client'; +const defaultOptions = {} as const; +export type ProtocolUpgradeProposalFieldsFragment = { __typename?: 'ProtocolUpgradeProposal', upgradeBlockHeight: string, vegaReleaseTag: string, approvers: Array, status: Types.ProtocolUpgradeProposalStatus }; + +export type ProtocolUpgradesQueryVariables = Types.Exact<{ [key: string]: never; }>; + + +export type ProtocolUpgradesQuery = { __typename?: 'Query', lastBlockHeight: string, protocolUpgradeProposals?: { __typename?: 'ProtocolUpgradeProposalConnection', edges?: Array<{ __typename?: 'ProtocolUpgradeProposalEdge', node: { __typename?: 'ProtocolUpgradeProposal', upgradeBlockHeight: string, vegaReleaseTag: string, approvers: Array, status: Types.ProtocolUpgradeProposalStatus } }> | null } | null }; + +export const ProtocolUpgradeProposalFieldsFragmentDoc = gql` + fragment ProtocolUpgradeProposalFields on ProtocolUpgradeProposal { + upgradeBlockHeight + vegaReleaseTag + approvers + status +} + `; +export const ProtocolUpgradesDocument = gql` + query ProtocolUpgrades { + lastBlockHeight + protocolUpgradeProposals { + edges { + node { + ...ProtocolUpgradeProposalFields + } + } + } +} + ${ProtocolUpgradeProposalFieldsFragmentDoc}`; + +/** + * __useProtocolUpgradesQuery__ + * + * To run a query within a React component, call `useProtocolUpgradesQuery` and pass it any options that fit your needs. + * When your component renders, `useProtocolUpgradesQuery` returns an object from Apollo Client that contains loading, error, and data properties + * you can use to render your UI. + * + * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options; + * + * @example + * const { data, loading, error } = useProtocolUpgradesQuery({ + * variables: { + * }, + * }); + */ +export function useProtocolUpgradesQuery(baseOptions?: Apollo.QueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useQuery(ProtocolUpgradesDocument, options); + } +export function useProtocolUpgradesLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useLazyQuery(ProtocolUpgradesDocument, options); + } +export type ProtocolUpgradesQueryHookResult = ReturnType; +export type ProtocolUpgradesLazyQueryHookResult = ReturnType; +export type ProtocolUpgradesQueryResult = Apollo.QueryResult; \ No newline at end of file diff --git a/apps/governance/src/routes/proposals/protocol-upgrade/index.tsx b/apps/governance/src/routes/proposals/protocol-upgrade/index.tsx new file mode 100644 index 000000000..75513a25b --- /dev/null +++ b/apps/governance/src/routes/proposals/protocol-upgrade/index.tsx @@ -0,0 +1 @@ +export { ProtocolUpgradeProposalContainer as default } from './protocol-upgrade-proposal-container'; diff --git a/apps/governance/src/routes/proposals/protocol-upgrade/protocol-upgrade-proposal-container.tsx b/apps/governance/src/routes/proposals/protocol-upgrade/protocol-upgrade-proposal-container.tsx new file mode 100644 index 000000000..72b54e039 --- /dev/null +++ b/apps/governance/src/routes/proposals/protocol-upgrade/protocol-upgrade-proposal-container.tsx @@ -0,0 +1,78 @@ +import { useEffect, useMemo } from 'react'; +import { useParams } from 'react-router-dom'; +import { AsyncRenderer } from '@vegaprotocol/ui-toolkit'; +import { removePaginationWrapper, stripFullStops } from '@vegaprotocol/utils'; +import * as Schema from '@vegaprotocol/types'; + +import { ProtocolUpgradeProposal } from './protocol-upgrade-proposal'; +import { ProposalNotFound } from '../components/proposal-not-found'; +import { useProtocolUpgradesQuery } from './__generated__/ProtocolUpgradeProposals'; +import { useNodesQuery } from '../../staking/home/__generated__/Nodes'; +import { useRefreshAfterEpoch } from '../../../hooks/use-refresh-after-epoch'; + +export const ProtocolUpgradeProposalContainer = () => { + const params = useParams<{ proposalReleaseTag: string }>(); + + const { data, loading, error, refetch } = useProtocolUpgradesQuery({ + fetchPolicy: 'network-only', + errorPolicy: 'ignore', + skip: !params.proposalReleaseTag, + }); + + useEffect(() => { + const interval = setInterval(refetch, 1000); + return () => clearInterval(interval); + }, [refetch]); + + const { + data: nodesData, + error: nodesError, + loading: nodesLoading, + refetch: nodesRefetch, + } = useNodesQuery(); + + useRefreshAfterEpoch(nodesData?.epoch.timestamps.expiry, nodesRefetch); + + const protocolUpgradeProposal = useMemo(() => { + if (!data?.protocolUpgradeProposals) return null; + + const proposals = removePaginationWrapper( + data.protocolUpgradeProposals.edges + ); + + return proposals.find( + ({ vegaReleaseTag }) => + params.proposalReleaseTag && + params.proposalReleaseTag === stripFullStops(vegaReleaseTag) + ); + }, [data, params.proposalReleaseTag]); + + const consensusValidators = useMemo(() => { + if (!nodesData?.nodesConnection.edges) return null; + + const nodes = removePaginationWrapper(nodesData.nodesConnection.edges); + + return nodes.filter( + ({ rankingScore: { status } }) => + status === Schema.ValidatorStatus.VALIDATOR_NODE_STATUS_TENDERMINT + ); + }, [nodesData]); + + return ( + + {protocolUpgradeProposal ? ( + + ) : ( + + )} + + ); +}; diff --git a/apps/governance/src/routes/proposals/protocol-upgrade/protocol-upgrade-proposal.spec.tsx b/apps/governance/src/routes/proposals/protocol-upgrade/protocol-upgrade-proposal.spec.tsx new file mode 100644 index 000000000..8e59e8b0d --- /dev/null +++ b/apps/governance/src/routes/proposals/protocol-upgrade/protocol-upgrade-proposal.spec.tsx @@ -0,0 +1,134 @@ +import { render } from '@testing-library/react'; +import * as Schema from '@vegaprotocol/types'; +import { + ProtocolUpgradeProposal, + getConsensusApprovals, + getConsensusApprovalsVotingPower, + getConsensusApprovalsVotingPowerPercentage, +} from './protocol-upgrade-proposal'; +import { ProtocolUpgradeProposalStatus } from '@vegaprotocol/types'; +import { getNormalisedVotingPower } from '../../staking/shared'; +import type { NodesFragmentFragment } from '../../staking/home/__generated__/Nodes'; +import type { ProtocolUpgradeProposalFieldsFragment } from './__generated__/ProtocolUpgradeProposals'; + +const mockProposal: ProtocolUpgradeProposalFieldsFragment = { + vegaReleaseTag: 'v0.1.234', + status: + ProtocolUpgradeProposalStatus.PROTOCOL_UPGRADE_PROPOSAL_STATUS_PENDING, + upgradeBlockHeight: '12345', + approvers: [], +}; + +const mockConsensusValidators: NodesFragmentFragment[] = [ + { + id: 'ccc022b7e63a4d0a6d3a193c3940c88574060e58a184964c994998d86835a1b4', + name: 'Marvin', + avatarUrl: 'https://upload.wikimedia.org/wikipedia/en/2/25/Marvin-TV-3.jpg', + pubkey: '6abc23391a9f888ab240415bf63d6844b03fc360be822f4a1d2cd832d87b2917', + stakedTotal: '14182454495731682635157', + stakedByOperator: '1000000000000000000000', + stakedByDelegates: '13182454495731682635157', + pendingStake: '0', + rankingScore: { + rankingScore: '0.67845061012234727427532760837568', + stakeScore: '0.3392701644525644', + performanceScore: '0.9998677767864936', + votingPower: '3500', + status: Schema.ValidatorStatus.VALIDATOR_NODE_STATUS_TENDERMINT, + __typename: 'RankingScore', + }, + __typename: 'Node', + }, + { + id: 'ccc022b7e63a4d0a6d3a193c3940c88574060e58a184964c994998d86835a1b5', + name: 'Barvin', + avatarUrl: 'https://upload.wikimedia.org/wikipedia/en/2/25/Barvin-TV-3.jpg', + pubkey: '6abc23391a9f888ab240415bf63d6844b03fc360be822f4a1d2cd832d87b291b', + stakedTotal: '1418245449573168263', + stakedByOperator: '100000000000000000', + stakedByDelegates: '1318245449573168263', + pendingStake: '0', + rankingScore: { + rankingScore: '0.5', + stakeScore: '0.3', + performanceScore: '0.98', + votingPower: '2500', + status: Schema.ValidatorStatus.VALIDATOR_NODE_STATUS_TENDERMINT, + __typename: 'RankingScore', + }, + __typename: 'Node', + }, +]; + +const renderComponent = () => + render( + + ); + +describe('ProtocolUpgradeProposal', () => { + it('should render successfully', () => { + const { baseElement } = renderComponent(); + expect(baseElement).toBeTruthy(); + }); +}); + +describe('getConsensusApprovals', () => { + it('returns an empty array when there are no matching approvers', () => { + const result = getConsensusApprovals(mockConsensusValidators, { + ...mockProposal, + approvers: [], + }); + expect(result).toEqual([]); + }); + + it('returns the correct consensus approvals when there are matching approvers', () => { + const expectedApprovals = mockConsensusValidators[1]; + + const result = getConsensusApprovals(mockConsensusValidators, { + ...mockProposal, + approvers: [ + '6abc23391a9f888ab240415bf63d6844b03fc360be822f4a1d2cd832d87b291b', + ], + }); + + expect(result.length).toEqual(1); + expect(result[0].id).toEqual(expectedApprovals.id); + }); +}); + +describe('getConsensusApprovalsVotingPower', () => { + it('returns 0 when the input array is empty', () => { + const result = getConsensusApprovalsVotingPower([]); + expect(result).toBe(0); + }); + + it('returns the correct sum of voting power for a given array of consensus validators', () => { + const expectedSum = mockConsensusValidators.reduce( + (acc, curr) => acc + Number(curr.rankingScore.votingPower), + 0 + ); + + const result = getConsensusApprovalsVotingPower(mockConsensusValidators); + expect(result).toBe(expectedSum); + }); +}); + +describe('getConsensusApprovalsVotingPowerPercentage', () => { + it('returns "0%" when the input value is 0 or less', () => { + const resultZero = getConsensusApprovalsVotingPowerPercentage(0); + const resultNegative = getConsensusApprovalsVotingPowerPercentage(-10); + expect(resultZero).toBe('0%'); + expect(resultNegative).toBe('0%'); + }); + + it('returns the correct percentage string when the input value is greater than 0', () => { + const inputValue = 12345; + const expectedPercentage = getNormalisedVotingPower( + inputValue.toString(), + 2 + ); + + const result = getConsensusApprovalsVotingPowerPercentage(inputValue); + expect(result).toBe(expectedPercentage); + }); +}); diff --git a/apps/governance/src/routes/proposals/protocol-upgrade/protocol-upgrade-proposal.tsx b/apps/governance/src/routes/proposals/protocol-upgrade/protocol-upgrade-proposal.tsx new file mode 100644 index 000000000..6610a17ab --- /dev/null +++ b/apps/governance/src/routes/proposals/protocol-upgrade/protocol-upgrade-proposal.tsx @@ -0,0 +1,83 @@ +import { useMemo } from 'react'; +import { ProtocolUpgradeProposalDetailHeader } from '../components/protocol-upgrade-proposal-detail-header'; +import { ProtocolUpdateProposalDetailApprovals } from '../components/protocol-upgrade-proposal-detail-approvals'; +import { ProtocolUpgradeProposalDetailInfo } from '../components/protocol-upgrade-proposal-detail-info'; +import { getNormalisedVotingPower } from '../../staking/shared'; +import type { ProtocolUpgradeProposalFieldsFragment } from './__generated__/ProtocolUpgradeProposals'; +import type { NodesFragmentFragment } from '../../staking/home/__generated__/Nodes'; + +export interface ProtocolUpgradeProposalProps { + proposal: ProtocolUpgradeProposalFieldsFragment; + consensusValidators: NodesFragmentFragment[] | null; + lastBlockHeight?: string; +} + +export const getConsensusApprovals = ( + consensusValidators: NodesFragmentFragment[], + proposal: ProtocolUpgradeProposalFieldsFragment +) => + consensusValidators?.filter(({ pubkey }) => + proposal.approvers?.includes(pubkey) + ); + +export const getConsensusApprovalsVotingPower = ( + consensusValidators: NodesFragmentFragment[] +) => + consensusValidators?.reduce( + (acc: number, curr: NodesFragmentFragment) => { + return acc + Number(curr.rankingScore.votingPower); + }, + 0 + ); + +export const getConsensusApprovalsVotingPowerPercentage = ( + consensusApprovalsVotingPower: number +) => + consensusApprovalsVotingPower > 0 + ? getNormalisedVotingPower(consensusApprovalsVotingPower.toString(), 2) + : '0%'; + +export const ProtocolUpgradeProposal = ({ + proposal, + lastBlockHeight, + consensusValidators, +}: ProtocolUpgradeProposalProps) => { + const consensusApprovals = useMemo( + () => getConsensusApprovals(consensusValidators || [], proposal), + [consensusValidators, proposal] + ); + + const consensusApprovalsVotingPower = useMemo( + () => getConsensusApprovalsVotingPower(consensusApprovals || []), + [consensusApprovals] + ); + + const consensusApprovalsVotingPowerPercentage = useMemo( + () => + getConsensusApprovalsVotingPowerPercentage(consensusApprovalsVotingPower), + [consensusApprovalsVotingPower] + ); + + return ( +
    + + + + + {consensusValidators && consensusApprovals && ( + + )} +
    + ); +}; diff --git a/apps/governance/src/routes/router-config.tsx b/apps/governance/src/routes/router-config.tsx index 1d457c761..bbea78836 100644 --- a/apps/governance/src/routes/router-config.tsx +++ b/apps/governance/src/routes/router-config.tsx @@ -109,6 +109,13 @@ const LazyProposal = React.lazy( ) ); +const LazyProtocolUpgradeProposal = React.lazy( + () => + import( + /* webpackChunkName: "route-governance-protocol-upgrade-proposal", webpackPrefetch: true */ './proposals/protocol-upgrade' + ) +); + const LazyProposalsList = React.lazy( () => import( @@ -257,6 +264,10 @@ const routerConfig = [ }, { path: 'proposals', element: }, { path: ':proposalId', element: }, + { + path: 'protocol-upgrade/:proposalReleaseTag', + element: , + }, { path: 'rejected', element: }, ], }, diff --git a/apps/governance/src/routes/staking/node/staking-form.tsx b/apps/governance/src/routes/staking/node/staking-form.tsx index 760486403..012fcaaa0 100644 --- a/apps/governance/src/routes/staking/node/staking-form.tsx +++ b/apps/governance/src/routes/staking/node/staking-form.tsx @@ -13,6 +13,8 @@ import { StakingFormTxStatuses } from './staking-form-tx-statuses'; import { ButtonLink, FormGroup, + Intent, + Notification, Radio, RadioGroup, } from '@vegaprotocol/ui-toolkit'; @@ -29,6 +31,7 @@ import type { DelegateSubmissionBody, UndelegateSubmissionBody, } from '@vegaprotocol/wallet'; +import Routes from '../../routes'; export enum FormState { Default, @@ -191,51 +194,65 @@ export const StakingForm = ({ }, [isDialogVisible]); return ( - <> +
    {formState === FormState.Default && availableStakeToAdd.isEqualTo(0) && availableStakeToRemove.isEqualTo(0) && (
    {lien.isGreaterThan(0) ? ( - - {t('stakeNodeWrongVegaKey')} - + ) : ( - {t('stakeNodeNone')} + navigate(Routes.ASSOCIATE), + className: 'py-1', + size: 'sm', + }} + /> )}
    )} - - { - // @ts-ignore value does exist on target - setAction(value); - navigate(`?action=${value}`, { - replace: true, - }); - }} - value={action} + +
    + - - - - + { + // @ts-ignore value does exist on target + setAction(value); + navigate(`?action=${value}`, { + replace: true, + }); + }} + value={action} + > + + + + +
    + {action !== undefined && ( // eslint-disable-next-line <> @@ -314,6 +331,6 @@ export const StakingForm = ({ toggleDialog={toggleDialog} error={error} /> - +
    ); }; diff --git a/apps/governance/src/routes/staking/shared.ts b/apps/governance/src/routes/staking/shared.ts index 165c4b30d..f869dce1a 100644 --- a/apps/governance/src/routes/staking/shared.ts +++ b/apps/governance/src/routes/staking/shared.ts @@ -20,8 +20,8 @@ export const getLastEpochScoreAndPerformance = ( }; }; -export const getNormalisedVotingPower = (votingPower: string) => - formatNumberPercentage(new BigNumber(votingPower).dividedBy(100), 2); +export const getNormalisedVotingPower = (votingPower: string, decimals = 2) => + formatNumberPercentage(new BigNumber(votingPower).dividedBy(100), decimals); export const getUnnormalisedVotingPower = ( validatorScore: string | null | undefined diff --git a/apps/multisig-signer/.env b/apps/multisig-signer/.env index 11619d228..d8cae4d67 100644 --- a/apps/multisig-signer/.env +++ b/apps/multisig-signer/.env @@ -2,4 +2,4 @@ NX_VEGA_URL=https://api.stagnet3.vega.xyz/graphql NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/stagnet3/vegawallet-stagnet3.toml NX_VEGA_NETWORKS='{"TESTNET":"https://multisig-signer.fairground.wtf","MAINNET":"https://multisig-signer.vega.xyz"}' NX_VEGA_ENV=STAGNET3 - +NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72 diff --git a/apps/multisig-signer/src/app/app.tsx b/apps/multisig-signer/src/app/app.tsx index d5dfc7bb5..2b7705929 100644 --- a/apps/multisig-signer/src/app/app.tsx +++ b/apps/multisig-signer/src/app/app.tsx @@ -9,6 +9,7 @@ import { } from '@vegaprotocol/environment'; import { AsyncRenderer, Button, Lozenge } from '@vegaprotocol/ui-toolkit'; import type { EthereumConfig } from '@vegaprotocol/web3'; +import { useWeb3Disconnect } from '@vegaprotocol/web3'; import { useEthereumConfig, Web3Provider } from '@vegaprotocol/web3'; import { t } from '@vegaprotocol/i18n'; import { ENV } from './config/env'; @@ -34,6 +35,7 @@ const pageWrapperClasses = classnames( const ConnectedApp = ({ config }: { config: EthereumConfig | null }) => { const { account, connector } = useWeb3React(); + const disconnect = useWeb3Disconnect(connector); return (

    {t('Multisig signer')}

    @@ -41,7 +43,7 @@ const ConnectedApp = ({ config }: { config: EthereumConfig | null }) => {

    Connected to Eth wallet: {account}

    - +

    {t('Add or remove signer')}

    diff --git a/apps/multisig-signer/src/app/components/web3-connector/web3-connector.tsx b/apps/multisig-signer/src/app/components/web3-connector/web3-connector.tsx index d02e3ead1..1c43b08c2 100644 --- a/apps/multisig-signer/src/app/components/web3-connector/web3-connector.tsx +++ b/apps/multisig-signer/src/app/components/web3-connector/web3-connector.tsx @@ -1,5 +1,10 @@ import { useEnvironment } from '@vegaprotocol/environment'; -import { getChainName, useEthereumConfig } from '@vegaprotocol/web3'; +import { + getChainName, + useEthereumConfig, + useWeb3ConnectStore, + useWeb3Disconnect, +} from '@vegaprotocol/web3'; import { Button, Splash, AsyncRenderer } from '@vegaprotocol/ui-toolkit'; import { Web3ConnectDialog } from '@vegaprotocol/web3'; import { useWeb3React } from '@web3-react/core'; @@ -55,7 +60,9 @@ export const Web3Content = ({ appChainId, setDialogOpen, }: Web3ContentProps) => { - const { error, connector, chainId } = useWeb3React(); + const { connector, chainId } = useWeb3React(); + const error = useWeb3ConnectStore((store) => store.error); + const disconnect = useWeb3Disconnect(connector); useEffect(() => { if (connector?.connectEagerly) { @@ -71,7 +78,7 @@ export const Web3Content = ({

    Something went wrong: {error.message}

    - +
    ); @@ -84,7 +91,7 @@ export const Web3Content = ({

    This app only works on {getChainName(appChainId)}

    - + ); diff --git a/apps/multisig-signer/src/app/lib/web3-connectors.ts b/apps/multisig-signer/src/app/lib/web3-connectors.ts index d8490f351..48fb8b1eb 100644 --- a/apps/multisig-signer/src/app/lib/web3-connectors.ts +++ b/apps/multisig-signer/src/app/lib/web3-connectors.ts @@ -1,13 +1,13 @@ import { ethers } from 'ethers'; import type { Web3ReactHooks } from '@web3-react/core'; -import { initializeConnector } from '@web3-react/core'; -import { MetaMask } from '@web3-react/metamask'; -import { WalletConnect } from '@web3-react/walletconnect'; import type { Connector } from '@web3-react/types'; - -const [metamask, metamaskHooks] = initializeConnector( - (actions) => new MetaMask(actions) -); +import { + WALLETCONNECT_PROJECT_ID, + initializeCoinbaseConnector, + initializeMetaMaskConnector, + initializeWalletConnectLegacyConnector, + initializeWalletConnector, +} from '@vegaprotocol/web3'; export const createDefaultProvider = (providerUrl: string, chainId: number) => { return new ethers.providers.JsonRpcProvider(providerUrl, chainId); @@ -17,18 +17,11 @@ export const createConnectors = (providerUrl: string, chainId: number) => { if (isNaN(chainId)) { throw new Error('Invalid Ethereum chain ID for environment'); } - const [walletconnect, walletconnectHooks] = - initializeConnector( - (actions) => - new WalletConnect(actions, { - rpc: { - [chainId]: providerUrl, - }, - }), - [chainId] - ); + return [ - [metamask, metamaskHooks], - [walletconnect, walletconnectHooks], - ] as [Connector, Web3ReactHooks][]; + initializeMetaMaskConnector(), + initializeCoinbaseConnector(providerUrl), + initializeWalletConnector(WALLETCONNECT_PROJECT_ID, chainId, providerUrl), + initializeWalletConnectLegacyConnector(chainId, providerUrl), + ].filter(Boolean) as unknown as [Connector, Web3ReactHooks][]; }; diff --git a/apps/static/src/assets/mainnet-tranches.json b/apps/static/src/assets/mainnet-tranches.json index afff2fde6..1f955f888 100644 --- a/apps/static/src/assets/mainnet-tranches.json +++ b/apps/static/src/assets/mainnet-tranches.json @@ -38,7 +38,7 @@ "tranche_end": "2023-05-20T00:00:00.000Z", "total_added": "15761.125", "total_removed": "0", - "locked_amount": "15761.125", + "locked_amount": "14969.1223880690592062625", "deposits": [ { "amount": "241.5", @@ -665,8 +665,8 @@ "tranche_start": "2023-04-06T00:00:00.000Z", "tranche_end": "2023-05-06T00:00:00.000Z", "total_added": "8865", - "total_removed": "362.31015740205", - "locked_amount": "4874.1459548611110345", + "total_removed": "490.11243517665", + "locked_amount": "4282.530329861111133", "deposits": [ { "amount": "33", @@ -825,6 +825,11 @@ "user": "0x6F32AA5A6198329c16e438512F992a0548C856f9", "tx": "0x05d086879e23724f1397d41adcbe2f3316dd4039c240edbc3cbbcacf1ca1d00e" }, + { + "amount": "127.8022777746", + "user": "0x6F32AA5A6198329c16e438512F992a0548C856f9", + "tx": "0xb67468e99866887e95c5a211fe8611d107b02ef094d9b90343820366a5e8c7a0" + }, { "amount": "52.2185023074", "user": "0x6F32AA5A6198329c16e438512F992a0548C856f9", @@ -1050,6 +1055,12 @@ "tranche_id": 54, "tx": "0x05d086879e23724f1397d41adcbe2f3316dd4039c240edbc3cbbcacf1ca1d00e" }, + { + "amount": "127.8022777746", + "user": "0x6F32AA5A6198329c16e438512F992a0548C856f9", + "tranche_id": 54, + "tx": "0xb67468e99866887e95c5a211fe8611d107b02ef094d9b90343820366a5e8c7a0" + }, { "amount": "52.2185023074", "user": "0x6F32AA5A6198329c16e438512F992a0548C856f9", @@ -1058,8 +1069,8 @@ } ], "total_tokens": "858", - "withdrawn_tokens": "296.67303008772", - "remaining_tokens": "561.32696991228" + "withdrawn_tokens": "424.47530786232", + "remaining_tokens": "433.52469213768" }, { "address": "0x0bBf7580e036eA5D69ABe679CC90117EeC2e3dc1", @@ -4407,7 +4418,7 @@ "tranche_end": "2023-12-05T00:00:00.000Z", "total_added": "86666.297", "total_removed": "0", - "locked_amount": "54491.6293588377368963476", + "locked_amount": "54016.2508690146860439521", "deposits": [ { "amount": "86666.297", @@ -4473,7 +4484,7 @@ "tranche_end": "2023-06-01T00:00:00.000Z", "total_added": "2500", "total_removed": "0", - "locked_amount": "583.71664504477005", + "locked_amount": "556.215500356125325", "deposits": [ { "amount": "2500", @@ -4594,7 +4605,7 @@ "tranche_end": "2023-09-01T00:00:00.000Z", "total_added": "17500", "total_removed": "0", - "locked_amount": "12791.60329232085475", + "locked_amount": "12601.1877579005635", "deposits": [ { "amount": "12500", @@ -4861,7 +4872,7 @@ "tranche_end": "2023-08-01T00:00:00.000Z", "total_added": "37500", "total_removed": "12294.731717775", - "locked_amount": "21442.24553023327125", + "locked_amount": "21027.44925951504", "deposits": [ { "amount": "7500", @@ -5225,7 +5236,7 @@ "tranche_end": "2023-12-05T00:00:00.000Z", "total_added": "129999.45", "total_removed": "0", - "locked_amount": "54441.912603447519962385", + "locked_amount": "53966.96783668199177511", "deposits": [ { "amount": "129999.45", @@ -5258,7 +5269,7 @@ "tranche_end": "2024-04-01T00:00:00.000Z", "total_added": "54144.7663", "total_removed": "0", - "locked_amount": "51407.13764596631692808494", + "locked_amount": "51110.95640499238994528285", "deposits": [ { "amount": "54144.7663", @@ -5291,7 +5302,7 @@ "tranche_end": "2023-09-03T00:00:00.000Z", "total_added": "62600", "total_removed": "0", - "locked_amount": "23409.75395104008482", + "locked_amount": "23066.3829464738684", "deposits": [ { "amount": "10000", @@ -5484,7 +5495,7 @@ "tranche_end": "2023-09-17T00:00:00.000Z", "total_added": "5000", "total_removed": "0", - "locked_amount": "2061.56947615423635", + "locked_amount": "2034.14367706747865", "deposits": [ { "amount": "5000", @@ -6025,7 +6036,7 @@ "tranche_end": "2023-05-01T00:00:00.000Z", "total_added": "22500", "total_removed": "6871.43713545", - "locked_amount": "1428.88322974217355", + "locked_amount": "1180.005467311232775", "deposits": [ { "amount": "7500", @@ -6509,7 +6520,7 @@ "tranche_end": "2023-06-02T00:00:00.000Z", "total_added": "1939928.38", "total_removed": "928642.9598472029154", - "locked_amount": "231168.093511598737240552", + "locked_amount": "220527.2763130828877571306", "deposits": [ { "amount": "1852091.69", @@ -40325,7 +40336,7 @@ "tranche_end": "2023-06-05T00:00:00.000Z", "total_added": "3732368.4671", "total_removed": "715655.108029600523393", - "locked_amount": "379726.105748070797206746073", + "locked_amount": "363374.968979732192792259132", "deposits": [ { "amount": "1998.95815", @@ -41717,8 +41728,8 @@ "tranche_start": "2022-06-05T00:00:00.000Z", "tranche_end": "2023-12-05T00:00:00.000Z", "total_added": "15870102.715470999700000001", - "total_removed": "835090.78677275839915352", - "locked_amount": "6646171.9758772447834505578413098637685861", + "total_removed": "848861.26613772708802852", + "locked_amount": "6588191.8947400391303406883760823381494998", "deposits": [ { "amount": "16249.93", @@ -42277,6 +42288,16 @@ "user": "0x20CD77B9FC2f1fEDfb6F184E25f7127BFE991C8b", "tx": "0xa56a064890829624fb37f887adb87987dfafd709ebea2cdf423c91a38e91b82f" }, + { + "amount": "984.287150968688875", + "user": "0x20CD77B9FC2f1fEDfb6F184E25f7127BFE991C8b", + "tx": "0xbf3e00aef8ae756fb2f5de5d3eec6f925e9005c7acca1a6c2f88a84ad1e44fba" + }, + { + "amount": "12786.192214", + "user": "0xF4c75FdbAe821C6B5DBB9f001bB23cBA58D1bA37", + "tx": "0x57c9c9396f67fb377f2d7cca30a1a6e6b73267408efde1239cbfdfd99c333345" + }, { "amount": "998.454771147362375", "user": "0x20CD77B9FC2f1fEDfb6F184E25f7127BFE991C8b", @@ -44375,6 +44396,12 @@ "tranche_id": 2, "tx": "0xa56a064890829624fb37f887adb87987dfafd709ebea2cdf423c91a38e91b82f" }, + { + "amount": "984.287150968688875", + "user": "0x20CD77B9FC2f1fEDfb6F184E25f7127BFE991C8b", + "tranche_id": 2, + "tx": "0xbf3e00aef8ae756fb2f5de5d3eec6f925e9005c7acca1a6c2f88a84ad1e44fba" + }, { "amount": "998.454771147362375", "user": "0x20CD77B9FC2f1fEDfb6F184E25f7127BFE991C8b", @@ -45811,8 +45838,8 @@ } ], "total_tokens": "259998.8875", - "withdrawn_tokens": "150733.980517927478375", - "remaining_tokens": "109264.906982072521625" + "withdrawn_tokens": "151718.26766889616725", + "remaining_tokens": "108280.61983110383275" }, { "address": "0x89051CAb67Bc7F8CC44F7e270c6EDaf1EC57676c", @@ -46532,6 +46559,12 @@ } ], "withdrawals": [ + { + "amount": "12786.192214", + "user": "0xF4c75FdbAe821C6B5DBB9f001bB23cBA58D1bA37", + "tranche_id": 2, + "tx": "0x57c9c9396f67fb377f2d7cca30a1a6e6b73267408efde1239cbfdfd99c333345" + }, { "amount": "934.96553", "user": "0xF4c75FdbAe821C6B5DBB9f001bB23cBA58D1bA37", @@ -46780,8 +46813,8 @@ } ], "total_tokens": "200000", - "withdrawn_tokens": "104171.325864", - "remaining_tokens": "95828.674136" + "withdrawn_tokens": "116957.518078", + "remaining_tokens": "83042.481922" }, { "address": "0x1b956E6c00E238194B331eddEFF72Cb5f28A8d01", @@ -48163,8 +48196,8 @@ "tranche_start": "2021-11-05T00:00:00.000Z", "tranche_end": "2023-05-05T00:00:00.000Z", "total_added": "14597706.0446472999", - "total_removed": "5845111.643096907348272126", - "locked_amount": "414258.305630822730645455902270797", + "total_removed": "5846105.097444116645943876", + "locked_amount": "360731.4649312677941994769310657454", "deposits": [ { "amount": "129284.449", @@ -48448,6 +48481,11 @@ "user": "0x4Aa3c35F6CC2d507E5C18205ee57099A4C80B19b", "tx": "0xc4a521e74b6b9c9c01e7fbd950f4096d3e6473a773818b4fdf0c9d974ee5fc7e" }, + { + "amount": "993.45434720929767175", + "user": "0x4Aa3c35F6CC2d507E5C18205ee57099A4C80B19b", + "tx": "0x6b1bd1880e5539566cb7110e80ef3e877e3c46a2fcd88798e82211a962dd2b7b" + }, { "amount": "37462.74710421168752574", "user": "0x66827bCD635f2bB1779d68c46aEB16541bCA6ba8", @@ -51735,6 +51773,12 @@ "tranche_id": 3, "tx": "0xc4a521e74b6b9c9c01e7fbd950f4096d3e6473a773818b4fdf0c9d974ee5fc7e" }, + { + "amount": "993.45434720929767175", + "user": "0x4Aa3c35F6CC2d507E5C18205ee57099A4C80B19b", + "tranche_id": 3, + "tx": "0x6b1bd1880e5539566cb7110e80ef3e877e3c46a2fcd88798e82211a962dd2b7b" + }, { "amount": "1383.345213676043696", "user": "0x4Aa3c35F6CC2d507E5C18205ee57099A4C80B19b", @@ -54473,8 +54517,8 @@ } ], "total_tokens": "359123.469575", - "withdrawn_tokens": "348774.8193074565797845", - "remaining_tokens": "10348.6502675434202155" + "withdrawn_tokens": "349768.27365466587745625", + "remaining_tokens": "9355.19592033412254375" }, { "address": "0xBdd412797c1B78535Afc5F71503b91fAbD0160fB", @@ -58109,7 +58153,7 @@ "tranche_end": "2023-06-05T00:00:00.000Z", "total_added": "472355.6199999996", "total_removed": "43120.0853616251849", - "locked_amount": "60169.7720627409513147623313039", + "locked_amount": "57578.840974715197793192974327752", "deposits": [ { "amount": "3000", diff --git a/apps/trading-e2e/.env b/apps/trading-e2e/.env index c50fe6d0b..d71f10490 100644 --- a/apps/trading-e2e/.env +++ b/apps/trading-e2e/.env @@ -12,6 +12,7 @@ NX_VEGA_URL=http://localhost:3028/query NX_VEGA_WALLET_URL=http://localhost:1789 NX_ETH_LOCAL_PROVIDER_URL=http://localhost:8545/ NX_ETH_WALLET_MNEMONIC="ozone access unlock valid olympic save include omit supply green clown session" +NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72 # Expose some env vars to cypress environment for market setup CYPRESS_ETH_WALLET_MNEMONIC=ozone access unlock valid olympic save include omit supply green clown session diff --git a/apps/trading-e2e/cypress.config.js b/apps/trading-e2e/cypress.config.js index 022bd41e2..011e37c04 100644 --- a/apps/trading-e2e/cypress.config.js +++ b/apps/trading-e2e/cypress.config.js @@ -1,8 +1,10 @@ const { defineConfig } = require('cypress'); module.exports = defineConfig({ + reporter: '../../node_modules/cypress-mochawesome-reporter', e2e: { setupNodeEvents(on, config) { + require('cypress-mochawesome-reporter/plugin')(on); require('@cypress/grep/src/plugin')(config); return config; }, @@ -23,6 +25,7 @@ module.exports = defineConfig({ responseTimeout: 50000, requestTimeout: 20000, retries: 2, + testIsolation: false, }, env: { ETHERSCAN_URL: 'https://sepolia.etherscan.io', diff --git a/apps/trading-e2e/src/integration/market-info.cy.ts b/apps/trading-e2e/src/integration/market-info.cy.ts index 185e10ed1..9ebd9445d 100644 --- a/apps/trading-e2e/src/integration/market-info.cy.ts +++ b/apps/trading-e2e/src/integration/market-info.cy.ts @@ -108,18 +108,14 @@ describe('market info is displayed', { tags: '@smoke' }, () => { it('risk model displayed', () => { cy.getByTestId(marketTitle).contains('Risk model').click(); - - validateMarketDataRow(0, 'Typename', 'LogNormalRiskModel'); - validateMarketDataRow(1, 'Tau', '0.0001140771161'); - validateMarketDataRow(2, 'Risk Aversion Parameter', '0.01'); + validateMarketDataRow(0, 'Tau', '0.0001140771161'); + validateMarketDataRow(1, 'Risk Aversion Parameter', '0.01'); }); it('risk parameters displayed', () => { cy.getByTestId(marketTitle).contains('Risk parameters').click(); - - validateMarketDataRow(0, 'Typename', 'LogNormalModelParams'); - validateMarketDataRow(1, 'R', '0.016'); - validateMarketDataRow(2, 'Sigma', '0.3'); + validateMarketDataRow(0, 'R', '0.016'); + validateMarketDataRow(1, 'Sigma', '0.3'); }); it('risk factors displayed', () => { diff --git a/apps/trading-e2e/src/integration/market-proposal-notification.cy.ts b/apps/trading-e2e/src/integration/market-proposal-notification.cy.ts new file mode 100644 index 000000000..c78fc8786 --- /dev/null +++ b/apps/trading-e2e/src/integration/market-proposal-notification.cy.ts @@ -0,0 +1,47 @@ +import { aliasGQLQuery } from '@vegaprotocol/cypress'; +import { proposalListQuery, marketUpdateProposal } from '@vegaprotocol/mock'; +import * as Schema from '@vegaprotocol/types'; + +const marketSummaryBlock = 'header-summary'; + +describe('Market proposal notification', { tags: '@smoke' }, () => { + before(() => { + cy.setVegaWallet(); + cy.mockTradingPage( + Schema.MarketState.STATE_ACTIVE, + Schema.MarketTradingMode.TRADING_MODE_MONITORING_AUCTION, + Schema.AuctionTrigger.AUCTION_TRIGGER_LIQUIDITY_TARGET_NOT_MET + ); + cy.mockGQL((req) => { + aliasGQLQuery( + req, + 'ProposalsList', + proposalListQuery({ + proposalsConnection: { + edges: [{ node: marketUpdateProposal }], + }, + }) + ); + }); + cy.mockSubscription(); + cy.visit('/#/markets/market-0'); + cy.wait('@MarketData'); + cy.getByTestId(marketSummaryBlock).should('be.visible'); + }); + + it('should display market proposal notification if proposal found', () => { + cy.getByTestId(marketSummaryBlock).within(() => { + cy.getByTestId('market-proposal-notification').should( + 'contain.text', + 'Changes have been proposed for this market' + ); + cy.getByTestId('market-proposal-notification').within(() => { + cy.getByTestId('external-link').should( + 'have.attr', + 'href', + `${Cypress.env('VEGA_TOKEN_URL')}/proposals/123` + ); + }); + }); + }); +}); diff --git a/apps/trading-e2e/src/integration/market-split-bottom-panels.cy.ts b/apps/trading-e2e/src/integration/market-split-bottom-panels.cy.ts new file mode 100644 index 000000000..2c860042b --- /dev/null +++ b/apps/trading-e2e/src/integration/market-split-bottom-panels.cy.ts @@ -0,0 +1,41 @@ +describe('market bottom panel', { tags: '@smoke' }, () => { + before(() => { + cy.clearAllLocalStorage(); + cy.mockTradingPage(); + cy.mockSubscription(); + cy.visit('/#/markets/market-0'); + cy.wait('@MarketData'); + }); + + it('on xxl screen should be splitted out into two tables', () => { + cy.getByTestId('tab-positions').should('have.attr', 'data-state', 'active'); + cy.getByTestId('tab-orders').should('have.attr', 'data-state', 'inactive'); + cy.getByTestId('tab-fills').should('have.attr', 'data-state', 'inactive'); + cy.getByTestId('tab-accounts').should( + 'have.attr', + 'data-state', + 'inactive' + ); + + cy.viewport(1801, 1000); + cy.getByTestId('tab-positions').should('have.attr', 'data-state', 'active'); + cy.getByTestId('tab-orders').should('have.attr', 'data-state', 'active'); + cy.getByTestId('tab-fills').should('have.attr', 'data-state', 'inactive'); + cy.getByTestId('tab-accounts').should( + 'have.attr', + 'data-state', + 'inactive' + ); + + cy.getByTestId('Fills').click(); + cy.getByTestId('Collateral').click(); + cy.getByTestId('tab-positions').should( + 'have.attr', + 'data-state', + 'inactive' + ); + cy.getByTestId('tab-orders').should('have.attr', 'data-state', 'inactive'); + cy.getByTestId('tab-fills').should('have.attr', 'data-state', 'active'); + cy.getByTestId('tab-accounts').should('have.attr', 'data-state', 'active'); + }); +}); diff --git a/apps/trading-e2e/src/integration/market-summary.cy.ts b/apps/trading-e2e/src/integration/market-summary.cy.ts index bd6ac01aa..2658a7682 100644 --- a/apps/trading-e2e/src/integration/market-summary.cy.ts +++ b/apps/trading-e2e/src/integration/market-summary.cy.ts @@ -1,5 +1,3 @@ -import { aliasGQLQuery } from '@vegaprotocol/cypress'; -import { proposalListQuery, marketUpdateProposal } from '@vegaprotocol/mock'; import * as Schema from '@vegaprotocol/types'; const marketSummaryBlock = 'header-summary'; @@ -15,50 +13,9 @@ const priceChangeValue = 'price-change'; const itemHeader = 'item-header'; const itemValue = 'item-value'; -describe('Market proposal notification', { tags: '@smoke' }, () => { - before(() => { - cy.setVegaWallet(); - cy.mockTradingPage( - Schema.MarketState.STATE_ACTIVE, - Schema.MarketTradingMode.TRADING_MODE_MONITORING_AUCTION, - Schema.AuctionTrigger.AUCTION_TRIGGER_LIQUIDITY_TARGET_NOT_MET - ); - cy.mockGQL((req) => { - aliasGQLQuery( - req, - 'ProposalsList', - proposalListQuery({ - proposalsConnection: { - edges: [{ node: marketUpdateProposal }], - }, - }) - ); - }); - cy.mockSubscription(); - cy.visit('/#/markets/market-0'); - cy.wait('@MarketData'); - cy.getByTestId(marketSummaryBlock).should('be.visible'); - }); - - it('should display market proposal notification if proposal found', () => { - cy.getByTestId(marketSummaryBlock).within(() => { - cy.getByTestId('market-proposal-notification').should( - 'contain.text', - 'Changes have been proposed for this market' - ); - cy.getByTestId('market-proposal-notification').within(() => { - cy.getByTestId('external-link').should( - 'have.attr', - 'href', - `${Cypress.env('VEGA_TOKEN_URL')}/proposals/123` - ); - }); - }); - }); -}); - describe('Market trading page', () => { before(() => { + cy.clearAllLocalStorage(); cy.mockTradingPage( Schema.MarketState.STATE_ACTIVE, Schema.MarketTradingMode.TRADING_MODE_MONITORING_AUCTION, @@ -165,6 +122,7 @@ describe('Market trading page', () => { }); }); cy.getByTestId('expiry-tooltip') + .eq(0) .should( 'contain.text', 'This market expires when triggered by its oracle, not on a set date.' @@ -202,6 +160,7 @@ describe('Market trading page', () => { 'contain.text', 'This market is in auction until it reaches sufficient liquidity.' ) + .eq(0) .within(() => { cy.getByTestId('external-link') .should('have.attr', 'href') @@ -216,93 +175,4 @@ describe('Market trading page', () => { }); }); }); - - describe('market bottom panel', { tags: '@smoke' }, () => { - it('on xxl screen should be splitted out into two tables', () => { - cy.getByTestId('tab-positions').should( - 'have.attr', - 'data-state', - 'active' - ); - cy.getByTestId('tab-orders').should( - 'have.attr', - 'data-state', - 'inactive' - ); - cy.getByTestId('tab-fills').should('have.attr', 'data-state', 'inactive'); - cy.getByTestId('tab-accounts').should( - 'have.attr', - 'data-state', - 'inactive' - ); - - cy.viewport(1801, 1000); - cy.getByTestId('tab-positions').should( - 'have.attr', - 'data-state', - 'active' - ); - cy.getByTestId('tab-orders').should('have.attr', 'data-state', 'active'); - cy.getByTestId('tab-fills').should('have.attr', 'data-state', 'inactive'); - cy.getByTestId('tab-accounts').should( - 'have.attr', - 'data-state', - 'inactive' - ); - - cy.getByTestId('Fills').click(); - cy.getByTestId('Collateral').click(); - cy.getByTestId('tab-positions').should( - 'have.attr', - 'data-state', - 'inactive' - ); - cy.getByTestId('tab-orders').should( - 'have.attr', - 'data-state', - 'inactive' - ); - cy.getByTestId('tab-fills').should('have.attr', 'data-state', 'active'); - cy.getByTestId('tab-accounts').should( - 'have.attr', - 'data-state', - 'active' - ); - }); - }); -}); - -describe('market states not accepting orders', { tags: '@smoke' }, function () { - //7002-SORD-062 - //7002-SORD-063 - //7002-SORD-066 - - const states = [ - Schema.MarketState.STATE_REJECTED, - Schema.MarketState.STATE_CANCELLED, - Schema.MarketState.STATE_CLOSED, - Schema.MarketState.STATE_SETTLED, - Schema.MarketState.STATE_TRADING_TERMINATED, - ]; - - states.forEach((marketState) => { - describe(marketState, function () { - beforeEach(function () { - cy.mockTradingPage(marketState); - cy.mockSubscription(); - cy.setVegaWallet(); - cy.visit('/#/markets/market-0'); - }); - it('must display that market is not accepting orders', function () { - cy.getByTestId('dealticket-error-message-summary').should( - 'have.text', - `This market is ${marketState - .split('_') - .pop() - ?.toLowerCase()} and not accepting orders` - ); - cy.getByTestId('place-order').should('be.disabled'); - }); - }); - }); }); diff --git a/apps/trading-e2e/src/integration/navbar.cy.ts b/apps/trading-e2e/src/integration/navbar.cy.ts index 22fa67e95..6b04eecac 100644 --- a/apps/trading-e2e/src/integration/navbar.cy.ts +++ b/apps/trading-e2e/src/integration/navbar.cy.ts @@ -1,27 +1,32 @@ import { mockConnectWallet } from '@vegaprotocol/cypress'; -beforeEach(() => { - cy.mockTradingPage(); - cy.mockSubscription(); - cy.visit('/'); - cy.wait('@Markets'); - cy.wait('@MarketsData'); - cy.wait('@MarketsCandles'); - cy.getByTestId('dialog-close').click(); -}); +describe('Navbar', { tags: '@smoke' }, () => { + before(() => { + cy.clearAllLocalStorage(); + cy.mockTradingPage(); + cy.mockSubscription(); + cy.visit('/'); + cy.wait('@Markets'); + cy.wait('@MarketsData'); + cy.wait('@MarketsCandles'); + // close welcome dialog + cy.getByTestId('dialog-close').click(); + }); -describe('Desktop view', { tags: '@smoke' }, () => { - describe('Navbar', () => { - const links = ['Markets', 'Trading', 'Portfolio']; - const hashes = ['#/markets/all', '#/markets/market-1', '#/portfolio']; + const pages = [ + { name: 'Markets', link: '#/markets/all' }, + { name: 'Trading', link: '#/markets' }, + { name: 'Portfolio', link: '#/portfolio' }, + ]; - links.forEach((link, index) => { - it(`${link} should be correctly rendered`, () => { + describe('desktop view', () => { + pages.forEach(({ name, link }) => { + it(`${name} should be correctly rendered`, () => { cy.get('nav') - .find(`a[data-testid=${link}]:visible`) + .find(`a[data-testid=${name}]:visible`) .then((element) => { cy.wrap(element).click(); - cy.location('hash').should('equal', hashes[index]); + cy.location('hash').should('contain', link); }); }); }); @@ -43,73 +48,61 @@ describe('Desktop view', { tags: '@smoke' }, () => { }); }); }); -}); -describe('Mobile view', { tags: '@smoke' }, () => { - const viewportHeight = Cypress.config('viewportHeight'); - const viewportWidth = Cypress.config('viewportWidth'); - before(() => { - // a little hack to keep the viewport size between tests (cypress bug) - Cypress.config({ - viewportWidth: 560, - viewportHeight: 890, + describe('mobile view', () => { + const viewportHeight = Cypress.config('viewportHeight'); + const viewportWidth = Cypress.config('viewportWidth'); + before(() => { + // a little hack to keep the viewport size between tests (cypress bug) + Cypress.config({ + viewportWidth: 560, + viewportHeight: 890, + }); + cy.viewport(560, 890); }); - cy.viewport(560, 890); - }); - describe('wallet drawer', () => { - it('wallet drawer should be correctly rendered', () => { - mockConnectWallet(); - cy.connectVegaWallet(true); - cy.getByTestId('connect-vega-wallet-mobile').click(); - cy.getByTestId('wallets-drawer').should('be.visible'); - cy.getByTestId('wallets-drawer').within((el) => { - cy.wrap(el).get('button').contains('Disconnect').click(); - }); - cy.getByTestId('wallets-drawer').should('not.be.visible'); - }); - }); - - describe('menu drawer', () => { - it('Markets should be correctly rendered', () => { - cy.getByTestId('button-menu-drawer').click(); - cy.getByTestId('menu-drawer').should('be.visible'); - cy.getByTestId('menu-drawer').within((el) => { - cy.wrap(el).getByTestId('Markets').click(); - cy.location('hash').should('equal', '#/markets/all'); - }); - }); - it('Trading should be correctly rendered', () => { - cy.getByTestId('button-menu-drawer').click(); - cy.getByTestId('menu-drawer').within((el) => { - cy.wrap(el).getByTestId('Trading').click(); - cy.location('hash').should('equal', '#/markets/market-1'); - }); - }); - it('Portfolio should be correctly rendered', () => { - cy.getByTestId('button-menu-drawer').click(); - cy.getByTestId('menu-drawer').within((el) => { - cy.wrap(el).getByTestId('Portfolio').click(); - cy.location('hash').should('equal', '#/portfolio'); + describe('wallet drawer', () => { + it('wallet drawer should be correctly rendered', () => { + mockConnectWallet(); + cy.connectVegaWallet(true); + cy.getByTestId('connect-vega-wallet-mobile').click(); + cy.getByTestId('wallets-drawer').should('be.visible'); + cy.getByTestId('wallets-drawer').within((el) => { + cy.wrap(el).get('button').contains('Disconnect').click(); + }); + cy.getByTestId('wallets-drawer').should('not.be.visible'); }); }); - it('Menu drawer should not be visible until opened', () => { - cy.getByTestId('menu-drawer').should('not.be.visible'); - cy.getByTestId('button-menu-drawer').click(); - cy.getByTestId('menu-drawer').should('be.visible'); - cy.getByTestId('menu-drawer') - .find('[data-testid="theme-switcher"]') - .should('be.visible'); - cy.getByTestId('button-menu-drawer').click(); - cy.getByTestId('menu-drawer').should('not.be.visible'); + describe('menu drawer', () => { + pages.forEach(({ name, link }) => { + it(`${name} should be correctly rendered`, () => { + cy.getByTestId('button-menu-drawer').click(); + cy.getByTestId('menu-drawer').should('be.visible'); + cy.getByTestId('menu-drawer').within((el) => { + cy.wrap(el).getByTestId(name).click(); + cy.location('hash').should('contain', link); + }); + }); + }); + + it('Menu drawer should not be visible until opened', () => { + cy.getByTestId('menu-drawer').should('not.be.visible'); + cy.getByTestId('button-menu-drawer').click(); + cy.getByTestId('menu-drawer').should('be.visible'); + cy.getByTestId('menu-drawer') + .find('[data-testid="theme-switcher"]') + .should('be.visible'); + cy.getByTestId('button-menu-drawer').click(); + cy.getByTestId('menu-drawer').should('not.be.visible'); + }); }); - }); - after(() => { - // a little hack to keep the viewport size between tests (cypress bug) - Cypress.config({ - viewportWidth, - viewportHeight, + after(() => { + // a little hack to keep the viewport size between tests (cypress bug) + Cypress.config({ + viewportWidth, + viewportHeight, + }); }); }); }); diff --git a/apps/trading-e2e/src/integration/trading-accounts.cy.ts b/apps/trading-e2e/src/integration/trading-accounts.cy.ts index e2f9a1dea..0a4ecdc54 100644 --- a/apps/trading-e2e/src/integration/trading-accounts.cy.ts +++ b/apps/trading-e2e/src/integration/trading-accounts.cy.ts @@ -1,14 +1,16 @@ import { checkSorting } from '@vegaprotocol/cypress'; -beforeEach(() => { - cy.mockTradingPage(); - cy.mockWeb3Provider(); - cy.mockSubscription(); - cy.setVegaWallet(); - cy.visit('/#/markets/market-0'); -}); - describe('accounts', { tags: '@smoke' }, () => { + before(() => { + cy.clearAllLocalStorage(); + cy.mockTradingPage(); + cy.mockWeb3Provider(); + cy.mockSubscription(); + cy.setVegaWallet(); + cy.visit('/#/markets/market-0'); + cy.wait('@Assets'); + }); + it('renders accounts', () => { const tradingAccountRowId = '[row-id="t-0"]'; cy.getByTestId('Collateral').click(); @@ -41,13 +43,21 @@ describe('accounts', { tags: '@smoke' }, () => { .should('have.text', '100,001.01'); }); - it('asset detail should be properly rendered', () => { - cy.getByTestId('Collateral').click(); + it('should open asset details dialog when clicked on symbol', () => { cy.getByTestId('asset').contains('tEURO').click(); - cy.get('[data-testid$="_label"]').should('have.length', 16); + cy.get('[data-testid="dialog-content"]:visible').should('exist'); + cy.get('[data-testid="dialog-close"]:visible').click(); }); describe('sorting by ag-grid columns should work well', () => { + before(() => { + const dialogs = Cypress.$('[data-testid="dialog-close"]:visible'); + if (dialogs.length > 0) { + dialogs.each((btn) => { + cy.wrap(btn).click(); + }); + } + }); it('sorting by asset', () => { cy.getByTestId('Collateral').click(); const marketsSortedDefault = ['tBTC', 'tEURO', 'tDAI', 'tBTC']; diff --git a/apps/trading-e2e/src/integration/trading-deal-ticket-basic-submit.cy.ts b/apps/trading-e2e/src/integration/trading-deal-ticket-basic-submit.cy.ts new file mode 100644 index 000000000..f22f981f4 --- /dev/null +++ b/apps/trading-e2e/src/integration/trading-deal-ticket-basic-submit.cy.ts @@ -0,0 +1,110 @@ +import * as Schema from '@vegaprotocol/types'; +import { testOrderSubmission } from '../support/order-validation'; +import type { OrderSubmission } from '@vegaprotocol/wallet'; +import { createOrder } from '../support/create-order'; + +describe('must submit order', { tags: '@smoke' }, () => { + // 7002-SORD-039 + before(() => { + cy.setVegaWallet(); + cy.mockTradingPage(); + cy.mockSubscription(); + cy.visit('/#/markets/market-0'); + cy.wait('@Markets'); + }); + + beforeEach(() => { + cy.setVegaWallet(); + }); + + it('successfully places market buy order', () => { + // 7002-SORD-010 + // 0003-WTXN-012 + // 0003-WTXN-003 + cy.mockVegaWalletTransaction(); + const order: OrderSubmission = { + marketId: 'market-0', + type: Schema.OrderType.TYPE_MARKET, + side: Schema.Side.SIDE_BUY, + timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_FOK, + postOnly: false, + reduceOnly: false, + size: '100', + }; + createOrder(order); + testOrderSubmission(order); + }); + + it('successfully places market sell order', () => { + cy.mockVegaWalletTransaction(); + const order: OrderSubmission = { + marketId: 'market-0', + type: Schema.OrderType.TYPE_MARKET, + side: Schema.Side.SIDE_SELL, + timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_IOC, + size: '100', + postOnly: false, + reduceOnly: false, + }; + createOrder(order); + testOrderSubmission(order); + }); + + it('successfully places limit buy order', () => { + // 7002-SORD-017 + cy.mockVegaWalletTransaction(); + const order: OrderSubmission = { + marketId: 'market-0', + type: Schema.OrderType.TYPE_LIMIT, + side: Schema.Side.SIDE_BUY, + timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTC, + size: '100', + postOnly: false, + reduceOnly: false, + price: '200', + }; + createOrder(order); + testOrderSubmission(order, { price: '20000000' }); + }); + + it('successfully places limit sell order', () => { + cy.mockVegaWalletTransaction(); + const order: OrderSubmission = { + marketId: 'market-0', + type: Schema.OrderType.TYPE_LIMIT, + side: Schema.Side.SIDE_SELL, + timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GFN, + size: '100', + postOnly: false, + reduceOnly: false, + price: '50000', + }; + createOrder(order); + testOrderSubmission(order, { price: '5000000000' }); + }); + + it('successfully places GTT limit buy order', () => { + cy.mockVegaWalletTransaction(); + const expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000); + const order: OrderSubmission = { + marketId: 'market-0', + type: Schema.OrderType.TYPE_LIMIT, + side: Schema.Side.SIDE_SELL, + timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTT, + size: '100', + price: '1.00', + expiresAt: expiresAt.toISOString().substring(0, 16), + postOnly: false, + reduceOnly: false, + }; + + createOrder(order); + testOrderSubmission(order, { + price: '100000', + expiresAt: + new Date(order.expiresAt as string).getTime().toString() + '000000', + postOnly: false, + reduceOnly: false, + }); + }); +}); diff --git a/apps/trading-e2e/src/integration/trading-deal-ticket-basics.cy.ts b/apps/trading-e2e/src/integration/trading-deal-ticket-basics.cy.ts new file mode 100644 index 000000000..f3af62e90 --- /dev/null +++ b/apps/trading-e2e/src/integration/trading-deal-ticket-basics.cy.ts @@ -0,0 +1,96 @@ +import * as Schema from '@vegaprotocol/types'; +import { mockConnectWallet } from '@vegaprotocol/cypress'; +import { + orderPriceField, + placeOrderBtn, + toggleLimit, + toggleLong, + toggleMarket, + toggleShort, +} from '../support/deal-ticket'; + +describe('deal ticket basics', { tags: '@smoke' }, () => { + before(() => { + cy.mockTradingPage(); + cy.mockSubscription(); + cy.clearAllLocalStorage(); + cy.visit('/#/markets/market-0'); + cy.wait('@Markets'); + }); + + it('must show place order button and connect wallet if wallet is not connected', () => { + // 0003-WTXN-001 + cy.getByTestId('connect-vega-wallet'); // Not connected + cy.getByTestId('order-connect-wallet').should('exist'); + cy.getByTestId(placeOrderBtn).should('exist'); + cy.getByTestId('deal-ticket-connect-wallet').should('exist'); + }); + + it('must be able to select order direction - long/short', function () { + // 7002-SORD-004 + cy.getByTestId(toggleShort).click().children('input').should('be.checked'); + cy.getByTestId(toggleLong).click().children('input').should('be.checked'); + }); + + it('must be able to select order type - limit/market', function () { + // 7002-SORD-005 + // 7002-SORD-006 + // 7002-SORD-007 + cy.getByTestId(toggleLimit).click().children('input').should('be.checked'); + cy.getByTestId(toggleMarket).click().children('input').should('be.checked'); + }); + + it('order connect vega wallet button should connect', () => { + mockConnectWallet(); + cy.getByTestId(toggleLimit).click(); + cy.getByTestId(orderPriceField).clear().type('101'); + cy.getByTestId('order-connect-wallet').click(); + cy.getByTestId('dialog-content').should('be.visible'); + cy.getByTestId('connectors-list') + .find('[data-testid="connector-jsonRpc"]') + .click(); + cy.wait('@walletReq'); + cy.getByTestId(placeOrderBtn).should('be.visible'); + cy.getByTestId(toggleLimit).children('input').should('be.checked'); + cy.getByTestId(orderPriceField).should('have.value', '101'); + }); +}); + +describe( + 'market states not accepting orders', + { tags: '@smoke', testIsolation: true }, + function () { + //7002-SORD-062 + //7002-SORD-063 + //7002-SORD-066 + + const states = [ + Schema.MarketState.STATE_REJECTED, + Schema.MarketState.STATE_CANCELLED, + Schema.MarketState.STATE_CLOSED, + Schema.MarketState.STATE_SETTLED, + Schema.MarketState.STATE_TRADING_TERMINATED, + ]; + + states.forEach((marketState) => { + describe(marketState, function () { + beforeEach(function () { + cy.mockTradingPage(marketState); + cy.mockSubscription(); + cy.setVegaWallet(); + cy.visit('/#/markets/market-0'); + }); + it('must display that market is not accepting orders', function () { + cy.getByTestId('dealticket-error-message-summary').should( + 'have.text', + `This market is ${marketState + .split('_') + .pop() + ?.toLowerCase()} and not accepting orders` + ); + cy.getByTestId('place-order').should('be.disabled'); + }); + }); + }); + } +); diff --git a/apps/trading-e2e/src/integration/trading-deal-ticket-order.cy.ts b/apps/trading-e2e/src/integration/trading-deal-ticket-order.cy.ts new file mode 100644 index 000000000..1c74e5415 --- /dev/null +++ b/apps/trading-e2e/src/integration/trading-deal-ticket-order.cy.ts @@ -0,0 +1,92 @@ +import { + orderPriceField, + orderSizeField, + orderTIFDropDown, + placeOrderBtn, + toggleLimit, + toggleMarket, +} from '../support/deal-ticket'; + +describe('deal ticker order validation', { tags: '@smoke' }, () => { + before(() => { + cy.setVegaWallet(); + cy.mockTradingPage(); + cy.mockSubscription(); + cy.visit('/#/markets/market-0'); + cy.wait('@Markets'); + }); + + describe('limit order', () => { + before(() => { + cy.getByTestId(toggleLimit).click(); + }); + + it('must see the price unit', function () { + // 7002-SORD-018 + cy.getByTestId(orderPriceField) + .siblings('label') + .should('have.text', 'Price (DAI)'); + }); + + it('must see warning when placing an order with expiry date in past', () => { + const expiresAt = new Date(Date.now() - 24 * 60 * 60 * 1000); + const expiresAtInputValue = expiresAt.toISOString().substring(0, 16); + cy.getByTestId(toggleLimit).click(); + cy.getByTestId(orderPriceField).clear().type('0.1'); + cy.getByTestId(orderSizeField).clear().type('1'); + cy.getByTestId(orderTIFDropDown).select('TIME_IN_FORCE_GTT'); + + cy.log('choosing yesterday'); + cy.getByTestId('date-picker-field').type(expiresAtInputValue); + + cy.getByTestId(placeOrderBtn).click(); + + cy.getByTestId('dealticket-error-message-expiry').should( + 'have.text', + 'The expiry date that you have entered appears to be in the past' + ); + }); + + it('must see warning if price has too many digits after decimal place', function () { + // 7002-SORD-059 + cy.getByTestId(toggleLimit).click(); + cy.getByTestId(orderTIFDropDown).select('TIME_IN_FORCE_GTC'); + cy.getByTestId(orderSizeField).clear().type('1'); + cy.getByTestId(orderPriceField).clear().type('1.123456'); + cy.getByTestId('dealticket-error-message-price-limit').should( + 'have.text', + 'Price accepts up to 5 decimal places' + ); + }); + }); + + describe('market order', () => { + before(() => { + cy.getByTestId(toggleMarket).click(); + }); + + it('must not see the price unit', function () { + // 7002-SORD-019 + cy.getByTestId(orderPriceField).should('not.exist'); + }); + + it('must warn if order size input has too many digits after the decimal place', function () { + // 7002-SORD-016 + cy.getByTestId(orderSizeField).clear().type('1.234'); + cy.getByTestId(placeOrderBtn).should('be.disabled'); + cy.getByTestId('dealticket-error-message-size-market').should( + 'have.text', + 'Size must be whole numbers for this market' + ); + }); + + it('must warn if order size is set to 0', function () { + cy.getByTestId(orderSizeField).clear().type('0'); + cy.getByTestId(placeOrderBtn).should('be.disabled'); + cy.getByTestId('dealticket-error-message-size-market').should( + 'have.text', + 'Size cannot be lower than 1' + ); + }); + }); +}); diff --git a/apps/trading-e2e/src/integration/trading-deal-ticket-submit-account.cy.ts b/apps/trading-e2e/src/integration/trading-deal-ticket-submit-account.cy.ts new file mode 100644 index 000000000..c964a485a --- /dev/null +++ b/apps/trading-e2e/src/integration/trading-deal-ticket-submit-account.cy.ts @@ -0,0 +1,173 @@ +import * as Schema from '@vegaprotocol/types'; +import { aliasGQLQuery } from '@vegaprotocol/cypress'; +import { + accountsQuery, + amendGeneralAccountBalance, + estimateOrderQuery, +} from '@vegaprotocol/mock'; +import type { OrderSubmission } from '@vegaprotocol/wallet'; +import { createOrder } from '../support/create-order'; + +describe( + 'account validation', + { tags: '@regression', testIsolation: true }, + () => { + describe('zero balance error', () => { + beforeEach(() => { + cy.setVegaWallet(); + cy.mockTradingPage(); + const accounts = accountsQuery(); + amendGeneralAccountBalance(accounts, 'market-0', '0'); + cy.mockGQL((req) => { + aliasGQLQuery(req, 'Accounts', accounts); + }); + cy.mockSubscription(); + cy.visit('/#/markets/market-0'); + cy.wait('@Markets'); + }); + + it('should show an error if your balance is zero', () => { + cy.getByTestId('place-order').should('be.disabled'); + // 7002-SORD-003 + cy.getByTestId('dealticket-error-message-zero-balance').should( + 'have.text', + 'You need ' + + 'tDAI' + + ' in your wallet to trade in this market.See all your collateral.Make a deposit' + ); + cy.getByTestId('deal-ticket-deposit-dialog-button').should('exist'); + }); + }); + + describe('not enough balance warning', () => { + beforeEach(() => { + cy.setVegaWallet(); + cy.mockTradingPage(); + const accounts = accountsQuery(); + amendGeneralAccountBalance(accounts, 'market-0', '100000000'); + cy.mockGQL((req) => { + aliasGQLQuery(req, 'Accounts', accounts); + }); + cy.mockGQL((req) => { + aliasGQLQuery(req, 'EstimateOrder', estimateOrderQuery()); + }); + cy.mockSubscription(); + cy.visit('/#/markets/market-0'); + cy.wait('@Markets'); + }); + + it('should display info and button for deposit', () => { + // 7002-SORD-003 + + // warning should show immediately + cy.getByTestId('dealticket-warning-margin').should( + 'contain.text', + 'You may not have enough margin available to open this position' + ); + cy.getByTestId('dealticket-warning-margin').should( + 'contain.text', + 'You may not have enough margin available to open this position. 2,354.72283 tDAI is currently required. You have only 1,000.01 tDAI available.' + ); + cy.getByTestId('deal-ticket-deposit-dialog-button').click(); + cy.getByTestId('dialog-content') + .find('h1') + .eq(0) + .should('have.text', 'Deposit'); + }); + }); + + describe('must submit order', { tags: '@smoke' }, () => { + // 7002-SORD-039 + beforeEach(() => { + cy.setVegaWallet(); + cy.mockTradingPage(); + cy.mockSubscription(); + cy.visit('/#/markets/market-0'); + cy.wait('@Markets'); + }); + + it('must see a prompt to check connected vega wallet to approve transaction', () => { + // 0003-WTXN-002 + cy.mockVegaWalletTransaction(1000); + const order: OrderSubmission = { + marketId: 'market-0', + type: Schema.OrderType.TYPE_MARKET, + side: Schema.Side.SIDE_BUY, + timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_FOK, + size: '100', + }; + createOrder(order); + cy.getByTestId('toast-content').should( + 'contain.text', + 'Please go to your Vega wallet application and approve or reject the transaction.' + ); + }); + + it('must show error returned by wallet ', () => { + // 0003-WTXN-009 + // 0003-WTXN-011 + // 0002-WCON-016 + // 0003-WTXN-008 + + //trigger error from the wallet + cy.intercept('POST', 'http://localhost:1789/api/v2/requests', (req) => { + req.on('response', (res) => { + res.send({ + jsonrpc: '2.0', + id: '1', + }); + }); + }); + + const order: OrderSubmission = { + marketId: 'market-0', + type: Schema.OrderType.TYPE_MARKET, + side: Schema.Side.SIDE_BUY, + timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_FOK, + size: '100', + }; + createOrder(order); + cy.getByTestId('toast-content').should( + 'contain.text', + 'The connection to your Vega Wallet has been lost.' + ); + cy.getByTestId('connect-vega-wallet').click(); + cy.getByTestId('dialog-content').should('be.visible'); + }); + + it('must see that the order was rejected by the connected wallet', () => { + // 0003-WTXN-007 + + //trigger rejection error from the wallet + cy.intercept('POST', 'http://localhost:1789/api/v2/requests', (req) => { + req.alias = 'client.send_transaction'; + req.reply({ + statusCode: 400, + body: { + jsonrpc: '2.0', + error: { + code: 3001, + data: 'the user rejected the wallet connection', + message: 'User error', + }, + id: '0', + }, + }); + }); + + const order: OrderSubmission = { + marketId: 'market-0', + type: Schema.OrderType.TYPE_MARKET, + side: Schema.Side.SIDE_BUY, + timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_FOK, + size: '100', + }; + createOrder(order); + cy.getByTestId('toast-content').should( + 'contain.text', + 'Error occurredthe user rejected the wallet connection' + ); + }); + }); + } +); diff --git a/apps/trading-e2e/src/integration/trading-deal-ticket-submit-batch-auction.cy.ts b/apps/trading-e2e/src/integration/trading-deal-ticket-submit-batch-auction.cy.ts new file mode 100644 index 000000000..e6366af8c --- /dev/null +++ b/apps/trading-e2e/src/integration/trading-deal-ticket-submit-batch-auction.cy.ts @@ -0,0 +1,87 @@ +import * as Schema from '@vegaprotocol/types'; +import { testOrderSubmission } from '../support/order-validation'; +import type { OrderSubmission } from '@vegaprotocol/wallet'; +import { createOrder } from '../support/create-order'; + +const displayTomorrow = () => { + const tomorrow = new Date(); + tomorrow.setDate(tomorrow.getDate() + 1); + return tomorrow.toISOString().substring(0, 16); +}; + +describe( + 'must submit order for market in batch auction', + { tags: '@regression' }, + () => { + before(() => { + cy.setVegaWallet(); + cy.mockTradingPage( + Schema.MarketState.STATE_SUSPENDED, + Schema.MarketTradingMode.TRADING_MODE_BATCH_AUCTION, + Schema.AuctionTrigger.AUCTION_TRIGGER_LIQUIDITY_TARGET_NOT_MET + ); + cy.mockSubscription(); + cy.visit('/#/markets/market-0'); + cy.wait('@Markets'); + }); + + beforeEach(() => { + cy.setVegaWallet(); + }); + + it('successfully places limit buy order', () => { + cy.mockVegaWalletTransaction(); + const order: OrderSubmission = { + marketId: 'market-0', + type: Schema.OrderType.TYPE_LIMIT, + side: Schema.Side.SIDE_BUY, + timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTC, + size: '100', + postOnly: false, + reduceOnly: false, + price: '200', + }; + createOrder(order); + testOrderSubmission(order, { price: '20000000' }); + }); + + it('successfully places limit sell order', () => { + cy.mockVegaWalletTransaction(); + const order: OrderSubmission = { + marketId: 'market-0', + type: Schema.OrderType.TYPE_LIMIT, + side: Schema.Side.SIDE_SELL, + timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTC, + size: '100', + postOnly: false, + reduceOnly: false, + price: '50000', + }; + createOrder(order); + testOrderSubmission(order, { price: '5000000000' }); + }); + + it('successfully places GTT limit buy order', () => { + cy.mockVegaWalletTransaction(); + const order: OrderSubmission = { + marketId: 'market-0', + type: Schema.OrderType.TYPE_LIMIT, + side: Schema.Side.SIDE_SELL, + timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTT, + size: '100', + postOnly: false, + reduceOnly: false, + price: '1.00', + expiresAt: displayTomorrow(), + }; + createOrder(order); + testOrderSubmission(order, { + price: '100000', + postOnly: false, + reduceOnly: false, + expiresAt: + new Date(order.expiresAt as string).getTime().toString() + '000000', + }); + }); + } +); diff --git a/apps/trading-e2e/src/integration/trading-deal-ticket-submit-monitoring-auction.cy.ts b/apps/trading-e2e/src/integration/trading-deal-ticket-submit-monitoring-auction.cy.ts new file mode 100644 index 000000000..67969a0b2 --- /dev/null +++ b/apps/trading-e2e/src/integration/trading-deal-ticket-submit-monitoring-auction.cy.ts @@ -0,0 +1,85 @@ +import * as Schema from '@vegaprotocol/types'; +import { testOrderSubmission } from '../support/order-validation'; +import type { OrderSubmission } from '@vegaprotocol/wallet'; +import { createOrder } from '../support/create-order'; + +const displayTomorrow = () => { + const tomorrow = new Date(); + tomorrow.setDate(tomorrow.getDate() + 1); + return tomorrow.toISOString().substring(0, 16); +}; + +describe( + 'must submit order for market in monitoring auction', + { tags: '@regression' }, + () => { + before(() => { + cy.setVegaWallet(); + cy.mockTradingPage( + Schema.MarketState.STATE_SUSPENDED, + Schema.MarketTradingMode.TRADING_MODE_MONITORING_AUCTION, + Schema.AuctionTrigger.AUCTION_TRIGGER_LIQUIDITY_TARGET_NOT_MET + ); + cy.mockSubscription(); + cy.visit('/#/markets/market-0'); + cy.wait('@Markets'); + }); + + beforeEach(() => { + cy.setVegaWallet(); + }); + + it('successfully places limit buy order', () => { + cy.mockVegaWalletTransaction(); + const order: OrderSubmission = { + marketId: 'market-0', + type: Schema.OrderType.TYPE_LIMIT, + side: Schema.Side.SIDE_BUY, + timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTC, + size: '100', + postOnly: false, + reduceOnly: false, + price: '200', + }; + createOrder(order); + testOrderSubmission(order, { price: '20000000' }); + }); + + it('successfully places limit sell order', () => { + cy.mockVegaWalletTransaction(); + const order: OrderSubmission = { + marketId: 'market-0', + type: Schema.OrderType.TYPE_LIMIT, + side: Schema.Side.SIDE_SELL, + timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTC, + size: '100', + price: '50000', + postOnly: false, + reduceOnly: false, + }; + createOrder(order); + testOrderSubmission(order, { price: '5000000000' }); + }); + + it('successfully places GTT limit buy order', () => { + cy.mockVegaWalletTransaction(); + const order: OrderSubmission = { + marketId: 'market-0', + type: Schema.OrderType.TYPE_LIMIT, + side: Schema.Side.SIDE_SELL, + timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTT, + size: '100', + price: '1.00', + expiresAt: displayTomorrow(), + postOnly: false, + reduceOnly: false, + }; + createOrder(order); + testOrderSubmission(order, { + price: '100000', + expiresAt: + new Date(order.expiresAt as string).getTime().toString() + '000000', + }); + }); + } +); diff --git a/apps/trading-e2e/src/integration/trading-deal-ticket-submit-opening-auction.cy.ts b/apps/trading-e2e/src/integration/trading-deal-ticket-submit-opening-auction.cy.ts new file mode 100644 index 000000000..024ffb5e0 --- /dev/null +++ b/apps/trading-e2e/src/integration/trading-deal-ticket-submit-opening-auction.cy.ts @@ -0,0 +1,85 @@ +import * as Schema from '@vegaprotocol/types'; +import { testOrderSubmission } from '../support/order-validation'; +import type { OrderSubmission } from '@vegaprotocol/wallet'; +import { createOrder } from '../support/create-order'; + +const displayTomorrow = () => { + const tomorrow = new Date(); + tomorrow.setDate(tomorrow.getDate() + 1); + return tomorrow.toISOString().substring(0, 16); +}; + +describe( + 'must submit order for market in opening auction', + { tags: '@regression' }, + () => { + before(() => { + cy.setVegaWallet(); + cy.mockTradingPage( + Schema.MarketState.STATE_SUSPENDED, + Schema.MarketTradingMode.TRADING_MODE_OPENING_AUCTION, + Schema.AuctionTrigger.AUCTION_TRIGGER_LIQUIDITY_TARGET_NOT_MET + ); + cy.mockSubscription(); + cy.visit('/#/markets/market-0'); + cy.wait('@Markets'); + }); + + beforeEach(() => { + cy.setVegaWallet(); + }); + + it('successfully places limit buy order', () => { + cy.mockVegaWalletTransaction(); + const order: OrderSubmission = { + marketId: 'market-0', + type: Schema.OrderType.TYPE_LIMIT, + side: Schema.Side.SIDE_BUY, + timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTC, + size: '100', + postOnly: false, + reduceOnly: false, + price: '200', + }; + createOrder(order); + testOrderSubmission(order, { price: '20000000' }); + }); + + it('successfully places limit sell order', () => { + cy.mockVegaWalletTransaction(); + const order: OrderSubmission = { + marketId: 'market-0', + type: Schema.OrderType.TYPE_LIMIT, + side: Schema.Side.SIDE_SELL, + timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTC, + size: '100', + postOnly: false, + reduceOnly: false, + price: '50000', + }; + createOrder(order); + testOrderSubmission(order, { price: '5000000000' }); + }); + + it('successfully places GTT limit buy order', () => { + cy.mockVegaWalletTransaction(); + const order: OrderSubmission = { + marketId: 'market-0', + type: Schema.OrderType.TYPE_LIMIT, + side: Schema.Side.SIDE_SELL, + timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTT, + size: '100', + price: '1.00', + expiresAt: displayTomorrow(), + postOnly: false, + reduceOnly: false, + }; + createOrder(order); + testOrderSubmission(order, { + price: '100000', + expiresAt: + new Date(order.expiresAt as string).getTime().toString() + '000000', + }); + }); + } +); diff --git a/apps/trading-e2e/src/integration/trading-deal-ticket-submit-suspended.cy.ts b/apps/trading-e2e/src/integration/trading-deal-ticket-submit-suspended.cy.ts new file mode 100644 index 000000000..e766410e9 --- /dev/null +++ b/apps/trading-e2e/src/integration/trading-deal-ticket-submit-suspended.cy.ts @@ -0,0 +1,68 @@ +import * as Schema from '@vegaprotocol/types'; +import { + TIFlist, + orderPriceField, + orderSizeField, + orderTIFDropDown, + placeOrderBtn, + toggleLimit, + toggleMarket, +} from '../support/deal-ticket'; +import { aliasGQLQuery } from '@vegaprotocol/cypress'; +import { accountsQuery } from '@vegaprotocol/mock'; + +describe('suspended market validation', { tags: '@regression' }, () => { + before(() => { + cy.setVegaWallet(); + cy.mockTradingPage( + Schema.MarketState.STATE_SUSPENDED, + Schema.MarketTradingMode.TRADING_MODE_MONITORING_AUCTION, + Schema.AuctionTrigger.AUCTION_TRIGGER_LIQUIDITY_TARGET_NOT_MET + ); + const accounts = accountsQuery(); + cy.mockGQL((req) => { + aliasGQLQuery(req, 'Accounts', accounts); + }); + cy.mockSubscription(); + cy.visit('/#/markets/market-0'); + cy.wait('@Markets'); + }); + + beforeEach(() => { + cy.setVegaWallet(); + }); + + it('should show warning for market order', function () { + cy.getByTestId(toggleMarket).click(); + cy.getByTestId(placeOrderBtn).should('not.be.disabled'); + cy.getByTestId(placeOrderBtn).click(); + cy.getByTestId(placeOrderBtn).should('be.disabled'); + cy.getByTestId('dealticket-error-message-type').should( + 'have.text', + 'This market is in auction until it reaches sufficient liquidity. Only limit orders are permitted when market is in auction' + ); + }); + + it('should show info for allowed TIF', function () { + cy.getByTestId(toggleLimit).click(); + cy.getByTestId(orderPriceField).clear().type('0.1'); + cy.getByTestId(orderSizeField).clear().type('1'); + cy.getByTestId(placeOrderBtn).should('be.enabled'); + cy.getByTestId('dealticket-warning-auction').should( + 'have.text', + 'Any orders placed now will not trade until the auction ends' + ); + }); + + it('should show warning for not allowed TIF', function () { + cy.getByTestId(toggleLimit).click(); + cy.getByTestId(orderTIFDropDown).select( + TIFlist.filter((item) => item.code === 'FOK')[0].value + ); + cy.getByTestId(placeOrderBtn).should('be.disabled'); + cy.getByTestId('dealticket-error-message-tif').should( + 'have.text', + 'This market is in auction until it reaches sufficient liquidity. Until the auction ends, you can only place GFA, GTT, or GTC limit orders' + ); + }); +}); diff --git a/apps/trading-e2e/src/integration/trading-deal-ticket-submit.cy.ts b/apps/trading-e2e/src/integration/trading-deal-ticket-submit.cy.ts deleted file mode 100644 index 09976c0c7..000000000 --- a/apps/trading-e2e/src/integration/trading-deal-ticket-submit.cy.ts +++ /dev/null @@ -1,580 +0,0 @@ -import * as Schema from '@vegaprotocol/types'; -import { aliasGQLQuery } from '@vegaprotocol/cypress'; -import { testOrderSubmission } from '../support/order-validation'; -import type { OrderSubmission } from '@vegaprotocol/wallet'; -import { - accountsQuery, - estimateOrderQuery, - amendGeneralAccountBalance, -} from '@vegaprotocol/mock'; -import { createOrder } from '../support/create-order'; - -const orderSizeField = 'order-size'; -const orderPriceField = 'order-price'; -const orderTIFDropDown = 'order-tif'; -const placeOrderBtn = 'place-order'; -const toggleLimit = 'order-type-TYPE_LIMIT'; -const toggleMarket = 'order-type-TYPE_MARKET'; - -const TIFlist = Object.values(Schema.OrderTimeInForce).map((value) => { - return { - code: Schema.OrderTimeInForceCode[value], - value, - text: Schema.OrderTimeInForceMapping[value], - }; -}); - -const displayTomorrow = () => { - const tomorrow = new Date(); - tomorrow.setDate(tomorrow.getDate() + 1); - return tomorrow.toISOString().substring(0, 16); -}; - -describe('must submit order', { tags: '@smoke' }, () => { - // 7002-SORD-039 - before(() => { - cy.setVegaWallet(); - cy.mockTradingPage(); - cy.mockSubscription(); - cy.visit('/#/markets/market-0'); - cy.wait('@Markets'); - }); - - beforeEach(() => { - cy.setVegaWallet(); - }); - - it('successfully places market buy order', () => { - // 7002-SORD-010 - // 0003-WTXN-012 - // 0003-WTXN-003 - cy.mockVegaWalletTransaction(); - const order: OrderSubmission = { - marketId: 'market-0', - type: Schema.OrderType.TYPE_MARKET, - side: Schema.Side.SIDE_BUY, - timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_FOK, - postOnly: false, - reduceOnly: false, - size: '100', - }; - createOrder(order); - testOrderSubmission(order); - }); - - it('successfully places market sell order', () => { - cy.mockVegaWalletTransaction(); - const order: OrderSubmission = { - marketId: 'market-0', - type: Schema.OrderType.TYPE_MARKET, - side: Schema.Side.SIDE_SELL, - timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_IOC, - size: '100', - postOnly: false, - reduceOnly: false, - }; - createOrder(order); - testOrderSubmission(order); - }); - - it('successfully places limit buy order', () => { - // 7002-SORD-017 - cy.mockVegaWalletTransaction(); - const order: OrderSubmission = { - marketId: 'market-0', - type: Schema.OrderType.TYPE_LIMIT, - side: Schema.Side.SIDE_BUY, - timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTC, - size: '100', - postOnly: false, - reduceOnly: false, - price: '200', - }; - createOrder(order); - testOrderSubmission(order, { price: '20000000' }); - }); - - it('successfully places limit sell order', () => { - cy.mockVegaWalletTransaction(); - const order: OrderSubmission = { - marketId: 'market-0', - type: Schema.OrderType.TYPE_LIMIT, - side: Schema.Side.SIDE_SELL, - timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GFN, - size: '100', - postOnly: false, - reduceOnly: false, - price: '50000', - }; - createOrder(order); - testOrderSubmission(order, { price: '5000000000' }); - }); - - it('successfully places GTT limit buy order', () => { - cy.mockVegaWalletTransaction(); - const expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000); - const order: OrderSubmission = { - marketId: 'market-0', - type: Schema.OrderType.TYPE_LIMIT, - side: Schema.Side.SIDE_SELL, - timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTT, - size: '100', - price: '1.00', - expiresAt: expiresAt.toISOString().substring(0, 16), - postOnly: false, - reduceOnly: false, - }; - - createOrder(order); - testOrderSubmission(order, { - price: '100000', - expiresAt: - new Date(order.expiresAt as string).getTime().toString() + '000000', - postOnly: false, - reduceOnly: false, - }); - }); -}); - -describe( - 'must submit order for market in batch auction', - { tags: '@regression' }, - () => { - before(() => { - cy.setVegaWallet(); - cy.mockTradingPage( - Schema.MarketState.STATE_SUSPENDED, - Schema.MarketTradingMode.TRADING_MODE_BATCH_AUCTION, - Schema.AuctionTrigger.AUCTION_TRIGGER_LIQUIDITY_TARGET_NOT_MET - ); - cy.mockSubscription(); - cy.visit('/#/markets/market-0'); - cy.wait('@Markets'); - }); - - beforeEach(() => { - cy.setVegaWallet(); - }); - - it('successfully places limit buy order', () => { - cy.mockVegaWalletTransaction(); - const order: OrderSubmission = { - marketId: 'market-0', - type: Schema.OrderType.TYPE_LIMIT, - side: Schema.Side.SIDE_BUY, - timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTC, - size: '100', - postOnly: false, - reduceOnly: false, - price: '200', - }; - createOrder(order); - testOrderSubmission(order, { price: '20000000' }); - }); - - it('successfully places limit sell order', () => { - cy.mockVegaWalletTransaction(); - const order: OrderSubmission = { - marketId: 'market-0', - type: Schema.OrderType.TYPE_LIMIT, - side: Schema.Side.SIDE_SELL, - timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTC, - size: '100', - postOnly: false, - reduceOnly: false, - price: '50000', - }; - createOrder(order); - testOrderSubmission(order, { price: '5000000000' }); - }); - - it('successfully places GTT limit buy order', () => { - cy.mockVegaWalletTransaction(); - const order: OrderSubmission = { - marketId: 'market-0', - type: Schema.OrderType.TYPE_LIMIT, - side: Schema.Side.SIDE_SELL, - timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTT, - size: '100', - postOnly: false, - reduceOnly: false, - price: '1.00', - expiresAt: displayTomorrow(), - }; - createOrder(order); - testOrderSubmission(order, { - price: '100000', - postOnly: false, - reduceOnly: false, - expiresAt: - new Date(order.expiresAt as string).getTime().toString() + '000000', - }); - }); - } -); - -describe( - 'must submit order for market in opening auction', - { tags: '@regression' }, - () => { - before(() => { - cy.setVegaWallet(); - cy.mockTradingPage( - Schema.MarketState.STATE_SUSPENDED, - Schema.MarketTradingMode.TRADING_MODE_OPENING_AUCTION, - Schema.AuctionTrigger.AUCTION_TRIGGER_LIQUIDITY_TARGET_NOT_MET - ); - cy.mockSubscription(); - cy.visit('/#/markets/market-0'); - cy.wait('@Markets'); - }); - - beforeEach(() => { - cy.setVegaWallet(); - }); - - it('successfully places limit buy order', () => { - cy.mockVegaWalletTransaction(); - const order: OrderSubmission = { - marketId: 'market-0', - type: Schema.OrderType.TYPE_LIMIT, - side: Schema.Side.SIDE_BUY, - timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTC, - size: '100', - postOnly: false, - reduceOnly: false, - price: '200', - }; - createOrder(order); - testOrderSubmission(order, { price: '20000000' }); - }); - - it('successfully places limit sell order', () => { - cy.mockVegaWalletTransaction(); - const order: OrderSubmission = { - marketId: 'market-0', - type: Schema.OrderType.TYPE_LIMIT, - side: Schema.Side.SIDE_SELL, - timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTC, - size: '100', - postOnly: false, - reduceOnly: false, - price: '50000', - }; - createOrder(order); - testOrderSubmission(order, { price: '5000000000' }); - }); - - it('successfully places GTT limit buy order', () => { - cy.mockVegaWalletTransaction(); - const order: OrderSubmission = { - marketId: 'market-0', - type: Schema.OrderType.TYPE_LIMIT, - side: Schema.Side.SIDE_SELL, - timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTT, - size: '100', - price: '1.00', - expiresAt: displayTomorrow(), - postOnly: false, - reduceOnly: false, - }; - createOrder(order); - testOrderSubmission(order, { - price: '100000', - expiresAt: - new Date(order.expiresAt as string).getTime().toString() + '000000', - }); - }); - } -); - -describe( - 'must submit order for market in monitoring auction', - { tags: '@regression' }, - () => { - before(() => { - cy.setVegaWallet(); - cy.mockTradingPage( - Schema.MarketState.STATE_SUSPENDED, - Schema.MarketTradingMode.TRADING_MODE_MONITORING_AUCTION, - Schema.AuctionTrigger.AUCTION_TRIGGER_LIQUIDITY_TARGET_NOT_MET - ); - cy.mockSubscription(); - cy.visit('/#/markets/market-0'); - cy.wait('@Markets'); - }); - - beforeEach(() => { - cy.setVegaWallet(); - }); - - it('successfully places limit buy order', () => { - cy.mockVegaWalletTransaction(); - const order: OrderSubmission = { - marketId: 'market-0', - type: Schema.OrderType.TYPE_LIMIT, - side: Schema.Side.SIDE_BUY, - timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTC, - size: '100', - postOnly: false, - reduceOnly: false, - price: '200', - }; - createOrder(order); - testOrderSubmission(order, { price: '20000000' }); - }); - - it('successfully places limit sell order', () => { - cy.mockVegaWalletTransaction(); - const order: OrderSubmission = { - marketId: 'market-0', - type: Schema.OrderType.TYPE_LIMIT, - side: Schema.Side.SIDE_SELL, - timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTC, - size: '100', - price: '50000', - postOnly: false, - reduceOnly: false, - }; - createOrder(order); - testOrderSubmission(order, { price: '5000000000' }); - }); - - it('successfully places GTT limit buy order', () => { - cy.mockVegaWalletTransaction(); - const order: OrderSubmission = { - marketId: 'market-0', - type: Schema.OrderType.TYPE_LIMIT, - side: Schema.Side.SIDE_SELL, - timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_GTT, - size: '100', - price: '1.00', - expiresAt: displayTomorrow(), - postOnly: false, - reduceOnly: false, - }; - createOrder(order); - testOrderSubmission(order, { - price: '100000', - expiresAt: - new Date(order.expiresAt as string).getTime().toString() + '000000', - }); - }); - } -); - -describe('suspended market validation', { tags: '@regression' }, () => { - before(() => { - cy.setVegaWallet(); - cy.mockTradingPage( - Schema.MarketState.STATE_SUSPENDED, - Schema.MarketTradingMode.TRADING_MODE_MONITORING_AUCTION, - Schema.AuctionTrigger.AUCTION_TRIGGER_LIQUIDITY_TARGET_NOT_MET - ); - const accounts = accountsQuery(); - cy.mockGQL((req) => { - aliasGQLQuery(req, 'Accounts', accounts); - }); - cy.mockSubscription(); - cy.visit('/#/markets/market-0'); - cy.wait('@Markets'); - }); - - beforeEach(() => { - cy.setVegaWallet(); - }); - - it('should show warning for market order', function () { - cy.getByTestId(toggleMarket).click(); - cy.getByTestId(placeOrderBtn).should('not.be.disabled'); - cy.getByTestId(placeOrderBtn).click(); - cy.getByTestId(placeOrderBtn).should('be.disabled'); - cy.getByTestId('dealticket-error-message-type').should( - 'have.text', - 'This market is in auction until it reaches sufficient liquidity. Only limit orders are permitted when market is in auction' - ); - }); - - it('should show info for allowed TIF', function () { - cy.getByTestId(toggleLimit).click(); - cy.getByTestId(orderPriceField).clear().type('0.1'); - cy.getByTestId(orderSizeField).clear().type('1'); - cy.getByTestId(placeOrderBtn).should('be.enabled'); - cy.getByTestId('dealticket-warning-auction').should( - 'have.text', - 'Any orders placed now will not trade until the auction ends' - ); - }); - - it('should show warning for not allowed TIF', function () { - cy.getByTestId(toggleLimit).click(); - cy.getByTestId(orderTIFDropDown).select( - TIFlist.filter((item) => item.code === 'FOK')[0].value - ); - cy.getByTestId(placeOrderBtn).should('be.disabled'); - cy.getByTestId('dealticket-error-message-tif').should( - 'have.text', - 'This market is in auction until it reaches sufficient liquidity. Until the auction ends, you can only place GFA, GTT, or GTC limit orders' - ); - }); -}); - -describe('account validation', { tags: '@regression' }, () => { - describe('zero balance error', () => { - beforeEach(() => { - cy.setVegaWallet(); - cy.mockTradingPage(); - const accounts = accountsQuery(); - amendGeneralAccountBalance(accounts, 'market-0', '0'); - cy.mockGQL((req) => { - aliasGQLQuery(req, 'Accounts', accounts); - }); - cy.mockSubscription(); - cy.visit('/#/markets/market-0'); - cy.wait('@Markets'); - }); - - it('should show an error if your balance is zero', () => { - cy.getByTestId('place-order').should('be.disabled'); - // 7002-SORD-003 - cy.getByTestId('dealticket-error-message-zero-balance').should( - 'have.text', - 'You need ' + - 'tDAI' + - ' in your wallet to trade in this market.See all your collateral.Make a deposit' - ); - cy.getByTestId('deal-ticket-deposit-dialog-button').should('exist'); - }); - }); - - describe('not enough balance warning', () => { - beforeEach(() => { - cy.setVegaWallet(); - cy.mockTradingPage(); - const accounts = accountsQuery(); - amendGeneralAccountBalance(accounts, 'market-0', '100000000'); - cy.mockGQL((req) => { - aliasGQLQuery(req, 'Accounts', accounts); - }); - cy.mockGQL((req) => { - aliasGQLQuery(req, 'EstimateOrder', estimateOrderQuery()); - }); - cy.mockSubscription(); - cy.visit('/#/markets/market-0'); - cy.wait('@Markets'); - }); - - it('should display info and button for deposit', () => { - // 7002-SORD-003 - - // warning should show immediately - cy.getByTestId('dealticket-warning-margin').should( - 'contain.text', - 'You may not have enough margin available to open this position' - ); - cy.getByTestId('dealticket-warning-margin').should( - 'contain.text', - 'You may not have enough margin available to open this position. 2,354.72283 tDAI is currently required. You have only 1,000.01 tDAI available.' - ); - cy.getByTestId('deal-ticket-deposit-dialog-button').click(); - cy.getByTestId('dialog-content') - .find('h1') - .eq(0) - .should('have.text', 'Deposit'); - }); - }); - - describe('must submit order', { tags: '@smoke' }, () => { - // 7002-SORD-039 - beforeEach(() => { - cy.setVegaWallet(); - cy.mockTradingPage(); - cy.mockSubscription(); - cy.visit('/#/markets/market-0'); - cy.wait('@Markets'); - }); - - it('must see a prompt to check connected vega wallet to approve transaction', () => { - // 0003-WTXN-002 - cy.mockVegaWalletTransaction(1000); - const order: OrderSubmission = { - marketId: 'market-0', - type: Schema.OrderType.TYPE_MARKET, - side: Schema.Side.SIDE_BUY, - timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_FOK, - size: '100', - }; - createOrder(order); - cy.getByTestId('toast-content').should( - 'contain.text', - 'Please go to your Vega wallet application and approve or reject the transaction.' - ); - }); - - it('must show error returned by wallet ', () => { - // 0003-WTXN-009 - // 0003-WTXN-011 - // 0002-WCON-016 - // 0003-WTXN-008 - - //trigger error from the wallet - cy.intercept('POST', 'http://localhost:1789/api/v2/requests', (req) => { - req.on('response', (res) => { - res.send({ - jsonrpc: '2.0', - id: '1', - }); - }); - }); - - const order: OrderSubmission = { - marketId: 'market-0', - type: Schema.OrderType.TYPE_MARKET, - side: Schema.Side.SIDE_BUY, - timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_FOK, - size: '100', - }; - createOrder(order); - cy.getByTestId('toast-content').should( - 'contain.text', - 'The connection to your Vega Wallet has been lost.' - ); - cy.getByTestId('connect-vega-wallet').click(); - cy.getByTestId('dialog-content').should('be.visible'); - }); - - it('must see that the order was rejected by the connected wallet', () => { - // 0003-WTXN-007 - - //trigger rejection error from the wallet - cy.intercept('POST', 'http://localhost:1789/api/v2/requests', (req) => { - req.alias = 'client.send_transaction'; - req.reply({ - statusCode: 400, - body: { - jsonrpc: '2.0', - error: { - code: 3001, - data: 'the user rejected the wallet connection', - message: 'User error', - }, - id: '0', - }, - }); - }); - - const order: OrderSubmission = { - marketId: 'market-0', - type: Schema.OrderType.TYPE_MARKET, - side: Schema.Side.SIDE_BUY, - timeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_FOK, - size: '100', - }; - createOrder(order); - cy.getByTestId('toast-content').should( - 'contain.text', - 'Error occurredthe user rejected the wallet connection' - ); - }); - }); -}); diff --git a/apps/trading-e2e/src/integration/trading-deal-ticket-time-in-force.cy.ts b/apps/trading-e2e/src/integration/trading-deal-ticket-time-in-force.cy.ts new file mode 100644 index 000000000..c7112276d --- /dev/null +++ b/apps/trading-e2e/src/integration/trading-deal-ticket-time-in-force.cy.ts @@ -0,0 +1,157 @@ +import { + TIFlist, + orderTIFDropDown, + toggleLimit, + toggleMarket, +} from '../support/deal-ticket'; + +describe('time in force validation', { tags: '@smoke' }, () => { + before(() => { + cy.setVegaWallet(); + cy.mockTradingPage(); + cy.mockSubscription(); + cy.clearAllLocalStorage(); + cy.visit('/#/markets/market-0'); + cy.wait('@Markets'); + }); + + it('must have market order set up to IOC by default', function () { + // 7002-SORD-030 + cy.getByTestId(toggleMarket).click(); + cy.get(`[data-testid=${orderTIFDropDown}] option:selected`).should( + 'have.text', + TIFlist.filter((item) => item.code === 'IOC')[0].text + ); + }); + + it('must have time in force set to GTC for limit order', function () { + // 7002-SORD-031 + cy.getByTestId(toggleLimit).click(); + cy.get(`[data-testid=${orderTIFDropDown}] option:selected`).should( + 'have.text', + TIFlist.filter((item) => item.code === 'GTC')[0].text + ); + }); + + it('selections should be remembered', () => { + cy.getByTestId(orderTIFDropDown).select('TIME_IN_FORCE_GTT'); + cy.getByTestId(toggleMarket).click(); + cy.get(`[data-testid=${orderTIFDropDown}] option:selected`).should( + 'have.text', + TIFlist.filter((item) => item.code === 'IOC')[0].text + ); + cy.getByTestId(orderTIFDropDown).select('TIME_IN_FORCE_FOK'); + cy.getByTestId(toggleLimit).click(); + cy.get(`[data-testid=${orderTIFDropDown}] option:selected`).should( + 'have.text', + TIFlist.filter((item) => item.code === 'GTT')[0].text + ); + cy.getByTestId(toggleMarket).click(); + cy.get(`[data-testid=${orderTIFDropDown}] option:selected`).should( + 'have.text', + TIFlist.filter((item) => item.code === 'FOK')[0].text + ); + }); + + describe('limit order', () => { + before(() => { + cy.getByTestId(toggleLimit).click(); + }); + const validTIF = TIFlist; + validTIF.forEach((tif) => { + // 7002-SORD-023 + // 7002-SORD-024 + // 7002-SORD-025 + // 7002-SORD-026 + // 7002-SORD-027 + // 7002-SORD-028 + + it(`must be able to select ${tif.code}`, function () { + cy.getByTestId(orderTIFDropDown).select(tif.value); + cy.get(`[data-testid=${orderTIFDropDown}] option:selected`).should( + 'have.text', + tif.text + ); + }); + }); + }); + + describe('market order', () => { + before(() => { + cy.getByTestId(toggleMarket).click(); + }); + + const validTIF = TIFlist.filter((tif) => ['FOK', 'IOC'].includes(tif.code)); + const invalidTIF = TIFlist.filter( + (tif) => !['FOK', 'IOC'].includes(tif.code) + ); + + validTIF.forEach((tif) => { + // 7002-SORD-025 + // 7002-SORD-026 + + it(`must be able to select ${tif.code}`, function () { + cy.getByTestId(orderTIFDropDown).select(tif.value); + cy.get(`[data-testid=${orderTIFDropDown}] option:selected`).should( + 'have.text', + tif.text + ); + }); + }); + + invalidTIF.forEach((tif) => { + // 7002-SORD-023 + // 7002-SORD-024 + // 7002-SORD-027 + // 7002-SORD-028 + it(`must not be able to select ${tif.code}`, function () { + cy.getByTestId(orderTIFDropDown).should('not.contain', tif.text); + }); + }); + }); + + describe('post and reduce - market order', () => { + before(() => { + cy.getByTestId(toggleMarket).click(); + }); + + const validTIF = TIFlist.filter((tif) => ['FOK', 'IOC'].includes(tif.code)); + + validTIF.forEach((tif) => { + // 7002-SORD-025 + // 7002-SORD-026 + + it(`post and reduce order market for ${tif.code}`, function () { + cy.getByTestId(orderTIFDropDown).select(tif.value); + cy.get(`[data-testid=${orderTIFDropDown}] option:selected`).should( + 'have.text', + tif.text + ); + cy.getByTestId('post-only').should('be.disabled'); + cy.getByTestId('reduce-only').should('be.enabled'); + }); + }); + }); + + describe('post and reduce - limit order', () => { + before(() => { + cy.getByTestId(toggleLimit).click(); + }); + + const validTIFLimit = TIFlist.filter((tif) => + ['GFA', 'GFN', 'GTC', 'GTT'].includes(tif.code) + ); + + validTIFLimit.forEach((tif) => { + it(`post and reduce order for limit ${tif.code}`, function () { + cy.getByTestId(orderTIFDropDown).select(tif.value); + cy.get(`[data-testid=${orderTIFDropDown}] option:selected`).should( + 'have.text', + tif.text + ); + cy.getByTestId('post-only').should('be.enabled'); + cy.getByTestId('reduce-only').should('be.disabled'); + }); + }); + }); +}); diff --git a/apps/trading-e2e/src/integration/trading-deal-ticket-validations.cy.ts b/apps/trading-e2e/src/integration/trading-deal-ticket-validations.cy.ts deleted file mode 100644 index b84b2f783..000000000 --- a/apps/trading-e2e/src/integration/trading-deal-ticket-validations.cy.ts +++ /dev/null @@ -1,329 +0,0 @@ -import * as Schema from '@vegaprotocol/types'; -import { mockConnectWallet } from '@vegaprotocol/cypress'; - -const orderSizeField = 'order-size'; -const orderPriceField = 'order-price'; -const orderTIFDropDown = 'order-tif'; -const placeOrderBtn = 'place-order'; -const toggleShort = 'order-side-SIDE_SELL'; -const toggleLong = 'order-side-SIDE_BUY'; -const toggleLimit = 'order-type-TYPE_LIMIT'; -const toggleMarket = 'order-type-TYPE_MARKET'; - -const TIFlist = Object.values(Schema.OrderTimeInForce).map((value) => { - return { - code: Schema.OrderTimeInForceCode[value], - value, - text: Schema.OrderTimeInForceMapping[value], - }; -}); - -describe('time in force default values', () => { - before(() => { - cy.setVegaWallet(); - cy.mockTradingPage(); - cy.mockSubscription(); - cy.visit('/#/markets/market-0'); - cy.wait('@Markets'); - }); - - it('must have market order set up to IOC by default', function () { - // 7002-SORD-030 - cy.getByTestId(toggleMarket).click(); - cy.get(`[data-testid=${orderTIFDropDown}] option:selected`).should( - 'have.text', - TIFlist.filter((item) => item.code === 'IOC')[0].text - ); - }); - - it('must have time in force set to GTC for limit order', function () { - // 7002-SORD-031 - cy.getByTestId(toggleLimit).click(); - cy.get(`[data-testid=${orderTIFDropDown}] option:selected`).should( - 'have.text', - TIFlist.filter((item) => item.code === 'GTC')[0].text - ); - }); -}); - -describe('deal ticket validation', { tags: '@smoke' }, () => { - beforeEach(() => { - cy.mockTradingPage(); - cy.visit('/#/markets/market-0'); - cy.wait('@Markets'); - }); - - it('must show place order button and connect wallet if wallet is not connected', () => { - // 0003-WTXN-001 - cy.getByTestId('connect-vega-wallet'); // Not connected - cy.getByTestId('order-connect-wallet').should('exist'); - cy.getByTestId(placeOrderBtn).should('exist'); - cy.getByTestId('deal-ticket-connect-wallet').should('exist'); - }); - - it('must be able to select order direction - long/short', function () { - // 7002-SORD-004 - cy.getByTestId(toggleShort).click().children('input').should('be.checked'); - cy.getByTestId(toggleLong).click().children('input').should('be.checked'); - }); - - it('must be able to select order type - limit/market', function () { - // 7002-SORD-005 - // 7002-SORD-006 - // 7002-SORD-007 - cy.getByTestId(toggleLimit).click().children('input').should('be.checked'); - cy.getByTestId(toggleMarket).click().children('input').should('be.checked'); - }); - - it('order connect vega wallet button should connect', () => { - mockConnectWallet(); - cy.getByTestId(toggleLimit).click(); - cy.getByTestId(orderPriceField).clear().type('101'); - cy.getByTestId('order-connect-wallet').click(); - cy.getByTestId('dialog-content').should('be.visible'); - cy.getByTestId('connectors-list') - .find('[data-testid="connector-jsonRpc"]') - .click(); - cy.wait('@walletReq'); - cy.getByTestId(placeOrderBtn).should('be.visible'); - cy.getByTestId(toggleLimit).children('input').should('be.checked'); - cy.getByTestId(orderPriceField).should('have.value', '101'); - }); -}); - -describe('deal ticket size validation', { tags: '@smoke' }, function () { - beforeEach(() => { - cy.setVegaWallet(); - cy.mockTradingPage(); - cy.visit('/#/markets/market-0'); - cy.wait('@Markets'); - }); - - it('must warn if order size input has too many digits after the decimal place', function () { - // 7002-SORD-016 - cy.getByTestId('order-type-TYPE_MARKET').click(); - cy.getByTestId(orderSizeField).clear().type('1.234'); - cy.getByTestId(placeOrderBtn).should('not.be.disabled'); - cy.getByTestId(placeOrderBtn).click(); - cy.getByTestId(placeOrderBtn).should('be.disabled'); - cy.getByTestId('dealticket-error-message-size-market').should( - 'have.text', - 'Size must be whole numbers for this market' - ); - }); - - it('must warn if order size is set to 0', function () { - cy.getByTestId('order-type-TYPE_MARKET').click(); - cy.getByTestId(orderSizeField).clear().type('0'); - cy.getByTestId(placeOrderBtn).should('not.be.disabled'); - cy.getByTestId(placeOrderBtn).click(); - cy.getByTestId(placeOrderBtn).should('be.disabled'); - cy.getByTestId('dealticket-error-message-size-market').should( - 'have.text', - 'Size cannot be lower than 1' - ); - }); -}); - -describe('limit order validations', { tags: '@smoke' }, () => { - before(() => { - cy.setVegaWallet(); - cy.mockTradingPage(); - cy.mockSubscription(); - cy.visit('/#/markets/market-0'); - cy.wait('@Markets'); - cy.getByTestId(toggleLimit).click(); - }); - - beforeEach(() => { - cy.setVegaWallet(); - }); - - it('must see the price unit', function () { - // 7002-SORD-018 - cy.getByTestId(orderPriceField) - .siblings('label') - .should('have.text', 'Price (DAI)'); - }); - - it('must see warning when placing an order with expiry date in past', () => { - const expiresAt = new Date(Date.now() - 24 * 60 * 60 * 1000); - const expiresAtInputValue = expiresAt.toISOString().substring(0, 16); - cy.getByTestId(toggleLimit).click(); - cy.getByTestId(orderPriceField).clear().type('0.1'); - cy.getByTestId(orderSizeField).clear().type('1'); - cy.getByTestId(orderTIFDropDown).select('TIME_IN_FORCE_GTT'); - - cy.log('choosing yesterday'); - cy.getByTestId('date-picker-field').type(expiresAtInputValue); - - cy.getByTestId(placeOrderBtn).click(); - - cy.getByTestId('dealticket-error-message-expiry').should( - 'have.text', - 'The expiry date that you have entered appears to be in the past' - ); - }); - - it('must see warning if price has too many digits after decimal place', function () { - // 7002-SORD-059 - cy.getByTestId(toggleLimit).click(); - cy.getByTestId(orderTIFDropDown).select('TIME_IN_FORCE_GTC'); - cy.getByTestId(orderSizeField).clear().type('1'); - cy.getByTestId(orderPriceField).clear().type('1.123456'); - cy.getByTestId('dealticket-error-message-price-limit').should( - 'have.text', - 'Price accepts up to 5 decimal places' - ); - }); - - describe('time in force validations', function () { - const validTIF = TIFlist; - validTIF.forEach((tif) => { - // 7002-SORD-023 - // 7002-SORD-024 - // 7002-SORD-025 - // 7002-SORD-026 - // 7002-SORD-027 - // 7002-SORD-028 - - it(`must be able to select ${tif.code}`, function () { - cy.getByTestId(orderTIFDropDown).select(tif.value); - cy.get(`[data-testid=${orderTIFDropDown}] option:selected`).should( - 'have.text', - tif.text - ); - }); - }); - - it('selections should be remembered', () => { - cy.getByTestId(orderTIFDropDown).select('TIME_IN_FORCE_GTT'); - cy.getByTestId(toggleMarket).click(); - cy.get(`[data-testid=${orderTIFDropDown}] option:selected`).should( - 'have.text', - TIFlist.filter((item) => item.code === 'IOC')[0].text - ); - cy.getByTestId(orderTIFDropDown).select('TIME_IN_FORCE_FOK'); - cy.getByTestId(toggleLimit).click(); - cy.get(`[data-testid=${orderTIFDropDown}] option:selected`).should( - 'have.text', - TIFlist.filter((item) => item.code === 'GTT')[0].text - ); - cy.getByTestId(toggleMarket).click(); - cy.get(`[data-testid=${orderTIFDropDown}] option:selected`).should( - 'have.text', - TIFlist.filter((item) => item.code === 'FOK')[0].text - ); - }); - }); -}); - -describe('market order validations', { tags: '@smoke' }, () => { - before(() => { - cy.setVegaWallet(); - cy.mockTradingPage(); - cy.visit('/#/markets/market-0'); - cy.wait('@Markets'); - cy.getByTestId(toggleMarket).click(); - }); - - beforeEach(() => { - cy.setVegaWallet(); - }); - - it('must not see the price unit', function () { - // 7002-SORD-019 - cy.getByTestId(orderPriceField).should('not.exist'); - }); - - describe('time in force validations', function () { - const validTIF = TIFlist.filter((tif) => ['FOK', 'IOC'].includes(tif.code)); - const invalidTIF = TIFlist.filter( - (tif) => !['FOK', 'IOC'].includes(tif.code) - ); - - validTIF.forEach((tif) => { - // 7002-SORD-025 - // 7002-SORD-026 - - it(`must be able to select ${tif.code}`, function () { - cy.getByTestId(orderTIFDropDown).select(tif.value); - cy.get(`[data-testid=${orderTIFDropDown}] option:selected`).should( - 'have.text', - tif.text - ); - }); - }); - - invalidTIF.forEach((tif) => { - // 7002-SORD-023 - // 7002-SORD-024 - // 7002-SORD-027 - // 7002-SORD-028 - it(`must not be able to select ${tif.code}`, function () { - cy.getByTestId(orderTIFDropDown).should('not.contain', tif.text); - }); - }); - }); -}); - -describe('post and reduce order validations', { tags: '@smoke' }, () => { - before(() => { - cy.setVegaWallet(); - cy.mockTradingPage(); - cy.visit('/#/markets/market-0'); - cy.wait('@Markets'); - cy.getByTestId(toggleMarket).click(); - }); - - beforeEach(() => { - cy.setVegaWallet(); - }); - - const validTIF = TIFlist.filter((tif) => ['FOK', 'IOC'].includes(tif.code)); - - validTIF.forEach((tif) => { - // 7002-SORD-025 - // 7002-SORD-026 - - it(`post and reduce order market for ${tif.code}`, function () { - cy.getByTestId(orderTIFDropDown).select(tif.value); - cy.get(`[data-testid=${orderTIFDropDown}] option:selected`).should( - 'have.text', - tif.text - ); - cy.getByTestId('post-only').should('be.disabled'); - cy.getByTestId('reduce-only').should('be.enabled'); - }); - }); - - validTIF.forEach((tif) => { - it(`post and reduce order limit for ${tif.code}`, function () { - cy.getByTestId(toggleLimit).click(); - cy.getByTestId(orderTIFDropDown).select(tif.value); - cy.get(`[data-testid=${orderTIFDropDown}] option:selected`).should( - 'have.text', - tif.text - ); - cy.getByTestId('post-only').should('be.disabled'); - cy.getByTestId('reduce-only').should('be.enabled'); - }); - }); - - const validTIFLimit = TIFlist.filter((tif) => - ['GFA', 'GFN', 'GTC', 'GTT'].includes(tif.code) - ); - - validTIFLimit.forEach((tif) => { - it(`post and reduce order for limit ${tif.code}`, function () { - cy.getByTestId(toggleLimit).click(); - cy.getByTestId(orderTIFDropDown).select(tif.value); - cy.get(`[data-testid=${orderTIFDropDown}] option:selected`).should( - 'have.text', - tif.text - ); - cy.getByTestId('post-only').should('be.enabled'); - cy.getByTestId('reduce-only').should('be.disabled'); - }); - }); -}); diff --git a/apps/trading-e2e/src/integration/trading-orders.cy.ts b/apps/trading-e2e/src/integration/trading-orders.cy.ts index d22054c04..f3a459f7a 100644 --- a/apps/trading-e2e/src/integration/trading-orders.cy.ts +++ b/apps/trading-e2e/src/integration/trading-orders.cy.ts @@ -21,7 +21,7 @@ const cancelOrderBtn = 'cancel'; const cancelAllOrdersBtn = 'cancelAll'; const editOrderBtn = 'edit'; -describe('orders list', { tags: '@smoke' }, () => { +describe('orders list', { tags: '@smoke', testIsolation: true }, () => { beforeEach(() => { const subscriptionMocks = getSubscriptionMocks(); cy.spy(subscriptionMocks, 'OrdersUpdate'); @@ -89,15 +89,17 @@ describe('orders list', { tags: '@smoke' }, () => { cy.contains('Partially Filled').click(); cy.getByTestId('Orders').click(); - cy.get(`[row-id="${partiallyFilledId}"]`).within(() => { - cy.get(`[col-id='${orderStatus}']`).should( - 'have.text', - 'Partially Filled' - ); - cy.get(`[col-id='${orderRemaining}']`).should('have.text', '7/10'); - cy.getByTestId(cancelOrderBtn).should('not.exist'); - cy.getByTestId(editOrderBtn).should('not.exist'); - }); + cy.get(`[row-id="${partiallyFilledId}"]`) + .eq(1) + .within(() => { + cy.get(`[col-id='${orderStatus}']`).should( + 'have.text', + 'Partially Filled' + ); + cy.get(`[col-id='${orderRemaining}']`).should('have.text', '7/10'); + cy.getByTestId(cancelOrderBtn).should('not.exist'); + cy.getByTestId(editOrderBtn).should('not.exist'); + }); }); it('orders are sorted by most recent order', () => { @@ -424,7 +426,7 @@ describe('amend and cancel order', { tags: '@smoke' }, () => { .find(`[data-testid="cancel"]`) .should('have.text', 'Cancel') .then(($btn) => { - cy.wrap($btn).click(); + cy.wrap($btn).click({ force: true }); const order: OrderCancellation = { orderId: orderId, marketId: 'market-0', @@ -445,7 +447,7 @@ describe('amend and cancel order', { tags: '@smoke' }, () => { cy.get(`[data-testid="cancelAll"]`) .should('have.text', 'Cancel all') .then(($btn) => { - cy.wrap($btn).click(); + cy.wrap($btn).click({ force: true }); const order: OrderCancellation = { marketId: 'market-0', }; @@ -464,7 +466,7 @@ describe('amend and cancel order', { tags: '@smoke' }, () => { .find('[data-testid="edit"]') .should('have.text', 'Edit') .then(($btn) => { - cy.wrap($btn).click(); + cy.wrap($btn).click({ force: true }); cy.getByTestId('dialog-title').should('have.text', 'Edit order'); cy.get('#limitPrice').focus().clear().type('0.111111'); cy.getByTestId('edit-order').find('[type="submit"]').click(); diff --git a/apps/trading-e2e/src/integration/trading-positions.cy.ts b/apps/trading-e2e/src/integration/trading-positions.cy.ts index 1d4c12b78..64b729bea 100644 --- a/apps/trading-e2e/src/integration/trading-positions.cy.ts +++ b/apps/trading-e2e/src/integration/trading-positions.cy.ts @@ -8,7 +8,7 @@ beforeEach(() => { cy.setVegaWallet(); }); -describe('positions', { tags: '@smoke' }, () => { +describe('positions', { tags: '@smoke', testIsolation: true }, () => { it('renders positions on trading page', () => { cy.visit('/#/markets/market-0'); cy.getByTestId('Positions').click(); @@ -53,13 +53,17 @@ describe('positions', { tags: '@smoke' }, () => { 'currentLeverage', 'averageEntryPrice', ]; - cy.getByTestId('tab-positions').within(() => { - cy.get('[row-id="market-2"]').within(() => { - emptyCells.forEach((cell) => { - cy.get(`[col-id="${cell}"]`).should('contain.text', '-'); - }); + cy.getByTestId('tab-positions') + .first() + .within(() => { + cy.get('[row-id="market-2"]') + .eq(1) + .within(() => { + emptyCells.forEach((cell) => { + cy.get(`[col-id="${cell}"]`).should('contain.text', '-'); + }); + }); }); - }); }); it('error message should be displayed', () => { const errors = [ diff --git a/apps/trading-e2e/src/integration/wallet-eth.cy.ts b/apps/trading-e2e/src/integration/wallet-eth.cy.ts index 8e3947160..545fcd30f 100644 --- a/apps/trading-e2e/src/integration/wallet-eth.cy.ts +++ b/apps/trading-e2e/src/integration/wallet-eth.cy.ts @@ -2,7 +2,7 @@ import { connectEthereumWallet } from '../support/ethereum-wallet'; const connectEthWalletBtn = 'connect-eth-wallet-btn'; -describe('ethereum wallet', { tags: '@smoke' }, () => { +describe('ethereum wallet', { tags: '@smoke', testIsolation: true }, () => { beforeEach(() => { cy.mockWeb3Provider(); // Using portfolio withdrawals tab is it requires Ethereum wallet connection @@ -27,7 +27,7 @@ describe('ethereum wallet', { tags: '@smoke' }, () => { cy.getByTestId('tab-deposits').should('not.be.empty'); }); - it('should see an option to cancel the attempted connection', () => { + it('should see QR code modal for WalletConnect', () => { // 0004-EWAL-003 cy.wait('@NetworkParams'); @@ -36,8 +36,8 @@ describe('ethereum wallet', { tags: '@smoke' }, () => { cy.getByTestId('connect-eth-wallet-btn').click(); cy.getByTestId('web3-connector-list').should('exist'); cy.getByTestId('web3-connector-WalletConnect').click(); - cy.get('#walletconnect-qrcode-text').should('exist'); - cy.get('#walletconnect-qrcode-close').click(); + // testing if exists rather than visible because of the long loading time + cy.get('w3m-modal').should('exist'); }); it('able to disconnect eth wallet', () => { diff --git a/apps/trading-e2e/src/integration/wallet-vega.cy.ts b/apps/trading-e2e/src/integration/wallet-vega.cy.ts index 0d25c8892..5842f2e21 100644 --- a/apps/trading-e2e/src/integration/wallet-vega.cy.ts +++ b/apps/trading-e2e/src/integration/wallet-vega.cy.ts @@ -8,103 +8,115 @@ const manageVegaBtn = 'manage-vega-wallet'; const form = 'rest-connector-form'; const dialogContent = 'dialog-content'; -describe('connect hosted wallet', { tags: '@smoke' }, () => { - beforeEach(() => { - // Using portfolio page as it requires vega wallet connection - cy.visit('/#/portfolio'); - cy.mockTradingPage(); - cy.mockSubscription(); - cy.get('main[data-testid="/portfolio"]').should('exist'); - }); - - it('can connect', () => { - // 0002-WCON-002 - // 0002-WCON-003 - // 0002-WCON-039 - // 0002-WCON-017 - // 0002-WCON-018 - // 0002-WCON-019 - - // Mock authentication - cy.intercept('POST', 'https://wallet.testnet.vega.xyz/api/v1/auth/token', { - body: { - token: 'test-token', - }, +describe( + 'connect hosted wallet', + { tags: '@smoke', testIsolation: true }, + () => { + beforeEach(() => { + // Using portfolio page as it requires vega wallet connection + cy.visit('/#/portfolio'); + cy.mockTradingPage(); + cy.mockSubscription(); + cy.get('main[data-testid="/portfolio"]').should('exist'); }); - // Mock getting keys from wallet - cy.intercept('GET', 'https://wallet.testnet.vega.xyz/api/v1/keys', { - body: { - keys: [ - { - algorithm: { - name: 'algo', - version: 1, - }, - index: 0, - meta: [], - pub: 'HOSTED_PUBKEY', - tainted: false, + + it('can connect', () => { + // 0002-WCON-002 + // 0002-WCON-003 + // 0002-WCON-039 + // 0002-WCON-017 + // 0002-WCON-018 + // 0002-WCON-019 + + // Mock authentication + cy.intercept( + 'POST', + 'https://wallet.testnet.vega.xyz/api/v1/auth/token', + { + body: { + token: 'test-token', }, - ], - }, + } + ); + // Mock getting keys from wallet + cy.intercept('GET', 'https://wallet.testnet.vega.xyz/api/v1/keys', { + body: { + keys: [ + { + algorithm: { + name: 'algo', + version: 1, + }, + index: 0, + meta: [], + pub: 'HOSTED_PUBKEY', + tainted: false, + }, + ], + }, + }); + cy.getByTestId(connectVegaBtn).click(); + cy.contains( + 'Choose wallet app to connect, or to change port or server URL enter a custom wallet location first' + ); + cy.contains('Connect Vega wallet'); + cy.contains('Hosted Fairground wallet'); + + cy.getByTestId('connectors-list') + .find('[data-testid="connector-hosted"]') + .click(); + cy.getByTestId(form).find('#wallet').click().type('user'); + cy.getByTestId(form).find('#passphrase').click().type('pass'); + cy.getByTestId('rest-connector-form').find('button[type=submit]').click(); + cy.getByTestId(manageVegaBtn).should('exist'); + cy.getByTestId('manage-vega-wallet').click(); + cy.getByTestId('keypair-list').should('exist'); }); - cy.getByTestId(connectVegaBtn).click(); - cy.contains( - 'Choose wallet app to connect, or to change port or server URL enter a custom wallet location first' - ); - cy.contains('Connect Vega wallet'); - cy.contains('Hosted Fairground wallet'); - cy.getByTestId('connectors-list') - .find('[data-testid="connector-hosted"]') - .click(); - cy.getByTestId(form).find('#wallet').click().type('user'); - cy.getByTestId(form).find('#passphrase').click().type('pass'); - cy.getByTestId('rest-connector-form').find('button[type=submit]').click(); - cy.getByTestId(manageVegaBtn).should('exist'); - cy.getByTestId('manage-vega-wallet').click(); - cy.getByTestId('keypair-list').should('exist'); - }); + it('doesnt connect with invalid credentials', () => { + // 0002-WCON-020 - it('doesnt connect with invalid credentials', () => { - // 0002-WCON-020 - - // Mock incorrect username/password - cy.intercept('POST', 'https://wallet.testnet.vega.xyz/api/v1/auth/token', { - body: { - error: 'No wallet', - }, - statusCode: 403, // 403 forbidden invalid crednetials + // Mock incorrect username/password + cy.intercept( + 'POST', + 'https://wallet.testnet.vega.xyz/api/v1/auth/token', + { + body: { + error: 'No wallet', + }, + statusCode: 403, // 403 forbidden invalid crednetials + } + ); + cy.getByTestId(connectVegaBtn).click(); + cy.getByTestId('connectors-list') + .find('[data-testid="connector-hosted"]') + .click(); + cy.getByTestId(form).find('#wallet').click().type('invalid name'); + cy.getByTestId(form).find('#passphrase').click().type('invalid password'); + cy.getByTestId('rest-connector-form').find('button[type=submit]').click(); + cy.getByTestId('form-error').should('have.text', 'Invalid credentials'); }); - cy.getByTestId(connectVegaBtn).click(); - cy.getByTestId('connectors-list') - .find('[data-testid="connector-hosted"]') - .click(); - cy.getByTestId(form).find('#wallet').click().type('invalid name'); - cy.getByTestId(form).find('#passphrase').click().type('invalid password'); - cy.getByTestId('rest-connector-form').find('button[type=submit]').click(); - cy.getByTestId('form-error').should('have.text', 'Invalid credentials'); - }); - it('doesnt connect with empty fields', () => { - cy.getByTestId(connectVegaBtn).click(); - cy.getByTestId('connectors-list') - .find('[data-testid="connector-hosted"]') - .click(); + it('doesnt connect with empty fields', () => { + cy.getByTestId(connectVegaBtn).click(); + cy.getByTestId('connectors-list') + .find('[data-testid="connector-hosted"]') + .click(); - cy.getByTestId('rest-connector-form').find('button[type=submit]').click(); - cy.getByTestId(form) - .find('#wallet') - .next('[data-testid="input-error-text"]') - .should('have.text', 'Required'); - cy.getByTestId(form) - .find('#passphrase') - .next('[data-testid="input-error-text"]') - .should('have.text', 'Required'); - }); -}); + cy.getByTestId('rest-connector-form').find('button[type=submit]').click(); + cy.getByTestId(form) + .find('#wallet') + .next('[data-testid="input-error-text"]') + .should('have.text', 'Required'); + cy.getByTestId(form) + .find('#passphrase') + .next('[data-testid="input-error-text"]') + .should('have.text', 'Required'); + }); + } +); -describe('connect vega wallet', { tags: '@smoke' }, () => { +describe('connect vega wallet', { tags: '@smoke', testIsolation: true }, () => { beforeEach(() => { // Using portfolio page as it requires vega wallet connection cy.visit('/#/portfolio'); diff --git a/apps/trading-e2e/src/integration/withdraw-key-to-key.cy.ts b/apps/trading-e2e/src/integration/withdraw-key-to-key.cy.ts index 9cad74ffb..4097ef914 100644 --- a/apps/trading-e2e/src/integration/withdraw-key-to-key.cy.ts +++ b/apps/trading-e2e/src/integration/withdraw-key-to-key.cy.ts @@ -88,48 +88,54 @@ describe( } ); -describe('withdraw actions', { tags: '@regression' }, () => { - beforeEach(() => { - cy.mockWeb3Provider(); - cy.mockTradingPage(); - cy.mockSubscription(); - cy.setVegaWallet(); +describe( + 'withdraw actions', + { tags: '@regression', testIsolation: true }, + () => { + beforeEach(() => { + cy.mockWeb3Provider(); + cy.mockTradingPage(); + cy.mockSubscription(); + cy.setVegaWallet(); - cy.visit('/#/portfolio'); - cy.getByTestId(collateralTab).click(); - cy.getByTestId(openTransferDialog).click(); + cy.visit('/#/portfolio'); + cy.getByTestId(collateralTab).click(); + cy.getByTestId(openTransferDialog).click(); - cy.wait('@Accounts'); - cy.wait('@Assets'); - cy.mockVegaWalletTransaction(); - }); + cy.wait('@Accounts'); + cy.wait('@Assets'); + cy.mockVegaWalletTransaction(); + }); - it('key to key transfers by select key', function () { - cy.getByTestId(transferForm).should('be.visible'); - cy.getByTestId(transferForm).find(toAddressField).select(1); - selectAsset(ASSET_SEPOLIA_TBTC); - cy.getByTestId(transferForm).find(amountField).type('1', { delay: 100 }); - cy.getByTestId(transferForm).find(submitTransferBtn).click(); - cy.getByTestId(toastContent).should( - 'contain.text', - 'Awaiting confirmation' - ); - cy.getByTestId(toastCloseBtn).click(); - }); + it('key to key transfers by select key', function () { + cy.getByTestId(transferForm).should('be.visible'); + cy.getByTestId(transferForm).find(toAddressField).select(1); + selectAsset(ASSET_SEPOLIA_TBTC); + cy.getByTestId(transferForm).find(amountField).type('1', { delay: 100 }); + cy.getByTestId(transferForm).find(submitTransferBtn).click(); + cy.getByTestId(toastContent).should( + 'contain.text', + 'Awaiting confirmation' + ); + cy.getByTestId(toastCloseBtn).click(); + }); - it('key to key transfers by enter manual key', function () { - cy.getByTestId(transferForm).should('be.visible'); - cy.contains('Enter manually').click(); - cy.getByTestId(transferForm) - .find(toAddressField) - .type('7f9cf07d3a9905b1a61a1069f7a758855da428bc0f4a97de87f48644bfc25535'); - selectAsset(ASSET_SEPOLIA_TBTC); - cy.getByTestId(transferForm).find(amountField).type('1', { delay: 100 }); - cy.getByTestId(transferForm).find(submitTransferBtn).click(); - cy.getByTestId(toastContent).should( - 'contain.text', - 'Awaiting confirmation' - ); - cy.getByTestId(toastCloseBtn).click(); - }); -}); + it('key to key transfers by enter manual key', function () { + cy.getByTestId(transferForm).should('be.visible'); + cy.contains('Enter manually').click(); + cy.getByTestId(transferForm) + .find(toAddressField) + .type( + '7f9cf07d3a9905b1a61a1069f7a758855da428bc0f4a97de87f48644bfc25535' + ); + selectAsset(ASSET_SEPOLIA_TBTC); + cy.getByTestId(transferForm).find(amountField).type('1', { delay: 100 }); + cy.getByTestId(transferForm).find(submitTransferBtn).click(); + cy.getByTestId(toastContent).should( + 'contain.text', + 'Awaiting confirmation' + ); + cy.getByTestId(toastCloseBtn).click(); + }); + } +); diff --git a/apps/trading-e2e/src/integration/withdraw.cy.ts b/apps/trading-e2e/src/integration/withdraw.cy.ts index 04c416796..35747ae94 100644 --- a/apps/trading-e2e/src/integration/withdraw.cy.ts +++ b/apps/trading-e2e/src/integration/withdraw.cy.ts @@ -70,54 +70,60 @@ describe('withdraw form validation', { tags: '@smoke' }, () => { }); }); -describe('withdraw actions', { tags: '@regression' }, () => { - // this is extremely ugly hack, but setting it properly in contract is too much effort for such simple validation +describe( + 'withdraw actions', + { tags: '@regression', testIsolation: true }, + () => { + // this is extremely ugly hack, but setting it properly in contract is too much effort for such simple validation - // 1002-WITH-018 + // 1002-WITH-018 - const withdrawalThreshold = - Cypress.env('VEGA_ENV') === 'CUSTOM' ? '0.00' : '100.00'; - before(() => { - cy.mockWeb3Provider(); - cy.mockTradingPage(); - cy.mockSubscription(); - cy.setVegaWallet(); + const withdrawalThreshold = + Cypress.env('VEGA_ENV') === 'CUSTOM' ? '0.00' : '100.00'; + before(() => { + cy.mockWeb3Provider(); + cy.mockTradingPage(); + cy.mockSubscription(); + cy.setVegaWallet(); - cy.visit('/#/portfolio'); - cy.getByTestId('Withdrawals').click(); - cy.getByTestId('withdraw-dialog-button').click(); + cy.visit('/#/portfolio'); + cy.getByTestId('Withdrawals').click(); - connectEthereumWallet('MetaMask'); + cy.getByTestId('withdraw-dialog-button').click(); - cy.wait('@Accounts'); - cy.wait('@Assets'); - cy.mockVegaWalletTransaction(); - }); + // It also requires connection Ethereum wallet + connectEthereumWallet('MetaMask'); - it('triggers transaction when submitted', () => { - // 1002-WITH-002 - // 1002-WITH-003 - selectAsset(ASSET_SEPOLIA_TBTC); - cy.getByTestId('BALANCE_AVAILABLE_label').should( - 'contain.text', - 'Balance available' - ); - cy.getByTestId('BALANCE_AVAILABLE_value').should( - 'have.text', - '1,000.00001' - ); - cy.getByTestId('WITHDRAWAL_THRESHOLD_label').should( - 'contain.text', - 'Delayed withdrawal threshold' - ); - cy.getByTestId('WITHDRAWAL_THRESHOLD_value').should( - 'contain.text', - withdrawalThreshold - ); - cy.getByTestId('DELAY_TIME_label').should('contain.text', 'Delay time'); - cy.getByTestId('DELAY_TIME_value').should('have.text', 'None'); - cy.get(amountField).clear().type('10'); - cy.getByTestId(submitWithdrawBtn).click(); - cy.getByTestId('toast').should('contain.text', 'Awaiting confirmation'); - }); -}); + cy.wait('@Accounts'); + cy.wait('@Assets'); + cy.mockVegaWalletTransaction(); + }); + + it('triggers transaction when submitted', () => { + // 1002-WITH-002 + // 1002-WITH-003 + selectAsset(ASSET_SEPOLIA_TBTC); + cy.getByTestId('BALANCE_AVAILABLE_label').should( + 'contain.text', + 'Balance available' + ); + cy.getByTestId('BALANCE_AVAILABLE_value').should( + 'have.text', + '1,000.00001' + ); + cy.getByTestId('WITHDRAWAL_THRESHOLD_label').should( + 'contain.text', + 'Delayed withdrawal threshold' + ); + cy.getByTestId('WITHDRAWAL_THRESHOLD_value').should( + 'contain.text', + withdrawalThreshold + ); + cy.getByTestId('DELAY_TIME_label').should('contain.text', 'Delay time'); + cy.getByTestId('DELAY_TIME_value').should('have.text', 'None'); + cy.get(amountField).clear().type('10'); + cy.getByTestId(submitWithdrawBtn).click(); + cy.getByTestId('toast').should('contain.text', 'Awaiting confirmation'); + }); + } +); diff --git a/apps/trading-e2e/src/support/deal-ticket.ts b/apps/trading-e2e/src/support/deal-ticket.ts new file mode 100644 index 000000000..c1fdcdd32 --- /dev/null +++ b/apps/trading-e2e/src/support/deal-ticket.ts @@ -0,0 +1,18 @@ +import * as Schema from '@vegaprotocol/types'; + +export const orderSizeField = 'order-size'; +export const orderPriceField = 'order-price'; +export const orderTIFDropDown = 'order-tif'; +export const placeOrderBtn = 'place-order'; +export const toggleShort = 'order-side-SIDE_SELL'; +export const toggleLong = 'order-side-SIDE_BUY'; +export const toggleLimit = 'order-type-TYPE_LIMIT'; +export const toggleMarket = 'order-type-TYPE_MARKET'; + +export const TIFlist = Object.values(Schema.OrderTimeInForce).map((value) => { + return { + code: Schema.OrderTimeInForceCode[value], + value, + text: Schema.OrderTimeInForceMapping[value], + }; +}); diff --git a/apps/trading-e2e/src/support/index.js b/apps/trading-e2e/src/support/index.js index fff5a77ba..06a4e4b14 100644 --- a/apps/trading-e2e/src/support/index.js +++ b/apps/trading-e2e/src/support/index.js @@ -2,6 +2,7 @@ import '@vegaprotocol/cypress'; import 'cypress-real-events/support'; import registerCypressGrep from '@cypress/grep'; import { addMockTradingPage } from './trading'; +import 'cypress-mochawesome-reporter/register'; registerCypressGrep(); addMockTradingPage(); diff --git a/apps/trading/.env b/apps/trading/.env index c063c1979..38f8c53a9 100644 --- a/apps/trading/.env +++ b/apps/trading/.env @@ -11,4 +11,5 @@ NX_VEGA_TOKEN_URL=https://token.fairground.wtf NX_VEGA_WALLET_URL=http://localhost:1789 NX_VEGA_DOCS_URL=https://docs.vega.xyz/testnet NX_VEGA_REPO_URL=https://github.com/vegaprotocol/vega/releases -NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/main/announcements.json \ No newline at end of file +NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/main/announcements.json +NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72 \ No newline at end of file diff --git a/apps/trading/client-pages/market/trade-grid.tsx b/apps/trading/client-pages/market/trade-grid.tsx index 7fc750c27..6ba4a0ca9 100644 --- a/apps/trading/client-pages/market/trade-grid.tsx +++ b/apps/trading/client-pages/market/trade-grid.tsx @@ -1,5 +1,5 @@ import { DealTicketContainer } from '@vegaprotocol/deal-ticket'; -import { MarketInfoContainer } from '@vegaprotocol/market-info'; +import { MarketInfoAccordionContainer } from '@vegaprotocol/market-info'; import { OrderbookContainer } from '@vegaprotocol/market-depth'; import { OrderListContainer } from '@vegaprotocol/orders'; import { FillsContainer } from '@vegaprotocol/fills'; @@ -38,7 +38,7 @@ type MarketDependantView = | typeof CandlesChartContainer | typeof DepthChartContainer | typeof DealTicketContainer - | typeof MarketInfoContainer + | typeof MarketInfoAccordionContainer | typeof OrderbookContainer | typeof TradesContainer; @@ -56,7 +56,7 @@ const TradingViews = { Depth: requiresMarket(DepthChartContainer), Liquidity: requiresMarket(LiquidityContainer), Ticket: requiresMarket(DealTicketContainer), - Info: requiresMarket(MarketInfoContainer), + Info: requiresMarket(MarketInfoAccordionContainer), Orderbook: requiresMarket(OrderbookContainer), Trades: requiresMarket(TradesContainer), Positions: PositionsContainer, diff --git a/apps/trading/client-pages/market/trade-market-header.tsx b/apps/trading/client-pages/market/trade-market-header.tsx index 96ebae4f3..94c44ea9d 100644 --- a/apps/trading/client-pages/market/trade-market-header.tsx +++ b/apps/trading/client-pages/market/trade-market-header.tsx @@ -13,8 +13,7 @@ import type { OnCellClickHandler } from '../../components/select-market'; import { Header, HeaderStat } from '../../components/header'; import { NO_MARKET } from './constants'; import { MarketMarkPrice } from '../../components/market-mark-price'; -import { Last24hPriceChange } from '../../components/last-24h-price-change'; -import { Last24hVolume } from '../../components/last-24h-volume'; +import { Last24hPriceChange, Last24hVolume } from '@vegaprotocol/market-info'; import { MarketState } from '../../components/market-state'; import { HeaderStatMarketTradingMode } from '../../components/market-trading-mode'; import { MarketLiquiditySupplied } from '../../components/liquidity-supplied'; diff --git a/apps/trading/components/app-loader/web3-provider.tsx b/apps/trading/components/app-loader/web3-provider.tsx index f26ca6956..53dc5d239 100644 --- a/apps/trading/components/app-loader/web3-provider.tsx +++ b/apps/trading/components/app-loader/web3-provider.tsx @@ -14,10 +14,9 @@ export const Web3Provider = ({ children }: { children: ReactNode }) => { const { config, loading, error } = useEthereumConfig(); const { ETHEREUM_PROVIDER_URL, ETH_LOCAL_PROVIDER_URL, ETH_WALLET_MNEMONIC } = useEnvironment(); - const [connectors, initializeConnectors] = useWeb3ConnectStore((store) => [ - store.connectors, - store.initialize, - ]); + + const connectors = useWeb3ConnectStore((store) => store.connectors); + const initializeConnectors = useWeb3ConnectStore((store) => store.initialize); useEffect(() => { if (config?.chain_id) { diff --git a/apps/trading/components/select-market/select-market-columns.tsx b/apps/trading/components/select-market/select-market-columns.tsx index fab44b1b2..73df026b7 100644 --- a/apps/trading/components/select-market/select-market-columns.tsx +++ b/apps/trading/components/select-market/select-market-columns.tsx @@ -14,9 +14,8 @@ import type { CandleClose } from '@vegaprotocol/types'; import type { MarketMaybeWithDataAndCandles } from '@vegaprotocol/market-list'; import { Link } from 'react-router-dom'; import { MarketMarkPrice } from '../market-mark-price'; -import { Last24hPriceChange } from '../last-24h-price-change'; +import { Last24hPriceChange, Last24hVolume } from '@vegaprotocol/market-info'; import { MarketTradingMode } from '../market-trading-mode'; -import { Last24hVolume } from '../last-24h-volume'; import { Links, Routes } from '../../pages/client-router'; const ellipsisClasses = 'whitespace-nowrap overflow-hidden text-ellipsis'; diff --git a/apps/trading/components/vega-wallet-connect-button/vega-wallet-connect-button.spec.tsx b/apps/trading/components/vega-wallet-connect-button/vega-wallet-connect-button.spec.tsx index c6d4a3844..152abeb4f 100644 --- a/apps/trading/components/vega-wallet-connect-button/vega-wallet-connect-button.spec.tsx +++ b/apps/trading/components/vega-wallet-connect-button/vega-wallet-connect-button.spec.tsx @@ -23,26 +23,44 @@ const generateJsx = (context: VegaWalletContextShape) => { ); }; -it('Not connected', () => { - render(generateJsx({ pubKey: null } as VegaWalletContextShape)); +describe('VegaWalletConnectButton', () => { + it('should fire dialog when not connected', () => { + render(generateJsx({ pubKey: null } as VegaWalletContextShape)); - const button = screen.getByTestId('connect-vega-wallet'); - expect(button).toHaveTextContent('Connect Vega wallet'); - fireEvent.click(button); - expect(mockUpdateDialogOpen).toHaveBeenCalled(); -}); + const button = screen.getByTestId('connect-vega-wallet'); + expect(button).toHaveTextContent('Connect Vega wallet'); + fireEvent.click(button); + expect(mockUpdateDialogOpen).toHaveBeenCalled(); + }); -it('Connected', async () => { - const pubKey = { publicKey: '123456__123456', name: 'test' }; - render( - generateJsx({ + it('should retrieve keys when connected', async () => { + const pubKey = { publicKey: '123456__123456', name: 'test' }; + const pubKey2 = { publicKey: '123456__123457', name: 'test2' }; + render( + generateJsx({ + pubKey: pubKey.publicKey, + pubKeys: [pubKey], + fetchPubKeys: () => Promise.resolve([pubKey, pubKey2]), + } as VegaWalletContextShape) + ); + + const button = screen.getByTestId('manage-vega-wallet'); + expect(button).toHaveTextContent(truncateByChars(pubKey.publicKey)); + userEvent.click(button); + expect(mockUpdateDialogOpen).not.toHaveBeenCalled(); + }); + + it('should fetch keys when connected', async () => { + const pubKey = { publicKey: '123456__123456', name: 'test' }; + const context = { pubKey: pubKey.publicKey, pubKeys: [pubKey], - } as VegaWalletContextShape) - ); + } as VegaWalletContextShape; + render(generateJsx(context)); - const button = screen.getByTestId('manage-vega-wallet'); - expect(button).toHaveTextContent(truncateByChars(pubKey.publicKey)); - userEvent.click(button); - expect(mockUpdateDialogOpen).not.toHaveBeenCalled(); + const button = screen.getByTestId('manage-vega-wallet'); + expect(button).toHaveTextContent(truncateByChars(pubKey.publicKey)); + userEvent.click(button); + expect(mockUpdateDialogOpen).not.toHaveBeenCalled(); + }); }); diff --git a/apps/trading/components/vega-wallet-connect-button/vega-wallet-connect-button.tsx b/apps/trading/components/vega-wallet-connect-button/vega-wallet-connect-button.tsx index 54ad5c36e..6a2525393 100644 --- a/apps/trading/components/vega-wallet-connect-button/vega-wallet-connect-button.tsx +++ b/apps/trading/components/vega-wallet-connect-button/vega-wallet-connect-button.tsx @@ -29,7 +29,7 @@ const MobileWalletButton = ({ isConnected?: boolean; activeKey?: PubKey; }) => { - const { pubKeys, selectPubKey, disconnect } = useVegaWallet(); + const { pubKeys, selectPubKey, disconnect, fetchPubKeys } = useVegaWallet(); const openVegaWalletDialog = useVegaWalletDialogStore( (store) => store.openVegaWalletDialog ); @@ -46,9 +46,12 @@ const MobileWalletButton = ({ openVegaWalletDialog(); setDrawerOpen(false); } else { + if (fetchPubKeys) { + fetchPubKeys(); + } setDrawerOpen(!drawerOpen); } - }, [drawerOpen, isConnected, openVegaWalletDialog]); + }, [drawerOpen, fetchPubKeys, isConnected, openVegaWalletDialog]); const iconClass = drawerOpen ? 'hidden' @@ -145,8 +148,14 @@ export const VegaWalletConnectButton = () => { (store) => store.openVegaWalletDialog ); const openTransferDialog = useTransferDialog((store) => store.open); - const { pubKey, pubKeys, selectPubKey, disconnect, isReadOnly } = - useVegaWallet(); + const { + pubKey, + pubKeys, + selectPubKey, + disconnect, + isReadOnly, + fetchPubKeys, + } = useVegaWallet(); const isConnected = pubKey !== null; const activeKey = useMemo(() => { @@ -162,7 +171,12 @@ export const VegaWalletConnectButton = () => { trigger={ setDropdownOpen((curr) => !curr)} + onClick={() => { + if (fetchPubKeys) { + fetchPubKeys(); + } + setDropdownOpen(!dropdownOpen); + }} > {activeKey && ( {activeKey.name} diff --git a/apps/trading/pages/_app.page.tsx b/apps/trading/pages/_app.page.tsx index f884b6324..aa705db6d 100644 --- a/apps/trading/pages/_app.page.tsx +++ b/apps/trading/pages/_app.page.tsx @@ -33,6 +33,7 @@ import { ViewingBanner } from '../components/viewing-banner'; import { Banner } from '../components/banner'; import { AppLoader, DynamicLoader } from '../components/app-loader'; import { Navbar } from '../components/navbar'; +import { ENV } from '../lib/config'; import { useDataProvider } from '@vegaprotocol/react-helpers'; import { activeOrdersProvider } from '@vegaprotocol/orders'; @@ -144,7 +145,7 @@ const PartyData = () => { const MaybeConnectEagerly = () => { useVegaEagerConnect(Connectors); - useEthereumEagerConnect(); + useEthereumEagerConnect(ENV.dsn); const { pubKey, connect } = useVegaWallet(); const [searchParams] = useSearchParams(); diff --git a/libs/cypress/src/lib/commands/add-connect-public-key.ts b/libs/cypress/src/lib/commands/add-connect-public-key.ts index b3708b80a..e5816aba0 100644 --- a/libs/cypress/src/lib/commands/add-connect-public-key.ts +++ b/libs/cypress/src/lib/commands/add-connect-public-key.ts @@ -10,14 +10,15 @@ declare global { export const addConnectPublicKey = () => { Cypress.Commands.add('connectPublicKey', (publicKey) => { - cy.getByTestId('connect-vega-wallet').then((connectWallet) => { - if (connectWallet.length) { - cy.get('aside [data-testid="connect-vega-wallet"]').click(); - cy.getByTestId('connector-view').should('be.visible').click(); - cy.getByTestId('address').click(); - cy.getByTestId('address').type(publicKey); - cy.getByTestId('connect').click(); - } - }); + const connectVegaWaletBtn = Cypress.$( + `[data-testid="connect-vega-wallet"]` + ); + if (connectVegaWaletBtn.length > 0) { + cy.get('aside [data-testid="connect-vega-wallet"]').click(); + cy.getByTestId('connector-view').should('be.visible').click(); + cy.getByTestId('address').click(); + cy.getByTestId('address').type(publicKey); + cy.getByTestId('connect').click(); + } }); }; diff --git a/libs/cypress/src/lib/commands/vega-wallet-connect.ts b/libs/cypress/src/lib/commands/vega-wallet-connect.ts index ab04edfb6..75148bb3c 100644 --- a/libs/cypress/src/lib/commands/vega-wallet-connect.ts +++ b/libs/cypress/src/lib/commands/vega-wallet-connect.ts @@ -33,19 +33,27 @@ export function addVegaWalletConnect() { Cypress.Commands.add('connectVegaWallet', (isMobile) => { mockConnectWallet(); cy.highlight(`Connecting Vega Wallet`); - cy.get( - `[data-testid=connect-vega-wallet${isMobile ? '-mobile' : ''}]:visible` - ).click(); - cy.get('[data-testid=connectors-list]') - .find('[data-testid="connector-jsonRpc"]') - .click(); - cy.wait('@walletReq'); - cy.get('[data-testid=dialog-content]').should( - 'contain.text', - 'Successfully connected' - ); - cy.getByTestId('dialog-close').click(); - cy.get('[data-testid=dialog-content]').should('not.exist'); + const connectVegaWalletButton = `[data-testid=connect-vega-wallet${ + isMobile ? '-mobile' : '' + }]:visible`; + + cy.get(connectVegaWalletButton).then((btn) => { + if (btn.length === 0) { + cy.log('could not find the button, perhaps already connected'); + return; + } + cy.wrap(btn).click(); + cy.get('[data-testid=connectors-list]') + .find('[data-testid="connector-jsonRpc"]') + .click(); + cy.wait('@walletReq'); + cy.get('[data-testid=dialog-content]').should( + 'contain.text', + 'Successfully connected' + ); + cy.getByTestId('dialog-close').click(); + cy.get('[data-testid=dialog-content]').should('not.exist'); + }); }); } diff --git a/libs/cypress/src/lib/mock-ws.ts b/libs/cypress/src/lib/mock-ws.ts index f3a7fe260..c651a4ea2 100644 --- a/libs/cypress/src/lib/mock-ws.ts +++ b/libs/cypress/src/lib/mock-ws.ts @@ -19,6 +19,12 @@ const mockSocketServer = Cypress.env('VEGA_URL') ? new Server(Cypress.env('VEGA_URL').replace('http', 'ws')) : null; +// DO NOT REMOVE: PASSTHROUGH for walletconnect +// eslint-disable-next-line @typescript-eslint/no-unused-vars +const relayServer = new Server('wss://relay.walletconnect.com', { + mock: false, +}); + export function addMockSubscription() { Cypress.Commands.add( 'mockSubscription', diff --git a/libs/cypress/tsconfig.json b/libs/cypress/tsconfig.json index 5bd611d96..4f8196443 100644 --- a/libs/cypress/tsconfig.json +++ b/libs/cypress/tsconfig.json @@ -18,6 +18,7 @@ "noImplicitOverride": true, "noPropertyAccessFromIndexSignature": false, "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true + "noFallthroughCasesInSwitch": true, + "sourceMap": false } } diff --git a/libs/datagrid/src/lib/cell-class-rules.ts b/libs/datagrid/src/lib/cell-class-rules.ts index b05a1de66..055cdafdb 100644 --- a/libs/datagrid/src/lib/cell-class-rules.ts +++ b/libs/datagrid/src/lib/cell-class-rules.ts @@ -3,11 +3,13 @@ export const negativeClassNames = 'text-vega-pink dark:text-vega-pink'; const isPositive = ({ value }: { value: string | bigint | number }) => !!value && - ((typeof value === 'string' && !value.startsWith('-')) || value > 0); + ((typeof value === 'string' && !value.startsWith('-')) || + ((typeof value === 'number' || typeof value === 'bigint') && value > 0)); const isNegative = ({ value }: { value: string | bigint | number }) => !!value && - ((typeof value === 'string' && value.startsWith('-')) || value < 0); + ((typeof value === 'string' && value.startsWith('-')) || + ((typeof value === 'number' || typeof value === 'bigint') && value < 0)); export const signedNumberCssClass = (value: string | bigint | number) => { if (isPositive({ value })) { diff --git a/libs/deal-ticket/__mocks__/zustand.ts b/libs/deal-ticket/__mocks__/zustand.ts index b42750b88..64c09d6ea 100644 --- a/libs/deal-ticket/__mocks__/zustand.ts +++ b/libs/deal-ticket/__mocks__/zustand.ts @@ -1,6 +1,7 @@ import type { StateCreator } from 'zustand'; import { act } from 'react-dom/test-utils'; -const { create: actualCreate } = jest.requireActual('zustand'); // if using jest +const { create: actualCreate, useStore: actualUseStore } = + jest.requireActual('zustand'); // if using jest // a variable to hold reset functions for all stores declared in the app const storeResetFns = new Set<() => void>(); @@ -15,7 +16,13 @@ export const create = return store; }; +export const createStore = create; +export const useStore = actualUseStore; + // Reset all stores after each test run beforeEach(() => { act(() => storeResetFns.forEach((resetFn) => resetFn())); }); + +// also export default as web3-react internals import and use zustand as the default import +export default create; diff --git a/libs/deal-ticket/src/hooks/use-initial-margin.ts b/libs/deal-ticket/src/hooks/use-initial-margin.ts index 1db1d2e25..b431123a2 100644 --- a/libs/deal-ticket/src/hooks/use-initial-margin.ts +++ b/libs/deal-ticket/src/hooks/use-initial-margin.ts @@ -16,19 +16,18 @@ export const useInitialMargin = ( order?: OrderSubmissionBody['orderSubmission'] ) => { const { pubKey } = useVegaWallet(); - const commonVariables = { marketId, partyId: pubKey || '' }; const { data: marketData } = useDataProvider({ dataProvider: marketDataProvider, variables: { marketId }, }); const { data: activeVolumeAndMargin } = useDataProvider({ dataProvider: volumeAndMarginProvider, - variables: commonVariables, + variables: { marketId, partyId: pubKey || '' }, skip: !pubKey, }); const { data: marketInfo } = useDataProvider({ dataProvider: marketInfoProvider, - variables: commonVariables, + variables: { marketId }, }); let totalMargin = '0'; let margin = '0'; diff --git a/libs/deposits/src/lib/deposit-form.tsx b/libs/deposits/src/lib/deposit-form.tsx index 9f44fd3fd..960107169 100644 --- a/libs/deposits/src/lib/deposit-form.tsx +++ b/libs/deposits/src/lib/deposit-form.tsx @@ -35,6 +35,7 @@ import { ETHEREUM_EAGER_CONNECT, useWeb3ConnectStore, getChainName, + useWeb3Disconnect, } from '@vegaprotocol/web3'; import type { DepositBalances } from './use-deposit-balances'; import { FaucetNotification } from './faucet-notification'; @@ -448,11 +449,12 @@ const DisconnectEthereumButton = ({ }) => { const { connector } = useWeb3React(); const [, , removeEagerConnector] = useLocalStorage(ETHEREUM_EAGER_CONNECT); + const disconnect = useWeb3Disconnect(connector); return ( { - connector.deactivate(); + disconnect(); removeEagerConnector(); onDisconnect(); }} diff --git a/libs/market-info/src/components/index.ts b/libs/market-info/src/components/index.ts index fb6109f53..a1757c56e 100644 --- a/libs/market-info/src/components/index.ts +++ b/libs/market-info/src/components/index.ts @@ -1,2 +1,4 @@ export * from './market-info'; +export * from './last-24h-price-change'; +export * from './last-24h-volume'; export * from './fees-breakdown'; diff --git a/apps/trading/components/last-24h-price-change/index.ts b/libs/market-info/src/components/last-24h-price-change/index.ts similarity index 100% rename from apps/trading/components/last-24h-price-change/index.ts rename to libs/market-info/src/components/last-24h-price-change/index.ts diff --git a/apps/trading/components/last-24h-price-change/last-24h-price-change.tsx b/libs/market-info/src/components/last-24h-price-change/last-24h-price-change.tsx similarity index 76% rename from apps/trading/components/last-24h-price-change/last-24h-price-change.tsx rename to libs/market-info/src/components/last-24h-price-change/last-24h-price-change.tsx index 3e6942032..aae0e87e2 100644 --- a/apps/trading/components/last-24h-price-change/last-24h-price-change.tsx +++ b/libs/market-info/src/components/last-24h-price-change/last-24h-price-change.tsx @@ -9,7 +9,6 @@ import { PriceChangeCell } from '@vegaprotocol/datagrid'; import * as Schema from '@vegaprotocol/types'; import type { CandleClose } from '@vegaprotocol/types'; import { marketCandlesProvider } from '@vegaprotocol/market-list'; -import { THROTTLE_UPDATE_TIME } from '../constants'; interface Props { marketId?: string; @@ -28,18 +27,15 @@ export const Last24hPriceChange = ({ }: Props) => { const [ref, inView] = useInView({ root: inViewRoot?.current }); const yesterday = useYesterday(); - const { data, error } = useThrottledDataProvider( - { - dataProvider: marketCandlesProvider, - variables: { - marketId: marketId || '', - interval: Schema.Interval.INTERVAL_I1H, - since: new Date(yesterday).toISOString(), - }, - skip: !marketId || !inView, + const { data, error } = useThrottledDataProvider({ + dataProvider: marketCandlesProvider, + variables: { + marketId: marketId || '', + interval: Schema.Interval.INTERVAL_I1H, + since: new Date(yesterday).toISOString(), }, - THROTTLE_UPDATE_TIME - ); + skip: !marketId || !inView, + }); const candles = data diff --git a/apps/trading/components/last-24h-volume/index.ts b/libs/market-info/src/components/last-24h-volume/index.ts similarity index 100% rename from apps/trading/components/last-24h-volume/index.ts rename to libs/market-info/src/components/last-24h-volume/index.ts diff --git a/apps/trading/components/last-24h-volume/last-24h-volume.tsx b/libs/market-info/src/components/last-24h-volume/last-24h-volume.tsx similarity index 75% rename from apps/trading/components/last-24h-volume/last-24h-volume.tsx rename to libs/market-info/src/components/last-24h-volume/last-24h-volume.tsx index e5c59e0bd..b0b759366 100644 --- a/apps/trading/components/last-24h-volume/last-24h-volume.tsx +++ b/libs/market-info/src/components/last-24h-volume/last-24h-volume.tsx @@ -10,7 +10,6 @@ import { useYesterday, } from '@vegaprotocol/react-helpers'; import * as Schema from '@vegaprotocol/types'; -import { THROTTLE_UPDATE_TIME } from '../constants'; interface Props { marketId?: string; @@ -30,18 +29,15 @@ export const Last24hVolume = ({ const yesterday = useYesterday(); const [ref, inView] = useInView({ root: inViewRoot?.current }); - const { data } = useThrottledDataProvider( - { - dataProvider: marketCandlesProvider, - variables: { - marketId: marketId || '', - interval: Schema.Interval.INTERVAL_I1H, - since: new Date(yesterday).toISOString(), - }, - skip: !(inView && marketId), + const { data } = useThrottledDataProvider({ + dataProvider: marketCandlesProvider, + variables: { + marketId: marketId || '', + interval: Schema.Interval.INTERVAL_I1H, + since: new Date(yesterday).toISOString(), }, - THROTTLE_UPDATE_TIME - ); + skip: !(inView && marketId), + }); const candleVolume = data ? calcCandleVolume(data) : initialValue; return ( diff --git a/libs/market-info/src/components/market-info/index.ts b/libs/market-info/src/components/market-info/index.ts index 828b9060c..b82cf2ba3 100644 --- a/libs/market-info/src/components/market-info/index.ts +++ b/libs/market-info/src/components/market-info/index.ts @@ -1,5 +1,5 @@ export * from './info-key-value-table'; -export * from './info-market'; +export * from './market-info-accordion'; export * from './tooltip-mapping'; export * from './__generated__/MarketInfo'; export * from './market-info-data-provider'; diff --git a/libs/market-info/src/components/market-info/info-key-value-table.tsx b/libs/market-info/src/components/market-info/info-key-value-table.tsx index f77ff38a6..e2c38818f 100644 --- a/libs/market-info/src/components/market-info/info-key-value-table.tsx +++ b/libs/market-info/src/components/market-info/info-key-value-table.tsx @@ -17,7 +17,7 @@ import { tooltipMapping } from './tooltip-mapping'; import type { ReactNode } from 'react'; interface RowProps { field: string; - value: unknown; + value: ReactNode; decimalPlaces?: number; asPercentage?: boolean; unformatted?: boolean; @@ -36,8 +36,8 @@ const Row = ({ }: RowProps) => { const className = 'text-black dark:text-white text-sm !px-0'; - const getFormattedValue = (value: unknown) => { - if (typeof value !== 'string' && typeof value !== 'number') return null; + const getFormattedValue = (value: ReactNode) => { + if (typeof value !== 'string' && typeof value !== 'number') return value; if (unformatted || isNaN(Number(value))) { return value; } @@ -50,7 +50,7 @@ const Row = ({ return `${formatNumber(Number(value))} ${assetSymbol}`; }; - const formattedValue: string | number | null = getFormattedValue(value); + const formattedValue = getFormattedValue(value); if (!formattedValue) return null; return ( @@ -70,11 +70,10 @@ const Row = ({ }; export interface MarketInfoTableProps { - data: unknown; + data: Record | null | undefined; decimalPlaces?: number; asPercentage?: boolean; unformatted?: boolean; - omits?: string[]; children?: ReactNode; assetSymbol?: string; noBorder?: boolean; @@ -85,7 +84,6 @@ export const MarketInfoTable = ({ decimalPlaces, asPercentage, unformatted, - omits = ['__typename'], children, assetSymbol, noBorder, @@ -96,20 +94,18 @@ export const MarketInfoTable = ({ return ( <> - {Object.entries(data) - .filter(([key]) => !omits.includes(key)) - .map(([key, value]) => ( - - ))} + {Object.entries(data).map(([key, value]) => ( + + ))}
    {children}
    diff --git a/libs/market-info/src/components/market-info/info-market.tsx b/libs/market-info/src/components/market-info/market-info-accordion.tsx similarity index 87% rename from libs/market-info/src/components/market-info/info-market.tsx rename to libs/market-info/src/components/market-info/market-info-accordion.tsx index 99a2bdb9d..c6dc747cb 100644 --- a/libs/market-info/src/components/market-info/info-market.tsx +++ b/libs/market-info/src/components/market-info/market-info-accordion.tsx @@ -1,7 +1,7 @@ import { useEnvironment } from '@vegaprotocol/environment'; import { removePaginationWrapper, TokenLinks } from '@vegaprotocol/utils'; import { t } from '@vegaprotocol/i18n'; -import { useDataProvider, useYesterday } from '@vegaprotocol/react-helpers'; +import { useDataProvider } from '@vegaprotocol/react-helpers'; import * as Schema from '@vegaprotocol/types'; import { Accordion, @@ -11,12 +11,11 @@ import { Splash, TinyScroll, } from '@vegaprotocol/ui-toolkit'; -import { useMemo } from 'react'; import { generatePath, Link } from 'react-router-dom'; -import { marketInfoWithDataAndCandlesProvider } from './market-info-data-provider'; +import { marketInfoProvider } from './market-info-data-provider'; -import type { MarketInfoWithDataAndCandles } from './market-info-data-provider'; +import type { MarketInfo } from './market-info-data-provider'; import { MarketProposalNotification } from '@vegaprotocol/proposals'; import { CurrentFeesInfoPanel, @@ -37,8 +36,8 @@ import { SettlementAssetInfoPanel, } from './market-info-panels'; -export interface InfoProps { - market: MarketInfoWithDataAndCandles; +export interface MarketInfoAccordionProps { + market: MarketInfo; onSelect?: (id: string, metaKey?: boolean) => void; } @@ -46,34 +45,21 @@ export interface MarketInfoContainerProps { marketId: string; onSelect?: (id: string, metaKey?: boolean) => void; } -export const MarketInfoContainer = ({ +export const MarketInfoAccordionContainer = ({ marketId, onSelect, }: MarketInfoContainerProps) => { - const yesterday = useYesterday(); - const yTimestamp = useMemo(() => { - return new Date(yesterday).toISOString(); - }, [yesterday]); - const variables = useMemo( - () => ({ - marketId, - since: yTimestamp, - interval: Schema.Interval.INTERVAL_I1H, - }), - [marketId, yTimestamp] - ); - const { data, loading, error, reload } = useDataProvider({ - dataProvider: marketInfoWithDataAndCandlesProvider, + dataProvider: marketInfoProvider, skipUpdates: true, - variables, + variables: { marketId }, }); return ( {data ? ( - + ) : ( @@ -84,7 +70,10 @@ export const MarketInfoContainer = ({ ); }; -export const Info = ({ market, onSelect }: InfoProps) => { +const MarketInfoAccordion = ({ + market, + onSelect, +}: MarketInfoAccordionProps) => { const { VEGA_TOKEN_URL } = useEnvironment(); const headerClassName = 'uppercase text-lg'; diff --git a/libs/market-info/src/components/market-info/market-info-data-provider.ts b/libs/market-info/src/components/market-info/market-info-data-provider.ts index 7e6905d15..366953241 100644 --- a/libs/market-info/src/components/market-info/market-info-data-provider.ts +++ b/libs/market-info/src/components/market-info/market-info-data-provider.ts @@ -3,15 +3,8 @@ import type { MarketInfoQuery, MarketInfoQueryVariables, } from './__generated__/MarketInfo'; -import { - marketDataProvider, - marketCandlesProvider, -} from '@vegaprotocol/market-list'; -import type { - MarketData, - Candle, - MarketCandlesQueryVariables, -} from '@vegaprotocol/market-list'; +import { marketDataProvider } from '@vegaprotocol/market-list'; +import type { MarketData, Candle } from '@vegaprotocol/market-list'; import { MarketInfoDocument } from './__generated__/MarketInfo'; export type MarketInfo = NonNullable; @@ -49,20 +42,3 @@ export const marketInfoWithDataProvider = makeDerivedDataProvider< } ); }); - -export const marketInfoWithDataAndCandlesProvider = makeDerivedDataProvider< - MarketInfoWithDataAndCandles, - never, - MarketCandlesQueryVariables ->([marketInfoProvider, marketDataProvider, marketCandlesProvider], (parts) => { - const market: MarketInfo | null = parts[0]; - const marketData: MarketData | null = parts[1]; - const candles: Candle[] | null = parts[2]; - return ( - market && { - ...market, - data: marketData || undefined, - candles: candles || undefined, - } - ); -}); diff --git a/libs/market-info/src/components/market-info/market-info-panels.tsx b/libs/market-info/src/components/market-info/market-info-panels.tsx index cb635ef0f..c965935f2 100644 --- a/libs/market-info/src/components/market-info/market-info-panels.tsx +++ b/libs/market-info/src/components/market-info/market-info-panels.tsx @@ -3,8 +3,8 @@ import { useMemo } from 'react'; import { AssetDetailsTable, useAssetDataProvider } from '@vegaprotocol/assets'; import { t } from '@vegaprotocol/i18n'; import { - calcCandleVolume, totalFeesPercentage, + marketDataProvider, } from '@vegaprotocol/market-list'; import { ExternalLink, Splash } from '@vegaprotocol/ui-toolkit'; import { @@ -18,8 +18,8 @@ import { MarketInfoTable } from './info-key-value-table'; import type { MarketInfo, MarketInfoWithData, - MarketInfoWithDataAndCandles, } from './market-info-data-provider'; +import { Last24hVolume } from '../last-24h-volume'; import BigNumber from 'bignumber.js'; import type { DataSourceDefinition, SignerKind } from '@vegaprotocol/types'; import { ConditionOperatorMapping } from '@vegaprotocol/types'; @@ -27,6 +27,7 @@ import { MarketTradingModeMapping } from '@vegaprotocol/types'; import { useEnvironment } from '@vegaprotocol/environment'; import type { Provider } from '@vegaprotocol/oracles'; import { useOracleProofs } from '@vegaprotocol/oracles'; +import { useDataProvider } from '@vegaprotocol/react-helpers'; type PanelProps = Pick< ComponentProps, @@ -37,14 +38,6 @@ type MarketInfoProps = { market: MarketInfo; }; -type MarketInfoWithDataProps = { - market: MarketInfoWithData; -}; - -type MarketInfoWithDataAndCandlesProps = { - market: MarketInfoWithDataAndCandles; -}; - export const CurrentFeesInfoPanel = ({ market, ...props @@ -52,7 +45,9 @@ export const CurrentFeesInfoPanel = ({ <> { +}: MarketInfoProps & PanelProps) => { const assetSymbol = market?.tradableInstrument.instrument.product?.settlementAsset.symbol || ''; const quoteUnit = market?.tradableInstrument.instrument.product?.quoteName || ''; + const { data } = useDataProvider({ + dataProvider: marketDataProvider, + variables: { marketId: market.id }, + }); return ( <> { - const last24hourVolume = market.candles && calcCandleVolume(market.candles); +}: MarketInfoProps & PanelProps) => { + const { data } = useDataProvider({ + dataProvider: marketDataProvider, + variables: { marketId: market.id }, + }); const dash = (value: string | undefined) => value && value !== '0' ? value : '-'; @@ -108,12 +110,17 @@ export const MarketVolumeInfoPanel = ({ return ( + ), + openInterest: dash(data?.openInterest), + bestBidVolume: dash(data?.bestBidVolume), + bestOfferVolume: dash(data?.bestOfferVolume), + bestStaticBidVolume: dash(data?.bestStaticBidVolume), + bestStaticOfferVolume: dash(data?.bestStaticOfferVolume), }} decimalPlaces={market.positionDecimalPlaces} {...props} @@ -176,7 +183,7 @@ export const InstrumentInfoPanel = ({ marketName: market.tradableInstrument.instrument.name, code: market.tradableInstrument.instrument.code, productType: market.tradableInstrument.instrument.product.__typename, - ...market.tradableInstrument.instrument.product, + quoteName: market.tradableInstrument.instrument.product.quoteName, }} {...props} /> @@ -239,38 +246,52 @@ export const MetadataInfoPanel = ({ export const RiskModelInfoPanel = ({ market, ...props -}: MarketInfoProps & PanelProps) => ( - -); +}: MarketInfoProps & PanelProps) => { + if (market.tradableInstrument.riskModel.__typename !== 'LogNormalRiskModel') { + return null; + } + const { tau, riskAversionParameter } = market.tradableInstrument.riskModel; + return ( + + ); +}; export const RiskParametersInfoPanel = ({ market, ...props -}: MarketInfoProps & PanelProps) => ( - -); +}: MarketInfoProps & PanelProps) => { + if (market.tradableInstrument.riskModel.__typename === 'LogNormalRiskModel') { + const { r, sigma, mu } = market.tradableInstrument.riskModel.params; + return ; + } + if (market.tradableInstrument.riskModel.__typename === 'SimpleRiskModel') { + const { factorLong, factorShort } = + market.tradableInstrument.riskModel.params; + return ( + + ); + } + return null; +}; export const RiskFactorsInfoPanel = ({ market, ...props -}: MarketInfoProps & PanelProps) => ( - -); +}: MarketInfoProps & PanelProps) => { + if (!market.riskFactors) { + return null; + } + const { short, long } = market.riskFactors; + return ; +}; export const PriceMonitoringBoundsInfoPanel = ({ market, @@ -278,13 +299,17 @@ export const PriceMonitoringBoundsInfoPanel = ({ ...props }: { triggerIndex: number; -} & MarketInfoWithDataProps & +} & MarketInfoProps & PanelProps) => { + const { data } = useDataProvider({ + dataProvider: marketDataProvider, + variables: { marketId: market.id }, + }); const quoteUnit = market?.tradableInstrument.instrument.product?.quoteName || ''; const trigger = market.priceMonitoringSettings?.parameters?.triggers?.[triggerIndex]; - const bounds = market.data?.priceMonitoringBounds?.[triggerIndex]; + const bounds = data?.priceMonitoringBounds?.[triggerIndex]; if (!trigger) { console.error( `Could not find data for trigger ${triggerIndex} (market id: ${market.id})` @@ -334,7 +359,11 @@ export const LiquidityMonitoringParametersInfoPanel = ({ @@ -343,17 +372,21 @@ export const LiquidityMonitoringParametersInfoPanel = ({ export const LiquidityInfoPanel = ({ market, ...props -}: MarketInfoWithDataProps & PanelProps) => { +}: MarketInfoProps & PanelProps) => { const assetDecimals = market.tradableInstrument.instrument.product.settlementAsset.decimals; const assetSymbol = market?.tradableInstrument.instrument.product?.settlementAsset.symbol || ''; + const { data } = useDataProvider({ + dataProvider: marketDataProvider, + variables: { marketId: market.id }, + }); return ( { +}: MarketInfoProps & PanelProps) => { const quoteUnit = market?.tradableInstrument.instrument.product?.quoteName || ''; const liquidityPriceRange = formatNumberPercentage( new BigNumber(market.lpPriceRange).times(100) ); + const { data } = useDataProvider({ + dataProvider: marketDataProvider, + variables: { marketId: market.id }, + }); return ( <>

    @@ -386,20 +423,20 @@ export const LiquidityPriceRangeInfoPanel = ({ data={{ liquidityPriceRange: `${liquidityPriceRange} of mid price`, lowestPrice: - market.data?.midPrice && + data?.midPrice && `${addDecimalsFormatNumber( new BigNumber(1) .minus(market.lpPriceRange) - .times(market.data.midPrice) + .times(data.midPrice) .toString(), market.decimalPlaces )} ${quoteUnit}`, highestPrice: - market.data?.midPrice && + data?.midPrice && `${addDecimalsFormatNumber( new BigNumber(1) .plus(market.lpPriceRange) - .times(market.data.midPrice) + .times(data.midPrice) .toString(), market.decimalPlaces )} ${quoteUnit}`, @@ -418,7 +455,15 @@ export const OracleInfoPanel = ({ const { VEGA_EXPLORER_URL, ORACLE_PROOFS_URL } = useEnvironment(); const { data } = useOracleProofs(ORACLE_PROOFS_URL); return ( - +

    - marketDataProvider(callback, client, { marketId: variables.marketId }), - (callback, client, variables) => - marketInfoProvider(callback, client, { marketId: variables.marketId }), + (callback, client, { marketId }) => + marketDataProvider(callback, client, { marketId }), + (callback, client, { marketId }) => + marketInfoProvider(callback, client, { marketId }), openVolumeDataProvider, ], (data) => { diff --git a/libs/react-helpers/package.json b/libs/react-helpers/package.json index 5c829007d..2364840c6 100644 --- a/libs/react-helpers/package.json +++ b/libs/react-helpers/package.json @@ -1,4 +1,4 @@ { "name": "@vegaprotocol/react-helpers", - "version": "0.1.0" + "version": "0.2.0" } diff --git a/libs/react-helpers/src/hooks/use-data-provider.spec.ts b/libs/react-helpers/src/hooks/use-data-provider.spec.ts index 78fdb4b00..a6f8e3c0b 100644 --- a/libs/react-helpers/src/hooks/use-data-provider.spec.ts +++ b/libs/react-helpers/src/hooks/use-data-provider.spec.ts @@ -6,7 +6,7 @@ import { MockedProvider } from '@apollo/client/testing'; type Data = number; type Delta = number; -type Variables = { partyId: string }; +type Variables = { partyId: string; marketIds?: string[] }; const unsubscribe = jest.fn(); const reload = jest.fn(); @@ -156,6 +156,121 @@ describe('useDataProvider hook', () => { expect(insert.mock.calls[1][0].insertionData).toEqual(insertionData); }); + it('calls dataProvider with updated variables if skip switched to true', async () => { + const { rerender } = render({ + dataProvider, + variables: { partyId: '' }, + skip: true, + }); + expect(dataProvider).toBeCalledTimes(0); + rerender({ + dataProvider, + variables, + }); + expect(dataProvider).toBeCalledTimes(1); + expect(dataProvider.mock.calls[0][2]).toEqual(variables); + }); + it('uses same data provider when rerendered with equal variables', async () => { + const { rerender } = render({ + dataProvider, + variables: { ...variables, marketIds: ['a', 'b'] }, + }); + expect(dataProvider).toBeCalledTimes(1); + rerender({ + dataProvider, + variables: { ...variables, marketIds: ['b', 'a'] }, + }); + expect(dataProvider).toBeCalledTimes(1); + rerender({ + dataProvider, + variables: { ...variables }, + }); + expect(dataProvider).toBeCalledTimes(2); + }); + + it('calls new update and insert when replaced', async () => { + const { rerender } = render({ + dataProvider, + update, + insert, + variables, + }); + const data = 0; + const delta = 0; + const insertionData = 0; + const callback = dataProvider.mock.calls[0][0]; + await act(async () => { + callback({ ...updateCallbackPayload, data }); + }); + const newUpdate = jest.fn(); + const newInsert = jest.fn(); + expect(update).toBeCalledTimes(2); + expect(insert).toBeCalledTimes(0); + rerender({ dataProvider, update: newUpdate, insert: newInsert, variables }); + await act(async () => { + callback({ + ...updateCallbackPayload, + data: data, + delta, + isUpdate: true, + }); + }); + expect(newUpdate).toBeCalledTimes(1); + await act(async () => { + callback({ + ...updateCallbackPayload, + data, + insertionData, + isInsert: true, + }); + }); + expect(newUpdate).toBeCalledTimes(2); + expect(newInsert).toBeCalledTimes(1); + expect(update).toBeCalledTimes(2); + expect(insert).toBeCalledTimes(0); + }); + + it('skip updates if skipUpdates is true', async () => { + const { result, rerender } = render({ + dataProvider, + update, + variables, + skipUpdates: true, + }); + expect(update).toBeCalledTimes(1); + let data = 0; + const delta = 1; + const callback = dataProvider.mock.calls[0][0]; + await act(async () => { + callback({ ...updateCallbackPayload, data }); + }); + expect(update).toBeCalledTimes(2); + expect(result.current.data).toEqual(data); + await act(async () => { + callback({ + ...updateCallbackPayload, + data: data + delta, + delta, + isUpdate: true, + }); + }); + expect(update).toBeCalledTimes(2); + expect(result.current.data).toEqual(data); + rerender({ dataProvider, variables, update }); + expect(update).toBeCalledTimes(2); + await act(async () => { + callback({ + ...updateCallbackPayload, + data: (data = data + delta), + delta, + isUpdate: true, + }); + }); + expect(update).toBeCalledTimes(3); + expect(result.current.data).toEqual(data); + expect(dataProvider).toBeCalledTimes(1); + }); + it('change data provider instance on variables change', async () => { const { result, rerender } = render({ dataProvider, update, variables }); const callback = dataProvider.mock.calls[0][0]; diff --git a/libs/react-helpers/src/hooks/use-data-provider.ts b/libs/react-helpers/src/hooks/use-data-provider.ts index 3419983fc..372b250e1 100644 --- a/libs/react-helpers/src/hooks/use-data-provider.ts +++ b/libs/react-helpers/src/hooks/use-data-provider.ts @@ -63,6 +63,9 @@ export const useDataProvider = < const reloadRef = useRef<((force?: boolean) => void) | undefined>(undefined); const loadRef = useRef | undefined>(undefined); const variablesRef = useRef(props.variables); + const updateRef = useRef(update); + const insertRef = useRef(insert); + const skipUpdatesRef = useRef(skipUpdates); const variables = useMemo(() => { if ( !isEqualWith( @@ -91,54 +94,69 @@ export const useDataProvider = < } return Promise.reject(); }, []); - const callback = useCallback>( - (args) => { - const { - data, - delta, - error, - loading, - insertionData, - totalCount, - isInsert, - isUpdate, - } = args; - setError(error); - setLoading(loading); - // if update or insert function returns true it means that component handles updates - // component can use flush() which will call callback without delta and cause data state update - if (!loading) { - if ( - isUpdate && - !skipUpdates && - update && - update({ delta, data, totalCount }) - ) { - return; - } - if (isInsert && insert && insert({ insertionData, data, totalCount })) { - return; - } + const callback = useCallback>((args) => { + const { + data, + delta, + error, + loading, + insertionData, + totalCount, + isInsert, + isUpdate, + } = args; + setError(error); + setLoading(loading); + // if update or insert function returns true it means that component handles updates + // component can use flush() which will call callback without delta and cause data state update + if (!loading) { + if ( + isUpdate && + (skipUpdatesRef.current || + (!skipUpdatesRef.current && + updateRef.current && + updateRef.current({ delta, data, totalCount }))) + ) { + return; } - setTotalCount(totalCount); - setData(data); - if (!loading && !isUpdate && update) { - update({ data }); + if ( + isInsert && + insertRef.current && + insertRef.current({ insertionData, data, totalCount }) + ) { + return; } - }, - [update, insert, skipUpdates] - ); + } + setTotalCount(totalCount); + setData(data); + if (!loading && !isUpdate && updateRef.current) { + updateRef.current({ data }); + } + }, []); + + useEffect(() => { + updateRef.current = update; + }, [update]); + + useEffect(() => { + insertRef.current = insert; + }, [insert]); + + useEffect(() => { + skipUpdatesRef.current = skipUpdates; + }, [skipUpdates]); + useEffect(() => { setData(null); setError(undefined); setTotalCount(undefined); - if (update) { - update({ data: null }); + if (updateRef.current) { + updateRef.current({ data: null }); } if (skip) { setLoading(false); - if (update) { - update({ data: null }); + if (updateRef.current) { + updateRef.current({ data: null }); } return; } @@ -157,7 +175,7 @@ export const useDataProvider = < loadRef.current = undefined; return unsubscribe(); }; - }, [client, dataProvider, callback, variables, skip, update]); + }, [client, dataProvider, callback, variables, skip]); return { data, loading, @@ -175,7 +193,7 @@ export const useThrottledDataProvider = < Variables extends OperationVariables = OperationVariables >( params: Omit, 'update'>, - wait?: number + wait = 500 ) => { const [data, setData] = useState(null); const dataRef = useRef(null); diff --git a/libs/react-helpers/src/hooks/use-fetch.ts b/libs/react-helpers/src/hooks/use-fetch.ts index d3df3e631..d8c1a5f53 100644 --- a/libs/react-helpers/src/hooks/use-fetch.ts +++ b/libs/react-helpers/src/hooks/use-fetch.ts @@ -80,6 +80,7 @@ export const useFetch = ( } data = (await response.json()) as T; + // @ts-ignore - 'error' in data if (data && 'error' in data) { // @ts-ignore - data.error throw new Error(data.error); diff --git a/libs/ui-toolkit/package.json b/libs/ui-toolkit/package.json index b8de10af1..cd96bca98 100644 --- a/libs/ui-toolkit/package.json +++ b/libs/ui-toolkit/package.json @@ -1,4 +1,4 @@ { "name": "@vegaprotocol/ui-toolkit", - "version": "0.10.0" + "version": "0.11.0" } diff --git a/libs/ui-toolkit/src/components/dialog/dialog.tsx b/libs/ui-toolkit/src/components/dialog/dialog.tsx index e5d0945f0..2b886b42a 100644 --- a/libs/ui-toolkit/src/components/dialog/dialog.tsx +++ b/libs/ui-toolkit/src/components/dialog/dialog.tsx @@ -12,6 +12,7 @@ interface DialogProps { open: boolean; onChange?: (isOpen: boolean) => void; onCloseAutoFocus?: (e: Event) => void; + onInteractOutside?: (e: Event) => void; title?: string; icon?: ReactNode; intent?: Intent; @@ -24,6 +25,7 @@ export function Dialog({ open, onChange, onCloseAutoFocus, + onInteractOutside, title, icon, intent, @@ -66,6 +68,7 @@ export function Dialog({
    diff --git a/libs/ui-toolkit/src/components/notification/notification.tsx b/libs/ui-toolkit/src/components/notification/notification.tsx index 792cc3f09..bd23fa633 100644 --- a/libs/ui-toolkit/src/components/notification/notification.tsx +++ b/libs/ui-toolkit/src/components/notification/notification.tsx @@ -55,9 +55,9 @@ export const Notification = ({ 'bg-vega-light-100 dark:bg-vega-dark-100 ': intent === Intent.None, 'bg-vega-blue-300 dark:bg-vega-blue-700': intent === Intent.Primary, 'bg-vega-green-300 dark:bg-vega-green-700': intent === Intent.Success, - 'bg-vega-orange-300 dark:bg-vega-orange-650': + 'bg-vega-orange-300 dark:bg-vega-orange-700': intent === Intent.Warning, - 'bg-vega-pink-300 dark:bg-vega-pink-650': intent === Intent.Danger, + 'bg-vega-pink-300 dark:bg-vega-pink-700': intent === Intent.Danger, }, 'border rounded p-2 flex items-start gap-2.5' )} diff --git a/libs/ui-toolkit/src/components/pagination/pagination.tsx b/libs/ui-toolkit/src/components/pagination/pagination.tsx index cf824a626..19a475fc1 100644 --- a/libs/ui-toolkit/src/components/pagination/pagination.tsx +++ b/libs/ui-toolkit/src/components/pagination/pagination.tsx @@ -26,7 +26,10 @@ export const Pagination = ({ onLast, }: PaginationProps) => { return ( -
    +
    {onFirst && ( - - ); - })} -
- + {info.icon} + {info.text} + ); }; @@ -72,15 +118,193 @@ export const Web3ConnectUncontrolledDialog = () => { function getConnectorInfo(connector: Connector) { if (connector instanceof MetaMask) { return { + icon: , name: 'MetaMask', - text: t('MetaMask, Brave or other injected web wallet'), + text: t('MetaMask'), + alt: t('MetaMask, Brave or other injected web wallet'), + }; + } + if (connector instanceof CoinbaseWallet) { + return { + icon: , + name: 'CoinbaseWallet', + text: t('Coinbase'), }; } if (connector instanceof WalletConnect) { return { + icon: , name: 'WalletConnect', text: t('WalletConnect'), + alt: t('WalletConnect v2'), + }; + } + if (connector instanceof WalletConnectLegacy) { + return { + icon: ( + + ), + name: 'WalletConnectLegacy', + text: t('WalletConnect Legacy'), + alt: t('WalletConnect v1'), }; } return { name: 'Unknown', text: t('Unknown') }; } + +type IconProps = { + width?: number; + height?: number; +}; + +const MetaMaskIcon = ({ width, height }: IconProps) => ( + + + + + + + + + + + + + + + + +); + +const CoinbaseWalletIcon = ({ width, height }: IconProps) => ( + + + + +); + +const WalletConnectIcon = ({ + width, + height, + fillColor = '#3396ff', +}: IconProps & { fillColor?: string }) => ( + + + + + + +); diff --git a/libs/web3/src/lib/web3-connect-store.ts b/libs/web3/src/lib/web3-connect-store.ts index 2ad545f0d..22e1605aa 100644 --- a/libs/web3/src/lib/web3-connect-store.ts +++ b/libs/web3/src/lib/web3-connect-store.ts @@ -6,11 +6,13 @@ interface State { isOpen: boolean; connectors: [Connector, Web3ReactHooks][]; desiredChainId?: number; + error?: Error; } interface Actions { initialize: (connectors: State['connectors'], desiredChainId: number) => void; open: () => void; close: () => void; + clearError: () => void; } export const useWeb3ConnectStore = create()((set) => ({ @@ -21,4 +23,5 @@ export const useWeb3ConnectStore = create()((set) => ({ }, open: () => set(() => ({ isOpen: true })), close: () => set(() => ({ isOpen: false })), + clearError: () => set(() => ({ error: undefined })), })); diff --git a/libs/web3/src/lib/web3-connectors.ts b/libs/web3/src/lib/web3-connectors.ts index a1899015b..3c86af737 100644 --- a/libs/web3/src/lib/web3-connectors.ts +++ b/libs/web3/src/lib/web3-connectors.ts @@ -2,8 +2,102 @@ import type { Web3ReactHooks } from '@web3-react/core'; import { initializeConnector } from '@web3-react/core'; import type { Connector } from '@web3-react/types'; import { MetaMask } from '@web3-react/metamask'; -import { WalletConnect } from '@web3-react/walletconnect'; +import { WalletConnect } from '@web3-react/walletconnect-v2'; +import { WalletConnect as WalletConnectLegacy } from '@web3-react/walletconnect'; +import { CoinbaseWallet } from '@web3-react/coinbase-wallet'; import { initializeUrlConnector } from './url-connector'; +import { WALLETCONNECT_PROJECT_ID } from './constants'; +import { useWeb3ConnectStore } from './web3-connect-store'; +import { theme } from '@vegaprotocol/tailwindcss-config'; + +export const initializeCoinbaseConnector = (providerUrl: string) => + initializeConnector( + (actions) => + new CoinbaseWallet({ + actions, + options: { + appName: 'Vega', + darkMode: true, + url: providerUrl, + }, + onError: (error) => { + console.log('ERR_COINBASE_WALLET', error); + useWeb3ConnectStore.setState({ error }); + }, + }) + ); + +export const initializeWalletConnectLegacyConnector = ( + chainId: number, + providerUrl: string +) => + initializeConnector( + (actions) => + new WalletConnectLegacy({ + actions, + options: { + rpc: { + [chainId]: providerUrl, + }, + qrcode: true, + }, + defaultChainId: chainId, + }) + ); + +export const initializeWalletConnector = ( + projectId: string, + chainId: number, + providerUrl: string +) => + projectId && projectId.length > 0 + ? initializeConnector( + (actions) => + new WalletConnect({ + actions, + defaultChainId: chainId, + options: { + projectId: projectId, + chains: [chainId], + showQrModal: true, + rpcMap: { + [chainId]: providerUrl, + }, + qrModalOptions: { + themeMode: 'dark', + themeVariables: { + '--w3m-z-index': '40', + '--w3m-accent-color': theme.colors.vega.yellow.DEFAULT, + '--w3m-background-color': theme.colors.vega.dark[100], + '--w3m-font-family': 'AlphaLyrae', + '--w3m-container-border-radius': '0.25rem', + '--w3m-background-border-radius': '0.25rem', + '--w3m-accent-fill-color': theme.colors.vega.yellow.DEFAULT, + }, + }, + }, + onError: (error) => { + console.log('ERR_WALLET_CONNECT', error.message); + useWeb3ConnectStore.setState({ error }); + }, + }) + ) + : null; + +export const initializeMetaMaskConnector = () => + initializeConnector( + (actions) => + new MetaMask({ + actions, + options: { + mustBeMetaMask: false, + }, + onError: (error) => { + console.log('ERR_META_MASK', error.message); + useWeb3ConnectStore.setState({ error }); + }, + }) + ); export const createConnectors = ( providerUrl: string, @@ -15,23 +109,11 @@ export const createConnectors = ( throw new Error('Invalid Ethereum chain ID for environment'); } - const [metamask, metamaskHooks] = initializeConnector( - (actions) => new MetaMask(actions) - ); - - const [walletconnect, walletconnectHooks] = - initializeConnector( - (actions) => - new WalletConnect(actions, { - rpc: { - [chainId]: providerUrl, - }, - }), - [chainId] - ); return [ initializeUrlConnector(localProviderUrl, walletMnemonic), - [metamask, metamaskHooks], - [walletconnect, walletconnectHooks], - ].filter(Boolean) as [Connector, Web3ReactHooks][]; + initializeMetaMaskConnector(), + initializeCoinbaseConnector(providerUrl), + initializeWalletConnector(WALLETCONNECT_PROJECT_ID, chainId, providerUrl), + initializeWalletConnectLegacyConnector(chainId, providerUrl), + ].filter(Boolean) as unknown as [Connector, Web3ReactHooks][]; }; diff --git a/libs/web3/src/lib/web3-provider.spec.tsx b/libs/web3/src/lib/web3-provider.spec.tsx index 9b8faa79b..e13e11129 100644 --- a/libs/web3/src/lib/web3-provider.spec.tsx +++ b/libs/web3/src/lib/web3-provider.spec.tsx @@ -4,7 +4,9 @@ import { initializeConnector } from '@web3-react/core'; import { MetaMask } from '@web3-react/metamask'; import { Web3Provider } from './web3-provider'; -const [foo, fooHooks] = initializeConnector((actions) => new MetaMask(actions)); +const [foo, fooHooks] = initializeConnector( + (actions) => new MetaMask({ actions }) +); const connectors: [MetaMask, Web3ReactHooks][] = [[foo, fooHooks]]; diff --git a/libs/web3/src/lib/web3-provider.tsx b/libs/web3/src/lib/web3-provider.tsx index 92343e84a..73c47238c 100644 --- a/libs/web3/src/lib/web3-provider.tsx +++ b/libs/web3/src/lib/web3-provider.tsx @@ -1,6 +1,7 @@ import type { Web3ReactHooks } from '@web3-react/core'; import { Web3ReactProvider } from '@web3-react/core'; import type { Connector } from '@web3-react/types'; +import { useMemo } from 'react'; interface Web3ProviderProps { children: JSX.Element | JSX.Element[]; @@ -8,7 +9,19 @@ interface Web3ProviderProps { } export const Web3Provider = ({ children, connectors }: Web3ProviderProps) => { + /** + * The connectors prop passed to Web3ReactProvider must be referentially static. + * https://github.com/Uniswap/web3-react/blob/31742897f9fddb38e00e36c2516029d3df9a9c54/packages/core/src/provider.tsx#L66 + */ + const key = useMemo( + () => `WEB3_PROVIDER_${Date.now().toString()}`, + // eslint-disable-next-line react-hooks/exhaustive-deps + [connectors] + ); + return ( - {children} + + {children} + ); }; diff --git a/libs/withdraws/src/lib/withdraw-form.tsx b/libs/withdraws/src/lib/withdraw-form.tsx index 0c676b190..5fec610a2 100644 --- a/libs/withdraws/src/lib/withdraw-form.tsx +++ b/libs/withdraws/src/lib/withdraw-form.tsx @@ -31,6 +31,7 @@ import { WithdrawLimits } from './withdraw-limits'; import { ETHEREUM_EAGER_CONNECT, useWeb3ConnectStore, + useWeb3Disconnect, } from '@vegaprotocol/web3'; interface FormFields { @@ -298,6 +299,7 @@ const EthereumButton = ({ clearAddress }: { clearAddress: () => void }) => { const openDialog = useWeb3ConnectStore((state) => state.open); const { isActive, connector } = useWeb3React(); const [, , removeEagerConnector] = useLocalStorage(ETHEREUM_EAGER_CONNECT); + const disconnect = useWeb3Disconnect(connector); if (!isActive) { return ( @@ -310,7 +312,7 @@ const EthereumButton = ({ clearAddress }: { clearAddress: () => void }) => { return ( { - connector.deactivate(); + disconnect(); clearAddress(); removeEagerConnector(); }} diff --git a/package.json b/package.json index acef1a5ab..4dcb3db01 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "dependencies": { "@apollo/client": "^3.5.8", "@blueprintjs/icons": "^3.32.0", + "@coinbase/wallet-sdk": "^3.6.5", "@radix-ui/react-accordion": "^1.1.0", "@radix-ui/react-checkbox": "^1.0.1", "@radix-ui/react-dialog": "^1.0.2", @@ -37,10 +38,12 @@ "@sentry/react": "^6.19.2", "@sentry/tracing": "^6.19.2", "@vegaprotocol/wallet-client": "0.1.9", - "@walletconnect/ethereum-provider": "^1.7.5", - "@web3-react/core": "8.0.20-beta.0", - "@web3-react/metamask": "8.0.16-beta.0", - "@web3-react/walletconnect": "^8.0.23-beta.0", + "@walletconnect/ethereum-provider": "^2.6.0", + "@web3-react/coinbase-wallet": "8.1.2-beta.0", + "@web3-react/core": "^8.1.2-beta.0", + "@web3-react/metamask": "^8.1.2-beta.0", + "@web3-react/walletconnect": "8.1.3-beta.0", + "@web3-react/walletconnect-v2": "^8.1.3-beta.0", "ag-grid-community": "^27.0.1", "ag-grid-react": "^27.0.1", "allotment": "1.18.1", @@ -149,8 +152,9 @@ "autoprefixer": "10.4.8", "babel-jest": "27.5.1", "babel-loader": "8.1.0", - "cypress": "^11.2.0", - "cypress-real-events": "^1.7.1", + "cypress-mochawesome-reporter": "^3.3.0", + "cypress": "^12.9.0", + "cypress-real-events": "^1.7.6", "dotenv": "^16.0.1", "eslint": "8.15.0", "eslint-config-next": "12.2.3", @@ -190,7 +194,7 @@ "ts-node": "10.9.1", "tslib": "^2.0.0", "type-fest": "^2.12.2", - "typescript": "4.7.4", + "typescript": "^5.0.4", "url-loader": "^3.0.0" }, "lint-staged": { diff --git a/yarn.lock b/yarn.lock index 5c7e63dba..3f70c1cf0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -417,6 +417,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-module-imports@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" + integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== + dependencies: + "@babel/types" "^7.21.4" + "@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.0", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.2": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" @@ -1267,6 +1274,18 @@ babel-plugin-polyfill-regenerator "^0.4.1" semver "^6.3.0" +"@babel/plugin-transform-runtime@^7.5.5": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz#2e1da21ca597a7d01fc96b699b21d8d2023191aa" + integrity sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA== + dependencies: + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-plugin-utils" "^7.20.2" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + semver "^6.3.0" + "@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" @@ -1581,7 +1600,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.7.6": +"@babel/runtime@^7.17.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== @@ -1689,6 +1708,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" + integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + "@base2/pretty-print-object@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz#371ba8be66d556812dc7fb169ebc3c08378f69d4" @@ -1715,6 +1743,29 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@coinbase/wallet-sdk@^3.6.5": + version "3.6.5" + resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-3.6.5.tgz#5ca894771b4eb9cbfaf754c1422f0287329e6868" + integrity sha512-8F91dvvC/+CTpaNTr+FgpLMa2YxjpXpE9pdnGewMoYi41ISbiXZado5VjYo9QSZlS+myzfKvDGpTzLFFUXPfDg== + dependencies: + "@metamask/safe-event-emitter" "2.0.0" + "@solana/web3.js" "^1.70.1" + 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 "5.1.0" + eth-rpc-errors "4.0.2" + json-rpc-engine "6.1.0" + keccak "^3.0.1" + preact "^10.5.9" + qs "^6.10.3" + rxjs "^6.6.3" + sha.js "^2.4.11" + stream-browserify "^3.0.0" + util "^0.12.4" + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -2057,7 +2108,7 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.6.0", "@ethersproject/address@^5.7.0": +"@ethersproject/address@5.7.0", "@ethersproject/address@^5", "@ethersproject/address@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== @@ -2218,7 +2269,7 @@ dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.1", "@ethersproject/providers@^5.6.0": +"@ethersproject/providers@5.7.1": version "5.7.1" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.1.tgz#b0799b616d5579cd1067a8ebf1fc1ec74c1e122c" integrity sha512-vZveG/DLyo+wk4Ga1yx6jSEHrLPgmTt+dFv0dv8URpVCRf0jVhalps1jq/emN/oXnMRsC7cQgAF32DcXLL7BPQ== @@ -2244,6 +2295,32 @@ bech32 "1.1.4" ws "7.4.6" +"@ethersproject/providers@^5": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + "@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" @@ -3399,6 +3476,18 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== +"@lit-labs/ssr-dom-shim@^1.0.0", "@lit-labs/ssr-dom-shim@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.0.tgz#3361d6b8c4cb2ac426d5794ac7cd9776cd2f0814" + integrity sha512-92uQ5ARf7UXYrzaFcAX3T2rTvaS9Z1//ukV+DqjACM4c8s0ZBQd7ayJU5Dh2AFLD/Ayuyz4uMmxQec8q3U4Ong== + +"@lit/reactive-element@^1.3.0", "@lit/reactive-element@^1.6.0": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@lit/reactive-element/-/reactive-element-1.6.1.tgz#0d958b6d479d0e3db5fc1132ecc4fa84be3f0b93" + integrity sha512-va15kYZr7KZNNPZdxONGQzpUr+4sxVu7V/VG7a8mRfPPXUyhEYj5RzXCQmGrlP3tAh0L3HHm5AjBMFYRqlM9SA== + dependencies: + "@lit-labs/ssr-dom-shim" "^1.0.0" + "@mdx-js/mdx@^1.6.22": version "1.6.22" resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" @@ -3439,6 +3528,80 @@ resolved "https://registry.yarnpkg.com/@metamask/detect-provider/-/detect-provider-1.2.0.tgz#3667a7531f2a682e3c3a43eaf3a1958bdb42a696" integrity sha512-ocA76vt+8D0thgXZ7LxFPyqw3H7988qblgzddTDA6B8a/yU0uKV42QR/DhA+Jh11rJjxW0jKvwb5htA6krNZDQ== +"@metamask/safe-event-emitter@2.0.0", "@metamask/safe-event-emitter@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c" + integrity sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q== + +"@motionone/animation@^10.15.1": + version "10.15.1" + resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.15.1.tgz#4a85596c31cbc5100ae8eb8b34c459fb0ccf6807" + integrity sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ== + dependencies: + "@motionone/easing" "^10.15.1" + "@motionone/types" "^10.15.1" + "@motionone/utils" "^10.15.1" + tslib "^2.3.1" + +"@motionone/dom@^10.15.5": + version "10.15.5" + resolved "https://registry.yarnpkg.com/@motionone/dom/-/dom-10.15.5.tgz#4af18f8136d85c2fc997cac98121c969f6731802" + integrity sha512-Xc5avlgyh3xukU9tydh9+8mB8+2zAq+WlLsC3eEIp7Ax7DnXgY7Bj/iv0a4X2R9z9ZFZiaXK3BO0xMYHKbAAdA== + dependencies: + "@motionone/animation" "^10.15.1" + "@motionone/generators" "^10.15.1" + "@motionone/types" "^10.15.1" + "@motionone/utils" "^10.15.1" + hey-listen "^1.0.8" + tslib "^2.3.1" + +"@motionone/easing@^10.15.1": + version "10.15.1" + resolved "https://registry.yarnpkg.com/@motionone/easing/-/easing-10.15.1.tgz#95cf3adaef34da6deebb83940d8143ede3deb693" + integrity sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw== + dependencies: + "@motionone/utils" "^10.15.1" + tslib "^2.3.1" + +"@motionone/generators@^10.15.1": + version "10.15.1" + resolved "https://registry.yarnpkg.com/@motionone/generators/-/generators-10.15.1.tgz#dc6abb11139d1bafe758a41c134d4c753a9b871c" + integrity sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ== + dependencies: + "@motionone/types" "^10.15.1" + "@motionone/utils" "^10.15.1" + tslib "^2.3.1" + +"@motionone/svelte@^10.15.5": + version "10.15.5" + resolved "https://registry.yarnpkg.com/@motionone/svelte/-/svelte-10.15.5.tgz#f36b40101ec1db122820598089f42e831f6cf5f5" + integrity sha512-Xyxtgp7BlVnSBwcoFmXGHUVnpNktzeXsEifu2NJJWc7VGuxutDsBZxNdz80qvpLIC5MeBa1wh7GGegZzTm1msg== + dependencies: + "@motionone/dom" "^10.15.5" + tslib "^2.3.1" + +"@motionone/types@^10.15.1": + version "10.15.1" + resolved "https://registry.yarnpkg.com/@motionone/types/-/types-10.15.1.tgz#89441b54285012795cbba8612cbaa0fa420db3eb" + integrity sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA== + +"@motionone/utils@^10.15.1": + version "10.15.1" + resolved "https://registry.yarnpkg.com/@motionone/utils/-/utils-10.15.1.tgz#6b5f51bde75be88b5411e084310299050368a438" + integrity sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw== + dependencies: + "@motionone/types" "^10.15.1" + hey-listen "^1.0.8" + tslib "^2.3.1" + +"@motionone/vue@^10.15.5": + version "10.15.5" + resolved "https://registry.yarnpkg.com/@motionone/vue/-/vue-10.15.5.tgz#3101c62b2fce06b3f3072b9ff0f551213eb02476" + integrity sha512-cUENrLYAolUacHvCgU+8wF9OgSlVutfWbHMLERI/bElCJ+e2YVQvG/CpGhIM5fYOOJzuvg2T2wHmLLmvJoavEw== + dependencies: + "@motionone/dom" "^10.15.5" + tslib "^2.3.1" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -3531,6 +3694,21 @@ resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.2.3.tgz#403e1575a84c31cbd7f3c0ecd51b61bc25b7f808" integrity sha512-huSNb98KSG77Kl96CoPgCwom28aamuUsPpRmn/4s9L0RNbbHVSkp9E6HA4yOAykZCEuWcdNsRLbVVuAbt8rtIw== +"@noble/ed25519@^1.7.0": + version "1.7.3" + resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.7.3.tgz#57e1677bf6885354b466c38e2b620c62f45a7123" + integrity sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ== + +"@noble/hashes@^1.1.2": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.0.tgz#085fd70f6d7d9d109671090ccae1d3bec62554a1" + integrity sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg== + +"@noble/secp256k1@^1.6.3": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -4872,6 +5050,169 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@solana/buffer-layout@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15" + integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA== + dependencies: + buffer "~6.0.3" + +"@solana/web3.js@^1.70.1": + version "1.75.0" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.75.0.tgz#824c6f78865007bca758ca18f268d6f7363b42e5" + integrity sha512-rHQgdo1EWfb+nPUpHe4O7i8qJPELHKNR5PAZRK+a7XxiykqOfbaAlPt5boDWAGPnYbSv0ziWZv5mq9DlFaQCxg== + dependencies: + "@babel/runtime" "^7.12.5" + "@noble/ed25519" "^1.7.0" + "@noble/hashes" "^1.1.2" + "@noble/secp256k1" "^1.6.3" + "@solana/buffer-layout" "^4.0.0" + agentkeepalive "^4.2.1" + bigint-buffer "^1.1.5" + bn.js "^5.0.0" + borsh "^0.7.0" + bs58 "^4.0.1" + buffer "6.0.3" + fast-stable-stringify "^1.0.0" + jayson "^3.4.4" + node-fetch "^2.6.7" + rpc-websockets "^7.5.1" + superstruct "^0.14.2" + +"@stablelib/aead@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/aead/-/aead-1.0.1.tgz#c4b1106df9c23d1b867eb9b276d8f42d5fc4c0c3" + integrity sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg== + +"@stablelib/binary@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/binary/-/binary-1.0.1.tgz#c5900b94368baf00f811da5bdb1610963dfddf7f" + integrity sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q== + dependencies: + "@stablelib/int" "^1.0.1" + +"@stablelib/bytes@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/bytes/-/bytes-1.0.1.tgz#0f4aa7b03df3080b878c7dea927d01f42d6a20d8" + integrity sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ== + +"@stablelib/chacha20poly1305@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/chacha20poly1305/-/chacha20poly1305-1.0.1.tgz#de6b18e283a9cb9b7530d8767f99cde1fec4c2ee" + integrity sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA== + dependencies: + "@stablelib/aead" "^1.0.1" + "@stablelib/binary" "^1.0.1" + "@stablelib/chacha" "^1.0.1" + "@stablelib/constant-time" "^1.0.1" + "@stablelib/poly1305" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/chacha@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/chacha/-/chacha-1.0.1.tgz#deccfac95083e30600c3f92803a3a1a4fa761371" + integrity sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/constant-time@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/constant-time/-/constant-time-1.0.1.tgz#bde361465e1cf7b9753061b77e376b0ca4c77e35" + integrity sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg== + +"@stablelib/ed25519@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@stablelib/ed25519/-/ed25519-1.0.3.tgz#f8fdeb6f77114897c887bb6a3138d659d3f35996" + integrity sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg== + dependencies: + "@stablelib/random" "^1.0.2" + "@stablelib/sha512" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/hash@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hash/-/hash-1.0.1.tgz#3c944403ff2239fad8ebb9015e33e98444058bc5" + integrity sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg== + +"@stablelib/hkdf@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hkdf/-/hkdf-1.0.1.tgz#b4efd47fd56fb43c6a13e8775a54b354f028d98d" + integrity sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g== + dependencies: + "@stablelib/hash" "^1.0.1" + "@stablelib/hmac" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/hmac@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hmac/-/hmac-1.0.1.tgz#3d4c1b8cf194cb05d28155f0eed8a299620a07ec" + integrity sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA== + dependencies: + "@stablelib/constant-time" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/int@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/int/-/int-1.0.1.tgz#75928cc25d59d73d75ae361f02128588c15fd008" + integrity sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w== + +"@stablelib/keyagreement@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/keyagreement/-/keyagreement-1.0.1.tgz#4612efb0a30989deb437cd352cee637ca41fc50f" + integrity sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg== + dependencies: + "@stablelib/bytes" "^1.0.1" + +"@stablelib/poly1305@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/poly1305/-/poly1305-1.0.1.tgz#93bfb836c9384685d33d70080718deae4ddef1dc" + integrity sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA== + dependencies: + "@stablelib/constant-time" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/random@^1.0.1", "@stablelib/random@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@stablelib/random/-/random-1.0.2.tgz#2dece393636489bf7e19c51229dd7900eddf742c" + integrity sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/sha256@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/sha256/-/sha256-1.0.1.tgz#77b6675b67f9b0ea081d2e31bda4866297a3ae4f" + integrity sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/sha512@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/sha512/-/sha512-1.0.1.tgz#6da700c901c2c0ceacbd3ae122a38ac57c72145f" + integrity sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/wipe@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/wipe/-/wipe-1.0.1.tgz#d21401f1d59ade56a62e139462a97f104ed19a36" + integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== + +"@stablelib/x25519@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@stablelib/x25519/-/x25519-1.0.3.tgz#13c8174f774ea9f3e5e42213cbf9fc68a3c7b7fd" + integrity sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw== + dependencies: + "@stablelib/keyagreement" "^1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/wipe" "^1.0.1" + "@storybook/addon-a11y@^6.4.19": version "6.5.13" resolved "https://registry.yarnpkg.com/@storybook/addon-a11y/-/addon-a11y-6.5.13.tgz#3934b12dc2f3bf7a1a1bc660aa7b84b856bc2b6c" @@ -6530,7 +6871,7 @@ "@types/express-serve-static-core" "*" "@types/node" "*" -"@types/connect@*": +"@types/connect@*", "@types/connect@^3.4.33": version "3.4.35" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== @@ -6912,6 +7253,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.8.4.tgz#54be907698f40de8a45770b48486aa3cbd3adff7" integrity sha512-WdlVphvfR/GJCLEMbNA8lJ0lhFNBj4SW3O+O5/cEGw9oYrv0al9zTwuQsq+myDUXgNx2jgBynoVgZ2MMJ6pbow== +"@types/node@^12.12.54": + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== + "@types/node@^14.0.10 || ^16.0.0": version "16.18.3" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.3.tgz#d7f7ba828ad9e540270f01ce00d391c54e6e0abc" @@ -7152,6 +7498,11 @@ dependencies: "@types/jest" "*" +"@types/trusted-types@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.3.tgz#a136f83b0758698df454e328759dbd3d44555311" + integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== + "@types/uglify-js@*": version "3.17.0" resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.17.0.tgz#95271e7abe0bf7094c60284f76ee43232aef43b9" @@ -7195,6 +7546,13 @@ anymatch "^3.0.0" source-map "^0.6.0" +"@types/ws@^7.4.4": + version "7.4.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" + "@types/ws@^8.0.0", "@types/ws@^8.5.1": version "8.5.3" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" @@ -7402,6 +7760,28 @@ "@walletconnect/types" "^1.8.0" "@walletconnect/utils" "^1.8.0" +"@walletconnect/core@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.6.0.tgz#7a3a6c4849e90885d15c6d29dd85cd4af22b211c" + integrity sha512-Ma2coHOKiNYiYhYiuaT2gRfR4obp3TYbt+cdXM5i7kOkZ6Z0KrmC6L1ZK2RMPdDiDbbbhRPGpuwh0VMy7NLjFA== + dependencies: + "@walletconnect/heartbeat" "1.2.0" + "@walletconnect/jsonrpc-provider" "1.0.10" + "@walletconnect/jsonrpc-utils" "^1.0.4" + "@walletconnect/jsonrpc-ws-connection" "1.0.10" + "@walletconnect/keyvaluestorage" "^1.0.2" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/relay-auth" "^1.0.4" + "@walletconnect/safe-json" "^1.0.1" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.6.0" + "@walletconnect/utils" "2.6.0" + events "^3.3.0" + lodash.isequal "4.5.0" + pino "7.11.0" + uint8arrays "^3.1.0" + "@walletconnect/core@^1.8.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.8.0.tgz#6b2748b90c999d9d6a70e52e26a8d5e8bfeaa81e" @@ -7412,30 +7792,34 @@ "@walletconnect/utils" "^1.8.0" "@walletconnect/crypto@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.2.tgz#3fcc2b2cde6f529a19eadd883dc555cd0e861992" - integrity sha512-+OlNtwieUqVcOpFTvLBvH+9J9pntEqH5evpINHfVxff1XIgwV55PpbdvkHu6r9Ib4WQDOFiD8OeeXs1vHw7xKQ== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.3.tgz#7b8dd4d7e2884fe3543c7c07aea425eef5ef9dd4" + integrity sha512-+2jdORD7XQs76I2Odgr3wwrtyuLUXD/kprNVsjWRhhhdO9Mt6WqVzOPu0/t7OHSmgal8k7SoBQzUc5hu/8zL/g== dependencies: - "@walletconnect/encoding" "^1.0.1" - "@walletconnect/environment" "^1.0.0" - "@walletconnect/randombytes" "^1.0.2" + "@walletconnect/encoding" "^1.0.2" + "@walletconnect/environment" "^1.0.1" + "@walletconnect/randombytes" "^1.0.3" aes-js "^3.1.2" hash.js "^1.1.7" + tslib "1.14.1" -"@walletconnect/encoding@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.1.tgz#93c18ce9478c3d5283dbb88c41eb2864b575269a" - integrity sha512-8opL2rs6N6E3tJfsqwS82aZQDL3gmupWUgmvuZ3CGU7z/InZs3R9jkzH8wmYtpbq0sFK3WkJkQRZFFk4BkrmFA== +"@walletconnect/encoding@^1.0.1", "@walletconnect/encoding@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.2.tgz#cb3942ad038d6a6bf01158f66773062dd25724da" + integrity sha512-CrwSBrjqJ7rpGQcTL3kU+Ief+Bcuu9PH6JLOb+wM6NITX1GTxR/MfNwnQfhLKK6xpRAyj2/nM04OOH6wS8Imag== dependencies: is-typedarray "1.0.0" + tslib "1.14.1" typedarray-to-buffer "3.1.5" -"@walletconnect/environment@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.0.tgz#c4545869fa9c389ec88c364e1a5f8178e8ab5034" - integrity sha512-4BwqyWy6KpSvkocSaV7WR3BlZfrxLbJSLkg+j7Gl6pTDE+U55lLhJvQaMuDVazXYxcjBsG09k7UlH7cGiUI5vQ== +"@walletconnect/environment@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.1.tgz#1d7f82f0009ab821a2ba5ad5e5a7b8ae3b214cd7" + integrity sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg== + dependencies: + tslib "1.14.1" -"@walletconnect/ethereum-provider@^1.7.5": +"@walletconnect/ethereum-provider@^1.7.8": version "1.8.0" resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-1.8.0.tgz#ed1dbf9cecc3b818758a060d2f9017c50bde1d32" integrity sha512-Nq9m+oo5P0F+njsROHw9KMWdoc/8iGHYzQdkjJN/1C7DtsqFRg5k5a3hd9rzCLpbPsOC1q8Z5lRs6JQgDvPm6Q== @@ -7449,6 +7833,41 @@ eip1193-provider "1.0.1" eventemitter3 "4.0.7" +"@walletconnect/ethereum-provider@^2.5.1", "@walletconnect/ethereum-provider@^2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-2.6.0.tgz#a7f344b448c11e307611bab4528e5b1ea9b77b2a" + integrity sha512-CklAt2wWS/hKOaV1g6tkutOi6wueBcATfHJscaFxGm3q+BiulON+4uZk9ZjBcwOWNJsxQvbGCEY77IiaZT2Alg== + dependencies: + "@walletconnect/jsonrpc-http-connection" "^1.0.4" + "@walletconnect/jsonrpc-provider" "^1.0.6" + "@walletconnect/jsonrpc-types" "^1.0.2" + "@walletconnect/jsonrpc-utils" "^1.0.4" + "@walletconnect/sign-client" "2.6.0" + "@walletconnect/types" "2.6.0" + "@walletconnect/universal-provider" "2.6.0" + "@walletconnect/utils" "2.6.0" + events "^3.3.0" + +"@walletconnect/events@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/events/-/events-1.0.1.tgz#2b5f9c7202019e229d7ccae1369a9e86bda7816c" + integrity sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ== + dependencies: + keyvaluestorage-interface "^1.0.0" + tslib "1.14.1" + +"@walletconnect/heartbeat@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@walletconnect/heartbeat/-/heartbeat-1.2.0.tgz#1e87dd234cb72b0587b84f95c4f942f2b4bd0c79" + integrity sha512-0vbzTa/ARrpmMmOD+bQMxPvFYKtOLQZObgZakrYr0aODiMOO71CmPVNV2eAqXnw9rMmcP+z91OybLeIFlwTjjA== + dependencies: + "@walletconnect/events" "^1.0.1" + "@walletconnect/time" "^1.0.2" + chai "^4.3.7" + mocha "^10.2.0" + ts-node "^10.9.1" + tslib "1.14.1" + "@walletconnect/iso-crypto@^1.8.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.8.0.tgz#44ddf337c4f02837c062dbe33fa7ab36789df451" @@ -7458,37 +7877,86 @@ "@walletconnect/types" "^1.8.0" "@walletconnect/utils" "^1.8.0" -"@walletconnect/jsonrpc-http-connection@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.3.tgz#0343811bb33fb8a3823cb3306b306cf2ed61e99a" - integrity sha512-npPvDG2JxyxoqOphDiyjp5pPeASRBrlfQS39wHESPHlFIjBuvNt9lV9teh53MK9Ncbyxh4y2qEKMfPgcUulTRg== +"@walletconnect/jsonrpc-http-connection@^1.0.2", "@walletconnect/jsonrpc-http-connection@^1.0.4": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.6.tgz#48c41cf3e5ac9add9425420b345615dc438594cd" + integrity sha512-/3zSqDi7JDN06E4qm0NmVYMitngXfh21UWwy8zeJcBeJc+Jcs094EbLsIxtziIIKTCCbT88lWuTjl1ZujxN7cw== dependencies: - "@walletconnect/jsonrpc-utils" "^1.0.3" - "@walletconnect/safe-json" "^1.0.0" + "@walletconnect/jsonrpc-utils" "^1.0.6" + "@walletconnect/safe-json" "^1.0.1" cross-fetch "^3.1.4" + tslib "1.14.1" + +"@walletconnect/jsonrpc-provider@1.0.10", "@walletconnect/jsonrpc-provider@^1.0.6": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.10.tgz#8351a06b70faa8f8c0e77dc2c6d9b0190d17d407" + integrity sha512-g0ffPSpY3P6GqGjWGHsr3yqvQUhj7q2k6pAikoXv5XTXWaJRzFvrlbFkSgxziXsBrwrMZn0qvPufvpN4mMZ5FA== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.6" + "@walletconnect/safe-json" "^1.0.1" + tslib "1.14.1" "@walletconnect/jsonrpc-provider@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.5.tgz#1a66053b6f083a9885a32b7c2c8f6a376f1a4458" - integrity sha512-v61u4ZIV8+p9uIHS2Kl2YRj/2idrQiHcrbrJXw3McQkEJtj9mkCofr1Hu/n419wSRM5uiNK8Z4WRS9zGTTAhWQ== + version "1.0.12" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.12.tgz#965408d99fc889d49c194cd207804282805f45ed" + integrity sha512-6uI2y5281gloZSzICOjk+CVC7CVu0MhtMt2Yzpj05lPb0pzm/bK2oZ2ibxwLerPrqpNt/5bIFVRmoOgPw1mHAQ== dependencies: - "@walletconnect/jsonrpc-utils" "^1.0.3" - "@walletconnect/safe-json" "^1.0.0" + "@walletconnect/jsonrpc-utils" "^1.0.7" + "@walletconnect/safe-json" "^1.0.2" + tslib "1.14.1" -"@walletconnect/jsonrpc-types@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.1.tgz#a96b4bb2bcc8838a70e06f15c1b5ab11c47d8e95" - integrity sha512-+6coTtOuChCqM+AoYyi4Q83p9l/laI6NvuM2/AHaZFuf0gT0NjW7IX2+86qGyizn7Ptq4AYZmfxurAxTnhefuw== +"@walletconnect/jsonrpc-types@^1.0.1", "@walletconnect/jsonrpc-types@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.2.tgz#b79519f679cd6a5fa4a1bea888f27c1916689a20" + integrity sha512-CZe8tjJX73OWdHjrBHy7HtAapJ2tT0Q3TYhPBhRxi3643lwPIQWC9En45ldY14TZwgSewkbZ0FtGBZK0G7Bbyg== dependencies: keyvaluestorage-interface "^1.0.0" + tslib "1.14.1" -"@walletconnect/jsonrpc-utils@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.3.tgz#5bd49865eef0eae48e8b45a06731dc18691cf8c7" - integrity sha512-3yb49bPk16MNLk6uIIHPSHQCpD6UAo1OMOx1rM8cW/MPEAYAzrSW5hkhG7NEUwX9SokRIgnZK3QuQkiyNzBMhQ== +"@walletconnect/jsonrpc-utils@^1.0.3", "@walletconnect/jsonrpc-utils@^1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.7.tgz#1812d17c784f1ec0735bf03d0884287f60bfa2ce" + integrity sha512-zJziApzUF/Il4VcwabnaU+0yo1QI4eUkYX99zmCVTHJvZOf2l0zjADf/OpKqWyeNFC3Io56Z/8uJHVtcNVvyFA== dependencies: - "@walletconnect/environment" "^1.0.0" - "@walletconnect/jsonrpc-types" "^1.0.1" + "@walletconnect/environment" "^1.0.1" + "@walletconnect/jsonrpc-types" "^1.0.2" + tslib "1.14.1" + +"@walletconnect/jsonrpc-utils@^1.0.4", "@walletconnect/jsonrpc-utils@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.6.tgz#7fa58e6671247e64e189828103282e6258f5330f" + integrity sha512-snp0tfkjPiDLQp/jrBewI+9SM33GPV4+Gjgldod6XQ7rFyQ5FZjnBxUkY4xWH0+arNxzQSi6v5iDXjCjSaorpg== + dependencies: + "@walletconnect/environment" "^1.0.1" + "@walletconnect/jsonrpc-types" "^1.0.2" + tslib "1.14.1" + +"@walletconnect/jsonrpc-ws-connection@1.0.10": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.10.tgz#04e04a7d8c70b27c386a1bdd9ff6511045da3c81" + integrity sha512-/tidvjfCXZuYugjF5fOswsNDPoMo9QRML3DFQ0dfNUarL4f5HGqu8NDGerr2n0+4MOX23GsT6Vv2POSwFbvgGw== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.6" + "@walletconnect/safe-json" "^1.0.1" + events "^3.3.0" + tslib "1.14.1" + ws "^7.5.1" + +"@walletconnect/keyvaluestorage@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.0.2.tgz#92f5ca0f54c1a88a093778842ce0c874d86369c8" + integrity sha512-U/nNG+VLWoPFdwwKx0oliT4ziKQCEoQ27L5Hhw8YOFGA2Po9A9pULUYNWhDgHkrb0gYDNt//X7wABcEWWBd3FQ== + dependencies: + safe-json-utils "^1.1.1" + tslib "1.14.1" + +"@walletconnect/logger@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/logger/-/logger-2.0.1.tgz#7f489b96e9a1ff6bf3e58f0fbd6d69718bf844a8" + integrity sha512-SsTKdsgWm+oDTBeNE/zHxxr5eJfZmE9/5yp/Ku+zJtcTAjELb3DXueWkDXmE9h8uHIbJzIb5wj5lPdzyrjT6hQ== + dependencies: + pino "7.11.0" + tslib "1.14.1" "@walletconnect/mobile-registry@^1.4.0": version "1.4.0" @@ -7507,20 +7975,71 @@ preact "10.4.1" qrcode "1.4.4" -"@walletconnect/randombytes@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.2.tgz#95c644251a15e6675f58fbffc9513a01486da49c" - integrity sha512-ivgOtAyqQnN0rLQmOFPemsgYGysd/ooLfaDA/ACQ3cyqlca56t3rZc7pXfqJOIETx/wSyoF5XbwL+BqYodw27A== +"@walletconnect/randombytes@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.3.tgz#e795e4918367fd1e6a2215e075e64ab93e23985b" + integrity sha512-35lpzxcHFbTN3ABefC9W+uBpNZl1GC4Wpx0ed30gibfO/y9oLdy1NznbV96HARQKSBV9J9M/rrtIvf6a23jfYw== dependencies: - "@walletconnect/encoding" "^1.0.1" - "@walletconnect/environment" "^1.0.0" + "@walletconnect/encoding" "^1.0.2" + "@walletconnect/environment" "^1.0.1" randombytes "^2.1.0" + tslib "1.14.1" -"@walletconnect/safe-json@1.0.0", "@walletconnect/safe-json@^1.0.0": +"@walletconnect/relay-api@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@walletconnect/relay-api/-/relay-api-1.0.9.tgz#f8c2c3993dddaa9f33ed42197fc9bfebd790ecaf" + integrity sha512-Q3+rylJOqRkO1D9Su0DPE3mmznbAalYapJ9qmzDgK28mYF9alcP3UwG/og5V7l7CFOqzCLi7B8BvcBUrpDj0Rg== + dependencies: + "@walletconnect/jsonrpc-types" "^1.0.2" + tslib "1.14.1" + +"@walletconnect/relay-auth@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz#0b5c55c9aa3b0ef61f526ce679f3ff8a5c4c2c7c" + integrity sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ== + dependencies: + "@stablelib/ed25519" "^1.0.2" + "@stablelib/random" "^1.0.1" + "@walletconnect/safe-json" "^1.0.1" + "@walletconnect/time" "^1.0.2" + tslib "1.14.1" + uint8arrays "^3.0.0" + +"@walletconnect/safe-json@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.0.tgz#12eeb11d43795199c045fafde97e3c91646683b2" integrity sha512-QJzp/S/86sUAgWY6eh5MKYmSfZaRpIlmCJdi5uG4DJlKkZrHEF7ye7gA+VtbVzvTtpM/gRwO2plQuiooIeXjfg== +"@walletconnect/safe-json@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.1.tgz#9813fa0a7a544b16468730c2d7bed046ed160957" + integrity sha512-Fm7e31oSYY15NQr8SsLJheKAy5L744udZf2lJKcz6wFmPJEzf7hOF0866o/rrldRzJnjZ4H2GJ45pFudsnLW5A== + dependencies: + tslib "1.14.1" + +"@walletconnect/safe-json@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.2.tgz#7237e5ca48046e4476154e503c6d3c914126fa77" + integrity sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA== + dependencies: + tslib "1.14.1" + +"@walletconnect/sign-client@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.6.0.tgz#44bc481b42a108329c4270b8042e8258a453a6ca" + integrity sha512-t46sMUSvu418Krc0oXHcoazdxWe8wvprxZ0SF34R99HsU9XxhIC6bS5mhizPiwn60gAMrgE6KtAXzXJFCp4kqw== + dependencies: + "@walletconnect/core" "2.6.0" + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.0" + "@walletconnect/jsonrpc-utils" "^1.0.4" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.6.0" + "@walletconnect/utils" "2.6.0" + events "^3.3.0" + pino "7.11.0" + "@walletconnect/signer-connection@^1.8.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@walletconnect/signer-connection/-/signer-connection-1.8.0.tgz#6cdf490df770e504cc1a550bdb5bac7696b130bc" @@ -7542,11 +8061,68 @@ "@walletconnect/utils" "^1.8.0" ws "7.5.3" +"@walletconnect/time@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/time/-/time-1.0.2.tgz#6c5888b835750ecb4299d28eecc5e72c6d336523" + integrity sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g== + dependencies: + tslib "1.14.1" + +"@walletconnect/types@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.6.0.tgz#2548590bcee1a4143ed7c6209bd1837bac667843" + integrity sha512-Rob72yUFnXMlvnV2On4MYQ+TPQGAqRB/pfX8MDZqe72rY2Hn6qz/TwPd4abMF7GWdv8d89UO3nvpkbtI2MNpsw== + dependencies: + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.0" + "@walletconnect/jsonrpc-types" "^1.0.2" + "@walletconnect/keyvaluestorage" "^1.0.2" + "@walletconnect/logger" "^2.0.1" + events "^3.3.0" + "@walletconnect/types@^1.8.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.8.0.tgz#3f5e85b2d6b149337f727ab8a71b8471d8d9a195" integrity sha512-Cn+3I0V0vT9ghMuzh1KzZvCkiAxTq+1TR2eSqw5E5AVWfmCtECFkVZBP6uUJZ8YjwLqXheI+rnjqPy7sVM4Fyg== +"@walletconnect/universal-provider@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@walletconnect/universal-provider/-/universal-provider-2.6.0.tgz#7fb1f45aaaf86b084315a239c3ee3e25d9243c3f" + integrity sha512-MSfhh88yz82eftUjndB0nGyrve7C/geU2ijp+cddhkc4Wbtz6j8Or70LehJ10iubdOw5qTw6Exc8ZCn0NWIVdg== + dependencies: + "@walletconnect/jsonrpc-http-connection" "^1.0.4" + "@walletconnect/jsonrpc-provider" "^1.0.6" + "@walletconnect/jsonrpc-types" "^1.0.2" + "@walletconnect/jsonrpc-utils" "^1.0.4" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/sign-client" "2.6.0" + "@walletconnect/types" "2.6.0" + "@walletconnect/utils" "2.6.0" + eip1193-provider "1.0.1" + events "^3.3.0" + pino "7.11.0" + +"@walletconnect/utils@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.6.0.tgz#42d3a196c059342e8c7c96bcab47e84419ed0189" + integrity sha512-XQXc83PEBrGOfyH2emzBg57OQ43SENPhLt0YHwARMpiHsMmUyK12IUX9R2jJWVZV1L81KWkt7ZUFRe39+d5kMg== + dependencies: + "@stablelib/chacha20poly1305" "1.0.1" + "@stablelib/hkdf" "1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/sha256" "1.0.1" + "@stablelib/x25519" "^1.0.3" + "@walletconnect/jsonrpc-utils" "^1.0.4" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/safe-json" "^1.0.1" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.6.0" + "@walletconnect/window-getters" "^1.0.1" + "@walletconnect/window-metadata" "^1.0.1" + detect-browser "5.3.0" + query-string "7.1.1" + uint8arrays "^3.1.0" + "@walletconnect/utils@^1.8.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.8.0.tgz#2591a197c1fa7429941fe428876088fda6632060" @@ -7560,11 +8136,18 @@ js-sha3 "0.8.0" query-string "6.13.5" -"@walletconnect/window-getters@1.0.0", "@walletconnect/window-getters@^1.0.0": +"@walletconnect/window-getters@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.0.tgz#1053224f77e725dfd611c83931b5f6c98c32bfc8" integrity sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA== +"@walletconnect/window-getters@^1.0.0", "@walletconnect/window-getters@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.1.tgz#f36d1c72558a7f6b87ecc4451fc8bd44f63cbbdc" + integrity sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q== + dependencies: + tslib "1.14.1" + "@walletconnect/window-metadata@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz#93b1cc685e6b9b202f29c26be550fde97800c4e5" @@ -7572,49 +8155,101 @@ dependencies: "@walletconnect/window-getters" "^1.0.0" -"@web3-react/core@8.0.20-beta.0": - version "8.0.20-beta.0" - resolved "https://registry.yarnpkg.com/@web3-react/core/-/core-8.0.20-beta.0.tgz#a98e751955029c2deca22acd5fe300f527bae142" - integrity sha512-VMsCaoCC4c/cCOhCnQkHBo7VRMnLFokh8Gx+ju+WQz3b0c3V/qywcEUNrJoNhDryc863oNYjQti7cb5hhlJPVQ== +"@walletconnect/window-metadata@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz#2124f75447b7e989e4e4e1581d55d25bc75f7be5" + integrity sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA== dependencies: - "@web3-react/store" "^8.0.14-beta.0" - "@web3-react/types" "^8.0.10-beta.0" - zustand "^4.0.0-beta.2" - optionalDependencies: - "@ethersproject/providers" "^5.6.0" + "@walletconnect/window-getters" "^1.0.1" + tslib "1.14.1" -"@web3-react/metamask@8.0.16-beta.0": - version "8.0.16-beta.0" - resolved "https://registry.yarnpkg.com/@web3-react/metamask/-/metamask-8.0.16-beta.0.tgz#66ec1131a0d09774ebdb9e9a98aba8c70e39ae74" - integrity sha512-YuI2UY7ka+VJt8m7K3SmpXouyORZIIcNyAERc50ipZPeWro9j/a0qDavFZ0OnE8nhGrgBA+kJq+hMTvZrggCZQ== +"@web3-react/coinbase-wallet@8.1.2-beta.0": + version "8.1.2-beta.0" + resolved "https://registry.yarnpkg.com/@web3-react/coinbase-wallet/-/coinbase-wallet-8.1.2-beta.0.tgz#10ad62f2f473e3299157ef610858263b8d9e98df" + integrity sha512-WZTvgCCb4H5fFOL9RjWhnWXgp7LTsywzi1//W/N2MGi2hOOd78AYvvOcsrd/9TdiQu4xZrl4dnriD+E55w7f8A== + dependencies: + "@web3-react/types" "^8.1.2-beta.0" + +"@web3-react/core@^8.1.2-beta.0": + version "8.1.2-beta.0" + resolved "https://registry.yarnpkg.com/@web3-react/core/-/core-8.1.2-beta.0.tgz#8bc2abb42d06db07c3b577cf8da30d1450e0fb89" + integrity sha512-Iv1Xq5ioWECrzsLMWMkZBUkSMHhLL8PBDKR13C+1eBRLL3xwziIsiZj9U9CI9L3NbrC2ImX6k6Tmj/kVhMoUqQ== + dependencies: + "@web3-react/store" "^8.1.2-beta.0" + "@web3-react/types" "^8.1.2-beta.0" + zustand "^4.3.5" + optionalDependencies: + "@ethersproject/providers" "^5" + +"@web3-react/metamask@^8.1.2-beta.0": + version "8.1.2-beta.0" + resolved "https://registry.yarnpkg.com/@web3-react/metamask/-/metamask-8.1.2-beta.0.tgz#671f8b9601b275a4d7ca8cc694e6530c3c35ad4b" + integrity sha512-nw555Q86+I5EuLJnWILQIbhAaFdKNBugCNlsO00uJYSFPh26u+5KcNVl4G+7E2cCEY4cT0OhNOOGIYSZFuWADg== dependencies: "@metamask/detect-provider" "^1.2.0" - "@web3-react/types" "^8.0.10-beta.0" + "@web3-react/types" "^8.1.2-beta.0" -"@web3-react/store@^8.0.14-beta.0": - version "8.0.14-beta.0" - resolved "https://registry.yarnpkg.com/@web3-react/store/-/store-8.0.14-beta.0.tgz#302a5275f50323d63cd3a9f075414e5b63164f55" - integrity sha512-Z6ja+ilt7NWeL4wMcDLzD15255i0hcDySzvMwggqkEYs+hY3+w/R3dlR3FZDApr+MsxDq3wDukaQVUdKYA+Oqw== +"@web3-react/store@^8.1.2-beta.0": + version "8.1.2-beta.0" + resolved "https://registry.yarnpkg.com/@web3-react/store/-/store-8.1.2-beta.0.tgz#014a402a428a483ad7bde6247210294312864148" + integrity sha512-Xmogyl52zSYkPILwt+LjFIlTSlwrx25IrotrONglE37Pq263k/AAMii3AlblDuUF3CWSuxnq2YPuhZ4PODVaKA== dependencies: - "@ethersproject/address" "^5.6.0" - "@web3-react/types" "^8.0.10-beta.0" - zustand "^4.0.0-beta.2" + "@ethersproject/address" "^5" + "@web3-react/types" "^8.1.2-beta.0" + zustand "^4.3.5" -"@web3-react/types@^8.0.10-beta.0": - version "8.0.10-beta.0" - resolved "https://registry.yarnpkg.com/@web3-react/types/-/types-8.0.10-beta.0.tgz#8ed9f1b5e40dcbe2a08be5ce9dd9e3ef2b2a6908" - integrity sha512-HitBmoKHyLDeRrJgtkImPddb8nzsb/FroAdiaYA15gAwAE3Y/p7Nd/TN8IANlgKcMkuyGyUjPD27fE7Mvw9rEA== +"@web3-react/types@^8.1.2-beta.0": + version "8.1.2-beta.0" + resolved "https://registry.yarnpkg.com/@web3-react/types/-/types-8.1.2-beta.0.tgz#439e3a539688e91b677a3959d2e1bf56c33eaa96" + integrity sha512-gvVJqRvGsABpoUZA7RWQQiOq5qv5exkUW6ouSjlO4Q5BkfCBgT4NlIUVQ91w3JnS5qkDpk/uKDMt+wDFw0Yssw== dependencies: - zustand "^4.0.0-beta.2" + zustand "^4.3.5" -"@web3-react/walletconnect@^8.0.23-beta.0": - version "8.0.23-beta.0" - resolved "https://registry.yarnpkg.com/@web3-react/walletconnect/-/walletconnect-8.0.23-beta.0.tgz#ce6debb7383508d95ae828627d8a7f9286dbe8ed" - integrity sha512-MUq11Pmp9Y4Y+Cey5HrWNJM0gA76u02CzgsL4/iF1ph6t0cuqZj0C6guwwkTMF9apxUTlMpWgpywRQDbxdqDoA== +"@web3-react/walletconnect-v2@^8.1.3-beta.0": + version "8.1.3-beta.0" + resolved "https://registry.yarnpkg.com/@web3-react/walletconnect-v2/-/walletconnect-v2-8.1.3-beta.0.tgz#5036b232423d6dcfc758610172f1daa72567c63d" + integrity sha512-8pmhmtKNCb8/aQvbb6DuU67iUwIXBXiJw3d21WNAVrreq298bORr2YB3jdy3Dk/6RUEBhOfPA9mEGCvYB7IoxA== dependencies: - "@web3-react/types" "^8.0.10-beta.0" + "@walletconnect/ethereum-provider" "^2.5.1" + "@web3-react/types" "^8.1.2-beta.0" + "@web3modal/standalone" "^2.2.1" eventemitter3 "^4.0.7" +"@web3-react/walletconnect@8.1.3-beta.0": + version "8.1.3-beta.0" + resolved "https://registry.yarnpkg.com/@web3-react/walletconnect/-/walletconnect-8.1.3-beta.0.tgz#4c65ad88c33ccd2a25d0d17e95d1c4a3524375d2" + integrity sha512-2RtZ7h0XqMFXuOu1nwSABKEM5mZ/OTrjKDhaf5qMAlf3fhuxIJOFkG2aHc9d55mOQ/zI2Bd5R5w4oFb4sePocA== + dependencies: + "@walletconnect/ethereum-provider" "^1.7.8" + "@web3-react/types" "^8.1.2-beta.0" + eventemitter3 "^4.0.7" + +"@web3modal/core@2.2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@web3modal/core/-/core-2.2.2.tgz#1e282dc45bddb11c04f1c93abce570bac1b9a620" + integrity sha512-RKbYNIEVP5Hwiva68PWXExbkTFLUTasneyRpcjoQSM4BIh78qXp1YMt0nyTvFdHmHQEGxXEMCuRG5qoE97uMHA== + dependencies: + buffer "6.0.3" + valtio "1.10.3" + +"@web3modal/standalone@^2.2.1": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@web3modal/standalone/-/standalone-2.2.2.tgz#2d5ce74bbb7f112b31da32049620afa75c4a4686" + integrity sha512-c05kkTFNGZqnjJ3n2C8uo+wWL6ut1jexGYAyTvbweDengdsOr8LDo0VpK5V3XSKCV2fFcPh5JE9H1aA4jpnZPg== + dependencies: + "@web3modal/core" "2.2.2" + "@web3modal/ui" "2.2.2" + +"@web3modal/ui@2.2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@web3modal/ui/-/ui-2.2.2.tgz#f1c1ac908230d4214c35891a5d922c118353eaf2" + integrity sha512-PAuMOuk4sZ4UGjucGMZKzu6Qu56XtFsgLaqOn8ZgP2RkZmYEBGSG9mUQVzJd3XzfzAy1T91Wmqp/3TI3m0pXuQ== + dependencies: + "@web3modal/core" "2.2.2" + lit "2.6.1" + motion "10.15.5" + qrcode "1.5.1" + "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" @@ -7964,7 +8599,7 @@ tslib "^2" upath2 "^3.1.13" -JSONStream@^1.0.4: +JSONStream@^1.0.4, JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== @@ -8078,6 +8713,15 @@ agent-base@6: dependencies: debug "4" +agentkeepalive@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" + integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== + dependencies: + debug "^4.1.0" + depd "^2.0.0" + humanize-ms "^1.2.1" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -8176,6 +8820,11 @@ ansi-align@^3.0.0: dependencies: string-width "^4.1.0" +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + ansi-colors@^3.0.0: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" @@ -8776,6 +9425,11 @@ assert@^1.1.1: object-assign "^4.1.1" util "0.10.3" +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -8810,6 +9464,13 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== +async-mutex@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.2.6.tgz#0d7a3deb978bc2b984d5908a2038e1ae2e54ff40" + integrity sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw== + dependencies: + tslib "^2.0.0" + async@^2.6.4: version "2.6.4" resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" @@ -8837,6 +9498,11 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + auto-bind@~4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" @@ -8879,6 +9545,11 @@ autoprefixer@^9.8.6: postcss "^7.0.32" 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-to-js@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/await-to-js/-/await-to-js-3.0.0.tgz#70929994185616f4675a91af6167eb61cc92868f" @@ -9173,6 +9844,13 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base-x@^3.0.2: + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + base64-js@^1.0.2, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -9237,6 +9915,13 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +bigint-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" + integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== + dependencies: + bindings "^1.3.0" + bignumber.js@^9.0.2: version "9.1.0" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62" @@ -9252,7 +9937,12 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bindings@^1.5.0: +bind-decorator@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/bind-decorator/-/bind-decorator-1.0.11.tgz#e41bc06a1f65dd9cec476c91c5daf3978488252f" + integrity sha512-yzkH0uog6Vv/vQ9+rhSKxecnqGUZHYncg7qS7voz3Q76+TAi1SGiOKk2mlOvusQnFz9Dc4BC/NMkeXu11YgjJg== + +bindings@^1.3.0, bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== @@ -9293,7 +9983,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.2.1: +bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.2.0, 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== @@ -9336,6 +10026,15 @@ boolean@^3.0.1: resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== +borsh@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" + integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== + dependencies: + bn.js "^5.2.0" + bs58 "^4.0.0" + text-encoding-utf-8 "^1.0.2" + boxen@^5.0.0, boxen@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" @@ -9410,6 +10109,11 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" @@ -9488,6 +10192,13 @@ bs-logger@0.x: dependencies: fast-json-stable-stringify "2.x" +bs58@^4.0.0, bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -9533,6 +10244,14 @@ buffer-xor@^1.0.3: resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== +buffer@6.0.3, buffer@^6.0.3, 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" + buffer@^4.3.0: version "4.9.2" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" @@ -9550,6 +10269,13 @@ buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" +bufferutil@^4.0.1: + version "4.0.7" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" + integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== + dependencies: + node-gyp-build "^4.3.0" + builtin-modules@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" @@ -9736,7 +10462,7 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.2.0: +camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -9800,6 +10526,19 @@ ccount@^1.0.0: resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== +chai@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" + integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^4.1.2" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" + chalk@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" @@ -9913,12 +10652,17 @@ charenc@0.0.2: resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== + check-more-types@^2.24.0: version "2.24.0" resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.1, chokidar@^3.4.2, chokidar@^3.5.1, chokidar@^3.5.2, chokidar@^3.5.3: +chokidar@3.5.3, "chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.1, chokidar@^3.4.2, chokidar@^3.5.1, chokidar@^3.5.2, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -10214,6 +10958,11 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== +clsx@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -10312,7 +11061,7 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== -commander@^2.19.0, commander@^2.20.0: +commander@^2.19.0, commander@^2.20.0, commander@^2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -11008,15 +11757,25 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A== -cypress-real-events@^1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/cypress-real-events/-/cypress-real-events-1.7.1.tgz#8f430d67c29ea4f05b9c5b0311780120cbc9b935" - integrity sha512-/Bg15RgJ0SYsuXc6lPqH08x19z6j2vmhWN4wXfJqm3z8BTAFiK2MvipZPzxT8Z0jJP0q7kuniWrLIvz/i/8lCQ== +cypress-mochawesome-reporter@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/cypress-mochawesome-reporter/-/cypress-mochawesome-reporter-3.3.0.tgz#cfcd07bd15b4773917f2b2a240178c7cdb310a51" + integrity sha512-X4HU1JpuB62MXLh46660KmIs/L6noWV2KpxaXPDorz1zwgj26NN+BPCLP80D9cCFUwX3hNH0pKFZDwVR7vM8wg== + dependencies: + fs-extra "^10.0.1" + mochawesome "^7.1.3" + mochawesome-merge "^4.2.1" + mochawesome-report-generator "^6.2.0" -cypress@^11.2.0: - version "11.2.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-11.2.0.tgz#63edef8c387b687066c5493f6f0ad7b9ced4b2b7" - integrity sha512-u61UGwtu7lpsNWLUma/FKNOsrjcI6wleNmda/TyKHe0dOBcVjbCPlp1N6uwFZ0doXev7f/91YDpU9bqDCFeBLA== +cypress-real-events@^1.7.6: + version "1.7.6" + resolved "https://registry.yarnpkg.com/cypress-real-events/-/cypress-real-events-1.7.6.tgz#6f17e0b2ceea1d6dc60f6737d8f84cc517bbbb4c" + integrity sha512-yP6GnRrbm6HK5q4DH6Nnupz37nOfZu/xn1xFYqsE2o4G73giPWQOdu6375QYpwfU1cvHNCgyD2bQ2hPH9D7NMw== + +cypress@^12.9.0: + version "12.9.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.9.0.tgz#e6ab43cf329fd7c821ef7645517649d72ccf0a12" + integrity sha512-Ofe09LbHKgSqX89Iy1xen2WvpgbvNxDzsWx3mgU1mfILouELeXYGwIib3ItCwoRrRifoQwcBFmY54Vs0zw7QCg== dependencies: "@cypress/request" "^2.88.10" "@cypress/xvfb" "^1.2.4" @@ -11035,7 +11794,7 @@ cypress@^11.2.0: commander "^5.1.0" common-tags "^1.8.0" dayjs "^1.10.4" - debug "^4.3.2" + debug "^4.3.4" enquirer "^2.3.6" eventemitter2 "6.4.7" execa "4.1.0" @@ -11291,6 +12050,11 @@ date-fns@^2.17.0, date-fns@^2.28.0: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== +dateformat@^4.5.1: + version "4.6.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" + integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== + dayjs@^1.10.4: version "1.11.5" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.5.tgz#00e8cc627f231f9499c19b38af49f56dc0ac5e93" @@ -11315,7 +12079,7 @@ debug@3.2.7, debug@^3.0.0, debug@^3.1.0, debug@^3.2.7: dependencies: ms "^2.1.1" -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -11342,6 +12106,11 @@ decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + decimal.js-light@^2.4.1: version "2.5.1" resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" @@ -11376,6 +12145,13 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +deep-eql@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== + dependencies: + type-detect "^4.0.0" + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -11466,6 +12242,11 @@ delaunator@5: dependencies: robust-predicates "^3.0.0" +delay@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -11476,7 +12257,7 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -depd@2.0.0: +depd@2.0.0, depd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -11521,6 +12302,11 @@ detect-browser@5.2.0: resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.2.0.tgz#c9cd5afa96a6a19fda0bbe9e9be48a6b6e1e9c97" integrity sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA== +detect-browser@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.3.0.tgz#9705ef2bddf46072d0f7265a1fe300e36fe7ceca" + integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== + detect-indent@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" @@ -11585,6 +12371,11 @@ diff-sequences@^29.0.0: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.0.0.tgz#bae49972ef3933556bcb0800b72e8579d19d9e4f" integrity sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA== +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -11796,6 +12587,16 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +duplexify@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" + integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== + dependencies: + end-of-stream "^1.4.1" + inherits "^2.0.3" + readable-stream "^3.1.1" + stream-shift "^1.0.0" + duration-js@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/duration-js/-/duration-js-4.0.0.tgz#ab91575a4f1a6b096034685cfc6ea9aca99cd63f" @@ -11900,6 +12701,11 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== +encode-utf8@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" + integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -12065,6 +12871,18 @@ es6-error@^4.1.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== + dependencies: + es6-promise "^4.0.3" + es6-shim@^0.35.5: version "0.35.6" resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.6.tgz#d10578301a83af2de58b9eadb7c2c9945f7388a0" @@ -12080,7 +12898,7 @@ escape-goat@^2.0.0: resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== -escape-html@~1.0.3: +escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== @@ -12483,6 +13301,51 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== +eth-block-tracker@4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz#766a0a0eb4a52c867a28328e9ae21353812cf626" + integrity sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw== + dependencies: + "@babel/plugin-transform-runtime" "^7.5.5" + "@babel/runtime" "^7.5.5" + eth-query "^2.1.0" + json-rpc-random-id "^1.0.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + +eth-json-rpc-filters@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-5.1.0.tgz#f0c2aeaec2a45e2dc6ca1b9843d8e85447821427" + integrity sha512-fos+9xmoa1A2Ytsc9eYof17r81BjdJOUcGcgZn4K/tKdCCTb+a8ytEtwlu1op5qsXFDlgGmstTELFrDEc89qEQ== + dependencies: + "@metamask/safe-event-emitter" "^2.0.0" + async-mutex "^0.2.6" + eth-query "^2.1.2" + json-rpc-engine "^6.1.0" + pify "^5.0.0" + +eth-query@^2.1.0, eth-query@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e" + integrity sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA== + dependencies: + json-rpc-random-id "^1.0.0" + xtend "^4.0.1" + +eth-rpc-errors@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.2.tgz#11bc164e25237a679061ac05b7da7537b673d3b7" + integrity sha512-n+Re6Gu8XGyfFy1it0AwbD1x0MUzspQs0D5UiPs1fFPCr6WAwZM+vbIhXheBFrpgosqN9bs5PqlB4Q61U/QytQ== + dependencies: + fast-safe-stringify "^2.0.6" + +eth-rpc-errors@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz#6ddb6190a4bf360afda82790bb7d9d5e724f423a" + integrity sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg== + dependencies: + fast-safe-stringify "^2.0.6" + ethers@^5.6.0, ethers@^5.7.0: version "5.7.1" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.1.tgz#48c83a44900b5f006eb2f65d3ba6277047fd4f33" @@ -12544,7 +13407,7 @@ eventemitter3@^5.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.0.tgz#084eb7f5b5388df1451e63f4c2aafd71b217ccb3" integrity sha512-riuVbElZZNXLeLEoprfNYoDSwTBRR44X3mnhdI1YcnENpWTCsTTVZ2zFuqQcpoyqPQIUXdiPEU0ECAq0KQRaHg== -events@^3.0.0, events@^3.2.0: +events@^3.0.0, events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -12767,6 +13630,11 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== +eyes@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== + faker@^5.5.3: version "5.5.3" resolved "https://registry.yarnpkg.com/faker/-/faker-5.5.3.tgz#c57974ee484431b25205c2c8dc09fda861e51e0e" @@ -12838,6 +13706,21 @@ fast-levenshtein@^3.0.0: dependencies: fastest-levenshtein "^1.0.7" +fast-redact@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.1.2.tgz#d58e69e9084ce9fa4c1a6fa98a3e1ecf5d7839aa" + integrity sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw== + +fast-safe-stringify@^2.0.6: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fast-stable-stringify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" + integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== + fastest-levenshtein@^1.0.7: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" @@ -13043,6 +13926,14 @@ find-test-names@^1.19.0: globby "^11.0.4" simple-bin-help "^1.7.7" +find-up@5.0.0, find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -13066,14 +13957,6 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -13261,7 +14144,7 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@^10.0.0, fs-extra@^10.1.0: +fs-extra@^10.0.0, fs-extra@^10.0.1, fs-extra@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== @@ -13270,6 +14153,15 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^8.1, fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -13329,6 +14221,11 @@ fsevents@^2.1.2, fsevents@^2.3.2, fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +fsu@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fsu/-/fsu-1.1.1.tgz#bd36d3579907c59d85b257a75b836aa9e0c31834" + integrity sha512-xQVsnjJ/5pQtcKh+KjUoZGzVWn4uNkchxTF6Lwjr4Gf7nQr8fmUfhKJ62zE77+xQg9xnxi5KUps7XGs+VC986A== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -13421,6 +14318,11 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== + get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" @@ -13602,6 +14504,18 @@ glob@7.1.7, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.1.tgz#00308f5c035aa0b2a447cd37ead267ddff1577d3" @@ -13751,6 +14665,13 @@ globule@^1.0.0: lodash "^4.17.21" minimatch "~3.0.2" +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + got@^9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -14037,7 +14958,7 @@ hastscript@^6.0.0: property-information "^5.0.0" space-separated-tokens "^1.0.0" -he@^1.2.0: +he@1.2.0, he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -14050,6 +14971,11 @@ header-case@^2.0.4: capital-case "^1.0.4" tslib "^2.0.3" +hey-listen@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68" + integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== + highlight.js@^10.4.1, highlight.js@~10.7.0: version "10.7.3" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" @@ -14333,6 +15259,13 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + husky@^7.0.4: version "7.0.4" resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" @@ -14395,7 +15328,7 @@ identity-obj-proxy@3.0.0: dependencies: 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" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -14520,7 +15453,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -14662,7 +15595,7 @@ is-alphanumerical@^1.0.0: is-alphabetical "^1.0.0" is-decimal "^1.0.0" -is-arguments@^1.1.0: +is-arguments@^1.0.4, is-arguments@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -14865,6 +15798,13 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" 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.3, is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -14970,7 +15910,7 @@ is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== -is-plain-obj@^2.0.0: +is-plain-obj@^2.0.0, is-plain-obj@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== @@ -15094,6 +16034,17 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" +is-typed-array@^1.1.10, is-typed-array@^1.1.3: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typedarray@1.0.0, is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -15220,6 +16171,11 @@ isomorphic-unfetch@^3.1.0: node-fetch "^2.6.1" unfetch "^4.2.0" +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + isomorphic-ws@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" @@ -15300,6 +16256,25 @@ java-properties@^1.0.0: resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211" integrity sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ== +jayson@^3.4.4: + version "3.7.0" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.7.0.tgz#b735b12d06d348639ae8230d7a1e2916cb078f25" + integrity sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ== + dependencies: + "@types/connect" "^3.4.33" + "@types/node" "^12.12.54" + "@types/ws" "^7.4.4" + JSONStream "^1.3.5" + commander "^2.20.3" + delay "^5.0.0" + es6-promisify "^5.0.0" + eyes "^0.1.8" + isomorphic-ws "^4.0.1" + json-stringify-safe "^5.0.1" + lodash "^4.17.20" + uuid "^8.3.2" + ws "^7.4.5" + jest-canvas-mock@^2.3.1: version "2.4.0" resolved "https://registry.yarnpkg.com/jest-canvas-mock/-/jest-canvas-mock-2.4.0.tgz#947b71442d7719f8e055decaecdb334809465341" @@ -15936,6 +16911,19 @@ json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-rpc-engine@6.1.0, json-rpc-engine@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz#bf5ff7d029e1c1bf20cb6c0e9f348dcd8be5a393" + integrity sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ== + dependencies: + "@metamask/safe-event-emitter" "^2.0.0" + eth-rpc-errors "^4.0.2" + +json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" + integrity sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -16080,6 +17068,15 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" +keccak@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" + integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -16330,6 +17327,31 @@ listr@0.14.3: p-map "^2.0.0" rxjs "^6.3.3" +lit-element@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-3.3.1.tgz#9dcb950b1fadf156dacf3ded8d7d51a8cf16a966" + integrity sha512-Gl+2409uXWbf7n6cCl7Kzasm7zjT9xmdwi2BhLNi70sRKAgRkqueDu5mSIH3hPYMM0/vqBCdPXod3NbGkRA2ww== + dependencies: + "@lit-labs/ssr-dom-shim" "^1.1.0" + "@lit/reactive-element" "^1.3.0" + lit-html "^2.7.0" + +lit-html@^2.6.0, lit-html@^2.7.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-2.7.1.tgz#eeea32f9639b0c1bda43ea83dc886431f3744c51" + integrity sha512-san46v7VXK6+2RXS4yveQYFUf9CoO/1bcNb0NibxLoTqlP48vs+l28tRPFDYcXGKWm0XoqcDuCC6mxIs8Jj3Zw== + dependencies: + "@types/trusted-types" "^2.0.2" + +lit@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/lit/-/lit-2.6.1.tgz#5951a2098b9bde5b328c73b55c15fdc0eefd96d7" + integrity sha512-DT87LD64f8acR7uVp7kZfhLRrHkfC/N4BVzAtnw9Yg8087mbBJ//qedwdwX0kzDbxgPccWRW6mFwGbRQIxy0pw== + dependencies: + "@lit/reactive-element" "^1.6.0" + lit-element "^3.2.0" + lit-html "^2.6.0" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -16467,11 +17489,21 @@ lodash.isboolean@^3.0.3: resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== -lodash.isequal@^4.5.0: +lodash.isempty@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" + integrity sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg== + +lodash.isequal@4.5.0, lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== +lodash.isfunction@^3.0.9: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" + integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== + lodash.isinteger@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" @@ -16482,6 +17514,11 @@ lodash.isnumber@^3.0.3: resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== +lodash.isobject@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" + integrity sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA== + lodash.isplainobject@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" @@ -16537,14 +17574,7 @@ lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" - integrity sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ== - dependencies: - chalk "^1.0.0" - -log-symbols@^4.0.0, log-symbols@^4.1.0: +log-symbols@4.1.0, log-symbols@^4.0.0, log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -16552,6 +17582,13 @@ log-symbols@^4.0.0, log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + integrity sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ== + dependencies: + chalk "^1.0.0" + log-update@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" @@ -16586,6 +17623,13 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" +loupe@^2.3.1: + version "2.3.6" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" + integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== + dependencies: + get-func-name "^2.0.0" + lower-case-first@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-2.0.2.tgz#64c2324a2250bf7c37c5901e76a5b5309301160b" @@ -17279,6 +18323,13 @@ minimatch@4.2.1: dependencies: brace-expansion "^1.1.7" +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -17386,6 +18437,76 @@ mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@^0.5.6, mkdirp@~0.5.1: dependencies: minimist "^1.2.6" +mocha@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== + dependencies: + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +mochawesome-merge@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mochawesome-merge/-/mochawesome-merge-4.3.0.tgz#7cc5d5730c7d8d1b034c8d8fecf3cd36e0010297" + integrity sha512-1roR6g+VUlfdaRmL8dCiVpKiaUhbPVm1ZQYUM6zHX46mWk+tpsKVZR6ba98k2zc8nlPvYd71yn5gyH970pKBSw== + dependencies: + fs-extra "^7.0.1" + glob "^7.1.6" + yargs "^15.3.1" + +mochawesome-report-generator@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/mochawesome-report-generator/-/mochawesome-report-generator-6.2.0.tgz#65a30a11235ba7a68e1cf0ca1df80d764b93ae78" + integrity sha512-Ghw8JhQFizF0Vjbtp9B0i//+BOkV5OWcQCPpbO0NGOoxV33o+gKDYU0Pr2pGxkIHnqZ+g5mYiXF7GMNgAcDpSg== + dependencies: + chalk "^4.1.2" + dateformat "^4.5.1" + escape-html "^1.0.3" + fs-extra "^10.0.0" + fsu "^1.1.1" + lodash.isfunction "^3.0.9" + opener "^1.5.2" + prop-types "^15.7.2" + tcomb "^3.2.17" + tcomb-validation "^3.3.0" + validator "^13.6.0" + yargs "^17.2.1" + +mochawesome@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/mochawesome/-/mochawesome-7.1.3.tgz#07b358138f37f5b07b51a1b255d84babfa36fa83" + integrity sha512-Vkb3jR5GZ1cXohMQQ73H3cZz7RoxGjjUo0G5hu0jLaW+0FdUxUwg3Cj29bqQdh0rFcnyV06pWmqmi5eBPnEuNQ== + dependencies: + chalk "^4.1.2" + diff "^5.0.0" + json-stringify-safe "^5.0.1" + lodash.isempty "^4.4.0" + lodash.isfunction "^3.0.9" + lodash.isobject "^3.0.2" + lodash.isstring "^4.0.1" + mochawesome-report-generator "^6.2.0" + strip-ansi "^6.0.1" + uuid "^8.3.2" + mock-apollo-client@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/mock-apollo-client/-/mock-apollo-client-1.2.1.tgz#e3bfdc3ff73b1fea28fa7e91ec82e43ba8cbfa39" @@ -17408,6 +18529,18 @@ moo-color@^1.0.2: dependencies: color-name "^1.1.4" +motion@10.15.5: + version "10.15.5" + resolved "https://registry.yarnpkg.com/motion/-/motion-10.15.5.tgz#d336ddbdd37bc28bb99fbb243fe309df6c685ad6" + integrity sha512-ejP6KioN4pigTGxL93APzOnvtLklParL59UQB2T3HWXQBxFcIp5/7YXFmkgiA6pNKKzjvnLhnonRBN5iSFMnNw== + dependencies: + "@motionone/animation" "^10.15.1" + "@motionone/dom" "^10.15.5" + "@motionone/svelte" "^10.15.5" + "@motionone/types" "^10.15.1" + "@motionone/utils" "^10.15.1" + "@motionone/vue" "^10.15.5" + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -17440,7 +18573,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1: +ms@2.1.3, ms@^2.0.0, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -17453,6 +18586,11 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" +multiformats@^9.4.2: + version "9.9.0" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" + integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== + mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -17463,6 +18601,11 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== + nanoid@3.3.4, nanoid@^3.3.1, nanoid@^3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" @@ -17559,6 +18702,11 @@ node-abort-controller@^3.0.1: resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.0.1.tgz#f91fa50b1dee3f909afabb7e261b1e1d6b0cb74e" integrity sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw== +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + node-addon-api@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" @@ -17588,6 +18736,11 @@ node-forge@^1: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== +node-gyp-build@^4.2.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" + integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== + node-gyp-build@^4.3.0: version "4.5.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" @@ -17916,6 +19069,11 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== +on-exit-leak-free@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz#b39c9e3bf7690d890f4861558b0d7b90a442d209" + integrity sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg== + on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -17975,7 +19133,7 @@ open@^8.0.9, open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" -opener@^1.5.1: +opener@^1.5.1, opener@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== @@ -18449,6 +19607,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + pbkdf2@^3.0.3: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" @@ -18570,6 +19733,36 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== +pino-abstract-transport@v0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz#4b54348d8f73713bfd14e3dc44228739aa13d9c0" + integrity sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ== + dependencies: + duplexify "^4.1.2" + split2 "^4.0.0" + +pino-std-serializers@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz#1791ccd2539c091ae49ce9993205e2cd5dbba1e2" + integrity sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q== + +pino@7.11.0: + version "7.11.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-7.11.0.tgz#0f0ea5c4683dc91388081d44bff10c83125066f6" + integrity sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.0.0" + on-exit-leak-free "^0.2.0" + pino-abstract-transport v0.5.0 + pino-std-serializers "^4.0.0" + process-warning "^1.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.1.0" + safe-stable-stringify "^2.1.0" + sonic-boom "^2.2.1" + thread-stream "^0.15.1" + pirates@^4.0.1, pirates@^4.0.4, pirates@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" @@ -18606,6 +19799,11 @@ pngjs@^3.3.0: resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== +pngjs@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" + integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== + pnp-webpack-plugin@1.6.4: version "1.6.4" resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" @@ -19031,6 +20229,11 @@ preact@10.4.1: resolved "https://registry.yarnpkg.com/preact/-/preact-10.4.1.tgz#9b3ba020547673a231c6cf16f0fbaef0e8863431" integrity sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q== +preact@^10.5.9: + version "10.13.2" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.13.2.tgz#2c40c73d57248b57234c4ae6cd9ab9d8186ebc0a" + integrity sha512-q44QFLhOhty2Bd0Y46fnYW0gD/cbVM9dUVtNTDKPcdXSMA7jfY+Jpd6rk3GB0lcQss0z5s/6CmVP0Z/hV+g6pw== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -19125,6 +20328,11 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +process-warning@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" + integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== + process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -19220,6 +20428,11 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-compare@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/proxy-compare/-/proxy-compare-2.5.0.tgz#0387c5e4d283ba9b1c0353bb20def4449b06bbd2" + integrity sha512-f1us0OsVAJ3tdIMXGQx2lmseYS4YXe4W+sKF5g5ww/jV+5ogMadPt+sIZ+88Ga9kvMJsrRNWzCrKPpr6pMWYbA== + proxy-from-env@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" @@ -19329,6 +20542,16 @@ qrcode@1.4.4: pngjs "^3.3.0" yargs "^13.2.4" +qrcode@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.1.tgz#0103f97317409f7bc91772ef30793a54cd59f0cb" + integrity sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg== + dependencies: + dijkstrajs "^1.0.1" + encode-utf8 "^1.0.3" + pngjs "^5.0.0" + yargs "^15.3.1" + qs@6.11.0, qs@^6.10.0, qs@^6.4.0, qs@^6.9.4: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" @@ -19336,6 +20559,13 @@ qs@6.11.0, qs@^6.10.0, qs@^6.4.0, qs@^6.9.4: dependencies: side-channel "^1.0.4" +qs@^6.10.3: + version "6.11.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.1.tgz#6c29dff97f0c0060765911ba65cbc9764186109f" + integrity sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ== + dependencies: + side-channel "^1.0.4" + qs@~6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" @@ -19350,6 +20580,16 @@ query-string@6.13.5: split-on-first "^1.0.0" strict-uri-encode "^2.0.0" +query-string@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.1.tgz#754620669db978625a90f635f12617c271a088e1" + integrity sha512-MplouLRDHBZSG9z7fpuAAcI7aAYjDLhtsiVZsevsfaHWDS2IDdORKbSd1kWUA+V4zyva/HZoSfpwnYMMQDhb0w== + dependencies: + decode-uri-component "^0.2.0" + filter-obj "^1.1.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + query-string@^6.13.8: version "6.14.1" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" @@ -19385,6 +20625,11 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + quick-lru@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" @@ -19773,6 +21018,15 @@ readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stre string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^3.5.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -19789,6 +21043,11 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +real-require@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.1.0.tgz#736ac214caa20632847b7ca8c1056a0767df9381" + integrity sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg== + recast@^0.21.0, recast@^0.21.1: version "0.21.5" resolved "https://registry.yarnpkg.com/recast/-/recast-0.21.5.tgz#e8cd22bb51bcd6130e54f87955d33a2b2e57b495" @@ -20373,6 +21632,19 @@ rollup@^2.56.2: optionalDependencies: fsevents "~2.3.2" +rpc-websockets@^7.5.1: + version "7.5.1" + resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.5.1.tgz#e0a05d525a97e7efc31a0617f093a13a2e10c401" + integrity sha512-kGFkeTsmd37pHPMaHIgN1LVKXMi0JD782v4Ds9ZKtLlwdTKjn+CxM9A9/gLT2LaOuEcEFGL98h1QWQtlOIdW0w== + dependencies: + "@babel/runtime" "^7.17.2" + eventemitter3 "^4.0.7" + uuid "^8.3.2" + ws "^8.5.0" + optionalDependencies: + bufferutil "^4.0.1" + utf-8-validate "^5.0.2" + rsvp@^4.8.4: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" @@ -20397,7 +21669,7 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.3.3, rxjs@^6.5.4: +rxjs@^6.3.3, rxjs@^6.5.4, rxjs@^6.6.3: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== @@ -20433,6 +21705,13 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-event-emitter@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af" + integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg== + dependencies: + events "^3.0.0" + safe-identifier@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/safe-identifier/-/safe-identifier-0.4.2.tgz#cf6bfca31c2897c588092d1750d30ef501d59fcb" @@ -20466,6 +21745,11 @@ safe-regex@^2.1.1: dependencies: regexp-tree "~0.1.1" +safe-stable-stringify@^2.1.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -20691,6 +21975,13 @@ serialize-error@^7.0.1: dependencies: type-fest "^0.13.1" +serialize-javascript@6.0.0, serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -20705,13 +21996,6 @@ serialize-javascript@^5.0.1: dependencies: randombytes "^2.1.0" -serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - serve-favicon@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.5.0.tgz#935d240cdfe0f5805307fdfe967d88942a2cbcf0" @@ -20960,6 +22244,13 @@ sockjs@^0.3.24: uuid "^8.3.2" websocket-driver "^0.7.4" +sonic-boom@^2.2.1: + version "2.8.0" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.8.0.tgz#c1def62a77425090e6ad7516aad8eb402e047611" + integrity sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg== + dependencies: + atomic-sleep "^1.0.0" + source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" @@ -21122,6 +22413,11 @@ split2@^3.0.0: dependencies: readable-stream "^3.0.0" +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + sponge-case@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/sponge-case/-/sponge-case-1.0.1.tgz#260833b86453883d974f84854cdb63aecc5aef4c" @@ -21242,6 +22538,14 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" +stream-browserify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + stream-each@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" @@ -21483,7 +22787,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -21569,6 +22873,18 @@ stylus@^0.55.0: semver "^6.3.0" source-map "^0.7.3" +superstruct@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" + integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== + +supports-color@8.1.1, supports-color@^8.0.0, supports-color@^8.1.0, supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -21588,13 +22904,6 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0, supports-color@^8.1.0, supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-color@^9.2.2: version "9.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.2.3.tgz#a6e2c97fc20c80abecd69e50aebe4783ff77d45a" @@ -21760,6 +23069,18 @@ tar@6.1.11, tar@^6.0.2: mkdirp "^1.0.3" yallist "^4.0.0" +tcomb-validation@^3.3.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/tcomb-validation/-/tcomb-validation-3.4.1.tgz#a7696ec176ce56a081d9e019f8b732a5a8894b65" + integrity sha512-urVVMQOma4RXwiVCa2nM2eqrAomHROHvWPuj6UkDGz/eb5kcy0x6P0dVt6kzpUZtYMNoAqJLWmz1BPtxrtjtrA== + dependencies: + tcomb "^3.0.0" + +tcomb@^3.0.0, tcomb@^3.2.17: + version "3.2.29" + resolved "https://registry.yarnpkg.com/tcomb/-/tcomb-3.2.29.tgz#32404fe9456d90c2cf4798682d37439f1ccc386c" + integrity sha512-di2Hd1DB2Zfw6StGv861JoAF5h/uQVu/QJp2g8KVbtfKnoHdBQl5M32YWq6mnSYBQ1vFFrns5B1haWJL7rKaOQ== + telejson@^6.0.8: version "6.0.8" resolved "https://registry.yarnpkg.com/telejson/-/telejson-6.0.8.tgz#1c432db7e7a9212c1fbd941c3e5174ec385148f7" @@ -21851,6 +23172,11 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +text-encoding-utf-8@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" + integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== + text-extensions@^1.0.0: version "1.9.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" @@ -21861,6 +23187,13 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +thread-stream@^0.15.1: + version "0.15.2" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-0.15.2.tgz#fb95ad87d2f1e28f07116eb23d85aba3bc0425f4" + integrity sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA== + dependencies: + real-require "^0.1.0" + throat@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" @@ -22121,7 +23454,7 @@ ts-log@^2.2.3: resolved "https://registry.yarnpkg.com/ts-log/-/ts-log-2.2.5.tgz#aef3252f1143d11047e2cb6f7cfaac7408d96623" integrity sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA== -ts-node@10.9.1, ts-node@^10.8.1: +ts-node@10.9.1, ts-node@^10.8.1, ts-node@^10.9.1: version "10.9.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== @@ -22176,16 +23509,16 @@ tsconfig-paths@^3.11.0, tsconfig-paths@^3.14.1, tsconfig-paths@^3.9.0: minimist "^1.2.6" strip-bom "^3.0.0" +tslib@1.14.1, tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + tslib@2.4.0, tslib@^2, tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@~2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - tslib@~2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" @@ -22234,7 +23567,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8: +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== @@ -22304,16 +23637,16 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@4.7.4: - version "4.7.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" - integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== - typescript@^4.4.3: version "4.8.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== +typescript@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" + integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== + ua-parser-js@^0.7.30: version "0.7.31" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" @@ -22324,6 +23657,13 @@ uglify-js@^3.1.4: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== +uint8arrays@^3.0.0, uint8arrays@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.1.tgz#2d8762acce159ccd9936057572dade9459f65ae0" + integrity sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg== + dependencies: + multiformats "^9.4.2" + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -22748,6 +24088,13 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +utf-8-validate@^5.0.2: + version "5.0.10" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== + dependencies: + node-gyp-build "^4.3.0" + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -22796,6 +24143,17 @@ util@^0.11.0: dependencies: inherits "2.0.3" +util@^0.12.4: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" @@ -22867,6 +24225,19 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +validator@^13.6.0: + version "13.9.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.9.0.tgz#33e7b85b604f3bbce9bb1a05d5c3e22e1c2ff855" + integrity sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA== + +valtio@1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/valtio/-/valtio-1.10.3.tgz#273eda9ba6459869798b4f58c84514e18fb80ed8" + integrity sha512-t3Ez/+baJ+Z5tIyeaI6nCAbW/hrmcq2jditwg/X++o5IvCdiGirQKTOv1kJq0glgUo13v5oABCVGcinggBfiKw== + dependencies: + proxy-compare "2.5.0" + use-sync-external-store "1.2.0" + value-or-promise@1.0.11, value-or-promise@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.11.tgz#3e90299af31dd014fe843fe309cefa7c1d94b140" @@ -23359,6 +24730,18 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== +which-typed-array@^1.1.2: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -23416,6 +24799,11 @@ worker-rpc@^0.1.0: dependencies: microevent.ts "~0.1.1" +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== + wrap-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" @@ -23476,7 +24864,7 @@ ws@7.5.3: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== -ws@^7.4.0, ws@^7.4.6: +ws@^7.4.0, ws@^7.4.5, ws@^7.4.6, ws@^7.5.1: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== @@ -23486,6 +24874,11 @@ ws@^8.2.3, ws@^8.3.0, ws@^8.4.2: resolved "https://registry.yarnpkg.com/ws/-/ws-8.9.0.tgz#2a994bb67144be1b53fe2d23c53c028adeb7f45e" integrity sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg== +ws@^8.5.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + x-default-browser@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/x-default-browser/-/x-default-browser-0.4.0.tgz#70cf0da85da7c0ab5cb0f15a897f2322a6bdd481" @@ -23543,6 +24936,11 @@ yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.3, yargs-parser@^20.2.9: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" @@ -23574,6 +24972,29 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0, yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@17.2.1: version "17.2.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.2.1.tgz#e2c95b9796a0e1f7f3bf4427863b42e0418191ea" @@ -23620,19 +25041,6 @@ yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - yargs@^17.0.0, yargs@^17.2.1, yargs@^17.4.0: version "17.6.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.0.tgz#e134900fc1f218bc230192bdec06a0a5f973e46c" @@ -23694,13 +25102,6 @@ zod@^3.20.3: resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== -zustand@^4.0.0-beta.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.1.2.tgz#4912b24741662d8a84ed1cb52198471cb369c4b6" - integrity sha512-gcRaKchcxFPbImrBb/BKgujOhHhik9YhVpIeP87ETT7uokEe2Szu7KkuZ9ghjtD+/KKkcrRNktR2AiLXPIbKIQ== - dependencies: - use-sync-external-store "1.2.0" - zustand@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.3.2.tgz#bb121fcad84c5a569e94bd1a2695e1a93ba85d39" @@ -23708,6 +25109,13 @@ zustand@^4.3.2: dependencies: use-sync-external-store "1.2.0" +zustand@^4.3.5: + version "4.3.7" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.3.7.tgz#501b1f0393a7f1d103332e45ab574be5747fedce" + integrity sha512-dY8ERwB9Nd21ellgkBZFhudER8KVlelZm8388B5nDAXhO/+FZDhYMuRnqDgu5SYyRgz/iaf8RKnbUs/cHfOGlQ== + dependencies: + use-sync-external-store "1.2.0" + zwitch@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920"