From 2d49a1e1459c43aa048b2ad273bc6667f704fb5a Mon Sep 17 00:00:00 2001 From: Manank Patni Date: Fri, 23 Dec 2022 07:02:40 +0530 Subject: [PATCH 01/11] Change the start_level of DAO as per Serokell Team's suggestion Implements #421 Signed-off-by: Manank Patni --- src/services/bakingBad/stats/index.ts | 12 ++++++++++++ src/services/baseDAODocker/index.ts | 6 ++++-- src/services/baseDAODocker/mappers.ts | 5 +++-- src/services/contracts/baseDAO/class.ts | 17 ++++++----------- 4 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/services/bakingBad/stats/index.ts b/src/services/bakingBad/stats/index.ts index cbd6fe27a..c77cb6c56 100644 --- a/src/services/bakingBad/stats/index.ts +++ b/src/services/bakingBad/stats/index.ts @@ -14,3 +14,15 @@ export const getNetworkStats = async (network: Network): Promise => { + const url = `https://api.${networkNameMap[network]}.tzkt.io/v1/blocks/count` + const response = await fetch(url) + + if (!response.ok) { + throw new Error("Failed to fetch contract storage from BakingBad API") + } + + const result = await response.json() + return result +} diff --git a/src/services/baseDAODocker/index.ts b/src/services/baseDAODocker/index.ts index 468cdf415..55e35265f 100644 --- a/src/services/baseDAODocker/index.ts +++ b/src/services/baseDAODocker/index.ts @@ -15,6 +15,7 @@ interface BaseDAODockerParams { originatorAddress: string metadata: MetadataDeploymentResult network: Network + currentLevel: number } export const generateStorageContract = async ({ @@ -22,14 +23,15 @@ export const generateStorageContract = async ({ template, originatorAddress, metadata, - network + network, + currentLevel }: BaseDAODockerParams): Promise => { const tokenMetadata = await getTokenMetadata( storage.governanceToken.address, network, storage.governanceToken.tokenId ) - const args = storageParamsToBaseDAODockerArgs(storage, metadata, tokenMetadata) + const args = storageParamsToBaseDAODockerArgs(storage, metadata, tokenMetadata, currentLevel) const url = `${API_URL}/${originatorAddress}/${template}?${Object.keys(args) .map(key => `${key}=${args[key as keyof GeneratorArgs]}`) diff --git a/src/services/baseDAODocker/mappers.ts b/src/services/baseDAODocker/mappers.ts index 5a80f24d7..77cc01b26 100644 --- a/src/services/baseDAODocker/mappers.ts +++ b/src/services/baseDAODocker/mappers.ts @@ -9,7 +9,8 @@ import { Token } from "models/Token" export const storageParamsToBaseDAODockerArgs = ( storage: BaseStorageParams, metadata: MetadataDeploymentResult, - token: Token + token: Token, + currentLevel: number ): GeneratorArgs => ({ admin_address: storage.adminAddress, guardian_address: storage.guardian, @@ -30,7 +31,7 @@ export const storageParamsToBaseDAODockerArgs = ( proposal_expired_level: `${storage.proposalExpiryPeriod}n`, governance_total_supply: `${token.supply.toFixed()}n`, period: `${storage.votingPeriod}n`, - start_level: "100n", + start_level: `${currentLevel}n`, min_xtz_amount: `${xtzToMutez(new BigNumber(storage.extra.minXtzAmount)).toFixed()}mutez`, max_xtz_amount: `${xtzToMutez(new BigNumber(storage.extra.maxXtzAmount)).toFixed()}mutez` }) diff --git a/src/services/contracts/baseDAO/class.ts b/src/services/contracts/baseDAO/class.ts index f65c9bf10..7fe671aec 100644 --- a/src/services/contracts/baseDAO/class.ts +++ b/src/services/contracts/baseDAO/class.ts @@ -15,6 +15,7 @@ import { Schema } from "@taquito/michelson-encoder" import configuration_type_michelson from "./lambdaDAO/michelson/supported_lambda_types/configuration_proposal_type.json" import proposelambda from "./lambdaDAO/michelson/proposelambda" +import { getNetworkHead } from "services/bakingBad/stats" interface DeployParams { params: MigrationParams @@ -82,25 +83,19 @@ export abstract class BaseDAO { try { console.log("Making storage contract...") + const currentLevel = await getNetworkHead(network) + const storageCode = await generateStorageContract({ network, template, storage: treasuryParams, originatorAddress: account, - metadata + metadata, + currentLevel }) console.log("Originating DAO contract...") - let contractMichaelson - - console.log("template: ", template) - if (template == "lambda") { - console.log("lambda") - contractMichaelson = lambdaDAOContractCode - } else { - console.log("others") - contractMichaelson = baseDAOContractCode - } + const contractMichaelson = lambdaDAOContractCode console.log(contractMichaelson) console.log(treasuryParams) From 8fb338eb9395f212c3d2efebb79abbfc9419fe3f Mon Sep 17 00:00:00 2001 From: Manank Patni Date: Tue, 17 Jan 2023 04:18:06 +0530 Subject: [PATCH 02/11] Add tests to code Signed-off-by: Manank Patni --- package.json | 2 + src/modules/common/WarningFooter.tsx | 2 +- .../creator/components/NavigationBar.tsx | 4 +- src/modules/creator/steps/DaoSettings.tsx | 8 +- .../DelegationChangeProposalForm.tsx | 6 +- .../explorer/components/FreezeDialog.tsx | 10 +- .../explorer/components/NavigationMenu.tsx | 10 +- .../explorer/components/ProposalForm.tsx | 1 + src/modules/explorer/components/Toolbar.tsx | 1 + src/modules/explorer/pages/DAO/index.tsx | 1 + .../pages/DAOList/components/DAOItem.tsx | 6 +- .../explorer/pages/Proposals/index.tsx | 2 + src/modules/explorer/pages/Registry/index.tsx | 1 + src/modules/explorer/pages/Treasury/index.tsx | 2 + src/services/baseDAODocker/index.ts | 1 + src/services/beacon/actions.ts | 4 +- src/services/beacon/hooks/useTezos.ts | 19 +- src/services/beacon/reducer.ts | 4 +- src/services/contracts/baseDAO/class.ts | 10 +- .../contracts/baseDAO/hooks/useOriginate.ts | 9 + .../baseDAO/hooks/useTokenMetadata.ts | 2 + .../contracts/metadataCarrier/deploy.ts | 1 + .../indexer/dao/hooks/useStakedProposals.ts | 31 ++ src/services/indexer/dao/services.ts | 2 +- src/tests/DAOCreate.test.tsx | 289 +++++++++++ src/tests/DAODeposit.test.tsx | 174 +++++++ src/tests/DAOList.test.tsx | 173 +++++++ src/tests/DAOProposal.test.tsx | 336 +++++++++++++ src/tests/constants.tsx | 106 ++++ src/tests/helper.tsx | 35 ++ yarn.lock | 454 +++++++++++++++++- 31 files changed, 1667 insertions(+), 39 deletions(-) create mode 100644 src/services/indexer/dao/hooks/useStakedProposals.ts create mode 100644 src/tests/DAOCreate.test.tsx create mode 100644 src/tests/DAODeposit.test.tsx create mode 100644 src/tests/DAOList.test.tsx create mode 100644 src/tests/DAOProposal.test.tsx create mode 100644 src/tests/constants.tsx create mode 100644 src/tests/helper.tsx diff --git a/package.json b/package.json index fcfd493ff..1f49bd0c2 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "@taquito/tezbridge-wallet": "13.0.1", "@taquito/tzip12": "13.0.1", "@taquito/tzip16": "13.0.1", + "@testing-library/react": "^13.4.0", "@types/mixpanel-browser": "^2.35.7", "@types/prismjs": "^1.26.0", "bignumber.js": "^9.0.1", @@ -44,6 +45,7 @@ "notistack": "^1.0.3", "prism-themes": "^1.9.0", "prismjs": "^1.28.0", + "puppeteer": "^19.4.1", "react": "^17.0.1", "react-customizable-progressbar": "^1.0.2", "react-dom": "^17.0.2", diff --git a/src/modules/common/WarningFooter.tsx b/src/modules/common/WarningFooter.tsx index cc85a37d6..1ea1f729d 100644 --- a/src/modules/common/WarningFooter.tsx +++ b/src/modules/common/WarningFooter.tsx @@ -44,7 +44,7 @@ export const WarningFooter: React.FC<{ text: string }> = ({ text }) => { {text} - setOpen(false)}> + setOpen(false)}> diff --git a/src/modules/creator/components/NavigationBar.tsx b/src/modules/creator/components/NavigationBar.tsx index 218709f6b..fd986cfbc 100644 --- a/src/modules/creator/components/NavigationBar.tsx +++ b/src/modules/creator/components/NavigationBar.tsx @@ -56,7 +56,7 @@ export const NavigationBar: React.FC = ({ back, next }) => { {back && ( - + {back.text} @@ -64,7 +64,7 @@ export const NavigationBar: React.FC = ({ back, next }) => { {next && ( - + {next.text} )} diff --git a/src/modules/creator/steps/DaoSettings.tsx b/src/modules/creator/steps/DaoSettings.tsx index a79740a96..344ab3de1 100644 --- a/src/modules/creator/steps/DaoSettings.tsx +++ b/src/modules/creator/steps/DaoSettings.tsx @@ -111,6 +111,7 @@ const ErrorText = styled(Typography)({ }) const DaoSettingsForm = withRouter(({ submitForm, values, setFieldValue, errors, touched, setFieldTouched }: any) => { + console.log("values: ", values) const theme = useTheme() const isMobile = useMediaQuery(theme.breakpoints.down("md")) @@ -121,16 +122,17 @@ const DaoSettingsForm = withRouter(({ submitForm, values, setFieldValue, errors, } = useTokenMetadata(values?.governanceToken?.address, values?.governanceToken?.tokenId) useEffect(() => { + console.log("tokenMetadata: ", tokenMetadata) if (tokenMetadata) { setFieldValue("governanceToken.tokenMetadata", tokenMetadata) - setFieldValue("symbol", tokenMetadata.symbol) + setFieldValue("symbol", tokenMetadata?.symbol) } if (error) { setFieldValue("governanceToken.tokenMetadata", undefined) setFieldValue("symbol", undefined) } - }, [error, setFieldValue, tokenMetadata]) + }, [tokenMetadata, error, setFieldValue]) const { dispatch } = useContext(CreatorContext) const match = useRouteMatch() @@ -191,7 +193,7 @@ const DaoSettingsForm = withRouter(({ submitForm, values, setFieldValue, errors, = ({ open, handleClos - + Submit diff --git a/src/modules/explorer/components/FreezeDialog.tsx b/src/modules/explorer/components/FreezeDialog.tsx index 5c8c18e84..686ac3af9 100644 --- a/src/modules/explorer/components/FreezeDialog.tsx +++ b/src/modules/explorer/components/FreezeDialog.tsx @@ -102,7 +102,12 @@ export const FreezeDialog: React.FC<{ freeze: boolean }> = ({ freeze }) => { return (
- @@ -142,6 +147,7 @@ export const FreezeDialog: React.FC<{ freeze: boolean }> = ({ freeze }) => { = ({ freeze }) => { - diff --git a/src/modules/explorer/components/NavigationMenu.tsx b/src/modules/explorer/components/NavigationMenu.tsx index 094f8eea9..54193e67b 100644 --- a/src/modules/explorer/components/NavigationMenu.tsx +++ b/src/modules/explorer/components/NavigationMenu.tsx @@ -205,7 +205,7 @@ export const NavigationMenu: React.FC<{ disableMobileMenu?: boolean }> = ({ disa {pages.map((page, i) => ( - + @@ -225,7 +225,13 @@ export const NavigationMenu: React.FC<{ disableMobileMenu?: boolean }> = ({ disa ) : ( {pages.map((page, i) => ( - + diff --git a/src/modules/explorer/components/ProposalForm.tsx b/src/modules/explorer/components/ProposalForm.tsx index 4d25c440d..a498bf1c8 100644 --- a/src/modules/explorer/components/ProposalForm.tsx +++ b/src/modules/explorer/components/ProposalForm.tsx @@ -194,6 +194,7 @@ export const ProposalFormContainer: React.FC = ({ open, handleClose, defa style={{ margin: "10px 0 35px 0" }} onClick={methods.handleSubmit(onSubmit as any)} disabled={!dao || !daoHoldings} + id="submit-proposal" > Submit diff --git a/src/modules/explorer/components/Toolbar.tsx b/src/modules/explorer/components/Toolbar.tsx index fda157ff3..cc7506913 100644 --- a/src/modules/explorer/components/Toolbar.tsx +++ b/src/modules/explorer/components/Toolbar.tsx @@ -173,6 +173,7 @@ export const Navbar: React.FC<{ disableMobileMenu?: boolean }> = ({ disableMobil variant="contained" style={{ fontSize: "14px" }} onClick={() => connect()} + id="nav-connect-wallet" > Connect Wallet diff --git a/src/modules/explorer/pages/DAO/index.tsx b/src/modules/explorer/pages/DAO/index.tsx index 73ae4e0a2..b9497643f 100644 --- a/src/modules/explorer/pages/DAO/index.tsx +++ b/src/modules/explorer/pages/DAO/index.tsx @@ -124,6 +124,7 @@ export const DAO: React.FC = () => { size={isExtraSmall ? "small" : "medium"} onClick={onFlush} disabled={!executableProposals || !executableProposals.length} + id="home-execute-button" > Execute diff --git a/src/modules/explorer/pages/DAOList/components/DAOItem.tsx b/src/modules/explorer/pages/DAOList/components/DAOItem.tsx index 9711ad0c3..101f42621 100644 --- a/src/modules/explorer/pages/DAOList/components/DAOItem.tsx +++ b/src/modules/explorer/pages/DAOList/components/DAOItem.tsx @@ -160,12 +160,14 @@ export const DAOItem: React.FC<{ const daoType = dao.dao_type.name !== "lambda" ? `V2` : `V3` return ( - + {dao.symbol.toUpperCase()} - {dao.name} + + {dao.name} + diff --git a/src/modules/explorer/pages/Proposals/index.tsx b/src/modules/explorer/pages/Proposals/index.tsx index 3fc97f5d4..77cea637f 100644 --- a/src/modules/explorer/pages/Proposals/index.tsx +++ b/src/modules/explorer/pages/Proposals/index.tsx @@ -98,6 +98,7 @@ export const Proposals: React.FC = () => { color="secondary" onClick={onFlush} disabled={!executableProposals || !executableProposals.length} + id="execute-button" > Execute @@ -111,6 +112,7 @@ export const Proposals: React.FC = () => { color="secondary" onClick={onDropAllExpired} disabled={!expiredProposals || !expiredProposals.length} + id="drop-all-expired" > Drop All Expired diff --git a/src/modules/explorer/pages/Registry/index.tsx b/src/modules/explorer/pages/Registry/index.tsx index 549805445..2d32870c0 100644 --- a/src/modules/explorer/pages/Registry/index.tsx +++ b/src/modules/explorer/pages/Registry/index.tsx @@ -101,6 +101,7 @@ export const Registry: React.FC = () => { color="secondary" onClick={() => setUpdateRegistryOpen(true)} disabled={shouldDisable} + id="new-item" > New Item diff --git a/src/modules/explorer/pages/Treasury/index.tsx b/src/modules/explorer/pages/Treasury/index.tsx index d1210fcfb..a3b4dfb0e 100644 --- a/src/modules/explorer/pages/Treasury/index.tsx +++ b/src/modules/explorer/pages/Treasury/index.tsx @@ -82,6 +82,7 @@ export const Treasury: React.FC = () => { color="secondary" onClick={() => setOpenTransfer(true)} disabled={shouldDisable} + id="new-transfer" > New Transfer @@ -126,6 +127,7 @@ export const Treasury: React.FC = () => { color="secondary" onClick={() => setOpenDelegationChange(true)} disabled={shouldDisable} + id="change-delegate-treasury" > Change Delegate diff --git a/src/services/baseDAODocker/index.ts b/src/services/baseDAODocker/index.ts index 55e35265f..d1c26f43e 100644 --- a/src/services/baseDAODocker/index.ts +++ b/src/services/baseDAODocker/index.ts @@ -36,6 +36,7 @@ export const generateStorageContract = async ({ const url = `${API_URL}/${originatorAddress}/${template}?${Object.keys(args) .map(key => `${key}=${args[key as keyof GeneratorArgs]}`) .join("&")}` + console.log("url: ", url) const response = await fetch(url) diff --git a/src/services/beacon/actions.ts b/src/services/beacon/actions.ts index 890b14587..31bb67cc6 100644 --- a/src/services/beacon/actions.ts +++ b/src/services/beacon/actions.ts @@ -1,4 +1,4 @@ -import { TezosToolkit } from "@taquito/taquito" +import { TezosToolkit, Wallet } from "@taquito/taquito" import { BeaconWallet } from "@taquito/beacon-wallet" import { Network } from "./utils" @@ -13,7 +13,7 @@ interface UpdateTezos { tezos: TezosToolkit network: Network account: string - wallet: BeaconWallet | undefined + wallet: BeaconWallet | Wallet | undefined } } diff --git a/src/services/beacon/hooks/useTezos.ts b/src/services/beacon/hooks/useTezos.ts index 5e034bc30..a88dfaeb2 100644 --- a/src/services/beacon/hooks/useTezos.ts +++ b/src/services/beacon/hooks/useTezos.ts @@ -1,10 +1,12 @@ import { useQueryClient } from "react-query" import { useCallback, useContext } from "react" -import { MichelCodecPacker, TezosToolkit } from "@taquito/taquito" +import { MichelCodecPacker, TezosToolkit, Wallet } from "@taquito/taquito" import { connectWithBeacon, Network, rpcNodes, TezosActionType } from "services/beacon" import { TezosContext } from "services/beacon/context" import { Tzip16Module } from "@taquito/tzip16" import mixpanel from "mixpanel-browser" +import { BeaconWallet } from "@taquito/beacon-wallet" +import { InMemorySigner } from "@taquito/signer" type WalletConnectReturn = { tezos: TezosToolkit @@ -25,13 +27,20 @@ export const useTezos = (): WalletConnectReturn => { const connect = useCallback( async (newNetwork?: Network) => { - const { wallet } = await connectWithBeacon(newNetwork || network) + // let wallet: BeaconWallet | Wallet | undefined const newTezos = new TezosToolkit(rpcNodes[newNetwork || network]) newTezos.setPackerProvider(new MichelCodecPacker()) newTezos.addExtension(new Tzip16Module()) - newTezos.setProvider({ wallet }) + // const beaconWallet = await connectWithBeacon(newNetwork || network) + // wallet = beaconWallet.wallet + // newTezos.setProvider({ wallet }) + + const signer = await InMemorySigner.fromSecretKey("edsk3QoqBuvdamxouPhin7swCvkQNgq4jP5KZPbwWNnwdZpSpJiEbq") + newTezos.setProvider({ signer }) + const wallet = newTezos.wallet + const account = await newTezos.wallet.pkh() dispatch({ @@ -59,7 +68,9 @@ export const useTezos = (): WalletConnectReturn => { throw new Error("No Wallet Connected") } - await wallet.disconnect() + if (wallet instanceof BeaconWallet) { + await wallet.disconnect() + } dispatch({ type: TezosActionType.RESET_TEZOS diff --git a/src/services/beacon/reducer.ts b/src/services/beacon/reducer.ts index 1a3f8047d..38cf213a3 100644 --- a/src/services/beacon/reducer.ts +++ b/src/services/beacon/reducer.ts @@ -1,4 +1,4 @@ -import { TezosToolkit } from "@taquito/taquito" +import { TezosToolkit, Wallet } from "@taquito/taquito" import { BeaconWallet } from "@taquito/beacon-wallet" import { createTezos, getTezosNetwork, Network } from "./utils" import { TezosAction, TezosActionType } from "services/beacon/actions" @@ -7,7 +7,7 @@ export interface TezosState { network: Network tezos: TezosToolkit account: string - wallet: BeaconWallet | undefined + wallet: BeaconWallet | Wallet | undefined } const network = getTezosNetwork() diff --git a/src/services/contracts/baseDAO/class.ts b/src/services/contracts/baseDAO/class.ts index 7fe671aec..8dd1244e4 100644 --- a/src/services/contracts/baseDAO/class.ts +++ b/src/services/contracts/baseDAO/class.ts @@ -74,6 +74,7 @@ export abstract class BaseDAO { { params, metadata, tezos, network }: DeployParams ): Promise> => { const treasuryParams = fromStateToBaseStorage(params) + console.log("params: ", params) if (!metadata.deployAddress) { throw new Error("Error deploying treasury DAO: There's not address of metadata") @@ -82,18 +83,20 @@ export abstract class BaseDAO { const account = await tezos.wallet.pkh() try { + const mathfloor = Math.floor(new Date().getTime() / 1000) console.log("Making storage contract...") const currentLevel = await getNetworkHead(network) - + console.log("mathfloor", Math.floor(new Date().getTime() / 1000) - mathfloor) const storageCode = await generateStorageContract({ network, template, storage: treasuryParams, originatorAddress: account, metadata, - currentLevel + currentLevel: currentLevel + 30 }) console.log("Originating DAO contract...") + console.log("mathfloor", Math.floor(new Date().getTime() / 1000) - mathfloor) const contractMichaelson = lambdaDAOContractCode @@ -105,10 +108,13 @@ export abstract class BaseDAO { code: contractMichaelson, init: storageCode }) + console.log("mathfloor", Math.floor(new Date().getTime() / 1000) - mathfloor) const operation = await t.send() console.log("Waiting for confirmation on DAO contract...", t) + console.log("mathfloor", Math.floor(new Date().getTime() / 1000) - mathfloor) const { address } = await operation.contract() + console.log("mathfloor", Math.floor(new Date().getTime() / 1000) - mathfloor) return await tezos.wallet.at(address) } catch (e) { diff --git a/src/services/contracts/baseDAO/hooks/useOriginate.ts b/src/services/contracts/baseDAO/hooks/useOriginate.ts index 256dafada..969c35ce6 100644 --- a/src/services/contracts/baseDAO/hooks/useOriginate.ts +++ b/src/services/contracts/baseDAO/hooks/useOriginate.ts @@ -65,8 +65,11 @@ export const useOriginate = (template: DAOTemplate) => { const result = useMutation, Error, OriginateParams>( async ({ metadataParams, params }) => { + console.log("metadataParams: ", metadataParams) const updatedStates = INITIAL_STATES + const mathfloor = Math.floor(new Date().getTime() / 1000) + updatedStates[0] = { activeText: "Deploying Metadata Carrier Contract", completedText: "" @@ -86,12 +89,14 @@ export const useOriginate = (template: DAOTemplate) => { daoName: params.orgSettings.name, daoType: params.template }) + console.log("mathfloor1", Math.floor(new Date().getTime() / 1000) - mathfloor) const metadata = await deployMetadataCarrier({ ...metadataParams, tezos: tezosToolkit, connect }) + console.log("mathfloor1", Math.floor(new Date().getTime() / 1000) - mathfloor) if (!metadata) { throw new Error(`Could not deploy ${template}DAO because MetadataCarrier contract deployment failed`) @@ -114,6 +119,7 @@ export const useOriginate = (template: DAOTemplate) => { contract: "BaseDAO", daoName: params.orgSettings.name }) + console.log("mathfloor1", Math.floor(new Date().getTime() / 1000) - mathfloor) const contract = await BaseDAO.baseDeploy(template, { tezos: tezosToolkit, @@ -121,6 +127,7 @@ export const useOriginate = (template: DAOTemplate) => { params, network }) + console.log("mathfloor1", Math.floor(new Date().getTime() / 1000) - mathfloor) if (!contract) { throw new Error(`Error deploying ${template}DAO`) @@ -138,8 +145,10 @@ export const useOriginate = (template: DAOTemplate) => { setActiveState(2) setStates(updatedStates) + console.log("mathfloor1", Math.floor(new Date().getTime() / 1000) - mathfloor) const tx = await BaseDAO.transfer_ownership(contract.address, contract.address, tezos) + console.log("mathfloor1", Math.floor(new Date().getTime() / 1000) - mathfloor) if (!tx) { throw new Error(`Error transferring ownership of ${template}DAO to itself`) diff --git a/src/services/contracts/baseDAO/hooks/useTokenMetadata.ts b/src/services/contracts/baseDAO/hooks/useTokenMetadata.ts index 7a3fe91f0..020414eb7 100644 --- a/src/services/contracts/baseDAO/hooks/useTokenMetadata.ts +++ b/src/services/contracts/baseDAO/hooks/useTokenMetadata.ts @@ -5,6 +5,8 @@ import { getTokenMetadata } from "services/bakingBad/tokenBalances" import { useTezos } from "services/beacon/hooks/useTezos" export const useTokenMetadata = (address?: string, tokenId?: string) => { + console.log("tokenId: ", tokenId) + console.log("address: ", address) const { tezos, network } = useTezos() const result = useQuery( diff --git a/src/services/contracts/metadataCarrier/deploy.ts b/src/services/contracts/metadataCarrier/deploy.ts index 53b618145..3f44d1a67 100644 --- a/src/services/contracts/metadataCarrier/deploy.ts +++ b/src/services/contracts/metadataCarrier/deploy.ts @@ -30,6 +30,7 @@ export const deployMetadataCarrier = async ({ metadata, tezos }: MetadataCarrierParameters & Tezos): Promise => { + console.log("metadata: ", metadata) const metadataMap = setMetadataMap(keyName, metadata) try { diff --git a/src/services/indexer/dao/hooks/useStakedProposals.ts b/src/services/indexer/dao/hooks/useStakedProposals.ts new file mode 100644 index 000000000..50109b792 --- /dev/null +++ b/src/services/indexer/dao/hooks/useStakedProposals.ts @@ -0,0 +1,31 @@ +import { useQuery } from "react-query" +import { BaseDAO, CycleInfo } from "services/contracts/baseDAO" +import { getProposals } from "services/indexer/dao/services" +import { ProposalStatus } from "services/indexer/dao/mappers/proposal/types" +import { useDAO } from "./useDAO" + +export const useProposals = (contractAddress: string, address: string) => { + const { data: daoData, isLoading, error, cycleInfo } = useDAO(contractAddress) + + const queryResults = useQuery( + ["proposals", contractAddress], + async () => { + const dao = daoData as BaseDAO + const proposals = await getProposals(dao) + + return proposals.filter( + proposalData => proposalData.getStatus((cycleInfo as CycleInfo).currentLevel).status === status + ) + }, + { + refetchInterval: 30000, + enabled: !!daoData && !!cycleInfo + } + ) + + return { + data: queryResults.data, + isLoading: isLoading || queryResults.isLoading, + error: error || queryResults.error + } +} diff --git a/src/services/indexer/dao/services.ts b/src/services/indexer/dao/services.ts index 29082f9fe..3496acca9 100644 --- a/src/services/indexer/dao/services.ts +++ b/src/services/indexer/dao/services.ts @@ -53,7 +53,7 @@ export const getDAOs = async (network: string) => { return [...daos, ...daos_v2] } -export const getProposals = async (dao: BaseDAO) => { +export const getProposals = async (dao: any) => { const response = await client.request(GET_PROPOSALS_QUERY, { address: dao.data.address }) diff --git a/src/tests/DAOCreate.test.tsx b/src/tests/DAOCreate.test.tsx new file mode 100644 index 000000000..155bed66b --- /dev/null +++ b/src/tests/DAOCreate.test.tsx @@ -0,0 +1,289 @@ +import { TezosToolkit } from "@taquito/taquito" + +import { bobPrivKey, alicePrivKey, network, url, metadataParams, params } from "./constants" + +import puppeteer from "puppeteer-core" +import { randomUUID } from "crypto" +import { deployMetadataCarrier } from "services/contracts/metadataCarrier/deploy" +import { getNetworkHead } from "services/bakingBad/stats" +import { BaseDAO } from "services/contracts/baseDAO" +import { InMemorySigner } from "@taquito/signer" + +const isDebugging = () => { + const debugging_mode = { + headless: false, + devtools: true + } + return debugging_mode +} + +let Tezos: TezosToolkit + +// const queryClient = new QueryClient({ +// defaultOptions: { +// queries: { +// retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 60000), +// retry: false, +// retryOnMount: false, +// refetchOnMount: false, +// refetchOnWindowFocus: true, +// staleTime: 5000, +// cacheTime: 30000, +// }, +// }, +// }); + +// const styles = makeStyles({ +// success: { +// backgroundColor: "#4BCF93 !important", +// padding: "6px 28px", +// height: 54, +// fontSize: 13, +// lineHeight: "0px", +// opacity: 1, +// }, +// error: { +// backgroundColor: "#ED254E !important", +// padding: "6px 28px", +// height: 54, +// fontSize: 13, +// lineHeight: "0px", +// opacity: 1, +// }, +// info: { +// backgroundColor: "#3866F9 !important", +// padding: "6px 28px", +// height: 54, +// fontSize: 13, +// lineHeight: "0px", +// opacity: 1, +// }, +// }); + +// const classes = styles(); + +// const initTezosToolKit = async (pk: string) => { +// // Tezos = new TezosToolkit("https://ithacanet.smartpy.io"); +// Tezos = new TezosToolkit("http://localhost:20000") +// console.log("Tezos Connected: ") +// return Tezos +// } + +let browser: any +let page: any + +beforeAll(async () => { + // browser = await puppeteer.launch(isDebugging()) + browser = await puppeteer.launch({ executablePath: "/opt/homebrew/bin/chromium", headless: false, devtools: true }) + page = await browser.newPage() + await page.setViewport({ width: 1366, height: 768 }) + // await initTezosToolKit(bobPrivKey) +}, 5000000) + +afterAll(() => { + if (isDebugging()) { + browser.close() + } +}) + +const setTezosSignerProvider = async (pk: string) => { + const signer = await InMemorySigner.fromSecretKey(pk) + Tezos.setProvider({ signer }) +} + +it("Check if the DAO exists after getting created", async () => { + await page.goto(url) + await page.evaluate(() => { + localStorage.setItem("homebase:network", "ghostnet") // not work, produce errors :( + }) + await setTezosSignerProvider(alicePrivKey) + + const metadata = await deployMetadataCarrier({ + ...metadataParams, + tezos: Tezos + }) + + if (!metadata) { + console.log("Error deploying treasury DAO: There's not address of metadata") + return + } + + const account = await Tezos.wallet.pkh() + console.log("account: ", account) + + const contract = await BaseDAO.baseDeploy("lambda", { + tezos: Tezos, + metadata, + params, + network + }) + console.log("contract: ", contract) + + const address = contract.address + console.log("address: ", address) + + expect(address).not.toBe(null) + + const daoContract = await Tezos.wallet.at(address) + + const contractStorage = await daoContract.storage() + console.log("contractStorage: ", contractStorage) + // console.log("addressContract: ", addressContract); + expect(contractStorage).not.toBe(null) + console.log("(contractStorage as any).governance_token.address: ", (contractStorage as any).governance_token.address) + // it'll wait until the mock function has been called once. + await page.goto(url + "/explorer/daos") + if (contractStorage instanceof Object) { + expect((contractStorage as any).governance_token.address).toBe(params.orgSettings.governanceToken.address) + } +}, 5000000) + +it("shows a success message after submitting a form", async () => { + try { + await page.goto(url + "/creator/dao") + await page.waitForSelector(`input[name="governanceToken.address"]`) + + const governanceTokenAddress = "KT1QVMpfK12j9v8wy8s4v2EK3EHHH8jvisnW" + const daoName = "Test DAO" + const symbol = "TDAO" + const tokenId = "0" + const description = "This is Test DAO" + const administrator = "tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb" + const guardian = "tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb" + const votingBlocks = "2" + const proposalFlushBlocks = "4" + const proposalExpiryBlocks = "6" + const proposeStakeRequired = "5" + const minXtzAmount = "1" + const maxXtzAmount = "10" + const quorumThreshold = "3" + const minQuorumAmount = "1" + const maxQuorumAmount = "98" + const quorumChange = "5" + const quorumMaxChange = "10" + + await page.click(`input[name="governanceToken.address"]`) + await page.$eval( + `input[name="governanceToken.address"]`, + (el: any, value: any) => (el.value = value), + governanceTokenAddress.substring(0, governanceTokenAddress.length - 1) + ) + await page.type( + `input[name="governanceToken.address"]`, + governanceTokenAddress.charAt(governanceTokenAddress.length - 1) + ) + + // await page.click(`input[name="governanceToken.tokenId"]`) + // await page.type(`input[name="governanceToken.tokenId"]`, "0") + + await page.click(`input[name="name"]`) + await page.$eval( + `input[name="name"]`, + (el: any, value: any) => (el.value = value), + daoName.substring(0, daoName.length - 1) + ) + await page.type(`input[name="name"]`, daoName.charAt(daoName.length - 1)) + + await page.click(`input[name="governanceToken.tokenId"]`) + + const tokenIdFile = await page.$(`input[name="governanceToken.tokenId"]`) + tokenIdFile.press("Backspace") + await page.waitForTimeout(1000) + + await page.type(`input[name="governanceToken.tokenId"]`, tokenId) + + await page.click(`textarea[aria-label="empty textarea"]`) + await page.$eval( + `textarea[aria-label="empty textarea"]`, + (el: any, value: any) => (el.value = value), + description.substring(0, description.length - 1) + ) + await page.type(`textarea[aria-label="empty textarea"]`, description.charAt(description.length - 1)) + + await page.click(`input[name="administrator"]`) + await page.$eval( + `input[name="administrator"]`, + (el: any, value: any) => (el.value = value), + administrator.substring(0, administrator.length - 1) + ) + await page.type(`input[name="administrator"]`, administrator.charAt(administrator.length - 1)) + + await page.click(`input[name="guardian"]`) + await page.$eval( + `input[name="guardian"]`, + (el: any, value: any) => (el.value = value), + guardian.substring(0, guardian.length - 1) + ) + await page.type(`input[name="guardian"]`, guardian.charAt(guardian.length - 1)) + + await page.click("#warning-close-button") + await page.click("#next-button") + + await page.click(`input[name="votingBlocks"]`) + await page.type(`input[name="votingBlocks"]`, votingBlocks) + + await page.click(`input[name="proposalFlushBlocks"]`) + await page.type(`input[name="proposalFlushBlocks"]`, proposalFlushBlocks) + + await page.click(`input[name="proposalExpiryBlocks"]`) + await page.type(`input[name="proposalExpiryBlocks"]`, proposalExpiryBlocks) + + await page.click(`input[name="proposeStakeRequired"]`) + await page.type(`input[name="proposeStakeRequired"]`, proposeStakeRequired) + + await page.click(`input[name="minXtzAmount"]`) + await page.type(`input[name="minXtzAmount"]`, minXtzAmount) + + await page.click(`input[name="maxXtzAmount"]`) + await page.type(`input[name="maxXtzAmount"]`, maxXtzAmount) + + const slider = await page.$(`span[role="slider"]`) + if (slider) { + console.log("slider: ", slider) + const bounding_box = await slider.boundingBox() + if (bounding_box) { + await page.mouse.move(bounding_box.x, bounding_box.y) + await page.mouse.down() + console.log("bounding_box: ", bounding_box) + await page.mouse.move(bounding_box.x + 50, bounding_box.y) + } + await page.mouse.up() + } + + await page.click("#next-button") + + await page.click(`input[name="quorumThreshold"]`) + await page.$eval(`input[name="quorumThreshold"]`, (el: any, value: any) => (el.value = value), quorumThreshold) + // await page.type(`input[name="quorumThreshold"]`, quorumThreshold); + + await page.click(`input[name="minQuorumAmount"]`) + await page.$eval(`input[name="quorumThreshold"]`, (el: any, value: any) => (el.value = value), minQuorumAmount) + // await page.type(`input[name="minQuorumAmount"]`, minQuorumAmount); + + await page.click(`input[name="maxQuorumAmount"]`) + await page.$eval(`input[name="quorumThreshold"]`, (el: any, value: any) => (el.value = value), maxQuorumAmount) + // await page.type(`input[name="maxQuorumAmount"]`, maxQuorumAmount); + + await page.click(`input[name="quorumChange"]`) + await page.$eval(`input[name="quorumThreshold"]`, (el: any, value: any) => (el.value = value), quorumChange) + // await page.type(`input[name="quorumChange"]`, quorumChange); + + await page.click(`input[name="quorumMaxChange"]`) + await page.$eval(`input[name="quorumThreshold"]`, (el: any, value: any) => (el.value = value), quorumMaxChange) + // await page.type(`input[name="quorumMaxChange"]`, quorumMaxChange); + + await page.click("#next-button") + await page.click("#next-button") + + // await page.waitForTimeout(15000) + const contractDeployedText = "Waiting for DAO to be indexed" + const isContractDeployed = await page.waitForXPath(`//*[contains(text(), "${contractDeployedText}")]`, { + timeout: 10000000000 + }) + console.log("isContractDeployed: ", isContractDeployed) + } catch (error) { + console.log("error: ", error) + } + + // expect(text).toContain("Enter App"); +}, 1000000) diff --git a/src/tests/DAODeposit.test.tsx b/src/tests/DAODeposit.test.tsx new file mode 100644 index 000000000..74e3c36a9 --- /dev/null +++ b/src/tests/DAODeposit.test.tsx @@ -0,0 +1,174 @@ +import { makeStyles, ThemeProvider } from "@material-ui/core" +import { InMemorySigner } from "@taquito/signer" +import { TezosToolkit } from "@taquito/taquito" +import { render, waitFor } from "@testing-library/react" +import App from "App" +import { createMemoryHistory } from "history" +import { MigrationParams } from "modules/creator/state" +import { ActionSheetProvider } from "modules/explorer/context/ActionSheets" +import { SnackbarProvider } from "notistack" +import { QueryClient, QueryClientProvider } from "react-query" +import { Router } from "react-router-dom" +import { rpcNodes, TezosProvider } from "services/beacon" +import { theme } from "theme" + +import puppeteer from "puppeteer-core" +import { BaseDAO, fromStateToBaseStorage } from "services/contracts/baseDAO" +import { deployMetadataCarrier } from "services/contracts/metadataCarrier/deploy" +import { generateStorageContract } from "services/baseDAODocker" +import baseDAOContractCode from "../services/contracts/baseDAO/michelson/baseDAO" +import { getDAOs, getProposals } from "services/indexer/dao/services" +import { DAOListItem } from "services/indexer/types" + +import { bobPrivKey, alicePrivKey, network, url, metadataParams, params } from "./constants" +import { createTestDAO } from "./helper" +import { Proposal, ProposalStatus } from "services/indexer/dao/mappers/proposal/types" +console.log("bobPrivKey: ", bobPrivKey) +import { useProposals } from "services/indexer/dao/hooks/useProposals" +import { getDAO } from "services/indexer/dao/services" +import { client } from "services/indexer/graphql" +import { GET_PROPOSALS_QUERY } from "services/indexer/dao/queries" + +const isDebugging = () => { + const debugging_mode = { + headless: false, + devtools: false + } + return debugging_mode +} + +let Tezos: TezosToolkit + +const initTezosToolKit = async (pk: string) => { + Tezos = new TezosToolkit(rpcNodes.ghostnet) + console.log("Tezos Connected: ") + return Tezos +} + +let browser: any +let page: any + +beforeAll(async () => { + browser = await puppeteer.launch({ executablePath: "/opt/homebrew/bin/chromium", headless: false, devtools: true }) + page = await browser.newPage() + await page.setViewport({ width: 1366, height: 768 }) + await initTezosToolKit(alicePrivKey) +}, 5000000) + +afterAll(() => { + if (isDebugging()) { + browser.close() + } +}) + +const setTezosSignerProvider = async (pk: string) => { + console.log("pk: ", pk) + const signer = await InMemorySigner.fromSecretKey(pk) + Tezos.setProvider({ signer }) +} + +it("Deposit To Existing DAO", async () => { + const depositAmount = "1" + await setTezosSignerProvider(bobPrivKey) + + // const daoContract = await createTestDAO(Tezos) + // const addressContract = daoContract.address + + // const contractStorage = await daoContract.storage() + // expect(contractStorage).not.toBe(null) + // if (contractStorage instanceof Object) { + if (true) { + // expect((contractStorage as any).governance_token.address).toBe(params.orgSettings.governanceToken.address) + await page.goto(url) + await page.evaluate(() => { + localStorage.setItem("homebase:network", "ghostnet") // not work, produce errors :( + }) + await page.goto(url + "/explorer/daos") + await page.waitForSelector("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") + const dao = await page.$("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") + if (dao) { + console.log("dao: ", dao) + const daoElem = await dao.$("#dao-name") + const name = await daoElem?.evaluate((el: any) => el.textContent) + console.log("name: ", name) + // expect(params.orgSettings.name).toBe(name) + expect("LevelDAO").toBe(name) + await page.click("#warning-close-button") + await page.click("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") + + await page.waitForSelector("#nav-connect-wallet") + await page.click("#nav-connect-wallet") + + await page.waitForSelector("#page-User") + await page.click("#page-User") + + await page.click("#deposit-dao") + + await page.waitForSelector(`input[name="deposit"]`) + await page.click(`input[name="deposit"]`) + await page.$eval( + `input[name="deposit"]`, + (el: any, value: any) => (el.value = value), + depositAmount.substring(0, depositAmount.length - 1) + ) + await page.type(`input[name="deposit"]`, depositAmount.charAt(depositAmount.length - 1)) + // await page.waitForTimeout(100000); + + await page.waitForSelector('button[id="deposit-submit"]') + await page.click('button[id="deposit-submit"]') + } + } +}, 5000000) + +it("Deposit To Existing DAO", async () => { + const depositAmount = "1" + await setTezosSignerProvider(bobPrivKey) + + // const daoContract = await createTestDAO(Tezos) + // const addressContract = daoContract.address + + // const contractStorage = await daoContract.storage() + // expect(contractStorage).not.toBe(null) + // if (contractStorage instanceof Object) { + if (true) { + // expect((contractStorage as any).governance_token.address).toBe(params.orgSettings.governanceToken.address) + await page.goto(url) + await page.evaluate(() => { + localStorage.setItem("homebase:network", "ghostnet") // not work, produce errors :( + }) + await page.goto(url + "/explorer/daos") + await page.waitForSelector("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") + const dao = await page.$("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") + if (dao) { + console.log("dao: ", dao) + const daoElem = await dao.$("#dao-name") + const name = await daoElem?.evaluate((el: any) => el.textContent) + console.log("name: ", name) + // expect(params.orgSettings.name).toBe(name) + expect("LevelDAO").toBe(name) + await page.click("#warning-close-button") + await page.click("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") + + await page.waitForSelector("#nav-connect-wallet") + await page.click("#nav-connect-wallet") + + await page.waitForSelector("#page-User") + await page.click("#page-User") + + await page.click("#withdraw-dao") + + await page.waitForSelector(`input[name="amount-field"]`) + await page.click(`input[name="amount-field"]`) + await page.$eval( + `input[name="amount-field"]`, + (el: any, value: any) => (el.value = value), + depositAmount.substring(0, depositAmount.length - 1) + ) + await page.type(`input[name="amount-field"]`, depositAmount.charAt(depositAmount.length - 1)) + // await page.waitForTimeout(100000); + + await page.waitForSelector('button[id="amount-submit"]') + await page.click('button[id="amount-submit"]') + } + } +}, 5000000) diff --git a/src/tests/DAOList.test.tsx b/src/tests/DAOList.test.tsx new file mode 100644 index 000000000..6c699bd58 --- /dev/null +++ b/src/tests/DAOList.test.tsx @@ -0,0 +1,173 @@ +import { makeStyles, ThemeProvider } from "@material-ui/core" +import { InMemorySigner } from "@taquito/signer" +import { TezosToolkit } from "@taquito/taquito" +import { render, waitFor } from "@testing-library/react" +import App from "App" +import { createMemoryHistory } from "history" +import { MigrationParams } from "modules/creator/state" +import { ActionSheetProvider } from "modules/explorer/context/ActionSheets" +import { SnackbarProvider } from "notistack" +import { QueryClient, QueryClientProvider } from "react-query" +import { Router } from "react-router-dom" +import { rpcNodes, TezosProvider } from "services/beacon" +import { theme } from "theme" + +import { BaseDAO, fromStateToBaseStorage } from "services/contracts/baseDAO" +import { deployMetadataCarrier } from "services/contracts/metadataCarrier/deploy" +import { generateStorageContract } from "services/baseDAODocker" +import baseDAOContractCode from "../services/contracts/baseDAO/michelson/baseDAO" +import { getDAOs } from "services/indexer/dao/services" +import { DAOListItem } from "services/indexer/types" +import { alicePrivKey, bobPrivKey, network, url, metadataParams, params } from "./constants" +import { getNetworkHead } from "services/bakingBad/stats" +import puppeteer from "puppeteer-core" + +const isDebugging = () => { + const debugging_mode = { + headless: false, + devtools: true + } + return debugging_mode +} + +let Tezos: TezosToolkit + +const initTezosToolKit = async (pk: string) => { + Tezos = new TezosToolkit(rpcNodes.ghostnet) + console.log("Tezos Connected: ") + return Tezos +} + +let browser: any +let page: any + +beforeAll(async () => { + browser = await puppeteer.launch({ executablePath: "/opt/homebrew/bin/chromium", headless: false, devtools: true }) + page = await browser.newPage() + await page.setViewport({ width: 1366, height: 768 }) + await initTezosToolKit(alicePrivKey) +}, 5000000) + +afterAll(() => { + if (isDebugging()) { + browser.close() + } +}) + +const setTezosSignerProvider = async (pk: string) => { + const signer = await InMemorySigner.fromSecretKey(pk) + Tezos.setProvider({ signer }) +} + +it("Check if the DAO exists after getting created", async () => { + await page.goto(url) + await page.evaluate(() => { + localStorage.setItem("homebase:network", "ghostnet") // not work, produce errors :( + }) + await setTezosSignerProvider(alicePrivKey) + + const metadata = await deployMetadataCarrier({ + ...metadataParams, + tezos: Tezos + }) + + if (!metadata) { + console.log("Error deploying treasury DAO: There's not address of metadata") + return + } + + const account = await Tezos.wallet.pkh() + console.log("account: ", account) + const currentLevel = await getNetworkHead(network) + console.log("currentLevel: ", currentLevel) + + const contract = await BaseDAO.baseDeploy("lambda", { + tezos: Tezos, + metadata, + params, + network + }) + console.log("contract: ", contract) + + const address = contract.address + console.log("address: ", address) + + expect(address).not.toBe(null) + + const daoContract = await Tezos.wallet.at(address) + + const contractStorage = await daoContract.storage() + console.log("contractStorage: ", contractStorage) + // console.log("addressContract: ", addressContract); + expect(contractStorage).not.toBe(null) + console.log("(contractStorage as any).governance_token.address: ", (contractStorage as any).governance_token.address) + // it'll wait until the mock function has been called once. + await page.goto(url + "/explorer/daos") + if (contractStorage instanceof Object) { + expect((contractStorage as any).governance_token.address).toBe(params.orgSettings.governanceToken.address) + + // await page.waitForTimeout(10000) + + console.log("#dao-" + address) + await page.waitForSelector("#dao-" + address) + const dao = await page.$("#dao-" + address) + console.log("dao: ", dao) + if (dao) { + console.log("dao: ", dao) + const daoElem = await dao.$("#dao-name") + console.log("daoElem: ", daoElem) + const name = await daoElem?.evaluate((el: any) => el.textContent) + console.log("name: ", name) + console.log("name: ", name) + expect(params.orgSettings.name).toBe(name) + } + } +}, 5000000) + +it("Get daos from the GraphQL api", async () => { + await setTezosSignerProvider(alicePrivKey) + + const metadata = await deployMetadataCarrier({ + ...metadataParams, + tezos: Tezos + }) + + if (!metadata) { + console.log("Error deploying treasury DAO: There's not address of metadata") + return + } + + const account = await Tezos.wallet.pkh() + console.log("account: ", account) + const currentLevel = await getNetworkHead(network) + console.log("currentLevel: ", currentLevel) + + const contract = await BaseDAO.baseDeploy("lambda", { + tezos: Tezos, + metadata, + params, + network + }) + console.log("contract: ", contract) + + const address = contract.address + console.log("address: ", address) + + expect(address).not.toBe(null) + + const daoContract = await Tezos.wallet.at(address) + + const contractStorage = await daoContract.storage() + console.log("contractStorage: ", contractStorage) + // console.log("addressContract: ", addressContract); + expect(contractStorage).not.toBe(null) + // it'll wait until the mock function has been called once. + + let daos: DAOListItem[] = [] + + daos = await getDAOs("ghostnet") + console.log("daos: ", daos) + + const daoIndex = daos.findIndex(dao => dao.address === address) + expect(daoIndex).not.toBe(-1) +}, 5000000) diff --git a/src/tests/DAOProposal.test.tsx b/src/tests/DAOProposal.test.tsx new file mode 100644 index 000000000..a0668c7ea --- /dev/null +++ b/src/tests/DAOProposal.test.tsx @@ -0,0 +1,336 @@ +import { makeStyles, ThemeProvider } from "@material-ui/core" +import { InMemorySigner } from "@taquito/signer" +import { TezosToolkit } from "@taquito/taquito" +import { render, waitFor } from "@testing-library/react" +import App from "App" +import { createMemoryHistory } from "history" +import { MigrationParams } from "modules/creator/state" +import { ActionSheetProvider } from "modules/explorer/context/ActionSheets" +import { SnackbarProvider } from "notistack" +import { QueryClient, QueryClientProvider } from "react-query" +import { Router } from "react-router-dom" +import { rpcNodes, TezosProvider } from "services/beacon" +import { theme } from "theme" + +import puppeteer from "puppeteer-core" +import { BaseDAO, fromStateToBaseStorage } from "services/contracts/baseDAO" +import { deployMetadataCarrier } from "services/contracts/metadataCarrier/deploy" +import { generateStorageContract } from "services/baseDAODocker" +import baseDAOContractCode from "../services/contracts/baseDAO/michelson/baseDAO" +import { getDAOs, getProposals } from "services/indexer/dao/services" +import { DAOListItem } from "services/indexer/types" + +import { bobPrivKey, alicePrivKey, network, url, metadataParams, params } from "./constants" +import { createTestDAO } from "./helper" +import { Proposal, ProposalStatus } from "services/indexer/dao/mappers/proposal/types" +console.log("bobPrivKey: ", bobPrivKey) +import { useProposals } from "services/indexer/dao/hooks/useProposals" +import { getDAO } from "services/indexer/dao/services" +import { client } from "services/indexer/graphql" +import { GET_PROPOSALS_QUERY } from "services/indexer/dao/queries" + +const isDebugging = () => { + const debugging_mode = { + headless: false, + devtools: false + } + return debugging_mode +} + +let Tezos: TezosToolkit + +const initTezosToolKit = async (pk: string) => { + Tezos = new TezosToolkit(rpcNodes.ghostnet) + console.log("Tezos Connected: ") + return Tezos +} + +let browser: any +let page: any + +beforeAll(async () => { + browser = await puppeteer.launch({ executablePath: "/opt/homebrew/bin/chromium", headless: false, devtools: true }) + page = await browser.newPage() + await page.setViewport({ width: 1366, height: 768 }) + await initTezosToolKit(alicePrivKey) +}, 5000000) + +afterAll(() => { + if (isDebugging()) { + browser.close() + } +}) + +const setTezosSignerProvider = async (pk: string) => { + console.log("pk: ", pk) + const signer = await InMemorySigner.fromSecretKey(pk) + Tezos.setProvider({ signer }) +} + +// it("Check if treasury proposal can be created", async () => { +// const amountToTransfer = "1" +// await setTezosSignerProvider(bobPrivKey) + +// // const daoContract = await createTestDAO(Tezos) +// // const addressContract = daoContract.address + +// // const contractStorage = await daoContract.storage() +// // expect(contractStorage).not.toBe(null) +// // if (contractStorage instanceof Object) { +// if (true) { +// // expect((contractStorage as any).governance_token.address).toBe(params.orgSettings.governanceToken.address) +// await page.goto(url) +// await page.evaluate(() => { +// localStorage.setItem("homebase:network", "ghostnet") // not work, produce errors :( +// }) +// await page.goto(url + "/explorer/daos") +// await page.waitForSelector("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") +// const dao = await page.$("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") +// if (dao) { +// console.log("dao: ", dao) +// const daoElem = await dao.$("#dao-name") +// const name = await daoElem?.evaluate((el: any) => el.textContent) +// console.log("name: ", name) +// // expect(params.orgSettings.name).toBe(name) +// expect("LevelDAO").toBe(name) +// await page.click("#warning-close-button") +// await page.click("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") +// await page.waitForSelector("#page-Treasury") +// await page.click("#page-Treasury") + +// await page.waitForSelector("#new-transfer:not([disabled])", { timeout: 60000 }) +// await page.click("#new-transfer") + +// await page.waitForSelector("#simple-tab-0") +// await page.click("#simple-tab-0") + +// await page.click(`button[aria-label="Open"]`) +// await page.click(`li[data-option-index="0"]`) + +// await page.waitForSelector(`input[name="transferForm.transfers.0.recipient"]`) +// await page.click(`input[name="transferForm.transfers.0.recipient"]`) +// await page.$eval( +// `input[name="transferForm.transfers.0.recipient"]`, +// (el: any, value: any) => (el.value = value), +// params.orgSettings.administrator.substring(0, params.orgSettings.administrator.length - 1) +// ) +// await page.type( +// `input[name="transferForm.transfers.0.recipient"]`, +// params.orgSettings.administrator.charAt(params.orgSettings.administrator.length - 1) +// ) + +// await page.waitForSelector(`input[name="transferForm.transfers.0.amount"]`) +// await page.click(`input[name="transferForm.transfers.0.amount"]`) +// await page.$eval( +// `input[name="transferForm.transfers.0.amount"]`, +// (el: any, value: any) => (el.value = value), +// amountToTransfer.substring(0, amountToTransfer.length - 1) +// ) +// await page.type( +// `input[name="transferForm.transfers.0.amount"]`, +// amountToTransfer.charAt(amountToTransfer.length - 1) +// ) + +// // await page.waitForTimeout(100000); +// await page.click("#warning-close-button") + +// await page.waitForSelector('button[id="submit-proposal"]') +// await page.click('button[id="submit-proposal"]') +// await page.waitForTimeout(30000) +// } +// } +// }, 5000000) + +// it("Check if registry proposal can be created", async () => { +// await setTezosSignerProvider(bobPrivKey) +// const key = "Hello" + Math.random() +// const value = "World" + Math.random() +// // const daoContract = await createTestDAO(Tezos) +// // const addressContract = daoContract.address + +// // const contractStorage = await daoContract.storage() +// // expect(contractStorage).not.toBe(null) +// // if (contractStorage instanceof Object) { +// if (true) { +// // expect((contractStorage as any).governance_token.address).toBe(params.orgSettings.governanceToken.address) + +// await page.goto(url) +// await page.evaluate(() => { +// localStorage.setItem("homebase:network", "ghostnet") // not work, produce errors :( +// }) +// await page.goto(url + "/explorer/daos") +// await page.waitForSelector("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") +// const dao = await page.$("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") + +// if (dao) { +// console.log("dao: ", dao) +// const daoElem = await dao.$("#dao-name") +// const name = await daoElem?.evaluate((el: any) => el.textContent) +// console.log("name: ", name) +// // expect(params.orgSettings.name).toBe(name) +// expect("LevelDAO").toBe(name) + +// await page.click("#warning-close-button") +// await page.click("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") +// await page.waitForSelector("#page-Registry") +// await page.click("#page-Registry") + +// await page.waitForSelector("button#new-item:not([disabled])") +// await page.click('button[id="new-item"]') + +// await page.waitForSelector("#simple-tab-2") +// await page.click("#simple-tab-2") + +// await page.click(`input[name="registryUpdateForm.list.0.key"]`) +// await page.$eval( +// `input[name="registryUpdateForm.list.0.key"]`, +// (el: any, value: any) => (el.value = value), +// key.substring(0, key.length - 1) +// ) +// await page.type(`input[name="registryUpdateForm.list.0.key"]`, key.charAt(key.length - 1)) + +// await page.click(`textarea[name="registryUpdateForm.list.0.value"]`) +// await page.$eval( +// `textarea[name="registryUpdateForm.list.0.value"]`, +// (el: any, value: any) => (el.value = value), +// value.substring(0, value.length - 1) +// ) +// await page.type(`textarea[name="registryUpdateForm.list.0.value"]`, value.charAt(value.length - 1)) + +// await page.click("#warning-close-button") + +// await page.waitForSelector('button[id="submit-proposal"]') +// await page.click('button[id="submit-proposal"]') +// await page.waitForTimeout(30000) + +// const response = await client.request(GET_PROPOSALS_QUERY, { +// address: "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK" +// }) +// console.log("response: ", response.proposals) +// } +// } +// }, 5000000) + +// it("Flush All Proposals", async () => { +// await setTezosSignerProvider(bobPrivKey) +// // const daoContract = await createTestDAO(Tezos) +// // const addressContract = daoContract.address + +// // const contractStorage = await daoContract.storage() +// // expect(contractStorage).not.toBe(null) +// // if (contractStorage instanceof Object) { +// if (true) { +// // expect((contractStorage as any).governance_token.address).toBe(params.orgSettings.governanceToken.address) + +// await page.goto(url) +// await page.evaluate(() => { +// localStorage.setItem("homebase:network", "ghostnet") // not work, produce errors :( +// }) +// await page.goto(url + "/explorer/daos") +// await page.waitForSelector("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") +// const dao = await page.$("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") + +// if (dao) { +// console.log("dao: ", dao) +// const daoElem = await dao.$("#dao-name") +// const name = await daoElem?.evaluate((el: any) => el.textContent) +// console.log("name: ", name) +// // expect(params.orgSettings.name).toBe(name) +// expect("LevelDAO").toBe(name) + +// await page.click("#warning-close-button") +// await page.click("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") +// await page.waitForSelector("#page-Proposals") +// await page.click("#page-Proposals") + +// await page.waitForSelector("#execute-button:not([disabled])", { timeout: 60000 }) +// await page.click("#execute-button") +// } +// } +// }, 5000000) + +// it("Drop All Expired Proposals", async () => { +// await setTezosSignerProvider(bobPrivKey) +// // const daoContract = await createTestDAO(Tezos) +// // const addressContract = daoContract.address + +// // const contractStorage = await daoContract.storage() +// // expect(contractStorage).not.toBe(null) +// // if (contractStorage instanceof Object) { +// if (true) { +// // expect((contractStorage as any).governance_token.address).toBe(params.orgSettings.governanceToken.address) + +// await page.goto(url) +// await page.evaluate(() => { +// localStorage.setItem("homebase:network", "ghostnet") // not work, produce errors :( +// }) +// await page.goto(url + "/explorer/daos") +// await page.waitForSelector("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") +// const dao = await page.$("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") + +// if (dao) { +// console.log("dao: ", dao) +// const daoElem = await dao.$("#dao-name") +// const name = await daoElem?.evaluate((el: any) => el.textContent) +// console.log("name: ", name) +// // expect(params.orgSettings.name).toBe(name) +// expect("LevelDAO").toBe(name) + +// await page.click("#warning-close-button") +// await page.click("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") +// await page.waitForSelector("#page-Proposals") +// await page.click("#page-Proposals") + +// await page.waitForSelector("#drop-all-expired:not([disabled])", { timeout: 60000 }) +// await page.click("#drop-all-expired") +// await page.waitForTimeout(30000) +// } +// } +// }, 5000000) + +it("Change Delegate Proposal", async () => { + const newDelegate = "tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb" + await setTezosSignerProvider(bobPrivKey) + // const daoContract = await createTestDAO(Tezos) + // const addressContract = daoContract.address + + // const contractStorage = await daoContract.storage() + // expect(contractStorage).not.toBe(null) + // if (contractStorage instanceof Object) { + if (true) { + // expect((contractStorage as any).governance_token.address).toBe(params.orgSettings.governanceToken.address) + + await page.goto(url) + await page.evaluate(() => { + localStorage.setItem("homebase:network", "ghostnet") // not work, produce errors :( + }) + await page.goto(url + "/explorer/daos") + await page.waitForSelector("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") + const dao = await page.$("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") + + if (dao) { + console.log("dao: ", dao) + const daoElem = await dao.$("#dao-name") + const name = await daoElem?.evaluate((el: any) => el.textContent) + console.log("name: ", name) + // expect(params.orgSettings.name).toBe(name) + expect("LevelDAO").toBe(name) + + await page.click("#warning-close-button") + await page.click("#dao-" + "KT1QKL2zdUNh177FdzASHQ8UGdBzpPLGXYpK") + await page.waitForSelector("#page-Treasury") + await page.click("#page-Treasury") + + await page.waitForSelector("#change-delegate-treasury:not([disabled])", { timeout: 60000 }) + await page.click("#change-delegate-treasury") + + await page.click(`input[name="newDelegationAddress"]`) + await page.$eval(`input[name="newDelegationAddress"]`, (el: any, value: any) => (el.value = value), newDelegate) + + await page.waitForSelector("#submit-delegate-proposal") + await page.click("#submit-delegate-proposal") + + await page.waitForTimeout(30000) + } + } +}, 5000000) diff --git a/src/tests/constants.tsx b/src/tests/constants.tsx new file mode 100644 index 000000000..c81c60d02 --- /dev/null +++ b/src/tests/constants.tsx @@ -0,0 +1,106 @@ +import BigNumber from "bignumber.js" +import { MigrationParams } from "modules/creator/state" + +export const bobPrivKey = "edsk3RFfvaFaxbHx8BMtEW1rKQcPtDML3LXjNqMNLCzC3wLC1bWbAt" +export const alicePrivKey = "edsk3QoqBuvdamxouPhin7swCvkQNgq4jP5KZPbwWNnwdZpSpJiEbq" + +export const network = "ghostnet" + +export const url = "http://localhost:3000" + +export const metadataParams: any = { + keyName: "metadataKey", + metadata: { + frozenToken: { + name: "Test DAO", + symbol: "TEST", + description: "This is Test DAO", + governanceToken: { + address: "KT1QVMpfK12j9v8wy8s4v2EK3EHHH8jvisnW", + tokenId: "0", + tokenMetadata: { + id: "42096569352193", + contract: "KT1QVMpfK12j9v8wy8s4v2EK3EHHH8jvisnW", + level: 717794, + token_id: 0, + symbol: "TEST", + name: "Test", + decimals: 18, + network: "ghostnet", + supply: new BigNumber("100000000") + } + }, + administrator: "tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb", + guardian: "tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb", + decimals: 18 + }, + unfrozenToken: { + name: "Test DAO", + symbol: "TEST", + description: "This is Test DAO", + governanceToken: { + address: "KT1QVMpfK12j9v8wy8s4v2EK3EHHH8jvisnW", + tokenId: "0", + tokenMetadata: { + id: "42096569352193", + contract: "KT1QVMpfK12j9v8wy8s4v2EK3EHHH8jvisnW", + level: 717794, + token_id: 0, + symbol: "TEST", + name: "Test", + decimals: 18, + network: "ghostnet", + supply: "1.0000100000002e+30" + } + }, + administrator: "tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb", + guardian: "tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb", + decimals: 18 + }, + description: "This is Test DAO", + authors: ["tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb"], + template: "lambda" + } +} + +export const params: MigrationParams = { + template: "lambda", + orgSettings: { + name: "Test DAO", + symbol: "TEST", + description: "This is Test DAO", + governanceToken: { + address: "KT1QVMpfK12j9v8wy8s4v2EK3EHHH8jvisnW", + tokenId: "0", + tokenMetadata: { + id: "42096569352193", + contract: "KT1QVMpfK12j9v8wy8s4v2EK3EHHH8jvisnW", + level: 717794, + token_id: 0, + symbol: "TEST", + name: "Test", + decimals: 18, + network: "ghostnet", + supply: new BigNumber("100000000") + } + }, + administrator: "tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb", + guardian: "tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb" + }, + votingSettings: { + votingBlocks: 2, + proposeStakeRequired: 5, + returnedTokenPercentage: 8, + minXtzAmount: 1, + maxXtzAmount: 10, + proposalFlushBlocks: 4, + proposalExpiryBlocks: 6 + }, + quorumSettings: { + quorumThreshold: 2, + minQuorumAmount: 1, + maxQuorumAmount: 99, + quorumChange: 5, + quorumMaxChange: 19 + } +} diff --git a/src/tests/helper.tsx b/src/tests/helper.tsx new file mode 100644 index 000000000..743aa9b5b --- /dev/null +++ b/src/tests/helper.tsx @@ -0,0 +1,35 @@ +import { BaseDAO } from "services/contracts/baseDAO" +import { deployMetadataCarrier } from "services/contracts/metadataCarrier/deploy" +import { metadataParams, params, network } from "./constants" + +export const createTestDAO = async (Tezos: any) => { + const metadata = await deployMetadataCarrier({ + ...metadataParams, + tezos: Tezos + }) + + if (!metadata) { + console.log("Error deploying treasury DAO: There's not address of metadata") + return + } + + const account = await Tezos.wallet.pkh() + console.log("account: ", account) + + const contract = await BaseDAO.baseDeploy("lambda", { + tezos: Tezos, + metadata, + params, + network + }) + console.log("contract: ", contract) + + const address = contract.address + console.log("address: ", address) + + expect(address).not.toBe(null) + + const daoContract = await Tezos.wallet.at(address) + + return daoContract +} diff --git a/yarn.lock b/yarn.lock index 177f485e4..fa8e7cc48 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2122,11 +2122,39 @@ elliptic "^6.5.4" typedarray-to-buffer "^4.0.0" +"@testing-library/dom@^8.5.0": + version "8.19.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.19.1.tgz#0e2dafd281dedb930bb235eac1045470b4129d0e" + integrity sha512-P6iIPyYQ+qH8CvGauAqanhVnjrnRe0IZFSYCeGkSRW9q3u8bdVn2NPI+lasFyVsEQn1J/IFmp5Aax41+dAP9wg== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "^5.0.0" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.4.4" + pretty-format "^27.0.2" + +"@testing-library/react@^13.4.0": + version "13.4.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.4.0.tgz#6a31e3bf5951615593ad984e96b9e5e2d9380966" + integrity sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^8.5.0" + "@types/react-dom" "^18.0.0" + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@types/aria-query@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" + integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== + "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": version "7.1.16" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702" @@ -2391,6 +2419,13 @@ dependencies: "@types/react" "*" +"@types/react-dom@^18.0.0": + version "18.0.10" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.10.tgz#3b66dec56aa0f16a6cc26da9e9ca96c35c0b4352" + integrity sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg== + dependencies: + "@types/react" "*" + "@types/react-html-parser@^2.0.2": version "2.0.2" resolved "https://registry.yarnpkg.com/@types/react-html-parser/-/react-html-parser-2.0.2.tgz#9b7e1b99657967e614aebf3f87d78a3fd0a1602c" @@ -2509,6 +2544,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + "@types/yup@^0.29.11": version "0.29.13" resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.29.13.tgz#21b137ba60841307a3c8a1050d3bf4e63ad561e9" @@ -2983,6 +3025,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + ansi-styles@^6.0.0: version "6.1.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.1.1.tgz#63cd61c72283a71cb30bd881dbb60adada74bc70" @@ -3026,6 +3073,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + aria-query@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" @@ -3034,6 +3086,13 @@ aria-query@^4.2.2: "@babel/runtime" "^7.10.2" "@babel/runtime-corejs3" "^7.10.2" +aria-query@^5.0.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + arity-n@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" @@ -3208,6 +3267,11 @@ autoprefixer@^9.6.1: 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== + axe-core@^4.3.5: version "4.3.5" resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.5.tgz#78d6911ba317a8262bfee292aeafcc1e04b49cc5" @@ -3507,6 +3571,15 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + blakejs@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" @@ -3748,6 +3821,11 @@ btoa@^1.2.1: resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -3772,6 +3850,14 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" +buffer@^5.2.1, buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" @@ -4430,6 +4516,16 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cosmiconfig@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.0.0.tgz#e9feae014eab580f858f8a0288f38997a7bebe97" + integrity sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ== + dependencies: + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + cosmiconfig@^5.0.0: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" @@ -4493,6 +4589,13 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +cross-fetch@3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + cross-fetch@^3.0.6: version "3.1.4" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" @@ -4842,6 +4945,13 @@ debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: dependencies: ms "2.1.2" +debug@4.3.4, 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== + dependencies: + ms "2.1.2" + debug@^3.1.1, debug@^3.2.6, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -4856,13 +4966,6 @@ debug@^4.0.0: dependencies: ms "2.1.2" -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== - dependencies: - ms "2.1.2" - decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -4902,6 +5005,27 @@ deep-equal@^1.0.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" +deep-equal@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.1.0.tgz#5ba60402cf44ab92c2c07f3f3312c3d857a0e1dd" + integrity sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA== + dependencies: + call-bind "^1.0.2" + es-get-iterator "^1.1.2" + get-intrinsic "^1.1.3" + is-arguments "^1.1.1" + is-date-object "^1.0.5" + is-regex "^1.1.4" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.8" + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -4937,6 +5061,14 @@ define-properties@^1.1.2, define-properties@^1.1.3: dependencies: object-keys "^1.0.12" +define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -5018,6 +5150,11 @@ detect-port-alt@1.1.6: address "^1.0.1" debug "^2.6.0" +devtools-protocol@0.0.1068969: + version "0.0.1068969" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1068969.tgz#8b9a4bc48aed1453bed08d62b07481f9abf4d6d8" + integrity sha512-ATFTrPbY1dKYhPPvpjtwWKSK2mIwGmRwX54UASn9THEuIZCe2n9k3vVuMmt6jWeL+e5QaaguEv/pMyR+JQB7VQ== + diff-sequences@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" @@ -5078,6 +5215,11 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-accessibility-api@^0.5.9: + version "0.5.14" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz#56082f71b1dc7aac69d83c4285eef39c15d93f56" + integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg== + dom-converter@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" @@ -5278,7 +5420,7 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -end-of-stream@^1.0.0, end-of-stream@^1.1.0: +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -5358,6 +5500,20 @@ es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1: string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.1" +es-get-iterator@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" + integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.0" + has-symbols "^1.0.1" + is-arguments "^1.1.0" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.5" + isarray "^2.0.5" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -5932,6 +6088,17 @@ extract-files@^9.0.0: resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-9.0.0.tgz#8a7744f2437f81f5ed3250ed9f1550de902fe54a" integrity sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ== +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" @@ -5996,6 +6163,13 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + fetch-cookie@^0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.7.3.tgz#b8d023f421dd2b2f4a0eca9cd7318a967ed4eed8" @@ -6164,6 +6338,13 @@ follow-redirects@^1.14.8: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -6239,6 +6420,11 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" +fs-constants@^1.0.0: + version "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@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -6312,6 +6498,11 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -6331,6 +6522,15 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.1" +get-intrinsic@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" @@ -6353,7 +6553,7 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" -get-stream@^5.0.0: +get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== @@ -6468,6 +6668,13 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" +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" + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.8" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" @@ -6532,11 +6739,23 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + has-symbols@^1.0.1, has-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + has-tostringtag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" @@ -6898,6 +7117,14 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +https-proxy-agent@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + https-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" @@ -6947,7 +7174,7 @@ identity-obj-proxy@3.0.0: dependencies: harmony-reflect "^1.4.6" -ieee754@^1.1.4, ieee754@^1.2.1: +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== @@ -7127,7 +7354,7 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-arguments@^1.0.4: +is-arguments@^1.0.4, is-arguments@^1.1.0, is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -7184,6 +7411,11 @@ is-buffer@^2.0.0: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== +is-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" @@ -7229,7 +7461,7 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -7320,6 +7552,11 @@ is-in-browser@^1.0.2, is-in-browser@^1.1.3: resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -7423,6 +7660,11 @@ is-root@2.1.0: resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + is-shared-array-buffer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" @@ -7457,11 +7699,27 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" +is-typed-array@^1.1.10: + 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: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + is-weakref@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" @@ -7469,6 +7727,14 @@ is-weakref@^1.0.1: dependencies: call-bind "^1.0.0" +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -7496,6 +7762,11 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -8037,6 +8308,13 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsdom@^16.4.0: version "16.7.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" @@ -8569,6 +8847,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lz-string@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" + integrity sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ== + magic-string@^0.25.0, magic-string@^0.25.7: version "0.25.7" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" @@ -9289,6 +9572,11 @@ mixpanel-browser@^2.42.0: resolved "https://registry.yarnpkg.com/mixpanel-browser/-/mixpanel-browser-2.42.0.tgz#85c056577875f6624358bf0d7dcd13678c8277db" integrity sha512-9IC/+BYVIG3PfLn1ubkLsQdXc5dKot3sIXHf56GqssyLCOPPwlZfwhZqg1t8HC/sxGqLCL/HON3YbR7oiXMbeg== +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -9435,6 +9723,13 @@ node-fetch@2.6.1: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + node-fetch@^2.6.0: version "2.6.6" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" @@ -9627,7 +9922,7 @@ object-inspect@^1.12.2: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== -object-is@^1.0.1: +object-is@^1.0.1, object-is@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== @@ -9657,6 +9952,16 @@ object.assign@^4.1.0, object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + object.entries@^1.1.0, object.entries@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" @@ -10055,6 +10360,11 @@ pbkdf2@^3.0.3, pbkdf2@^3.1.2: safe-buffer "^5.0.1" sha.js "^2.4.8" +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -10884,6 +11194,15 @@ pretty-format@^26.0.0, pretty-format@^26.6.0, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + prism-themes@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/prism-themes/-/prism-themes-1.9.0.tgz#19c034f3205f1e28d75d89728e54ccd745f7e3dd" @@ -10904,7 +11223,7 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -progress@^2.0.0: +progress@2.0.3, progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -10973,6 +11292,11 @@ proxy-addr@~2.0.5: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-from-env@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -11040,6 +11364,33 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +puppeteer-core@19.4.1: + version "19.4.1" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-19.4.1.tgz#f4875943841ebdb6fc2ad7a475add958692b0237" + integrity sha512-JHIuqtqrUAx4jGOTxXu4ilapV2jabxtVMA/e4wwFUMvtSsqK4nVBSI+Z1SKDoz7gRy/JUIc8WzmfocCa6SIZ1w== + dependencies: + cross-fetch "3.1.5" + debug "4.3.4" + devtools-protocol "0.0.1068969" + extract-zip "2.0.1" + https-proxy-agent "5.0.1" + proxy-from-env "1.1.0" + rimraf "3.0.2" + tar-fs "2.1.1" + unbzip2-stream "1.4.3" + ws "8.11.0" + +puppeteer@^19.4.1: + version "19.4.1" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-19.4.1.tgz#cac7d3f0084badebb8ebacbe6f4d7262e7f21818" + integrity sha512-PCnrR13B8A+VSEDXRmrNXRZbrkF1tfsI1hKSC7vs13eNS6CUD3Y4FA8SF8/VZy+Pm1kg5AggJT2Nu3HLAtGkFg== + dependencies: + cosmiconfig "8.0.0" + https-proxy-agent "5.0.1" + progress "2.0.3" + proxy-from-env "1.1.0" + puppeteer-core "19.4.1" + q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -11446,7 +11797,7 @@ read-pkg@^5.2.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -11528,6 +11879,15 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: call-bind "^1.0.2" define-properties "^1.1.3" +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + regexpp@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" @@ -12845,6 +13205,27 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== +tar-fs@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + tar@^6.0.2: version "6.1.11" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" @@ -13228,6 +13609,14 @@ unbox-primitive@^1.0.1: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" +unbzip2-stream@1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -13843,11 +14232,33 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= +which-typed-array@^1.1.8: + 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, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -14083,6 +14494,11 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +ws@8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + ws@^6.0.0, ws@^6.2.1: version "6.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" @@ -14217,6 +14633,14 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From f0e846e3fcae3bc1e08b87db385ddc8bb29637b3 Mon Sep 17 00:00:00 2001 From: Manank Patni Date: Mon, 27 Mar 2023 06:10:57 +0530 Subject: [PATCH 03/11] Add test to workflow Signed-off-by: Manank Patni --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 7b721846f..621ec4d0e 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -41,4 +41,4 @@ jobs: # TO-DO: Uncomment when tests are ready to be run on CI (such as those in issues #129-#131) - name: Test - run: yarn test:ci + run: yarn test From dccb3c6126697bac6d8cf1cbf8a94bf8cd8f00f1 Mon Sep 17 00:00:00 2001 From: Manank Patni Date: Mon, 27 Mar 2023 06:42:02 +0530 Subject: [PATCH 04/11] Add base_url Signed-off-by: Manank Patni --- .github/workflows/ci.yaml | 6 +++--- src/tests/DAOCreate.test.tsx | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 621ec4d0e..3ea5c5fe3 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,6 +1,6 @@ name: continuous-integration -on: [push, pull_request] +on: [pull_request] jobs: CI: @@ -36,8 +36,8 @@ jobs: - name: Lint run: yarn run lint:ci - - name: Build - run: yarn run build + # - name: Build + # run: yarn run build # TO-DO: Uncomment when tests are ready to be run on CI (such as those in issues #129-#131) - name: Test diff --git a/src/tests/DAOCreate.test.tsx b/src/tests/DAOCreate.test.tsx index 31e45a9b9..77c7fc0c3 100644 --- a/src/tests/DAOCreate.test.tsx +++ b/src/tests/DAOCreate.test.tsx @@ -143,7 +143,7 @@ const setTezosSignerProvider = async (pk: string) => { // }, 5000000) it("shows a success message after submitting a form", async () => { - await page.goto(url + "/creator/dao") + await page.goto(process.env.BASE_URL + "/creator/dao") await page.waitForSelector(`input[name="governanceToken.address"]`) await page.click("#navbar-connect-wallet") From b829f6ae1cd65f91c2527f9e821462075e45a677 Mon Sep 17 00:00:00 2001 From: Manank Patni Date: Mon, 27 Mar 2023 07:08:02 +0530 Subject: [PATCH 05/11] Add run app Signed-off-by: Manank Patni --- .github/workflows/ci.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 3ea5c5fe3..856ebbb7e 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -40,5 +40,8 @@ jobs: # run: yarn run build # TO-DO: Uncomment when tests are ready to be run on CI (such as those in issues #129-#131) + - name: Run App + run: yarn run dev + - name: Test run: yarn test From 0af1350ece83a7f274e328a410693618afb6b88b Mon Sep 17 00:00:00 2001 From: Manank Patni Date: Mon, 27 Mar 2023 07:11:04 +0530 Subject: [PATCH 06/11] Run app in backgroun Signed-off-by: Manank Patni --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 856ebbb7e..08eabcd46 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -41,7 +41,7 @@ jobs: # TO-DO: Uncomment when tests are ready to be run on CI (such as those in issues #129-#131) - name: Run App - run: yarn run dev + run: yarn run dev & - name: Test run: yarn test From eccc55a5b36f76d3d1261a7c19f3264bbac5575e Mon Sep 17 00:00:00 2001 From: Manank Patni Date: Mon, 27 Mar 2023 07:13:13 +0530 Subject: [PATCH 07/11] Run app in background with url Signed-off-by: Manank Patni --- src/tests/DAOCreate.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/DAOCreate.test.tsx b/src/tests/DAOCreate.test.tsx index 77c7fc0c3..31e45a9b9 100644 --- a/src/tests/DAOCreate.test.tsx +++ b/src/tests/DAOCreate.test.tsx @@ -143,7 +143,7 @@ const setTezosSignerProvider = async (pk: string) => { // }, 5000000) it("shows a success message after submitting a form", async () => { - await page.goto(process.env.BASE_URL + "/creator/dao") + await page.goto(url + "/creator/dao") await page.waitForSelector(`input[name="governanceToken.address"]`) await page.click("#navbar-connect-wallet") From 4e0971c564c5ea75b352a092c92985c82f0cc87a Mon Sep 17 00:00:00 2001 From: Manank Patni Date: Mon, 27 Mar 2023 07:23:03 +0530 Subject: [PATCH 08/11] Add sleep Signed-off-by: Manank Patni --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 08eabcd46..745ac144c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -41,7 +41,7 @@ jobs: # TO-DO: Uncomment when tests are ready to be run on CI (such as those in issues #129-#131) - name: Run App - run: yarn run dev & + run: yarn run dev && sleep 15 & - name: Test run: yarn test From d2ab40c87b2c15bcd15bed16f82f4f7a22316806 Mon Sep 17 00:00:00 2001 From: Manank Patni Date: Mon, 27 Mar 2023 16:54:45 +0530 Subject: [PATCH 09/11] Add sleep to new line Signed-off-by: Manank Patni --- .github/workflows/ci.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 745ac144c..84646ac1a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -41,7 +41,8 @@ jobs: # TO-DO: Uncomment when tests are ready to be run on CI (such as those in issues #129-#131) - name: Run App - run: yarn run dev && sleep 15 & + run: yarn run dev & + sleep 20 - name: Test run: yarn test From e0681fcfa4e783e11cb793c27cd7efdcdd9a8431 Mon Sep 17 00:00:00 2001 From: Manank Patni Date: Mon, 27 Mar 2023 17:11:04 +0530 Subject: [PATCH 10/11] Add sleep to new line Signed-off-by: Manank Patni --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 84646ac1a..7012d50eb 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -42,7 +42,7 @@ jobs: # TO-DO: Uncomment when tests are ready to be run on CI (such as those in issues #129-#131) - name: Run App run: yarn run dev & - sleep 20 + sleep 30 - name: Test run: yarn test From 65da55747a39128199c1bb04b939e10d906d5edd Mon Sep 17 00:00:00 2001 From: Manank Patni Date: Mon, 27 Mar 2023 17:34:42 +0530 Subject: [PATCH 11/11] Add more sleep to new line Signed-off-by: Manank Patni --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 7012d50eb..b7ec16241 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -42,7 +42,7 @@ jobs: # TO-DO: Uncomment when tests are ready to be run on CI (such as those in issues #129-#131) - name: Run App run: yarn run dev & - sleep 30 + sleep 50 - name: Test run: yarn test