;
}
-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}
+
+
+
+
+
+
+ {t('View')}
+
+
+
+
+
+
+
+ );
+};
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}
- connector.deactivate()}>Disconnect
+ disconnect()}>Disconnect
{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}
-
connector.deactivate()}>Disconnect
+
disconnect()}>Disconnect
);
@@ -84,7 +91,7 @@ export const Web3Content = ({
This app only works on {getChainName(appChainId)}
- connector.deactivate()}>Disconnect
+ disconnect()}>Disconnect
);
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 && (
{
it.each([
@@ -49,3 +55,35 @@ describe('titlefy', () => {
expect(titlefy(words)).toEqual(o);
});
});
+
+describe('stripFullStops', () => {
+ describe('stripFullStops', () => {
+ it('removes full stops from a version string', () => {
+ const input = 'v0.70.0-12075-8fa496c8';
+ const expectedResult = 'v0700-12075-8fa496c8';
+ expect(stripFullStops(input)).toBe(expectedResult);
+ });
+
+ it('does not alter a string without full stops', () => {
+ const input = 'v0700-12075-8fa496c8';
+ expect(stripFullStops(input)).toBe(input);
+ });
+
+ it('removes full stops from a string with consecutive full stops', () => {
+ const input = 'v0..70...0-12075-8fa496c8';
+ const expectedResult = 'v0700-12075-8fa496c8';
+ expect(stripFullStops(input)).toBe(expectedResult);
+ });
+
+ it('removes full stops from a string with only full stops', () => {
+ const input = '..........';
+ const expectedResult = '';
+ expect(stripFullStops(input)).toBe(expectedResult);
+ });
+
+ it('does not alter an empty string', () => {
+ const input = '';
+ expect(stripFullStops(input)).toBe(input);
+ });
+ });
+});
diff --git a/libs/utils/src/lib/format/strings.ts b/libs/utils/src/lib/format/strings.ts
index 7e7c1f030..4f455e9ee 100644
--- a/libs/utils/src/lib/format/strings.ts
+++ b/libs/utils/src/lib/format/strings.ts
@@ -26,3 +26,7 @@ export function titlefy(words: (string | null | undefined)[]) {
.join(TITLE_SEPARATOR);
return title;
}
+
+export function stripFullStops(input: string) {
+ return input.replace(/\./g, '');
+}
diff --git a/libs/wallet/src/context.ts b/libs/wallet/src/context.ts
index 4e28f672d..a731e58ed 100644
--- a/libs/wallet/src/context.ts
+++ b/libs/wallet/src/context.ts
@@ -31,6 +31,9 @@ export interface VegaWalletContextShape {
/** Transaction payload */
transaction: Transaction
) => Promise;
+
+ /** Fetch public keys */
+ fetchPubKeys?: () => Promise;
}
export const VegaWalletContext = createContext<
diff --git a/libs/wallet/src/provider.spec.tsx b/libs/wallet/src/provider.spec.tsx
index 241d5a5d0..bc5a02593 100644
--- a/libs/wallet/src/provider.spec.tsx
+++ b/libs/wallet/src/provider.spec.tsx
@@ -50,6 +50,7 @@ describe('VegaWalletProvider', () => {
connect: expect.any(Function),
disconnect: expect.any(Function),
sendTx: expect.any(Function),
+ fetchPubKeys: expect.any(Function || undefined),
});
// Connect
@@ -77,14 +78,47 @@ describe('VegaWalletProvider', () => {
expect(spyOnSend).toHaveBeenCalledWith(mockPubKeys[1].publicKey, {});
});
+ it('should fetch new keypairs', async () => {
+ const { result } = setup();
+
+ // Default state
+ expect(result.current).toEqual({
+ pubKey: null,
+ pubKeys: null,
+ isReadOnly: false,
+ selectPubKey: expect.any(Function),
+ connect: expect.any(Function),
+ disconnect: expect.any(Function),
+ sendTx: expect.any(Function),
+ fetchPubKeys: expect.any(Function),
+ });
+
+ // Connect
+ await act(async () => {
+ result.current.connect(restConnector);
+ result.current.selectPubKey(mockPubKeys[0].publicKey);
+ });
+ expect(spyOnConnect).toHaveBeenCalled();
+ expect(result.current.pubKeys).toHaveLength(mockPubKeys.length);
+ expect(result.current.pubKey).toBe(mockPubKeys[0].publicKey);
+
+ // Fetch pub keys
+ mockPubKeys.push({ publicKey: '333', name: 'public key 3' });
+ await act(async () => {
+ result.current.fetchPubKeys && result.current.fetchPubKeys();
+ });
+ expect(result.current.pubKeys).toHaveLength(mockPubKeys.length);
+ });
+
it('persists selected pubkey and disconnects', async () => {
const { result } = setup();
expect(result.current.pubKey).toBe(null);
await act(async () => {
result.current.connect(restConnector);
+ result.current.selectPubKey(mockPubKeys[0].publicKey);
});
- expect(result.current.pubKey).toBe(mockPubKeys[1].publicKey);
+ expect(result.current.pubKey).toBe(mockPubKeys[0].publicKey);
// Disconnect
await act(async () => {
diff --git a/libs/wallet/src/provider.tsx b/libs/wallet/src/provider.tsx
index 67f68e3b7..ac27f4099 100644
--- a/libs/wallet/src/provider.tsx
+++ b/libs/wallet/src/provider.tsx
@@ -21,7 +21,7 @@ export const VegaWalletProvider = ({ children }: VegaWalletProviderProps) => {
const [pubKey, setPubKey] = useState(null);
const [isReadOnly, setIsReadOnly] = useState(false);
- // Arary of pubkeys retrieved from the connector
+ // Array of public keys retrieved from the connector
const [pubKeys, setPubKeys] = useState(null);
// Reference to the current connector instance
@@ -32,6 +32,28 @@ export const VegaWalletProvider = ({ children }: VegaWalletProviderProps) => {
LocalStorage.setItem(WALLET_KEY, pk);
}, []);
+ const fetchPubKeys = useCallback(async () => {
+ if (!connector.current) {
+ throw new Error('No connector');
+ }
+ try {
+ const keys = await connector.current.connect();
+
+ if (keys?.length) {
+ setPubKeys(keys);
+ setIsReadOnly(connector.current instanceof ViewConnector);
+ return keys;
+ } else {
+ return null;
+ }
+ } catch (err) {
+ if (err instanceof WalletClientError) {
+ throw err;
+ }
+ return null;
+ }
+ }, []);
+
const connect = useCallback(async (c: VegaConnector) => {
connector.current = c;
try {
@@ -95,8 +117,18 @@ export const VegaWalletProvider = ({ children }: VegaWalletProviderProps) => {
connect,
disconnect,
sendTx,
+ fetchPubKeys,
};
- }, [isReadOnly, pubKey, pubKeys, selectPubKey, connect, disconnect, sendTx]);
+ }, [
+ isReadOnly,
+ pubKey,
+ pubKeys,
+ selectPubKey,
+ connect,
+ disconnect,
+ sendTx,
+ fetchPubKeys,
+ ]);
return (
diff --git a/libs/wallet/src/use-json-rpc-connect.ts b/libs/wallet/src/use-json-rpc-connect.ts
index c715a6c13..05e0c4c97 100644
--- a/libs/wallet/src/use-json-rpc-connect.ts
+++ b/libs/wallet/src/use-json-rpc-connect.ts
@@ -30,13 +30,13 @@ export const useJsonRpcConnect = (onConnect: () => void) => {
// Check if wallet is configured for the same chain as the app
setStatus(Status.GettingChainId);
- // Dont throw in when cypress is running as trading app relies on
+ // Do not throw in when cypress is running as trading app relies on
// mocks which result in a mismatch between chainId for app and
// chainId for wallet
if (!('Cypress' in window)) {
const chainIdResult = await connector.getChainId();
if (chainIdResult.chainID !== appChainId) {
- // Throw wallet error for consitent error handling
+ // Throw wallet error for consistent error handling
throw ClientErrors.WRONG_NETWORK;
}
}
diff --git a/libs/web3/__mocks__/zustand.ts b/libs/web3/__mocks__/zustand.ts
index 17691a8c0..64c09d6ea 100644
--- a/libs/web3/__mocks__/zustand.ts
+++ b/libs/web3/__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,6 +16,9 @@ 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()));
diff --git a/libs/web3/src/index.ts b/libs/web3/src/index.ts
index 012a3aa83..5dc95034c 100644
--- a/libs/web3/src/index.ts
+++ b/libs/web3/src/index.ts
@@ -1,23 +1,24 @@
export * from './lib/constants';
+export * from './lib/eip-1193-custom-bridge';
export * from './lib/ethereum-error';
+export * from './lib/ethereum-transaction-dialog';
+export * from './lib/url-connector';
export * from './lib/use-bridge-contract';
export * from './lib/use-eager-connect';
-export * from './lib/use-token-contract';
-export * from './lib/use-token-decimals';
export * from './lib/use-ethereum-config';
export * from './lib/use-ethereum-read-contract';
-export * from './lib/use-ethereum-transaction';
-export * from './lib/use-ethereum-transaction-updater';
-export * from './lib/use-ethereum-transaction-store';
export * from './lib/use-ethereum-transaction-manager';
+export * from './lib/use-ethereum-transaction-store';
+export * from './lib/use-ethereum-transaction-updater';
+export * from './lib/use-ethereum-transaction';
export * from './lib/use-ethereum-withdraw-approvals-manager';
export * from './lib/use-ethereum-withdraw-approvals-store';
export * from './lib/use-get-withdraw-delay';
export * from './lib/use-get-withdraw-threshold';
-export * from './lib/ethereum-transaction-dialog';
-export * from './lib/web3-provider';
-export * from './lib/web3-connectors';
+export * from './lib/use-token-contract';
+export * from './lib/use-token-decimals';
+export * from './lib/use-web3-disconnect';
export * from './lib/web3-connect-dialog';
export * from './lib/web3-connect-store';
-export * from './lib/url-connector';
-export * from './lib/eip-1193-custom-bridge';
+export * from './lib/web3-connectors';
+export * from './lib/web3-provider';
diff --git a/libs/web3/src/lib/constants.ts b/libs/web3/src/lib/constants.ts
index 1c1075a4b..b562f4c48 100644
--- a/libs/web3/src/lib/constants.ts
+++ b/libs/web3/src/lib/constants.ts
@@ -9,3 +9,10 @@ export const getChainName = (chainId: number | null | undefined) => {
const name = chainId ? ChainIdMap[chainId] : undefined;
return name || 'Unknown';
};
+
+/**
+ * WalletConnect project id
+ * https://cloud.walletconnect.com/sign-in
+ */
+export const WALLETCONNECT_PROJECT_ID =
+ process.env['NX_WALLETCONNECT_PROJECT_ID'] || '';
diff --git a/libs/web3/src/lib/url-connector.ts b/libs/web3/src/lib/url-connector.ts
index e813d1e60..4656cd903 100644
--- a/libs/web3/src/lib/url-connector.ts
+++ b/libs/web3/src/lib/url-connector.ts
@@ -69,7 +69,7 @@ export class UrlConnector extends Connector {
const chainId = await this.provider!.request({ method: 'eth_chainId' });
this.actions.update({ chainId: Number(chainId) });
} catch (error) {
- this.actions.reportError(error as Error);
+ this.onError?.(error as Error);
}
}
}
diff --git a/libs/web3/src/lib/use-eager-connect.ts b/libs/web3/src/lib/use-eager-connect.ts
index 1edbb6441..dd1c741ca 100644
--- a/libs/web3/src/lib/use-eager-connect.ts
+++ b/libs/web3/src/lib/use-eager-connect.ts
@@ -1,30 +1,40 @@
-import { useLocalStorage } from '@vegaprotocol/react-helpers';
+import { useLocalStorage, useLogger } from '@vegaprotocol/react-helpers';
import type { Web3ReactHooks } from '@web3-react/core';
import { MetaMask } from '@web3-react/metamask';
import type { Connector } from '@web3-react/types';
-import { WalletConnect } from '@web3-react/walletconnect';
+import { WalletConnect } from '@web3-react/walletconnect-v2';
import { useEffect, useRef } from 'react';
import { useWeb3ConnectStore } from './web3-connect-store';
export const ETHEREUM_EAGER_CONNECT = 'ethereum-eager-connect';
-export const useEagerConnect = () => {
+export const useEagerConnect = (sentryDsn?: string) => {
const connectors = useWeb3ConnectStore((store) => store.connectors);
const [eagerConnector] = useLocalStorage(ETHEREUM_EAGER_CONNECT);
const attemptedRef = useRef(false);
+ const logger = useLogger({ dsn: sentryDsn });
+
useEffect(() => {
if (attemptedRef.current || 'Cypress' in window) return;
const stored = getConnector(connectors, eagerConnector);
- // found a valid connection option
- if (stored && stored[0].connectEagerly) {
- stored[0].connectEagerly();
- }
+ const tryConnectEagerly = async () => {
+ // found a valid connection option
+ if (stored && stored[0].connectEagerly) {
+ try {
+ await stored[0].connectEagerly();
+ } catch (err) {
+ // NOOP - no active session
+ logger.error('ERR_WEB3_EAGER_CONNECT', (err as Error).message);
+ }
+ }
+ };
+ tryConnectEagerly();
attemptedRef.current = true;
- }, [eagerConnector, connectors]);
+ }, [eagerConnector, connectors, logger]);
};
const getConnector = (
diff --git a/libs/web3/src/lib/use-web3-disconnect.ts b/libs/web3/src/lib/use-web3-disconnect.ts
new file mode 100644
index 000000000..c38eab228
--- /dev/null
+++ b/libs/web3/src/lib/use-web3-disconnect.ts
@@ -0,0 +1,13 @@
+import { useWeb3ConnectStore } from './web3-connect-store';
+import type { Connector } from '@web3-react/types';
+
+export const useWeb3Disconnect = (connector: Connector) => {
+ const clearError = useWeb3ConnectStore((store) => store.clearError);
+ return () => {
+ if (connector.deactivate) {
+ connector.deactivate();
+ }
+ connector.resetState();
+ clearError();
+ };
+};
diff --git a/libs/web3/src/lib/web3-connect-dialog.spec.tsx b/libs/web3/src/lib/web3-connect-dialog.spec.tsx
index df4ea9d28..1b0bb9831 100644
--- a/libs/web3/src/lib/web3-connect-dialog.spec.tsx
+++ b/libs/web3/src/lib/web3-connect-dialog.spec.tsx
@@ -6,7 +6,7 @@ import { MetaMask } from '@web3-react/metamask';
import type { Connector } from '@web3-react/types';
const [foo, fooHooks] = initializeConnector((actions) => {
- return new MetaMask(actions);
+ return new MetaMask({ actions });
});
const connectors: [Connector, Web3ReactHooks][] = [[foo, fooHooks]];
diff --git a/libs/web3/src/lib/web3-connect-dialog.tsx b/libs/web3/src/lib/web3-connect-dialog.tsx
index 3a4ca1528..6ba540ce3 100644
--- a/libs/web3/src/lib/web3-connect-dialog.tsx
+++ b/libs/web3/src/lib/web3-connect-dialog.tsx
@@ -2,11 +2,15 @@ import { t } from '@vegaprotocol/i18n';
import { useLocalStorage } from '@vegaprotocol/react-helpers';
import { Dialog, Intent } from '@vegaprotocol/ui-toolkit';
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 type { Connector } from '@web3-react/types';
import { ETHEREUM_EAGER_CONNECT } from './use-eager-connect';
import type { Web3ReactHooks } from '@web3-react/core';
import { useWeb3ConnectStore } from './web3-connect-store';
+import { theme } from '@vegaprotocol/tailwindcss-config';
+import classNames from 'classnames';
interface Web3ConnectDialogProps {
dialogOpen: boolean;
@@ -20,37 +24,79 @@ export const Web3ConnectDialog = ({
setDialogOpen,
connectors,
desiredChainId,
-}: Web3ConnectDialogProps) => {
- const [, setEagerConnector] = useLocalStorage(ETHEREUM_EAGER_CONNECT);
+}: Web3ConnectDialogProps) => (
+ {
+ // do not close dialog when clicked outside (wallet connect modal)
+ e.preventDefault();
+ }}
+ intent={Intent.None}
+ title={t('Connect to your Ethereum wallet')}
+ size="small"
+ >
+
+ {connectors.map((connector, i) => (
+
+ {
+ setDialogOpen(false);
+ }}
+ />
+
+ ))}
+
+
+);
+const ConnectButton = ({
+ connector,
+ desiredChainId,
+ onClick,
+}: {
+ connector: [Connector, Web3ReactHooks];
+ desiredChainId?: number;
+ onClick?: () => void;
+}) => {
+ const [connectorInstance, { useIsActivating }] = connector;
+ const isActivating = useIsActivating();
+ const info = getConnectorInfo(connectorInstance);
+ const [, setEagerConnector] = useLocalStorage(ETHEREUM_EAGER_CONNECT);
return (
- {
+ // remove orphaned wallet connect modals
+ const modals = document.querySelectorAll('w3m-modal');
+ if (modals.length > 0) {
+ modals.forEach((m) => m.remove());
+ }
+
+ try {
+ await connectorInstance.activate(desiredChainId);
+ setEagerConnector(info.name);
+ onClick?.();
+ } catch (err) {
+ console.log('could not connect to the wallet', info.name, err);
+ // NOOP - cancelled wallet connector
+ }
+ }}
>
-
- {connectors.map(([connector], i) => {
- const info = getConnectorInfo(connector);
- return (
-
- {
- await connector.activate(desiredChainId);
- setEagerConnector(info.name);
- setDialogOpen(false);
- }}
- >
- {info.text}
-
-
- );
- })}
-
-
+ {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"