From 5c9b9542a5c03a889652d291864beefd76c5b1a9 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Fri, 2 Feb 2024 12:41:54 +0100 Subject: [PATCH 1/6] data layer reload (#2867) --- packages/data-layer/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/data-layer/package.json b/packages/data-layer/package.json index 9df4dee408..67bddd6aaa 100644 --- a/packages/data-layer/package.json +++ b/packages/data-layer/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { - "dev": "tsx watch -r dotenv-flow/config src/index.ts", + "dev": "tsc --watch", "lint": "eslint --cache --max-warnings=0", "lint:fix": "eslint --cache --max-warnings=0 --fix", "lint:all:fix": "eslint --fix --cache --max-warnings=0 src", From 4ea8eea196574192a52eb167a88107b553344de0 Mon Sep 17 00:00:00 2001 From: eagle Date: Fri, 2 Feb 2024 18:41:06 +0530 Subject: [PATCH 2/6] fetch Allo V1 programs from the indexer (#2844) * profile creation v2 wip wip lint builder add updateProfileMetadata rm unused things fix compile errors fix fix fix: builder startup f fix create profile profile creation updated test updated lock things remove unused packages upgrade manager ts to 5 update lockfile fix common deps address feedback update start data-layer for v2 add indexer param to data-layer update type for v2Project/add indexer update queries fix order of params fix test/todo: any type for return add queries.ts add queries file changes load project by id using data layer smol update update example env for builder some clean up update test fix merge conflict manually some merge fixes fetch projects from indexer added data-layer queries removed code comments rm log * todos and small fixes * push updated lock from conflict resolution * some updates on v2/v1 compatibility * adding comment * some updates to the queries * fix * fix * adding comments and clean up * fixed some tests * fix * comment out 2 tests * dispatch owner * smol test update * fix edit issue * fix tests * fix lint * fix not existing roles * rm logs * clean up logs/some inline docs * fix queries * clean * lint * changed endpoint * update env.example/fix * remove unused folder/fix * rounds.ts cleanup/fix * Update packages/builder/src/utils/test_utils.tsx Co-authored-by: Mohamed Boudra * update test utils/null check/fix * update version types/fix * update missing import * remove registry address from allo-v2 wrapper * wip/adding indexer getIndexedBlock * wip/working on placement * rm code * rm cached file * wait for indexer * rm cahed file and dependency * update lock * fix/update for gh username * update .env variable * feat: add fetch program queries * feat: add program type * feat: add getProgramsByUser * feat: replace subgraph query with indexer query in manager * fix: query issues * fix: query issues * fix: tests * fix: tests * chore: address feedback * chore: address engg feedback * chore: update env example --------- Co-authored-by: 0xKurt Co-authored-by: Jaxcoder Co-authored-by: Mohamed Boudra Co-authored-by: Aditya Anand M C --- packages/data-layer/src/data-layer.ts | 58 +++++- packages/data-layer/src/data.types.ts | 19 +- packages/data-layer/src/queries.ts | 63 ++++++ packages/round-manager/package.json | 1 + .../context/program/ReadProgramContext.tsx | 12 +- .../__tests__/CreateProgramContext.test.tsx | 5 + .../__tests__/ReadProgramContext.test.tsx | 5 + .../features/api/__tests__/program.test.ts | 61 +++--- .../round-manager/src/features/api/program.ts | 55 ++---- .../__tests__/CreateProgramPage.test.tsx | 6 + .../__tests__/ListProgramPage.test.tsx | 5 + .../__tests__/ViewProgramPage.test.tsx | 6 + packages/round-manager/src/index.tsx | 181 ++++++++++-------- pnpm-lock.yaml | 3 + 14 files changed, 327 insertions(+), 153 deletions(-) diff --git a/packages/data-layer/src/data-layer.ts b/packages/data-layer/src/data-layer.ts index b0974c6697..82536468ec 100644 --- a/packages/data-layer/src/data-layer.ts +++ b/packages/data-layer/src/data-layer.ts @@ -9,6 +9,7 @@ import * as legacy from "./backends/legacy"; import { AlloVersion, PaginationInfo } from "./data-layer.types"; import { Collection, + Program, ProjectEventsMap, Round, RoundOverview, @@ -23,6 +24,7 @@ import { SearchResult, } from "./openapi-search-client/index"; import { + getProgramsByUser, getProjectById, getProjects, getProjectsAndRolesByAddress, @@ -102,6 +104,56 @@ export class DataLayer { this.gsIndexerEndpoint = indexer.baseUrl; } + /** + * Allo v1 & v2 manager queries + */ + + /** + * Gets profiles/programs linked to an operator or user. + * + * @example + * Here is an example: + * ``` + * const program = await dataLayer.getProgramByUser({ + * address: "0x1234", + * chainId: 1, + * alloVersion: "allo-v1", + * }); + * ``` + * @param address - the address of the user. + * @param chainId - the network ID of the chain. + * @param alloVersion - the version of Allo to use. + * + * @returns Program + */ + async getProgramsByUser({ + address, + chainId, + alloVersion, + }: { + address: string; + chainId: number; + alloVersion: AlloVersion; + }): Promise<{ programs: Program[] } | null> { + const requestVariables = { + alloVersion, + address, + chainId, + }; + + const response: { projects: Program[] } = await request( + this.gsIndexerEndpoint, + getProgramsByUser, + requestVariables, + ); + + const programs = response.projects; + + if (!programs) return null; + + return { programs }; + } + /** * Allo v1 & v2 builder queries */ @@ -208,7 +260,7 @@ export class DataLayer { address: string; alloVersion: AlloVersion; chainId: number; - }): Promise { + }): Promise { const requestVariables = { address: address.toLowerCase(), version: alloVersion, @@ -221,9 +273,9 @@ export class DataLayer { requestVariables, ); - const projects = response.projects; + const projects: v2Project[] = response.projects; - if (projects.length === 0) return null; + if (projects.length === 0) return undefined; const projectEventsMap: ProjectEventsMap = {}; diff --git a/packages/data-layer/src/data.types.ts b/packages/data-layer/src/data.types.ts index b417050b68..7da2de3554 100644 --- a/packages/data-layer/src/data.types.ts +++ b/packages/data-layer/src/data.types.ts @@ -101,6 +101,23 @@ export type ProjectRole = { projectId: string; }; +export type Tags = "allo-v1" | "program update"; + +/** + * The program type for v1 + **/ + +export type Program = { + id: string; + chainId: number; + metadata: { + name: string; + }; + metadataCid?: MetadataPointer; + tags: Tags[]; + roles: AddressAndRole[]; +}; + /** * The project type for v2 * @@ -162,7 +179,7 @@ export type v2Project = { * * The tags are used to filter the projects based on the version of Allo. */ - tags: string[]; + tags: [string]; /** * The block the project was created at */ diff --git a/packages/data-layer/src/queries.ts b/packages/data-layer/src/queries.ts index d26da7e068..48c826d69b 100644 --- a/packages/data-layer/src/queries.ts +++ b/packages/data-layer/src/queries.ts @@ -1,5 +1,68 @@ import { gql } from "graphql-request"; +/** + * Get all the programs that a user is a part of + * @param $alloVersion - The version of Allo + * @param $address - The address of the user + * @param $chainId - The network ID of the chain + * + * @returns The programs + */ +export const getProgramsByUser = gql` + query ($address: String!, $chainId: Int!) { + projects( + filter: { + tags: { contains: "program" } + roles: { some: { address: { equalTo: $address } } } + and: { chainId: { equalTo: $chainId } } + } + ) { + id + chainId + metadata + metadataCid + tags + roles { + address + role + createdAtBlock + } + } + } +`; + +/** + * Get a program by its programId + * @param $alloVersion - The version of Allo + * @param $programId - The ID of the program + * @param $chainId - The network ID of the chain + * + * @returns The programs + */ +export const getProgramById = gql` + query ($alloVersion: [String!]!, $programId: String!, $chainId: Int!) { + projects( + filter: { + tags: { equalTo: $alloVersion } + tags: { contains: "program" } + id: { equalTo: $programId } + and: { chainId: { equalTo: $chainId } } + } + ) { + id + chainId + metadata + metadataCid + tags + roles { + address + role + createdAtBlock + } + } + } +`; + /** * Get a project by its ID * @param $alloVersion - The version of Allo diff --git a/packages/round-manager/package.json b/packages/round-manager/package.json index a64c66aca8..22b3553557 100644 --- a/packages/round-manager/package.json +++ b/packages/round-manager/package.json @@ -53,6 +53,7 @@ "allo-indexer-client": "github:gitcoinco/allo-indexer-client", "buffer": "^6.0.3", "common": "workspace:*", + "data-layer": "workspace:*", "crypto-browserify": "^3.12.0", "csv-parse": "^5.3.8", "csv-stringify": "^6.3.2", diff --git a/packages/round-manager/src/context/program/ReadProgramContext.tsx b/packages/round-manager/src/context/program/ReadProgramContext.tsx index 3a5d79d4a5..9a9e7a8522 100644 --- a/packages/round-manager/src/context/program/ReadProgramContext.tsx +++ b/packages/round-manager/src/context/program/ReadProgramContext.tsx @@ -8,6 +8,7 @@ import { useWallet } from "../../features/common/Auth"; import { getProgramById, listPrograms } from "../../features/api/program"; import { datadogLogs } from "@datadog/browser-logs"; import { Web3Provider } from "@ethersproject/providers"; +import { DataLayer, useDataLayer } from "data-layer"; export interface ReadProgramState { programs: Program[]; @@ -45,6 +46,7 @@ export const ReadProgramContext = createContext(undefined); const fetchProgramsByAddress = async ( dispatch: Dispatch, address: string, + dataLayer: DataLayer, walletProvider: Web3Instance["provider"] ) => { datadogLogs.logger.info(`fetchProgramsByAddress: address - ${address}`); @@ -54,7 +56,7 @@ const fetchProgramsByAddress = async ( payload: ProgressStatus.IN_PROGRESS, }); try { - const programs = await listPrograms(address, walletProvider); + const programs = await listPrograms(address, walletProvider, dataLayer); dispatch({ type: ActionType.SET_PROGRAMS, payload: programs }); dispatch({ type: ActionType.SET_FETCH_PROGRAM_STATUS, @@ -149,9 +151,15 @@ export const usePrograms = (): ReadProgramState & { dispatch: Dispatch } => { } const { address, provider: walletProvider } = useWallet(); + const dataLayer = useDataLayer(); useEffect(() => { - fetchProgramsByAddress(context.dispatch, address, walletProvider); + fetchProgramsByAddress( + context.dispatch, + address.toLowerCase(), + dataLayer, + walletProvider + ); }, [address, walletProvider]); // eslint-disable-line react-hooks/exhaustive-deps return { ...context.state, dispatch: context.dispatch }; diff --git a/packages/round-manager/src/context/program/__tests__/CreateProgramContext.test.tsx b/packages/round-manager/src/context/program/__tests__/CreateProgramContext.test.tsx index 5d7872a37f..a0c54cc7de 100644 --- a/packages/round-manager/src/context/program/__tests__/CreateProgramContext.test.tsx +++ b/packages/round-manager/src/context/program/__tests__/CreateProgramContext.test.tsx @@ -28,6 +28,11 @@ jest.mock("wagmi"); jest.mock("@rainbow-me/rainbowkit", () => ({ ConnectButton: jest.fn(), })); +jest.mock("data-layer", () => ({ + useDataLayer: () => ({ + getProgramsByUser: jest.fn(), + }), +})); describe("", () => { beforeEach(() => { diff --git a/packages/round-manager/src/context/program/__tests__/ReadProgramContext.test.tsx b/packages/round-manager/src/context/program/__tests__/ReadProgramContext.test.tsx index 6ddd5b4865..a96032a755 100644 --- a/packages/round-manager/src/context/program/__tests__/ReadProgramContext.test.tsx +++ b/packages/round-manager/src/context/program/__tests__/ReadProgramContext.test.tsx @@ -25,6 +25,11 @@ jest.mock("wagmi"); jest.mock("@rainbow-me/rainbowkit", () => ({ ConnectButton: jest.fn(), })); +jest.mock("data-layer", () => ({ + useDataLayer: () => ({ + getProgramsByUser: jest.fn(), + }), +})); describe("", () => { beforeEach(() => { diff --git a/packages/round-manager/src/features/api/__tests__/program.test.ts b/packages/round-manager/src/features/api/__tests__/program.test.ts index df83533c1b..94a9bd9622 100644 --- a/packages/round-manager/src/features/api/__tests__/program.test.ts +++ b/packages/round-manager/src/features/api/__tests__/program.test.ts @@ -15,46 +15,43 @@ jest.mock("common", () => ({ graphql_fetch: jest.fn(), })); +jest.mock("data-layer", () => ({ + DataLayer: jest.fn().mockImplementation(() => ({ + getProgramsByUser: jest.fn().mockResolvedValue({ + programs: [], + }), + })), +})); + describe("listPrograms", () => { - it("calls the graphql endpoint and maps the metadata from IPFS", async () => { + it("calls the indexer endpoint", async () => { // const address = "0x0" const expectedProgram = makeProgramData({ chain: CHAINS[ChainId.MAINNET], }); const expectedPrograms: Program[] = [expectedProgram]; - (graphql_fetch as jest.Mock).mockResolvedValue({ - data: { - programs: [ - { - id: expectedProgram.id, - roles: [ - { - accounts: [ - { - address: expectedProgram.operatorWallets[0], - }, - ], + + const actualPrograms = await listPrograms( + "0x0", + { + getNetwork: async () => + // @ts-expect-error Test file + Promise.resolve({ chainId: ChainId.MAINNET }), + }, + { + getProgramsByUser: jest.fn().mockResolvedValue({ + programs: [ + { + id: expectedProgram.id, + roles: [{ address: expectedProgram.operatorWallets[0] }], + metadata: { + name: expectedProgram.metadata?.name, }, - ], - metaPtr: { - protocol: 1, - pointer: - "uwijkhxkpkdgkszraqzqvhssqulctxzvntxwconznfkelzbtgtqysrzkehl", }, - }, - ], - }, - }); - - (fetchFromIPFS as jest.Mock).mockResolvedValue({ - name: expectedProgram.metadata?.name, - }); - - const actualPrograms = await listPrograms("0x0", { - getNetwork: async () => - // @ts-expect-error Test file - Promise.resolve({ chainId: ChainId.MAINNET }), - }); + ], + }), + } + ); expect(actualPrograms).toEqual(expectedPrograms); }); diff --git a/packages/round-manager/src/features/api/program.ts b/packages/round-manager/src/features/api/program.ts index ceaee4d983..056316ca09 100644 --- a/packages/round-manager/src/features/api/program.ts +++ b/packages/round-manager/src/features/api/program.ts @@ -5,6 +5,8 @@ import { ethers } from "ethers"; import { datadogLogs } from "@datadog/browser-logs"; import { Signer } from "@ethersproject/abstract-signer"; import { ChainId, graphql_fetch } from "common"; +import { DataLayer } from "data-layer"; +import { getConfig } from "common/src/config"; /** * Fetch a list of programs @@ -14,7 +16,8 @@ import { ChainId, graphql_fetch } from "common"; */ export async function listPrograms( address: string, - signerOrProvider: Web3Instance["provider"] + signerOrProvider: Web3Instance["provider"], + dataLayer: DataLayer ): Promise { try { // fetch chain id @@ -22,44 +25,28 @@ export async function listPrograms( chainId: ChainId; }; - // get the subgraph for all programs owned by the given address - const res = await graphql_fetch( - ` - query GetPrograms($address: String!) { - programs(where: { - accounts_: { - address: $address - } - }) { - id - metaPtr { - protocol - pointer - } - roles(where: { - role: "0xaa630204f2780b6f080cc77cc0e9c0a5c21e92eb0c6771e709255dd27d6de132" - }) { - accounts { - address - } - } - } - } - `, - chainId, - { address: address.toLowerCase() } - ); + const config = getConfig(); - const programs: Program[] = []; + // fetch programs from indexer + + const programsRes = await dataLayer.getProgramsByUser({ + address: address, + chainId: chainId, + alloVersion: config.allo.version, + }); - for (const program of res.data.programs) { - const metadata = await fetchFromIPFS(program.metaPtr.pointer); + if (!programsRes) { + throw Error("Unable to fetch programs"); + } + + const programs: Program[] = []; + for (const program of programsRes.programs) { programs.push({ id: program.id, - metadata, - operatorWallets: program.roles[0].accounts.map( - (account: { address: string }) => account.address + metadata: program.metadata, + operatorWallets: program.roles.map( + (role: { address: string }) => role.address ), chain: { id: chainId, diff --git a/packages/round-manager/src/features/program/__tests__/CreateProgramPage.test.tsx b/packages/round-manager/src/features/program/__tests__/CreateProgramPage.test.tsx index c850d5e249..5aaff16fbd 100644 --- a/packages/round-manager/src/features/program/__tests__/CreateProgramPage.test.tsx +++ b/packages/round-manager/src/features/program/__tests__/CreateProgramPage.test.tsx @@ -28,6 +28,12 @@ jest.mock("../../../constants", () => ({ errorModalDelayMs: 0, // NB: use smaller delay for faster tests })); +jest.mock("data-layer", () => ({ + useDataLayer: () => ({ + getProgramsByUser: jest.fn(), + }), +})); + describe("", () => { let consoleErrorSpy: jest.SpyInstance; diff --git a/packages/round-manager/src/features/program/__tests__/ListProgramPage.test.tsx b/packages/round-manager/src/features/program/__tests__/ListProgramPage.test.tsx index 928f24c351..4b0f2f4cfb 100644 --- a/packages/round-manager/src/features/program/__tests__/ListProgramPage.test.tsx +++ b/packages/round-manager/src/features/program/__tests__/ListProgramPage.test.tsx @@ -14,6 +14,11 @@ jest.mock("wagmi"); jest.mock("@rainbow-me/rainbowkit", () => ({ ConnectButton: jest.fn(), })); +jest.mock("data-layer", () => ({ + useDataLayer: () => ({ + getProgramsByUser: jest.fn(), + }), +})); describe("", () => { it("does not render a list of programs when no programs have been created", () => { diff --git a/packages/round-manager/src/features/program/__tests__/ViewProgramPage.test.tsx b/packages/round-manager/src/features/program/__tests__/ViewProgramPage.test.tsx index 80f535a5ad..0b97446b67 100644 --- a/packages/round-manager/src/features/program/__tests__/ViewProgramPage.test.tsx +++ b/packages/round-manager/src/features/program/__tests__/ViewProgramPage.test.tsx @@ -26,6 +26,12 @@ jest.mock("react-router-dom", () => ({ useParams: useParamsFn, })); +jest.mock("data-layer", () => ({ + useDataLayer: () => ({ + getProgramsByUser: jest.fn(), + }), +})); + describe("", () => { let stubProgram: Program; diff --git a/packages/round-manager/src/index.tsx b/packages/round-manager/src/index.tsx index b919206e1a..56317659a8 100644 --- a/packages/round-manager/src/index.tsx +++ b/packages/round-manager/src/index.tsx @@ -34,6 +34,8 @@ import ViewApplication from "./features/round/ViewApplicationPage"; import ViewRoundPage from "./features/round/ViewRoundPage"; import { initSentry } from "./sentry"; import { UpdateRoundProvider } from "./context/round/UpdateRoundContext"; +import { DataLayer, DataLayerProvider } from "data-layer"; +import { getConfig } from "common/src/config"; // Initialize sentry initSentry(); @@ -48,96 +50,113 @@ const root = ReactDOM.createRoot( document.getElementById("root") as HTMLElement ); +const dataLayerConfig = new DataLayer({ + search: { + baseUrl: getConfig().dataLayer.searchServiceBaseUrl, + pagination: { + pageSize: 50, + }, + }, + subgraph: { + endpointsByChainId: getConfig().dataLayer.subgraphEndpoints, + }, + indexer: { + baseUrl: `${getConfig().dataLayer.gsIndexerEndpoint}/graphql`, + }, +}); + root.render( - - - {/* Protected Routes */} - }> - {/* Default Route */} - - - - } - /> - - {/* Round Routes */} - - - - - - } - /> - - - - - - - - - - - - - - - - } - /> - - - - - - - - } - /> + + + + {/* Protected Routes */} + }> + {/* Default Route */} + + + + } + /> - {/* Program Routes */} - - - - } - /> - + {/* Round Routes */} + - + + + - - } - /> + } + /> + + + + + + + + + + + + + + + + } + /> + + + + + + + + } + /> + + {/* Program Routes */} + + + + } + /> + + + + + + } + /> - {/* Access Denied */} - } /> + {/* Access Denied */} + } /> - {/* 404 */} - } /> - - - + {/* 404 */} + } /> + + + + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0f67d12055..c8741acc43 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -963,6 +963,9 @@ importers: csv-stringify: specifier: ^6.3.2 version: 6.4.2 + data-layer: + specifier: workspace:* + version: link:../data-layer date-fns: specifier: ^2.29.3 version: 2.30.0 From ef026410fae80769f924da37e4f5e51ff5820a6d Mon Sep 17 00:00:00 2001 From: eagle Date: Fri, 2 Feb 2024 20:18:08 +0530 Subject: [PATCH 3/6] create a round on allo V1 using allo wrapper in manager (#2826) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * profile creation v2 * wip * wip * lint builder * add updateProfileMetadata * rm unused * things * fix compile errors * fix * fix * fix: builder startup * f * fix * create profile * profile creation * updated test * updated lock * fixed chainId error * fix test * things * fix: esbuild error * common to output commonjs * remove unused packages * upgrade manager ts to 5 * update lockfile * fix common deps * address feedback * update * feat: add allo contract abi * feat: add createRound to allo interface * feat: update allo-v1 and allo-v2 backend * add round manager types to common * update createRound * wip: migrate round creation in allo v1 Co-authored-by: bhargavaparoksham * wip: migrate round creation in allo v1 Co-authored-by: Atris * feat: create round on allo v1ˆ * wip: create round on allo v1 * feat: move allo wrapper to common * fix: builder tests * feat: create round store * wip: wip * wip: updates * wip: clone alloprovider to RMˆ * fix: circular dep and other bugsˆ * fix: creating rounds * fix: test * fix: create round tests * fix: temporarily fix build by not using bigint literals * fix: dg rounds, add synpressˆ * fix: round program and operatorsˆ * fix: don't crash the page on invalid roundsˆ * fix: typesˆ * chore: remove synpressˆ * chore: update pnpm lock and remove stray line in package.jsonˆ * fix: fix redirect bug fix bug where we auto-redirected the user back to program in the last round form due to not clearing the statuses upon successful round deployment * fix: conflictsˆ * fix: lints * fix: lints * fix: lintsˆ * Update packages/common/src/AlloWrapper.tsx Co-authored-by: Mohamed Boudra * fix: review comments * chore: merge --------- Co-authored-by: 0xKurt Co-authored-by: Aditya Anand M C Co-authored-by: Mohamed Boudra Co-authored-by: Atris --- packages/builder/craco.config.js | 7 + packages/builder/src/index.tsx | 6 +- packages/builder/src/utils/test_utils.tsx | 2 + packages/builder/tsconfig.json | 2 +- packages/common/package.json | 1 + packages/common/src/AlloWrapper.tsx | 53 + packages/common/src/allo/abis/allo-v2/Allo.ts | 1381 +++++++++++++++ packages/common/src/allo/addresses/allo-v1.ts | 182 ++ packages/common/src/allo/allo.ts | 31 +- .../common/src/allo/backends/allo-v1.test.ts | 13 +- packages/common/src/allo/backends/allo-v1.ts | 287 ++- .../common/src/allo/backends/allo-v2.test.ts | 3 +- packages/common/src/allo/backends/allo-v2.ts | 30 +- .../common/src/allo/backends/test-utils.ts | 2 +- packages/common/src/allo/common.ts | 2 - packages/common/src/allo/indexer.ts | 2 +- .../common/src/allo/transaction-sender.ts | 10 +- packages/common/src/chain-ids.ts | 18 + packages/common/src/graphql_fetch.ts | 73 + packages/common/src/index.ts | 132 +- packages/common/src/payoutTokens.ts | 399 +++++ packages/common/src/types.ts | 59 + packages/common/tsconfig.json | 1 - packages/data-layer/src/data.types.ts | 12 +- .../grant-explorer/src/features/api/utils.ts | 7 +- packages/round-manager/craco.config.js | 4 +- packages/round-manager/package.json | 7 +- .../src/context/round/CreateRoundContext.tsx | 363 ---- .../__tests__/CreateRoundContext.test.tsx | 449 ----- .../src/features/api}/AlloWrapper.tsx | 8 +- .../src/features/api/deployments.ts | 104 ++ .../src/features/api/payoutTokens.ts | 3 +- .../round-manager/src/features/api/round.ts | 4 + .../__tests__/AddQuestionModal.test.tsx | 20 +- .../features/round/RoundApplicationForm.tsx | 116 +- .../__tests__/RoundApplicationForm.test.tsx | 83 +- packages/round-manager/src/index.tsx | 168 +- .../src/stores/createRoundStore.ts | 112 ++ packages/round-manager/tsconfig.json | 2 +- pnpm-lock.yaml | 1561 ++++++++--------- 40 files changed, 3688 insertions(+), 2031 deletions(-) create mode 100644 packages/common/src/AlloWrapper.tsx create mode 100644 packages/common/src/allo/abis/allo-v2/Allo.ts create mode 100644 packages/common/src/allo/addresses/allo-v1.ts create mode 100644 packages/common/src/graphql_fetch.ts create mode 100644 packages/common/src/payoutTokens.ts create mode 100644 packages/common/src/types.ts delete mode 100644 packages/round-manager/src/context/round/CreateRoundContext.tsx delete mode 100644 packages/round-manager/src/context/round/__tests__/CreateRoundContext.test.tsx rename packages/{builder/src/components => round-manager/src/features/api}/AlloWrapper.tsx (91%) create mode 100644 packages/round-manager/src/features/api/deployments.ts create mode 100644 packages/round-manager/src/stores/createRoundStore.ts diff --git a/packages/builder/craco.config.js b/packages/builder/craco.config.js index 8d34c573d3..7406ac9dec 100644 --- a/packages/builder/craco.config.js +++ b/packages/builder/craco.config.js @@ -69,6 +69,13 @@ module.exports = { options: { includePaths: [path.join(__dirname, `../common/src`)], skipEsbuildJest: true, + esbuildLoaderOptions: { + loader: "tsx", // Set the value to 'tsx' if you use typescript + target: "es2020", + }, + esbuildMinimizerOptions: { + target: "es2020", + }, }, }, ], diff --git a/packages/builder/src/index.tsx b/packages/builder/src/index.tsx index 14a3790814..7831e050b9 100644 --- a/packages/builder/src/index.tsx +++ b/packages/builder/src/index.tsx @@ -1,7 +1,7 @@ import { ChakraProvider } from "@chakra-ui/react"; import { datadogRum } from "@datadog/browser-rum"; import { ReduxRouter } from "@lagunovsky/redux-react-router"; -import { RainbowKitProvider, lightTheme } from "@rainbow-me/rainbowkit"; +import { lightTheme, RainbowKitProvider } from "@rainbow-me/rainbowkit"; import "@rainbow-me/rainbowkit/styles.css"; import { getConfig } from "common/src/config"; import { DataLayer, DataLayerProvider } from "data-layer"; @@ -9,8 +9,8 @@ import ReactDOM from "react-dom/client"; import { Provider } from "react-redux"; import { Navigate, Route, Routes } from "react-router"; import { WagmiConfig } from "wagmi"; +import AlloWrapper from "common/src/AlloWrapper"; import "./browserPatches"; -import AlloWrapper from "./components/AlloWrapper"; import ErrorBoundary from "./components/ErrorBoundary"; import Layout from "./components/Layout"; import PageNotFound from "./components/base/PageNotFound"; @@ -26,9 +26,9 @@ import reportWebVitals from "./reportWebVitals"; import { slugs } from "./routes"; import setupStore from "./store"; import "./styles/index.css"; -import initTagmanager from "./tagmanager"; import initDatadog from "./utils/datadog"; import wagmiClient, { chains } from "./utils/wagmi"; +import initTagmanager from "./tagmanager"; const dataLayerConfig = new DataLayer({ search: { diff --git a/packages/builder/src/utils/test_utils.tsx b/packages/builder/src/utils/test_utils.tsx index 6fd33db74a..54ec28c22f 100644 --- a/packages/builder/src/utils/test_utils.tsx +++ b/packages/builder/src/utils/test_utils.tsx @@ -6,6 +6,7 @@ import { AlloProvider, AlloV2, createMockTransactionSender } from "common"; import { DataLayer, DataLayerProvider } from "data-layer"; import { ethers } from "ethers"; import { Provider } from "react-redux"; +import { zeroAddress } from "viem"; import history from "../history"; import setupStore from "../store"; import { FormInputs, Metadata, Round } from "../types"; @@ -116,6 +117,7 @@ const alloBackend = new AlloV2({ }), waitUntilIndexerSynced: async () => Promise.resolve(BigInt(1)), transactionSender: createMockTransactionSender(), + allo: zeroAddress, }); // todo: introduce mock data layer? diff --git a/packages/builder/tsconfig.json b/packages/builder/tsconfig.json index 3938073c39..5d36adfab3 100644 --- a/packages/builder/tsconfig.json +++ b/packages/builder/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es5", + "target": "es2020", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, diff --git a/packages/common/package.json b/packages/common/package.json index d3ccb4d50c..d3d0b2352d 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -16,6 +16,7 @@ "dependencies": { "@allo-team/allo-v2-sdk": "^1.0.38", "@ethersproject/providers": "^5.7.2", + "@ethersproject/abstract-signer": "^5.7.0", "@rainbow-me/rainbowkit": "^0.12.16", "@wagmi/chains": "^1.8.0", "abitype": "^0.10.3", diff --git a/packages/common/src/AlloWrapper.tsx b/packages/common/src/AlloWrapper.tsx new file mode 100644 index 0000000000..d2cb2bfc12 --- /dev/null +++ b/packages/common/src/AlloWrapper.tsx @@ -0,0 +1,53 @@ +import { useEffect, useState } from "react"; +import { + Allo, + // AlloV2, + AlloProvider, + createPinataIpfsUploader, + waitForSubgraphSyncTo, + createEthersTransactionSender, + AlloV1, +} from "./"; +import { useNetwork, useProvider, useSigner } from "wagmi"; +import { getConfig } from "./config"; + +function AlloWrapper({ children }: { children: JSX.Element | JSX.Element[] }) { + const { chain } = useNetwork(); + const web3Provider = useProvider(); + const { data: signer } = useSigner(); + const chainID = chain?.id; + + const [backend, setBackend] = useState(null); + + useEffect(() => { + if (!web3Provider || !signer || !chainID) { + setBackend(null); + } else { + // const alloBackend: Allo = new AlloV2({ + // chainId: chainID, + // transactionSender: createEthersTransactionSender(signer, web3Provider), + // ipfsUploader: createPinataIpfsUploader({ + // token: getConfig().pinata.jwt, + // endpoint: `${getConfig().pinata.baseUrl}/pinning/pinFileToIPFS`, + // }), + // waitUntilIndexerSynced: waitForSubgraphSyncTo, + // }); + + const alloBackend: Allo = new AlloV1({ + chainId: chainID, + transactionSender: createEthersTransactionSender(signer, web3Provider), + ipfsUploader: createPinataIpfsUploader({ + token: getConfig().pinata.jwt, + endpoint: `${getConfig().pinata.baseUrl}/pinning/pinFileToIPFS`, + }), + waitUntilIndexerSynced: waitForSubgraphSyncTo, + }); + + setBackend(alloBackend); + } + }, [web3Provider, signer, chainID]); + + return {children}; +} + +export default AlloWrapper; diff --git a/packages/common/src/allo/abis/allo-v2/Allo.ts b/packages/common/src/allo/abis/allo-v2/Allo.ts new file mode 100644 index 0000000000..9ad14d9891 --- /dev/null +++ b/packages/common/src/allo/abis/allo-v2/Allo.ts @@ -0,0 +1,1381 @@ +export default [ + { + inputs: [], + name: "ALLOCATION_ACTIVE", + type: "error", + }, + { + inputs: [], + name: "ALLOCATION_NOT_ACTIVE", + type: "error", + }, + { + inputs: [], + name: "ALLOCATION_NOT_ENDED", + type: "error", + }, + { + inputs: [], + name: "ALREADY_INITIALIZED", + type: "error", + }, + { + inputs: [], + name: "AMOUNT_MISMATCH", + type: "error", + }, + { + inputs: [], + name: "ANCHOR_ERROR", + type: "error", + }, + { + inputs: [], + name: "ARRAY_MISMATCH", + type: "error", + }, + { + inputs: [], + name: "INVALID", + type: "error", + }, + { + inputs: [], + name: "INVALID_ADDRESS", + type: "error", + }, + { + inputs: [], + name: "INVALID_FEE", + type: "error", + }, + { + inputs: [], + name: "INVALID_METADATA", + type: "error", + }, + { + inputs: [], + name: "INVALID_REGISTRATION", + type: "error", + }, + { + inputs: [], + name: "IS_APPROVED_STRATEGY", + type: "error", + }, + { + inputs: [], + name: "MISMATCH", + type: "error", + }, + { + inputs: [], + name: "NONCE_NOT_AVAILABLE", + type: "error", + }, + { + inputs: [], + name: "NOT_APPROVED_STRATEGY", + type: "error", + }, + { + inputs: [], + name: "NOT_ENOUGH_FUNDS", + type: "error", + }, + { + inputs: [], + name: "NOT_IMPLEMENTED", + type: "error", + }, + { + inputs: [], + name: "NOT_INITIALIZED", + type: "error", + }, + { + inputs: [], + name: "NOT_PENDING_OWNER", + type: "error", + }, + { + inputs: [], + name: "NewOwnerIsZeroAddress", + type: "error", + }, + { + inputs: [], + name: "NoHandoverRequest", + type: "error", + }, + { + inputs: [], + name: "POOL_ACTIVE", + type: "error", + }, + { + inputs: [], + name: "POOL_INACTIVE", + type: "error", + }, + { + inputs: [], + name: "RECIPIENT_ALREADY_ACCEPTED", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "recipientId", + type: "address", + }, + ], + name: "RECIPIENT_ERROR", + type: "error", + }, + { + inputs: [], + name: "RECIPIENT_NOT_ACCEPTED", + type: "error", + }, + { + inputs: [], + name: "REGISTRATION_NOT_ACTIVE", + type: "error", + }, + { + inputs: [], + name: "UNAUTHORIZED", + type: "error", + }, + { + inputs: [], + name: "Unauthorized", + type: "error", + }, + { + inputs: [], + name: "ZERO_ADDRESS", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "poolId", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "BaseFeePaid", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "baseFee", + type: "uint256", + }, + ], + name: "BaseFeeUpdated", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint8", + name: "version", + type: "uint8", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "pendingOwner", + type: "address", + }, + ], + name: "OwnershipHandoverCanceled", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "pendingOwner", + type: "address", + }, + ], + name: "OwnershipHandoverRequested", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "oldOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "percentFee", + type: "uint256", + }, + ], + name: "PercentFeeUpdated", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "poolId", + type: "uint256", + }, + { + indexed: true, + internalType: "bytes32", + name: "profileId", + type: "bytes32", + }, + { + indexed: false, + internalType: "contract IStrategy", + name: "strategy", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + { + components: [ + { + internalType: "uint256", + name: "protocol", + type: "uint256", + }, + { + internalType: "string", + name: "pointer", + type: "string", + }, + ], + indexed: false, + internalType: "struct Metadata", + name: "metadata", + type: "tuple", + }, + ], + name: "PoolCreated", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "poolId", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "fee", + type: "uint256", + }, + ], + name: "PoolFunded", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "poolId", + type: "uint256", + }, + { + components: [ + { + internalType: "uint256", + name: "protocol", + type: "uint256", + }, + { + internalType: "string", + name: "pointer", + type: "string", + }, + ], + indexed: false, + internalType: "struct Metadata", + name: "metadata", + type: "tuple", + }, + ], + name: "PoolMetadataUpdated", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "registry", + type: "address", + }, + ], + name: "RegistryUpdated", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "bytes32", + name: "previousAdminRole", + type: "bytes32", + }, + { + indexed: true, + internalType: "bytes32", + name: "newAdminRole", + type: "bytes32", + }, + ], + name: "RoleAdminChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "RoleGranted", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "RoleRevoked", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "strategy", + type: "address", + }, + ], + name: "StrategyApproved", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "strategy", + type: "address", + }, + ], + name: "StrategyRemoved", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "treasury", + type: "address", + }, + ], + name: "TreasuryUpdated", + type: "event", + }, + { + inputs: [], + name: "DEFAULT_ADMIN_ROLE", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "NATIVE", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_poolId", + type: "uint256", + }, + { + internalType: "address", + name: "_manager", + type: "address", + }, + ], + name: "addPoolManager", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_strategy", + type: "address", + }, + ], + name: "addToCloneableStrategies", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_poolId", + type: "uint256", + }, + { + internalType: "bytes", + name: "_data", + type: "bytes", + }, + ], + name: "allocate", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256[]", + name: "_poolIds", + type: "uint256[]", + }, + { + internalType: "bytes[]", + name: "_datas", + type: "bytes[]", + }, + ], + name: "batchAllocate", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256[]", + name: "_poolIds", + type: "uint256[]", + }, + { + internalType: "bytes[]", + name: "_data", + type: "bytes[]", + }, + ], + name: "batchRegisterRecipient", + outputs: [ + { + internalType: "address[]", + name: "recipientIds", + type: "address[]", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "cancelOwnershipHandover", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "pendingOwner", + type: "address", + }, + ], + name: "completeOwnershipHandover", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "_profileId", + type: "bytes32", + }, + { + internalType: "address", + name: "_strategy", + type: "address", + }, + { + internalType: "bytes", + name: "_initStrategyData", + type: "bytes", + }, + { + internalType: "address", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_amount", + type: "uint256", + }, + { + components: [ + { + internalType: "uint256", + name: "protocol", + type: "uint256", + }, + { + internalType: "string", + name: "pointer", + type: "string", + }, + ], + internalType: "struct Metadata", + name: "_metadata", + type: "tuple", + }, + { + internalType: "address[]", + name: "_managers", + type: "address[]", + }, + ], + name: "createPool", + outputs: [ + { + internalType: "uint256", + name: "poolId", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "_profileId", + type: "bytes32", + }, + { + internalType: "address", + name: "_strategy", + type: "address", + }, + { + internalType: "bytes", + name: "_initStrategyData", + type: "bytes", + }, + { + internalType: "address", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_amount", + type: "uint256", + }, + { + components: [ + { + internalType: "uint256", + name: "protocol", + type: "uint256", + }, + { + internalType: "string", + name: "pointer", + type: "string", + }, + ], + internalType: "struct Metadata", + name: "_metadata", + type: "tuple", + }, + { + internalType: "address[]", + name: "_managers", + type: "address[]", + }, + ], + name: "createPoolWithCustomStrategy", + outputs: [ + { + internalType: "uint256", + name: "poolId", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_poolId", + type: "uint256", + }, + { + internalType: "address[]", + name: "_recipientIds", + type: "address[]", + }, + { + internalType: "bytes", + name: "_data", + type: "bytes", + }, + ], + name: "distribute", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_poolId", + type: "uint256", + }, + { + internalType: "uint256", + name: "_amount", + type: "uint256", + }, + ], + name: "fundPool", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [], + name: "getBaseFee", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getFeeDenominator", + outputs: [ + { + internalType: "uint256", + name: "FEE_DENOMINATOR", + type: "uint256", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "getPercentFee", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_poolId", + type: "uint256", + }, + ], + name: "getPool", + outputs: [ + { + components: [ + { + internalType: "bytes32", + name: "profileId", + type: "bytes32", + }, + { + internalType: "contract IStrategy", + name: "strategy", + type: "address", + }, + { + internalType: "address", + name: "token", + type: "address", + }, + { + components: [ + { + internalType: "uint256", + name: "protocol", + type: "uint256", + }, + { + internalType: "string", + name: "pointer", + type: "string", + }, + ], + internalType: "struct Metadata", + name: "metadata", + type: "tuple", + }, + { + internalType: "bytes32", + name: "managerRole", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "adminRole", + type: "bytes32", + }, + ], + internalType: "struct IAllo.Pool", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getRegistry", + outputs: [ + { + internalType: "contract IRegistry", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + ], + name: "getRoleAdmin", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_poolId", + type: "uint256", + }, + ], + name: "getStrategy", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getTreasury", + outputs: [ + { + internalType: "address payable", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "grantRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "hasRole", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + internalType: "address", + name: "_registry", + type: "address", + }, + { + internalType: "address payable", + name: "_treasury", + type: "address", + }, + { + internalType: "uint256", + name: "_percentFee", + type: "uint256", + }, + { + internalType: "uint256", + name: "_baseFee", + type: "uint256", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_strategy", + type: "address", + }, + ], + name: "isCloneableStrategy", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_poolId", + type: "uint256", + }, + { + internalType: "address", + name: "_address", + type: "address", + }, + ], + name: "isPoolAdmin", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_poolId", + type: "uint256", + }, + { + internalType: "address", + name: "_address", + type: "address", + }, + ], + name: "isPoolManager", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "result", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "pendingOwner", + type: "address", + }, + ], + name: "ownershipHandoverExpiresAt", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_token", + type: "address", + }, + { + internalType: "address", + name: "_recipient", + type: "address", + }, + ], + name: "recoverFunds", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_poolId", + type: "uint256", + }, + { + internalType: "bytes", + name: "_data", + type: "bytes", + }, + ], + name: "registerRecipient", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_strategy", + type: "address", + }, + ], + name: "removeFromCloneableStrategies", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_poolId", + type: "uint256", + }, + { + internalType: "address", + name: "_manager", + type: "address", + }, + ], + name: "removePoolManager", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "renounceRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "requestOwnershipHandover", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "revokeRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes4", + name: "interfaceId", + type: "bytes4", + }, + ], + name: "supportsInterface", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_baseFee", + type: "uint256", + }, + ], + name: "updateBaseFee", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_percentFee", + type: "uint256", + }, + ], + name: "updatePercentFee", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_poolId", + type: "uint256", + }, + { + components: [ + { + internalType: "uint256", + name: "protocol", + type: "uint256", + }, + { + internalType: "string", + name: "pointer", + type: "string", + }, + ], + internalType: "struct Metadata", + name: "_metadata", + type: "tuple", + }, + ], + name: "updatePoolMetadata", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_registry", + type: "address", + }, + ], + name: "updateRegistry", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address payable", + name: "_treasury", + type: "address", + }, + ], + name: "updateTreasury", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +] as const; diff --git a/packages/common/src/allo/addresses/allo-v1.ts b/packages/common/src/allo/addresses/allo-v1.ts new file mode 100644 index 0000000000..1aa41229e4 --- /dev/null +++ b/packages/common/src/allo/addresses/allo-v1.ts @@ -0,0 +1,182 @@ +import { ChainId } from "../../chain-ids"; +import { Address } from "viem"; + +/** + * This file contains all contract definitions for Allo v1 + */ +type ChainIdToStringMap = Record; + +export const projectRegistryMap: ChainIdToStringMap = { + [ChainId.DEV1]: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + [ChainId.DEV2]: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + [ChainId.MAINNET]: "0x03506eD3f57892C85DB20C36846e9c808aFe9ef4", + [ChainId.OPTIMISM_MAINNET_CHAIN_ID]: + "0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174", + [ChainId.FANTOM_MAINNET_CHAIN_ID]: + "0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174", + [ChainId.FANTOM_TESTNET_CHAIN_ID]: + "0x984749e408FF0446d8ADaf20E293F2F299396631", + [ChainId.PGN_TESTNET]: "0x6294bed5B884Ae18bf737793Ef9415069Bf4bc11", + [ChainId.PGN]: "0xDF9BF58Aa1A1B73F0e214d79C652a7dd37a6074e", + [ChainId.ARBITRUM]: "0x73AB205af1476Dc22104A6B8b3d4c273B58C6E27", + [ChainId.ARBITRUM_GOERLI]: "0x0CD135777dEaB6D0Bb150bDB0592aC9Baa4d0871", + [ChainId.FUJI]: "0x8918401DD47f1645fF1111D8E513c0404b84d5bB", + [ChainId.AVALANCHE]: "0xDF9BF58Aa1A1B73F0e214d79C652a7dd37a6074e", + [ChainId.POLYGON]: "0x5C5E2D94b107C7691B08E43169fDe76EAAB6D48b", + [ChainId.POLYGON_MUMBAI]: "0x545B282A50EaeA01A619914d44105437036CbB36", + [ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID]: + "0xe6CCEe93c97E20644431647B306F48e278aFFdb9", + [ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID]: + "0xb0F4882184EB6e3ed120c5181651D50719329788", + [ChainId.BASE]: "0xA78Daa89fE9C1eC66c5cB1c5833bC8C6Cb307918", +}; + +export const programFactoryMap: ChainIdToStringMap = { + [ChainId.DEV1]: "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", + [ChainId.DEV2]: "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", + [ChainId.MAINNET]: "0x56296242CA408bA36393f3981879fF9692F193cC", + [ChainId.OPTIMISM_MAINNET_CHAIN_ID]: + "0xd5Fb00093Ebd30011d932cB69bb6313c550aB05f", + [ChainId.FANTOM_MAINNET_CHAIN_ID]: + "0x4d1f64c7920262c8F78e989C9E7Bf48b7eC02Eb5", + [ChainId.FANTOM_TESTNET_CHAIN_ID]: + "0x424C5C175fbd46CA0b27866044A5B956c6AbEe0D", + [ChainId.PGN_TESTNET]: "0x2Ff06F96Bb265698e47BfdED83f1aa0aC7c3a4Ce", + [ChainId.PGN]: "0xd07D54b0231088Ca9BF7DA6291c911B885cBC140", + [ChainId.ARBITRUM]: "0xDF9BF58Aa1A1B73F0e214d79C652a7dd37a6074e", + [ChainId.ARBITRUM_GOERLI]: "0xd39b40aC9279EeeB86FBbDeb2C9acDF16e16cF89", + [ChainId.FUJI]: "0x862D7F621409cF572f179367DdF1B7144AcE1c76", + [ChainId.AVALANCHE]: "0xd07D54b0231088Ca9BF7DA6291c911B885cBC140", + [ChainId.POLYGON]: "0xF7c101A95Ea4cBD5DA0Ab9827D7B2C9857440143", + [ChainId.POLYGON_MUMBAI]: "0xDF9BF58Aa1A1B73F0e214d79C652a7dd37a6074e", + [ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID]: + "0x68a14AF71BFa0FE09fC937033f6Ea5153c0e75e4", + [ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID]: + "0x6D341814Be4E2316142D9190E390b494F1dECFAf", + [ChainId.BASE]: "0xDF9BF58Aa1A1B73F0e214d79C652a7dd37a6074e", +}; + +export const roundFactoryMap: ChainIdToStringMap = { + [ChainId.DEV1]: "0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f", + [ChainId.DEV2]: "0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f", + [ChainId.MAINNET]: "0x9Cb7f434aD3250d1656854A9eC7A71EceC6eE1EF", + [ChainId.OPTIMISM_MAINNET_CHAIN_ID]: + "0x04E753cFB8c8D1D7f776f7d7A033740961b6AEC2", + [ChainId.FANTOM_MAINNET_CHAIN_ID]: + "0xfb08d1fD3a7c693677eB096E722ABf4Ae63B0B95", + [ChainId.FANTOM_TESTNET_CHAIN_ID]: + "0x8AdFcF226dfb2fA73788Ad711C958Ba251369cb3", + [ChainId.PGN_TESTNET]: "0x0479b9DA9f287539FEBd597350B1eBaEBF7479ac", + [ChainId.PGN]: "0x8AdFcF226dfb2fA73788Ad711C958Ba251369cb3", + [ChainId.ARBITRUM_GOERLI]: "0xdf25423c9ec15347197Aa5D3a41c2ebE27587D59", + [ChainId.ARBITRUM]: "0xF2a07728107B04266015E67b1468cA0a536956C8", + [ChainId.FUJI]: "0x3615d870d5B760cea43693ABED70Cd8A9b59b3d8", + [ChainId.AVALANCHE]: "0x8eC471f30cA797FD52F9D37A47Be2517a7BD6912", + [ChainId.POLYGON]: "0x5ab68dCdcA37A1C2b09c5218e28eB0d9cc3FEb03", + [ChainId.POLYGON_MUMBAI]: "0xE1c5812e9831bc1d5BDcF50AAEc1a47C4508F3fA", + [ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID]: + "0xF3B5a0d59C6292BD0e4f8Cf735EEF52b98f428E6", + [ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID]: + "0x0Bb6e2dfEaef0Db5809B3979717E99e053Cbae72", + [ChainId.BASE]: "0xc7722909fEBf7880E15e67d563E2736D9Bb9c1Ab", +}; + +export const qfVotingStrategyFactoryMap: ChainIdToStringMap = { + [ChainId.DEV1]: "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e", + [ChainId.DEV2]: "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e", + [ChainId.MAINNET]: "0x4a850F463D1C4842937c5Bc9540dBc803D744c9F", + [ChainId.OPTIMISM_MAINNET_CHAIN_ID]: + "0x838C5e10dcc1e54d62761d994722367BA167AC22", + [ChainId.FANTOM_MAINNET_CHAIN_ID]: + "0x534d2AAc03dCd0Cb3905B591BAf04C14A95426AB", + [ChainId.FANTOM_TESTNET_CHAIN_ID]: + "0x545B282A50EaeA01A619914d44105437036CbB36", + [ChainId.PGN_TESTNET]: "0xE8027a807Bb85e57da4B7A5ecE65b0aBDf231ce8", + [ChainId.PGN]: "0x2AFA4bE0f2468347A2F086c2167630fb1E58b725", + [ChainId.ARBITRUM_GOERLI]: "0x0BFA0AAF5f2D81f859e85C8E82A3fc5b624fc6E8", + [ChainId.ARBITRUM]: "0xC3A195EEa198e74D67671732E1B8F8A23781D735", + [ChainId.FUJI]: "0xd39b40aC9279EeeB86FBbDeb2C9acDF16e16cF89", + [ChainId.AVALANCHE]: "0x2AFA4bE0f2468347A2F086c2167630fb1E58b725", + [ChainId.POLYGON]: "0xc1a26b0789C3E93b07713e90596Cad8d0442C826", + [ChainId.POLYGON_MUMBAI]: "0xF7c101A95Ea4cBD5DA0Ab9827D7B2C9857440143", + [ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID]: + "0x94cB638556d3991363102431d8cE9e839C734677", + [ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID]: + "0x8c28F21D2d8C53eedC58bF9cdCfb7DCF7d809d97", + [ChainId.BASE]: "0xC3A195EEa198e74D67671732E1B8F8A23781D735", +}; + +export const dgVotingStrategyDummyContractMap: ChainIdToStringMap = { + [ChainId.DEV1]: "0x", + [ChainId.DEV2]: "0x", + [ChainId.MAINNET]: "0xDF9BF58Aa1A1B73F0e214d79C652a7dd37a6074e", + [ChainId.OPTIMISM_MAINNET_CHAIN_ID]: + "0xB9fd0d433d2ca03D26A182Dc709bA1EccA3B00cC", + [ChainId.FANTOM_MAINNET_CHAIN_ID]: + "0xB91749077A0dE932a4AE2b882d846ef9C53b9505", + [ChainId.FANTOM_TESTNET_CHAIN_ID]: + "0xc7722909fEBf7880E15e67d563E2736D9Bb9c1Ab", + [ChainId.PGN_TESTNET]: "0xDF9BF58Aa1A1B73F0e214d79C652a7dd37a6074e", + [ChainId.PGN]: "0xcE7c30DbcEC2a98B516E4C64fA4E3256AB813b10", + [ChainId.ARBITRUM_GOERLI]: "0x809E751e5C5bB1446e9ab2Ac37c687a35DE53BC6", + [ChainId.ARBITRUM]: "0x5ab68dCdcA37A1C2b09c5218e28eB0d9cc3FEb03", + [ChainId.FUJI]: "0xCd3618509983FE4990D7770CF6f02c7145dC365F", + [ChainId.AVALANCHE]: "0xA78Daa89fE9C1eC66c5cB1c5833bC8C6Cb307918", + [ChainId.POLYGON]: "0x8142cAa6dED9F63434B1ED862d53E06332874570", + [ChainId.POLYGON_MUMBAI]: "0xA78Daa89fE9C1eC66c5cB1c5833bC8C6Cb307918", + [ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID]: + "0x787D662D19C9528EB33FdaBb3cBEcBeAb2a7F15a", + [ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID]: + "0x0c0B71BA1427cb46424d38133E8187365Cc5466b", + [ChainId.BASE]: "0x73AB205af1476Dc22104A6B8b3d4c273B58C6E27", +}; + +export const merklePayoutStrategyFactoryMap: ChainIdToStringMap = { + [ChainId.DEV1]: "0x0B306BF915C4d645ff596e518fAf3F9669b97016", + [ChainId.DEV2]: "0x0B306BF915C4d645ff596e518fAf3F9669b97016", + [ChainId.MAINNET]: "0x8F8d78f119Aa722453d33d6881f4D400D67D054F", + [ChainId.OPTIMISM_MAINNET_CHAIN_ID]: + "0xB5365543cdDa2C795AD104F4cB784EF3DB1CD383", + [ChainId.FANTOM_MAINNET_CHAIN_ID]: + "0xFA1D9FF7F885757fc20Fdd9D78B72F88B00Cff77", + [ChainId.FANTOM_TESTNET_CHAIN_ID]: + "0x5b55728e41154562ee80027C1247B13382692e5C", + [ChainId.PGN_TESTNET]: "0xE42D1Da8d75Cf1d6f6C460DAa3f1b10a79D689B1", + [ChainId.PGN]: "0x27efa1C90e097c980c669AB1a6e326AD4164f1Cb", + [ChainId.ARBITRUM_GOERLI]: "0x8F8d78f119Aa722453d33d6881f4D400D67D054F", + [ChainId.ARBITRUM]: "0x04b194b14532070F5cc8D3A760c9a0957D85ad5B", + [ChainId.FUJI]: "0x8F8d78f119Aa722453d33d6881f4D400D67D054F", + [ChainId.AVALANCHE]: "0x27efa1C90e097c980c669AB1a6e326AD4164f1Cb", + [ChainId.POLYGON]: "0xD0e19DBF9b896199F35Df255A1bf8dB3C787531c", + [ChainId.POLYGON_MUMBAI]: "0xc1a26b0789C3E93b07713e90596Cad8d0442C826", + [ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID]: + "0x41A8F19C6CB88C9Cc98d29Cb7A4015629910fFc0", + [ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID]: + "0xbA160C13F8F626e3232078aDFD6eD2f2B2289563", + [ChainId.BASE]: "0xF7c101A95Ea4cBD5DA0Ab9827D7B2C9857440143", +}; + +export const directPayoutStrategyFactoryContractMap: ChainIdToStringMap = { + [ChainId.DEV1]: "0x", + [ChainId.DEV2]: "0x", + [ChainId.MAINNET]: "0xd07D54b0231088Ca9BF7DA6291c911B885cBC140", + [ChainId.OPTIMISM_MAINNET_CHAIN_ID]: + "0x2Bb670C3ffC763b691062d671b386E51Cf1840f0", + [ChainId.FANTOM_MAINNET_CHAIN_ID]: + "0x9B1Ee60B539a3761E328a621A3d980EE9385679a", + [ChainId.FANTOM_TESTNET_CHAIN_ID]: + "0x8eC471f30cA797FD52F9D37A47Be2517a7BD6912", + [ChainId.PGN_TESTNET]: "0x3D77E65aEA55C0e07Cb018aB4Dc22D38cAD75921", + [ChainId.PGN]: "0x0c33c9dEF7A3d9961b802C6C6402d306b7D48135", + [ChainId.ARBITRUM_GOERLI]: "0xCd3618509983FE4990D7770CF6f02c7145dC365F", + [ChainId.ARBITRUM]: "0xc1a26b0789C3E93b07713e90596Cad8d0442C826", + [ChainId.FUJI]: "0x0F98547e09D41e3c82086fC5Eb0E42Ab786aA763", + [ChainId.AVALANCHE]: "0x8AdFcF226dfb2fA73788Ad711C958Ba251369cb3", + [ChainId.POLYGON]: "0xF2a07728107B04266015E67b1468cA0a536956C8", + [ChainId.POLYGON_MUMBAI]: "0xD9B7Ce1F68A93dF783A8519ed52b74f5DcF5AFE1", + [ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID]: + "0x0ccdfCB7e5DB60AAE5667d1680B490F7830c49C8", + [ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID]: + "0x4170665B31bC10009f8a69CeaACf3265C3d66797", + [ChainId.BASE]: "0x74c3665540FC8B92Dd06a7e56a51eCa038C18180", +}; diff --git a/packages/common/src/allo/allo.ts b/packages/common/src/allo/allo.ts index 5d815b9d09..2da0e1793b 100644 --- a/packages/common/src/allo/allo.ts +++ b/packages/common/src/allo/allo.ts @@ -1,8 +1,27 @@ -import { Hex } from "viem"; +import { Address, Hex } from "viem"; import { AnyJson } from ".."; import { Result } from "./common"; import { AlloOperation } from "./operation"; import { TransactionReceipt } from "./transaction-sender"; +import { CreateRoundData, RoundCategory } from "../types"; +import { Round } from "data-layer"; +import { Signer } from "@ethersproject/abstract-signer"; + +export type CreateRoundArguments = { + roundData: { + roundCategory: RoundCategory; + roundMetadataWithProgramContractAddress: Round["roundMetadata"]; + applicationQuestions: CreateRoundData["applicationQuestions"]; + roundStartTime: Date; + roundEndTime: Date; + applicationsStartTime: Date; + applicationsEndTime: Date; + token: string; + matchingFundsAvailable: number; + roundOperators: Address[]; + }; + walletSigner: Signer; +}; /** * Represents the common interface for interacting with Allo contracts. @@ -31,6 +50,16 @@ export interface Allo { transactionStatus: Result; } >; + + createRound: (args: CreateRoundArguments) => AlloOperation< + Result<{ roundId: Hex }>, + { + ipfsStatus: Result; + transaction: Result; + transactionStatus: Result; + indexingStatus: Result; + } + >; } export { AlloOperation }; diff --git a/packages/common/src/allo/backends/allo-v1.test.ts b/packages/common/src/allo/backends/allo-v1.test.ts index b27eadb9fe..307c79a038 100644 --- a/packages/common/src/allo/backends/allo-v1.test.ts +++ b/packages/common/src/allo/backends/allo-v1.test.ts @@ -1,9 +1,9 @@ -import { describe, test, expect, vi, beforeEach } from "vitest"; +import { beforeEach, describe, expect, test, vi } from "vitest"; import { AlloV1 } from "./allo-v1"; -import { zeroAddress, Hex, encodeEventTopics } from "viem"; +import { encodeEventTopics, Hex, zeroAddress } from "viem"; import { - TransactionReceipt, createMockTransactionSender, + TransactionReceipt, } from "../transaction-sender"; import { Result, success } from "../common"; import ProjectRegistry from "../abis/allo-v1/ProjectRegistry"; @@ -12,7 +12,6 @@ const zeroTxHash = ("0x" + "0".repeat(64)) as Hex; const ipfsUploader = vi.fn().mockResolvedValue(success("ipfsHash")); const waitUntilIndexerSynced = vi.fn().mockResolvedValue(success(null)); const transactionSender = createMockTransactionSender(); -const projectRegistryAddress = zeroAddress; const chainId = 1; describe("AlloV1", () => { @@ -20,7 +19,6 @@ describe("AlloV1", () => { beforeEach(() => { allo = new AlloV1({ chainId, - projectRegistryAddress, ipfsUploader, transactionSender, waitUntilIndexerSynced, @@ -67,15 +65,12 @@ describe("AlloV1", () => { expect(result).toEqual( success({ projectId: - "0xd0c4b8bf41dcf0607cd6c6d5f7c6423344ce99ddaaa72c31a7d8fb332a218878", + "0xa0affa31521afe084aee15c3ff5570c600b014cae2a9c45a9cc1e50b0c9852e5", }) ); expect(transactionSender.sentTransactions).toHaveLength(1); expect(ipfsResult!).toEqual(success("ipfsHash")); expect(txResult!).toEqual(success(zeroTxHash)); - expect(transactionSender.sentTransactions[0].to).toEqual( - projectRegistryAddress - ); expect(txStatusResult!).toBeTruthy(); }); }); diff --git a/packages/common/src/allo/backends/allo-v1.ts b/packages/common/src/allo/backends/allo-v1.ts index 591664ecdc..57f2f09131 100644 --- a/packages/common/src/allo/backends/allo-v1.ts +++ b/packages/common/src/allo/backends/allo-v1.ts @@ -1,16 +1,40 @@ -import { Address, Hex, encodePacked, hexToBigInt, keccak256 } from "viem"; -import { AnyJson } from "../.."; -import ProjectRegistryABI from "../abis/allo-v1/ProjectRegistry"; -import { Allo, AlloError, AlloOperation } from "../allo"; -import { Result, error, success } from "../common"; +import { + Address, + encodeAbiParameters, + encodePacked, + getAddress, + Hex, + hexToBigInt, + keccak256, + maxUint256, + parseAbiParameters, + parseUnits, + zeroAddress, +} from "viem"; +import { Allo, AlloError, AlloOperation, CreateRoundArguments } from "../allo"; +import { error, Result, success } from "../common"; import { WaitUntilIndexerSynced } from "../indexer"; import { IpfsUploader } from "../ipfs"; import { - TransactionReceipt, - TransactionSender, decodeEventFromReceipt, sendTransaction, + TransactionReceipt, + TransactionSender, } from "../transaction-sender"; +import ProjectRegistryABI from "../abis/allo-v1/ProjectRegistry"; +import RoundFactoryABI from "../abis/allo-v1/RoundFactory"; +import { AnyJson, ChainId } from "../.."; +import { RoundCategory } from "../../types"; +import { parseChainId } from "../../chains"; +import { + dgVotingStrategyDummyContractMap, + directPayoutStrategyFactoryContractMap, + merklePayoutStrategyFactoryMap, + projectRegistryMap, + qfVotingStrategyFactoryMap, + roundFactoryMap, +} from "../addresses/allo-v1"; +import { payoutTokens } from "../../payoutTokens"; function createProjectId(args: { chainId: number; @@ -26,22 +50,23 @@ function createProjectId(args: { } export class AlloV1 implements Allo { - private projectRegistryAddress: Address; - private transactionSender: TransactionSender; - private ipfsUploader: IpfsUploader; - private waitUntilIndexerSynced: WaitUntilIndexerSynced; - private chainId: number; + private readonly projectRegistryAddress: Address; + private readonly roundFactoryAddress: Address; + private readonly transactionSender: TransactionSender; + private readonly ipfsUploader: IpfsUploader; + private readonly waitUntilIndexerSynced: WaitUntilIndexerSynced; + private readonly chainId: ChainId; constructor(args: { chainId: number; transactionSender: TransactionSender; - projectRegistryAddress: Address; ipfsUploader: IpfsUploader; waitUntilIndexerSynced: WaitUntilIndexerSynced; }) { - this.chainId = args.chainId; + this.chainId = parseChainId(args.chainId); this.transactionSender = args.transactionSender; - this.projectRegistryAddress = args.projectRegistryAddress; + this.projectRegistryAddress = projectRegistryMap[this.chainId]; + this.roundFactoryAddress = roundFactoryMap[this.chainId]; this.ipfsUploader = args.ipfsUploader; this.waitUntilIndexerSynced = args.waitUntilIndexerSynced; } @@ -69,7 +94,7 @@ export class AlloV1 implements Allo { address: this.projectRegistryAddress, abi: ProjectRegistryABI, functionName: "createProject", - args: [{ protocol: 1n, pointer: ipfsResult.value }], + args: [{ protocol: BigInt(1), pointer: ipfsResult.value }], }); emit("transaction", txResult); @@ -142,7 +167,10 @@ export class AlloV1 implements Allo { address: this.projectRegistryAddress, abi: ProjectRegistryABI, functionName: "updateProjectMetadata", - args: [projectIndex, { protocol: 1n, pointer: ipfsResult.value }], + args: [ + projectIndex, + { protocol: BigInt(1), pointer: ipfsResult.value }, + ], }); emit("transaction", txResult); @@ -174,4 +202,229 @@ export class AlloV1 implements Allo { }); }); } + + /** Creates a round on Allo v1*/ + createRound(args: CreateRoundArguments): AlloOperation< + Result<{ roundId: Hex }>, + { + ipfsStatus: Result; + transaction: Result; + transactionStatus: Result; + indexingStatus: Result; + } + > { + return new AlloOperation(async ({ emit }) => { + try { + const isQF = + args.roundData?.roundCategory === RoundCategory.QuadraticFunding; + + const votingStrategyFactory = isQF + ? qfVotingStrategyFactoryMap[this.chainId] + : dgVotingStrategyDummyContractMap[this.chainId]; + const payoutStrategyFactory = isQF + ? merklePayoutStrategyFactoryMap[this.chainId] + : directPayoutStrategyFactoryContractMap[this.chainId]; + + // --- upload metadata to IPFS + const [roundIpfsResult, applicationMetadataIpfsResult] = + await Promise.all([ + this.ipfsUploader( + args.roundData.roundMetadataWithProgramContractAddress + ), + this.ipfsUploader(args.roundData.applicationQuestions), + ]); + + emit( + "ipfsStatus", + [roundIpfsResult, applicationMetadataIpfsResult].every( + (status) => status.type === "success" + ) + ? success("") + : error(new Error("ipfs error")) + ); + + if (roundIpfsResult.type === "error") { + return roundIpfsResult; + } + + if (applicationMetadataIpfsResult.type === "error") { + return applicationMetadataIpfsResult; + } + + let initRoundTimes: bigint[]; + let admins: Address[]; + admins = [getAddress(await args.walletSigner.getAddress())]; + if (isQF) { + if (args.roundData.applicationsEndTime === undefined) { + args.roundData.applicationsEndTime = args.roundData.roundStartTime; + } + + initRoundTimes = [ + dateToEthereumTimestamp(args.roundData.applicationsStartTime), + dateToEthereumTimestamp(args.roundData.applicationsEndTime), + dateToEthereumTimestamp(args.roundData.roundStartTime), + dateToEthereumTimestamp(args.roundData.roundEndTime), + ]; + } else { + // note: DirectRounds does not set application dates. + // in those cases, we set: + // application start time with the round start time + // application end time with MaxUint256. + // if the round has not end time, we set it with MaxUint256. + + initRoundTimes = [ + dateToEthereumTimestamp( + args.roundData.applicationsStartTime ?? + args.roundData.roundStartTime + ), + args.roundData.applicationsEndTime + ? dateToEthereumTimestamp(args.roundData.applicationsEndTime) + : args.roundData.roundEndTime + ? dateToEthereumTimestamp(args.roundData.roundEndTime) + : maxUint256, + dateToEthereumTimestamp(args.roundData.roundStartTime), + args.roundData.roundEndTime + ? dateToEthereumTimestamp(args.roundData.roundEndTime) + : maxUint256, + ]; + } + + let parsedTokenAmount = 0n; + + if (isQF) { + // Ensure tokenAmount is normalized to token decimals + const tokenAmount = args.roundData.matchingFundsAvailable ?? 0; + const pyToken = payoutTokens.filter( + (t) => + t.address.toLowerCase() === args.roundData.token.toLowerCase() + )[0]; + parsedTokenAmount = parseUnits( + tokenAmount.toString(), + pyToken.decimal + ); + } + + const createRoundArguments = constructCreateRoundArgs({ + initTimes: initRoundTimes, + matchingAmount: parsedTokenAmount, + roundOperators: args.roundData.roundOperators ?? [], + roundAdmins: admins ?? [], + roundToken: getAddress(args.roundData.token ?? zeroAddress), + payoutStrategyFactory, + votingStrategyFactory, + roundMetadata: { + protocol: BigInt(1), + pointer: roundIpfsResult.value, + }, + applicationMetadata: { + protocol: BigInt(1), + pointer: applicationMetadataIpfsResult.value, + }, + }); + + // --- send transaction to create round + const txResult = await sendTransaction(this.transactionSender, { + address: this.roundFactoryAddress, + abi: RoundFactoryABI, + functionName: "create", + args: [ + createRoundArguments, + args.roundData.roundMetadataWithProgramContractAddress + ?.programContractAddress as Address, + ], + }); + + emit("transaction", txResult); + + if (txResult.type === "error") { + return txResult; + } + + // --- wait for transaction to be mined + let receipt: TransactionReceipt; + + try { + receipt = await this.transactionSender.wait(txResult.value); + + emit("transactionStatus", success(receipt)); + } catch (err) { + const result = new AlloError("Failed to create round"); + emit("transactionStatus", error(result)); + return error(result); + } + + await this.waitUntilIndexerSynced({ + chainId: this.chainId, + blockNumber: receipt.blockNumber, + }); + + emit("indexingStatus", success(void 0)); + + const roundCreatedEvent = decodeEventFromReceipt({ + abi: RoundFactoryABI, + receipt, + event: "RoundCreated", + }); + + return success({ + roundId: roundCreatedEvent.roundAddress, + }); + } catch (e) { + alert(e); + return error(e as Error); + } + }); + } } + +export type CreateRoundArgs = { + roundMetadata: { protocol: bigint; pointer: string }; + applicationMetadata: { protocol: bigint; pointer: string }; + votingStrategyFactory: `0x${string}`; + payoutStrategyFactory: `0x${string}`; + roundOperators: Address[]; + roundAdmins: Address[]; + roundToken: Address; + initTimes: bigint[]; + matchingAmount: bigint; +}; + +function constructCreateRoundArgs({ + initTimes, + matchingAmount, + roundAdmins, + roundOperators, + votingStrategyFactory, + payoutStrategyFactory, + roundToken, + roundMetadata, + applicationMetadata, +}: CreateRoundArgs) { + let abiType = parseAbiParameters([ + "(address votingStrategy, address payoutStrategy),(uint256 applicationsStartTime, uint256 applicationsEndTime, uint256 roundStartTime, uint256 roundEndTime),uint256,address,uint8,address,((uint256 protocol, string pointer), (uint256 protocol, string pointer)),(address[] adminRoles, address[] roundOperators)", + ]); + return encodeAbiParameters(abiType, [ + { + votingStrategy: votingStrategyFactory, + payoutStrategy: payoutStrategyFactory, + }, + { + applicationsStartTime: initTimes[0], + applicationsEndTime: initTimes[1], + roundStartTime: initTimes[2], + roundEndTime: initTimes[3], + }, + matchingAmount, + getAddress(roundToken ?? zeroAddress), + 0, + zeroAddress, + [roundMetadata, applicationMetadata], + { + roundOperators, + adminRoles: roundAdmins, + }, + ]); +} + +const dateToEthereumTimestamp = (date: Date) => + BigInt(Math.floor(date.getTime() / 1000)); diff --git a/packages/common/src/allo/backends/allo-v2.test.ts b/packages/common/src/allo/backends/allo-v2.test.ts index 0122424bdb..f936362c67 100644 --- a/packages/common/src/allo/backends/allo-v2.test.ts +++ b/packages/common/src/allo/backends/allo-v2.test.ts @@ -12,8 +12,8 @@ const zeroTxHash = ("0x" + "0".repeat(64)) as Hex; const ipfsUploader = vi.fn().mockResolvedValue(success("ipfsHash")); const waitUntilIndexerSynced = vi.fn().mockResolvedValue(success(null)); const transactionSender = createMockTransactionSender(); -const projectRegistryAddress = zeroAddress; const chainId = 1; +const alloContractAddress = zeroAddress; const alloV2RegistryAddress = "0x4AAcca72145e1dF2aeC137E1f3C5E3D75DB8b5f3"; @@ -30,6 +30,7 @@ describe("AlloV2", () => { beforeEach(() => { allo = new AlloV2({ chainId, + allo: alloV2RegistryAddress, ipfsUploader, transactionSender, waitUntilIndexerSynced, diff --git a/packages/common/src/allo/backends/allo-v2.ts b/packages/common/src/allo/backends/allo-v2.ts index 3bfd8139f5..47a047894e 100644 --- a/packages/common/src/allo/backends/allo-v2.ts +++ b/packages/common/src/allo/backends/allo-v2.ts @@ -1,21 +1,20 @@ -import { Hex } from "viem"; -import RegistryABI from "../abis/allo-v2/Registry"; -import { Allo, AlloError, AlloOperation } from "../allo"; -import { Result, error, success } from "../common"; +import { Address, Hex } from "viem"; +import { Allo, AlloError, AlloOperation, CreateRoundArguments } from "../allo"; +import { error, Result, success } from "../common"; import { WaitUntilIndexerSynced } from "../indexer"; import { IpfsUploader } from "../ipfs"; import { - TransactionReceipt, - TransactionSender, decodeEventFromReceipt, sendRawTransaction, + TransactionReceipt, + TransactionSender, } from "../transaction-sender"; - -import { Registry } from "@allo-team/allo-v2-sdk/"; +import RegistryABI from "../abis/allo-v2/Registry"; import { CreateProfileArgs, TransactionData, } from "@allo-team/allo-v2-sdk/dist/types"; +import { Allo as AlloV2Contract, Registry } from "@allo-team/allo-v2-sdk/"; import { AnyJson } from "../.."; export class AlloV2 implements Allo { @@ -24,10 +23,12 @@ export class AlloV2 implements Allo { private waitUntilIndexerSynced: WaitUntilIndexerSynced; private chainId: number; private registry: Registry; + private allo: AlloV2Contract; constructor(args: { chainId: number; transactionSender: TransactionSender; + allo: Address; ipfsUploader: IpfsUploader; waitUntilIndexerSynced: WaitUntilIndexerSynced; }) { @@ -39,6 +40,9 @@ export class AlloV2 implements Allo { this.registry = new Registry({ chain: this.chainId, }); + this.allo = new AlloV2Contract({ + chain: this.chainId, + }); } createProject(args: { name: string; metadata: AnyJson }): AlloOperation< @@ -187,4 +191,14 @@ export class AlloV2 implements Allo { }); }); } + + createRound!: (args: CreateRoundArguments) => AlloOperation< + Result<{ roundId: Hex }>, + { + ipfsStatus: Result; + transaction: Result; + transactionStatus: Result; + indexingStatus: Result; + } + >; } diff --git a/packages/common/src/allo/backends/test-utils.ts b/packages/common/src/allo/backends/test-utils.ts index cb7947f064..ca019d0109 100644 --- a/packages/common/src/allo/backends/test-utils.ts +++ b/packages/common/src/allo/backends/test-utils.ts @@ -16,7 +16,6 @@ export const zeroTxHash = ("0x" + "0".repeat(64)) as Hex; export const alloV1: Allo = new AlloV1({ chainId, - projectRegistryAddress, ipfsUploader, transactionSender, waitUntilIndexerSynced, @@ -27,6 +26,7 @@ export const alloV2: Allo = new AlloV2({ ipfsUploader, transactionSender, waitUntilIndexerSynced, + allo: projectRegistryAddress, }); export const getAllo = (version: string): Allo => { diff --git a/packages/common/src/allo/common.ts b/packages/common/src/allo/common.ts index 8a15aae641..c93d7a9275 100644 --- a/packages/common/src/allo/common.ts +++ b/packages/common/src/allo/common.ts @@ -1,5 +1,3 @@ -import { AlloError } from "./allo"; - export type Result = | { type: "success"; value: T } | { type: "error"; error: Error }; diff --git a/packages/common/src/allo/indexer.ts b/packages/common/src/allo/indexer.ts index eb3856892d..c4ec1e7138 100644 --- a/packages/common/src/allo/indexer.ts +++ b/packages/common/src/allo/indexer.ts @@ -1,4 +1,4 @@ -import { graphql_fetch } from ".."; +import { graphql_fetch } from "../graphql_fetch"; export interface WaitUntilIndexerSynced { (args: { diff --git a/packages/common/src/allo/transaction-sender.ts b/packages/common/src/allo/transaction-sender.ts index ee7e1b3244..2cb08a8cb6 100644 --- a/packages/common/src/allo/transaction-sender.ts +++ b/packages/common/src/allo/transaction-sender.ts @@ -2,20 +2,20 @@ import { Abi, ExtractAbiEventNames } from "abitype"; import ethers from "ethers"; import { Address, + decodeEventLog, + encodeEventTopics, + encodeFunctionData, EncodeFunctionDataParameters, GetEventArgs, Hex, Log, PublicClient, WalletClient, - decodeEventLog, - encodeEventTopics, - encodeFunctionData, zeroAddress, } from "viem"; import { AlloError } from "./allo"; -import { Result, error, success } from "./common"; +import { error, Result, success } from "./common"; export interface TransactionData { to: Hex; @@ -206,7 +206,7 @@ export function createMockTransactionSender(): TransactionSender & { return { transactionHash: txHash, blockHash: `0x${Math.random().toString(16).slice(2)}` as Hex, - blockNumber: 1n, + blockNumber: BigInt(1), logs: [], }; }, diff --git a/packages/common/src/chain-ids.ts b/packages/common/src/chain-ids.ts index 11fbab3676..aa9402eb43 100644 --- a/packages/common/src/chain-ids.ts +++ b/packages/common/src/chain-ids.ts @@ -17,3 +17,21 @@ export enum ChainId { DEV1 = 313371, DEV2 = 313372, } + +export const RedstoneTokenIds = { + FTM: "FTM", + USDC: "USDC", + DAI: "DAI", + ETH: "ETH", + ARB: "ARB", + BUSD: "BUSD", + GTC: "GTC", + MATIC: "MATIC", + AVAX: "AVAX", + CVP: "CVP", + USDT: "USDT", + LUSD: "LUSD", + MUTE: "MUTE", + mkUSD: "mkUSD", + DATA: "DATA", +} as const; diff --git a/packages/common/src/graphql_fetch.ts b/packages/common/src/graphql_fetch.ts new file mode 100644 index 0000000000..e95e352869 --- /dev/null +++ b/packages/common/src/graphql_fetch.ts @@ -0,0 +1,73 @@ +import { ChainId } from "./chain-ids"; + +/** + * Fetch subgraph network for provided web3 network. + * The backticks are here to work around a failure of a test that tetsts graphql_fetch, + * and fails if the endpoint is undefined, so we convert the undefined to a string here in order not to fail the test. + * + * @param chainId - The chain ID of the blockchain + * @returns the subgraph endpoint + */ +export const getGraphQLEndpoint = (chainId: ChainId) => + `${graphQlEndpoints[chainId]}`; +/** + * Fetch data from a GraphQL endpoint + * + * @param query - The query to be executed + * @param chainId - The chain ID of the blockchain indexed by the subgraph + * @param variables - The variables to be used in the query + * @param fromProjectRegistry - Override to fetch from grant hub project registry subgraph + * @returns The result of the query + */ +export const graphql_fetch = async ( + query: string, + chainId: ChainId, + // eslint-disable-next-line @typescript-eslint/ban-types + variables: object = {}, + fromProjectRegistry = false +) => { + let endpoint = getGraphQLEndpoint(chainId); + + if (fromProjectRegistry) { + endpoint = endpoint.replace("grants-round", "grants-hub"); + } + + return fetch(endpoint, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ query, variables }), + }).then((resp) => { + if (resp.ok) { + return resp.json(); + } + + return Promise.reject(resp); + }); +}; +export const graphQlEndpoints: Record = { + [ChainId.DEV1]: process.env.REACT_APP_SUBGRAPH_DEV1_API!, + [ChainId.DEV2]: process.env.REACT_APP_SUBGRAPH_DEV2_API!, + [ChainId.PGN]: process.env.REACT_APP_SUBGRAPH_PGN_API!, + [ChainId.PGN_TESTNET]: process.env.REACT_APP_SUBGRAPH_PGN_TESTNET_API!, + [ChainId.MAINNET]: process.env.REACT_APP_SUBGRAPH_MAINNET_API!, + [ChainId.OPTIMISM_MAINNET_CHAIN_ID]: + process.env.REACT_APP_SUBGRAPH_OPTIMISM_MAINNET_API!, + [ChainId.FANTOM_MAINNET_CHAIN_ID]: + process.env.REACT_APP_SUBGRAPH_FANTOM_MAINNET_API!, + [ChainId.FANTOM_TESTNET_CHAIN_ID]: + process.env.REACT_APP_SUBGRAPH_FANTOM_TESTNET_API!, + [ChainId.ARBITRUM_GOERLI]: + process.env.REACT_APP_SUBGRAPH_ARBITRUM_GOERLI_API!, + [ChainId.ARBITRUM]: process.env.REACT_APP_SUBGRAPH_ARBITRUM_API!, + [ChainId.FUJI]: process.env.REACT_APP_SUBGRAPH_FUJI_API!, + [ChainId.AVALANCHE]: process.env.REACT_APP_SUBGRAPH_AVALANCHE_API!, + [ChainId.POLYGON]: process.env.REACT_APP_SUBGRAPH_POLYGON_API!, + [ChainId.POLYGON_MUMBAI]: process.env.REACT_APP_SUBGRAPH_POLYGON_MUMBAI_API!, + [ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID]: + process.env.REACT_APP_SUBGRAPH_ZKSYNC_TESTNET_API!, + [ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID]: + process.env.REACT_APP_SUBGRAPH_ZKSYNC_MAINNET_API!, + [ChainId.BASE]: process.env.REACT_APP_SUBGRAPH_BASE_API!, +}; diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index 372a80956b..ec617a0132 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -1,6 +1,10 @@ import { useMemo, useState } from "react"; import useSWR from "swr"; import z from "zod"; +import { useOutletContext } from "react-router-dom"; +import { Network, Web3Provider } from "@ethersproject/providers"; +import { Signer } from "@ethersproject/abstract-signer"; +import { graphql_fetch } from "./graphql_fetch"; import { ChainId } from "./chain-ids"; export * from "./icons"; export * from "./markdown"; @@ -97,81 +101,6 @@ export type Payout = { createdAt: string; }; -// TODO relocate to data layer -export const graphQlEndpoints: Record = { - [ChainId.DEV1]: process.env.REACT_APP_SUBGRAPH_DEV1_API!, - [ChainId.DEV2]: process.env.REACT_APP_SUBGRAPH_DEV2_API!, - [ChainId.PGN]: process.env.REACT_APP_SUBGRAPH_PGN_API!, - [ChainId.PGN_TESTNET]: process.env.REACT_APP_SUBGRAPH_PGN_TESTNET_API!, - [ChainId.MAINNET]: process.env.REACT_APP_SUBGRAPH_MAINNET_API!, - [ChainId.OPTIMISM_MAINNET_CHAIN_ID]: - process.env.REACT_APP_SUBGRAPH_OPTIMISM_MAINNET_API!, - [ChainId.FANTOM_MAINNET_CHAIN_ID]: - process.env.REACT_APP_SUBGRAPH_FANTOM_MAINNET_API!, - [ChainId.FANTOM_TESTNET_CHAIN_ID]: - process.env.REACT_APP_SUBGRAPH_FANTOM_TESTNET_API!, - [ChainId.ARBITRUM_GOERLI]: - process.env.REACT_APP_SUBGRAPH_ARBITRUM_GOERLI_API!, - [ChainId.ARBITRUM]: process.env.REACT_APP_SUBGRAPH_ARBITRUM_API!, - [ChainId.FUJI]: process.env.REACT_APP_SUBGRAPH_FUJI_API!, - [ChainId.AVALANCHE]: process.env.REACT_APP_SUBGRAPH_AVALANCHE_API!, - [ChainId.POLYGON]: process.env.REACT_APP_SUBGRAPH_POLYGON_API!, - [ChainId.POLYGON_MUMBAI]: process.env.REACT_APP_SUBGRAPH_POLYGON_MUMBAI_API!, - [ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID]: - process.env.REACT_APP_SUBGRAPH_ZKSYNC_TESTNET_API!, - [ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID]: - process.env.REACT_APP_SUBGRAPH_ZKSYNC_MAINNET_API!, - [ChainId.BASE]: process.env.REACT_APP_SUBGRAPH_BASE_API!, -}; - -/** - * Fetch subgraph network for provided web3 network. - * The backticks are here to work around a failure of a test that tetsts graphql_fetch, - * and fails if the endpoint is undefined, so we convert the undefined to a string here in order not to fail the test. - * - * @param chainId - The chain ID of the blockchain - * @returns the subgraph endpoint - */ -export const getGraphQLEndpoint = (chainId: ChainId) => - `${graphQlEndpoints[chainId]}`; - -/** - * Fetch data from a GraphQL endpoint - * - * @param query - The query to be executed - * @param chainId - The chain ID of the blockchain indexed by the subgraph - * @param variables - The variables to be used in the query - * @param fromProjectRegistry - Override to fetch from grant hub project registry subgraph - * @returns The result of the query - */ -export const graphql_fetch = async ( - query: string, - chainId: ChainId, - // eslint-disable-next-line @typescript-eslint/ban-types - variables: object = {}, - fromProjectRegistry = false -) => { - let endpoint = getGraphQLEndpoint(chainId); - - if (fromProjectRegistry) { - endpoint = endpoint.replace("grants-round", "grants-hub"); - } - - return fetch(endpoint, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ query, variables }), - }).then((resp) => { - if (resp.ok) { - return resp.json(); - } - - return Promise.reject(resp); - }); -}; - /** * Fetches the payouts that happened for a given round from TheGraph * @param roundId Round ID @@ -317,24 +246,6 @@ export const getUTCDateTime = (date: Date): string => { return `${getUTCDate(date)} ${getUTCTime(date)}`; }; -export const RedstoneTokenIds = { - FTM: "FTM", - USDC: "USDC", - DAI: "DAI", - ETH: "ETH", - ARB: "ARB", - BUSD: "BUSD", - GTC: "GTC", - MATIC: "MATIC", - AVAX: "AVAX", - CVP: "CVP", - USDT: "USDT", - LUSD: "LUSD", - MUTE: "MUTE", - mkUSD: "mkUSD", - DATA: "DATA", -} as const; - export const useTokenPrice = (tokenId: string | undefined) => { const [tokenPrice, setTokenPrice] = useState(); const [error, setError] = useState(); @@ -415,8 +326,41 @@ export { sendTransaction } from "./allo/transaction-sender"; -export type AnyJson = boolean | number | string | null | JsonArray | JsonMap; +export type AnyJson = + | boolean + | number + | string + | null + | undefined + | JsonArray + | JsonMap; interface JsonMap { [key: string]: AnyJson; } interface JsonArray extends Array {} + +/** + * Wrapper hook to expose wallet auth information to other components + */ +export function useWallet() { + return useOutletContext(); +} + +export interface Web3Instance { + /** + * Currently selected address in ETH format i.e 0x... + */ + address: string; + /** + * Chain ID & name of the currently connected network + */ + chain: { + id: number; + name: string; + network: Network; + }; + provider: Web3Provider; + signer?: Signer; +} + +export { graphql_fetch, graphQlEndpoints } from "./graphql_fetch"; diff --git a/packages/common/src/payoutTokens.ts b/packages/common/src/payoutTokens.ts new file mode 100644 index 0000000000..a2b6836c1d --- /dev/null +++ b/packages/common/src/payoutTokens.ts @@ -0,0 +1,399 @@ +import { ChainId, RedstoneTokenIds } from "./chain-ids"; +import { ethers } from "ethers"; +import { Address } from "wagmi"; + +export type PayoutToken = { + name: string; + chainId: number; + address: Address; + logo?: string; + default?: boolean; // TODO: this is only used to provide the initial placeholder item, look for better solution + redstoneTokenId?: string; + decimal: number; +}; +export const TokenNamesAndLogos = { + FTM: "/logos/fantom-logo.svg", + BUSD: "/logos/busd-logo.svg", + DAI: "/logos/dai-logo.svg", + USDC: "./logos/usdc-logo.svg", + ETH: "/logos/ethereum-eth-logo.svg", + OP: "/logos/optimism-logo.svg", + ARB: "/logos/arb-logo.svg", + GCV: "/logos/gcv.svg", + GTC: "/logos/gtc.svg", + AVAX: "/logos/avax-logo.svg", + MATIC: "/logos/pol-logo.svg", + CVP: "/logos/power-pool.png", // PowerPool + TEST: "/logos/dai-logo.svg", + USDT: "/logos/usdt-logo.svg", + LUSD: "/logos/lusd-logo.svg", + MUTE: "/logos/mute-logo.svg", + mkUSD: "/logos/mkusd-logo.svg", // Prisma mkUSD +} as const; +const MAINNET_TOKENS: PayoutToken[] = [ + { + name: "DAI", + chainId: ChainId.MAINNET, + address: "0x6B175474E89094C44Da98b954EedeAC495271d0F", + decimal: 18, + logo: TokenNamesAndLogos["DAI"], + redstoneTokenId: RedstoneTokenIds["DAI"], + }, + { + name: "ETH", + chainId: ChainId.MAINNET, + address: ethers.constants.AddressZero, + decimal: 18, + logo: TokenNamesAndLogos["ETH"], + redstoneTokenId: RedstoneTokenIds["ETH"], + }, + { + name: "CVP", + chainId: ChainId.MAINNET, + address: "0x38e4adB44ef08F22F5B5b76A8f0c2d0dCbE7DcA1", + decimal: 18, + logo: TokenNamesAndLogos["CVP"], + redstoneTokenId: RedstoneTokenIds["CVP"], + }, + { + name: "mkUSD", + chainId: ChainId.MAINNET, + address: "0x4591DBfF62656E7859Afe5e45f6f47D3669fBB28", + decimal: 18, + logo: TokenNamesAndLogos["mkUSD"], + redstoneTokenId: RedstoneTokenIds["mkUSD"], + }, +]; +const OPTIMISM_MAINNET_TOKENS: PayoutToken[] = [ + { + name: "DAI", + chainId: ChainId.OPTIMISM_MAINNET_CHAIN_ID, + address: "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1", + decimal: 18, + logo: TokenNamesAndLogos["DAI"], + redstoneTokenId: RedstoneTokenIds["DAI"], + }, + { + name: "ETH", + chainId: ChainId.OPTIMISM_MAINNET_CHAIN_ID, + address: ethers.constants.AddressZero, + decimal: 18, + logo: TokenNamesAndLogos["ETH"], + redstoneTokenId: RedstoneTokenIds["ETH"], + }, +]; +const FANTOM_MAINNET_TOKENS: PayoutToken[] = [ + { + name: "WFTM", + chainId: ChainId.FANTOM_MAINNET_CHAIN_ID, + address: "0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83", + decimal: 18, + logo: TokenNamesAndLogos["FTM"], + redstoneTokenId: RedstoneTokenIds["FTM"], + }, + { + name: "FTM", + chainId: ChainId.FANTOM_MAINNET_CHAIN_ID, + address: ethers.constants.AddressZero, + decimal: 18, + logo: TokenNamesAndLogos["FTM"], + redstoneTokenId: RedstoneTokenIds["FTM"], + }, + { + name: "BUSD", + chainId: ChainId.FANTOM_MAINNET_CHAIN_ID, + address: "0xC931f61B1534EB21D8c11B24f3f5Ab2471d4aB50", + decimal: 18, + logo: TokenNamesAndLogos["BUSD"], + redstoneTokenId: RedstoneTokenIds["BUSD"], + }, + { + name: "DAI", + chainId: ChainId.FANTOM_MAINNET_CHAIN_ID, + address: "0x8d11ec38a3eb5e956b052f67da8bdc9bef8abf3e", + decimal: 18, + logo: TokenNamesAndLogos["DAI"], + redstoneTokenId: RedstoneTokenIds["DAI"], + }, + { + name: "GcV", + chainId: ChainId.FANTOM_MAINNET_CHAIN_ID, + address: "0x83791638da5EB2fAa432aff1c65fbA47c5D29510", + decimal: 18, + logo: TokenNamesAndLogos["GCV"], + redstoneTokenId: RedstoneTokenIds["DAI"], // We use DAI for the price + }, +]; +const FANTOM_TESTNET_TOKENS: PayoutToken[] = [ + { + name: "DAI", + chainId: ChainId.FANTOM_TESTNET_CHAIN_ID, + address: "0xEdE59D58d9B8061Ff7D22E629AB2afa01af496f4", + decimal: 18, + logo: TokenNamesAndLogos["DAI"], + redstoneTokenId: RedstoneTokenIds["DAI"], + }, + { + name: "FTM", + chainId: ChainId.FANTOM_TESTNET_CHAIN_ID, + address: ethers.constants.AddressZero, + decimal: 18, + logo: TokenNamesAndLogos["FTM"], + redstoneTokenId: RedstoneTokenIds["FTM"], + }, +]; + +const ZKSYNC_ERA_TESTNET_TOKENS: PayoutToken[] = [ + { + name: "ETH", + chainId: ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID, + address: ethers.constants.AddressZero, + decimal: 18, + logo: TokenNamesAndLogos["ETH"], + redstoneTokenId: RedstoneTokenIds["ETH"], + }, + { + name: "TEST", + chainId: ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID, + address: "0x8fd03Cd97Da068CC242Ab7551Dc4100DD405E8c7", + decimal: 18, + logo: TokenNamesAndLogos["DAI"], + redstoneTokenId: RedstoneTokenIds["DAI"], + }, +]; + +const ZKSYNC_ERA_MAINNET_TOKENS: PayoutToken[] = [ + { + name: "ETH", + chainId: ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID, + address: ethers.constants.AddressZero, + decimal: 18, + logo: TokenNamesAndLogos["ETH"], + redstoneTokenId: RedstoneTokenIds["ETH"], + }, + { + name: "DAI", + chainId: ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID, + address: "0x4B9eb6c0b6ea15176BBF62841C6B2A8a398cb656", + decimal: 18, + logo: TokenNamesAndLogos["DAI"], + redstoneTokenId: RedstoneTokenIds["DAI"], + }, + { + name: "USDT", + chainId: ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID, + address: "0x493257fD37EDB34451f62EDf8D2a0C418852bA4C", + decimal: 6, + logo: TokenNamesAndLogos["USDT"], + redstoneTokenId: RedstoneTokenIds["USDT"], + }, + { + name: "LUSD", + chainId: ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID, + address: "0x503234F203fC7Eb888EEC8513210612a43Cf6115", + decimal: 18, + logo: TokenNamesAndLogos["LUSD"], + redstoneTokenId: RedstoneTokenIds["LUSD"], + }, + { + name: "MUTE", + chainId: ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID, + address: "0x0e97C7a0F8B2C9885C8ac9fC6136e829CbC21d42", + decimal: 18, + logo: TokenNamesAndLogos["MUTE"], + redstoneTokenId: RedstoneTokenIds["MUTE"], + }, +]; + +const PGN_TESTNET_TOKENS: PayoutToken[] = [ + { + name: "TEST", + chainId: ChainId.PGN_TESTNET, + address: "0x5FbDB2315678afecb367f032d93F642f64180aa3", + logo: TokenNamesAndLogos["DAI"], + decimal: 18, + }, + { + name: "ETH", + chainId: ChainId.PGN_TESTNET, + address: ethers.constants.AddressZero, + logo: TokenNamesAndLogos["ETH"], + decimal: 18, + }, +]; +const PGN_MAINNET_TOKENS: PayoutToken[] = [ + { + name: "ETH", + chainId: ChainId.PGN, + address: ethers.constants.AddressZero, + decimal: 18, + logo: TokenNamesAndLogos["ETH"], + redstoneTokenId: RedstoneTokenIds["ETH"], + }, + { + name: "GTC", + chainId: ChainId.PGN, + address: "0x7c6b91D9Be155A6Db01f749217d76fF02A7227F2", + decimal: 18, + logo: TokenNamesAndLogos["GTC"], + redstoneTokenId: RedstoneTokenIds["GTC"], + }, + { + name: "DAI", + chainId: ChainId.PGN, + address: "0x6C121674ba6736644A7e73A8741407fE8a5eE5BA", + decimal: 18, + logo: TokenNamesAndLogos["DAI"], + redstoneTokenId: RedstoneTokenIds["DAI"], + }, +]; + +const BASE_TOKENS: PayoutToken[] = [ + { + name: "ETH", + chainId: ChainId.BASE, + address: ethers.constants.AddressZero, + decimal: 18, + logo: TokenNamesAndLogos["ETH"], + redstoneTokenId: RedstoneTokenIds["ETH"], + }, + { + name: "USDC", + chainId: ChainId.BASE, + address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + decimal: 6, + logo: TokenNamesAndLogos["USDC"], + redstoneTokenId: RedstoneTokenIds["USDC"], + }, +]; + +const ARBITRUM_GOERLI_TOKENS: PayoutToken[] = [ + { + name: "ETH", + chainId: ChainId.ARBITRUM_GOERLI, + address: ethers.constants.AddressZero, + decimal: 18, + logo: TokenNamesAndLogos["ETH"], + redstoneTokenId: RedstoneTokenIds["ETH"], + }, +]; +const ARBITRUM_TOKENS: PayoutToken[] = [ + { + name: "ETH", + chainId: ChainId.ARBITRUM, + address: ethers.constants.AddressZero, + decimal: 18, + logo: TokenNamesAndLogos["ETH"], + redstoneTokenId: RedstoneTokenIds["ETH"], + }, + { + name: "USDC", + chainId: ChainId.ARBITRUM, + address: "0xaf88d065e77c8cc2239327c5edb3a432268e5831", + decimal: 6, + logo: TokenNamesAndLogos["USDC"], + redstoneTokenId: RedstoneTokenIds["USDC"], + }, + { + name: "ARB", + chainId: ChainId.ARBITRUM, + address: "0x912CE59144191C1204E64559FE8253a0e49E6548", + decimal: 18, + logo: TokenNamesAndLogos["ARB"], + redstoneTokenId: RedstoneTokenIds["ARB"], + }, +]; +const AVALANCHE_TOKENS: PayoutToken[] = [ + { + name: "AVAX", + chainId: ChainId.AVALANCHE, + address: ethers.constants.AddressZero, + decimal: 18, + logo: TokenNamesAndLogos["AVAX"], + redstoneTokenId: RedstoneTokenIds["AVAX"], + }, + { + name: "USDC", + chainId: ChainId.AVALANCHE, + address: "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E", + decimal: 6, + logo: TokenNamesAndLogos["USDC"], + redstoneTokenId: RedstoneTokenIds["USDC"], + }, +]; +const FUJI_TOKENS: PayoutToken[] = [ + { + name: "AVAX", + chainId: ChainId.FUJI, + address: ethers.constants.AddressZero, + decimal: 18, + logo: TokenNamesAndLogos["AVAX"], + redstoneTokenId: RedstoneTokenIds["AVAX"], + }, + { + name: "USDC", + chainId: ChainId.FUJI, + address: "0x5425890298aed601595a70ab815c96711a31bc65", + decimal: 6, + logo: TokenNamesAndLogos["USDC"], + redstoneTokenId: RedstoneTokenIds["USDC"], + }, +]; +const POLYGON_TOKENS: PayoutToken[] = [ + { + name: "MATIC", + chainId: ChainId.POLYGON, + address: ethers.constants.AddressZero, + decimal: 18, + logo: TokenNamesAndLogos["MATIC"], + redstoneTokenId: RedstoneTokenIds["MATIC"], + }, + { + name: "USDC", + chainId: ChainId.POLYGON, + address: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359", + decimal: 6, + logo: TokenNamesAndLogos["USDC"], + redstoneTokenId: RedstoneTokenIds["USDC"], + }, +]; +const POLYGON_MUMBAI_TOKENS: PayoutToken[] = [ + { + name: "MATIC", + chainId: ChainId.POLYGON_MUMBAI, + address: ethers.constants.AddressZero, + decimal: 18, + logo: TokenNamesAndLogos["MATIC"], + redstoneTokenId: RedstoneTokenIds["MATIC"], + }, + { + name: "USDC", + chainId: ChainId.POLYGON_MUMBAI, + address: "0x9999f7Fea5938fD3b1E26A12c3f2fb024e194f97", + decimal: 6, + logo: TokenNamesAndLogos["USDC"], + redstoneTokenId: RedstoneTokenIds["USDC"], + }, +]; +export const payoutTokens = [ + ...MAINNET_TOKENS, + ...OPTIMISM_MAINNET_TOKENS, + ...FANTOM_MAINNET_TOKENS, + ...FANTOM_TESTNET_TOKENS, + ...PGN_TESTNET_TOKENS, + ...PGN_MAINNET_TOKENS, + ...ARBITRUM_TOKENS, + ...ARBITRUM_GOERLI_TOKENS, + ...AVALANCHE_TOKENS, + ...FUJI_TOKENS, + ...POLYGON_TOKENS, + ...POLYGON_MUMBAI_TOKENS, + ...ZKSYNC_ERA_MAINNET_TOKENS, + ...ZKSYNC_ERA_TESTNET_TOKENS, + ...BASE_TOKENS, +]; + +export const getPayoutTokenOptions = (chainId: ChainId): PayoutToken[] => { + const tokens = payoutTokens.filter((token) => token.chainId === chainId); + return tokens.length > 0 ? tokens : MAINNET_TOKENS; +}; diff --git a/packages/common/src/types.ts b/packages/common/src/types.ts new file mode 100644 index 0000000000..5213e1bbd8 --- /dev/null +++ b/packages/common/src/types.ts @@ -0,0 +1,59 @@ +import { Round } from "data-layer"; + +export type CreateRoundData = { + roundMetadataWithProgramContractAddress: Round["roundMetadata"]; + applicationQuestions: { + version: string; + lastUpdatedOn: number; + applicationSchema: { + questions: SchemaQuestion[]; + requirements: ProjectRequirements; + }; + }; + round: Round; + roundCategory: RoundCategory; +}; + +export type SchemaQuestion = { + id: number; + title: string; + type: InputType; + required: boolean; + hidden: boolean; + choices?: string[]; + encrypted: boolean; + fixed?: boolean; + metadataExcluded?: boolean; +}; + +export type ProjectRequirements = { + twitter: { + required: boolean; + verification: boolean; + }; + github: { + required: boolean; + verification: boolean; + }; +}; + +export enum RoundCategory { + QuadraticFunding, + Direct, +} + +export type InputType = + | "email" + | "address" + | "number" + | "text" + | "short-answer" + | "paragraph" + | "multiple-choice" + | "checkbox" + | "dropdown" + | "link"; + +export type DeepRequired = { + [K in keyof T]: Required>; +}; diff --git a/packages/common/tsconfig.json b/packages/common/tsconfig.json index 8169a3a5bc..988ab479d1 100644 --- a/packages/common/tsconfig.json +++ b/packages/common/tsconfig.json @@ -20,4 +20,3 @@ "declaration": true }, } - diff --git a/packages/data-layer/src/data.types.ts b/packages/data-layer/src/data.types.ts index 7da2de3554..990524acaf 100644 --- a/packages/data-layer/src/data.types.ts +++ b/packages/data-layer/src/data.types.ts @@ -222,17 +222,17 @@ export interface MetadataPointer { pointer: string; } -export interface Requirement { +export type Requirement = { // Requirement for the round requirement?: string; -} +}; -export interface Eligibility { +export type Eligibility = { // Eligibility for the round description: string; // Requirements for the round requirements?: Requirement[]; -} +}; export interface Round { /** @@ -301,6 +301,10 @@ export interface Round { * Contract address of the program to which the round belongs */ ownedBy: string; + /** + * Addresses of wallets that will have admin privileges to operate the Grant program + */ + operatorWallets?: Array; /** * List of projects approved for the round */ diff --git a/packages/grant-explorer/src/features/api/utils.ts b/packages/grant-explorer/src/features/api/utils.ts index d556ec682a..cc59be2cc8 100644 --- a/packages/grant-explorer/src/features/api/utils.ts +++ b/packages/grant-explorer/src/features/api/utils.ts @@ -1,13 +1,14 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ -import { CartProject, IPFSObject, VotingToken, Round } from "./types"; +import { CartProject, IPFSObject, Round, VotingToken } from "./types"; import { ChainId, graphQlEndpoints, - RedstoneTokenIds, + ROUND_PAYOUT_DIRECT, + ROUND_PAYOUT_MERKLE, RoundPayoutType, } from "common"; +import { RedstoneTokenIds } from "common/src/chain-ids"; import { useSearchParams } from "react-router-dom"; -import { ROUND_PAYOUT_MERKLE, ROUND_PAYOUT_DIRECT } from "common"; import { getAddress, zeroAddress } from "viem"; import { ethers } from "ethers"; diff --git a/packages/round-manager/craco.config.js b/packages/round-manager/craco.config.js index 89377ea034..aa6335209c 100644 --- a/packages/round-manager/craco.config.js +++ b/packages/round-manager/craco.config.js @@ -89,10 +89,10 @@ module.exports = { skipEsbuildJest: true, esbuildLoaderOptions: { loader: "tsx", // Set the value to 'tsx' if you use typescript - target: "es2020", + target: "es2021", }, esbuildMinimizerOptions: { - target: "es2020", + target: "es2021", }, }, }, diff --git a/packages/round-manager/package.json b/packages/round-manager/package.json index 22b3553557..7448069d15 100644 --- a/packages/round-manager/package.json +++ b/packages/round-manager/package.json @@ -36,7 +36,7 @@ "@heroicons/react": "^1.0.6", "@hookform/resolvers": "^2.9.2", "@openzeppelin/merkle-tree": "^1.0.2", - "@rainbow-me/rainbowkit": "0.12.16", + "@rainbow-me/rainbowkit": "0.12.18", "@reduxjs/toolkit": "^1.8.1", "@sentry/integrations": "^7.28.0", "@sentry/react": "^7.27.0", @@ -91,9 +91,11 @@ "url": "^0.11.0", "util": "^0.12.4", "verify-env": "*", + "viem": "^2.5.0", "wagmi": "0.12.18", "web-vitals": "^2.1.0", - "yup": "^0.32.11" + "yup": "^0.32.11", + "zustand": "^4.4.0" }, "jest": { "transformIgnorePatterns": [ @@ -130,7 +132,6 @@ "add": "^2.0.6", "autoprefixer": "^10.4.7", "craco-esbuild": "^0.5.2", - "husky": "^8.0.1", "postcss": "^8.4.14", "resize-observer-polyfill": "^1.5.1", "tailwind-styled-components": "2.1.6", diff --git a/packages/round-manager/src/context/round/CreateRoundContext.tsx b/packages/round-manager/src/context/round/CreateRoundContext.tsx deleted file mode 100644 index 9e419aab1f..0000000000 --- a/packages/round-manager/src/context/round/CreateRoundContext.tsx +++ /dev/null @@ -1,363 +0,0 @@ -import { - ProgressStatus, - ProjectRequirements, - Round, - RoundCategory, - StorageProtocolID, -} from "../../features/api/types"; -import React, { - createContext, - SetStateAction, - useContext, - useState, -} from "react"; -import { saveToIPFS } from "../../features/api/ipfs"; -import { useWallet } from "../../features/common/Auth"; -import { deployRoundContract } from "../../features/api/round"; -import { waitForSubgraphSyncTo } from "../../features/api/subgraph"; -import { SchemaQuestion } from "../../features/api/utils"; -import { datadogLogs } from "@datadog/browser-logs"; -import { Signer } from "@ethersproject/abstract-signer"; -import { - dgVotingStrategyDummyContract, - directPayoutStrategyFactoryContract, - merklePayoutStrategyFactoryContract, - qfVotingStrategyFactoryContract, -} from "../../features/api/contracts"; - -type SetStatusFn = React.Dispatch>; - -export interface CreateRoundState { - IPFSCurrentStatus: ProgressStatus; - setIPFSCurrentStatus: SetStatusFn; - votingContractDeploymentStatus: ProgressStatus; - setVotingContractDeploymentStatus: SetStatusFn; - payoutContractDeploymentStatus: ProgressStatus; - setPayoutContractDeploymentStatus: SetStatusFn; - roundContractDeploymentStatus: ProgressStatus; - setRoundContractDeploymentStatus: SetStatusFn; - indexingStatus: ProgressStatus; - setIndexingStatus: SetStatusFn; -} - -export type CreateRoundData = { - roundMetadataWithProgramContractAddress: Round["roundMetadata"]; - applicationQuestions: { - version: string; - lastUpdatedOn: number; - applicationSchema: { - questions: SchemaQuestion[]; - requirements: ProjectRequirements; - }; - }; - round: Round; - roundCategory: RoundCategory; -}; - -export const initialCreateRoundState: CreateRoundState = { - IPFSCurrentStatus: ProgressStatus.NOT_STARTED, - setIPFSCurrentStatus: () => { - /* provided in CreateRoundProvider */ - }, - votingContractDeploymentStatus: ProgressStatus.NOT_STARTED, - setVotingContractDeploymentStatus: () => { - /* provided in CreateRoundProvider */ - }, - payoutContractDeploymentStatus: ProgressStatus.NOT_STARTED, - setPayoutContractDeploymentStatus: () => { - /* provided in CreateRoundProvider */ - }, - roundContractDeploymentStatus: ProgressStatus.NOT_STARTED, - setRoundContractDeploymentStatus: () => { - /* provided in CreateRoundProvider */ - }, - indexingStatus: ProgressStatus.NOT_STARTED, - setIndexingStatus: () => { - /* provided in CreateRoundProvider */ - }, -}; - -export const CreateRoundContext = createContext( - initialCreateRoundState -); - -export const CreateRoundProvider = ({ - children, -}: { - children: React.ReactNode; -}) => { - const [IPFSCurrentStatus, setIPFSCurrentStatus] = useState( - initialCreateRoundState.IPFSCurrentStatus - ); - const [votingContractDeploymentStatus, setVotingContractDeploymentStatus] = - useState(initialCreateRoundState.votingContractDeploymentStatus); - const [payoutContractDeploymentStatus, setPayoutContractDeploymentStatus] = - useState(initialCreateRoundState.payoutContractDeploymentStatus); - const [roundContractDeploymentStatus, setRoundContractDeploymentStatus] = - useState(initialCreateRoundState.roundContractDeploymentStatus); - const [indexingStatus, setIndexingStatus] = useState( - initialCreateRoundState.indexingStatus - ); - - const providerProps: CreateRoundState = { - IPFSCurrentStatus, - setIPFSCurrentStatus, - votingContractDeploymentStatus, - setVotingContractDeploymentStatus, - payoutContractDeploymentStatus, - setPayoutContractDeploymentStatus, - roundContractDeploymentStatus, - setRoundContractDeploymentStatus, - indexingStatus, - setIndexingStatus, - }; - - return ( - - {children} - - ); -}; - -interface _createRoundParams { - context: CreateRoundState; - signerOrProvider: Signer; - createRoundData: CreateRoundData; -} - -const _createRound = async ({ - context, - signerOrProvider, - createRoundData, -}: _createRoundParams) => { - const { - setIPFSCurrentStatus, - setVotingContractDeploymentStatus, - setPayoutContractDeploymentStatus, - setRoundContractDeploymentStatus, - setIndexingStatus, - } = context; - const { - roundMetadataWithProgramContractAddress, - applicationQuestions, - round, - roundCategory, - } = createRoundData; - - const isQF = roundCategory === RoundCategory.QuadraticFunding; - - try { - datadogLogs.logger.info(`_createRound: ${round}`); - - if ( - roundMetadataWithProgramContractAddress && - roundMetadataWithProgramContractAddress.eligibility - ) { - roundMetadataWithProgramContractAddress.eligibility.requirements = - roundMetadataWithProgramContractAddress.eligibility?.requirements.filter( - // Loose comparison might be intentional here, leave as is - (obj) => obj.requirement != "" - ); - } - - const { roundMetadataIpfsHash, applicationSchemaIpfsHash } = - await storeDocuments( - setIPFSCurrentStatus, - roundMetadataWithProgramContractAddress, - applicationQuestions - ); - - const roundContractInputsWithPointers = { - ...round, - store: { - protocol: StorageProtocolID.IPFS, - pointer: roundMetadataIpfsHash, - }, - applicationStore: { - protocol: StorageProtocolID.IPFS, - pointer: applicationSchemaIpfsHash, - }, - }; - - /* On newer RoundImplementations, we create all the contracts during the round init process - * Therefore we pass in the factories for the voting and payout contracts instead of - * the implementations, and let the round deploy and init the strategies themselves */ - const chainId = await signerOrProvider.getChainId(); - - const roundContractInputsWithContracts = { - ...roundContractInputsWithPointers, - votingStrategy: isQF - ? qfVotingStrategyFactoryContract(chainId).address - : dgVotingStrategyDummyContract(chainId), - payoutStrategy: { - id: isQF - ? merklePayoutStrategyFactoryContract(chainId).address - : directPayoutStrategyFactoryContract(chainId).address, - isReadyForPayout: false, - }, - }; - - const transactionBlockNumber = await handleDeployUnifiedRoundContract( - [ - setVotingContractDeploymentStatus, - setPayoutContractDeploymentStatus, - setRoundContractDeploymentStatus, - ], - roundContractInputsWithContracts, - signerOrProvider, - isQF - ); - - await waitForSubgraphToUpdate( - setIndexingStatus, - signerOrProvider, - transactionBlockNumber - ); - } catch (error) { - datadogLogs.logger.error( - `error: _createRound ${error}. Data : ${createRoundData}` - ); - - console.error("_createRound", error); - } -}; - -export const useCreateRound = () => { - const context = useContext(CreateRoundContext); - if (context === undefined) { - throw new Error("useCreateRound must be used within a CreateRoundProvider"); - } - - const { - setIPFSCurrentStatus, - setVotingContractDeploymentStatus, - setPayoutContractDeploymentStatus, - setRoundContractDeploymentStatus, - setIndexingStatus, - } = context; - const { signer: walletSigner } = useWallet(); - - const createRound = (createRoundData: CreateRoundData) => { - resetToInitialState( - setIPFSCurrentStatus, - setVotingContractDeploymentStatus, - setPayoutContractDeploymentStatus, - setRoundContractDeploymentStatus, - setIndexingStatus - ); - - return _createRound({ - context, - signerOrProvider: walletSigner as Signer, - createRoundData, - }); - }; - - return { - createRound, - IPFSCurrentStatus: context.IPFSCurrentStatus, - votingContractDeploymentStatus: context.votingContractDeploymentStatus, - payoutContractDeploymentStatus: context.payoutContractDeploymentStatus, - roundContractDeploymentStatus: context.roundContractDeploymentStatus, - indexingStatus: context.indexingStatus, - }; -}; - -function resetToInitialState( - setStoringStatus: SetStatusFn, - setVotingDeployingStatus: SetStatusFn, - setPayoutDeployingStatus: SetStatusFn, - setDeployingStatus: SetStatusFn, - setIndexingStatus: SetStatusFn -): void { - setStoringStatus(initialCreateRoundState.IPFSCurrentStatus); - setVotingDeployingStatus( - initialCreateRoundState.votingContractDeploymentStatus - ); - setPayoutDeployingStatus( - initialCreateRoundState.payoutContractDeploymentStatus - ); - setDeployingStatus(initialCreateRoundState.roundContractDeploymentStatus); - setIndexingStatus(initialCreateRoundState.indexingStatus); -} - -async function storeDocuments( - setStoringStatus: SetStatusFn, - roundMetadataWithProgramContractAddress: CreateRoundData["roundMetadataWithProgramContractAddress"], - applicationQuestions: CreateRoundData["applicationQuestions"] -) { - try { - setStoringStatus(ProgressStatus.IN_PROGRESS); - - const [roundMetadataIpfsHash, applicationSchemaIpfsHash] = - await Promise.all([ - saveToIPFS({ - content: roundMetadataWithProgramContractAddress, - metadata: { - name: "round-metadata", - }, - }), - saveToIPFS({ - content: applicationQuestions, - metadata: { - name: "application-schema", - }, - }), - ]); - - setStoringStatus(ProgressStatus.IS_SUCCESS); - - return { - roundMetadataIpfsHash, - applicationSchemaIpfsHash, - }; - } catch (error) { - console.error("storeDocuments", error); - - setStoringStatus(ProgressStatus.IS_ERROR); - throw error; - } -} - -async function handleDeployUnifiedRoundContract( - setDeploymentStatusFns: SetStatusFn[], - round: Round, - signerOrProvider: Signer, - isQF: boolean -): Promise { - try { - setDeploymentStatusFns.forEach((fn) => fn(ProgressStatus.IN_PROGRESS)); - const { transactionBlockNumber } = await deployRoundContract( - round, - signerOrProvider, - isQF - ); - - setDeploymentStatusFns.forEach((fn) => fn(ProgressStatus.IS_SUCCESS)); - - return transactionBlockNumber; - } catch (error) { - console.error("handleDeployRoundContract", error); - setDeploymentStatusFns.forEach((fn) => fn(ProgressStatus.IS_ERROR)); - throw error; - } -} - -async function waitForSubgraphToUpdate( - setIndexingStatus: SetStatusFn, - signerOrProvider: Signer, - transactionBlockNumber: number -) { - try { - setIndexingStatus(ProgressStatus.IN_PROGRESS); - - const chainId = await signerOrProvider.getChainId(); - await waitForSubgraphSyncTo(chainId, transactionBlockNumber); - - setIndexingStatus(ProgressStatus.IS_SUCCESS); - } catch (error) { - console.error("waitForSubgraphToUpdate", error); - setIndexingStatus(ProgressStatus.IS_ERROR); - throw error; - } -} diff --git a/packages/round-manager/src/context/round/__tests__/CreateRoundContext.test.tsx b/packages/round-manager/src/context/round/__tests__/CreateRoundContext.test.tsx deleted file mode 100644 index fbb902f6c8..0000000000 --- a/packages/round-manager/src/context/round/__tests__/CreateRoundContext.test.tsx +++ /dev/null @@ -1,449 +0,0 @@ -import { saveToIPFS } from "../../../features/api/ipfs"; -import { fireEvent, render, screen } from "@testing-library/react"; -import { ProgressStatus, RoundCategory } from "../../../features/api/types"; -import { - CreateRoundData, - CreateRoundProvider, - useCreateRound, -} from "../CreateRoundContext"; -import { deployRoundContract } from "../../../features/api/round"; -import { waitForSubgraphSyncTo } from "../../../features/api/subgraph"; - -const mockWallet = { - address: "0x0", - signer: { - getChainId: () => { - return 5; - }, - }, -}; - -jest.mock("../../../features/api/payoutStrategy/payoutStrategy"); -jest.mock("../../../features/api/round"); -jest.mock("../../../features/api/ipfs"); -jest.mock("../../../features/api/subgraph"); -jest.mock("../../../features/common/Auth", () => ({ - useWallet: () => mockWallet, -})); -jest.mock("wagmi"); -jest.mock("@rainbow-me/rainbowkit", () => ({ - ConnectButton: jest.fn(), -})); - -describe("", () => { - function invokeCreateRound() { - const createRound = screen.getByTestId("create-round"); - fireEvent.click(createRound); - } - - describe("Set IPFS Status", () => { - it("sets ipfs status to in progress when saving to ipfs", async () => { - (saveToIPFS as jest.Mock).mockReturnValue( - new Promise(() => { - /* do nothing.*/ - }) - ); - - renderWithProvider(); - invokeCreateRound(); - - expect( - await screen.findByTestId( - `storing-status-is-${ProgressStatus.IN_PROGRESS}` - ) - ); - }); - - it("sets ipfs status to complete when saving to ipfs succeeds", async () => { - (saveToIPFS as jest.Mock).mockResolvedValue("my ipfs doc :)))"); - - renderWithProvider(); - invokeCreateRound(); - - expect( - await screen.findByTestId( - `storing-status-is-${ProgressStatus.IS_SUCCESS}` - ) - ); - }); - }); - - describe("Set Voting Contract Deployment Status", () => { - beforeEach(() => { - const ipfsHash = "bafabcdef"; - (saveToIPFS as jest.Mock).mockResolvedValue(ipfsHash); - (deployRoundContract as jest.Mock).mockReturnValue( - new Promise(() => ({ transactionBlockNumber: 0 })) - ); - }); - - it("sets voting contract deployment status to in progress when voting contract is being deployed", async () => { - renderWithProvider(); - invokeCreateRound(); - - expect( - await screen.findByTestId( - `voting-deploying-status-is-${ProgressStatus.IN_PROGRESS}` - ) - ); - }); - - it("sets voting contract deployment status to success when voting contract has been deployed", async () => { - renderWithProvider(); - (deployRoundContract as jest.Mock).mockResolvedValue({ - transactionBlockNumber: 0, - }); - invokeCreateRound(); - - expect( - await screen.findByTestId( - `voting-deploying-status-is-${ProgressStatus.IS_SUCCESS}` - ) - ); - }); - }); - - describe("Set Payout Contract Deployment Status", () => { - beforeEach(() => { - const ipfsHash = "bafabcdef"; - (saveToIPFS as jest.Mock).mockResolvedValue(ipfsHash); - (deployRoundContract as jest.Mock).mockReturnValue( - new Promise(() => ({ transactionBlockNumber: 0 })) - ); - }); - - it("sets payout contract deployment status to in progress when payout contract is being deployed", async () => { - renderWithProvider(); - invokeCreateRound(); - - expect( - await screen.findByTestId( - `payout-deploying-status-is-${ProgressStatus.IN_PROGRESS}` - ) - ); - }); - - it("sets payout contract deployment status to success when payout contract has been deployed", async () => { - renderWithProvider(); - (deployRoundContract as jest.Mock).mockResolvedValue({ - transactionBlockNumber: 0, - }); - invokeCreateRound(); - - expect( - await screen.findByTestId( - `payout-deploying-status-is-${ProgressStatus.IS_SUCCESS}` - ) - ); - }); - }); - - describe("Set Round Contract Deployment Status", () => { - const ipfsHash = "bafabcdef"; - beforeEach(() => { - (saveToIPFS as jest.Mock).mockResolvedValue(ipfsHash); - }); - - it("sets round contract deployment status to in progress when round contract is being deployed", async () => { - (deployRoundContract as jest.Mock).mockReturnValue( - new Promise(() => { - /* do nothing.*/ - }) - ); - - renderWithProvider(); - invokeCreateRound(); - - expect( - await screen.findByTestId( - `round-deploying-status-is-${ProgressStatus.IN_PROGRESS}` - ) - ); - const firstCall = (deployRoundContract as jest.Mock).mock.calls[0]; - const roundParameter = firstCall[0]; - const actualRoundMetadataPointer = roundParameter.store; - expect(actualRoundMetadataPointer).toEqual({ - protocol: 1, - pointer: ipfsHash, - }); - const actualApplicationSchemaPointer = roundParameter.applicationStore; - expect(actualApplicationSchemaPointer).toEqual({ - protocol: 1, - pointer: ipfsHash, - }); - }); - - it("sets round contract deployment status to success when round contract has been deployed", async () => { - (deployRoundContract as jest.Mock).mockResolvedValue({}); - - renderWithProvider(); - invokeCreateRound(); - - expect( - await screen.findByTestId( - `round-deploying-status-is-${ProgressStatus.IS_SUCCESS}` - ) - ); - }); - }); - - describe("Set Indexing Status", () => { - const transactionBlockNumber = 10; - beforeEach(() => { - (saveToIPFS as jest.Mock).mockResolvedValue("bafabcdef"); - (deployRoundContract as jest.Mock).mockResolvedValue({ - transactionBlockNumber, - }); - }); - - it("sets indexing status to in progress when waiting for subgraph to index", async () => { - (waitForSubgraphSyncTo as jest.Mock).mockReturnValue( - new Promise(() => { - /* do nothing.*/ - }) - ); - - renderWithProvider(); - invokeCreateRound(); - - expect( - await screen.findByTestId( - `indexing-status-is-${ProgressStatus.IN_PROGRESS}` - ) - ); - }); - - it("sets indexing status to completed when subgraph is finished indexing", async () => { - (waitForSubgraphSyncTo as jest.Mock).mockResolvedValue( - transactionBlockNumber - ); - - renderWithProvider(); - invokeCreateRound(); - - expect( - await screen.findByTestId( - `indexing-status-is-${ProgressStatus.IS_SUCCESS}` - ) - ); - }); - }); - - describe("useCreateRound() Errors", () => { - let consoleErrorSpy: jest.SpyInstance; - - beforeEach(() => { - consoleErrorSpy = jest.spyOn(console, "error").mockImplementation(() => { - /* do nothing.*/ - }); - - // set up initial mocks for each internal function call - (saveToIPFS as jest.Mock).mockResolvedValue("asdf"); - (deployRoundContract as jest.Mock).mockResolvedValue({ - transactionBlockNumber: 100, - }); - (waitForSubgraphSyncTo as jest.Mock).mockResolvedValue(100); - }); - - afterEach(() => { - consoleErrorSpy.mockClear(); - }); - - it("sets ipfs status to error when ipfs save fails", async () => { - (saveToIPFS as jest.Mock).mockRejectedValue(new Error(":(")); - - renderWithProvider(); - invokeCreateRound(); - - expect( - await screen.findByTestId( - `storing-status-is-${ProgressStatus.IS_ERROR}` - ) - ).toBeInTheDocument(); - }); - - it("sets voting contract deployment status to error when voting deployment fails", async () => { - (deployRoundContract as jest.Mock).mockRejectedValue( - new Error("Failed to deploy :(") - ); - - renderWithProvider(); - invokeCreateRound(); - - expect( - await screen.findByTestId( - `voting-deploying-status-is-${ProgressStatus.IS_ERROR}` - ) - ).toBeInTheDocument(); - }); - - it("sets round contract deployment status to error when round deployment fails", async () => { - (deployRoundContract as jest.Mock).mockRejectedValue( - new Error("Failed to deploy :(") - ); - - renderWithProvider(); - invokeCreateRound(); - - expect( - await screen.findByTestId( - `round-deploying-status-is-${ProgressStatus.IS_ERROR}` - ) - ).toBeInTheDocument(); - }); - - it("sets indexing status to error when waiting for subgraph to sync fails", async () => { - (waitForSubgraphSyncTo as jest.Mock).mockRejectedValue(new Error(":(")); - - renderWithProvider(); - invokeCreateRound(); - - expect( - await screen.findByTestId( - `indexing-status-is-${ProgressStatus.IS_ERROR}` - ) - ).toBeInTheDocument(); - }); - - it("if ipfs save fails, resets ipfs status when create round is retried", async () => { - (saveToIPFS as jest.Mock) - .mockRejectedValueOnce(new Error(":(")) - .mockReturnValue( - new Promise(() => { - /* do nothing.*/ - }) - ); - - renderWithProvider(); - invokeCreateRound(); - - await screen.findByTestId(`storing-status-is-${ProgressStatus.IS_ERROR}`); - - // retry create-round operation - invokeCreateRound(); - - expect( - screen.queryByTestId(`storing-status-is-${ProgressStatus.IS_ERROR}`) - ).not.toBeInTheDocument(); - }); - - it("if voting contract deployment fails, resets voting contract deployment status when create round is retried", async () => { - (deployRoundContract as jest.Mock) - .mockRejectedValueOnce(new Error(":(")) - .mockReturnValue( - new Promise(() => { - /* do nothing.*/ - }) - ); - - renderWithProvider(); - invokeCreateRound(); - - await screen.findByTestId( - `voting-deploying-status-is-${ProgressStatus.IS_ERROR}` - ); - - invokeCreateRound(); - - expect( - screen.queryByTestId( - `voting-deploying-status-is-${ProgressStatus.IS_ERROR}` - ) - ).not.toBeInTheDocument(); - }); - - it("if round contract deployment fails, resets round contract deployment status when create round is retried", async () => { - (deployRoundContract as jest.Mock) - .mockRejectedValueOnce(new Error(":(")) - .mockReturnValue( - new Promise(() => { - /* do nothing.*/ - }) - ); - - renderWithProvider(); - invokeCreateRound(); - - await screen.findByTestId( - `round-deploying-status-is-${ProgressStatus.IS_ERROR}` - ); - - invokeCreateRound(); - - expect( - screen.queryByTestId( - `round-deploying-status-is-${ProgressStatus.IS_ERROR}` - ) - ).not.toBeInTheDocument(); - }); - - it("if indexing fails, resets indexing status when create round is retried", async () => { - (waitForSubgraphSyncTo as jest.Mock) - .mockRejectedValueOnce(new Error(":(")) - .mockReturnValue( - new Promise(() => { - /* do nothing.*/ - }) - ); - - renderWithProvider(); - invokeCreateRound(); - - await screen.findByTestId( - `indexing-status-is-${ProgressStatus.IS_ERROR}` - ); - - invokeCreateRound(); - - expect( - screen.queryByTestId(`indexing-status-is-${ProgressStatus.IS_ERROR}`) - ).not.toBeInTheDocument(); - }); - }); -}); - -const TestUseCreateRoundComponent = () => { - const { - createRound, - IPFSCurrentStatus, - votingContractDeploymentStatus, - payoutContractDeploymentStatus, - roundContractDeploymentStatus, - indexingStatus, - } = useCreateRound(); - - return ( -
- - -
- -
- -
- -
- -
-
- ); -}; - -function renderWithProvider(ui: JSX.Element) { - render({ui}); -} diff --git a/packages/builder/src/components/AlloWrapper.tsx b/packages/round-manager/src/features/api/AlloWrapper.tsx similarity index 91% rename from packages/builder/src/components/AlloWrapper.tsx rename to packages/round-manager/src/features/api/AlloWrapper.tsx index 972b1d864f..b9c0bfa792 100644 --- a/packages/builder/src/components/AlloWrapper.tsx +++ b/packages/round-manager/src/features/api/AlloWrapper.tsx @@ -7,10 +7,10 @@ import { createPinataIpfsUploader, createWaitForIndexerSyncTo, } from "common"; -import { getConfig } from "common/src/config"; import { useEffect, useState } from "react"; import { useNetwork, useProvider, useSigner } from "wagmi"; -import { addressesByChainID } from "../contracts/deployments"; +import { getConfig } from "common/src/config"; +import { addressesByChainID } from "./deployments"; function AlloWrapper({ children }: { children: JSX.Element | JSX.Element[] }) { const { chain } = useNetwork(); @@ -24,7 +24,7 @@ function AlloWrapper({ children }: { children: JSX.Element | JSX.Element[] }) { if (!web3Provider || !signer || !chainID) { setBackend(null); } else { - const addresses = addressesByChainID(chainID!); + const addresses = addressesByChainID(chainID); const config = getConfig(); let alloBackend: Allo; @@ -42,6 +42,7 @@ function AlloWrapper({ children }: { children: JSX.Element | JSX.Element[] }) { waitUntilIndexerSynced: createWaitForIndexerSyncTo( `${getConfig().dataLayer.gsIndexerEndpoint}/graphql` ), + allo: addresses.projectRegistry as `0x${string}`, }); setBackend(alloBackend); @@ -52,7 +53,6 @@ function AlloWrapper({ children }: { children: JSX.Element | JSX.Element[] }) { signer, web3Provider ), - projectRegistryAddress: addresses?.projectRegistry! as `0x${string}`, ipfsUploader: createPinataIpfsUploader({ token: getConfig().pinata.jwt, endpoint: `${getConfig().pinata.baseUrl}/pinning/pinFileToIPFS`, diff --git a/packages/round-manager/src/features/api/deployments.ts b/packages/round-manager/src/features/api/deployments.ts new file mode 100644 index 0000000000..3897eef0f5 --- /dev/null +++ b/packages/round-manager/src/features/api/deployments.ts @@ -0,0 +1,104 @@ +import { ChainId } from "common"; + +export const chains = { + 1: "mainnet", + 10: "optimism", + 11155111: "sepolia", + 250: "fantom", + 280: "zkSyncEraTestnet", + 324: "zkSyncEraMainnet", + 424: "pgn", + 4002: "fantomTestnet", + 31337: "localhost", + 313371: "dev1", + 313372: "dev2", + 58008: "pgnTestnet", + 42161: "arbitrum", + 421613: "arbitrumGoerli", + 43114: "avalanche", + 43113: "fuji", + 137: "polygon", + 80001: "polygonMumbai", + 8453: "base", +} as const; + +export type ChainName = (typeof chains)[keyof typeof chains]; + +export type DeploymentAddress = { + [key in ChainName]: { + projectRegistry: string | undefined; + }; +}; + +type DeploymentAddresses = { + projectRegistry: string | undefined; +}; + +export type DeploymentAddressesMap = { + [key in ChainName]: DeploymentAddresses; +}; + +export const addresses: DeploymentAddressesMap = { + dev1: { + projectRegistry: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + }, + dev2: { + projectRegistry: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + }, + localhost: { + projectRegistry: "0x832c5391dc7931312CbdBc1046669c9c3A4A28d5", + }, + optimism: { + projectRegistry: "0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174", + }, + mainnet: { + projectRegistry: "0x03506eD3f57892C85DB20C36846e9c808aFe9ef4", + }, + fantomTestnet: { + projectRegistry: "0x984749e408FF0446d8ADaf20E293F2F299396631", + }, + fantom: { + projectRegistry: "0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174", + }, + pgn: { + projectRegistry: "0xDF9BF58Aa1A1B73F0e214d79C652a7dd37a6074e", + }, + pgnTestnet: { + projectRegistry: "0x6294bed5B884Ae18bf737793Ef9415069Bf4bc11", + }, + arbitrum: { + projectRegistry: "0x73AB205af1476Dc22104A6B8b3d4c273B58C6E27", + }, + arbitrumGoerli: { + projectRegistry: "0x0CD135777dEaB6D0Bb150bDB0592aC9Baa4d0871", + }, + avalanche: { + projectRegistry: "0xDF9BF58Aa1A1B73F0e214d79C652a7dd37a6074e", + }, + fuji: { + projectRegistry: "0x8918401DD47f1645fF1111D8E513c0404b84d5bB", + }, + polygon: { + projectRegistry: "0x5C5E2D94b107C7691B08E43169fDe76EAAB6D48b", + }, + polygonMumbai: { + projectRegistry: "0x545B282A50EaeA01A619914d44105437036CbB36", + }, + zkSyncEraMainnet: { + projectRegistry: "0xe6CCEe93c97E20644431647B306F48e278aFFdb9", + }, + zkSyncEraTestnet: { + projectRegistry: "0xb0F4882184EB6e3ed120c5181651D50719329788", + }, + base: { + projectRegistry: "0xA78Daa89fE9C1eC66c5cB1c5833bC8C6Cb307918", + }, + sepolia: { + projectRegistry: "0x2420EABfA2C0e6f77E435B0B7615c848bF4963AF", + }, +}; + +export const addressesByChainID = (chainId: ChainId): DeploymentAddresses => { + const chainName = chains[chainId]; + return addresses[chainName]; +}; diff --git a/packages/round-manager/src/features/api/payoutTokens.ts b/packages/round-manager/src/features/api/payoutTokens.ts index 15a563a13a..90edb493b6 100644 --- a/packages/round-manager/src/features/api/payoutTokens.ts +++ b/packages/round-manager/src/features/api/payoutTokens.ts @@ -1,6 +1,7 @@ -import { ChainId, RedstoneTokenIds } from "common"; +import { ChainId } from "common"; import { ethers } from "ethers"; import { Address } from "wagmi"; +import { RedstoneTokenIds } from "common/src/chain-ids"; export type PayoutToken = { name: string; diff --git a/packages/round-manager/src/features/api/round.ts b/packages/round-manager/src/features/api/round.ts index c551c4772f..a27de4db4b 100644 --- a/packages/round-manager/src/features/api/round.ts +++ b/packages/round-manager/src/features/api/round.ts @@ -346,6 +346,10 @@ export async function listRounds( fetchFromIPFS(round.applicationMetaPtr.pointer), ]); + if (round.roles.length === 0) { + continue; + } + const operatorWallets = round.roles[0].accounts.map( (account: { address: string }) => account.address ); diff --git a/packages/round-manager/src/features/common/__tests__/AddQuestionModal.test.tsx b/packages/round-manager/src/features/common/__tests__/AddQuestionModal.test.tsx index 7f4e0f1da8..5379b4821f 100644 --- a/packages/round-manager/src/features/common/__tests__/AddQuestionModal.test.tsx +++ b/packages/round-manager/src/features/common/__tests__/AddQuestionModal.test.tsx @@ -1,10 +1,5 @@ import { fireEvent, render, screen } from "@testing-library/react"; import { MemoryRouter } from "react-router-dom"; -import { - CreateRoundContext, - CreateRoundState, - initialCreateRoundState, -} from "../../../context/round/CreateRoundContext"; import { EditQuestion } from "../../api/types"; import AddQuestionModal from "../AddQuestionModal"; @@ -111,16 +106,5 @@ describe("AddQuestionModal", () => { }); }); -export const renderWithContext = ( - ui: JSX.Element, - createRoundStateOverrides: Partial = {} -) => - render( - - - {ui} - - - ); +export const renderWithContext = (ui: JSX.Element) => + render({ui}); diff --git a/packages/round-manager/src/features/round/RoundApplicationForm.tsx b/packages/round-manager/src/features/round/RoundApplicationForm.tsx index 3595b01958..2ab428de5c 100644 --- a/packages/round-manager/src/features/round/RoundApplicationForm.tsx +++ b/packages/round-manager/src/features/round/RoundApplicationForm.tsx @@ -8,10 +8,14 @@ import { import { PencilIcon, PlusSmIcon, XIcon } from "@heroicons/react/solid"; import { Button } from "common/src/styles"; import { useContext, useEffect, useState } from "react"; -import { SubmitHandler, useFieldArray, useForm } from "react-hook-form"; +import { + DeepRequired, + SubmitHandler, + useFieldArray, + useForm, +} from "react-hook-form"; import { NavigateFunction, useLocation, useNavigate } from "react-router-dom"; import { errorModalDelayMs } from "../../constants"; -import { useCreateRound } from "../../context/round/CreateRoundContext"; import { ApplicationMetadata, EditQuestion, @@ -35,6 +39,10 @@ import { InputIcon } from "../common/InputIcon"; import PreviewQuestionModal from "../common/PreviewQuestionModal"; import ProgressModal from "../common/ProgressModal"; import _ from "lodash"; +import { useCreateRoundStore } from "../../stores/createRoundStore"; +import { useAllo } from "common"; +import { getAddress } from "viem"; +import { useWallet } from "../common/Auth"; export const initialQuestionsQF: SchemaQuestion[] = [ { @@ -177,6 +185,7 @@ export function RoundApplicationForm(props: { const [openPreviewModal, setOpenPreviewModal] = useState(false); const [openAddQuestionModal, setOpenAddQuestionModal] = useState(false); const [toEdit, setToEdit] = useState(); + const { signer: walletSigner } = useWallet(); const { currentStep, setCurrentStep, stepsCount, formData } = useContext(FormContext); @@ -200,8 +209,7 @@ export function RoundApplicationForm(props: { ? initialQuestionsQF : initialQuestionsDirect; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { control, handleSubmit, register, getValues } = useForm({ + const { control, handleSubmit } = useForm({ defaultValues: { ...formData, applicationMetadata: { @@ -215,47 +223,47 @@ export function RoundApplicationForm(props: { control, }); - // eslint-disable-next-line @typescript-eslint/no-unused-vars const [projectRequirements, setProjectRequirements] = useState({ ...initialRequirements }); const { createRound, - IPFSCurrentStatus, - votingContractDeploymentStatus, - payoutContractDeploymentStatus, - roundContractDeploymentStatus, + clearStatuses, + ipfsStatus, + contractDeploymentStatus, indexingStatus, - } = useCreateRound(); + } = useCreateRoundStore(); + /** Upon succesful creation of round, redirect to program details */ useEffect(() => { const isSuccess = - IPFSCurrentStatus === ProgressStatus.IS_SUCCESS && - votingContractDeploymentStatus === ProgressStatus.IS_SUCCESS && - payoutContractDeploymentStatus === ProgressStatus.IS_SUCCESS && - roundContractDeploymentStatus === ProgressStatus.IS_SUCCESS && + ipfsStatus === ProgressStatus.IS_SUCCESS && + contractDeploymentStatus === ProgressStatus.IS_SUCCESS && indexingStatus === ProgressStatus.IS_SUCCESS; if (isSuccess) { redirectToProgramDetails(navigate, 2000, programId); + /* Clear the store progress statuses in order to not redirect when creating another round */ + /*The delay is to prevent clearing the statuses before the user is redirected */ + setTimeout(() => { + clearStatuses(); + }, 3_000); } }, [ - IPFSCurrentStatus, - votingContractDeploymentStatus, - payoutContractDeploymentStatus, - roundContractDeploymentStatus, + contractDeploymentStatus, + ipfsStatus, indexingStatus, programId, navigate, roundCategory, + clearStatuses, ]); + /** If there's an error, show an error dialog and redirect back to program */ useEffect(() => { if ( - IPFSCurrentStatus === ProgressStatus.IS_ERROR || - votingContractDeploymentStatus === ProgressStatus.IS_ERROR || - payoutContractDeploymentStatus === ProgressStatus.IS_ERROR || - roundContractDeploymentStatus === ProgressStatus.IS_ERROR + ipfsStatus === ProgressStatus.IS_ERROR || + contractDeploymentStatus === ProgressStatus.IS_ERROR ) { setTimeout(() => { setOpenErrorModal(true); @@ -266,26 +274,26 @@ export function RoundApplicationForm(props: { redirectToProgramDetails(navigate, 5000, programId); } }, [ - IPFSCurrentStatus, - votingContractDeploymentStatus, - payoutContractDeploymentStatus, - roundContractDeploymentStatus, + contractDeploymentStatus, indexingStatus, + ipfsStatus, navigate, programId, ]); const prev = () => setCurrentStep(currentStep - 1); + const allo = useAllo(); + const next: SubmitHandler = async (values) => { try { setOpenProgressModal(true); - const data: Partial = _.merge(formData, values); + const data = _.merge(formData, values); - const roundMetadataWithProgramContractAddress: Round["roundMetadata"] = { + const roundMetadataWithProgramContractAddress = { ...(data.roundMetadata as Round["roundMetadata"]), programContractAddress: programId, - }; + } as DeepRequired; const applicationQuestions = { lastUpdatedOn: Date.now(), @@ -300,13 +308,25 @@ export function RoundApplicationForm(props: { ...data, ownedBy: programId, operatorWallets: props.initialData.program.operatorWallets, - } as Round; - - await createRound({ - roundMetadataWithProgramContractAddress, - applicationQuestions, - round, - roundCategory, + } as DeepRequired; + + await createRound(allo, { + roundData: { + roundCategory: roundCategory, + roundMetadataWithProgramContractAddress, + applicationQuestions, + roundStartTime: round.roundStartTime, + roundEndTime: round.roundEndTime, + applicationsStartTime: round.applicationsStartTime, + applicationsEndTime: round.applicationsEndTime, + token: round.token, + matchingFundsAvailable: + round.roundMetadata.quadraticFundingConfig + ?.matchingFundsAvailable ?? 0, + roundOperators: round.operatorWallets.map(getAddress), + }, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + walletSigner: walletSigner!, }); } catch (error) { datadogLogs.logger.error( @@ -320,22 +340,12 @@ export function RoundApplicationForm(props: { { name: "Storing", description: "The metadata is being saved in a safe place.", - status: IPFSCurrentStatus, - }, - { - name: "Deploying", - description: "The voting contract is being deployed.", - status: votingContractDeploymentStatus, - }, - { - name: "Deploying", - description: "The payout contract is being deployed.", - status: payoutContractDeploymentStatus, + status: ipfsStatus, }, { name: "Deploying", description: "The round contract is being deployed.", - status: roundContractDeploymentStatus, + status: contractDeploymentStatus, }, { name: "Indexing", @@ -353,10 +363,8 @@ export function RoundApplicationForm(props: { ]; const disableNext: boolean = - IPFSCurrentStatus === ProgressStatus.IN_PROGRESS || - votingContractDeploymentStatus === ProgressStatus.IN_PROGRESS || - payoutContractDeploymentStatus === ProgressStatus.IN_PROGRESS || - roundContractDeploymentStatus === ProgressStatus.IN_PROGRESS || + ipfsStatus === ProgressStatus.IN_PROGRESS || + contractDeploymentStatus === ProgressStatus.IN_PROGRESS || indexingStatus === ProgressStatus.IN_PROGRESS || indexingStatus === ProgressStatus.IS_SUCCESS || !props.initialData.program; @@ -365,7 +373,7 @@ export function RoundApplicationForm(props: { data: [ keyof ProjectRequirements, keyof ProjectRequirements[keyof ProjectRequirements], - boolean + boolean, ][] ) => { let tmpRequirements = { ...projectRequirements }; @@ -576,7 +584,7 @@ const ProjectSocials = ({ data: [ keyof ProjectRequirements, keyof ProjectRequirements[keyof ProjectRequirements], - boolean + boolean, ][] ) => void; requirements: ProjectRequirements; diff --git a/packages/round-manager/src/features/round/__tests__/RoundApplicationForm.test.tsx b/packages/round-manager/src/features/round/__tests__/RoundApplicationForm.test.tsx index bdfb028e7c..27a627415f 100644 --- a/packages/round-manager/src/features/round/__tests__/RoundApplicationForm.test.tsx +++ b/packages/round-manager/src/features/round/__tests__/RoundApplicationForm.test.tsx @@ -9,11 +9,7 @@ import { import { randomInt } from "crypto"; import { act } from "react-dom/test-utils"; import { MemoryRouter } from "react-router-dom"; -import { - CreateRoundContext, - CreateRoundState, - initialCreateRoundState, -} from "../../../context/round/CreateRoundContext"; + import { saveToIPFS } from "../../api/ipfs"; import { deployRoundContract } from "../../api/round"; import { waitForSubgraphSyncTo } from "../../api/subgraph"; @@ -26,10 +22,11 @@ import { useWallet } from "../../common/Auth"; import { FormStepper } from "../../common/FormStepper"; import { FormContext } from "../../common/FormWizard"; import { - RoundApplicationForm, initialQuestionsQF, + RoundApplicationForm, } from "../RoundApplicationForm"; import { errorModalDelayMs } from "../../../constants"; +import { useCreateRoundStore } from "../../../stores/createRoundStore"; jest.mock("../../api/ipfs"); jest.mock("../../api/round"); @@ -39,12 +36,32 @@ jest.mock("../../api/payoutStrategy/payoutStrategy"); jest.mock("@rainbow-me/rainbowkit", () => ({ ConnectButton: jest.fn(), })); - +jest.mock("wagmi", () => ({ + useNetwork: () => ({ + chain: jest.fn(), + chains: [ + { + id: 10, + name: "Optimism", + }, + ], + }), + useProvider: () => ({}), +})); jest.mock("../../../constants", () => ({ ...jest.requireActual("../../../constants"), errorModalDelayMs: 0, // NB: use smaller delay for faster tests })); +jest.mock("common", () => ({ + ...jest.requireActual("common"), + useAllo: () => ({}), +})); + +jest.mock("../../../stores/createRoundStore", () => ({ + ...jest.requireActual("../../../stores/createRoundStore"), +})); + beforeEach(() => { jest.setTimeout(10000); jest.clearAllMocks(); @@ -92,10 +109,12 @@ describe("", () => { }} stepper={FormStepper} configuration={{ roundCategory: RoundCategory.QuadraticFunding }} - />, - { IPFSCurrentStatus: ProgressStatus.IS_ERROR } + /> ); await startProgressModal(); + useCreateRoundStore.setState({ + ipfsStatus: ProgressStatus.IS_ERROR, + }); await waitFor( async () => expect(await screen.findByTestId("error-modal")).toBeInTheDocument(), @@ -113,10 +132,12 @@ describe("", () => { }, }} stepper={FormStepper} - />, - { IPFSCurrentStatus: ProgressStatus.IS_ERROR } + /> ); await startProgressModal(); + useCreateRoundStore.setState({ + ipfsStatus: ProgressStatus.IS_ERROR, + }); const done = await screen.findByTestId("done"); fireEvent.click(done); @@ -134,37 +155,27 @@ describe("", () => { }, }} stepper={FormStepper} - />, - { IPFSCurrentStatus: ProgressStatus.IS_ERROR } + /> ); await startProgressModal(); + useCreateRoundStore.setState({ + ipfsStatus: ProgressStatus.IS_ERROR, + }); await waitFor( async () => expect(await screen.findByTestId("error-modal")).toBeInTheDocument(), { timeout: errorModalDelayMs + 1000 } ); - const saveToIpfsCalls = (saveToIPFS as jest.Mock).mock.calls.length; - expect(saveToIpfsCalls).toEqual(2); const errorModalTryAgain = await screen.findByTestId("tryAgain"); fireEvent.click(errorModalTryAgain); expect(screen.queryByTestId("error-modal")).not.toBeInTheDocument(); - await waitFor(() => { - expect((saveToIPFS as jest.Mock).mock.calls.length).toEqual( - saveToIpfsCalls + 2 - ); - }); }); }); describe("when saving round application metadata succeeds but create round transaction fails", () => { - const createRoundStateOverride = { - IPFSCurrentStatus: ProgressStatus.IS_SUCCESS, - roundContractDeploymentStatus: ProgressStatus.IS_ERROR, - }; - const startProgressModal = async () => { const launch = screen.getByRole("button", { name: /Launch/i }); fireEvent.click(launch); @@ -180,10 +191,13 @@ describe("", () => { }, }} stepper={FormStepper} - />, - createRoundStateOverride + /> ); await startProgressModal(); + useCreateRoundStore.setState({ + ipfsStatus: ProgressStatus.IS_SUCCESS, + contractDeploymentStatus: ProgressStatus.IS_ERROR, + }); await waitFor( async () => expect(await screen.findByTestId("error-modal")).toBeInTheDocument(), @@ -862,16 +876,5 @@ describe("Application Form Builder", () => { }); }); -export const renderWithContext = ( - ui: JSX.Element, - createRoundStateOverrides: Partial = {} -) => - render( - - - {ui} - - - ); +export const renderWithContext = (ui: JSX.Element) => + render({ui}); diff --git a/packages/round-manager/src/index.tsx b/packages/round-manager/src/index.tsx index 56317659a8..b44a1857b4 100644 --- a/packages/round-manager/src/index.tsx +++ b/packages/round-manager/src/index.tsx @@ -18,7 +18,6 @@ import { ApplicationProvider } from "./context/application/ApplicationContext"; import { BulkUpdateGrantApplicationProvider } from "./context/application/BulkUpdateGrantApplicationContext"; import { CreateProgramProvider } from "./context/program/CreateProgramContext"; import { ReadProgramProvider } from "./context/program/ReadProgramContext"; -import { CreateRoundProvider } from "./context/round/CreateRoundContext"; import { FinalizeRoundProvider } from "./context/round/FinalizeRoundContext"; import { FundContractProvider } from "./context/round/FundContractContext"; import { ReclaimFundsProvider } from "./context/round/ReclaimFundsContext"; @@ -34,6 +33,7 @@ import ViewApplication from "./features/round/ViewApplicationPage"; import ViewRoundPage from "./features/round/ViewRoundPage"; import { initSentry } from "./sentry"; import { UpdateRoundProvider } from "./context/round/UpdateRoundContext"; +import AlloWrapper from "./features/api/AlloWrapper"; import { DataLayer, DataLayerProvider } from "data-layer"; import { getConfig } from "common/src/config"; @@ -69,94 +69,94 @@ root.render( - - - - {/* Protected Routes */} - }> - {/* Default Route */} - - - - } - /> - - {/* Round Routes */} - - - - - - } - /> - - - - - - - - - - - - - - - - } - /> - - - - - - - - } - /> + + + + + {/* Protected Routes */} + }> + {/* Default Route */} + + + + } + /> - {/* Program Routes */} - - - - } - /> - + {/* Round Routes */} + - + - - } - /> + } + /> + + + + + + + + + + + + + + + + } + /> + + + + + + + + } + /> + + {/* Program Routes */} + + + + } + /> + + + + + + } + /> - {/* Access Denied */} - } /> + {/* Access Denied */} + } /> - {/* 404 */} - } /> - - - - + {/* 404 */} + } /> + + + + + diff --git a/packages/round-manager/src/stores/createRoundStore.ts b/packages/round-manager/src/stores/createRoundStore.ts new file mode 100644 index 0000000000..58a486358a --- /dev/null +++ b/packages/round-manager/src/stores/createRoundStore.ts @@ -0,0 +1,112 @@ +import { create } from "zustand"; +import { ProgressStatus } from "../features/api/types"; +import { Address } from "viem"; +import { Allo } from "common"; +import { error, Result } from "common/src/allo/common"; + +import { CreateRoundArguments } from "common/dist/allo/allo"; + +export type CreateRoundStoreState = { + ipfsStatus: ProgressStatus; + contractDeploymentStatus: ProgressStatus; + indexingStatus: ProgressStatus; + round: Address | undefined; + createRound: ( + allo: Allo, + createRoundData: CreateRoundArguments + ) => Promise< + Result<{ + roundId: Address; + }> + >; + clearStatuses: () => void; +}; + +export const useCreateRoundStore = create((set) => ({ + ipfsStatus: ProgressStatus.NOT_STARTED, + contractDeploymentStatus: ProgressStatus.NOT_STARTED, + indexingStatus: ProgressStatus.NOT_STARTED, + clearStatuses: () => { + set({ + indexingStatus: ProgressStatus.NOT_STARTED, + contractDeploymentStatus: ProgressStatus.NOT_STARTED, + ipfsStatus: ProgressStatus.NOT_STARTED, + }); + }, + round: undefined, + createRound: async (allo: Allo, createRoundData: CreateRoundArguments) => { + set({ + indexingStatus: ProgressStatus.NOT_STARTED, + contractDeploymentStatus: ProgressStatus.NOT_STARTED, + ipfsStatus: ProgressStatus.IN_PROGRESS, + }); + + try { + const round = await allo + .createRound(createRoundData) + .on("ipfsStatus", (res) => { + if (res.type === "success") { + set({ + ipfsStatus: ProgressStatus.IS_SUCCESS, + contractDeploymentStatus: ProgressStatus.IN_PROGRESS, + }); + } else { + set({ + ipfsStatus: ProgressStatus.IS_ERROR, + }); + } + }) + .on("indexingStatus", (res) => { + if (res.type === "success") { + set({ + indexingStatus: ProgressStatus.IS_SUCCESS, + }); + } else { + set({ + indexingStatus: ProgressStatus.IS_ERROR, + }); + } + }) + .on("transaction", (res) => { + if (res.type === "success") { + set({ + contractDeploymentStatus: ProgressStatus.IS_SUCCESS, + indexingStatus: ProgressStatus.IN_PROGRESS, + }); + } else { + set({ + contractDeploymentStatus: ProgressStatus.IS_ERROR, + }); + } + }) + .on("transactionStatus", (res) => { + if (res.type === "success") { + set({ + contractDeploymentStatus: ProgressStatus.IS_SUCCESS, + }); + } else { + set({ + contractDeploymentStatus: ProgressStatus.IS_ERROR, + }); + } + }) + .execute(); + + if (round.type === "success") { + set({ + round: round.value.roundId, + }); + } + + return round; + } catch (e) { + set({ + indexingStatus: ProgressStatus.IS_ERROR, + contractDeploymentStatus: ProgressStatus.IS_ERROR, + ipfsStatus: ProgressStatus.IS_ERROR, + }); + + return error(e as Error); + } + }, +})); diff --git a/packages/round-manager/tsconfig.json b/packages/round-manager/tsconfig.json index 1f12de49a6..afd45ce8e3 100644 --- a/packages/round-manager/tsconfig.json +++ b/packages/round-manager/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es5", + "target": "es2020", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c8741acc43..aedefdd219 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,5 +1,9 @@ lockfileVersion: '6.0' +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + overrides: webpack: ^5 @@ -58,7 +62,7 @@ importers: version: 0.2.0 '@gitcoinco/passport-sdk-verifier': specifier: ^0.2.2 - version: 0.2.2 + version: 0.2.2(debug@4.3.4) '@headlessui/react': specifier: ^1.6.5 version: 1.7.17(react-dom@18.2.0)(react@18.2.0) @@ -136,7 +140,7 @@ importers: version: 10.4.15(postcss@8.4.29) axios: specifier: ^0.27.2 - version: 0.27.2 + version: 0.27.2(debug@4.3.4) buffer: specifier: ^6.0.3 version: 6.0.3 @@ -148,7 +152,7 @@ importers: version: link:../common craco-esbuild: specifier: ^0.5.2 - version: 0.5.2(@craco/craco@7.1.0)(react-scripts@5.0.1) + version: 0.5.2(@craco/craco@7.1.0)(esbuild@0.18.20)(react-scripts@5.0.1)(webpack@5.88.2) crypto-browserify: specifier: ^3.12.0 version: 3.12.0 @@ -175,7 +179,7 @@ importers: version: 1.0.0 jest: specifier: ^27.0 - version: 27.5.1 + version: 27.5.1(ts-node@10.9.1) os-browserify: specifier: ^0.3.0 version: 0.3.0 @@ -211,7 +215,7 @@ importers: version: 6.15.0(react-dom@18.2.0)(react@18.2.0) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0)(react@18.2.0)(typescript@5.3.3) + version: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(esbuild@0.18.20)(eslint@8.48.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.3.3) redux: specifier: ^4.2.1 version: 4.2.1 @@ -226,13 +230,13 @@ importers: version: 3.2.0 tailwindcss: specifier: ^3.0.24 - version: 3.3.3 + version: 3.3.3(ts-node@10.9.1) ts-debounce: specifier: ^4.0.0 version: 4.0.0 ts-jest: specifier: ^27.0 - version: 27.1.5(@babel/core@7.22.15)(@types/jest@27.5.2)(jest@27.5.1)(typescript@5.3.3) + version: 27.1.5(@babel/core@7.22.15)(@types/jest@27.5.2)(esbuild@0.18.20)(jest@27.5.1)(typescript@5.3.3) typescript: specifier: ^5.3.3 version: 5.3.3 @@ -333,12 +337,15 @@ importers: '@allo-team/allo-v2-sdk': specifier: ^1.0.38 version: 1.0.39(typescript@5.3.3)(zod@3.22.4) + '@ethersproject/abstract-signer': + specifier: ^5.7.0 + version: 5.7.0 '@ethersproject/providers': specifier: ^5.7.2 - version: 5.7.2 + version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@rainbow-me/rainbowkit': specifier: ^0.12.16 - version: 0.12.16(@types/react@18.2.21)(ethers@5.7.2)(react@18.2.0)(wagmi@0.12.19) + version: 0.12.16(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(wagmi@0.12.19) '@wagmi/chains': specifier: ^1.8.0 version: 1.8.0(typescript@5.3.3) @@ -356,7 +363,7 @@ importers: version: 5.7.2 framer-motion: specifier: ^10.12.7 - version: 10.16.4(react@18.2.0) + version: 10.16.4(react-dom@18.2.0)(react@18.2.0) markdown-it: specifier: ^13.0.1 version: 13.0.1 @@ -371,13 +378,13 @@ importers: version: 6.15.0(react@18.2.0) react-router-dom: specifier: ^6.11.1 - version: 6.15.0(react@18.2.0) + version: 6.15.0(react-dom@18.2.0)(react@18.2.0) swr: specifier: ^2.0.1 version: 2.2.2(react@18.2.0) tailwind-styled-components: specifier: ^2.2.0 - version: 2.2.0(react@18.2.0) + version: 2.2.0(react-dom@18.2.0)(react@18.2.0) tiny-emitter: specifier: ^2.1.0 version: 2.1.0 @@ -389,7 +396,7 @@ importers: version: 1.10.7(typescript@5.3.3)(zod@3.22.4) wagmi: specifier: 0.12.19 - version: 0.12.19(@types/react@18.2.21)(ethers@5.7.2)(react@18.2.0)(typescript@5.3.3)(zod@3.22.4) + version: 0.12.19(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(zod@3.22.4) zod: specifier: ^3.22.4 version: 3.22.4 @@ -435,7 +442,7 @@ importers: version: 3.3.0 graphql-request: specifier: ^6.1.0 - version: 6.1.0 + version: 6.1.0(graphql@16.8.0) knuth-shuffle-seeded: specifier: ^1.0.6 version: 1.0.6 @@ -559,7 +566,7 @@ importers: version: 2.8.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.21)(framer-motion@10.16.4)(react-dom@18.2.0)(react@18.2.0) '@craco/craco': specifier: ^7.1.0 - version: 7.1.0(@types/node@17.0.45)(postcss@8.4.29)(typescript@5.2.2) + version: 7.1.0(@types/node@17.0.45)(postcss@8.4.29)(react-scripts@5.0.1)(typescript@5.2.2) '@datadog/browser-logs': specifier: ^4.19.0 version: 4.48.1(@datadog/browser-rum@4.48.1) @@ -577,10 +584,10 @@ importers: version: 5.7.0 '@ethersproject/providers': specifier: ^5.7.2 - version: 5.7.2 + version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@gitcoinco/passport-sdk-verifier': specifier: ^0.2.2 - version: 0.2.2 + version: 0.2.2(debug@4.3.4) '@headlessui/react': specifier: ^1.7.4 version: 1.7.17(react-dom@18.2.0)(react@18.2.0) @@ -637,7 +644,7 @@ importers: version: github.com/gitcoinco/allo-indexer-client/2f8dcdf1f1611e0efd0f48aa8aa426b78d9e8508 babel-loader: specifier: ^8.3.0 - version: 8.3.0(@babel/core@7.22.15) + version: 8.3.0(@babel/core@7.22.15)(webpack@5.88.2) buffer: specifier: ^6.0.3 version: 6.0.3 @@ -646,7 +653,7 @@ importers: version: link:../common craco-esbuild: specifier: ^0.5.2 - version: 0.5.2(@craco/craco@7.1.0) + version: 0.5.2(@craco/craco@7.1.0)(esbuild@0.18.20)(react-scripts@5.0.1)(webpack@5.88.2) crypto-browserify: specifier: ^3.12.0 version: 3.12.0 @@ -851,7 +858,7 @@ importers: version: 2.2.0(react-dom@18.2.0)(react@18.2.0) tailwindcss: specifier: ^3.0.24 - version: 3.3.3 + version: 3.3.3(ts-node@10.9.1) ts-unused-exports: specifier: ^10.0.1 version: 10.0.1(typescript@5.2.2) @@ -887,7 +894,7 @@ importers: version: 5.7.0 '@ethersproject/providers': specifier: ^5.7.2 - version: 5.7.2 + version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@gitcoinco/passport-sdk-verifier': specifier: ^0.1.2 version: 0.1.2 @@ -904,8 +911,8 @@ importers: specifier: ^1.0.2 version: 1.0.5 '@rainbow-me/rainbowkit': - specifier: 0.12.16 - version: 0.12.16(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(wagmi@0.12.18) + specifier: 0.12.18 + version: 0.12.18(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(wagmi@0.12.18) '@reduxjs/toolkit': specifier: ^1.8.1 version: 1.9.5(react-redux@8.1.2)(react@18.2.0) @@ -938,7 +945,7 @@ importers: version: 13.4.0(react-dom@18.2.0)(react@18.2.0) '@testing-library/user-event': specifier: ^14.1.1 - version: 14.4.3 + version: 14.4.3(@testing-library/dom@9.3.1) '@types/jest': specifier: ^27.4.1 version: 27.5.2 @@ -1037,7 +1044,7 @@ importers: version: 6.15.0(react-dom@18.2.0)(react@18.2.0) react-scripts: specifier: 5.0.1 - version: 5.0.1(react@18.2.0)(typescript@5.3.3) + version: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(esbuild@0.18.20)(eslint@8.50.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.3.3) react-tooltip: specifier: ^4.4.2 version: 4.5.1(react-dom@18.2.0)(react@18.2.0) @@ -1068,6 +1075,9 @@ importers: verify-env: specifier: '*' version: link:../verify-env + viem: + specifier: ^2.5.0 + version: 2.7.1(typescript@5.3.3) wagmi: specifier: 0.12.18 version: 0.12.18(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) @@ -1077,6 +1087,9 @@ importers: yup: specifier: ^0.32.11 version: 0.32.11 + zustand: + specifier: ^4.4.0 + version: 4.4.1(@types/react@18.2.21)(react@18.2.0) devDependencies: '@faker-js/faker': specifier: ^7.4.0 @@ -1089,7 +1102,7 @@ importers: version: 0.4.4(tailwindcss@3.3.3) '@typechain/ethers-v5': specifier: 10.2.0 - version: 10.2.0(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.3.3) + version: 10.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.3.3) '@types/lodash': specifier: ^4.14.192 version: 4.14.198 @@ -1113,10 +1126,7 @@ importers: version: 10.4.15(postcss@8.4.29) craco-esbuild: specifier: ^0.5.2 - version: 0.5.2(@craco/craco@7.1.0)(react-scripts@5.0.1) - husky: - specifier: ^8.0.1 - version: 8.0.3 + version: 0.5.2(@craco/craco@7.1.0)(esbuild@0.18.20)(react-scripts@5.0.1)(webpack@5.88.2) postcss: specifier: ^8.4.14 version: 8.4.29 @@ -1128,7 +1138,7 @@ importers: version: 2.1.6(react-dom@18.2.0)(react@18.2.0) tailwindcss: specifier: ^3.0.24 - version: 3.3.3 + version: 3.3.3(ts-node@10.9.1) typechain: specifier: ^8.2.0 version: 8.3.1(typescript@5.3.3) @@ -1153,7 +1163,7 @@ importers: version: 5.2.2 vitest: specifier: ^0.34.2 - version: 0.34.3 + version: 0.34.3(happy-dom@11.0.2) packages: @@ -1245,7 +1255,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/eslint-parser@7.22.15(@babel/core@7.22.15): + /@babel/eslint-parser@7.22.15(@babel/core@7.22.15)(eslint@8.48.0): resolution: {integrity: sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: @@ -1254,11 +1264,11 @@ packages: dependencies: '@babel/core': 7.22.15 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 8.48.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 - dev: false - /@babel/eslint-parser@7.22.15(@babel/core@7.22.15)(eslint@8.48.0): + /@babel/eslint-parser@7.22.15(@babel/core@7.22.15)(eslint@8.50.0): resolution: {integrity: sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: @@ -1267,9 +1277,10 @@ packages: dependencies: '@babel/core': 7.22.15 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.48.0 + eslint: 8.50.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 + dev: false /@babel/generator@7.22.15: resolution: {integrity: sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==} @@ -4108,7 +4119,7 @@ packages: chalk: 4.1.2 dev: true - /@craco/craco@7.1.0(@types/node@17.0.45)(postcss@8.4.29)(react-scripts@5.0.1)(typescript@5.3.3): + /@craco/craco@7.1.0(@types/node@17.0.45)(postcss@8.4.29)(react-scripts@5.0.1)(typescript@5.2.2): resolution: {integrity: sha512-oRAcPIKYrfPXp9rSzlsDNeOaVtDiKhoyqSXUoqiK24jCkHr4T8m/a2f74yXIzCbIheoUWDOIfWZyRgFgT+cpqA==} engines: {node: '>=6'} hasBin: true @@ -4117,10 +4128,10 @@ packages: dependencies: autoprefixer: 10.4.15(postcss@8.4.29) cosmiconfig: 7.1.0 - cosmiconfig-typescript-loader: 1.0.9(@types/node@17.0.45)(typescript@5.3.3) + cosmiconfig-typescript-loader: 1.0.9(@types/node@17.0.45)(cosmiconfig@7.1.0)(typescript@5.2.2) cross-spawn: 7.0.3 lodash: 4.17.21 - react-scripts: 5.0.1(react@18.2.0)(typescript@5.3.3) + react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(esbuild@0.18.20)(eslint@8.48.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.2.2) semver: 7.5.4 webpack-merge: 5.9.0 transitivePeerDependencies: @@ -4131,7 +4142,7 @@ packages: - typescript dev: false - /@craco/craco@7.1.0(@types/node@17.0.45)(postcss@8.4.29)(typescript@5.2.2): + /@craco/craco@7.1.0(@types/node@17.0.45)(postcss@8.4.29)(react-scripts@5.0.1)(typescript@5.3.3): resolution: {integrity: sha512-oRAcPIKYrfPXp9rSzlsDNeOaVtDiKhoyqSXUoqiK24jCkHr4T8m/a2f74yXIzCbIheoUWDOIfWZyRgFgT+cpqA==} engines: {node: '>=6'} hasBin: true @@ -4140,9 +4151,10 @@ packages: dependencies: autoprefixer: 10.4.15(postcss@8.4.29) cosmiconfig: 7.1.0 - cosmiconfig-typescript-loader: 1.0.9(@types/node@17.0.45)(typescript@5.2.2) + cosmiconfig-typescript-loader: 1.0.9(@types/node@17.0.45)(cosmiconfig@7.1.0)(typescript@5.3.3) cross-spawn: 7.0.3 lodash: 4.17.21 + react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(esbuild@0.18.20)(eslint@8.50.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.3.3) semver: 7.5.4 webpack-merge: 5.9.0 transitivePeerDependencies: @@ -4162,10 +4174,10 @@ packages: dependencies: autoprefixer: 10.4.15(postcss@8.4.29) cosmiconfig: 7.1.0 - cosmiconfig-typescript-loader: 1.0.9(@types/node@18.17.14)(typescript@5.3.3) + cosmiconfig-typescript-loader: 1.0.9(@types/node@18.17.14)(cosmiconfig@7.1.0)(typescript@5.3.3) cross-spawn: 7.0.3 lodash: 4.17.21 - react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0)(react@18.2.0)(typescript@5.3.3) + react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(esbuild@0.18.20)(eslint@8.48.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.3.3) semver: 7.5.4 webpack-merge: 5.9.0 transitivePeerDependencies: @@ -4843,15 +4855,6 @@ packages: requiresBuild: true optional: true - /@eslint-community/eslint-utils@4.4.0: - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint-visitor-keys: 3.4.3 - dev: false - /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5053,33 +5056,6 @@ packages: dependencies: '@ethersproject/logger': 5.7.0 - /@ethersproject/providers@5.7.2: - resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 - bech32: 1.1.4 - ws: 7.4.6 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - /@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} dependencies: @@ -5106,7 +5082,6 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false /@ethersproject/random@5.7.0: resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} @@ -5221,15 +5196,6 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} dev: true - /@gitcoinco/passport-sdk-reader@0.1.4: - resolution: {integrity: sha512-MRZ+p3ZdBz7/7U7/+3/LnwU4nXMeWGwPWakvPLTXL0ys74jmIrn0b1j2uh0D8EsdstoAnksbO9wEBRED40wHAg==} - dependencies: - '@gitcoinco/passport-sdk-types': 0.2.0 - tulons: 0.0.7 - transitivePeerDependencies: - - debug - dev: false - /@gitcoinco/passport-sdk-reader@0.1.4(debug@4.3.4): resolution: {integrity: sha512-MRZ+p3ZdBz7/7U7/+3/LnwU4nXMeWGwPWakvPLTXL0ys74jmIrn0b1j2uh0D8EsdstoAnksbO9wEBRED40wHAg==} dependencies: @@ -5248,23 +5214,13 @@ packages: /@gitcoinco/passport-sdk-verifier@0.1.2: resolution: {integrity: sha512-VvIcnoQfV0Y4xhF3Ay9maUkuIbAZk4uaD0OQjXBJAnKZM1JtfWUqTo5OWHPb55CzKv1o4V14LGBpJOGqaQWHyg==} dependencies: - '@gitcoinco/passport-sdk-reader': 0.1.4 + '@gitcoinco/passport-sdk-reader': 0.1.4(debug@4.3.4) '@gitcoinco/passport-sdk-types': 0.1.2 '@spruceid/didkit-wasm': 0.2.1 transitivePeerDependencies: - debug dev: false - /@gitcoinco/passport-sdk-verifier@0.2.2: - resolution: {integrity: sha512-Z6drCRRKXV4QeO5a2zIyUAOB9RfiJhA/zICfmpQZkLOIFDuoctezMy0NM5s28Pbq4st74rcN7E3497sBRvTumQ==} - dependencies: - '@gitcoinco/passport-sdk-reader': 0.1.4 - '@gitcoinco/passport-sdk-types': 0.2.0 - '@spruceid/didkit-wasm': 0.3.0-alpha0 - transitivePeerDependencies: - - debug - dev: false - /@gitcoinco/passport-sdk-verifier@0.2.2(debug@4.3.4): resolution: {integrity: sha512-Z6drCRRKXV4QeO5a2zIyUAOB9RfiJhA/zICfmpQZkLOIFDuoctezMy0NM5s28Pbq4st74rcN7E3497sBRvTumQ==} dependencies: @@ -5275,10 +5231,12 @@ packages: - debug dev: false - /@graphql-typed-document-node/core@3.2.0: + /@graphql-typed-document-node/core@3.2.0(graphql@16.8.0): resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + graphql: 16.8.0 dev: false /@headlessui/react@1.7.17(react-dom@18.2.0)(react@18.2.0): @@ -5425,7 +5383,7 @@ packages: jest-util: 28.1.3 slash: 3.0.0 - /@jest/core@27.5.1: + /@jest/core@27.5.1(ts-node@10.9.1): resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: @@ -5446,7 +5404,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 27.5.1 - jest-config: 27.5.1 + jest-config: 27.5.1(ts-node@10.9.1) jest-haste-map: 27.5.1 jest-message-util: 27.5.1 jest-regex-util: 27.5.1 @@ -5701,7 +5659,7 @@ packages: deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. dependencies: '@json-rpc-tools/utils': 1.7.6 - axios: 0.21.4 + axios: 0.21.4(debug@4.3.4) safe-json-utils: 1.1.1 ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -6161,7 +6119,7 @@ packages: /@pinata/sdk@1.2.1: resolution: {integrity: sha512-z728bnPa9lhkKeFnpXqE8j8BXeel6iE35o53pjYjmDEHh01ZE5c4L62Ks7zd2/MuDqNaUWUtGm0tNrEiSwFXoQ==} dependencies: - axios: 0.21.4 + axios: 0.21.4(debug@4.3.4) base-path-converter: 1.0.2 form-data: 2.5.1 is-ipfs: 0.6.3 @@ -6197,7 +6155,7 @@ packages: react-refresh: '>=0.10.0 <1.0.0' sockjs-client: ^1.4.0 type-fest: '>=0.17.0 <5.0.0' - webpack: '>=4.43.0 <6.0.0' + webpack: ^5 webpack-dev-server: 3.x || 4.x webpack-hot-middleware: 2.x webpack-plugin-serve: 0.x || 1.x @@ -6225,7 +6183,7 @@ packages: react-refresh: 0.11.0 schema-utils: 3.3.0 source-map: 0.7.4 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) webpack-dev-server: 4.15.1(webpack@5.88.2) /@popperjs/core@2.11.8: @@ -6275,7 +6233,7 @@ packages: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} dev: false - /@rainbow-me/rainbowkit@0.12.16(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(wagmi@0.12.18): + /@rainbow-me/rainbowkit@0.12.16(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(wagmi@0.12.19): resolution: {integrity: sha512-4uuJIOJaBjPVM/8HqM1kNf2Yqb52lNYkQD1m8p8e7zcIK2K3nml6BfG5r04f4kqUWRmT3yosZOz2+AYL1zFqdA==} engines: {node: '>=12.4'} peerDependencies: @@ -6293,19 +6251,19 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-remove-scroll: 2.5.4(@types/react@18.2.21)(react@18.2.0) - wagmi: 0.12.18(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) + wagmi: 0.12.19(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(zod@3.22.4) transitivePeerDependencies: - '@types/react' dev: false - /@rainbow-me/rainbowkit@0.12.16(@types/react@18.2.21)(ethers@5.7.2)(react@18.2.0)(wagmi@0.12.19): - resolution: {integrity: sha512-4uuJIOJaBjPVM/8HqM1kNf2Yqb52lNYkQD1m8p8e7zcIK2K3nml6BfG5r04f4kqUWRmT3yosZOz2+AYL1zFqdA==} + /@rainbow-me/rainbowkit@0.12.18(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(wagmi@0.12.18): + resolution: {integrity: sha512-Ehpr8gBCS8v4vdXLi8ZBlQ1yA6GHJOhoP66hLrdgI5iSlr6aUGTEicEfb2RaKNltHJFW/5A4BKst0AK4PkAkuw==} engines: {node: '>=12.4'} peerDependencies: ethers: '>=5.6.8' react: '>=17' react-dom: '>=17' - wagmi: '>=0.12.18 <1.0.0' + wagmi: '>=0.12.19 <1.0.0' dependencies: '@vanilla-extract/css': 1.9.1 '@vanilla-extract/dynamic': 2.0.2 @@ -6314,8 +6272,9 @@ packages: ethers: 5.7.2 qrcode: 1.5.0 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) react-remove-scroll: 2.5.4(@types/react@18.2.21)(react@18.2.0) - wagmi: 0.12.19(@types/react@18.2.21)(ethers@5.7.2)(react@18.2.0)(typescript@5.3.3)(zod@3.22.4) + wagmi: 0.12.18(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) transitivePeerDependencies: - '@types/react' dev: false @@ -7067,7 +7026,7 @@ packages: tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1' dependencies: mini-svg-data-uri: 1.4.4 - tailwindcss: 3.3.3 + tailwindcss: 3.3.3(ts-node@10.9.1) dev: false /@tailwindcss/line-clamp@0.4.4(tailwindcss@3.3.3): @@ -7075,7 +7034,7 @@ packages: peerDependencies: tailwindcss: '>=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1' dependencies: - tailwindcss: 3.3.3 + tailwindcss: 3.3.3(ts-node@10.9.1) /@tailwindcss/typography@0.5.10(tailwindcss@3.3.3): resolution: {integrity: sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==} @@ -7086,7 +7045,7 @@ packages: lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.3.3 + tailwindcss: 3.3.3(ts-node@10.9.1) dev: false /@tanstack/query-core@4.22.0: @@ -7136,23 +7095,6 @@ packages: use-sync-external-store: 1.2.0(react@18.2.0) dev: false - /@tanstack/react-query@4.35.0(react@18.2.0): - resolution: {integrity: sha512-LLYDNnM9ewYHgjm2rzhk4KG/puN2rdoqCUD+N9+V7SwlsYwJk5ypX58rpkoZAhFyZ+KmFUJ7Iv2lIEOoUqydIg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-native: '*' - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true - dependencies: - '@tanstack/query-core': 4.35.0 - react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) - dev: false - /@testing-library/dom@8.20.1: resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==} engines: {node: '>=12'} @@ -7219,13 +7161,6 @@ packages: '@testing-library/dom': 9.3.1 dev: false - /@testing-library/user-event@14.4.3: - resolution: {integrity: sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@testing-library/dom': '>=7.21.4' - dev: false - /@testing-library/user-event@14.4.3(@testing-library/dom@9.3.1): resolution: {integrity: sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==} engines: {node: '>=12', npm: '>=6'} @@ -7263,7 +7198,7 @@ packages: resolution: {integrity: sha512-d6McJeGsuoRlwWZmVIeE8CUA27lu6jLjvv1JzqmpsytOYYbVi1tHZEnwCNVOXnj4pyLvneZlFlpXUK+X9wBWyw==} dev: true - /@typechain/ethers-v5@10.2.0(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.3.3): + /@typechain/ethers-v5@10.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.3.3): resolution: {integrity: sha512-ikaq0N/w9fABM+G01OFmU3U3dNnyRwEahkdvi9mqy1a3XwKiPZaF/lu54OcNaEWnpvEYyhhS0N7buCtLQqC92w==} peerDependencies: '@ethersproject/abi': ^5.0.0 @@ -7274,7 +7209,8 @@ packages: typescript: '>=4.3.0' dependencies: '@ethersproject/abi': 5.7.0 - '@ethersproject/providers': 5.7.2 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) ethers: 5.7.2 lodash: 4.17.21 ts-essentials: 7.0.3(typescript@5.3.3) @@ -7520,7 +7456,6 @@ packages: /@types/node@20.4.7: resolution: {integrity: sha512-bUBrPjEry2QUTsnuEjzjbS7voGWCc30W0qzgMf90GPeDGFRakvrz47ju+oqDAKCXLUCe39u57/ORMl/O/04/9g==} - dev: true /@types/node@20.5.9: resolution: {integrity: sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==} @@ -7675,6 +7610,34 @@ packages: dependencies: '@types/yargs-parser': 21.0.0 + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.8.0 + '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@5.2.2) + debug: 4.3.4 + eslint: 8.48.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)(typescript@5.3.3): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7702,7 +7665,7 @@ packages: transitivePeerDependencies: - supports-color - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(typescript@5.3.3): + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.50.0)(typescript@5.3.3): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -7714,11 +7677,12 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.8.0 - '@typescript-eslint/parser': 5.62.0(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@5.3.3) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(typescript@5.3.3) - '@typescript-eslint/utils': 5.62.0(typescript@5.3.3) + '@typescript-eslint/type-utils': 5.62.0(eslint@8.50.0)(typescript@5.3.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@5.3.3) debug: 4.3.4 + eslint: 8.50.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare-lite: 1.4.0 @@ -7787,6 +7751,19 @@ packages: - supports-color dev: true + /@typescript-eslint/experimental-utils@5.62.0(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@5.2.2) + eslint: 8.48.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + /@typescript-eslint/experimental-utils@5.62.0(eslint@8.48.0)(typescript@5.3.3): resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7799,18 +7776,39 @@ packages: - supports-color - typescript - /@typescript-eslint/experimental-utils@5.62.0(typescript@5.3.3): + /@typescript-eslint/experimental-utils@5.62.0(eslint@8.50.0)(typescript@5.3.3): resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.62.0(typescript@5.3.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@5.3.3) + eslint: 8.50.0 transitivePeerDependencies: - supports-color - typescript dev: false + /@typescript-eslint/parser@5.62.0(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) + debug: 4.3.4 + eslint: 8.48.0 + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + /@typescript-eslint/parser@5.62.0(eslint@8.48.0)(typescript@5.3.3): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7830,7 +7828,7 @@ packages: transitivePeerDependencies: - supports-color - /@typescript-eslint/parser@5.62.0(typescript@5.3.3): + /@typescript-eslint/parser@5.62.0(eslint@8.50.0)(typescript@5.3.3): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -7844,6 +7842,7 @@ packages: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) debug: 4.3.4 + eslint: 8.50.0 typescript: 5.3.3 transitivePeerDependencies: - supports-color @@ -7913,6 +7912,26 @@ packages: '@typescript-eslint/types': 6.7.2 '@typescript-eslint/visitor-keys': 6.7.2 + /@typescript-eslint/type-utils@5.62.0(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@5.2.2) + debug: 4.3.4 + eslint: 8.48.0 + tsutils: 3.21.0(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + /@typescript-eslint/type-utils@5.62.0(eslint@8.48.0)(typescript@5.3.3): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7932,7 +7951,7 @@ packages: transitivePeerDependencies: - supports-color - /@typescript-eslint/type-utils@5.62.0(typescript@5.3.3): + /@typescript-eslint/type-utils@5.62.0(eslint@8.50.0)(typescript@5.3.3): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -7943,8 +7962,9 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) - '@typescript-eslint/utils': 5.62.0(typescript@5.3.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@5.3.3) debug: 4.3.4 + eslint: 8.50.0 tsutils: 3.21.0(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -8004,6 +8024,27 @@ packages: resolution: {integrity: sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==} engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -8088,6 +8129,26 @@ packages: - supports-color dev: true + /@typescript-eslint/utils@5.62.0(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.1 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) + eslint: 8.48.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + /@typescript-eslint/utils@5.62.0(eslint@8.48.0)(typescript@5.3.3): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -8107,18 +8168,19 @@ packages: - supports-color - typescript - /@typescript-eslint/utils@5.62.0(typescript@5.3.3): + /@typescript-eslint/utils@5.62.0(eslint@8.50.0)(typescript@5.3.3): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.1 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) + eslint: 8.50.0 eslint-scope: 5.1.1 semver: 7.5.4 transitivePeerDependencies: @@ -8418,7 +8480,7 @@ packages: '@walletconnect/ethereum-provider': 2.8.4(@walletconnect/modal@2.6.1) '@walletconnect/legacy-provider': 2.0.0 '@walletconnect/modal': 2.6.1(react@18.2.0) - abitype: 0.3.0(typescript@5.3.3) + abitype: 0.3.0(typescript@5.3.3)(zod@3.22.4) ethers: 5.7.2 eventemitter3: 4.0.7 typescript: 5.3.3 @@ -8485,7 +8547,7 @@ packages: '@safe-global/safe-apps-provider': 0.15.2 '@safe-global/safe-apps-sdk': 7.11.0 '@wagmi/core': 0.10.17(@types/react@18.2.21)(ethers@5.7.2)(react@18.2.0)(typescript@5.3.3)(zod@3.22.4) - '@walletconnect/ethereum-provider': 2.9.0(@walletconnect/modal@2.6.1) + '@walletconnect/ethereum-provider': 2.9.0(@walletconnect/modal@2.6.1)(lokijs@1.5.12) '@walletconnect/legacy-provider': 2.0.0 '@walletconnect/modal': 2.6.1(react@18.2.0) abitype: 0.3.0(typescript@5.3.3)(zod@3.22.4) @@ -8516,10 +8578,10 @@ packages: '@ledgerhq/connect-kit-loader': 1.1.2 '@safe-global/safe-apps-provider': 0.17.1(typescript@5.2.2)(zod@3.22.4) '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.2.2)(zod@3.22.4) - '@walletconnect/ethereum-provider': 2.10.0(@walletconnect/modal@2.6.1) + '@walletconnect/ethereum-provider': 2.10.0(@walletconnect/modal@2.6.1)(lokijs@1.5.12) '@walletconnect/legacy-provider': 2.0.0 '@walletconnect/modal': 2.6.1(react@18.2.0) - '@walletconnect/utils': 2.10.0 + '@walletconnect/utils': 2.10.0(lokijs@1.5.12) abitype: 0.8.7(typescript@5.2.2)(zod@3.22.4) eventemitter3: 4.0.7 typescript: 5.2.2 @@ -8546,7 +8608,7 @@ packages: dependencies: '@wagmi/chains': 0.2.22(typescript@5.3.3) '@wagmi/connectors': 0.3.22(@wagmi/core@0.10.16)(ethers@5.7.2)(react@18.2.0)(typescript@5.3.3) - abitype: 0.3.0(typescript@5.3.3) + abitype: 0.3.0(typescript@5.3.3)(zod@3.22.4) ethers: 5.7.2 eventemitter3: 4.0.7 typescript: 5.3.3 @@ -8684,7 +8746,7 @@ packages: - utf-8-validate dev: false - /@walletconnect/core@2.10.0: + /@walletconnect/core@2.10.0(lokijs@1.5.12): resolution: {integrity: sha512-Z8pdorfIMueuiBXLdnf7yloiO9JIiobuxN3j0OTal+MYc4q5/2O7d+jdD1DAXbLi1taJx3x60UXT/FPVkjIqIQ==} dependencies: '@walletconnect/heartbeat': 1.2.1 @@ -8692,14 +8754,14 @@ packages: '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/jsonrpc-ws-connection': 1.0.13 - '@walletconnect/keyvaluestorage': 1.0.2 + '@walletconnect/keyvaluestorage': 1.0.2(lokijs@1.5.12) '@walletconnect/logger': 2.0.1 '@walletconnect/relay-api': 1.0.9 '@walletconnect/relay-auth': 1.0.4 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.10.0 - '@walletconnect/utils': 2.10.0 + '@walletconnect/types': 2.10.0(lokijs@1.5.12) + '@walletconnect/utils': 2.10.0(lokijs@1.5.12) events: 3.3.0 lodash.isequal: 4.5.0 uint8arrays: 3.1.1 @@ -8710,8 +8772,8 @@ packages: - utf-8-validate dev: false - /@walletconnect/core@2.10.0(lokijs@1.5.12): - resolution: {integrity: sha512-Z8pdorfIMueuiBXLdnf7yloiO9JIiobuxN3j0OTal+MYc4q5/2O7d+jdD1DAXbLi1taJx3x60UXT/FPVkjIqIQ==} + /@walletconnect/core@2.8.4: + resolution: {integrity: sha512-3CQHud4As0kPRvlW1w/wSWS2F3yXlAo5kSEJyRWLRPqXG+aSCVWM8cVM8ch5yoeyNIfOHhEINdsYMuJG1+yIJQ==} dependencies: '@walletconnect/heartbeat': 1.2.1 '@walletconnect/jsonrpc-provider': 1.0.13 @@ -8724,8 +8786,8 @@ packages: '@walletconnect/relay-auth': 1.0.4 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.10.0(lokijs@1.5.12) - '@walletconnect/utils': 2.10.0(lokijs@1.5.12) + '@walletconnect/types': 2.8.4 + '@walletconnect/utils': 2.8.4 events: 3.3.0 lodash.isequal: 4.5.0 uint8arrays: 3.1.1 @@ -8736,67 +8798,15 @@ packages: - utf-8-validate dev: false - /@walletconnect/core@2.8.4: - resolution: {integrity: sha512-3CQHud4As0kPRvlW1w/wSWS2F3yXlAo5kSEJyRWLRPqXG+aSCVWM8cVM8ch5yoeyNIfOHhEINdsYMuJG1+yIJQ==} + /@walletconnect/core@2.9.0(lokijs@1.5.12): + resolution: {integrity: sha512-MZYJghS9YCvGe32UOgDj0mCasaOoGHQaYXWeQblXE/xb8HuaM6kAWhjIQN9P+MNp5QP134BHP5olQostcCotXQ==} dependencies: '@walletconnect/heartbeat': 1.2.1 '@walletconnect/jsonrpc-provider': 1.0.13 '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/jsonrpc-ws-connection': 1.0.13 - '@walletconnect/keyvaluestorage': 1.0.2 - '@walletconnect/logger': 2.0.1 - '@walletconnect/relay-api': 1.0.9 - '@walletconnect/relay-auth': 1.0.4 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.8.4 - '@walletconnect/utils': 2.8.4 - events: 3.3.0 - lodash.isequal: 4.5.0 - uint8arrays: 3.1.1 - transitivePeerDependencies: - - '@react-native-async-storage/async-storage' - - bufferutil - - lokijs - - utf-8-validate - dev: false - - /@walletconnect/core@2.9.0: - resolution: {integrity: sha512-MZYJghS9YCvGe32UOgDj0mCasaOoGHQaYXWeQblXE/xb8HuaM6kAWhjIQN9P+MNp5QP134BHP5olQostcCotXQ==} - dependencies: - '@walletconnect/heartbeat': 1.2.1 - '@walletconnect/jsonrpc-provider': 1.0.13 - '@walletconnect/jsonrpc-types': 1.0.3 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/jsonrpc-ws-connection': 1.0.12 - '@walletconnect/keyvaluestorage': 1.0.2 - '@walletconnect/logger': 2.0.1 - '@walletconnect/relay-api': 1.0.9 - '@walletconnect/relay-auth': 1.0.4 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.9.0 - '@walletconnect/utils': 2.9.0 - events: 3.3.0 - lodash.isequal: 4.5.0 - uint8arrays: 3.1.1 - transitivePeerDependencies: - - '@react-native-async-storage/async-storage' - - bufferutil - - lokijs - - utf-8-validate - dev: false - - /@walletconnect/core@2.9.0(lokijs@1.5.12): - resolution: {integrity: sha512-MZYJghS9YCvGe32UOgDj0mCasaOoGHQaYXWeQblXE/xb8HuaM6kAWhjIQN9P+MNp5QP134BHP5olQostcCotXQ==} - dependencies: - '@walletconnect/heartbeat': 1.2.1 - '@walletconnect/jsonrpc-provider': 1.0.13 - '@walletconnect/jsonrpc-types': 1.0.3 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/jsonrpc-ws-connection': 1.0.12 - '@walletconnect/keyvaluestorage': 1.0.2(lokijs@1.5.12) + '@walletconnect/jsonrpc-ws-connection': 1.0.12 + '@walletconnect/keyvaluestorage': 1.0.2(lokijs@1.5.12) '@walletconnect/logger': 2.0.1 '@walletconnect/relay-api': 1.0.9 '@walletconnect/relay-auth': 1.0.4 @@ -8877,32 +8887,6 @@ packages: - utf-8-validate dev: false - /@walletconnect/ethereum-provider@2.10.0(@walletconnect/modal@2.6.1): - resolution: {integrity: sha512-NyTm7RcrtAiSaYQPh6G4sOtr1kg/pL5Z3EDE6rBTV3Se5pMsYvtuwMiSol7MidsQpf4ux9HFhthTO3imcoWImw==} - peerDependencies: - '@walletconnect/modal': '>=2' - peerDependenciesMeta: - '@walletconnect/modal': - optional: true - dependencies: - '@walletconnect/jsonrpc-http-connection': 1.0.7 - '@walletconnect/jsonrpc-provider': 1.0.13 - '@walletconnect/jsonrpc-types': 1.0.3 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/modal': 2.6.1(react@18.2.0) - '@walletconnect/sign-client': 2.10.0 - '@walletconnect/types': 2.10.0 - '@walletconnect/universal-provider': 2.10.0 - '@walletconnect/utils': 2.10.0 - events: 3.3.0 - transitivePeerDependencies: - - '@react-native-async-storage/async-storage' - - bufferutil - - encoding - - lokijs - - utf-8-validate - dev: false - /@walletconnect/ethereum-provider@2.10.0(@walletconnect/modal@2.6.1)(lokijs@1.5.12): resolution: {integrity: sha512-NyTm7RcrtAiSaYQPh6G4sOtr1kg/pL5Z3EDE6rBTV3Se5pMsYvtuwMiSol7MidsQpf4ux9HFhthTO3imcoWImw==} peerDependencies: @@ -8955,32 +8939,6 @@ packages: - utf-8-validate dev: false - /@walletconnect/ethereum-provider@2.9.0(@walletconnect/modal@2.6.1): - resolution: {integrity: sha512-rSXkC0SXMigJRdIi/M2RMuEuATY1AwtlTWQBnqyxoht7xbO2bQNPCXn0XL4s/GRNrSUtoKSY4aPMHXV4W4yLBA==} - peerDependencies: - '@walletconnect/modal': '>=2' - peerDependenciesMeta: - '@walletconnect/modal': - optional: true - dependencies: - '@walletconnect/jsonrpc-http-connection': 1.0.7 - '@walletconnect/jsonrpc-provider': 1.0.13 - '@walletconnect/jsonrpc-types': 1.0.3 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/modal': 2.6.1(react@18.2.0) - '@walletconnect/sign-client': 2.9.0 - '@walletconnect/types': 2.9.0 - '@walletconnect/universal-provider': 2.9.0 - '@walletconnect/utils': 2.9.0 - events: 3.3.0 - transitivePeerDependencies: - - '@react-native-async-storage/async-storage' - - bufferutil - - encoding - - lokijs - - utf-8-validate - dev: false - /@walletconnect/ethereum-provider@2.9.0(@walletconnect/modal@2.6.1)(lokijs@1.5.12): resolution: {integrity: sha512-rSXkC0SXMigJRdIi/M2RMuEuATY1AwtlTWQBnqyxoht7xbO2bQNPCXn0XL4s/GRNrSUtoKSY4aPMHXV4W4yLBA==} peerDependencies: @@ -9071,7 +9029,7 @@ packages: '@walletconnect/safe-json': 1.0.2 events: 3.3.0 tslib: 1.14.1 - ws: 7.5.9 + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -9084,27 +9042,12 @@ packages: '@walletconnect/safe-json': 1.0.2 events: 3.3.0 tslib: 1.14.1 - ws: 7.5.9 + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate dev: false - /@walletconnect/keyvaluestorage@1.0.2: - resolution: {integrity: sha512-U/nNG+VLWoPFdwwKx0oliT4ziKQCEoQ27L5Hhw8YOFGA2Po9A9pULUYNWhDgHkrb0gYDNt//X7wABcEWWBd3FQ==} - peerDependencies: - '@react-native-async-storage/async-storage': 1.x - lokijs: 1.x - peerDependenciesMeta: - '@react-native-async-storage/async-storage': - optional: true - lokijs: - optional: true - dependencies: - safe-json-utils: 1.1.1 - tslib: 1.14.1 - dev: false - /@walletconnect/keyvaluestorage@1.0.2(lokijs@1.5.12): resolution: {integrity: sha512-U/nNG+VLWoPFdwwKx0oliT4ziKQCEoQ27L5Hhw8YOFGA2Po9A9pULUYNWhDgHkrb0gYDNt//X7wABcEWWBd3FQ==} peerDependencies: @@ -9267,25 +9210,6 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/sign-client@2.10.0: - resolution: {integrity: sha512-hbDljDS53kR/It3oXD91UkcOsT6diNnW5+Zzksm0YEfwww5dop/YfNlcdnc8+jKUhWOL/YDPNQCjzsCSNlVzbw==} - dependencies: - '@walletconnect/core': 2.10.0 - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.1 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/logger': 2.0.1 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.10.0 - '@walletconnect/utils': 2.10.0 - events: 3.3.0 - transitivePeerDependencies: - - '@react-native-async-storage/async-storage' - - bufferutil - - lokijs - - utf-8-validate - dev: false - /@walletconnect/sign-client@2.10.0(lokijs@1.5.12): resolution: {integrity: sha512-hbDljDS53kR/It3oXD91UkcOsT6diNnW5+Zzksm0YEfwww5dop/YfNlcdnc8+jKUhWOL/YDPNQCjzsCSNlVzbw==} dependencies: @@ -9324,25 +9248,6 @@ packages: - utf-8-validate dev: false - /@walletconnect/sign-client@2.9.0: - resolution: {integrity: sha512-mEKc4LlLMebCe45qzqh+MX4ilQK4kOEBzLY6YJpG8EhyT45eX4JMNA7qQoYa9MRMaaVb/7USJcc4e3ZrjZvQmA==} - dependencies: - '@walletconnect/core': 2.9.0 - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.1 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/logger': 2.0.1 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.9.0 - '@walletconnect/utils': 2.9.0 - events: 3.3.0 - transitivePeerDependencies: - - '@react-native-async-storage/async-storage' - - bufferutil - - lokijs - - utf-8-validate - dev: false - /@walletconnect/sign-client@2.9.0(lokijs@1.5.12): resolution: {integrity: sha512-mEKc4LlLMebCe45qzqh+MX4ilQK4kOEBzLY6YJpG8EhyT45eX4JMNA7qQoYa9MRMaaVb/7USJcc4e3ZrjZvQmA==} dependencies: @@ -9398,20 +9303,6 @@ packages: deprecated: 'WalletConnect''s v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/' dev: false - /@walletconnect/types@2.10.0: - resolution: {integrity: sha512-kSTA/WZnbKdEbvbXSW16Ty6dOSzOZCHnGg6JH7q1MuraalD2HuNg00lVVu7QAZ/Rj1Gn9DAkrgP5Wd5a8Xq//Q==} - dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.1 - '@walletconnect/jsonrpc-types': 1.0.3 - '@walletconnect/keyvaluestorage': 1.0.2 - '@walletconnect/logger': 2.0.1 - events: 3.3.0 - transitivePeerDependencies: - - '@react-native-async-storage/async-storage' - - lokijs - dev: false - /@walletconnect/types@2.10.0(lokijs@1.5.12): resolution: {integrity: sha512-kSTA/WZnbKdEbvbXSW16Ty6dOSzOZCHnGg6JH7q1MuraalD2HuNg00lVVu7QAZ/Rj1Gn9DAkrgP5Wd5a8Xq//Q==} dependencies: @@ -9432,21 +9323,7 @@ packages: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.1 '@walletconnect/jsonrpc-types': 1.0.3 - '@walletconnect/keyvaluestorage': 1.0.2 - '@walletconnect/logger': 2.0.1 - events: 3.3.0 - transitivePeerDependencies: - - '@react-native-async-storage/async-storage' - - lokijs - dev: false - - /@walletconnect/types@2.9.0: - resolution: {integrity: sha512-ORopsMfSRvUYqtjKKd6scfg8o4/aGebipLxx92AuuUgMTERSU6cGmIrK6rdLu7W6FBJkmngPLEGc9mRqAb9Lug==} - dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.1 - '@walletconnect/jsonrpc-types': 1.0.3 - '@walletconnect/keyvaluestorage': 1.0.2 + '@walletconnect/keyvaluestorage': 1.0.2(lokijs@1.5.12) '@walletconnect/logger': 2.0.1 events: 3.3.0 transitivePeerDependencies: @@ -9468,26 +9345,6 @@ packages: - lokijs dev: false - /@walletconnect/universal-provider@2.10.0: - resolution: {integrity: sha512-jtVWf+AeTCqBcB3lCmWkv3bvSmdRCkQdo67GNoT5y6/pvVHMxfjgrJNBOUsWQMxpREpWDpZ993X0JRjsYVsMcA==} - dependencies: - '@walletconnect/jsonrpc-http-connection': 1.0.7 - '@walletconnect/jsonrpc-provider': 1.0.13 - '@walletconnect/jsonrpc-types': 1.0.3 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/logger': 2.0.1 - '@walletconnect/sign-client': 2.10.0 - '@walletconnect/types': 2.10.0 - '@walletconnect/utils': 2.10.0 - events: 3.3.0 - transitivePeerDependencies: - - '@react-native-async-storage/async-storage' - - bufferutil - - encoding - - lokijs - - utf-8-validate - dev: false - /@walletconnect/universal-provider@2.10.0(lokijs@1.5.12): resolution: {integrity: sha512-jtVWf+AeTCqBcB3lCmWkv3bvSmdRCkQdo67GNoT5y6/pvVHMxfjgrJNBOUsWQMxpREpWDpZ993X0JRjsYVsMcA==} dependencies: @@ -9528,26 +9385,6 @@ packages: - utf-8-validate dev: false - /@walletconnect/universal-provider@2.9.0: - resolution: {integrity: sha512-k3nkSBkF69sJJVoe17IVoPtnhp/sgaa2t+x7BvA/BKeMxE0DGdtRJdEXotTc8DBmI7o2tkq6l8+HyFBGjQ/CjQ==} - dependencies: - '@walletconnect/jsonrpc-http-connection': 1.0.7 - '@walletconnect/jsonrpc-provider': 1.0.13 - '@walletconnect/jsonrpc-types': 1.0.3 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/logger': 2.0.1 - '@walletconnect/sign-client': 2.9.0 - '@walletconnect/types': 2.9.0 - '@walletconnect/utils': 2.9.0 - events: 3.3.0 - transitivePeerDependencies: - - '@react-native-async-storage/async-storage' - - bufferutil - - encoding - - lokijs - - utf-8-validate - dev: false - /@walletconnect/universal-provider@2.9.0(lokijs@1.5.12): resolution: {integrity: sha512-k3nkSBkF69sJJVoe17IVoPtnhp/sgaa2t+x7BvA/BKeMxE0DGdtRJdEXotTc8DBmI7o2tkq6l8+HyFBGjQ/CjQ==} dependencies: @@ -9580,28 +9417,6 @@ packages: query-string: 6.13.5 dev: false - /@walletconnect/utils@2.10.0: - resolution: {integrity: sha512-9GRyEz/7CJW+G04RvrjPET5k7hOEsB9b3fF9cWDk/iDCxSWpbkU/hv/urRB36C+gvQMAZgIZYX3dHfzJWkY/2g==} - dependencies: - '@stablelib/chacha20poly1305': 1.0.1 - '@stablelib/hkdf': 1.0.1 - '@stablelib/random': 1.0.2 - '@stablelib/sha256': 1.0.1 - '@stablelib/x25519': 1.0.3 - '@walletconnect/relay-api': 1.0.9 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.10.0 - '@walletconnect/window-getters': 1.0.1 - '@walletconnect/window-metadata': 1.0.1 - detect-browser: 5.3.0 - query-string: 7.1.3 - uint8arrays: 3.1.1 - transitivePeerDependencies: - - '@react-native-async-storage/async-storage' - - lokijs - dev: false - /@walletconnect/utils@2.10.0(lokijs@1.5.12): resolution: {integrity: sha512-9GRyEz/7CJW+G04RvrjPET5k7hOEsB9b3fF9cWDk/iDCxSWpbkU/hv/urRB36C+gvQMAZgIZYX3dHfzJWkY/2g==} dependencies: @@ -9646,28 +9461,6 @@ packages: - lokijs dev: false - /@walletconnect/utils@2.9.0: - resolution: {integrity: sha512-7Tu3m6dZL84KofrNBcblsgpSqU2vdo9ImLD7zWimLXERVGNQ8smXG+gmhQYblebIBhsPzjy9N38YMC3nPlfQNw==} - dependencies: - '@stablelib/chacha20poly1305': 1.0.1 - '@stablelib/hkdf': 1.0.1 - '@stablelib/random': 1.0.2 - '@stablelib/sha256': 1.0.1 - '@stablelib/x25519': 1.0.3 - '@walletconnect/relay-api': 1.0.9 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.9.0 - '@walletconnect/window-getters': 1.0.1 - '@walletconnect/window-metadata': 1.0.1 - detect-browser: 5.3.0 - query-string: 7.1.3 - uint8arrays: 3.1.1 - transitivePeerDependencies: - - '@react-native-async-storage/async-storage' - - lokijs - dev: false - /@walletconnect/utils@2.9.0(lokijs@1.5.12): resolution: {integrity: sha512-7Tu3m6dZL84KofrNBcblsgpSqU2vdo9ImLD7zWimLXERVGNQ8smXG+gmhQYblebIBhsPzjy9N38YMC3nPlfQNw==} dependencies: @@ -9860,19 +9653,6 @@ packages: zod: 3.22.4 dev: false - /abitype@0.3.0(typescript@5.3.3): - resolution: {integrity: sha512-0YokyAV4hKMcy97Pl+6QgZBlBdZJN2llslOs7kiFY+cu7kMlVXDBpxMExfv0krzBCQt2t7hNovpQ3y/zvEm18A==} - engines: {pnpm: '>=7'} - peerDependencies: - typescript: '>=4.9.4' - zod: '>=3.19.1' - peerDependenciesMeta: - zod: - optional: true - dependencies: - typescript: 5.3.3 - dev: false - /abitype@0.3.0(typescript@5.3.3)(zod@3.22.4): resolution: {integrity: sha512-0YokyAV4hKMcy97Pl+6QgZBlBdZJN2llslOs7kiFY+cu7kMlVXDBpxMExfv0krzBCQt2t7hNovpQ3y/zvEm18A==} engines: {pnpm: '>=7'} @@ -9945,6 +9725,20 @@ packages: zod: 3.22.4 dev: false + /abitype@1.0.0(typescript@5.3.3): + resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + dependencies: + typescript: 5.3.3 + dev: false + /abortable-iterator@3.0.2: resolution: {integrity: sha512-qVP8HFfTpUQI2F+f1tpTriKDIZ4XrmwCrBCrQeRKO7DKWF3kgoT6NXiNDv2krrGcHxPwmI63eGQiec81sEaWIw==} dependencies: @@ -10065,8 +9859,10 @@ packages: resolution: {integrity: sha512-hCOfMzbFx5IDutmWLAt6MZwOUjIfSM9G9FyVxytmE4Rs/5YDPWQrD/+IR1w+FweD9H2oOZEnv36TmkjhNURBVA==} dev: false - /ajv-formats@2.1.1: + /ajv-formats@2.1.1(ajv@8.12.0): resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 peerDependenciesMeta: ajv: optional: true @@ -10446,30 +10242,12 @@ packages: resolution: {integrity: sha512-ZtlVZobOeDQhb/y2lMK6mznDw7TJHDNcKx5/bbBkFvArIQ5CVFhSI6hWWQnMx9I8cNmNmZ30wpDyOC2E2nvgbQ==} engines: {node: '>=4'} - /axios@0.21.4: - resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} - dependencies: - follow-redirects: 1.15.2 - transitivePeerDependencies: - - debug - dev: false - /axios@0.21.4(debug@4.3.4): resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.2 - transitivePeerDependencies: - - debug - dev: true - - /axios@0.27.2: - resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} - dependencies: - follow-redirects: 1.15.2 - form-data: 4.0.0 + follow-redirects: 1.15.2(debug@4.3.4) transitivePeerDependencies: - debug - dev: false /axios@0.27.2(debug@4.3.4): resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} @@ -10509,44 +10287,30 @@ packages: '@babel/core': ^7.8.0 dependencies: '@babel/core': 7.22.15 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/babel__core': 7.20.1 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.5.1(@babel/core@7.22.15) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - - /babel-loader@8.3.0(@babel/core@7.22.15): - resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} - engines: {node: '>= 8.9'} - peerDependencies: - '@babel/core': ^7.0.0 - webpack: '>=2' - dependencies: - '@babel/core': 7.22.15 - find-cache-dir: 3.3.2 - loader-utils: 2.0.4 - make-dir: 3.1.0 - schema-utils: 2.7.1 - dev: false + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__core': 7.20.1 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 27.5.1(@babel/core@7.22.15) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color /babel-loader@8.3.0(@babel/core@7.22.15)(webpack@5.88.2): resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} peerDependencies: '@babel/core': ^7.0.0 - webpack: '>=2' + webpack: ^5 dependencies: '@babel/core': 7.22.15 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) /babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} @@ -11046,7 +10810,6 @@ packages: requiresBuild: true dependencies: node-gyp-build: 4.6.1 - dev: false /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} @@ -11678,11 +11441,12 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - /cosmiconfig-typescript-loader@1.0.9(@types/node@17.0.45)(typescript@5.2.2): + /cosmiconfig-typescript-loader@1.0.9(@types/node@17.0.45)(cosmiconfig@7.1.0)(typescript@5.2.2): resolution: {integrity: sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@types/node': '*' + cosmiconfig: '>=7' typescript: '>=3' dependencies: '@types/node': 17.0.45 @@ -11694,11 +11458,12 @@ packages: - '@swc/wasm' dev: false - /cosmiconfig-typescript-loader@1.0.9(@types/node@17.0.45)(typescript@5.3.3): + /cosmiconfig-typescript-loader@1.0.9(@types/node@17.0.45)(cosmiconfig@7.1.0)(typescript@5.3.3): resolution: {integrity: sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@types/node': '*' + cosmiconfig: '>=7' typescript: '>=3' dependencies: '@types/node': 17.0.45 @@ -11710,11 +11475,12 @@ packages: - '@swc/wasm' dev: false - /cosmiconfig-typescript-loader@1.0.9(@types/node@18.17.14)(typescript@5.3.3): + /cosmiconfig-typescript-loader@1.0.9(@types/node@18.17.14)(cosmiconfig@7.1.0)(typescript@5.3.3): resolution: {integrity: sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@types/node': '*' + cosmiconfig: '>=7' typescript: '>=3' dependencies: '@types/node': 18.17.14 @@ -11776,31 +11542,16 @@ packages: typescript: 5.3.3 dev: true - /craco-esbuild@0.5.2(@craco/craco@7.1.0): - resolution: {integrity: sha512-5NCHz2gFT8MkVo36t22KOBL53JvDrw8R2PHmGxxfaTa8LFZNKmvOI6e8zCzPdY9LeKMdF3svBjMVyXG53pGO1Q==} - peerDependencies: - '@craco/craco': ^6.0.0 || ^7.0.0 || ^7.0.0-alpha - react-scripts: ^5.0.0 - dependencies: - '@craco/craco': 7.1.0(@types/node@17.0.45)(postcss@8.4.29)(typescript@5.2.2) - esbuild-jest: 0.5.0 - esbuild-loader: 2.21.0 - transitivePeerDependencies: - - esbuild - - supports-color - - webpack - dev: false - - /craco-esbuild@0.5.2(@craco/craco@7.1.0)(react-scripts@5.0.1): + /craco-esbuild@0.5.2(@craco/craco@7.1.0)(esbuild@0.18.20)(react-scripts@5.0.1)(webpack@5.88.2): resolution: {integrity: sha512-5NCHz2gFT8MkVo36t22KOBL53JvDrw8R2PHmGxxfaTa8LFZNKmvOI6e8zCzPdY9LeKMdF3svBjMVyXG53pGO1Q==} peerDependencies: '@craco/craco': ^6.0.0 || ^7.0.0 || ^7.0.0-alpha react-scripts: ^5.0.0 dependencies: '@craco/craco': 7.1.0(@types/node@18.17.14)(postcss@8.4.29)(react-scripts@5.0.1)(typescript@5.3.3) - esbuild-jest: 0.5.0 - esbuild-loader: 2.21.0 - react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0)(react@18.2.0)(typescript@5.3.3) + esbuild-jest: 0.5.0(esbuild@0.18.20) + esbuild-loader: 2.21.0(webpack@5.88.2) + react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(esbuild@0.18.20)(eslint@8.48.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.3.3) transitivePeerDependencies: - esbuild - supports-color @@ -11936,7 +11687,7 @@ packages: resolution: {integrity: sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==} engines: {node: '>= 12.13.0'} peerDependencies: - webpack: ^5.0.0 + webpack: ^5 dependencies: icss-utils: 5.1.0(postcss@8.4.29) postcss: 8.4.29 @@ -11946,9 +11697,9 @@ packages: postcss-modules-values: 4.0.0(postcss@8.4.29) postcss-value-parser: 4.2.0 semver: 7.5.4 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) - /css-minimizer-webpack-plugin@3.4.1(webpack@5.88.2): + /css-minimizer-webpack-plugin@3.4.1(esbuild@0.18.20)(webpack@5.88.2): resolution: {integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -11956,7 +11707,7 @@ packages: clean-css: '*' csso: '*' esbuild: '*' - webpack: ^5.0.0 + webpack: ^5 peerDependenciesMeta: '@parcel/css': optional: true @@ -11968,12 +11719,13 @@ packages: optional: true dependencies: cssnano: 5.1.15(postcss@8.4.29) + esbuild: 0.18.20 jest-worker: 27.5.1 postcss: 8.4.29 schema-utils: 4.2.0 serialize-javascript: 6.0.1 source-map: 0.6.1 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) /css-prefers-color-scheme@6.0.3(postcss@8.4.29): resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} @@ -12976,7 +12728,7 @@ packages: engines: {node: '>=6'} dev: false - /esbuild-jest@0.5.0: + /esbuild-jest@0.5.0(esbuild@0.18.20): resolution: {integrity: sha512-AMZZCdEpXfNVOIDvURlqYyHwC8qC1/BFjgsrOiSL1eyiIArVtHL8YAC83Shhn16cYYoAWEW17yZn0W/RJKJKHQ==} peerDependencies: esbuild: '>=0.8.50' @@ -12984,19 +12736,21 @@ packages: '@babel/core': 7.22.15 '@babel/plugin-transform-modules-commonjs': 7.22.15(@babel/core@7.22.15) babel-jest: 26.6.3(@babel/core@7.22.15) + esbuild: 0.18.20 transitivePeerDependencies: - supports-color - /esbuild-loader@2.21.0: + /esbuild-loader@2.21.0(webpack@5.88.2): resolution: {integrity: sha512-k7ijTkCT43YBSZ6+fBCW1Gin7s46RrJ0VQaM8qA7lq7W+OLsGgtLyFV8470FzYi/4TeDexniTBTPTwZUnXXR5g==} peerDependencies: - webpack: ^4.40.0 || ^5.0.0 + webpack: ^5 dependencies: esbuild: 0.16.17 joycon: 3.1.1 json5: 2.2.3 loader-utils: 2.0.4 tapable: 2.2.1 + webpack: 5.88.2(esbuild@0.18.20) webpack-sources: 1.4.3 /esbuild@0.16.17: @@ -13167,6 +12921,41 @@ packages: eslint: 8.50.0 dev: true + /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0)(jest@27.5.1)(typescript@5.2.2): + resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} + engines: {node: '>=14.0.0'} + peerDependencies: + eslint: ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/core': 7.22.15 + '@babel/eslint-parser': 7.22.15(@babel/core@7.22.15)(eslint@8.48.0) + '@rushstack/eslint-patch': 1.3.3 + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.2.2) + babel-preset-react-app: 10.0.1 + confusing-browser-globals: 1.0.11 + eslint: 8.48.0 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.48.0) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.48.0)(jest@27.5.1)(typescript@5.2.2) + eslint-plugin-jsx-a11y: 6.7.1(eslint@8.48.0) + eslint-plugin-react: 7.33.2(eslint@8.48.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.48.0) + eslint-plugin-testing-library: 5.11.1(eslint@8.48.0)(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - '@babel/plugin-syntax-flow' + - '@babel/plugin-transform-react-jsx' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + dev: false + /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0)(jest@27.5.1)(typescript@5.3.3): resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} engines: {node: '>=14.0.0'} @@ -13201,7 +12990,7 @@ packages: - jest - supports-color - /eslint-config-react-app@7.0.1(jest@27.5.1)(typescript@5.3.3): + /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.50.0)(jest@27.5.1)(typescript@5.3.3): resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -13212,19 +13001,20 @@ packages: optional: true dependencies: '@babel/core': 7.22.15 - '@babel/eslint-parser': 7.22.15(@babel/core@7.22.15) + '@babel/eslint-parser': 7.22.15(@babel/core@7.22.15)(eslint@8.50.0) '@rushstack/eslint-patch': 1.3.3 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(typescript@5.3.3) - '@typescript-eslint/parser': 5.62.0(typescript@5.3.3) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.50.0)(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@5.3.3) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 - eslint-plugin-flowtype: 8.0.3 - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(jest@27.5.1)(typescript@5.3.3) - eslint-plugin-jsx-a11y: 6.7.1 - eslint-plugin-react: 7.33.2 - eslint-plugin-react-hooks: 4.6.0 - eslint-plugin-testing-library: 5.11.1(typescript@5.3.3) + eslint: 8.50.0 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.50.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.50.0) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.50.0)(jest@27.5.1)(typescript@5.3.3) + eslint-plugin-jsx-a11y: 6.7.1(eslint@8.50.0) + eslint-plugin-react: 7.33.2(eslint@8.50.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.50.0) + eslint-plugin-testing-library: 5.11.1(eslint@8.50.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - '@babel/plugin-syntax-flow' @@ -13253,7 +13043,7 @@ packages: transitivePeerDependencies: - supports-color - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -13274,14 +13064,14 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.3.3) debug: 3.2.7 + eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - dev: false - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.50.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -13302,12 +13092,13 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@5.3.3) debug: 3.2.7 - eslint: 8.48.0 + eslint: 8.50.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color + dev: false /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.7.2)(eslint-import-resolver-node@0.3.9)(eslint@8.50.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} @@ -13338,7 +13129,7 @@ packages: - supports-color dev: true - /eslint-plugin-flowtype@8.0.3: + /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0): resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -13346,11 +13137,13 @@ packages: '@babel/plugin-transform-react-jsx': ^7.14.9 eslint: ^8.1.0 dependencies: + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.15) + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.22.15) + eslint: 8.48.0 lodash: 4.17.21 string-natural-compare: 3.0.1 - dev: false - /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0): + /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.50.0): resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -13360,11 +13153,12 @@ packages: dependencies: '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.15) '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.22.15) - eslint: 8.48.0 + eslint: 8.50.0 lodash: 4.17.21 string-natural-compare: 3.0.1 + dev: false - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0): + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.48.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: @@ -13374,15 +13168,16 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.3.3) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 + eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -13396,9 +13191,8 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: false - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.48.0): + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.50.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: @@ -13408,16 +13202,16 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@5.3.3) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.48.0 + eslint: 8.50.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.50.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -13431,6 +13225,7 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + dev: false /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.7.2)(eslint@8.50.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} @@ -13467,6 +13262,28 @@ packages: - supports-color dev: true + /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.48.0)(jest@27.5.1)(typescript@5.2.2): + resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^4.0.0 || ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.48.0)(typescript@5.2.2) + eslint: 8.48.0 + jest: 27.5.1(ts-node@10.9.1) + transitivePeerDependencies: + - supports-color + - typescript + dev: false + /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.48.0)(jest@27.5.1)(typescript@5.3.3): resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -13483,12 +13300,12 @@ packages: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)(typescript@5.3.3) '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.48.0)(typescript@5.3.3) eslint: 8.48.0 - jest: 27.5.1 + jest: 27.5.1(ts-node@10.9.1) transitivePeerDependencies: - supports-color - typescript - /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(jest@27.5.1)(typescript@5.3.3): + /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.50.0)(jest@27.5.1)(typescript@5.3.3): resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} peerDependencies: @@ -13501,15 +13318,16 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(typescript@5.3.3) - '@typescript-eslint/experimental-utils': 5.62.0(typescript@5.3.3) - jest: 27.5.1 + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.50.0)(typescript@5.3.3) + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.50.0)(typescript@5.3.3) + eslint: 8.50.0 + jest: 27.5.1(ts-node@10.9.1) transitivePeerDependencies: - supports-color - typescript dev: false - /eslint-plugin-jsx-a11y@6.7.1: + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.48.0): resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} peerDependencies: @@ -13524,6 +13342,7 @@ packages: axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 + eslint: 8.48.0 has: 1.0.3 jsx-ast-utils: 3.3.5 language-tags: 1.0.5 @@ -13531,9 +13350,8 @@ packages: object.entries: 1.1.7 object.fromentries: 2.0.7 semver: 6.3.1 - dev: false - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.48.0): + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.50.0): resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} peerDependencies: @@ -13548,7 +13366,7 @@ packages: axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.48.0 + eslint: 8.50.0 has: 1.0.3 jsx-ast-utils: 3.3.5 language-tags: 1.0.5 @@ -13556,6 +13374,7 @@ packages: object.entries: 1.1.7 object.fromentries: 2.0.7 semver: 6.3.1 + dev: false /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.48.0)(prettier@2.8.8): resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} @@ -13595,13 +13414,6 @@ packages: synckit: 0.8.5 dev: true - /eslint-plugin-react-hooks@4.6.0: - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - dev: false - /eslint-plugin-react-hooks@4.6.0(eslint@8.48.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} @@ -13619,30 +13431,6 @@ packages: eslint: 8.50.0 dev: false - /eslint-plugin-react@7.33.2: - resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - dependencies: - array-includes: 3.1.7 - array.prototype.flatmap: 1.3.2 - array.prototype.tosorted: 1.1.1 - doctrine: 2.1.0 - es-iterator-helpers: 1.0.14 - estraverse: 5.3.0 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 - object.hasown: 1.1.3 - object.values: 1.1.7 - prop-types: 15.8.1 - resolve: 2.0.0-next.4 - semver: 6.3.1 - string.prototype.matchall: 4.0.9 - dev: false - /eslint-plugin-react@7.33.2(eslint@8.48.0): resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} engines: {node: '>=4'} @@ -13692,6 +13480,19 @@ packages: string.prototype.matchall: 4.0.9 dev: false + /eslint-plugin-testing-library@5.11.1(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} + peerDependencies: + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@5.2.2) + eslint: 8.48.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + /eslint-plugin-testing-library@5.11.1(eslint@8.48.0)(typescript@5.3.3): resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} @@ -13704,13 +13505,14 @@ packages: - supports-color - typescript - /eslint-plugin-testing-library@5.11.1(typescript@5.3.3): + /eslint-plugin-testing-library@5.11.1(eslint@8.50.0)(typescript@5.3.3): resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.62.0(typescript@5.3.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@5.3.3) + eslint: 8.50.0 transitivePeerDependencies: - supports-color - typescript @@ -13774,7 +13576,7 @@ packages: engines: {node: '>= 12.13.0'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 - webpack: ^5.0.0 + webpack: ^5 dependencies: '@types/eslint': 8.44.2 eslint: 8.48.0 @@ -13782,21 +13584,22 @@ packages: micromatch: 4.0.5 normalize-path: 3.0.0 schema-utils: 4.2.0 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) - /eslint-webpack-plugin@3.2.0(webpack@5.88.2): + /eslint-webpack-plugin@3.2.0(eslint@8.50.0)(webpack@5.88.2): resolution: {integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==} engines: {node: '>= 12.13.0'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 - webpack: ^5.0.0 + webpack: ^5 dependencies: '@types/eslint': 8.44.2 + eslint: 8.50.0 jest-worker: 28.1.3 micromatch: 4.0.5 normalize-path: 3.0.0 schema-utils: 4.2.0 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) dev: false /eslint@8.48.0: @@ -14012,7 +13815,7 @@ packages: '@ethersproject/networks': 5.7.1 '@ethersproject/pbkdf2': 5.7.0 '@ethersproject/properties': 5.7.0 - '@ethersproject/providers': 5.7.2 + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@ethersproject/random': 5.7.0 '@ethersproject/rlp': 5.7.0 '@ethersproject/sha2': 5.7.0 @@ -14294,11 +14097,11 @@ packages: resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} engines: {node: '>= 10.13.0'} peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + webpack: ^5 dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) /file-selector@0.6.0: resolution: {integrity: sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==} @@ -14421,15 +14224,6 @@ packages: tslib: 2.6.2 dev: false - /follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - /follow-redirects@1.15.2(debug@4.3.4): resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} @@ -14462,6 +14256,38 @@ packages: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: false + /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.48.0)(typescript@5.2.2)(webpack@5.88.2): + resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} + engines: {node: '>=10', yarn: '>=1.0.0'} + peerDependencies: + eslint: '>= 6' + typescript: '>= 2.7' + vue-template-compiler: '*' + webpack: ^5 + peerDependenciesMeta: + eslint: + optional: true + vue-template-compiler: + optional: true + dependencies: + '@babel/code-frame': 7.22.13 + '@types/json-schema': 7.0.12 + chalk: 4.1.2 + chokidar: 3.5.3 + cosmiconfig: 6.0.0 + deepmerge: 4.3.1 + eslint: 8.48.0 + fs-extra: 9.1.0 + glob: 7.2.3 + memfs: 3.5.3 + minimatch: 3.1.2 + schema-utils: 2.7.0 + semver: 7.5.4 + tapable: 1.1.3 + typescript: 5.2.2 + webpack: 5.88.2(esbuild@0.18.20) + dev: false + /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.48.0)(typescript@5.3.3)(webpack@5.88.2): resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} @@ -14469,7 +14295,7 @@ packages: eslint: '>= 6' typescript: '>= 2.7' vue-template-compiler: '*' - webpack: '>= 4' + webpack: ^5 peerDependenciesMeta: eslint: optional: true @@ -14491,16 +14317,16 @@ packages: semver: 7.5.4 tapable: 1.1.3 typescript: 5.3.3 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) - /fork-ts-checker-webpack-plugin@6.5.3(typescript@5.3.3)(webpack@5.88.2): + /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.50.0)(typescript@5.3.3)(webpack@5.88.2): resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: eslint: '>= 6' typescript: '>= 2.7' vue-template-compiler: '*' - webpack: '>= 4' + webpack: ^5 peerDependenciesMeta: eslint: optional: true @@ -14513,6 +14339,7 @@ packages: chokidar: 3.5.3 cosmiconfig: 6.0.0 deepmerge: 4.3.1 + eslint: 8.50.0 fs-extra: 9.1.0 glob: 7.2.3 memfs: 3.5.3 @@ -14521,7 +14348,7 @@ packages: semver: 7.5.4 tapable: 1.1.3 typescript: 5.3.3 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) dev: false /form-data@2.3.3: @@ -14596,23 +14423,6 @@ packages: '@emotion/is-prop-valid': 0.8.8 dev: false - /framer-motion@10.16.4(react@18.2.0): - resolution: {integrity: sha512-p9V9nGomS3m6/CALXqv6nFGMuFOxbWsmaOrdmhyQimMIlLl3LC7h7l86wge/Js/8cRu5ktutS/zlzgR7eBOtFA==} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - dependencies: - react: 18.2.0 - tslib: 2.6.2 - optionalDependencies: - '@emotion/is-prop-valid': 0.8.8 - dev: false - /framer-motion@6.5.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==} peerDependencies: @@ -14976,13 +14786,14 @@ packages: /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - /graphql-request@6.1.0: + /graphql-request@6.1.0(graphql@16.8.0): resolution: {integrity: sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==} peerDependencies: graphql: 14 - 16 dependencies: - '@graphql-typed-document-node/core': 3.2.0 + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.0) cross-fetch: 3.1.8 + graphql: 16.8.0 transitivePeerDependencies: - encoding dev: false @@ -14990,7 +14801,6 @@ packages: /graphql@16.8.0: resolution: {integrity: sha512-0oKGaR+y3qcS5mCu1vb7KG+a89vjn06C7Ihq/dDl3jA+A8B3TKomvi3CiEcVLJQGalbu8F52LxkOym7U5sSfbg==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - dev: true /gzip-size@6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} @@ -15049,7 +14859,7 @@ packages: '@ethersproject/bytes': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/contracts': 5.7.0 - '@ethersproject/providers': 5.7.2 + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@ethersproject/solidity': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wallet': 5.7.0 @@ -15259,14 +15069,14 @@ packages: resolution: {integrity: sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==} engines: {node: '>=10.13.0'} peerDependencies: - webpack: ^5.20.0 + webpack: ^5 dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) /htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -15343,7 +15153,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2 + follow-redirects: 1.15.2(debug@4.3.4) requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -15385,12 +15195,6 @@ packages: ms: 2.1.3 dev: false - /husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} - hasBin: true - dev: true - /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -16430,7 +16234,7 @@ packages: peerDependencies: ws: '*' dependencies: - ws: 7.5.9 + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) dev: false /isomorphic-ws@5.0.0(ws@8.13.0): @@ -16678,7 +16482,7 @@ packages: buffer: 6.0.3 event-iterator: 2.0.0 iso-url: 1.2.1 - ws: 7.5.9 + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -16732,7 +16536,7 @@ packages: isomorphic-ws: 4.0.1(ws@7.5.9) json-stringify-safe: 5.0.1 uuid: 8.3.2 - ws: 7.5.9 + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -16772,7 +16576,7 @@ packages: transitivePeerDependencies: - supports-color - /jest-cli@27.5.1: + /jest-cli@27.5.1(ts-node@10.9.1): resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -16782,14 +16586,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 27.5.1 + '@jest/core': 27.5.1(ts-node@10.9.1) '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 27.5.1 + jest-config: 27.5.1(ts-node@10.9.1) jest-util: 27.5.1 jest-validate: 27.5.1 prompts: 2.4.2 @@ -16801,7 +16605,7 @@ packages: - ts-node - utf-8-validate - /jest-config@27.5.1: + /jest-config@27.5.1(ts-node@10.9.1): resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: @@ -16834,6 +16638,7 @@ packages: pretty-format: 27.5.1 slash: 3.0.0 strip-json-comments: 3.1.1 + ts-node: 10.9.1(@types/node@20.4.7)(typescript@5.3.3) transitivePeerDependencies: - bufferutil - canvas @@ -17229,7 +17034,7 @@ packages: dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 - jest: 27.5.1 + jest: 27.5.1(ts-node@10.9.1) jest-regex-util: 28.0.2 jest-watcher: 28.1.3 slash: 4.0.0 @@ -17266,7 +17071,7 @@ packages: peerDependencies: jest: '>= 25' dependencies: - jest: 27.5.1 + jest: 27.5.1(ts-node@10.9.1) dev: true /jest-worker@26.6.2: @@ -17293,7 +17098,7 @@ packages: merge-stream: 2.0.0 supports-color: 8.1.1 - /jest@27.5.1: + /jest@27.5.1(ts-node@10.9.1): resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -17303,9 +17108,9 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 27.5.1 + '@jest/core': 27.5.1(ts-node@10.9.1) import-local: 3.1.0 - jest-cli: 27.5.1 + jest-cli: 27.5.1(ts-node@10.9.1) transitivePeerDependencies: - bufferutil - canvas @@ -17387,7 +17192,7 @@ packages: whatwg-encoding: 1.0.5 whatwg-mimetype: 2.3.0 whatwg-url: 8.7.0 - ws: 7.5.9 + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) xml-name-validator: 3.0.0 transitivePeerDependencies: - bufferutil @@ -18640,10 +18445,10 @@ packages: resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} engines: {node: '>= 12.13.0'} peerDependencies: - webpack: ^5.0.0 + webpack: ^5 dependencies: schema-utils: 4.2.0 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) /mini-svg-data-uri@1.4.4: resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} @@ -19080,7 +18885,6 @@ packages: /node-gyp-build@4.6.1: resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==} hasBin: true - dev: false /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -20047,7 +19851,7 @@ packages: postcss: 8.4.29 postcss-value-parser: 4.2.0 - /postcss-load-config@4.0.1(postcss@8.4.29): + /postcss-load-config@4.0.1(postcss@8.4.29)(ts-node@10.9.1): resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} engines: {node: '>= 14'} peerDependencies: @@ -20061,6 +19865,7 @@ packages: dependencies: lilconfig: 2.1.0 postcss: 8.4.29 + ts-node: 10.9.1(@types/node@20.4.7)(typescript@5.3.3) yaml: 2.3.2 /postcss-loader@6.2.1(postcss@8.4.29)(webpack@5.88.2): @@ -20068,13 +19873,13 @@ packages: engines: {node: '>= 12.13.0'} peerDependencies: postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 + webpack: ^5 dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 postcss: 8.4.29 semver: 7.5.4 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) /postcss-logical@5.0.4(postcss@8.4.29): resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==} @@ -20901,12 +20706,54 @@ packages: react: 18.2.0 dev: false + /react-dev-utils@12.0.1(eslint@8.48.0)(typescript@5.2.2)(webpack@5.88.2): + resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=2.7' + webpack: ^5 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/code-frame': 7.22.13 + address: 1.2.2 + browserslist: 4.21.10 + chalk: 4.1.2 + cross-spawn: 7.0.3 + detect-port-alt: 1.1.6 + escape-string-regexp: 4.0.0 + filesize: 8.0.7 + find-up: 5.0.0 + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.48.0)(typescript@5.2.2)(webpack@5.88.2) + global-modules: 2.0.0 + globby: 11.1.0 + gzip-size: 6.0.0 + immer: 9.0.21 + is-root: 2.1.0 + loader-utils: 3.2.1 + open: 8.4.2 + pkg-up: 3.1.0 + prompts: 2.4.2 + react-error-overlay: 6.0.11 + recursive-readdir: 2.2.3 + shell-quote: 1.8.1 + strip-ansi: 6.0.1 + text-table: 0.2.0 + typescript: 5.2.2 + webpack: 5.88.2(esbuild@0.18.20) + transitivePeerDependencies: + - eslint + - supports-color + - vue-template-compiler + dev: false + /react-dev-utils@12.0.1(eslint@8.48.0)(typescript@5.3.3)(webpack@5.88.2): resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: typescript: '>=2.7' - webpack: '>=4' + webpack: ^5 peerDependenciesMeta: typescript: optional: true @@ -20936,18 +20783,18 @@ packages: strip-ansi: 6.0.1 text-table: 0.2.0 typescript: 5.3.3 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) transitivePeerDependencies: - eslint - supports-color - vue-template-compiler - /react-dev-utils@12.0.1(typescript@5.3.3)(webpack@5.88.2): + /react-dev-utils@12.0.1(eslint@8.50.0)(typescript@5.3.3)(webpack@5.88.2): resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: typescript: '>=2.7' - webpack: '>=4' + webpack: ^5 peerDependenciesMeta: typescript: optional: true @@ -20961,7 +20808,7 @@ packages: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(typescript@5.3.3)(webpack@5.88.2) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.50.0)(typescript@5.3.3)(webpack@5.88.2) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -20977,7 +20824,7 @@ packages: strip-ansi: 6.0.1 text-table: 0.2.0 typescript: 5.3.3 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) transitivePeerDependencies: - eslint - supports-color @@ -21211,29 +21058,114 @@ packages: react-router: 6.15.0(react@18.2.0) dev: false - /react-router-dom@6.15.0(react@18.2.0): - resolution: {integrity: sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==} + /react-router@6.15.0(react@18.2.0): + resolution: {integrity: sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' - react-dom: '>=16.8' dependencies: '@remix-run/router': 1.8.0 react: 18.2.0 - react-router: 6.15.0(react@18.2.0) dev: false - /react-router@6.15.0(react@18.2.0): - resolution: {integrity: sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==} + /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(esbuild@0.18.20)(eslint@8.48.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.2.2): + resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} engines: {node: '>=14.0.0'} + hasBin: true peerDependencies: - react: '>=16.8' + eslint: '*' + react: '>= 16' + typescript: ^3.2.1 || ^4 + peerDependenciesMeta: + typescript: + optional: true dependencies: - '@remix-run/router': 1.8.0 + '@babel/core': 7.22.15 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.11(react-refresh@0.11.0)(webpack-dev-server@4.15.1)(webpack@5.88.2) + '@svgr/webpack': 5.5.0 + babel-jest: 27.5.1(@babel/core@7.22.15) + babel-loader: 8.3.0(@babel/core@7.22.15)(webpack@5.88.2) + babel-plugin-named-asset-import: 0.3.8(@babel/core@7.22.15) + babel-preset-react-app: 10.0.1 + bfj: 7.1.0 + browserslist: 4.21.10 + camelcase: 6.3.0 + case-sensitive-paths-webpack-plugin: 2.4.0 + css-loader: 6.8.1(webpack@5.88.2) + css-minimizer-webpack-plugin: 3.4.1(esbuild@0.18.20)(webpack@5.88.2) + dotenv: 10.0.0 + dotenv-expand: 5.1.0 + eslint: 8.48.0 + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0)(jest@27.5.1)(typescript@5.2.2) + eslint-webpack-plugin: 3.2.0(eslint@8.48.0)(webpack@5.88.2) + file-loader: 6.2.0(webpack@5.88.2) + fs-extra: 10.1.0 + html-webpack-plugin: 5.5.3(webpack@5.88.2) + identity-obj-proxy: 3.0.0 + jest: 27.5.1(ts-node@10.9.1) + jest-resolve: 27.5.1 + jest-watch-typeahead: 1.1.0(jest@27.5.1) + mini-css-extract-plugin: 2.7.6(webpack@5.88.2) + postcss: 8.4.29 + postcss-flexbugs-fixes: 5.0.2(postcss@8.4.29) + postcss-loader: 6.2.1(postcss@8.4.29)(webpack@5.88.2) + postcss-normalize: 10.0.1(browserslist@4.21.10)(postcss@8.4.29) + postcss-preset-env: 7.8.3(postcss@8.4.29) + prompts: 2.4.2 react: 18.2.0 + react-app-polyfill: 3.0.0 + react-dev-utils: 12.0.1(eslint@8.48.0)(typescript@5.2.2)(webpack@5.88.2) + react-refresh: 0.11.0 + resolve: 1.22.4 + resolve-url-loader: 4.0.0 + sass-loader: 12.6.0(webpack@5.88.2) + semver: 7.5.4 + source-map-loader: 3.0.2(webpack@5.88.2) + style-loader: 3.3.3(webpack@5.88.2) + tailwindcss: 3.3.3(ts-node@10.9.1) + terser-webpack-plugin: 5.3.9(esbuild@0.18.20)(webpack@5.88.2) + typescript: 5.2.2 + webpack: 5.88.2(esbuild@0.18.20) + webpack-dev-server: 4.15.1(webpack@5.88.2) + webpack-manifest-plugin: 4.1.1(webpack@5.88.2) + workbox-webpack-plugin: 6.6.0(webpack@5.88.2) + optionalDependencies: + fsevents: 2.3.3 + transitivePeerDependencies: + - '@babel/plugin-syntax-flow' + - '@babel/plugin-transform-react-jsx' + - '@parcel/css' + - '@swc/core' + - '@types/babel__core' + - '@types/webpack' + - bufferutil + - canvas + - clean-css + - csso + - debug + - esbuild + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - fibers + - node-notifier + - node-sass + - rework + - rework-visit + - sass + - sass-embedded + - sockjs-client + - supports-color + - ts-node + - type-fest + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-hot-middleware + - webpack-plugin-serve dev: false - /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0)(react@18.2.0)(typescript@5.3.3): + /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(esbuild@0.18.20)(eslint@8.48.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.3.3): resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} engines: {node: '>=14.0.0'} hasBin: true @@ -21257,7 +21189,7 @@ packages: camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 css-loader: 6.8.1(webpack@5.88.2) - css-minimizer-webpack-plugin: 3.4.1(webpack@5.88.2) + css-minimizer-webpack-plugin: 3.4.1(esbuild@0.18.20)(webpack@5.88.2) dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.48.0 @@ -21267,7 +21199,7 @@ packages: fs-extra: 10.1.0 html-webpack-plugin: 5.5.3(webpack@5.88.2) identity-obj-proxy: 3.0.0 - jest: 27.5.1 + jest: 27.5.1(ts-node@10.9.1) jest-resolve: 27.5.1 jest-watch-typeahead: 1.1.0(jest@27.5.1) mini-css-extract-plugin: 2.7.6(webpack@5.88.2) @@ -21287,10 +21219,10 @@ packages: semver: 7.5.4 source-map-loader: 3.0.2(webpack@5.88.2) style-loader: 3.3.3(webpack@5.88.2) - tailwindcss: 3.3.3 - terser-webpack-plugin: 5.3.9(webpack@5.88.2) + tailwindcss: 3.3.3(ts-node@10.9.1) + terser-webpack-plugin: 5.3.9(esbuild@0.18.20)(webpack@5.88.2) typescript: 5.3.3 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) webpack-dev-server: 4.15.1(webpack@5.88.2) webpack-manifest-plugin: 4.1.1(webpack@5.88.2) workbox-webpack-plugin: 6.6.0(webpack@5.88.2) @@ -21329,7 +21261,7 @@ packages: - webpack-hot-middleware - webpack-plugin-serve - /react-scripts@5.0.1(react@18.2.0)(typescript@5.3.3): + /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(esbuild@0.18.20)(eslint@8.50.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.3.3): resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} engines: {node: '>=14.0.0'} hasBin: true @@ -21353,16 +21285,17 @@ packages: camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 css-loader: 6.8.1(webpack@5.88.2) - css-minimizer-webpack-plugin: 3.4.1(webpack@5.88.2) + css-minimizer-webpack-plugin: 3.4.1(esbuild@0.18.20)(webpack@5.88.2) dotenv: 10.0.0 dotenv-expand: 5.1.0 - eslint-config-react-app: 7.0.1(jest@27.5.1)(typescript@5.3.3) - eslint-webpack-plugin: 3.2.0(webpack@5.88.2) + eslint: 8.50.0 + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.50.0)(jest@27.5.1)(typescript@5.3.3) + eslint-webpack-plugin: 3.2.0(eslint@8.50.0)(webpack@5.88.2) file-loader: 6.2.0(webpack@5.88.2) fs-extra: 10.1.0 html-webpack-plugin: 5.5.3(webpack@5.88.2) identity-obj-proxy: 3.0.0 - jest: 27.5.1 + jest: 27.5.1(ts-node@10.9.1) jest-resolve: 27.5.1 jest-watch-typeahead: 1.1.0(jest@27.5.1) mini-css-extract-plugin: 2.7.6(webpack@5.88.2) @@ -21374,7 +21307,7 @@ packages: prompts: 2.4.2 react: 18.2.0 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(typescript@5.3.3)(webpack@5.88.2) + react-dev-utils: 12.0.1(eslint@8.50.0)(typescript@5.3.3)(webpack@5.88.2) react-refresh: 0.11.0 resolve: 1.22.4 resolve-url-loader: 4.0.0 @@ -21382,10 +21315,10 @@ packages: semver: 7.5.4 source-map-loader: 3.0.2(webpack@5.88.2) style-loader: 3.3.3(webpack@5.88.2) - tailwindcss: 3.3.3 - terser-webpack-plugin: 5.3.9(webpack@5.88.2) + tailwindcss: 3.3.3(ts-node@10.9.1) + terser-webpack-plugin: 5.3.9(esbuild@0.18.20)(webpack@5.88.2) typescript: 5.3.3 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) webpack-dev-server: 4.15.1(webpack@5.88.2) webpack-manifest-plugin: 4.1.1(webpack@5.88.2) workbox-webpack-plugin: 6.6.0(webpack@5.88.2) @@ -21969,7 +21902,7 @@ packages: node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 sass: ^1.3.0 sass-embedded: '*' - webpack: ^5.0.0 + webpack: ^5 peerDependenciesMeta: fibers: optional: true @@ -21982,7 +21915,7 @@ packages: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) /sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} @@ -22028,7 +21961,7 @@ packages: dependencies: '@types/json-schema': 7.0.12 ajv: 8.12.0 - ajv-formats: 2.1.1 + ajv-formats: 2.1.1(ajv@8.12.0) ajv-keywords: 5.1.0(ajv@8.12.0) /scrypt-js@3.0.1: @@ -22303,12 +22236,12 @@ packages: resolution: {integrity: sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==} engines: {node: '>= 12.13.0'} peerDependencies: - webpack: ^5.0.0 + webpack: ^5 dependencies: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.0.2 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) /source-map-resolve@0.5.3: resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} @@ -22708,9 +22641,9 @@ packages: resolution: {integrity: sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==} engines: {node: '>= 12.13.0'} peerDependencies: - webpack: ^5.0.0 + webpack: ^5 dependencies: - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) /style-to-js@1.1.3: resolution: {integrity: sha512-zKI5gN/zb7LS/Vm0eUwjmjrXWw8IMtyA8aPBJZdYiQTXj4+wQ3IucOLIOnF7zCHxvW8UhIGh/uZh/t9zEHXNTQ==} @@ -22886,19 +22819,8 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tailwind-merge: 1.14.0 - dev: true - - /tailwind-styled-components@2.2.0(react@18.2.0): - resolution: {integrity: sha512-Ogemwk0p69aU8WE/ooJZHjqstdJgT5R6HGU6TFz2uSnveSEtvW+C6aWOjGCvCr5H/bREv0IbbQ4yODknRrLBRQ==} - peerDependencies: - react: '>= 16.8.0' - react-dom: '>= 16.8.0' - dependencies: - react: 18.2.0 - tailwind-merge: 1.14.0 - dev: false - /tailwindcss@3.3.3: + /tailwindcss@3.3.3(ts-node@10.9.1): resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} engines: {node: '>=14.0.0'} hasBin: true @@ -22920,7 +22842,7 @@ packages: postcss: 8.4.29 postcss-import: 15.1.0(postcss@8.4.29) postcss-js: 4.0.1(postcss@8.4.29) - postcss-load-config: 4.0.1(postcss@8.4.29) + postcss-load-config: 4.0.1(postcss@8.4.29)(ts-node@10.9.1) postcss-nested: 6.0.1(postcss@8.4.29) postcss-selector-parser: 6.0.13 resolve: 1.22.4 @@ -22956,14 +22878,14 @@ packages: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - /terser-webpack-plugin@5.3.9(webpack@5.88.2): + /terser-webpack-plugin@5.3.9(esbuild@0.18.20)(webpack@5.88.2): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' esbuild: '*' uglify-js: '*' - webpack: ^5.1.0 + webpack: ^5 peerDependenciesMeta: '@swc/core': optional: true @@ -22973,11 +22895,12 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.19 + esbuild: 0.18.20 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 terser: 5.19.4 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) /terser@5.19.4: resolution: {integrity: sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==} @@ -23252,7 +23175,7 @@ packages: resolution: {integrity: sha512-cA5MPLWGWYXvnlJb4TamUUx858HVHBsxxdy8l7jxODOLDyGYnQOllob2A2jyDghGa5iJHs2gzFNHvwGJ0ZfR8g==} dev: false - /ts-jest@27.1.5(@babel/core@7.22.15)(@types/jest@27.5.2)(jest@27.5.1)(typescript@5.3.3): + /ts-jest@27.1.5(@babel/core@7.22.15)(@types/jest@27.5.2)(esbuild@0.18.20)(jest@27.5.1)(typescript@5.3.3): resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -23276,8 +23199,9 @@ packages: '@babel/core': 7.22.15 '@types/jest': 27.5.2 bs-logger: 0.2.6 + esbuild: 0.18.20 fast-json-stable-stringify: 2.1.0 - jest: 27.5.1 + jest: 27.5.1(ts-node@10.9.1) jest-util: 27.5.1 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -23408,7 +23332,6 @@ packages: typescript: 5.3.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - dev: true /ts-unused-exports@10.0.1(typescript@5.2.2): resolution: {integrity: sha512-nWG8Y96pKem01Hw4j4+Mwuy+L0/9sKT7D61Q+OS3cii9ocQACuV6lu00B9qpiPhF4ReVWw3QYHDqV8+to2wbsg==} @@ -23458,6 +23381,16 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /tsutils@3.21.0(typescript@5.2.2): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.2.2 + dev: false + /tsutils@3.21.0(typescript@5.3.3): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -23478,14 +23411,6 @@ packages: fsevents: 2.3.3 dev: true - /tulons@0.0.7: - resolution: {integrity: sha512-JyL9Vn4PPG2TTEJS35yqQgAMLd3IX9pFIlbiLmv47HuHTo2F3ihYg2yfMqde4hqGY1nGk77iJ/lvsTbAURJ8rg==} - dependencies: - axios: 0.27.2 - transitivePeerDependencies: - - debug - dev: false - /tulons@0.0.7(debug@4.3.4): resolution: {integrity: sha512-JyL9Vn4PPG2TTEJS35yqQgAMLd3IX9pFIlbiLmv47HuHTo2F3ihYg2yfMqde4hqGY1nGk77iJ/lvsTbAURJ8rg==} dependencies: @@ -23929,7 +23854,6 @@ packages: requiresBuild: true dependencies: node-gyp-build: 4.6.1 - dev: false /utf8-byte-length@1.0.4: resolution: {integrity: sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==} @@ -24164,6 +24088,29 @@ packages: - zod dev: false + /viem@2.7.1(typescript@5.3.3): + resolution: {integrity: sha512-izAX2KedTFnI2l0ZshtnlK2ZuDvSlKeuaanWyNwC4ffDgrCGtwX1bvVXO3Krh53lZgqvjd8UGpjGaBl3WqJ4yQ==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 + abitype: 1.0.0(typescript@5.3.3) + isows: 1.0.3(ws@8.13.0) + typescript: 5.3.3 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + dev: false + /vite-node@0.34.3(@types/node@20.9.0): resolution: {integrity: sha512-+0TzJf1g0tYXj6tR2vEyiA42OPq68QkRZCu/ERSo2PtsDJfBpDyEfuKbRvLmZqi/CgC7SCBtyC+WjTGNMRIaig==} engines: {node: '>=v14.18.0'} @@ -24327,71 +24274,6 @@ packages: - encoding dev: true - /vitest@0.34.3: - resolution: {integrity: sha512-7+VA5Iw4S3USYk+qwPxHl8plCMhA5rtfwMjgoQXMT7rO5ldWcdsdo3U1QD289JgglGK4WeOzgoLTsGFu6VISyQ==} - engines: {node: '>=v14.18.0'} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' - happy-dom: '*' - jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true - dependencies: - '@types/chai': 4.3.6 - '@types/chai-subset': 1.3.3 - '@types/node': 20.9.0 - '@vitest/expect': 0.34.3 - '@vitest/runner': 0.34.3 - '@vitest/snapshot': 0.34.3 - '@vitest/spy': 0.34.3 - '@vitest/utils': 0.34.3 - acorn: 8.10.0 - acorn-walk: 8.2.0 - cac: 6.7.14 - chai: 4.3.8 - debug: 4.3.4 - local-pkg: 0.4.3 - magic-string: 0.30.3 - pathe: 1.1.1 - picocolors: 1.0.0 - std-env: 3.4.3 - strip-literal: 1.3.0 - tinybench: 2.5.0 - tinypool: 0.7.0 - vite: 4.4.9(@types/node@20.9.0) - vite-node: 0.34.3(@types/node@20.9.0) - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - /vitest@0.34.3(happy-dom@11.0.2): resolution: {integrity: sha512-7+VA5Iw4S3USYk+qwPxHl8plCMhA5rtfwMjgoQXMT7rO5ldWcdsdo3U1QD289JgglGK4WeOzgoLTsGFu6VISyQ==} engines: {node: '>=v14.18.0'} @@ -24549,7 +24431,7 @@ packages: '@tanstack/react-query': 4.35.0(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query-persist-client': 4.35.0(@tanstack/react-query@4.35.0) '@wagmi/core': 0.10.16(@types/react@18.2.21)(ethers@5.7.2)(react@18.2.0)(typescript@5.3.3) - abitype: 0.3.0(typescript@5.3.3) + abitype: 0.3.0(typescript@5.3.3)(zod@3.22.4) ethers: 5.7.2 react: 18.2.0 typescript: 5.3.3 @@ -24601,7 +24483,7 @@ packages: - zod dev: false - /wagmi@0.12.19(@types/react@18.2.21)(ethers@5.7.2)(react@18.2.0)(typescript@5.3.3)(zod@3.22.4): + /wagmi@0.12.19(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(zod@3.22.4): resolution: {integrity: sha512-S/el9BDb/HNeQWh1v8TvntMPX/CgKLDAoJqDb8i7jifLfWPqFL7gor3vnI1Vs6ZlB8uh7m+K1Qyg+mKhbITuDQ==} peerDependencies: ethers: '>=5.5.1 <6' @@ -24612,7 +24494,7 @@ packages: optional: true dependencies: '@tanstack/query-sync-storage-persister': 4.35.0 - '@tanstack/react-query': 4.35.0(react@18.2.0) + '@tanstack/react-query': 4.35.0(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query-persist-client': 4.35.0(@tanstack/react-query@4.35.0) '@wagmi/core': 0.10.17(@types/react@18.2.21)(ethers@5.7.2)(react@18.2.0)(typescript@5.3.3)(zod@3.22.4) abitype: 0.3.0(typescript@5.3.3)(zod@3.22.4) @@ -24730,21 +24612,21 @@ packages: resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} engines: {node: '>= 12.13.0'} peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + webpack: ^5 dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) /webpack-dev-server@4.15.1(webpack@5.88.2): resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} engines: {node: '>= 12.13.0'} hasBin: true peerDependencies: - webpack: ^4.37.0 || ^5.0.0 + webpack: ^5 webpack-cli: '*' peerDependenciesMeta: webpack: @@ -24780,9 +24662,9 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) webpack-dev-middleware: 5.3.3(webpack@5.88.2) - ws: 8.14.0 + ws: 8.14.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - debug @@ -24793,10 +24675,10 @@ packages: resolution: {integrity: sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==} engines: {node: '>=12.22.0'} peerDependencies: - webpack: ^4.44.2 || ^5.47.0 + webpack: ^5 dependencies: tapable: 2.2.1 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) webpack-sources: 2.3.1 /webpack-merge@5.9.0: @@ -24823,7 +24705,7 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - /webpack@5.88.2: + /webpack@5.88.2(esbuild@0.18.20): resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} engines: {node: '>=10.13.0'} hasBin: true @@ -24854,7 +24736,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.88.2) + terser-webpack-plugin: 5.3.9(esbuild@0.18.20)(webpack@5.88.2) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -25139,12 +25021,12 @@ packages: resolution: {integrity: sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==} engines: {node: '>=10.0.0'} peerDependencies: - webpack: ^4.4.0 || ^5.9.0 + webpack: ^5 dependencies: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.88.2 + webpack: 5.88.2(esbuild@0.18.20) webpack-sources: 1.4.3 workbox-build: 6.6.0 transitivePeerDependencies: @@ -25202,18 +25084,6 @@ packages: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - /ws@7.4.6: - resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - /ws@7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10): resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} engines: {node: '>=8.3.0'} @@ -25228,7 +25098,6 @@ packages: dependencies: bufferutil: 4.0.8 utf-8-validate: 5.0.10 - dev: false /ws@7.5.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): resolution: {integrity: sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==} @@ -25246,18 +25115,6 @@ packages: utf-8-validate: 5.0.10 dev: false - /ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - /ws@7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10): resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} engines: {node: '>=8.3.0'} @@ -25272,7 +25129,6 @@ packages: dependencies: bufferutil: 4.0.8 utf-8-validate: 5.0.10 - dev: false /ws@8.11.0: resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} @@ -25300,18 +25156,6 @@ packages: optional: true dev: false - /ws@8.14.0: - resolution: {integrity: sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - /ws@8.14.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): resolution: {integrity: sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg==} engines: {node: '>=10.0.0'} @@ -25326,7 +25170,6 @@ packages: dependencies: bufferutil: 4.0.8 utf-8-validate: 5.0.10 - dev: false /xml-name-validator@3.0.0: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} @@ -25524,7 +25367,3 @@ packages: dependencies: '@types/node': 18.17.14 dev: false - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false From c3937b6754b48b38e2152c5e4f14ad153f1e62a5 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Fri, 2 Feb 2024 17:19:06 +0100 Subject: [PATCH 4/6] temporary fix: active rounds sorting (#2869) * fix active rounds * sort by amount of projects * log rounds * logs * logs * disable gg19 filter * disable gg19 filter * remove logs * fix round filter * fix test --- .../grant-explorer/src/features/api/rounds.ts | 52 +++---------------- .../src/features/discovery/LandingPage.tsx | 16 +++++- .../hooks/__tests__/useFilterRounds.test.tsx | 21 -------- 3 files changed, 21 insertions(+), 68 deletions(-) diff --git a/packages/grant-explorer/src/features/api/rounds.ts b/packages/grant-explorer/src/features/api/rounds.ts index b71dc929d9..a87d0fbc93 100644 --- a/packages/grant-explorer/src/features/api/rounds.ts +++ b/packages/grant-explorer/src/features/api/rounds.ts @@ -2,43 +2,10 @@ import useSWR, { useSWRConfig, Cache, SWRResponse } from "swr"; import { ChainId, RoundPayoutType } from "common"; import { __deprecated_RoundMetadata } from "./round"; import { MetadataPointer } from "./types"; -import { __deprecated_fetchFromIPFS, useDebugMode } from "./utils"; +import { __deprecated_fetchFromIPFS } from "./utils"; import { createTimestamp } from "../discovery/utils/createRoundsStatusFilter"; import { useDataLayer } from "data-layer"; -const validRounds = [ - "0x35c9d05558da3a3f3cddbf34a8e364e59b857004", // "Metacamp Onda 2023 FINAL - "0x984e29dcb4286c2d9cbaa2c238afdd8a191eefbc", // Gitcoin Citizens Round #1 - "0x4195cd3cd76cc13faeb94fdad66911b4e0996f38", // Greenpill Q2 2023 -].map((a) => a.toLowerCase()); - -const invalidRounds = [ - "0xde272b1a1efaefab2fd168c02b8cf0e3b10680ef", // Meg hello - - // https://github.com/gitcoinco/grants-stack/issues/2569 - "0x7c1104c39e09e7c6114f3d4e30a180a714deac7d", - "0x79715bf10dab457e06020ec41efae3484cff59dc", - "0x4632ea15ba3c1a7e072996fb316efefb8280381b", - "0xfe36ff9c59788a6a9ad7a979f459d69372dad0e6", - "0xa7149a073db99cd9ac267daf0c4f7767e50acf3f", - "0x4abc6f3322158bcec933f18998709322de7152c2", - "0xae53557089a1d771cd5cebeaf6accbe8f064ff4c", - "0xee3ed186939af2c55d33d242c4588426e368c8d0", - "0x8011e814439b44aa340bc3373df06233f45e3202", - "0xf3cd7429e863a39a9ecab60adc4676c1934076f2", - "0x88fc9d6695bedd34bbbe4ea0e2510573200713c7", - "0xae18f327ce481a7316d28a625d4c378c1f8b03a2", - "0x9b3b1e7edf9c5eea07fb3c7270220be1c3fea111", - "0x4c19261ff6e5736a2677a06741bf1e68995e7c95", - "0x1ebac14c3b3e539b0c1334415c70a923eb7c736f", - "0x3979611e7ca6db8f45b4a768079a88d9138622c1", - "0x0b1e3459cdadc52fca8977cede34f28bc298e3df", - "0x1427a0e71a222b0229a910dc72da01f8f04c7441", - "0xc25994667632d55a8e3dae88737e36f496600434", - "0x21d264139d66dd281dcb0177bbdca5ceeb71ad69", - "0x822742805c0596e883aba99ba2f3117e8c49b94a", -].map((a) => a.toLowerCase()); - export type __deprecated_RoundOverview = { id: string; chainId: ChainId; @@ -94,7 +61,6 @@ export const useRounds = ( chainIds: ChainId[] ): SWRResponse<__deprecated_RoundOverview[]> => { const { cache, mutate } = useSWRConfig(); - const isDebugModeEnabled = useDebugMode(); const dataLayer = useDataLayer(); const prewarmSwrCacheWithRoundsMetadata = async ( @@ -140,12 +106,14 @@ export const useRounds = ( await prewarmSwrCacheWithRoundsMetadata(rounds); return rounds; + }, + { + revalidateOnFocus: false, + revalidateIfStale: false, } ); - const data = ( - isDebugModeEnabled ? query.data : filterRounds(cache, query.data) - ) + const data = query.data // Limit final results returned ?.slice(0, variables.first ?? query.data?.length); @@ -169,14 +137,6 @@ export const filterRounds = ( rounds?: __deprecated_RoundOverview[] ) => { return rounds?.filter((round) => { - if (validRounds.includes(round.id.toLowerCase())) { - return true; - } - - if (invalidRounds.includes(round.id.toLowerCase())) { - return false; - } - // Get the round metadata const metadata = cache.get(`@"metadata","${round.roundMetaPtr.pointer}",`); if (metadata?.data?.roundType === "public") { diff --git a/packages/grant-explorer/src/features/discovery/LandingPage.tsx b/packages/grant-explorer/src/features/discovery/LandingPage.tsx index 311bc2236e..ea11ec2012 100644 --- a/packages/grant-explorer/src/features/discovery/LandingPage.tsx +++ b/packages/grant-explorer/src/features/discovery/LandingPage.tsx @@ -10,6 +10,7 @@ import { } from "./hooks/useFilterRounds"; import { toQueryString } from "./RoundsFilter"; import { getEnabledChains } from "../../app/chainConfig"; +import { useMemo } from "react"; const LandingPage = () => { const activeRounds = useFilterRounds( @@ -21,6 +22,19 @@ const LandingPage = () => { getEnabledChains() ); + const filteredActiveRounds: typeof activeRounds.data = useMemo(() => { + const rounds = + activeRounds.data?.filter((round) => { + return (round.projects?.length ?? 0) > 1; + }) ?? []; + + rounds.sort((a, b) => { + return (b.projects?.length ?? 0) - (a.projects?.length ?? 0); + }); + + return rounds; + }, [activeRounds.data]); + return ( @@ -33,7 +47,7 @@ const LandingPage = () => { } > diff --git a/packages/grant-explorer/src/features/discovery/hooks/__tests__/useFilterRounds.test.tsx b/packages/grant-explorer/src/features/discovery/hooks/__tests__/useFilterRounds.test.tsx index 9e922f2d22..b086a483fc 100644 --- a/packages/grant-explorer/src/features/discovery/hooks/__tests__/useFilterRounds.test.tsx +++ b/packages/grant-explorer/src/features/discovery/hooks/__tests__/useFilterRounds.test.tsx @@ -109,26 +109,5 @@ describe("useFilterRounds", () => { )?.length ).toBe(5); expect(filterRounds(cacheMock, MOCKED_ROUNDS)?.length).toBe(0); - - expect( - filterRounds( - cacheMock, - MOCKED_ROUNDS.map((r) => ({ - ...r, - // If RoundID is part of valid rounds - id: "0x35c9d05558da3a3f3cddbf34a8e364e59b857004", - })) - )?.length - ).toBe(5); - expect( - filterRounds( - cacheMock, - MOCKED_ROUNDS.map((r) => ({ - ...r, - // If RoundID is part of invalid rounds - id: "0xde272b1a1efaefab2fd168c02b8cf0e3b10680ef", - })) - )?.length - ).toBe(0); }); }); From d010826ed8ed931546f0128765d98a3f2a6cedab Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Fri, 2 Feb 2024 17:21:10 +0100 Subject: [PATCH 5/6] hotfix: homepage rounds skeleton --- .../grant-explorer/src/features/discovery/LandingPage.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/grant-explorer/src/features/discovery/LandingPage.tsx b/packages/grant-explorer/src/features/discovery/LandingPage.tsx index ea11ec2012..ac5b87bad8 100644 --- a/packages/grant-explorer/src/features/discovery/LandingPage.tsx +++ b/packages/grant-explorer/src/features/discovery/LandingPage.tsx @@ -23,6 +23,10 @@ const LandingPage = () => { ); const filteredActiveRounds: typeof activeRounds.data = useMemo(() => { + if (activeRounds.data === undefined) { + return undefined; + } + const rounds = activeRounds.data?.filter((round) => { return (round.projects?.length ?? 0) > 1; From c199d130aa6200ae6254d211461ca05de39f7253 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Fri, 2 Feb 2024 19:41:59 +0100 Subject: [PATCH 6/6] Revert "create a round on allo V1 using allo wrapper in manager (#2826)" (#2873) This reverts commit ef026410fae80769f924da37e4f5e51ff5820a6d. --- packages/builder/craco.config.js | 7 - .../src/components}/AlloWrapper.tsx | 8 +- packages/builder/src/index.tsx | 6 +- packages/builder/src/utils/test_utils.tsx | 2 - packages/builder/tsconfig.json | 2 +- packages/common/package.json | 1 - packages/common/src/AlloWrapper.tsx | 53 - packages/common/src/allo/abis/allo-v2/Allo.ts | 1381 --------------- packages/common/src/allo/addresses/allo-v1.ts | 182 -- packages/common/src/allo/allo.ts | 31 +- .../common/src/allo/backends/allo-v1.test.ts | 13 +- packages/common/src/allo/backends/allo-v1.ts | 287 +-- .../common/src/allo/backends/allo-v2.test.ts | 3 +- packages/common/src/allo/backends/allo-v2.ts | 30 +- .../common/src/allo/backends/test-utils.ts | 2 +- packages/common/src/allo/common.ts | 2 + packages/common/src/allo/indexer.ts | 2 +- .../common/src/allo/transaction-sender.ts | 10 +- packages/common/src/chain-ids.ts | 18 - packages/common/src/graphql_fetch.ts | 73 - packages/common/src/index.ts | 132 +- packages/common/src/payoutTokens.ts | 399 ----- packages/common/src/types.ts | 59 - packages/common/tsconfig.json | 1 + packages/data-layer/src/data.types.ts | 12 +- .../grant-explorer/src/features/api/utils.ts | 7 +- packages/round-manager/craco.config.js | 4 +- packages/round-manager/package.json | 7 +- .../src/context/round/CreateRoundContext.tsx | 363 ++++ .../__tests__/CreateRoundContext.test.tsx | 449 +++++ .../src/features/api/deployments.ts | 104 -- .../src/features/api/payoutTokens.ts | 3 +- .../round-manager/src/features/api/round.ts | 4 - .../__tests__/AddQuestionModal.test.tsx | 20 +- .../features/round/RoundApplicationForm.tsx | 116 +- .../__tests__/RoundApplicationForm.test.tsx | 83 +- packages/round-manager/src/index.tsx | 168 +- .../src/stores/createRoundStore.ts | 112 -- packages/round-manager/tsconfig.json | 2 +- pnpm-lock.yaml | 1559 +++++++++-------- 40 files changed, 2030 insertions(+), 3687 deletions(-) rename packages/{round-manager/src/features/api => builder/src/components}/AlloWrapper.tsx (91%) delete mode 100644 packages/common/src/AlloWrapper.tsx delete mode 100644 packages/common/src/allo/abis/allo-v2/Allo.ts delete mode 100644 packages/common/src/allo/addresses/allo-v1.ts delete mode 100644 packages/common/src/graphql_fetch.ts delete mode 100644 packages/common/src/payoutTokens.ts delete mode 100644 packages/common/src/types.ts create mode 100644 packages/round-manager/src/context/round/CreateRoundContext.tsx create mode 100644 packages/round-manager/src/context/round/__tests__/CreateRoundContext.test.tsx delete mode 100644 packages/round-manager/src/features/api/deployments.ts delete mode 100644 packages/round-manager/src/stores/createRoundStore.ts diff --git a/packages/builder/craco.config.js b/packages/builder/craco.config.js index 7406ac9dec..8d34c573d3 100644 --- a/packages/builder/craco.config.js +++ b/packages/builder/craco.config.js @@ -69,13 +69,6 @@ module.exports = { options: { includePaths: [path.join(__dirname, `../common/src`)], skipEsbuildJest: true, - esbuildLoaderOptions: { - loader: "tsx", // Set the value to 'tsx' if you use typescript - target: "es2020", - }, - esbuildMinimizerOptions: { - target: "es2020", - }, }, }, ], diff --git a/packages/round-manager/src/features/api/AlloWrapper.tsx b/packages/builder/src/components/AlloWrapper.tsx similarity index 91% rename from packages/round-manager/src/features/api/AlloWrapper.tsx rename to packages/builder/src/components/AlloWrapper.tsx index b9c0bfa792..972b1d864f 100644 --- a/packages/round-manager/src/features/api/AlloWrapper.tsx +++ b/packages/builder/src/components/AlloWrapper.tsx @@ -7,10 +7,10 @@ import { createPinataIpfsUploader, createWaitForIndexerSyncTo, } from "common"; +import { getConfig } from "common/src/config"; import { useEffect, useState } from "react"; import { useNetwork, useProvider, useSigner } from "wagmi"; -import { getConfig } from "common/src/config"; -import { addressesByChainID } from "./deployments"; +import { addressesByChainID } from "../contracts/deployments"; function AlloWrapper({ children }: { children: JSX.Element | JSX.Element[] }) { const { chain } = useNetwork(); @@ -24,7 +24,7 @@ function AlloWrapper({ children }: { children: JSX.Element | JSX.Element[] }) { if (!web3Provider || !signer || !chainID) { setBackend(null); } else { - const addresses = addressesByChainID(chainID); + const addresses = addressesByChainID(chainID!); const config = getConfig(); let alloBackend: Allo; @@ -42,7 +42,6 @@ function AlloWrapper({ children }: { children: JSX.Element | JSX.Element[] }) { waitUntilIndexerSynced: createWaitForIndexerSyncTo( `${getConfig().dataLayer.gsIndexerEndpoint}/graphql` ), - allo: addresses.projectRegistry as `0x${string}`, }); setBackend(alloBackend); @@ -53,6 +52,7 @@ function AlloWrapper({ children }: { children: JSX.Element | JSX.Element[] }) { signer, web3Provider ), + projectRegistryAddress: addresses?.projectRegistry! as `0x${string}`, ipfsUploader: createPinataIpfsUploader({ token: getConfig().pinata.jwt, endpoint: `${getConfig().pinata.baseUrl}/pinning/pinFileToIPFS`, diff --git a/packages/builder/src/index.tsx b/packages/builder/src/index.tsx index 7831e050b9..14a3790814 100644 --- a/packages/builder/src/index.tsx +++ b/packages/builder/src/index.tsx @@ -1,7 +1,7 @@ import { ChakraProvider } from "@chakra-ui/react"; import { datadogRum } from "@datadog/browser-rum"; import { ReduxRouter } from "@lagunovsky/redux-react-router"; -import { lightTheme, RainbowKitProvider } from "@rainbow-me/rainbowkit"; +import { RainbowKitProvider, lightTheme } from "@rainbow-me/rainbowkit"; import "@rainbow-me/rainbowkit/styles.css"; import { getConfig } from "common/src/config"; import { DataLayer, DataLayerProvider } from "data-layer"; @@ -9,8 +9,8 @@ import ReactDOM from "react-dom/client"; import { Provider } from "react-redux"; import { Navigate, Route, Routes } from "react-router"; import { WagmiConfig } from "wagmi"; -import AlloWrapper from "common/src/AlloWrapper"; import "./browserPatches"; +import AlloWrapper from "./components/AlloWrapper"; import ErrorBoundary from "./components/ErrorBoundary"; import Layout from "./components/Layout"; import PageNotFound from "./components/base/PageNotFound"; @@ -26,9 +26,9 @@ import reportWebVitals from "./reportWebVitals"; import { slugs } from "./routes"; import setupStore from "./store"; import "./styles/index.css"; +import initTagmanager from "./tagmanager"; import initDatadog from "./utils/datadog"; import wagmiClient, { chains } from "./utils/wagmi"; -import initTagmanager from "./tagmanager"; const dataLayerConfig = new DataLayer({ search: { diff --git a/packages/builder/src/utils/test_utils.tsx b/packages/builder/src/utils/test_utils.tsx index 54ec28c22f..6fd33db74a 100644 --- a/packages/builder/src/utils/test_utils.tsx +++ b/packages/builder/src/utils/test_utils.tsx @@ -6,7 +6,6 @@ import { AlloProvider, AlloV2, createMockTransactionSender } from "common"; import { DataLayer, DataLayerProvider } from "data-layer"; import { ethers } from "ethers"; import { Provider } from "react-redux"; -import { zeroAddress } from "viem"; import history from "../history"; import setupStore from "../store"; import { FormInputs, Metadata, Round } from "../types"; @@ -117,7 +116,6 @@ const alloBackend = new AlloV2({ }), waitUntilIndexerSynced: async () => Promise.resolve(BigInt(1)), transactionSender: createMockTransactionSender(), - allo: zeroAddress, }); // todo: introduce mock data layer? diff --git a/packages/builder/tsconfig.json b/packages/builder/tsconfig.json index 5d36adfab3..3938073c39 100644 --- a/packages/builder/tsconfig.json +++ b/packages/builder/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es2020", + "target": "es5", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, diff --git a/packages/common/package.json b/packages/common/package.json index d3d0b2352d..d3ccb4d50c 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -16,7 +16,6 @@ "dependencies": { "@allo-team/allo-v2-sdk": "^1.0.38", "@ethersproject/providers": "^5.7.2", - "@ethersproject/abstract-signer": "^5.7.0", "@rainbow-me/rainbowkit": "^0.12.16", "@wagmi/chains": "^1.8.0", "abitype": "^0.10.3", diff --git a/packages/common/src/AlloWrapper.tsx b/packages/common/src/AlloWrapper.tsx deleted file mode 100644 index d2cb2bfc12..0000000000 --- a/packages/common/src/AlloWrapper.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { useEffect, useState } from "react"; -import { - Allo, - // AlloV2, - AlloProvider, - createPinataIpfsUploader, - waitForSubgraphSyncTo, - createEthersTransactionSender, - AlloV1, -} from "./"; -import { useNetwork, useProvider, useSigner } from "wagmi"; -import { getConfig } from "./config"; - -function AlloWrapper({ children }: { children: JSX.Element | JSX.Element[] }) { - const { chain } = useNetwork(); - const web3Provider = useProvider(); - const { data: signer } = useSigner(); - const chainID = chain?.id; - - const [backend, setBackend] = useState(null); - - useEffect(() => { - if (!web3Provider || !signer || !chainID) { - setBackend(null); - } else { - // const alloBackend: Allo = new AlloV2({ - // chainId: chainID, - // transactionSender: createEthersTransactionSender(signer, web3Provider), - // ipfsUploader: createPinataIpfsUploader({ - // token: getConfig().pinata.jwt, - // endpoint: `${getConfig().pinata.baseUrl}/pinning/pinFileToIPFS`, - // }), - // waitUntilIndexerSynced: waitForSubgraphSyncTo, - // }); - - const alloBackend: Allo = new AlloV1({ - chainId: chainID, - transactionSender: createEthersTransactionSender(signer, web3Provider), - ipfsUploader: createPinataIpfsUploader({ - token: getConfig().pinata.jwt, - endpoint: `${getConfig().pinata.baseUrl}/pinning/pinFileToIPFS`, - }), - waitUntilIndexerSynced: waitForSubgraphSyncTo, - }); - - setBackend(alloBackend); - } - }, [web3Provider, signer, chainID]); - - return {children}; -} - -export default AlloWrapper; diff --git a/packages/common/src/allo/abis/allo-v2/Allo.ts b/packages/common/src/allo/abis/allo-v2/Allo.ts deleted file mode 100644 index 9ad14d9891..0000000000 --- a/packages/common/src/allo/abis/allo-v2/Allo.ts +++ /dev/null @@ -1,1381 +0,0 @@ -export default [ - { - inputs: [], - name: "ALLOCATION_ACTIVE", - type: "error", - }, - { - inputs: [], - name: "ALLOCATION_NOT_ACTIVE", - type: "error", - }, - { - inputs: [], - name: "ALLOCATION_NOT_ENDED", - type: "error", - }, - { - inputs: [], - name: "ALREADY_INITIALIZED", - type: "error", - }, - { - inputs: [], - name: "AMOUNT_MISMATCH", - type: "error", - }, - { - inputs: [], - name: "ANCHOR_ERROR", - type: "error", - }, - { - inputs: [], - name: "ARRAY_MISMATCH", - type: "error", - }, - { - inputs: [], - name: "INVALID", - type: "error", - }, - { - inputs: [], - name: "INVALID_ADDRESS", - type: "error", - }, - { - inputs: [], - name: "INVALID_FEE", - type: "error", - }, - { - inputs: [], - name: "INVALID_METADATA", - type: "error", - }, - { - inputs: [], - name: "INVALID_REGISTRATION", - type: "error", - }, - { - inputs: [], - name: "IS_APPROVED_STRATEGY", - type: "error", - }, - { - inputs: [], - name: "MISMATCH", - type: "error", - }, - { - inputs: [], - name: "NONCE_NOT_AVAILABLE", - type: "error", - }, - { - inputs: [], - name: "NOT_APPROVED_STRATEGY", - type: "error", - }, - { - inputs: [], - name: "NOT_ENOUGH_FUNDS", - type: "error", - }, - { - inputs: [], - name: "NOT_IMPLEMENTED", - type: "error", - }, - { - inputs: [], - name: "NOT_INITIALIZED", - type: "error", - }, - { - inputs: [], - name: "NOT_PENDING_OWNER", - type: "error", - }, - { - inputs: [], - name: "NewOwnerIsZeroAddress", - type: "error", - }, - { - inputs: [], - name: "NoHandoverRequest", - type: "error", - }, - { - inputs: [], - name: "POOL_ACTIVE", - type: "error", - }, - { - inputs: [], - name: "POOL_INACTIVE", - type: "error", - }, - { - inputs: [], - name: "RECIPIENT_ALREADY_ACCEPTED", - type: "error", - }, - { - inputs: [ - { - internalType: "address", - name: "recipientId", - type: "address", - }, - ], - name: "RECIPIENT_ERROR", - type: "error", - }, - { - inputs: [], - name: "RECIPIENT_NOT_ACCEPTED", - type: "error", - }, - { - inputs: [], - name: "REGISTRATION_NOT_ACTIVE", - type: "error", - }, - { - inputs: [], - name: "UNAUTHORIZED", - type: "error", - }, - { - inputs: [], - name: "Unauthorized", - type: "error", - }, - { - inputs: [], - name: "ZERO_ADDRESS", - type: "error", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "uint256", - name: "poolId", - type: "uint256", - }, - { - indexed: false, - internalType: "uint256", - name: "amount", - type: "uint256", - }, - ], - name: "BaseFeePaid", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "uint256", - name: "baseFee", - type: "uint256", - }, - ], - name: "BaseFeeUpdated", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "uint8", - name: "version", - type: "uint8", - }, - ], - name: "Initialized", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "pendingOwner", - type: "address", - }, - ], - name: "OwnershipHandoverCanceled", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "pendingOwner", - type: "address", - }, - ], - name: "OwnershipHandoverRequested", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "oldOwner", - type: "address", - }, - { - indexed: true, - internalType: "address", - name: "newOwner", - type: "address", - }, - ], - name: "OwnershipTransferred", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "uint256", - name: "percentFee", - type: "uint256", - }, - ], - name: "PercentFeeUpdated", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "uint256", - name: "poolId", - type: "uint256", - }, - { - indexed: true, - internalType: "bytes32", - name: "profileId", - type: "bytes32", - }, - { - indexed: false, - internalType: "contract IStrategy", - name: "strategy", - type: "address", - }, - { - indexed: false, - internalType: "address", - name: "token", - type: "address", - }, - { - indexed: false, - internalType: "uint256", - name: "amount", - type: "uint256", - }, - { - components: [ - { - internalType: "uint256", - name: "protocol", - type: "uint256", - }, - { - internalType: "string", - name: "pointer", - type: "string", - }, - ], - indexed: false, - internalType: "struct Metadata", - name: "metadata", - type: "tuple", - }, - ], - name: "PoolCreated", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "uint256", - name: "poolId", - type: "uint256", - }, - { - indexed: false, - internalType: "uint256", - name: "amount", - type: "uint256", - }, - { - indexed: false, - internalType: "uint256", - name: "fee", - type: "uint256", - }, - ], - name: "PoolFunded", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "uint256", - name: "poolId", - type: "uint256", - }, - { - components: [ - { - internalType: "uint256", - name: "protocol", - type: "uint256", - }, - { - internalType: "string", - name: "pointer", - type: "string", - }, - ], - indexed: false, - internalType: "struct Metadata", - name: "metadata", - type: "tuple", - }, - ], - name: "PoolMetadataUpdated", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "address", - name: "registry", - type: "address", - }, - ], - name: "RegistryUpdated", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "bytes32", - name: "role", - type: "bytes32", - }, - { - indexed: true, - internalType: "bytes32", - name: "previousAdminRole", - type: "bytes32", - }, - { - indexed: true, - internalType: "bytes32", - name: "newAdminRole", - type: "bytes32", - }, - ], - name: "RoleAdminChanged", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "bytes32", - name: "role", - type: "bytes32", - }, - { - indexed: true, - internalType: "address", - name: "account", - type: "address", - }, - { - indexed: true, - internalType: "address", - name: "sender", - type: "address", - }, - ], - name: "RoleGranted", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "bytes32", - name: "role", - type: "bytes32", - }, - { - indexed: true, - internalType: "address", - name: "account", - type: "address", - }, - { - indexed: true, - internalType: "address", - name: "sender", - type: "address", - }, - ], - name: "RoleRevoked", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "address", - name: "strategy", - type: "address", - }, - ], - name: "StrategyApproved", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "address", - name: "strategy", - type: "address", - }, - ], - name: "StrategyRemoved", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "address", - name: "treasury", - type: "address", - }, - ], - name: "TreasuryUpdated", - type: "event", - }, - { - inputs: [], - name: "DEFAULT_ADMIN_ROLE", - outputs: [ - { - internalType: "bytes32", - name: "", - type: "bytes32", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "NATIVE", - outputs: [ - { - internalType: "address", - name: "", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "_poolId", - type: "uint256", - }, - { - internalType: "address", - name: "_manager", - type: "address", - }, - ], - name: "addPoolManager", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "_strategy", - type: "address", - }, - ], - name: "addToCloneableStrategies", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "_poolId", - type: "uint256", - }, - { - internalType: "bytes", - name: "_data", - type: "bytes", - }, - ], - name: "allocate", - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256[]", - name: "_poolIds", - type: "uint256[]", - }, - { - internalType: "bytes[]", - name: "_datas", - type: "bytes[]", - }, - ], - name: "batchAllocate", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256[]", - name: "_poolIds", - type: "uint256[]", - }, - { - internalType: "bytes[]", - name: "_data", - type: "bytes[]", - }, - ], - name: "batchRegisterRecipient", - outputs: [ - { - internalType: "address[]", - name: "recipientIds", - type: "address[]", - }, - ], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "cancelOwnershipHandover", - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "pendingOwner", - type: "address", - }, - ], - name: "completeOwnershipHandover", - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - internalType: "bytes32", - name: "_profileId", - type: "bytes32", - }, - { - internalType: "address", - name: "_strategy", - type: "address", - }, - { - internalType: "bytes", - name: "_initStrategyData", - type: "bytes", - }, - { - internalType: "address", - name: "_token", - type: "address", - }, - { - internalType: "uint256", - name: "_amount", - type: "uint256", - }, - { - components: [ - { - internalType: "uint256", - name: "protocol", - type: "uint256", - }, - { - internalType: "string", - name: "pointer", - type: "string", - }, - ], - internalType: "struct Metadata", - name: "_metadata", - type: "tuple", - }, - { - internalType: "address[]", - name: "_managers", - type: "address[]", - }, - ], - name: "createPool", - outputs: [ - { - internalType: "uint256", - name: "poolId", - type: "uint256", - }, - ], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - internalType: "bytes32", - name: "_profileId", - type: "bytes32", - }, - { - internalType: "address", - name: "_strategy", - type: "address", - }, - { - internalType: "bytes", - name: "_initStrategyData", - type: "bytes", - }, - { - internalType: "address", - name: "_token", - type: "address", - }, - { - internalType: "uint256", - name: "_amount", - type: "uint256", - }, - { - components: [ - { - internalType: "uint256", - name: "protocol", - type: "uint256", - }, - { - internalType: "string", - name: "pointer", - type: "string", - }, - ], - internalType: "struct Metadata", - name: "_metadata", - type: "tuple", - }, - { - internalType: "address[]", - name: "_managers", - type: "address[]", - }, - ], - name: "createPoolWithCustomStrategy", - outputs: [ - { - internalType: "uint256", - name: "poolId", - type: "uint256", - }, - ], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "_poolId", - type: "uint256", - }, - { - internalType: "address[]", - name: "_recipientIds", - type: "address[]", - }, - { - internalType: "bytes", - name: "_data", - type: "bytes", - }, - ], - name: "distribute", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "_poolId", - type: "uint256", - }, - { - internalType: "uint256", - name: "_amount", - type: "uint256", - }, - ], - name: "fundPool", - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [], - name: "getBaseFee", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "getFeeDenominator", - outputs: [ - { - internalType: "uint256", - name: "FEE_DENOMINATOR", - type: "uint256", - }, - ], - stateMutability: "pure", - type: "function", - }, - { - inputs: [], - name: "getPercentFee", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "_poolId", - type: "uint256", - }, - ], - name: "getPool", - outputs: [ - { - components: [ - { - internalType: "bytes32", - name: "profileId", - type: "bytes32", - }, - { - internalType: "contract IStrategy", - name: "strategy", - type: "address", - }, - { - internalType: "address", - name: "token", - type: "address", - }, - { - components: [ - { - internalType: "uint256", - name: "protocol", - type: "uint256", - }, - { - internalType: "string", - name: "pointer", - type: "string", - }, - ], - internalType: "struct Metadata", - name: "metadata", - type: "tuple", - }, - { - internalType: "bytes32", - name: "managerRole", - type: "bytes32", - }, - { - internalType: "bytes32", - name: "adminRole", - type: "bytes32", - }, - ], - internalType: "struct IAllo.Pool", - name: "", - type: "tuple", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "getRegistry", - outputs: [ - { - internalType: "contract IRegistry", - name: "", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "bytes32", - name: "role", - type: "bytes32", - }, - ], - name: "getRoleAdmin", - outputs: [ - { - internalType: "bytes32", - name: "", - type: "bytes32", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "_poolId", - type: "uint256", - }, - ], - name: "getStrategy", - outputs: [ - { - internalType: "address", - name: "", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "getTreasury", - outputs: [ - { - internalType: "address payable", - name: "", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "bytes32", - name: "role", - type: "bytes32", - }, - { - internalType: "address", - name: "account", - type: "address", - }, - ], - name: "grantRole", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "bytes32", - name: "role", - type: "bytes32", - }, - { - internalType: "address", - name: "account", - type: "address", - }, - ], - name: "hasRole", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "_owner", - type: "address", - }, - { - internalType: "address", - name: "_registry", - type: "address", - }, - { - internalType: "address payable", - name: "_treasury", - type: "address", - }, - { - internalType: "uint256", - name: "_percentFee", - type: "uint256", - }, - { - internalType: "uint256", - name: "_baseFee", - type: "uint256", - }, - ], - name: "initialize", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "_strategy", - type: "address", - }, - ], - name: "isCloneableStrategy", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "_poolId", - type: "uint256", - }, - { - internalType: "address", - name: "_address", - type: "address", - }, - ], - name: "isPoolAdmin", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "_poolId", - type: "uint256", - }, - { - internalType: "address", - name: "_address", - type: "address", - }, - ], - name: "isPoolManager", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "owner", - outputs: [ - { - internalType: "address", - name: "result", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "pendingOwner", - type: "address", - }, - ], - name: "ownershipHandoverExpiresAt", - outputs: [ - { - internalType: "uint256", - name: "result", - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "_token", - type: "address", - }, - { - internalType: "address", - name: "_recipient", - type: "address", - }, - ], - name: "recoverFunds", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "_poolId", - type: "uint256", - }, - { - internalType: "bytes", - name: "_data", - type: "bytes", - }, - ], - name: "registerRecipient", - outputs: [ - { - internalType: "address", - name: "", - type: "address", - }, - ], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "_strategy", - type: "address", - }, - ], - name: "removeFromCloneableStrategies", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "_poolId", - type: "uint256", - }, - { - internalType: "address", - name: "_manager", - type: "address", - }, - ], - name: "removePoolManager", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "renounceOwnership", - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - internalType: "bytes32", - name: "role", - type: "bytes32", - }, - { - internalType: "address", - name: "account", - type: "address", - }, - ], - name: "renounceRole", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "requestOwnershipHandover", - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - internalType: "bytes32", - name: "role", - type: "bytes32", - }, - { - internalType: "address", - name: "account", - type: "address", - }, - ], - name: "revokeRole", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "bytes4", - name: "interfaceId", - type: "bytes4", - }, - ], - name: "supportsInterface", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "newOwner", - type: "address", - }, - ], - name: "transferOwnership", - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "_baseFee", - type: "uint256", - }, - ], - name: "updateBaseFee", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "_percentFee", - type: "uint256", - }, - ], - name: "updatePercentFee", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "_poolId", - type: "uint256", - }, - { - components: [ - { - internalType: "uint256", - name: "protocol", - type: "uint256", - }, - { - internalType: "string", - name: "pointer", - type: "string", - }, - ], - internalType: "struct Metadata", - name: "_metadata", - type: "tuple", - }, - ], - name: "updatePoolMetadata", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "_registry", - type: "address", - }, - ], - name: "updateRegistry", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "address payable", - name: "_treasury", - type: "address", - }, - ], - name: "updateTreasury", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, -] as const; diff --git a/packages/common/src/allo/addresses/allo-v1.ts b/packages/common/src/allo/addresses/allo-v1.ts deleted file mode 100644 index 1aa41229e4..0000000000 --- a/packages/common/src/allo/addresses/allo-v1.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { ChainId } from "../../chain-ids"; -import { Address } from "viem"; - -/** - * This file contains all contract definitions for Allo v1 - */ -type ChainIdToStringMap = Record; - -export const projectRegistryMap: ChainIdToStringMap = { - [ChainId.DEV1]: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - [ChainId.DEV2]: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - [ChainId.MAINNET]: "0x03506eD3f57892C85DB20C36846e9c808aFe9ef4", - [ChainId.OPTIMISM_MAINNET_CHAIN_ID]: - "0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174", - [ChainId.FANTOM_MAINNET_CHAIN_ID]: - "0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174", - [ChainId.FANTOM_TESTNET_CHAIN_ID]: - "0x984749e408FF0446d8ADaf20E293F2F299396631", - [ChainId.PGN_TESTNET]: "0x6294bed5B884Ae18bf737793Ef9415069Bf4bc11", - [ChainId.PGN]: "0xDF9BF58Aa1A1B73F0e214d79C652a7dd37a6074e", - [ChainId.ARBITRUM]: "0x73AB205af1476Dc22104A6B8b3d4c273B58C6E27", - [ChainId.ARBITRUM_GOERLI]: "0x0CD135777dEaB6D0Bb150bDB0592aC9Baa4d0871", - [ChainId.FUJI]: "0x8918401DD47f1645fF1111D8E513c0404b84d5bB", - [ChainId.AVALANCHE]: "0xDF9BF58Aa1A1B73F0e214d79C652a7dd37a6074e", - [ChainId.POLYGON]: "0x5C5E2D94b107C7691B08E43169fDe76EAAB6D48b", - [ChainId.POLYGON_MUMBAI]: "0x545B282A50EaeA01A619914d44105437036CbB36", - [ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID]: - "0xe6CCEe93c97E20644431647B306F48e278aFFdb9", - [ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID]: - "0xb0F4882184EB6e3ed120c5181651D50719329788", - [ChainId.BASE]: "0xA78Daa89fE9C1eC66c5cB1c5833bC8C6Cb307918", -}; - -export const programFactoryMap: ChainIdToStringMap = { - [ChainId.DEV1]: "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", - [ChainId.DEV2]: "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", - [ChainId.MAINNET]: "0x56296242CA408bA36393f3981879fF9692F193cC", - [ChainId.OPTIMISM_MAINNET_CHAIN_ID]: - "0xd5Fb00093Ebd30011d932cB69bb6313c550aB05f", - [ChainId.FANTOM_MAINNET_CHAIN_ID]: - "0x4d1f64c7920262c8F78e989C9E7Bf48b7eC02Eb5", - [ChainId.FANTOM_TESTNET_CHAIN_ID]: - "0x424C5C175fbd46CA0b27866044A5B956c6AbEe0D", - [ChainId.PGN_TESTNET]: "0x2Ff06F96Bb265698e47BfdED83f1aa0aC7c3a4Ce", - [ChainId.PGN]: "0xd07D54b0231088Ca9BF7DA6291c911B885cBC140", - [ChainId.ARBITRUM]: "0xDF9BF58Aa1A1B73F0e214d79C652a7dd37a6074e", - [ChainId.ARBITRUM_GOERLI]: "0xd39b40aC9279EeeB86FBbDeb2C9acDF16e16cF89", - [ChainId.FUJI]: "0x862D7F621409cF572f179367DdF1B7144AcE1c76", - [ChainId.AVALANCHE]: "0xd07D54b0231088Ca9BF7DA6291c911B885cBC140", - [ChainId.POLYGON]: "0xF7c101A95Ea4cBD5DA0Ab9827D7B2C9857440143", - [ChainId.POLYGON_MUMBAI]: "0xDF9BF58Aa1A1B73F0e214d79C652a7dd37a6074e", - [ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID]: - "0x68a14AF71BFa0FE09fC937033f6Ea5153c0e75e4", - [ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID]: - "0x6D341814Be4E2316142D9190E390b494F1dECFAf", - [ChainId.BASE]: "0xDF9BF58Aa1A1B73F0e214d79C652a7dd37a6074e", -}; - -export const roundFactoryMap: ChainIdToStringMap = { - [ChainId.DEV1]: "0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f", - [ChainId.DEV2]: "0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f", - [ChainId.MAINNET]: "0x9Cb7f434aD3250d1656854A9eC7A71EceC6eE1EF", - [ChainId.OPTIMISM_MAINNET_CHAIN_ID]: - "0x04E753cFB8c8D1D7f776f7d7A033740961b6AEC2", - [ChainId.FANTOM_MAINNET_CHAIN_ID]: - "0xfb08d1fD3a7c693677eB096E722ABf4Ae63B0B95", - [ChainId.FANTOM_TESTNET_CHAIN_ID]: - "0x8AdFcF226dfb2fA73788Ad711C958Ba251369cb3", - [ChainId.PGN_TESTNET]: "0x0479b9DA9f287539FEBd597350B1eBaEBF7479ac", - [ChainId.PGN]: "0x8AdFcF226dfb2fA73788Ad711C958Ba251369cb3", - [ChainId.ARBITRUM_GOERLI]: "0xdf25423c9ec15347197Aa5D3a41c2ebE27587D59", - [ChainId.ARBITRUM]: "0xF2a07728107B04266015E67b1468cA0a536956C8", - [ChainId.FUJI]: "0x3615d870d5B760cea43693ABED70Cd8A9b59b3d8", - [ChainId.AVALANCHE]: "0x8eC471f30cA797FD52F9D37A47Be2517a7BD6912", - [ChainId.POLYGON]: "0x5ab68dCdcA37A1C2b09c5218e28eB0d9cc3FEb03", - [ChainId.POLYGON_MUMBAI]: "0xE1c5812e9831bc1d5BDcF50AAEc1a47C4508F3fA", - [ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID]: - "0xF3B5a0d59C6292BD0e4f8Cf735EEF52b98f428E6", - [ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID]: - "0x0Bb6e2dfEaef0Db5809B3979717E99e053Cbae72", - [ChainId.BASE]: "0xc7722909fEBf7880E15e67d563E2736D9Bb9c1Ab", -}; - -export const qfVotingStrategyFactoryMap: ChainIdToStringMap = { - [ChainId.DEV1]: "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e", - [ChainId.DEV2]: "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e", - [ChainId.MAINNET]: "0x4a850F463D1C4842937c5Bc9540dBc803D744c9F", - [ChainId.OPTIMISM_MAINNET_CHAIN_ID]: - "0x838C5e10dcc1e54d62761d994722367BA167AC22", - [ChainId.FANTOM_MAINNET_CHAIN_ID]: - "0x534d2AAc03dCd0Cb3905B591BAf04C14A95426AB", - [ChainId.FANTOM_TESTNET_CHAIN_ID]: - "0x545B282A50EaeA01A619914d44105437036CbB36", - [ChainId.PGN_TESTNET]: "0xE8027a807Bb85e57da4B7A5ecE65b0aBDf231ce8", - [ChainId.PGN]: "0x2AFA4bE0f2468347A2F086c2167630fb1E58b725", - [ChainId.ARBITRUM_GOERLI]: "0x0BFA0AAF5f2D81f859e85C8E82A3fc5b624fc6E8", - [ChainId.ARBITRUM]: "0xC3A195EEa198e74D67671732E1B8F8A23781D735", - [ChainId.FUJI]: "0xd39b40aC9279EeeB86FBbDeb2C9acDF16e16cF89", - [ChainId.AVALANCHE]: "0x2AFA4bE0f2468347A2F086c2167630fb1E58b725", - [ChainId.POLYGON]: "0xc1a26b0789C3E93b07713e90596Cad8d0442C826", - [ChainId.POLYGON_MUMBAI]: "0xF7c101A95Ea4cBD5DA0Ab9827D7B2C9857440143", - [ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID]: - "0x94cB638556d3991363102431d8cE9e839C734677", - [ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID]: - "0x8c28F21D2d8C53eedC58bF9cdCfb7DCF7d809d97", - [ChainId.BASE]: "0xC3A195EEa198e74D67671732E1B8F8A23781D735", -}; - -export const dgVotingStrategyDummyContractMap: ChainIdToStringMap = { - [ChainId.DEV1]: "0x", - [ChainId.DEV2]: "0x", - [ChainId.MAINNET]: "0xDF9BF58Aa1A1B73F0e214d79C652a7dd37a6074e", - [ChainId.OPTIMISM_MAINNET_CHAIN_ID]: - "0xB9fd0d433d2ca03D26A182Dc709bA1EccA3B00cC", - [ChainId.FANTOM_MAINNET_CHAIN_ID]: - "0xB91749077A0dE932a4AE2b882d846ef9C53b9505", - [ChainId.FANTOM_TESTNET_CHAIN_ID]: - "0xc7722909fEBf7880E15e67d563E2736D9Bb9c1Ab", - [ChainId.PGN_TESTNET]: "0xDF9BF58Aa1A1B73F0e214d79C652a7dd37a6074e", - [ChainId.PGN]: "0xcE7c30DbcEC2a98B516E4C64fA4E3256AB813b10", - [ChainId.ARBITRUM_GOERLI]: "0x809E751e5C5bB1446e9ab2Ac37c687a35DE53BC6", - [ChainId.ARBITRUM]: "0x5ab68dCdcA37A1C2b09c5218e28eB0d9cc3FEb03", - [ChainId.FUJI]: "0xCd3618509983FE4990D7770CF6f02c7145dC365F", - [ChainId.AVALANCHE]: "0xA78Daa89fE9C1eC66c5cB1c5833bC8C6Cb307918", - [ChainId.POLYGON]: "0x8142cAa6dED9F63434B1ED862d53E06332874570", - [ChainId.POLYGON_MUMBAI]: "0xA78Daa89fE9C1eC66c5cB1c5833bC8C6Cb307918", - [ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID]: - "0x787D662D19C9528EB33FdaBb3cBEcBeAb2a7F15a", - [ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID]: - "0x0c0B71BA1427cb46424d38133E8187365Cc5466b", - [ChainId.BASE]: "0x73AB205af1476Dc22104A6B8b3d4c273B58C6E27", -}; - -export const merklePayoutStrategyFactoryMap: ChainIdToStringMap = { - [ChainId.DEV1]: "0x0B306BF915C4d645ff596e518fAf3F9669b97016", - [ChainId.DEV2]: "0x0B306BF915C4d645ff596e518fAf3F9669b97016", - [ChainId.MAINNET]: "0x8F8d78f119Aa722453d33d6881f4D400D67D054F", - [ChainId.OPTIMISM_MAINNET_CHAIN_ID]: - "0xB5365543cdDa2C795AD104F4cB784EF3DB1CD383", - [ChainId.FANTOM_MAINNET_CHAIN_ID]: - "0xFA1D9FF7F885757fc20Fdd9D78B72F88B00Cff77", - [ChainId.FANTOM_TESTNET_CHAIN_ID]: - "0x5b55728e41154562ee80027C1247B13382692e5C", - [ChainId.PGN_TESTNET]: "0xE42D1Da8d75Cf1d6f6C460DAa3f1b10a79D689B1", - [ChainId.PGN]: "0x27efa1C90e097c980c669AB1a6e326AD4164f1Cb", - [ChainId.ARBITRUM_GOERLI]: "0x8F8d78f119Aa722453d33d6881f4D400D67D054F", - [ChainId.ARBITRUM]: "0x04b194b14532070F5cc8D3A760c9a0957D85ad5B", - [ChainId.FUJI]: "0x8F8d78f119Aa722453d33d6881f4D400D67D054F", - [ChainId.AVALANCHE]: "0x27efa1C90e097c980c669AB1a6e326AD4164f1Cb", - [ChainId.POLYGON]: "0xD0e19DBF9b896199F35Df255A1bf8dB3C787531c", - [ChainId.POLYGON_MUMBAI]: "0xc1a26b0789C3E93b07713e90596Cad8d0442C826", - [ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID]: - "0x41A8F19C6CB88C9Cc98d29Cb7A4015629910fFc0", - [ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID]: - "0xbA160C13F8F626e3232078aDFD6eD2f2B2289563", - [ChainId.BASE]: "0xF7c101A95Ea4cBD5DA0Ab9827D7B2C9857440143", -}; - -export const directPayoutStrategyFactoryContractMap: ChainIdToStringMap = { - [ChainId.DEV1]: "0x", - [ChainId.DEV2]: "0x", - [ChainId.MAINNET]: "0xd07D54b0231088Ca9BF7DA6291c911B885cBC140", - [ChainId.OPTIMISM_MAINNET_CHAIN_ID]: - "0x2Bb670C3ffC763b691062d671b386E51Cf1840f0", - [ChainId.FANTOM_MAINNET_CHAIN_ID]: - "0x9B1Ee60B539a3761E328a621A3d980EE9385679a", - [ChainId.FANTOM_TESTNET_CHAIN_ID]: - "0x8eC471f30cA797FD52F9D37A47Be2517a7BD6912", - [ChainId.PGN_TESTNET]: "0x3D77E65aEA55C0e07Cb018aB4Dc22D38cAD75921", - [ChainId.PGN]: "0x0c33c9dEF7A3d9961b802C6C6402d306b7D48135", - [ChainId.ARBITRUM_GOERLI]: "0xCd3618509983FE4990D7770CF6f02c7145dC365F", - [ChainId.ARBITRUM]: "0xc1a26b0789C3E93b07713e90596Cad8d0442C826", - [ChainId.FUJI]: "0x0F98547e09D41e3c82086fC5Eb0E42Ab786aA763", - [ChainId.AVALANCHE]: "0x8AdFcF226dfb2fA73788Ad711C958Ba251369cb3", - [ChainId.POLYGON]: "0xF2a07728107B04266015E67b1468cA0a536956C8", - [ChainId.POLYGON_MUMBAI]: "0xD9B7Ce1F68A93dF783A8519ed52b74f5DcF5AFE1", - [ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID]: - "0x0ccdfCB7e5DB60AAE5667d1680B490F7830c49C8", - [ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID]: - "0x4170665B31bC10009f8a69CeaACf3265C3d66797", - [ChainId.BASE]: "0x74c3665540FC8B92Dd06a7e56a51eCa038C18180", -}; diff --git a/packages/common/src/allo/allo.ts b/packages/common/src/allo/allo.ts index 2da0e1793b..5d815b9d09 100644 --- a/packages/common/src/allo/allo.ts +++ b/packages/common/src/allo/allo.ts @@ -1,27 +1,8 @@ -import { Address, Hex } from "viem"; +import { Hex } from "viem"; import { AnyJson } from ".."; import { Result } from "./common"; import { AlloOperation } from "./operation"; import { TransactionReceipt } from "./transaction-sender"; -import { CreateRoundData, RoundCategory } from "../types"; -import { Round } from "data-layer"; -import { Signer } from "@ethersproject/abstract-signer"; - -export type CreateRoundArguments = { - roundData: { - roundCategory: RoundCategory; - roundMetadataWithProgramContractAddress: Round["roundMetadata"]; - applicationQuestions: CreateRoundData["applicationQuestions"]; - roundStartTime: Date; - roundEndTime: Date; - applicationsStartTime: Date; - applicationsEndTime: Date; - token: string; - matchingFundsAvailable: number; - roundOperators: Address[]; - }; - walletSigner: Signer; -}; /** * Represents the common interface for interacting with Allo contracts. @@ -50,16 +31,6 @@ export interface Allo { transactionStatus: Result; } >; - - createRound: (args: CreateRoundArguments) => AlloOperation< - Result<{ roundId: Hex }>, - { - ipfsStatus: Result; - transaction: Result; - transactionStatus: Result; - indexingStatus: Result; - } - >; } export { AlloOperation }; diff --git a/packages/common/src/allo/backends/allo-v1.test.ts b/packages/common/src/allo/backends/allo-v1.test.ts index 307c79a038..b27eadb9fe 100644 --- a/packages/common/src/allo/backends/allo-v1.test.ts +++ b/packages/common/src/allo/backends/allo-v1.test.ts @@ -1,9 +1,9 @@ -import { beforeEach, describe, expect, test, vi } from "vitest"; +import { describe, test, expect, vi, beforeEach } from "vitest"; import { AlloV1 } from "./allo-v1"; -import { encodeEventTopics, Hex, zeroAddress } from "viem"; +import { zeroAddress, Hex, encodeEventTopics } from "viem"; import { - createMockTransactionSender, TransactionReceipt, + createMockTransactionSender, } from "../transaction-sender"; import { Result, success } from "../common"; import ProjectRegistry from "../abis/allo-v1/ProjectRegistry"; @@ -12,6 +12,7 @@ const zeroTxHash = ("0x" + "0".repeat(64)) as Hex; const ipfsUploader = vi.fn().mockResolvedValue(success("ipfsHash")); const waitUntilIndexerSynced = vi.fn().mockResolvedValue(success(null)); const transactionSender = createMockTransactionSender(); +const projectRegistryAddress = zeroAddress; const chainId = 1; describe("AlloV1", () => { @@ -19,6 +20,7 @@ describe("AlloV1", () => { beforeEach(() => { allo = new AlloV1({ chainId, + projectRegistryAddress, ipfsUploader, transactionSender, waitUntilIndexerSynced, @@ -65,12 +67,15 @@ describe("AlloV1", () => { expect(result).toEqual( success({ projectId: - "0xa0affa31521afe084aee15c3ff5570c600b014cae2a9c45a9cc1e50b0c9852e5", + "0xd0c4b8bf41dcf0607cd6c6d5f7c6423344ce99ddaaa72c31a7d8fb332a218878", }) ); expect(transactionSender.sentTransactions).toHaveLength(1); expect(ipfsResult!).toEqual(success("ipfsHash")); expect(txResult!).toEqual(success(zeroTxHash)); + expect(transactionSender.sentTransactions[0].to).toEqual( + projectRegistryAddress + ); expect(txStatusResult!).toBeTruthy(); }); }); diff --git a/packages/common/src/allo/backends/allo-v1.ts b/packages/common/src/allo/backends/allo-v1.ts index 57f2f09131..591664ecdc 100644 --- a/packages/common/src/allo/backends/allo-v1.ts +++ b/packages/common/src/allo/backends/allo-v1.ts @@ -1,40 +1,16 @@ -import { - Address, - encodeAbiParameters, - encodePacked, - getAddress, - Hex, - hexToBigInt, - keccak256, - maxUint256, - parseAbiParameters, - parseUnits, - zeroAddress, -} from "viem"; -import { Allo, AlloError, AlloOperation, CreateRoundArguments } from "../allo"; -import { error, Result, success } from "../common"; +import { Address, Hex, encodePacked, hexToBigInt, keccak256 } from "viem"; +import { AnyJson } from "../.."; +import ProjectRegistryABI from "../abis/allo-v1/ProjectRegistry"; +import { Allo, AlloError, AlloOperation } from "../allo"; +import { Result, error, success } from "../common"; import { WaitUntilIndexerSynced } from "../indexer"; import { IpfsUploader } from "../ipfs"; import { - decodeEventFromReceipt, - sendTransaction, TransactionReceipt, TransactionSender, + decodeEventFromReceipt, + sendTransaction, } from "../transaction-sender"; -import ProjectRegistryABI from "../abis/allo-v1/ProjectRegistry"; -import RoundFactoryABI from "../abis/allo-v1/RoundFactory"; -import { AnyJson, ChainId } from "../.."; -import { RoundCategory } from "../../types"; -import { parseChainId } from "../../chains"; -import { - dgVotingStrategyDummyContractMap, - directPayoutStrategyFactoryContractMap, - merklePayoutStrategyFactoryMap, - projectRegistryMap, - qfVotingStrategyFactoryMap, - roundFactoryMap, -} from "../addresses/allo-v1"; -import { payoutTokens } from "../../payoutTokens"; function createProjectId(args: { chainId: number; @@ -50,23 +26,22 @@ function createProjectId(args: { } export class AlloV1 implements Allo { - private readonly projectRegistryAddress: Address; - private readonly roundFactoryAddress: Address; - private readonly transactionSender: TransactionSender; - private readonly ipfsUploader: IpfsUploader; - private readonly waitUntilIndexerSynced: WaitUntilIndexerSynced; - private readonly chainId: ChainId; + private projectRegistryAddress: Address; + private transactionSender: TransactionSender; + private ipfsUploader: IpfsUploader; + private waitUntilIndexerSynced: WaitUntilIndexerSynced; + private chainId: number; constructor(args: { chainId: number; transactionSender: TransactionSender; + projectRegistryAddress: Address; ipfsUploader: IpfsUploader; waitUntilIndexerSynced: WaitUntilIndexerSynced; }) { - this.chainId = parseChainId(args.chainId); + this.chainId = args.chainId; this.transactionSender = args.transactionSender; - this.projectRegistryAddress = projectRegistryMap[this.chainId]; - this.roundFactoryAddress = roundFactoryMap[this.chainId]; + this.projectRegistryAddress = args.projectRegistryAddress; this.ipfsUploader = args.ipfsUploader; this.waitUntilIndexerSynced = args.waitUntilIndexerSynced; } @@ -94,7 +69,7 @@ export class AlloV1 implements Allo { address: this.projectRegistryAddress, abi: ProjectRegistryABI, functionName: "createProject", - args: [{ protocol: BigInt(1), pointer: ipfsResult.value }], + args: [{ protocol: 1n, pointer: ipfsResult.value }], }); emit("transaction", txResult); @@ -167,10 +142,7 @@ export class AlloV1 implements Allo { address: this.projectRegistryAddress, abi: ProjectRegistryABI, functionName: "updateProjectMetadata", - args: [ - projectIndex, - { protocol: BigInt(1), pointer: ipfsResult.value }, - ], + args: [projectIndex, { protocol: 1n, pointer: ipfsResult.value }], }); emit("transaction", txResult); @@ -202,229 +174,4 @@ export class AlloV1 implements Allo { }); }); } - - /** Creates a round on Allo v1*/ - createRound(args: CreateRoundArguments): AlloOperation< - Result<{ roundId: Hex }>, - { - ipfsStatus: Result; - transaction: Result; - transactionStatus: Result; - indexingStatus: Result; - } - > { - return new AlloOperation(async ({ emit }) => { - try { - const isQF = - args.roundData?.roundCategory === RoundCategory.QuadraticFunding; - - const votingStrategyFactory = isQF - ? qfVotingStrategyFactoryMap[this.chainId] - : dgVotingStrategyDummyContractMap[this.chainId]; - const payoutStrategyFactory = isQF - ? merklePayoutStrategyFactoryMap[this.chainId] - : directPayoutStrategyFactoryContractMap[this.chainId]; - - // --- upload metadata to IPFS - const [roundIpfsResult, applicationMetadataIpfsResult] = - await Promise.all([ - this.ipfsUploader( - args.roundData.roundMetadataWithProgramContractAddress - ), - this.ipfsUploader(args.roundData.applicationQuestions), - ]); - - emit( - "ipfsStatus", - [roundIpfsResult, applicationMetadataIpfsResult].every( - (status) => status.type === "success" - ) - ? success("") - : error(new Error("ipfs error")) - ); - - if (roundIpfsResult.type === "error") { - return roundIpfsResult; - } - - if (applicationMetadataIpfsResult.type === "error") { - return applicationMetadataIpfsResult; - } - - let initRoundTimes: bigint[]; - let admins: Address[]; - admins = [getAddress(await args.walletSigner.getAddress())]; - if (isQF) { - if (args.roundData.applicationsEndTime === undefined) { - args.roundData.applicationsEndTime = args.roundData.roundStartTime; - } - - initRoundTimes = [ - dateToEthereumTimestamp(args.roundData.applicationsStartTime), - dateToEthereumTimestamp(args.roundData.applicationsEndTime), - dateToEthereumTimestamp(args.roundData.roundStartTime), - dateToEthereumTimestamp(args.roundData.roundEndTime), - ]; - } else { - // note: DirectRounds does not set application dates. - // in those cases, we set: - // application start time with the round start time - // application end time with MaxUint256. - // if the round has not end time, we set it with MaxUint256. - - initRoundTimes = [ - dateToEthereumTimestamp( - args.roundData.applicationsStartTime ?? - args.roundData.roundStartTime - ), - args.roundData.applicationsEndTime - ? dateToEthereumTimestamp(args.roundData.applicationsEndTime) - : args.roundData.roundEndTime - ? dateToEthereumTimestamp(args.roundData.roundEndTime) - : maxUint256, - dateToEthereumTimestamp(args.roundData.roundStartTime), - args.roundData.roundEndTime - ? dateToEthereumTimestamp(args.roundData.roundEndTime) - : maxUint256, - ]; - } - - let parsedTokenAmount = 0n; - - if (isQF) { - // Ensure tokenAmount is normalized to token decimals - const tokenAmount = args.roundData.matchingFundsAvailable ?? 0; - const pyToken = payoutTokens.filter( - (t) => - t.address.toLowerCase() === args.roundData.token.toLowerCase() - )[0]; - parsedTokenAmount = parseUnits( - tokenAmount.toString(), - pyToken.decimal - ); - } - - const createRoundArguments = constructCreateRoundArgs({ - initTimes: initRoundTimes, - matchingAmount: parsedTokenAmount, - roundOperators: args.roundData.roundOperators ?? [], - roundAdmins: admins ?? [], - roundToken: getAddress(args.roundData.token ?? zeroAddress), - payoutStrategyFactory, - votingStrategyFactory, - roundMetadata: { - protocol: BigInt(1), - pointer: roundIpfsResult.value, - }, - applicationMetadata: { - protocol: BigInt(1), - pointer: applicationMetadataIpfsResult.value, - }, - }); - - // --- send transaction to create round - const txResult = await sendTransaction(this.transactionSender, { - address: this.roundFactoryAddress, - abi: RoundFactoryABI, - functionName: "create", - args: [ - createRoundArguments, - args.roundData.roundMetadataWithProgramContractAddress - ?.programContractAddress as Address, - ], - }); - - emit("transaction", txResult); - - if (txResult.type === "error") { - return txResult; - } - - // --- wait for transaction to be mined - let receipt: TransactionReceipt; - - try { - receipt = await this.transactionSender.wait(txResult.value); - - emit("transactionStatus", success(receipt)); - } catch (err) { - const result = new AlloError("Failed to create round"); - emit("transactionStatus", error(result)); - return error(result); - } - - await this.waitUntilIndexerSynced({ - chainId: this.chainId, - blockNumber: receipt.blockNumber, - }); - - emit("indexingStatus", success(void 0)); - - const roundCreatedEvent = decodeEventFromReceipt({ - abi: RoundFactoryABI, - receipt, - event: "RoundCreated", - }); - - return success({ - roundId: roundCreatedEvent.roundAddress, - }); - } catch (e) { - alert(e); - return error(e as Error); - } - }); - } } - -export type CreateRoundArgs = { - roundMetadata: { protocol: bigint; pointer: string }; - applicationMetadata: { protocol: bigint; pointer: string }; - votingStrategyFactory: `0x${string}`; - payoutStrategyFactory: `0x${string}`; - roundOperators: Address[]; - roundAdmins: Address[]; - roundToken: Address; - initTimes: bigint[]; - matchingAmount: bigint; -}; - -function constructCreateRoundArgs({ - initTimes, - matchingAmount, - roundAdmins, - roundOperators, - votingStrategyFactory, - payoutStrategyFactory, - roundToken, - roundMetadata, - applicationMetadata, -}: CreateRoundArgs) { - let abiType = parseAbiParameters([ - "(address votingStrategy, address payoutStrategy),(uint256 applicationsStartTime, uint256 applicationsEndTime, uint256 roundStartTime, uint256 roundEndTime),uint256,address,uint8,address,((uint256 protocol, string pointer), (uint256 protocol, string pointer)),(address[] adminRoles, address[] roundOperators)", - ]); - return encodeAbiParameters(abiType, [ - { - votingStrategy: votingStrategyFactory, - payoutStrategy: payoutStrategyFactory, - }, - { - applicationsStartTime: initTimes[0], - applicationsEndTime: initTimes[1], - roundStartTime: initTimes[2], - roundEndTime: initTimes[3], - }, - matchingAmount, - getAddress(roundToken ?? zeroAddress), - 0, - zeroAddress, - [roundMetadata, applicationMetadata], - { - roundOperators, - adminRoles: roundAdmins, - }, - ]); -} - -const dateToEthereumTimestamp = (date: Date) => - BigInt(Math.floor(date.getTime() / 1000)); diff --git a/packages/common/src/allo/backends/allo-v2.test.ts b/packages/common/src/allo/backends/allo-v2.test.ts index f936362c67..0122424bdb 100644 --- a/packages/common/src/allo/backends/allo-v2.test.ts +++ b/packages/common/src/allo/backends/allo-v2.test.ts @@ -12,8 +12,8 @@ const zeroTxHash = ("0x" + "0".repeat(64)) as Hex; const ipfsUploader = vi.fn().mockResolvedValue(success("ipfsHash")); const waitUntilIndexerSynced = vi.fn().mockResolvedValue(success(null)); const transactionSender = createMockTransactionSender(); +const projectRegistryAddress = zeroAddress; const chainId = 1; -const alloContractAddress = zeroAddress; const alloV2RegistryAddress = "0x4AAcca72145e1dF2aeC137E1f3C5E3D75DB8b5f3"; @@ -30,7 +30,6 @@ describe("AlloV2", () => { beforeEach(() => { allo = new AlloV2({ chainId, - allo: alloV2RegistryAddress, ipfsUploader, transactionSender, waitUntilIndexerSynced, diff --git a/packages/common/src/allo/backends/allo-v2.ts b/packages/common/src/allo/backends/allo-v2.ts index 47a047894e..3bfd8139f5 100644 --- a/packages/common/src/allo/backends/allo-v2.ts +++ b/packages/common/src/allo/backends/allo-v2.ts @@ -1,20 +1,21 @@ -import { Address, Hex } from "viem"; -import { Allo, AlloError, AlloOperation, CreateRoundArguments } from "../allo"; -import { error, Result, success } from "../common"; +import { Hex } from "viem"; +import RegistryABI from "../abis/allo-v2/Registry"; +import { Allo, AlloError, AlloOperation } from "../allo"; +import { Result, error, success } from "../common"; import { WaitUntilIndexerSynced } from "../indexer"; import { IpfsUploader } from "../ipfs"; import { - decodeEventFromReceipt, - sendRawTransaction, TransactionReceipt, TransactionSender, + decodeEventFromReceipt, + sendRawTransaction, } from "../transaction-sender"; -import RegistryABI from "../abis/allo-v2/Registry"; + +import { Registry } from "@allo-team/allo-v2-sdk/"; import { CreateProfileArgs, TransactionData, } from "@allo-team/allo-v2-sdk/dist/types"; -import { Allo as AlloV2Contract, Registry } from "@allo-team/allo-v2-sdk/"; import { AnyJson } from "../.."; export class AlloV2 implements Allo { @@ -23,12 +24,10 @@ export class AlloV2 implements Allo { private waitUntilIndexerSynced: WaitUntilIndexerSynced; private chainId: number; private registry: Registry; - private allo: AlloV2Contract; constructor(args: { chainId: number; transactionSender: TransactionSender; - allo: Address; ipfsUploader: IpfsUploader; waitUntilIndexerSynced: WaitUntilIndexerSynced; }) { @@ -40,9 +39,6 @@ export class AlloV2 implements Allo { this.registry = new Registry({ chain: this.chainId, }); - this.allo = new AlloV2Contract({ - chain: this.chainId, - }); } createProject(args: { name: string; metadata: AnyJson }): AlloOperation< @@ -191,14 +187,4 @@ export class AlloV2 implements Allo { }); }); } - - createRound!: (args: CreateRoundArguments) => AlloOperation< - Result<{ roundId: Hex }>, - { - ipfsStatus: Result; - transaction: Result; - transactionStatus: Result; - indexingStatus: Result; - } - >; } diff --git a/packages/common/src/allo/backends/test-utils.ts b/packages/common/src/allo/backends/test-utils.ts index ca019d0109..cb7947f064 100644 --- a/packages/common/src/allo/backends/test-utils.ts +++ b/packages/common/src/allo/backends/test-utils.ts @@ -16,6 +16,7 @@ export const zeroTxHash = ("0x" + "0".repeat(64)) as Hex; export const alloV1: Allo = new AlloV1({ chainId, + projectRegistryAddress, ipfsUploader, transactionSender, waitUntilIndexerSynced, @@ -26,7 +27,6 @@ export const alloV2: Allo = new AlloV2({ ipfsUploader, transactionSender, waitUntilIndexerSynced, - allo: projectRegistryAddress, }); export const getAllo = (version: string): Allo => { diff --git a/packages/common/src/allo/common.ts b/packages/common/src/allo/common.ts index c93d7a9275..8a15aae641 100644 --- a/packages/common/src/allo/common.ts +++ b/packages/common/src/allo/common.ts @@ -1,3 +1,5 @@ +import { AlloError } from "./allo"; + export type Result = | { type: "success"; value: T } | { type: "error"; error: Error }; diff --git a/packages/common/src/allo/indexer.ts b/packages/common/src/allo/indexer.ts index c4ec1e7138..eb3856892d 100644 --- a/packages/common/src/allo/indexer.ts +++ b/packages/common/src/allo/indexer.ts @@ -1,4 +1,4 @@ -import { graphql_fetch } from "../graphql_fetch"; +import { graphql_fetch } from ".."; export interface WaitUntilIndexerSynced { (args: { diff --git a/packages/common/src/allo/transaction-sender.ts b/packages/common/src/allo/transaction-sender.ts index 2cb08a8cb6..ee7e1b3244 100644 --- a/packages/common/src/allo/transaction-sender.ts +++ b/packages/common/src/allo/transaction-sender.ts @@ -2,20 +2,20 @@ import { Abi, ExtractAbiEventNames } from "abitype"; import ethers from "ethers"; import { Address, - decodeEventLog, - encodeEventTopics, - encodeFunctionData, EncodeFunctionDataParameters, GetEventArgs, Hex, Log, PublicClient, WalletClient, + decodeEventLog, + encodeEventTopics, + encodeFunctionData, zeroAddress, } from "viem"; import { AlloError } from "./allo"; -import { error, Result, success } from "./common"; +import { Result, error, success } from "./common"; export interface TransactionData { to: Hex; @@ -206,7 +206,7 @@ export function createMockTransactionSender(): TransactionSender & { return { transactionHash: txHash, blockHash: `0x${Math.random().toString(16).slice(2)}` as Hex, - blockNumber: BigInt(1), + blockNumber: 1n, logs: [], }; }, diff --git a/packages/common/src/chain-ids.ts b/packages/common/src/chain-ids.ts index aa9402eb43..11fbab3676 100644 --- a/packages/common/src/chain-ids.ts +++ b/packages/common/src/chain-ids.ts @@ -17,21 +17,3 @@ export enum ChainId { DEV1 = 313371, DEV2 = 313372, } - -export const RedstoneTokenIds = { - FTM: "FTM", - USDC: "USDC", - DAI: "DAI", - ETH: "ETH", - ARB: "ARB", - BUSD: "BUSD", - GTC: "GTC", - MATIC: "MATIC", - AVAX: "AVAX", - CVP: "CVP", - USDT: "USDT", - LUSD: "LUSD", - MUTE: "MUTE", - mkUSD: "mkUSD", - DATA: "DATA", -} as const; diff --git a/packages/common/src/graphql_fetch.ts b/packages/common/src/graphql_fetch.ts deleted file mode 100644 index e95e352869..0000000000 --- a/packages/common/src/graphql_fetch.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { ChainId } from "./chain-ids"; - -/** - * Fetch subgraph network for provided web3 network. - * The backticks are here to work around a failure of a test that tetsts graphql_fetch, - * and fails if the endpoint is undefined, so we convert the undefined to a string here in order not to fail the test. - * - * @param chainId - The chain ID of the blockchain - * @returns the subgraph endpoint - */ -export const getGraphQLEndpoint = (chainId: ChainId) => - `${graphQlEndpoints[chainId]}`; -/** - * Fetch data from a GraphQL endpoint - * - * @param query - The query to be executed - * @param chainId - The chain ID of the blockchain indexed by the subgraph - * @param variables - The variables to be used in the query - * @param fromProjectRegistry - Override to fetch from grant hub project registry subgraph - * @returns The result of the query - */ -export const graphql_fetch = async ( - query: string, - chainId: ChainId, - // eslint-disable-next-line @typescript-eslint/ban-types - variables: object = {}, - fromProjectRegistry = false -) => { - let endpoint = getGraphQLEndpoint(chainId); - - if (fromProjectRegistry) { - endpoint = endpoint.replace("grants-round", "grants-hub"); - } - - return fetch(endpoint, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ query, variables }), - }).then((resp) => { - if (resp.ok) { - return resp.json(); - } - - return Promise.reject(resp); - }); -}; -export const graphQlEndpoints: Record = { - [ChainId.DEV1]: process.env.REACT_APP_SUBGRAPH_DEV1_API!, - [ChainId.DEV2]: process.env.REACT_APP_SUBGRAPH_DEV2_API!, - [ChainId.PGN]: process.env.REACT_APP_SUBGRAPH_PGN_API!, - [ChainId.PGN_TESTNET]: process.env.REACT_APP_SUBGRAPH_PGN_TESTNET_API!, - [ChainId.MAINNET]: process.env.REACT_APP_SUBGRAPH_MAINNET_API!, - [ChainId.OPTIMISM_MAINNET_CHAIN_ID]: - process.env.REACT_APP_SUBGRAPH_OPTIMISM_MAINNET_API!, - [ChainId.FANTOM_MAINNET_CHAIN_ID]: - process.env.REACT_APP_SUBGRAPH_FANTOM_MAINNET_API!, - [ChainId.FANTOM_TESTNET_CHAIN_ID]: - process.env.REACT_APP_SUBGRAPH_FANTOM_TESTNET_API!, - [ChainId.ARBITRUM_GOERLI]: - process.env.REACT_APP_SUBGRAPH_ARBITRUM_GOERLI_API!, - [ChainId.ARBITRUM]: process.env.REACT_APP_SUBGRAPH_ARBITRUM_API!, - [ChainId.FUJI]: process.env.REACT_APP_SUBGRAPH_FUJI_API!, - [ChainId.AVALANCHE]: process.env.REACT_APP_SUBGRAPH_AVALANCHE_API!, - [ChainId.POLYGON]: process.env.REACT_APP_SUBGRAPH_POLYGON_API!, - [ChainId.POLYGON_MUMBAI]: process.env.REACT_APP_SUBGRAPH_POLYGON_MUMBAI_API!, - [ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID]: - process.env.REACT_APP_SUBGRAPH_ZKSYNC_TESTNET_API!, - [ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID]: - process.env.REACT_APP_SUBGRAPH_ZKSYNC_MAINNET_API!, - [ChainId.BASE]: process.env.REACT_APP_SUBGRAPH_BASE_API!, -}; diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index ec617a0132..372a80956b 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -1,10 +1,6 @@ import { useMemo, useState } from "react"; import useSWR from "swr"; import z from "zod"; -import { useOutletContext } from "react-router-dom"; -import { Network, Web3Provider } from "@ethersproject/providers"; -import { Signer } from "@ethersproject/abstract-signer"; -import { graphql_fetch } from "./graphql_fetch"; import { ChainId } from "./chain-ids"; export * from "./icons"; export * from "./markdown"; @@ -101,6 +97,81 @@ export type Payout = { createdAt: string; }; +// TODO relocate to data layer +export const graphQlEndpoints: Record = { + [ChainId.DEV1]: process.env.REACT_APP_SUBGRAPH_DEV1_API!, + [ChainId.DEV2]: process.env.REACT_APP_SUBGRAPH_DEV2_API!, + [ChainId.PGN]: process.env.REACT_APP_SUBGRAPH_PGN_API!, + [ChainId.PGN_TESTNET]: process.env.REACT_APP_SUBGRAPH_PGN_TESTNET_API!, + [ChainId.MAINNET]: process.env.REACT_APP_SUBGRAPH_MAINNET_API!, + [ChainId.OPTIMISM_MAINNET_CHAIN_ID]: + process.env.REACT_APP_SUBGRAPH_OPTIMISM_MAINNET_API!, + [ChainId.FANTOM_MAINNET_CHAIN_ID]: + process.env.REACT_APP_SUBGRAPH_FANTOM_MAINNET_API!, + [ChainId.FANTOM_TESTNET_CHAIN_ID]: + process.env.REACT_APP_SUBGRAPH_FANTOM_TESTNET_API!, + [ChainId.ARBITRUM_GOERLI]: + process.env.REACT_APP_SUBGRAPH_ARBITRUM_GOERLI_API!, + [ChainId.ARBITRUM]: process.env.REACT_APP_SUBGRAPH_ARBITRUM_API!, + [ChainId.FUJI]: process.env.REACT_APP_SUBGRAPH_FUJI_API!, + [ChainId.AVALANCHE]: process.env.REACT_APP_SUBGRAPH_AVALANCHE_API!, + [ChainId.POLYGON]: process.env.REACT_APP_SUBGRAPH_POLYGON_API!, + [ChainId.POLYGON_MUMBAI]: process.env.REACT_APP_SUBGRAPH_POLYGON_MUMBAI_API!, + [ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID]: + process.env.REACT_APP_SUBGRAPH_ZKSYNC_TESTNET_API!, + [ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID]: + process.env.REACT_APP_SUBGRAPH_ZKSYNC_MAINNET_API!, + [ChainId.BASE]: process.env.REACT_APP_SUBGRAPH_BASE_API!, +}; + +/** + * Fetch subgraph network for provided web3 network. + * The backticks are here to work around a failure of a test that tetsts graphql_fetch, + * and fails if the endpoint is undefined, so we convert the undefined to a string here in order not to fail the test. + * + * @param chainId - The chain ID of the blockchain + * @returns the subgraph endpoint + */ +export const getGraphQLEndpoint = (chainId: ChainId) => + `${graphQlEndpoints[chainId]}`; + +/** + * Fetch data from a GraphQL endpoint + * + * @param query - The query to be executed + * @param chainId - The chain ID of the blockchain indexed by the subgraph + * @param variables - The variables to be used in the query + * @param fromProjectRegistry - Override to fetch from grant hub project registry subgraph + * @returns The result of the query + */ +export const graphql_fetch = async ( + query: string, + chainId: ChainId, + // eslint-disable-next-line @typescript-eslint/ban-types + variables: object = {}, + fromProjectRegistry = false +) => { + let endpoint = getGraphQLEndpoint(chainId); + + if (fromProjectRegistry) { + endpoint = endpoint.replace("grants-round", "grants-hub"); + } + + return fetch(endpoint, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ query, variables }), + }).then((resp) => { + if (resp.ok) { + return resp.json(); + } + + return Promise.reject(resp); + }); +}; + /** * Fetches the payouts that happened for a given round from TheGraph * @param roundId Round ID @@ -246,6 +317,24 @@ export const getUTCDateTime = (date: Date): string => { return `${getUTCDate(date)} ${getUTCTime(date)}`; }; +export const RedstoneTokenIds = { + FTM: "FTM", + USDC: "USDC", + DAI: "DAI", + ETH: "ETH", + ARB: "ARB", + BUSD: "BUSD", + GTC: "GTC", + MATIC: "MATIC", + AVAX: "AVAX", + CVP: "CVP", + USDT: "USDT", + LUSD: "LUSD", + MUTE: "MUTE", + mkUSD: "mkUSD", + DATA: "DATA", +} as const; + export const useTokenPrice = (tokenId: string | undefined) => { const [tokenPrice, setTokenPrice] = useState(); const [error, setError] = useState(); @@ -326,41 +415,8 @@ export { sendTransaction } from "./allo/transaction-sender"; -export type AnyJson = - | boolean - | number - | string - | null - | undefined - | JsonArray - | JsonMap; +export type AnyJson = boolean | number | string | null | JsonArray | JsonMap; interface JsonMap { [key: string]: AnyJson; } interface JsonArray extends Array {} - -/** - * Wrapper hook to expose wallet auth information to other components - */ -export function useWallet() { - return useOutletContext(); -} - -export interface Web3Instance { - /** - * Currently selected address in ETH format i.e 0x... - */ - address: string; - /** - * Chain ID & name of the currently connected network - */ - chain: { - id: number; - name: string; - network: Network; - }; - provider: Web3Provider; - signer?: Signer; -} - -export { graphql_fetch, graphQlEndpoints } from "./graphql_fetch"; diff --git a/packages/common/src/payoutTokens.ts b/packages/common/src/payoutTokens.ts deleted file mode 100644 index a2b6836c1d..0000000000 --- a/packages/common/src/payoutTokens.ts +++ /dev/null @@ -1,399 +0,0 @@ -import { ChainId, RedstoneTokenIds } from "./chain-ids"; -import { ethers } from "ethers"; -import { Address } from "wagmi"; - -export type PayoutToken = { - name: string; - chainId: number; - address: Address; - logo?: string; - default?: boolean; // TODO: this is only used to provide the initial placeholder item, look for better solution - redstoneTokenId?: string; - decimal: number; -}; -export const TokenNamesAndLogos = { - FTM: "/logos/fantom-logo.svg", - BUSD: "/logos/busd-logo.svg", - DAI: "/logos/dai-logo.svg", - USDC: "./logos/usdc-logo.svg", - ETH: "/logos/ethereum-eth-logo.svg", - OP: "/logos/optimism-logo.svg", - ARB: "/logos/arb-logo.svg", - GCV: "/logos/gcv.svg", - GTC: "/logos/gtc.svg", - AVAX: "/logos/avax-logo.svg", - MATIC: "/logos/pol-logo.svg", - CVP: "/logos/power-pool.png", // PowerPool - TEST: "/logos/dai-logo.svg", - USDT: "/logos/usdt-logo.svg", - LUSD: "/logos/lusd-logo.svg", - MUTE: "/logos/mute-logo.svg", - mkUSD: "/logos/mkusd-logo.svg", // Prisma mkUSD -} as const; -const MAINNET_TOKENS: PayoutToken[] = [ - { - name: "DAI", - chainId: ChainId.MAINNET, - address: "0x6B175474E89094C44Da98b954EedeAC495271d0F", - decimal: 18, - logo: TokenNamesAndLogos["DAI"], - redstoneTokenId: RedstoneTokenIds["DAI"], - }, - { - name: "ETH", - chainId: ChainId.MAINNET, - address: ethers.constants.AddressZero, - decimal: 18, - logo: TokenNamesAndLogos["ETH"], - redstoneTokenId: RedstoneTokenIds["ETH"], - }, - { - name: "CVP", - chainId: ChainId.MAINNET, - address: "0x38e4adB44ef08F22F5B5b76A8f0c2d0dCbE7DcA1", - decimal: 18, - logo: TokenNamesAndLogos["CVP"], - redstoneTokenId: RedstoneTokenIds["CVP"], - }, - { - name: "mkUSD", - chainId: ChainId.MAINNET, - address: "0x4591DBfF62656E7859Afe5e45f6f47D3669fBB28", - decimal: 18, - logo: TokenNamesAndLogos["mkUSD"], - redstoneTokenId: RedstoneTokenIds["mkUSD"], - }, -]; -const OPTIMISM_MAINNET_TOKENS: PayoutToken[] = [ - { - name: "DAI", - chainId: ChainId.OPTIMISM_MAINNET_CHAIN_ID, - address: "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1", - decimal: 18, - logo: TokenNamesAndLogos["DAI"], - redstoneTokenId: RedstoneTokenIds["DAI"], - }, - { - name: "ETH", - chainId: ChainId.OPTIMISM_MAINNET_CHAIN_ID, - address: ethers.constants.AddressZero, - decimal: 18, - logo: TokenNamesAndLogos["ETH"], - redstoneTokenId: RedstoneTokenIds["ETH"], - }, -]; -const FANTOM_MAINNET_TOKENS: PayoutToken[] = [ - { - name: "WFTM", - chainId: ChainId.FANTOM_MAINNET_CHAIN_ID, - address: "0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83", - decimal: 18, - logo: TokenNamesAndLogos["FTM"], - redstoneTokenId: RedstoneTokenIds["FTM"], - }, - { - name: "FTM", - chainId: ChainId.FANTOM_MAINNET_CHAIN_ID, - address: ethers.constants.AddressZero, - decimal: 18, - logo: TokenNamesAndLogos["FTM"], - redstoneTokenId: RedstoneTokenIds["FTM"], - }, - { - name: "BUSD", - chainId: ChainId.FANTOM_MAINNET_CHAIN_ID, - address: "0xC931f61B1534EB21D8c11B24f3f5Ab2471d4aB50", - decimal: 18, - logo: TokenNamesAndLogos["BUSD"], - redstoneTokenId: RedstoneTokenIds["BUSD"], - }, - { - name: "DAI", - chainId: ChainId.FANTOM_MAINNET_CHAIN_ID, - address: "0x8d11ec38a3eb5e956b052f67da8bdc9bef8abf3e", - decimal: 18, - logo: TokenNamesAndLogos["DAI"], - redstoneTokenId: RedstoneTokenIds["DAI"], - }, - { - name: "GcV", - chainId: ChainId.FANTOM_MAINNET_CHAIN_ID, - address: "0x83791638da5EB2fAa432aff1c65fbA47c5D29510", - decimal: 18, - logo: TokenNamesAndLogos["GCV"], - redstoneTokenId: RedstoneTokenIds["DAI"], // We use DAI for the price - }, -]; -const FANTOM_TESTNET_TOKENS: PayoutToken[] = [ - { - name: "DAI", - chainId: ChainId.FANTOM_TESTNET_CHAIN_ID, - address: "0xEdE59D58d9B8061Ff7D22E629AB2afa01af496f4", - decimal: 18, - logo: TokenNamesAndLogos["DAI"], - redstoneTokenId: RedstoneTokenIds["DAI"], - }, - { - name: "FTM", - chainId: ChainId.FANTOM_TESTNET_CHAIN_ID, - address: ethers.constants.AddressZero, - decimal: 18, - logo: TokenNamesAndLogos["FTM"], - redstoneTokenId: RedstoneTokenIds["FTM"], - }, -]; - -const ZKSYNC_ERA_TESTNET_TOKENS: PayoutToken[] = [ - { - name: "ETH", - chainId: ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID, - address: ethers.constants.AddressZero, - decimal: 18, - logo: TokenNamesAndLogos["ETH"], - redstoneTokenId: RedstoneTokenIds["ETH"], - }, - { - name: "TEST", - chainId: ChainId.ZKSYNC_ERA_TESTNET_CHAIN_ID, - address: "0x8fd03Cd97Da068CC242Ab7551Dc4100DD405E8c7", - decimal: 18, - logo: TokenNamesAndLogos["DAI"], - redstoneTokenId: RedstoneTokenIds["DAI"], - }, -]; - -const ZKSYNC_ERA_MAINNET_TOKENS: PayoutToken[] = [ - { - name: "ETH", - chainId: ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID, - address: ethers.constants.AddressZero, - decimal: 18, - logo: TokenNamesAndLogos["ETH"], - redstoneTokenId: RedstoneTokenIds["ETH"], - }, - { - name: "DAI", - chainId: ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID, - address: "0x4B9eb6c0b6ea15176BBF62841C6B2A8a398cb656", - decimal: 18, - logo: TokenNamesAndLogos["DAI"], - redstoneTokenId: RedstoneTokenIds["DAI"], - }, - { - name: "USDT", - chainId: ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID, - address: "0x493257fD37EDB34451f62EDf8D2a0C418852bA4C", - decimal: 6, - logo: TokenNamesAndLogos["USDT"], - redstoneTokenId: RedstoneTokenIds["USDT"], - }, - { - name: "LUSD", - chainId: ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID, - address: "0x503234F203fC7Eb888EEC8513210612a43Cf6115", - decimal: 18, - logo: TokenNamesAndLogos["LUSD"], - redstoneTokenId: RedstoneTokenIds["LUSD"], - }, - { - name: "MUTE", - chainId: ChainId.ZKSYNC_ERA_MAINNET_CHAIN_ID, - address: "0x0e97C7a0F8B2C9885C8ac9fC6136e829CbC21d42", - decimal: 18, - logo: TokenNamesAndLogos["MUTE"], - redstoneTokenId: RedstoneTokenIds["MUTE"], - }, -]; - -const PGN_TESTNET_TOKENS: PayoutToken[] = [ - { - name: "TEST", - chainId: ChainId.PGN_TESTNET, - address: "0x5FbDB2315678afecb367f032d93F642f64180aa3", - logo: TokenNamesAndLogos["DAI"], - decimal: 18, - }, - { - name: "ETH", - chainId: ChainId.PGN_TESTNET, - address: ethers.constants.AddressZero, - logo: TokenNamesAndLogos["ETH"], - decimal: 18, - }, -]; -const PGN_MAINNET_TOKENS: PayoutToken[] = [ - { - name: "ETH", - chainId: ChainId.PGN, - address: ethers.constants.AddressZero, - decimal: 18, - logo: TokenNamesAndLogos["ETH"], - redstoneTokenId: RedstoneTokenIds["ETH"], - }, - { - name: "GTC", - chainId: ChainId.PGN, - address: "0x7c6b91D9Be155A6Db01f749217d76fF02A7227F2", - decimal: 18, - logo: TokenNamesAndLogos["GTC"], - redstoneTokenId: RedstoneTokenIds["GTC"], - }, - { - name: "DAI", - chainId: ChainId.PGN, - address: "0x6C121674ba6736644A7e73A8741407fE8a5eE5BA", - decimal: 18, - logo: TokenNamesAndLogos["DAI"], - redstoneTokenId: RedstoneTokenIds["DAI"], - }, -]; - -const BASE_TOKENS: PayoutToken[] = [ - { - name: "ETH", - chainId: ChainId.BASE, - address: ethers.constants.AddressZero, - decimal: 18, - logo: TokenNamesAndLogos["ETH"], - redstoneTokenId: RedstoneTokenIds["ETH"], - }, - { - name: "USDC", - chainId: ChainId.BASE, - address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", - decimal: 6, - logo: TokenNamesAndLogos["USDC"], - redstoneTokenId: RedstoneTokenIds["USDC"], - }, -]; - -const ARBITRUM_GOERLI_TOKENS: PayoutToken[] = [ - { - name: "ETH", - chainId: ChainId.ARBITRUM_GOERLI, - address: ethers.constants.AddressZero, - decimal: 18, - logo: TokenNamesAndLogos["ETH"], - redstoneTokenId: RedstoneTokenIds["ETH"], - }, -]; -const ARBITRUM_TOKENS: PayoutToken[] = [ - { - name: "ETH", - chainId: ChainId.ARBITRUM, - address: ethers.constants.AddressZero, - decimal: 18, - logo: TokenNamesAndLogos["ETH"], - redstoneTokenId: RedstoneTokenIds["ETH"], - }, - { - name: "USDC", - chainId: ChainId.ARBITRUM, - address: "0xaf88d065e77c8cc2239327c5edb3a432268e5831", - decimal: 6, - logo: TokenNamesAndLogos["USDC"], - redstoneTokenId: RedstoneTokenIds["USDC"], - }, - { - name: "ARB", - chainId: ChainId.ARBITRUM, - address: "0x912CE59144191C1204E64559FE8253a0e49E6548", - decimal: 18, - logo: TokenNamesAndLogos["ARB"], - redstoneTokenId: RedstoneTokenIds["ARB"], - }, -]; -const AVALANCHE_TOKENS: PayoutToken[] = [ - { - name: "AVAX", - chainId: ChainId.AVALANCHE, - address: ethers.constants.AddressZero, - decimal: 18, - logo: TokenNamesAndLogos["AVAX"], - redstoneTokenId: RedstoneTokenIds["AVAX"], - }, - { - name: "USDC", - chainId: ChainId.AVALANCHE, - address: "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E", - decimal: 6, - logo: TokenNamesAndLogos["USDC"], - redstoneTokenId: RedstoneTokenIds["USDC"], - }, -]; -const FUJI_TOKENS: PayoutToken[] = [ - { - name: "AVAX", - chainId: ChainId.FUJI, - address: ethers.constants.AddressZero, - decimal: 18, - logo: TokenNamesAndLogos["AVAX"], - redstoneTokenId: RedstoneTokenIds["AVAX"], - }, - { - name: "USDC", - chainId: ChainId.FUJI, - address: "0x5425890298aed601595a70ab815c96711a31bc65", - decimal: 6, - logo: TokenNamesAndLogos["USDC"], - redstoneTokenId: RedstoneTokenIds["USDC"], - }, -]; -const POLYGON_TOKENS: PayoutToken[] = [ - { - name: "MATIC", - chainId: ChainId.POLYGON, - address: ethers.constants.AddressZero, - decimal: 18, - logo: TokenNamesAndLogos["MATIC"], - redstoneTokenId: RedstoneTokenIds["MATIC"], - }, - { - name: "USDC", - chainId: ChainId.POLYGON, - address: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359", - decimal: 6, - logo: TokenNamesAndLogos["USDC"], - redstoneTokenId: RedstoneTokenIds["USDC"], - }, -]; -const POLYGON_MUMBAI_TOKENS: PayoutToken[] = [ - { - name: "MATIC", - chainId: ChainId.POLYGON_MUMBAI, - address: ethers.constants.AddressZero, - decimal: 18, - logo: TokenNamesAndLogos["MATIC"], - redstoneTokenId: RedstoneTokenIds["MATIC"], - }, - { - name: "USDC", - chainId: ChainId.POLYGON_MUMBAI, - address: "0x9999f7Fea5938fD3b1E26A12c3f2fb024e194f97", - decimal: 6, - logo: TokenNamesAndLogos["USDC"], - redstoneTokenId: RedstoneTokenIds["USDC"], - }, -]; -export const payoutTokens = [ - ...MAINNET_TOKENS, - ...OPTIMISM_MAINNET_TOKENS, - ...FANTOM_MAINNET_TOKENS, - ...FANTOM_TESTNET_TOKENS, - ...PGN_TESTNET_TOKENS, - ...PGN_MAINNET_TOKENS, - ...ARBITRUM_TOKENS, - ...ARBITRUM_GOERLI_TOKENS, - ...AVALANCHE_TOKENS, - ...FUJI_TOKENS, - ...POLYGON_TOKENS, - ...POLYGON_MUMBAI_TOKENS, - ...ZKSYNC_ERA_MAINNET_TOKENS, - ...ZKSYNC_ERA_TESTNET_TOKENS, - ...BASE_TOKENS, -]; - -export const getPayoutTokenOptions = (chainId: ChainId): PayoutToken[] => { - const tokens = payoutTokens.filter((token) => token.chainId === chainId); - return tokens.length > 0 ? tokens : MAINNET_TOKENS; -}; diff --git a/packages/common/src/types.ts b/packages/common/src/types.ts deleted file mode 100644 index 5213e1bbd8..0000000000 --- a/packages/common/src/types.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Round } from "data-layer"; - -export type CreateRoundData = { - roundMetadataWithProgramContractAddress: Round["roundMetadata"]; - applicationQuestions: { - version: string; - lastUpdatedOn: number; - applicationSchema: { - questions: SchemaQuestion[]; - requirements: ProjectRequirements; - }; - }; - round: Round; - roundCategory: RoundCategory; -}; - -export type SchemaQuestion = { - id: number; - title: string; - type: InputType; - required: boolean; - hidden: boolean; - choices?: string[]; - encrypted: boolean; - fixed?: boolean; - metadataExcluded?: boolean; -}; - -export type ProjectRequirements = { - twitter: { - required: boolean; - verification: boolean; - }; - github: { - required: boolean; - verification: boolean; - }; -}; - -export enum RoundCategory { - QuadraticFunding, - Direct, -} - -export type InputType = - | "email" - | "address" - | "number" - | "text" - | "short-answer" - | "paragraph" - | "multiple-choice" - | "checkbox" - | "dropdown" - | "link"; - -export type DeepRequired = { - [K in keyof T]: Required>; -}; diff --git a/packages/common/tsconfig.json b/packages/common/tsconfig.json index 988ab479d1..8169a3a5bc 100644 --- a/packages/common/tsconfig.json +++ b/packages/common/tsconfig.json @@ -20,3 +20,4 @@ "declaration": true }, } + diff --git a/packages/data-layer/src/data.types.ts b/packages/data-layer/src/data.types.ts index 990524acaf..7da2de3554 100644 --- a/packages/data-layer/src/data.types.ts +++ b/packages/data-layer/src/data.types.ts @@ -222,17 +222,17 @@ export interface MetadataPointer { pointer: string; } -export type Requirement = { +export interface Requirement { // Requirement for the round requirement?: string; -}; +} -export type Eligibility = { +export interface Eligibility { // Eligibility for the round description: string; // Requirements for the round requirements?: Requirement[]; -}; +} export interface Round { /** @@ -301,10 +301,6 @@ export interface Round { * Contract address of the program to which the round belongs */ ownedBy: string; - /** - * Addresses of wallets that will have admin privileges to operate the Grant program - */ - operatorWallets?: Array; /** * List of projects approved for the round */ diff --git a/packages/grant-explorer/src/features/api/utils.ts b/packages/grant-explorer/src/features/api/utils.ts index cc59be2cc8..d556ec682a 100644 --- a/packages/grant-explorer/src/features/api/utils.ts +++ b/packages/grant-explorer/src/features/api/utils.ts @@ -1,14 +1,13 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ -import { CartProject, IPFSObject, Round, VotingToken } from "./types"; +import { CartProject, IPFSObject, VotingToken, Round } from "./types"; import { ChainId, graphQlEndpoints, - ROUND_PAYOUT_DIRECT, - ROUND_PAYOUT_MERKLE, + RedstoneTokenIds, RoundPayoutType, } from "common"; -import { RedstoneTokenIds } from "common/src/chain-ids"; import { useSearchParams } from "react-router-dom"; +import { ROUND_PAYOUT_MERKLE, ROUND_PAYOUT_DIRECT } from "common"; import { getAddress, zeroAddress } from "viem"; import { ethers } from "ethers"; diff --git a/packages/round-manager/craco.config.js b/packages/round-manager/craco.config.js index aa6335209c..89377ea034 100644 --- a/packages/round-manager/craco.config.js +++ b/packages/round-manager/craco.config.js @@ -89,10 +89,10 @@ module.exports = { skipEsbuildJest: true, esbuildLoaderOptions: { loader: "tsx", // Set the value to 'tsx' if you use typescript - target: "es2021", + target: "es2020", }, esbuildMinimizerOptions: { - target: "es2021", + target: "es2020", }, }, }, diff --git a/packages/round-manager/package.json b/packages/round-manager/package.json index 7448069d15..22b3553557 100644 --- a/packages/round-manager/package.json +++ b/packages/round-manager/package.json @@ -36,7 +36,7 @@ "@heroicons/react": "^1.0.6", "@hookform/resolvers": "^2.9.2", "@openzeppelin/merkle-tree": "^1.0.2", - "@rainbow-me/rainbowkit": "0.12.18", + "@rainbow-me/rainbowkit": "0.12.16", "@reduxjs/toolkit": "^1.8.1", "@sentry/integrations": "^7.28.0", "@sentry/react": "^7.27.0", @@ -91,11 +91,9 @@ "url": "^0.11.0", "util": "^0.12.4", "verify-env": "*", - "viem": "^2.5.0", "wagmi": "0.12.18", "web-vitals": "^2.1.0", - "yup": "^0.32.11", - "zustand": "^4.4.0" + "yup": "^0.32.11" }, "jest": { "transformIgnorePatterns": [ @@ -132,6 +130,7 @@ "add": "^2.0.6", "autoprefixer": "^10.4.7", "craco-esbuild": "^0.5.2", + "husky": "^8.0.1", "postcss": "^8.4.14", "resize-observer-polyfill": "^1.5.1", "tailwind-styled-components": "2.1.6", diff --git a/packages/round-manager/src/context/round/CreateRoundContext.tsx b/packages/round-manager/src/context/round/CreateRoundContext.tsx new file mode 100644 index 0000000000..9e419aab1f --- /dev/null +++ b/packages/round-manager/src/context/round/CreateRoundContext.tsx @@ -0,0 +1,363 @@ +import { + ProgressStatus, + ProjectRequirements, + Round, + RoundCategory, + StorageProtocolID, +} from "../../features/api/types"; +import React, { + createContext, + SetStateAction, + useContext, + useState, +} from "react"; +import { saveToIPFS } from "../../features/api/ipfs"; +import { useWallet } from "../../features/common/Auth"; +import { deployRoundContract } from "../../features/api/round"; +import { waitForSubgraphSyncTo } from "../../features/api/subgraph"; +import { SchemaQuestion } from "../../features/api/utils"; +import { datadogLogs } from "@datadog/browser-logs"; +import { Signer } from "@ethersproject/abstract-signer"; +import { + dgVotingStrategyDummyContract, + directPayoutStrategyFactoryContract, + merklePayoutStrategyFactoryContract, + qfVotingStrategyFactoryContract, +} from "../../features/api/contracts"; + +type SetStatusFn = React.Dispatch>; + +export interface CreateRoundState { + IPFSCurrentStatus: ProgressStatus; + setIPFSCurrentStatus: SetStatusFn; + votingContractDeploymentStatus: ProgressStatus; + setVotingContractDeploymentStatus: SetStatusFn; + payoutContractDeploymentStatus: ProgressStatus; + setPayoutContractDeploymentStatus: SetStatusFn; + roundContractDeploymentStatus: ProgressStatus; + setRoundContractDeploymentStatus: SetStatusFn; + indexingStatus: ProgressStatus; + setIndexingStatus: SetStatusFn; +} + +export type CreateRoundData = { + roundMetadataWithProgramContractAddress: Round["roundMetadata"]; + applicationQuestions: { + version: string; + lastUpdatedOn: number; + applicationSchema: { + questions: SchemaQuestion[]; + requirements: ProjectRequirements; + }; + }; + round: Round; + roundCategory: RoundCategory; +}; + +export const initialCreateRoundState: CreateRoundState = { + IPFSCurrentStatus: ProgressStatus.NOT_STARTED, + setIPFSCurrentStatus: () => { + /* provided in CreateRoundProvider */ + }, + votingContractDeploymentStatus: ProgressStatus.NOT_STARTED, + setVotingContractDeploymentStatus: () => { + /* provided in CreateRoundProvider */ + }, + payoutContractDeploymentStatus: ProgressStatus.NOT_STARTED, + setPayoutContractDeploymentStatus: () => { + /* provided in CreateRoundProvider */ + }, + roundContractDeploymentStatus: ProgressStatus.NOT_STARTED, + setRoundContractDeploymentStatus: () => { + /* provided in CreateRoundProvider */ + }, + indexingStatus: ProgressStatus.NOT_STARTED, + setIndexingStatus: () => { + /* provided in CreateRoundProvider */ + }, +}; + +export const CreateRoundContext = createContext( + initialCreateRoundState +); + +export const CreateRoundProvider = ({ + children, +}: { + children: React.ReactNode; +}) => { + const [IPFSCurrentStatus, setIPFSCurrentStatus] = useState( + initialCreateRoundState.IPFSCurrentStatus + ); + const [votingContractDeploymentStatus, setVotingContractDeploymentStatus] = + useState(initialCreateRoundState.votingContractDeploymentStatus); + const [payoutContractDeploymentStatus, setPayoutContractDeploymentStatus] = + useState(initialCreateRoundState.payoutContractDeploymentStatus); + const [roundContractDeploymentStatus, setRoundContractDeploymentStatus] = + useState(initialCreateRoundState.roundContractDeploymentStatus); + const [indexingStatus, setIndexingStatus] = useState( + initialCreateRoundState.indexingStatus + ); + + const providerProps: CreateRoundState = { + IPFSCurrentStatus, + setIPFSCurrentStatus, + votingContractDeploymentStatus, + setVotingContractDeploymentStatus, + payoutContractDeploymentStatus, + setPayoutContractDeploymentStatus, + roundContractDeploymentStatus, + setRoundContractDeploymentStatus, + indexingStatus, + setIndexingStatus, + }; + + return ( + + {children} + + ); +}; + +interface _createRoundParams { + context: CreateRoundState; + signerOrProvider: Signer; + createRoundData: CreateRoundData; +} + +const _createRound = async ({ + context, + signerOrProvider, + createRoundData, +}: _createRoundParams) => { + const { + setIPFSCurrentStatus, + setVotingContractDeploymentStatus, + setPayoutContractDeploymentStatus, + setRoundContractDeploymentStatus, + setIndexingStatus, + } = context; + const { + roundMetadataWithProgramContractAddress, + applicationQuestions, + round, + roundCategory, + } = createRoundData; + + const isQF = roundCategory === RoundCategory.QuadraticFunding; + + try { + datadogLogs.logger.info(`_createRound: ${round}`); + + if ( + roundMetadataWithProgramContractAddress && + roundMetadataWithProgramContractAddress.eligibility + ) { + roundMetadataWithProgramContractAddress.eligibility.requirements = + roundMetadataWithProgramContractAddress.eligibility?.requirements.filter( + // Loose comparison might be intentional here, leave as is + (obj) => obj.requirement != "" + ); + } + + const { roundMetadataIpfsHash, applicationSchemaIpfsHash } = + await storeDocuments( + setIPFSCurrentStatus, + roundMetadataWithProgramContractAddress, + applicationQuestions + ); + + const roundContractInputsWithPointers = { + ...round, + store: { + protocol: StorageProtocolID.IPFS, + pointer: roundMetadataIpfsHash, + }, + applicationStore: { + protocol: StorageProtocolID.IPFS, + pointer: applicationSchemaIpfsHash, + }, + }; + + /* On newer RoundImplementations, we create all the contracts during the round init process + * Therefore we pass in the factories for the voting and payout contracts instead of + * the implementations, and let the round deploy and init the strategies themselves */ + const chainId = await signerOrProvider.getChainId(); + + const roundContractInputsWithContracts = { + ...roundContractInputsWithPointers, + votingStrategy: isQF + ? qfVotingStrategyFactoryContract(chainId).address + : dgVotingStrategyDummyContract(chainId), + payoutStrategy: { + id: isQF + ? merklePayoutStrategyFactoryContract(chainId).address + : directPayoutStrategyFactoryContract(chainId).address, + isReadyForPayout: false, + }, + }; + + const transactionBlockNumber = await handleDeployUnifiedRoundContract( + [ + setVotingContractDeploymentStatus, + setPayoutContractDeploymentStatus, + setRoundContractDeploymentStatus, + ], + roundContractInputsWithContracts, + signerOrProvider, + isQF + ); + + await waitForSubgraphToUpdate( + setIndexingStatus, + signerOrProvider, + transactionBlockNumber + ); + } catch (error) { + datadogLogs.logger.error( + `error: _createRound ${error}. Data : ${createRoundData}` + ); + + console.error("_createRound", error); + } +}; + +export const useCreateRound = () => { + const context = useContext(CreateRoundContext); + if (context === undefined) { + throw new Error("useCreateRound must be used within a CreateRoundProvider"); + } + + const { + setIPFSCurrentStatus, + setVotingContractDeploymentStatus, + setPayoutContractDeploymentStatus, + setRoundContractDeploymentStatus, + setIndexingStatus, + } = context; + const { signer: walletSigner } = useWallet(); + + const createRound = (createRoundData: CreateRoundData) => { + resetToInitialState( + setIPFSCurrentStatus, + setVotingContractDeploymentStatus, + setPayoutContractDeploymentStatus, + setRoundContractDeploymentStatus, + setIndexingStatus + ); + + return _createRound({ + context, + signerOrProvider: walletSigner as Signer, + createRoundData, + }); + }; + + return { + createRound, + IPFSCurrentStatus: context.IPFSCurrentStatus, + votingContractDeploymentStatus: context.votingContractDeploymentStatus, + payoutContractDeploymentStatus: context.payoutContractDeploymentStatus, + roundContractDeploymentStatus: context.roundContractDeploymentStatus, + indexingStatus: context.indexingStatus, + }; +}; + +function resetToInitialState( + setStoringStatus: SetStatusFn, + setVotingDeployingStatus: SetStatusFn, + setPayoutDeployingStatus: SetStatusFn, + setDeployingStatus: SetStatusFn, + setIndexingStatus: SetStatusFn +): void { + setStoringStatus(initialCreateRoundState.IPFSCurrentStatus); + setVotingDeployingStatus( + initialCreateRoundState.votingContractDeploymentStatus + ); + setPayoutDeployingStatus( + initialCreateRoundState.payoutContractDeploymentStatus + ); + setDeployingStatus(initialCreateRoundState.roundContractDeploymentStatus); + setIndexingStatus(initialCreateRoundState.indexingStatus); +} + +async function storeDocuments( + setStoringStatus: SetStatusFn, + roundMetadataWithProgramContractAddress: CreateRoundData["roundMetadataWithProgramContractAddress"], + applicationQuestions: CreateRoundData["applicationQuestions"] +) { + try { + setStoringStatus(ProgressStatus.IN_PROGRESS); + + const [roundMetadataIpfsHash, applicationSchemaIpfsHash] = + await Promise.all([ + saveToIPFS({ + content: roundMetadataWithProgramContractAddress, + metadata: { + name: "round-metadata", + }, + }), + saveToIPFS({ + content: applicationQuestions, + metadata: { + name: "application-schema", + }, + }), + ]); + + setStoringStatus(ProgressStatus.IS_SUCCESS); + + return { + roundMetadataIpfsHash, + applicationSchemaIpfsHash, + }; + } catch (error) { + console.error("storeDocuments", error); + + setStoringStatus(ProgressStatus.IS_ERROR); + throw error; + } +} + +async function handleDeployUnifiedRoundContract( + setDeploymentStatusFns: SetStatusFn[], + round: Round, + signerOrProvider: Signer, + isQF: boolean +): Promise { + try { + setDeploymentStatusFns.forEach((fn) => fn(ProgressStatus.IN_PROGRESS)); + const { transactionBlockNumber } = await deployRoundContract( + round, + signerOrProvider, + isQF + ); + + setDeploymentStatusFns.forEach((fn) => fn(ProgressStatus.IS_SUCCESS)); + + return transactionBlockNumber; + } catch (error) { + console.error("handleDeployRoundContract", error); + setDeploymentStatusFns.forEach((fn) => fn(ProgressStatus.IS_ERROR)); + throw error; + } +} + +async function waitForSubgraphToUpdate( + setIndexingStatus: SetStatusFn, + signerOrProvider: Signer, + transactionBlockNumber: number +) { + try { + setIndexingStatus(ProgressStatus.IN_PROGRESS); + + const chainId = await signerOrProvider.getChainId(); + await waitForSubgraphSyncTo(chainId, transactionBlockNumber); + + setIndexingStatus(ProgressStatus.IS_SUCCESS); + } catch (error) { + console.error("waitForSubgraphToUpdate", error); + setIndexingStatus(ProgressStatus.IS_ERROR); + throw error; + } +} diff --git a/packages/round-manager/src/context/round/__tests__/CreateRoundContext.test.tsx b/packages/round-manager/src/context/round/__tests__/CreateRoundContext.test.tsx new file mode 100644 index 0000000000..fbb902f6c8 --- /dev/null +++ b/packages/round-manager/src/context/round/__tests__/CreateRoundContext.test.tsx @@ -0,0 +1,449 @@ +import { saveToIPFS } from "../../../features/api/ipfs"; +import { fireEvent, render, screen } from "@testing-library/react"; +import { ProgressStatus, RoundCategory } from "../../../features/api/types"; +import { + CreateRoundData, + CreateRoundProvider, + useCreateRound, +} from "../CreateRoundContext"; +import { deployRoundContract } from "../../../features/api/round"; +import { waitForSubgraphSyncTo } from "../../../features/api/subgraph"; + +const mockWallet = { + address: "0x0", + signer: { + getChainId: () => { + return 5; + }, + }, +}; + +jest.mock("../../../features/api/payoutStrategy/payoutStrategy"); +jest.mock("../../../features/api/round"); +jest.mock("../../../features/api/ipfs"); +jest.mock("../../../features/api/subgraph"); +jest.mock("../../../features/common/Auth", () => ({ + useWallet: () => mockWallet, +})); +jest.mock("wagmi"); +jest.mock("@rainbow-me/rainbowkit", () => ({ + ConnectButton: jest.fn(), +})); + +describe("", () => { + function invokeCreateRound() { + const createRound = screen.getByTestId("create-round"); + fireEvent.click(createRound); + } + + describe("Set IPFS Status", () => { + it("sets ipfs status to in progress when saving to ipfs", async () => { + (saveToIPFS as jest.Mock).mockReturnValue( + new Promise(() => { + /* do nothing.*/ + }) + ); + + renderWithProvider(); + invokeCreateRound(); + + expect( + await screen.findByTestId( + `storing-status-is-${ProgressStatus.IN_PROGRESS}` + ) + ); + }); + + it("sets ipfs status to complete when saving to ipfs succeeds", async () => { + (saveToIPFS as jest.Mock).mockResolvedValue("my ipfs doc :)))"); + + renderWithProvider(); + invokeCreateRound(); + + expect( + await screen.findByTestId( + `storing-status-is-${ProgressStatus.IS_SUCCESS}` + ) + ); + }); + }); + + describe("Set Voting Contract Deployment Status", () => { + beforeEach(() => { + const ipfsHash = "bafabcdef"; + (saveToIPFS as jest.Mock).mockResolvedValue(ipfsHash); + (deployRoundContract as jest.Mock).mockReturnValue( + new Promise(() => ({ transactionBlockNumber: 0 })) + ); + }); + + it("sets voting contract deployment status to in progress when voting contract is being deployed", async () => { + renderWithProvider(); + invokeCreateRound(); + + expect( + await screen.findByTestId( + `voting-deploying-status-is-${ProgressStatus.IN_PROGRESS}` + ) + ); + }); + + it("sets voting contract deployment status to success when voting contract has been deployed", async () => { + renderWithProvider(); + (deployRoundContract as jest.Mock).mockResolvedValue({ + transactionBlockNumber: 0, + }); + invokeCreateRound(); + + expect( + await screen.findByTestId( + `voting-deploying-status-is-${ProgressStatus.IS_SUCCESS}` + ) + ); + }); + }); + + describe("Set Payout Contract Deployment Status", () => { + beforeEach(() => { + const ipfsHash = "bafabcdef"; + (saveToIPFS as jest.Mock).mockResolvedValue(ipfsHash); + (deployRoundContract as jest.Mock).mockReturnValue( + new Promise(() => ({ transactionBlockNumber: 0 })) + ); + }); + + it("sets payout contract deployment status to in progress when payout contract is being deployed", async () => { + renderWithProvider(); + invokeCreateRound(); + + expect( + await screen.findByTestId( + `payout-deploying-status-is-${ProgressStatus.IN_PROGRESS}` + ) + ); + }); + + it("sets payout contract deployment status to success when payout contract has been deployed", async () => { + renderWithProvider(); + (deployRoundContract as jest.Mock).mockResolvedValue({ + transactionBlockNumber: 0, + }); + invokeCreateRound(); + + expect( + await screen.findByTestId( + `payout-deploying-status-is-${ProgressStatus.IS_SUCCESS}` + ) + ); + }); + }); + + describe("Set Round Contract Deployment Status", () => { + const ipfsHash = "bafabcdef"; + beforeEach(() => { + (saveToIPFS as jest.Mock).mockResolvedValue(ipfsHash); + }); + + it("sets round contract deployment status to in progress when round contract is being deployed", async () => { + (deployRoundContract as jest.Mock).mockReturnValue( + new Promise(() => { + /* do nothing.*/ + }) + ); + + renderWithProvider(); + invokeCreateRound(); + + expect( + await screen.findByTestId( + `round-deploying-status-is-${ProgressStatus.IN_PROGRESS}` + ) + ); + const firstCall = (deployRoundContract as jest.Mock).mock.calls[0]; + const roundParameter = firstCall[0]; + const actualRoundMetadataPointer = roundParameter.store; + expect(actualRoundMetadataPointer).toEqual({ + protocol: 1, + pointer: ipfsHash, + }); + const actualApplicationSchemaPointer = roundParameter.applicationStore; + expect(actualApplicationSchemaPointer).toEqual({ + protocol: 1, + pointer: ipfsHash, + }); + }); + + it("sets round contract deployment status to success when round contract has been deployed", async () => { + (deployRoundContract as jest.Mock).mockResolvedValue({}); + + renderWithProvider(); + invokeCreateRound(); + + expect( + await screen.findByTestId( + `round-deploying-status-is-${ProgressStatus.IS_SUCCESS}` + ) + ); + }); + }); + + describe("Set Indexing Status", () => { + const transactionBlockNumber = 10; + beforeEach(() => { + (saveToIPFS as jest.Mock).mockResolvedValue("bafabcdef"); + (deployRoundContract as jest.Mock).mockResolvedValue({ + transactionBlockNumber, + }); + }); + + it("sets indexing status to in progress when waiting for subgraph to index", async () => { + (waitForSubgraphSyncTo as jest.Mock).mockReturnValue( + new Promise(() => { + /* do nothing.*/ + }) + ); + + renderWithProvider(); + invokeCreateRound(); + + expect( + await screen.findByTestId( + `indexing-status-is-${ProgressStatus.IN_PROGRESS}` + ) + ); + }); + + it("sets indexing status to completed when subgraph is finished indexing", async () => { + (waitForSubgraphSyncTo as jest.Mock).mockResolvedValue( + transactionBlockNumber + ); + + renderWithProvider(); + invokeCreateRound(); + + expect( + await screen.findByTestId( + `indexing-status-is-${ProgressStatus.IS_SUCCESS}` + ) + ); + }); + }); + + describe("useCreateRound() Errors", () => { + let consoleErrorSpy: jest.SpyInstance; + + beforeEach(() => { + consoleErrorSpy = jest.spyOn(console, "error").mockImplementation(() => { + /* do nothing.*/ + }); + + // set up initial mocks for each internal function call + (saveToIPFS as jest.Mock).mockResolvedValue("asdf"); + (deployRoundContract as jest.Mock).mockResolvedValue({ + transactionBlockNumber: 100, + }); + (waitForSubgraphSyncTo as jest.Mock).mockResolvedValue(100); + }); + + afterEach(() => { + consoleErrorSpy.mockClear(); + }); + + it("sets ipfs status to error when ipfs save fails", async () => { + (saveToIPFS as jest.Mock).mockRejectedValue(new Error(":(")); + + renderWithProvider(); + invokeCreateRound(); + + expect( + await screen.findByTestId( + `storing-status-is-${ProgressStatus.IS_ERROR}` + ) + ).toBeInTheDocument(); + }); + + it("sets voting contract deployment status to error when voting deployment fails", async () => { + (deployRoundContract as jest.Mock).mockRejectedValue( + new Error("Failed to deploy :(") + ); + + renderWithProvider(); + invokeCreateRound(); + + expect( + await screen.findByTestId( + `voting-deploying-status-is-${ProgressStatus.IS_ERROR}` + ) + ).toBeInTheDocument(); + }); + + it("sets round contract deployment status to error when round deployment fails", async () => { + (deployRoundContract as jest.Mock).mockRejectedValue( + new Error("Failed to deploy :(") + ); + + renderWithProvider(); + invokeCreateRound(); + + expect( + await screen.findByTestId( + `round-deploying-status-is-${ProgressStatus.IS_ERROR}` + ) + ).toBeInTheDocument(); + }); + + it("sets indexing status to error when waiting for subgraph to sync fails", async () => { + (waitForSubgraphSyncTo as jest.Mock).mockRejectedValue(new Error(":(")); + + renderWithProvider(); + invokeCreateRound(); + + expect( + await screen.findByTestId( + `indexing-status-is-${ProgressStatus.IS_ERROR}` + ) + ).toBeInTheDocument(); + }); + + it("if ipfs save fails, resets ipfs status when create round is retried", async () => { + (saveToIPFS as jest.Mock) + .mockRejectedValueOnce(new Error(":(")) + .mockReturnValue( + new Promise(() => { + /* do nothing.*/ + }) + ); + + renderWithProvider(); + invokeCreateRound(); + + await screen.findByTestId(`storing-status-is-${ProgressStatus.IS_ERROR}`); + + // retry create-round operation + invokeCreateRound(); + + expect( + screen.queryByTestId(`storing-status-is-${ProgressStatus.IS_ERROR}`) + ).not.toBeInTheDocument(); + }); + + it("if voting contract deployment fails, resets voting contract deployment status when create round is retried", async () => { + (deployRoundContract as jest.Mock) + .mockRejectedValueOnce(new Error(":(")) + .mockReturnValue( + new Promise(() => { + /* do nothing.*/ + }) + ); + + renderWithProvider(); + invokeCreateRound(); + + await screen.findByTestId( + `voting-deploying-status-is-${ProgressStatus.IS_ERROR}` + ); + + invokeCreateRound(); + + expect( + screen.queryByTestId( + `voting-deploying-status-is-${ProgressStatus.IS_ERROR}` + ) + ).not.toBeInTheDocument(); + }); + + it("if round contract deployment fails, resets round contract deployment status when create round is retried", async () => { + (deployRoundContract as jest.Mock) + .mockRejectedValueOnce(new Error(":(")) + .mockReturnValue( + new Promise(() => { + /* do nothing.*/ + }) + ); + + renderWithProvider(); + invokeCreateRound(); + + await screen.findByTestId( + `round-deploying-status-is-${ProgressStatus.IS_ERROR}` + ); + + invokeCreateRound(); + + expect( + screen.queryByTestId( + `round-deploying-status-is-${ProgressStatus.IS_ERROR}` + ) + ).not.toBeInTheDocument(); + }); + + it("if indexing fails, resets indexing status when create round is retried", async () => { + (waitForSubgraphSyncTo as jest.Mock) + .mockRejectedValueOnce(new Error(":(")) + .mockReturnValue( + new Promise(() => { + /* do nothing.*/ + }) + ); + + renderWithProvider(); + invokeCreateRound(); + + await screen.findByTestId( + `indexing-status-is-${ProgressStatus.IS_ERROR}` + ); + + invokeCreateRound(); + + expect( + screen.queryByTestId(`indexing-status-is-${ProgressStatus.IS_ERROR}`) + ).not.toBeInTheDocument(); + }); + }); +}); + +const TestUseCreateRoundComponent = () => { + const { + createRound, + IPFSCurrentStatus, + votingContractDeploymentStatus, + payoutContractDeploymentStatus, + roundContractDeploymentStatus, + indexingStatus, + } = useCreateRound(); + + return ( +
+ + +
+ +
+ +
+ +
+ +
+
+ ); +}; + +function renderWithProvider(ui: JSX.Element) { + render({ui}); +} diff --git a/packages/round-manager/src/features/api/deployments.ts b/packages/round-manager/src/features/api/deployments.ts deleted file mode 100644 index 3897eef0f5..0000000000 --- a/packages/round-manager/src/features/api/deployments.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { ChainId } from "common"; - -export const chains = { - 1: "mainnet", - 10: "optimism", - 11155111: "sepolia", - 250: "fantom", - 280: "zkSyncEraTestnet", - 324: "zkSyncEraMainnet", - 424: "pgn", - 4002: "fantomTestnet", - 31337: "localhost", - 313371: "dev1", - 313372: "dev2", - 58008: "pgnTestnet", - 42161: "arbitrum", - 421613: "arbitrumGoerli", - 43114: "avalanche", - 43113: "fuji", - 137: "polygon", - 80001: "polygonMumbai", - 8453: "base", -} as const; - -export type ChainName = (typeof chains)[keyof typeof chains]; - -export type DeploymentAddress = { - [key in ChainName]: { - projectRegistry: string | undefined; - }; -}; - -type DeploymentAddresses = { - projectRegistry: string | undefined; -}; - -export type DeploymentAddressesMap = { - [key in ChainName]: DeploymentAddresses; -}; - -export const addresses: DeploymentAddressesMap = { - dev1: { - projectRegistry: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - }, - dev2: { - projectRegistry: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - }, - localhost: { - projectRegistry: "0x832c5391dc7931312CbdBc1046669c9c3A4A28d5", - }, - optimism: { - projectRegistry: "0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174", - }, - mainnet: { - projectRegistry: "0x03506eD3f57892C85DB20C36846e9c808aFe9ef4", - }, - fantomTestnet: { - projectRegistry: "0x984749e408FF0446d8ADaf20E293F2F299396631", - }, - fantom: { - projectRegistry: "0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174", - }, - pgn: { - projectRegistry: "0xDF9BF58Aa1A1B73F0e214d79C652a7dd37a6074e", - }, - pgnTestnet: { - projectRegistry: "0x6294bed5B884Ae18bf737793Ef9415069Bf4bc11", - }, - arbitrum: { - projectRegistry: "0x73AB205af1476Dc22104A6B8b3d4c273B58C6E27", - }, - arbitrumGoerli: { - projectRegistry: "0x0CD135777dEaB6D0Bb150bDB0592aC9Baa4d0871", - }, - avalanche: { - projectRegistry: "0xDF9BF58Aa1A1B73F0e214d79C652a7dd37a6074e", - }, - fuji: { - projectRegistry: "0x8918401DD47f1645fF1111D8E513c0404b84d5bB", - }, - polygon: { - projectRegistry: "0x5C5E2D94b107C7691B08E43169fDe76EAAB6D48b", - }, - polygonMumbai: { - projectRegistry: "0x545B282A50EaeA01A619914d44105437036CbB36", - }, - zkSyncEraMainnet: { - projectRegistry: "0xe6CCEe93c97E20644431647B306F48e278aFFdb9", - }, - zkSyncEraTestnet: { - projectRegistry: "0xb0F4882184EB6e3ed120c5181651D50719329788", - }, - base: { - projectRegistry: "0xA78Daa89fE9C1eC66c5cB1c5833bC8C6Cb307918", - }, - sepolia: { - projectRegistry: "0x2420EABfA2C0e6f77E435B0B7615c848bF4963AF", - }, -}; - -export const addressesByChainID = (chainId: ChainId): DeploymentAddresses => { - const chainName = chains[chainId]; - return addresses[chainName]; -}; diff --git a/packages/round-manager/src/features/api/payoutTokens.ts b/packages/round-manager/src/features/api/payoutTokens.ts index 90edb493b6..15a563a13a 100644 --- a/packages/round-manager/src/features/api/payoutTokens.ts +++ b/packages/round-manager/src/features/api/payoutTokens.ts @@ -1,7 +1,6 @@ -import { ChainId } from "common"; +import { ChainId, RedstoneTokenIds } from "common"; import { ethers } from "ethers"; import { Address } from "wagmi"; -import { RedstoneTokenIds } from "common/src/chain-ids"; export type PayoutToken = { name: string; diff --git a/packages/round-manager/src/features/api/round.ts b/packages/round-manager/src/features/api/round.ts index a27de4db4b..c551c4772f 100644 --- a/packages/round-manager/src/features/api/round.ts +++ b/packages/round-manager/src/features/api/round.ts @@ -346,10 +346,6 @@ export async function listRounds( fetchFromIPFS(round.applicationMetaPtr.pointer), ]); - if (round.roles.length === 0) { - continue; - } - const operatorWallets = round.roles[0].accounts.map( (account: { address: string }) => account.address ); diff --git a/packages/round-manager/src/features/common/__tests__/AddQuestionModal.test.tsx b/packages/round-manager/src/features/common/__tests__/AddQuestionModal.test.tsx index 5379b4821f..7f4e0f1da8 100644 --- a/packages/round-manager/src/features/common/__tests__/AddQuestionModal.test.tsx +++ b/packages/round-manager/src/features/common/__tests__/AddQuestionModal.test.tsx @@ -1,5 +1,10 @@ import { fireEvent, render, screen } from "@testing-library/react"; import { MemoryRouter } from "react-router-dom"; +import { + CreateRoundContext, + CreateRoundState, + initialCreateRoundState, +} from "../../../context/round/CreateRoundContext"; import { EditQuestion } from "../../api/types"; import AddQuestionModal from "../AddQuestionModal"; @@ -106,5 +111,16 @@ describe("AddQuestionModal", () => { }); }); -export const renderWithContext = (ui: JSX.Element) => - render({ui}); +export const renderWithContext = ( + ui: JSX.Element, + createRoundStateOverrides: Partial = {} +) => + render( + + + {ui} + + + ); diff --git a/packages/round-manager/src/features/round/RoundApplicationForm.tsx b/packages/round-manager/src/features/round/RoundApplicationForm.tsx index 2ab428de5c..3595b01958 100644 --- a/packages/round-manager/src/features/round/RoundApplicationForm.tsx +++ b/packages/round-manager/src/features/round/RoundApplicationForm.tsx @@ -8,14 +8,10 @@ import { import { PencilIcon, PlusSmIcon, XIcon } from "@heroicons/react/solid"; import { Button } from "common/src/styles"; import { useContext, useEffect, useState } from "react"; -import { - DeepRequired, - SubmitHandler, - useFieldArray, - useForm, -} from "react-hook-form"; +import { SubmitHandler, useFieldArray, useForm } from "react-hook-form"; import { NavigateFunction, useLocation, useNavigate } from "react-router-dom"; import { errorModalDelayMs } from "../../constants"; +import { useCreateRound } from "../../context/round/CreateRoundContext"; import { ApplicationMetadata, EditQuestion, @@ -39,10 +35,6 @@ import { InputIcon } from "../common/InputIcon"; import PreviewQuestionModal from "../common/PreviewQuestionModal"; import ProgressModal from "../common/ProgressModal"; import _ from "lodash"; -import { useCreateRoundStore } from "../../stores/createRoundStore"; -import { useAllo } from "common"; -import { getAddress } from "viem"; -import { useWallet } from "../common/Auth"; export const initialQuestionsQF: SchemaQuestion[] = [ { @@ -185,7 +177,6 @@ export function RoundApplicationForm(props: { const [openPreviewModal, setOpenPreviewModal] = useState(false); const [openAddQuestionModal, setOpenAddQuestionModal] = useState(false); const [toEdit, setToEdit] = useState(); - const { signer: walletSigner } = useWallet(); const { currentStep, setCurrentStep, stepsCount, formData } = useContext(FormContext); @@ -209,7 +200,8 @@ export function RoundApplicationForm(props: { ? initialQuestionsQF : initialQuestionsDirect; - const { control, handleSubmit } = useForm({ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { control, handleSubmit, register, getValues } = useForm({ defaultValues: { ...formData, applicationMetadata: { @@ -223,47 +215,47 @@ export function RoundApplicationForm(props: { control, }); + // eslint-disable-next-line @typescript-eslint/no-unused-vars const [projectRequirements, setProjectRequirements] = useState({ ...initialRequirements }); const { createRound, - clearStatuses, - ipfsStatus, - contractDeploymentStatus, + IPFSCurrentStatus, + votingContractDeploymentStatus, + payoutContractDeploymentStatus, + roundContractDeploymentStatus, indexingStatus, - } = useCreateRoundStore(); + } = useCreateRound(); - /** Upon succesful creation of round, redirect to program details */ useEffect(() => { const isSuccess = - ipfsStatus === ProgressStatus.IS_SUCCESS && - contractDeploymentStatus === ProgressStatus.IS_SUCCESS && + IPFSCurrentStatus === ProgressStatus.IS_SUCCESS && + votingContractDeploymentStatus === ProgressStatus.IS_SUCCESS && + payoutContractDeploymentStatus === ProgressStatus.IS_SUCCESS && + roundContractDeploymentStatus === ProgressStatus.IS_SUCCESS && indexingStatus === ProgressStatus.IS_SUCCESS; if (isSuccess) { redirectToProgramDetails(navigate, 2000, programId); - /* Clear the store progress statuses in order to not redirect when creating another round */ - /*The delay is to prevent clearing the statuses before the user is redirected */ - setTimeout(() => { - clearStatuses(); - }, 3_000); } }, [ - contractDeploymentStatus, - ipfsStatus, + IPFSCurrentStatus, + votingContractDeploymentStatus, + payoutContractDeploymentStatus, + roundContractDeploymentStatus, indexingStatus, programId, navigate, roundCategory, - clearStatuses, ]); - /** If there's an error, show an error dialog and redirect back to program */ useEffect(() => { if ( - ipfsStatus === ProgressStatus.IS_ERROR || - contractDeploymentStatus === ProgressStatus.IS_ERROR + IPFSCurrentStatus === ProgressStatus.IS_ERROR || + votingContractDeploymentStatus === ProgressStatus.IS_ERROR || + payoutContractDeploymentStatus === ProgressStatus.IS_ERROR || + roundContractDeploymentStatus === ProgressStatus.IS_ERROR ) { setTimeout(() => { setOpenErrorModal(true); @@ -274,26 +266,26 @@ export function RoundApplicationForm(props: { redirectToProgramDetails(navigate, 5000, programId); } }, [ - contractDeploymentStatus, + IPFSCurrentStatus, + votingContractDeploymentStatus, + payoutContractDeploymentStatus, + roundContractDeploymentStatus, indexingStatus, - ipfsStatus, navigate, programId, ]); const prev = () => setCurrentStep(currentStep - 1); - const allo = useAllo(); - const next: SubmitHandler = async (values) => { try { setOpenProgressModal(true); - const data = _.merge(formData, values); + const data: Partial = _.merge(formData, values); - const roundMetadataWithProgramContractAddress = { + const roundMetadataWithProgramContractAddress: Round["roundMetadata"] = { ...(data.roundMetadata as Round["roundMetadata"]), programContractAddress: programId, - } as DeepRequired; + }; const applicationQuestions = { lastUpdatedOn: Date.now(), @@ -308,25 +300,13 @@ export function RoundApplicationForm(props: { ...data, ownedBy: programId, operatorWallets: props.initialData.program.operatorWallets, - } as DeepRequired; - - await createRound(allo, { - roundData: { - roundCategory: roundCategory, - roundMetadataWithProgramContractAddress, - applicationQuestions, - roundStartTime: round.roundStartTime, - roundEndTime: round.roundEndTime, - applicationsStartTime: round.applicationsStartTime, - applicationsEndTime: round.applicationsEndTime, - token: round.token, - matchingFundsAvailable: - round.roundMetadata.quadraticFundingConfig - ?.matchingFundsAvailable ?? 0, - roundOperators: round.operatorWallets.map(getAddress), - }, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - walletSigner: walletSigner!, + } as Round; + + await createRound({ + roundMetadataWithProgramContractAddress, + applicationQuestions, + round, + roundCategory, }); } catch (error) { datadogLogs.logger.error( @@ -340,12 +320,22 @@ export function RoundApplicationForm(props: { { name: "Storing", description: "The metadata is being saved in a safe place.", - status: ipfsStatus, + status: IPFSCurrentStatus, + }, + { + name: "Deploying", + description: "The voting contract is being deployed.", + status: votingContractDeploymentStatus, + }, + { + name: "Deploying", + description: "The payout contract is being deployed.", + status: payoutContractDeploymentStatus, }, { name: "Deploying", description: "The round contract is being deployed.", - status: contractDeploymentStatus, + status: roundContractDeploymentStatus, }, { name: "Indexing", @@ -363,8 +353,10 @@ export function RoundApplicationForm(props: { ]; const disableNext: boolean = - ipfsStatus === ProgressStatus.IN_PROGRESS || - contractDeploymentStatus === ProgressStatus.IN_PROGRESS || + IPFSCurrentStatus === ProgressStatus.IN_PROGRESS || + votingContractDeploymentStatus === ProgressStatus.IN_PROGRESS || + payoutContractDeploymentStatus === ProgressStatus.IN_PROGRESS || + roundContractDeploymentStatus === ProgressStatus.IN_PROGRESS || indexingStatus === ProgressStatus.IN_PROGRESS || indexingStatus === ProgressStatus.IS_SUCCESS || !props.initialData.program; @@ -373,7 +365,7 @@ export function RoundApplicationForm(props: { data: [ keyof ProjectRequirements, keyof ProjectRequirements[keyof ProjectRequirements], - boolean, + boolean ][] ) => { let tmpRequirements = { ...projectRequirements }; @@ -584,7 +576,7 @@ const ProjectSocials = ({ data: [ keyof ProjectRequirements, keyof ProjectRequirements[keyof ProjectRequirements], - boolean, + boolean ][] ) => void; requirements: ProjectRequirements; diff --git a/packages/round-manager/src/features/round/__tests__/RoundApplicationForm.test.tsx b/packages/round-manager/src/features/round/__tests__/RoundApplicationForm.test.tsx index 27a627415f..bdfb028e7c 100644 --- a/packages/round-manager/src/features/round/__tests__/RoundApplicationForm.test.tsx +++ b/packages/round-manager/src/features/round/__tests__/RoundApplicationForm.test.tsx @@ -9,7 +9,11 @@ import { import { randomInt } from "crypto"; import { act } from "react-dom/test-utils"; import { MemoryRouter } from "react-router-dom"; - +import { + CreateRoundContext, + CreateRoundState, + initialCreateRoundState, +} from "../../../context/round/CreateRoundContext"; import { saveToIPFS } from "../../api/ipfs"; import { deployRoundContract } from "../../api/round"; import { waitForSubgraphSyncTo } from "../../api/subgraph"; @@ -22,11 +26,10 @@ import { useWallet } from "../../common/Auth"; import { FormStepper } from "../../common/FormStepper"; import { FormContext } from "../../common/FormWizard"; import { - initialQuestionsQF, RoundApplicationForm, + initialQuestionsQF, } from "../RoundApplicationForm"; import { errorModalDelayMs } from "../../../constants"; -import { useCreateRoundStore } from "../../../stores/createRoundStore"; jest.mock("../../api/ipfs"); jest.mock("../../api/round"); @@ -36,32 +39,12 @@ jest.mock("../../api/payoutStrategy/payoutStrategy"); jest.mock("@rainbow-me/rainbowkit", () => ({ ConnectButton: jest.fn(), })); -jest.mock("wagmi", () => ({ - useNetwork: () => ({ - chain: jest.fn(), - chains: [ - { - id: 10, - name: "Optimism", - }, - ], - }), - useProvider: () => ({}), -})); + jest.mock("../../../constants", () => ({ ...jest.requireActual("../../../constants"), errorModalDelayMs: 0, // NB: use smaller delay for faster tests })); -jest.mock("common", () => ({ - ...jest.requireActual("common"), - useAllo: () => ({}), -})); - -jest.mock("../../../stores/createRoundStore", () => ({ - ...jest.requireActual("../../../stores/createRoundStore"), -})); - beforeEach(() => { jest.setTimeout(10000); jest.clearAllMocks(); @@ -109,12 +92,10 @@ describe("", () => { }} stepper={FormStepper} configuration={{ roundCategory: RoundCategory.QuadraticFunding }} - /> + />, + { IPFSCurrentStatus: ProgressStatus.IS_ERROR } ); await startProgressModal(); - useCreateRoundStore.setState({ - ipfsStatus: ProgressStatus.IS_ERROR, - }); await waitFor( async () => expect(await screen.findByTestId("error-modal")).toBeInTheDocument(), @@ -132,12 +113,10 @@ describe("", () => { }, }} stepper={FormStepper} - /> + />, + { IPFSCurrentStatus: ProgressStatus.IS_ERROR } ); await startProgressModal(); - useCreateRoundStore.setState({ - ipfsStatus: ProgressStatus.IS_ERROR, - }); const done = await screen.findByTestId("done"); fireEvent.click(done); @@ -155,27 +134,37 @@ describe("", () => { }, }} stepper={FormStepper} - /> + />, + { IPFSCurrentStatus: ProgressStatus.IS_ERROR } ); await startProgressModal(); - useCreateRoundStore.setState({ - ipfsStatus: ProgressStatus.IS_ERROR, - }); await waitFor( async () => expect(await screen.findByTestId("error-modal")).toBeInTheDocument(), { timeout: errorModalDelayMs + 1000 } ); + const saveToIpfsCalls = (saveToIPFS as jest.Mock).mock.calls.length; + expect(saveToIpfsCalls).toEqual(2); const errorModalTryAgain = await screen.findByTestId("tryAgain"); fireEvent.click(errorModalTryAgain); expect(screen.queryByTestId("error-modal")).not.toBeInTheDocument(); + await waitFor(() => { + expect((saveToIPFS as jest.Mock).mock.calls.length).toEqual( + saveToIpfsCalls + 2 + ); + }); }); }); describe("when saving round application metadata succeeds but create round transaction fails", () => { + const createRoundStateOverride = { + IPFSCurrentStatus: ProgressStatus.IS_SUCCESS, + roundContractDeploymentStatus: ProgressStatus.IS_ERROR, + }; + const startProgressModal = async () => { const launch = screen.getByRole("button", { name: /Launch/i }); fireEvent.click(launch); @@ -191,13 +180,10 @@ describe("", () => { }, }} stepper={FormStepper} - /> + />, + createRoundStateOverride ); await startProgressModal(); - useCreateRoundStore.setState({ - ipfsStatus: ProgressStatus.IS_SUCCESS, - contractDeploymentStatus: ProgressStatus.IS_ERROR, - }); await waitFor( async () => expect(await screen.findByTestId("error-modal")).toBeInTheDocument(), @@ -876,5 +862,16 @@ describe("Application Form Builder", () => { }); }); -export const renderWithContext = (ui: JSX.Element) => - render({ui}); +export const renderWithContext = ( + ui: JSX.Element, + createRoundStateOverrides: Partial = {} +) => + render( + + + {ui} + + + ); diff --git a/packages/round-manager/src/index.tsx b/packages/round-manager/src/index.tsx index b44a1857b4..56317659a8 100644 --- a/packages/round-manager/src/index.tsx +++ b/packages/round-manager/src/index.tsx @@ -18,6 +18,7 @@ import { ApplicationProvider } from "./context/application/ApplicationContext"; import { BulkUpdateGrantApplicationProvider } from "./context/application/BulkUpdateGrantApplicationContext"; import { CreateProgramProvider } from "./context/program/CreateProgramContext"; import { ReadProgramProvider } from "./context/program/ReadProgramContext"; +import { CreateRoundProvider } from "./context/round/CreateRoundContext"; import { FinalizeRoundProvider } from "./context/round/FinalizeRoundContext"; import { FundContractProvider } from "./context/round/FundContractContext"; import { ReclaimFundsProvider } from "./context/round/ReclaimFundsContext"; @@ -33,7 +34,6 @@ import ViewApplication from "./features/round/ViewApplicationPage"; import ViewRoundPage from "./features/round/ViewRoundPage"; import { initSentry } from "./sentry"; import { UpdateRoundProvider } from "./context/round/UpdateRoundContext"; -import AlloWrapper from "./features/api/AlloWrapper"; import { DataLayer, DataLayerProvider } from "data-layer"; import { getConfig } from "common/src/config"; @@ -69,94 +69,94 @@ root.render( - - - - - {/* Protected Routes */} - }> - {/* Default Route */} - - - - } - /> + + + + {/* Protected Routes */} + }> + {/* Default Route */} + + + + } + /> - {/* Round Routes */} - + {/* Round Routes */} + + - - } - /> - - - - - - - - - - - - - - - - } - /> - - - - - - - - } - /> + + + } + /> + + + + + + + + + + + + + + + + } + /> + + + + + + + + } + /> - {/* Program Routes */} - - - - } - /> - - - - - - } - /> + {/* Program Routes */} + + + + } + /> + + + + + + } + /> - {/* Access Denied */} - } /> + {/* Access Denied */} + } /> - {/* 404 */} - } /> - - - - - + {/* 404 */} + } /> + + + + diff --git a/packages/round-manager/src/stores/createRoundStore.ts b/packages/round-manager/src/stores/createRoundStore.ts deleted file mode 100644 index 58a486358a..0000000000 --- a/packages/round-manager/src/stores/createRoundStore.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { create } from "zustand"; -import { ProgressStatus } from "../features/api/types"; -import { Address } from "viem"; -import { Allo } from "common"; -import { error, Result } from "common/src/allo/common"; - -import { CreateRoundArguments } from "common/dist/allo/allo"; - -export type CreateRoundStoreState = { - ipfsStatus: ProgressStatus; - contractDeploymentStatus: ProgressStatus; - indexingStatus: ProgressStatus; - round: Address | undefined; - createRound: ( - allo: Allo, - createRoundData: CreateRoundArguments - ) => Promise< - Result<{ - roundId: Address; - }> - >; - clearStatuses: () => void; -}; - -export const useCreateRoundStore = create((set) => ({ - ipfsStatus: ProgressStatus.NOT_STARTED, - contractDeploymentStatus: ProgressStatus.NOT_STARTED, - indexingStatus: ProgressStatus.NOT_STARTED, - clearStatuses: () => { - set({ - indexingStatus: ProgressStatus.NOT_STARTED, - contractDeploymentStatus: ProgressStatus.NOT_STARTED, - ipfsStatus: ProgressStatus.NOT_STARTED, - }); - }, - round: undefined, - createRound: async (allo: Allo, createRoundData: CreateRoundArguments) => { - set({ - indexingStatus: ProgressStatus.NOT_STARTED, - contractDeploymentStatus: ProgressStatus.NOT_STARTED, - ipfsStatus: ProgressStatus.IN_PROGRESS, - }); - - try { - const round = await allo - .createRound(createRoundData) - .on("ipfsStatus", (res) => { - if (res.type === "success") { - set({ - ipfsStatus: ProgressStatus.IS_SUCCESS, - contractDeploymentStatus: ProgressStatus.IN_PROGRESS, - }); - } else { - set({ - ipfsStatus: ProgressStatus.IS_ERROR, - }); - } - }) - .on("indexingStatus", (res) => { - if (res.type === "success") { - set({ - indexingStatus: ProgressStatus.IS_SUCCESS, - }); - } else { - set({ - indexingStatus: ProgressStatus.IS_ERROR, - }); - } - }) - .on("transaction", (res) => { - if (res.type === "success") { - set({ - contractDeploymentStatus: ProgressStatus.IS_SUCCESS, - indexingStatus: ProgressStatus.IN_PROGRESS, - }); - } else { - set({ - contractDeploymentStatus: ProgressStatus.IS_ERROR, - }); - } - }) - .on("transactionStatus", (res) => { - if (res.type === "success") { - set({ - contractDeploymentStatus: ProgressStatus.IS_SUCCESS, - }); - } else { - set({ - contractDeploymentStatus: ProgressStatus.IS_ERROR, - }); - } - }) - .execute(); - - if (round.type === "success") { - set({ - round: round.value.roundId, - }); - } - - return round; - } catch (e) { - set({ - indexingStatus: ProgressStatus.IS_ERROR, - contractDeploymentStatus: ProgressStatus.IS_ERROR, - ipfsStatus: ProgressStatus.IS_ERROR, - }); - - return error(e as Error); - } - }, -})); diff --git a/packages/round-manager/tsconfig.json b/packages/round-manager/tsconfig.json index afd45ce8e3..1f12de49a6 100644 --- a/packages/round-manager/tsconfig.json +++ b/packages/round-manager/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es2020", + "target": "es5", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aedefdd219..c8741acc43 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,9 +1,5 @@ lockfileVersion: '6.0' -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - overrides: webpack: ^5 @@ -62,7 +58,7 @@ importers: version: 0.2.0 '@gitcoinco/passport-sdk-verifier': specifier: ^0.2.2 - version: 0.2.2(debug@4.3.4) + version: 0.2.2 '@headlessui/react': specifier: ^1.6.5 version: 1.7.17(react-dom@18.2.0)(react@18.2.0) @@ -140,7 +136,7 @@ importers: version: 10.4.15(postcss@8.4.29) axios: specifier: ^0.27.2 - version: 0.27.2(debug@4.3.4) + version: 0.27.2 buffer: specifier: ^6.0.3 version: 6.0.3 @@ -152,7 +148,7 @@ importers: version: link:../common craco-esbuild: specifier: ^0.5.2 - version: 0.5.2(@craco/craco@7.1.0)(esbuild@0.18.20)(react-scripts@5.0.1)(webpack@5.88.2) + version: 0.5.2(@craco/craco@7.1.0)(react-scripts@5.0.1) crypto-browserify: specifier: ^3.12.0 version: 3.12.0 @@ -179,7 +175,7 @@ importers: version: 1.0.0 jest: specifier: ^27.0 - version: 27.5.1(ts-node@10.9.1) + version: 27.5.1 os-browserify: specifier: ^0.3.0 version: 0.3.0 @@ -215,7 +211,7 @@ importers: version: 6.15.0(react-dom@18.2.0)(react@18.2.0) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(esbuild@0.18.20)(eslint@8.48.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.3.3) + version: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0)(react@18.2.0)(typescript@5.3.3) redux: specifier: ^4.2.1 version: 4.2.1 @@ -230,13 +226,13 @@ importers: version: 3.2.0 tailwindcss: specifier: ^3.0.24 - version: 3.3.3(ts-node@10.9.1) + version: 3.3.3 ts-debounce: specifier: ^4.0.0 version: 4.0.0 ts-jest: specifier: ^27.0 - version: 27.1.5(@babel/core@7.22.15)(@types/jest@27.5.2)(esbuild@0.18.20)(jest@27.5.1)(typescript@5.3.3) + version: 27.1.5(@babel/core@7.22.15)(@types/jest@27.5.2)(jest@27.5.1)(typescript@5.3.3) typescript: specifier: ^5.3.3 version: 5.3.3 @@ -337,15 +333,12 @@ importers: '@allo-team/allo-v2-sdk': specifier: ^1.0.38 version: 1.0.39(typescript@5.3.3)(zod@3.22.4) - '@ethersproject/abstract-signer': - specifier: ^5.7.0 - version: 5.7.0 '@ethersproject/providers': specifier: ^5.7.2 - version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + version: 5.7.2 '@rainbow-me/rainbowkit': specifier: ^0.12.16 - version: 0.12.16(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(wagmi@0.12.19) + version: 0.12.16(@types/react@18.2.21)(ethers@5.7.2)(react@18.2.0)(wagmi@0.12.19) '@wagmi/chains': specifier: ^1.8.0 version: 1.8.0(typescript@5.3.3) @@ -363,7 +356,7 @@ importers: version: 5.7.2 framer-motion: specifier: ^10.12.7 - version: 10.16.4(react-dom@18.2.0)(react@18.2.0) + version: 10.16.4(react@18.2.0) markdown-it: specifier: ^13.0.1 version: 13.0.1 @@ -378,13 +371,13 @@ importers: version: 6.15.0(react@18.2.0) react-router-dom: specifier: ^6.11.1 - version: 6.15.0(react-dom@18.2.0)(react@18.2.0) + version: 6.15.0(react@18.2.0) swr: specifier: ^2.0.1 version: 2.2.2(react@18.2.0) tailwind-styled-components: specifier: ^2.2.0 - version: 2.2.0(react-dom@18.2.0)(react@18.2.0) + version: 2.2.0(react@18.2.0) tiny-emitter: specifier: ^2.1.0 version: 2.1.0 @@ -396,7 +389,7 @@ importers: version: 1.10.7(typescript@5.3.3)(zod@3.22.4) wagmi: specifier: 0.12.19 - version: 0.12.19(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(zod@3.22.4) + version: 0.12.19(@types/react@18.2.21)(ethers@5.7.2)(react@18.2.0)(typescript@5.3.3)(zod@3.22.4) zod: specifier: ^3.22.4 version: 3.22.4 @@ -442,7 +435,7 @@ importers: version: 3.3.0 graphql-request: specifier: ^6.1.0 - version: 6.1.0(graphql@16.8.0) + version: 6.1.0 knuth-shuffle-seeded: specifier: ^1.0.6 version: 1.0.6 @@ -566,7 +559,7 @@ importers: version: 2.8.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.21)(framer-motion@10.16.4)(react-dom@18.2.0)(react@18.2.0) '@craco/craco': specifier: ^7.1.0 - version: 7.1.0(@types/node@17.0.45)(postcss@8.4.29)(react-scripts@5.0.1)(typescript@5.2.2) + version: 7.1.0(@types/node@17.0.45)(postcss@8.4.29)(typescript@5.2.2) '@datadog/browser-logs': specifier: ^4.19.0 version: 4.48.1(@datadog/browser-rum@4.48.1) @@ -584,10 +577,10 @@ importers: version: 5.7.0 '@ethersproject/providers': specifier: ^5.7.2 - version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + version: 5.7.2 '@gitcoinco/passport-sdk-verifier': specifier: ^0.2.2 - version: 0.2.2(debug@4.3.4) + version: 0.2.2 '@headlessui/react': specifier: ^1.7.4 version: 1.7.17(react-dom@18.2.0)(react@18.2.0) @@ -644,7 +637,7 @@ importers: version: github.com/gitcoinco/allo-indexer-client/2f8dcdf1f1611e0efd0f48aa8aa426b78d9e8508 babel-loader: specifier: ^8.3.0 - version: 8.3.0(@babel/core@7.22.15)(webpack@5.88.2) + version: 8.3.0(@babel/core@7.22.15) buffer: specifier: ^6.0.3 version: 6.0.3 @@ -653,7 +646,7 @@ importers: version: link:../common craco-esbuild: specifier: ^0.5.2 - version: 0.5.2(@craco/craco@7.1.0)(esbuild@0.18.20)(react-scripts@5.0.1)(webpack@5.88.2) + version: 0.5.2(@craco/craco@7.1.0) crypto-browserify: specifier: ^3.12.0 version: 3.12.0 @@ -858,7 +851,7 @@ importers: version: 2.2.0(react-dom@18.2.0)(react@18.2.0) tailwindcss: specifier: ^3.0.24 - version: 3.3.3(ts-node@10.9.1) + version: 3.3.3 ts-unused-exports: specifier: ^10.0.1 version: 10.0.1(typescript@5.2.2) @@ -894,7 +887,7 @@ importers: version: 5.7.0 '@ethersproject/providers': specifier: ^5.7.2 - version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + version: 5.7.2 '@gitcoinco/passport-sdk-verifier': specifier: ^0.1.2 version: 0.1.2 @@ -911,8 +904,8 @@ importers: specifier: ^1.0.2 version: 1.0.5 '@rainbow-me/rainbowkit': - specifier: 0.12.18 - version: 0.12.18(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(wagmi@0.12.18) + specifier: 0.12.16 + version: 0.12.16(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(wagmi@0.12.18) '@reduxjs/toolkit': specifier: ^1.8.1 version: 1.9.5(react-redux@8.1.2)(react@18.2.0) @@ -945,7 +938,7 @@ importers: version: 13.4.0(react-dom@18.2.0)(react@18.2.0) '@testing-library/user-event': specifier: ^14.1.1 - version: 14.4.3(@testing-library/dom@9.3.1) + version: 14.4.3 '@types/jest': specifier: ^27.4.1 version: 27.5.2 @@ -1044,7 +1037,7 @@ importers: version: 6.15.0(react-dom@18.2.0)(react@18.2.0) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(esbuild@0.18.20)(eslint@8.50.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.3.3) + version: 5.0.1(react@18.2.0)(typescript@5.3.3) react-tooltip: specifier: ^4.4.2 version: 4.5.1(react-dom@18.2.0)(react@18.2.0) @@ -1075,9 +1068,6 @@ importers: verify-env: specifier: '*' version: link:../verify-env - viem: - specifier: ^2.5.0 - version: 2.7.1(typescript@5.3.3) wagmi: specifier: 0.12.18 version: 0.12.18(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) @@ -1087,9 +1077,6 @@ importers: yup: specifier: ^0.32.11 version: 0.32.11 - zustand: - specifier: ^4.4.0 - version: 4.4.1(@types/react@18.2.21)(react@18.2.0) devDependencies: '@faker-js/faker': specifier: ^7.4.0 @@ -1102,7 +1089,7 @@ importers: version: 0.4.4(tailwindcss@3.3.3) '@typechain/ethers-v5': specifier: 10.2.0 - version: 10.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.3.3) + version: 10.2.0(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.3.3) '@types/lodash': specifier: ^4.14.192 version: 4.14.198 @@ -1126,7 +1113,10 @@ importers: version: 10.4.15(postcss@8.4.29) craco-esbuild: specifier: ^0.5.2 - version: 0.5.2(@craco/craco@7.1.0)(esbuild@0.18.20)(react-scripts@5.0.1)(webpack@5.88.2) + version: 0.5.2(@craco/craco@7.1.0)(react-scripts@5.0.1) + husky: + specifier: ^8.0.1 + version: 8.0.3 postcss: specifier: ^8.4.14 version: 8.4.29 @@ -1138,7 +1128,7 @@ importers: version: 2.1.6(react-dom@18.2.0)(react@18.2.0) tailwindcss: specifier: ^3.0.24 - version: 3.3.3(ts-node@10.9.1) + version: 3.3.3 typechain: specifier: ^8.2.0 version: 8.3.1(typescript@5.3.3) @@ -1163,7 +1153,7 @@ importers: version: 5.2.2 vitest: specifier: ^0.34.2 - version: 0.34.3(happy-dom@11.0.2) + version: 0.34.3 packages: @@ -1255,7 +1245,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/eslint-parser@7.22.15(@babel/core@7.22.15)(eslint@8.48.0): + /@babel/eslint-parser@7.22.15(@babel/core@7.22.15): resolution: {integrity: sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: @@ -1264,11 +1254,11 @@ packages: dependencies: '@babel/core': 7.22.15 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.48.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 + dev: false - /@babel/eslint-parser@7.22.15(@babel/core@7.22.15)(eslint@8.50.0): + /@babel/eslint-parser@7.22.15(@babel/core@7.22.15)(eslint@8.48.0): resolution: {integrity: sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: @@ -1277,10 +1267,9 @@ packages: dependencies: '@babel/core': 7.22.15 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.50.0 + eslint: 8.48.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 - dev: false /@babel/generator@7.22.15: resolution: {integrity: sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==} @@ -4119,7 +4108,7 @@ packages: chalk: 4.1.2 dev: true - /@craco/craco@7.1.0(@types/node@17.0.45)(postcss@8.4.29)(react-scripts@5.0.1)(typescript@5.2.2): + /@craco/craco@7.1.0(@types/node@17.0.45)(postcss@8.4.29)(react-scripts@5.0.1)(typescript@5.3.3): resolution: {integrity: sha512-oRAcPIKYrfPXp9rSzlsDNeOaVtDiKhoyqSXUoqiK24jCkHr4T8m/a2f74yXIzCbIheoUWDOIfWZyRgFgT+cpqA==} engines: {node: '>=6'} hasBin: true @@ -4128,10 +4117,10 @@ packages: dependencies: autoprefixer: 10.4.15(postcss@8.4.29) cosmiconfig: 7.1.0 - cosmiconfig-typescript-loader: 1.0.9(@types/node@17.0.45)(cosmiconfig@7.1.0)(typescript@5.2.2) + cosmiconfig-typescript-loader: 1.0.9(@types/node@17.0.45)(typescript@5.3.3) cross-spawn: 7.0.3 lodash: 4.17.21 - react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(esbuild@0.18.20)(eslint@8.48.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.2.2) + react-scripts: 5.0.1(react@18.2.0)(typescript@5.3.3) semver: 7.5.4 webpack-merge: 5.9.0 transitivePeerDependencies: @@ -4142,7 +4131,7 @@ packages: - typescript dev: false - /@craco/craco@7.1.0(@types/node@17.0.45)(postcss@8.4.29)(react-scripts@5.0.1)(typescript@5.3.3): + /@craco/craco@7.1.0(@types/node@17.0.45)(postcss@8.4.29)(typescript@5.2.2): resolution: {integrity: sha512-oRAcPIKYrfPXp9rSzlsDNeOaVtDiKhoyqSXUoqiK24jCkHr4T8m/a2f74yXIzCbIheoUWDOIfWZyRgFgT+cpqA==} engines: {node: '>=6'} hasBin: true @@ -4151,10 +4140,9 @@ packages: dependencies: autoprefixer: 10.4.15(postcss@8.4.29) cosmiconfig: 7.1.0 - cosmiconfig-typescript-loader: 1.0.9(@types/node@17.0.45)(cosmiconfig@7.1.0)(typescript@5.3.3) + cosmiconfig-typescript-loader: 1.0.9(@types/node@17.0.45)(typescript@5.2.2) cross-spawn: 7.0.3 lodash: 4.17.21 - react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(esbuild@0.18.20)(eslint@8.50.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.3.3) semver: 7.5.4 webpack-merge: 5.9.0 transitivePeerDependencies: @@ -4174,10 +4162,10 @@ packages: dependencies: autoprefixer: 10.4.15(postcss@8.4.29) cosmiconfig: 7.1.0 - cosmiconfig-typescript-loader: 1.0.9(@types/node@18.17.14)(cosmiconfig@7.1.0)(typescript@5.3.3) + cosmiconfig-typescript-loader: 1.0.9(@types/node@18.17.14)(typescript@5.3.3) cross-spawn: 7.0.3 lodash: 4.17.21 - react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(esbuild@0.18.20)(eslint@8.48.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.3.3) + react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0)(react@18.2.0)(typescript@5.3.3) semver: 7.5.4 webpack-merge: 5.9.0 transitivePeerDependencies: @@ -4855,6 +4843,15 @@ packages: requiresBuild: true optional: true + /@eslint-community/eslint-utils@4.4.0: + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint-visitor-keys: 3.4.3 + dev: false + /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5056,6 +5053,33 @@ packages: dependencies: '@ethersproject/logger': 5.7.0 + /@ethersproject/providers@5.7.2: + resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + bech32: 1.1.4 + ws: 7.4.6 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + /@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} dependencies: @@ -5082,6 +5106,7 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: false /@ethersproject/random@5.7.0: resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} @@ -5196,6 +5221,15 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} dev: true + /@gitcoinco/passport-sdk-reader@0.1.4: + resolution: {integrity: sha512-MRZ+p3ZdBz7/7U7/+3/LnwU4nXMeWGwPWakvPLTXL0ys74jmIrn0b1j2uh0D8EsdstoAnksbO9wEBRED40wHAg==} + dependencies: + '@gitcoinco/passport-sdk-types': 0.2.0 + tulons: 0.0.7 + transitivePeerDependencies: + - debug + dev: false + /@gitcoinco/passport-sdk-reader@0.1.4(debug@4.3.4): resolution: {integrity: sha512-MRZ+p3ZdBz7/7U7/+3/LnwU4nXMeWGwPWakvPLTXL0ys74jmIrn0b1j2uh0D8EsdstoAnksbO9wEBRED40wHAg==} dependencies: @@ -5214,13 +5248,23 @@ packages: /@gitcoinco/passport-sdk-verifier@0.1.2: resolution: {integrity: sha512-VvIcnoQfV0Y4xhF3Ay9maUkuIbAZk4uaD0OQjXBJAnKZM1JtfWUqTo5OWHPb55CzKv1o4V14LGBpJOGqaQWHyg==} dependencies: - '@gitcoinco/passport-sdk-reader': 0.1.4(debug@4.3.4) + '@gitcoinco/passport-sdk-reader': 0.1.4 '@gitcoinco/passport-sdk-types': 0.1.2 '@spruceid/didkit-wasm': 0.2.1 transitivePeerDependencies: - debug dev: false + /@gitcoinco/passport-sdk-verifier@0.2.2: + resolution: {integrity: sha512-Z6drCRRKXV4QeO5a2zIyUAOB9RfiJhA/zICfmpQZkLOIFDuoctezMy0NM5s28Pbq4st74rcN7E3497sBRvTumQ==} + dependencies: + '@gitcoinco/passport-sdk-reader': 0.1.4 + '@gitcoinco/passport-sdk-types': 0.2.0 + '@spruceid/didkit-wasm': 0.3.0-alpha0 + transitivePeerDependencies: + - debug + dev: false + /@gitcoinco/passport-sdk-verifier@0.2.2(debug@4.3.4): resolution: {integrity: sha512-Z6drCRRKXV4QeO5a2zIyUAOB9RfiJhA/zICfmpQZkLOIFDuoctezMy0NM5s28Pbq4st74rcN7E3497sBRvTumQ==} dependencies: @@ -5231,12 +5275,10 @@ packages: - debug dev: false - /@graphql-typed-document-node/core@3.2.0(graphql@16.8.0): + /@graphql-typed-document-node/core@3.2.0: resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - dependencies: - graphql: 16.8.0 dev: false /@headlessui/react@1.7.17(react-dom@18.2.0)(react@18.2.0): @@ -5383,7 +5425,7 @@ packages: jest-util: 28.1.3 slash: 3.0.0 - /@jest/core@27.5.1(ts-node@10.9.1): + /@jest/core@27.5.1: resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: @@ -5404,7 +5446,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 27.5.1 - jest-config: 27.5.1(ts-node@10.9.1) + jest-config: 27.5.1 jest-haste-map: 27.5.1 jest-message-util: 27.5.1 jest-regex-util: 27.5.1 @@ -5659,7 +5701,7 @@ packages: deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. dependencies: '@json-rpc-tools/utils': 1.7.6 - axios: 0.21.4(debug@4.3.4) + axios: 0.21.4 safe-json-utils: 1.1.1 ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -6119,7 +6161,7 @@ packages: /@pinata/sdk@1.2.1: resolution: {integrity: sha512-z728bnPa9lhkKeFnpXqE8j8BXeel6iE35o53pjYjmDEHh01ZE5c4L62Ks7zd2/MuDqNaUWUtGm0tNrEiSwFXoQ==} dependencies: - axios: 0.21.4(debug@4.3.4) + axios: 0.21.4 base-path-converter: 1.0.2 form-data: 2.5.1 is-ipfs: 0.6.3 @@ -6155,7 +6197,7 @@ packages: react-refresh: '>=0.10.0 <1.0.0' sockjs-client: ^1.4.0 type-fest: '>=0.17.0 <5.0.0' - webpack: ^5 + webpack: '>=4.43.0 <6.0.0' webpack-dev-server: 3.x || 4.x webpack-hot-middleware: 2.x webpack-plugin-serve: 0.x || 1.x @@ -6183,7 +6225,7 @@ packages: react-refresh: 0.11.0 schema-utils: 3.3.0 source-map: 0.7.4 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 webpack-dev-server: 4.15.1(webpack@5.88.2) /@popperjs/core@2.11.8: @@ -6233,7 +6275,7 @@ packages: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} dev: false - /@rainbow-me/rainbowkit@0.12.16(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(wagmi@0.12.19): + /@rainbow-me/rainbowkit@0.12.16(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(wagmi@0.12.18): resolution: {integrity: sha512-4uuJIOJaBjPVM/8HqM1kNf2Yqb52lNYkQD1m8p8e7zcIK2K3nml6BfG5r04f4kqUWRmT3yosZOz2+AYL1zFqdA==} engines: {node: '>=12.4'} peerDependencies: @@ -6251,19 +6293,19 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-remove-scroll: 2.5.4(@types/react@18.2.21)(react@18.2.0) - wagmi: 0.12.19(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(zod@3.22.4) + wagmi: 0.12.18(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) transitivePeerDependencies: - '@types/react' dev: false - /@rainbow-me/rainbowkit@0.12.18(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(wagmi@0.12.18): - resolution: {integrity: sha512-Ehpr8gBCS8v4vdXLi8ZBlQ1yA6GHJOhoP66hLrdgI5iSlr6aUGTEicEfb2RaKNltHJFW/5A4BKst0AK4PkAkuw==} + /@rainbow-me/rainbowkit@0.12.16(@types/react@18.2.21)(ethers@5.7.2)(react@18.2.0)(wagmi@0.12.19): + resolution: {integrity: sha512-4uuJIOJaBjPVM/8HqM1kNf2Yqb52lNYkQD1m8p8e7zcIK2K3nml6BfG5r04f4kqUWRmT3yosZOz2+AYL1zFqdA==} engines: {node: '>=12.4'} peerDependencies: ethers: '>=5.6.8' react: '>=17' react-dom: '>=17' - wagmi: '>=0.12.19 <1.0.0' + wagmi: '>=0.12.18 <1.0.0' dependencies: '@vanilla-extract/css': 1.9.1 '@vanilla-extract/dynamic': 2.0.2 @@ -6272,9 +6314,8 @@ packages: ethers: 5.7.2 qrcode: 1.5.0 react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) react-remove-scroll: 2.5.4(@types/react@18.2.21)(react@18.2.0) - wagmi: 0.12.18(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) + wagmi: 0.12.19(@types/react@18.2.21)(ethers@5.7.2)(react@18.2.0)(typescript@5.3.3)(zod@3.22.4) transitivePeerDependencies: - '@types/react' dev: false @@ -7026,7 +7067,7 @@ packages: tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1' dependencies: mini-svg-data-uri: 1.4.4 - tailwindcss: 3.3.3(ts-node@10.9.1) + tailwindcss: 3.3.3 dev: false /@tailwindcss/line-clamp@0.4.4(tailwindcss@3.3.3): @@ -7034,7 +7075,7 @@ packages: peerDependencies: tailwindcss: '>=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1' dependencies: - tailwindcss: 3.3.3(ts-node@10.9.1) + tailwindcss: 3.3.3 /@tailwindcss/typography@0.5.10(tailwindcss@3.3.3): resolution: {integrity: sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==} @@ -7045,7 +7086,7 @@ packages: lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.3.3(ts-node@10.9.1) + tailwindcss: 3.3.3 dev: false /@tanstack/query-core@4.22.0: @@ -7095,6 +7136,23 @@ packages: use-sync-external-store: 1.2.0(react@18.2.0) dev: false + /@tanstack/react-query@4.35.0(react@18.2.0): + resolution: {integrity: sha512-LLYDNnM9ewYHgjm2rzhk4KG/puN2rdoqCUD+N9+V7SwlsYwJk5ypX58rpkoZAhFyZ+KmFUJ7Iv2lIEOoUqydIg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@tanstack/query-core': 4.35.0 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + /@testing-library/dom@8.20.1: resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==} engines: {node: '>=12'} @@ -7161,6 +7219,13 @@ packages: '@testing-library/dom': 9.3.1 dev: false + /@testing-library/user-event@14.4.3: + resolution: {integrity: sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + dev: false + /@testing-library/user-event@14.4.3(@testing-library/dom@9.3.1): resolution: {integrity: sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==} engines: {node: '>=12', npm: '>=6'} @@ -7198,7 +7263,7 @@ packages: resolution: {integrity: sha512-d6McJeGsuoRlwWZmVIeE8CUA27lu6jLjvv1JzqmpsytOYYbVi1tHZEnwCNVOXnj4pyLvneZlFlpXUK+X9wBWyw==} dev: true - /@typechain/ethers-v5@10.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.3.3): + /@typechain/ethers-v5@10.2.0(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.3.3): resolution: {integrity: sha512-ikaq0N/w9fABM+G01OFmU3U3dNnyRwEahkdvi9mqy1a3XwKiPZaF/lu54OcNaEWnpvEYyhhS0N7buCtLQqC92w==} peerDependencies: '@ethersproject/abi': ^5.0.0 @@ -7209,8 +7274,7 @@ packages: typescript: '>=4.3.0' dependencies: '@ethersproject/abi': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/providers': 5.7.2 ethers: 5.7.2 lodash: 4.17.21 ts-essentials: 7.0.3(typescript@5.3.3) @@ -7456,6 +7520,7 @@ packages: /@types/node@20.4.7: resolution: {integrity: sha512-bUBrPjEry2QUTsnuEjzjbS7voGWCc30W0qzgMf90GPeDGFRakvrz47ju+oqDAKCXLUCe39u57/ORMl/O/04/9g==} + dev: true /@types/node@20.5.9: resolution: {integrity: sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==} @@ -7610,34 +7675,6 @@ packages: dependencies: '@types/yargs-parser': 21.0.0 - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.8.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.48.0)(typescript@5.2.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@5.2.2) - debug: 4.3.4 - eslint: 8.48.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare-lite: 1.4.0 - semver: 7.5.4 - tsutils: 3.21.0(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)(typescript@5.3.3): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7665,7 +7702,7 @@ packages: transitivePeerDependencies: - supports-color - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.50.0)(typescript@5.3.3): + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(typescript@5.3.3): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -7677,12 +7714,11 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.8.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(typescript@5.3.3) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.50.0)(typescript@5.3.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@5.3.3) + '@typescript-eslint/type-utils': 5.62.0(typescript@5.3.3) + '@typescript-eslint/utils': 5.62.0(typescript@5.3.3) debug: 4.3.4 - eslint: 8.50.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare-lite: 1.4.0 @@ -7751,19 +7787,6 @@ packages: - supports-color dev: true - /@typescript-eslint/experimental-utils@5.62.0(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@5.2.2) - eslint: 8.48.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - /@typescript-eslint/experimental-utils@5.62.0(eslint@8.48.0)(typescript@5.3.3): resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7776,39 +7799,18 @@ packages: - supports-color - typescript - /@typescript-eslint/experimental-utils@5.62.0(eslint@8.50.0)(typescript@5.3.3): + /@typescript-eslint/experimental-utils@5.62.0(typescript@5.3.3): resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@5.3.3) - eslint: 8.50.0 + '@typescript-eslint/utils': 5.62.0(typescript@5.3.3) transitivePeerDependencies: - supports-color - typescript dev: false - /@typescript-eslint/parser@5.62.0(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - debug: 4.3.4 - eslint: 8.48.0 - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - /@typescript-eslint/parser@5.62.0(eslint@8.48.0)(typescript@5.3.3): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7828,7 +7830,7 @@ packages: transitivePeerDependencies: - supports-color - /@typescript-eslint/parser@5.62.0(eslint@8.50.0)(typescript@5.3.3): + /@typescript-eslint/parser@5.62.0(typescript@5.3.3): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -7842,7 +7844,6 @@ packages: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) debug: 4.3.4 - eslint: 8.50.0 typescript: 5.3.3 transitivePeerDependencies: - supports-color @@ -7912,26 +7913,6 @@ packages: '@typescript-eslint/types': 6.7.2 '@typescript-eslint/visitor-keys': 6.7.2 - /@typescript-eslint/type-utils@5.62.0(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@5.2.2) - debug: 4.3.4 - eslint: 8.48.0 - tsutils: 3.21.0(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - /@typescript-eslint/type-utils@5.62.0(eslint@8.48.0)(typescript@5.3.3): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7951,7 +7932,7 @@ packages: transitivePeerDependencies: - supports-color - /@typescript-eslint/type-utils@5.62.0(eslint@8.50.0)(typescript@5.3.3): + /@typescript-eslint/type-utils@5.62.0(typescript@5.3.3): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -7962,9 +7943,8 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@5.3.3) + '@typescript-eslint/utils': 5.62.0(typescript@5.3.3) debug: 4.3.4 - eslint: 8.50.0 tsutils: 3.21.0(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -8024,27 +8004,6 @@ packages: resolution: {integrity: sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==} engines: {node: ^16.0.0 || >=18.0.0} - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - tsutils: 3.21.0(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -8129,26 +8088,6 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.1 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - eslint: 8.48.0 - eslint-scope: 5.1.1 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - /@typescript-eslint/utils@5.62.0(eslint@8.48.0)(typescript@5.3.3): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -8168,19 +8107,18 @@ packages: - supports-color - typescript - /@typescript-eslint/utils@5.62.0(eslint@8.50.0)(typescript@5.3.3): + /@typescript-eslint/utils@5.62.0(typescript@5.3.3): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) + '@eslint-community/eslint-utils': 4.4.0 '@types/json-schema': 7.0.12 '@types/semver': 7.5.1 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) - eslint: 8.50.0 eslint-scope: 5.1.1 semver: 7.5.4 transitivePeerDependencies: @@ -8480,7 +8418,7 @@ packages: '@walletconnect/ethereum-provider': 2.8.4(@walletconnect/modal@2.6.1) '@walletconnect/legacy-provider': 2.0.0 '@walletconnect/modal': 2.6.1(react@18.2.0) - abitype: 0.3.0(typescript@5.3.3)(zod@3.22.4) + abitype: 0.3.0(typescript@5.3.3) ethers: 5.7.2 eventemitter3: 4.0.7 typescript: 5.3.3 @@ -8547,7 +8485,7 @@ packages: '@safe-global/safe-apps-provider': 0.15.2 '@safe-global/safe-apps-sdk': 7.11.0 '@wagmi/core': 0.10.17(@types/react@18.2.21)(ethers@5.7.2)(react@18.2.0)(typescript@5.3.3)(zod@3.22.4) - '@walletconnect/ethereum-provider': 2.9.0(@walletconnect/modal@2.6.1)(lokijs@1.5.12) + '@walletconnect/ethereum-provider': 2.9.0(@walletconnect/modal@2.6.1) '@walletconnect/legacy-provider': 2.0.0 '@walletconnect/modal': 2.6.1(react@18.2.0) abitype: 0.3.0(typescript@5.3.3)(zod@3.22.4) @@ -8578,10 +8516,10 @@ packages: '@ledgerhq/connect-kit-loader': 1.1.2 '@safe-global/safe-apps-provider': 0.17.1(typescript@5.2.2)(zod@3.22.4) '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.2.2)(zod@3.22.4) - '@walletconnect/ethereum-provider': 2.10.0(@walletconnect/modal@2.6.1)(lokijs@1.5.12) + '@walletconnect/ethereum-provider': 2.10.0(@walletconnect/modal@2.6.1) '@walletconnect/legacy-provider': 2.0.0 '@walletconnect/modal': 2.6.1(react@18.2.0) - '@walletconnect/utils': 2.10.0(lokijs@1.5.12) + '@walletconnect/utils': 2.10.0 abitype: 0.8.7(typescript@5.2.2)(zod@3.22.4) eventemitter3: 4.0.7 typescript: 5.2.2 @@ -8608,7 +8546,7 @@ packages: dependencies: '@wagmi/chains': 0.2.22(typescript@5.3.3) '@wagmi/connectors': 0.3.22(@wagmi/core@0.10.16)(ethers@5.7.2)(react@18.2.0)(typescript@5.3.3) - abitype: 0.3.0(typescript@5.3.3)(zod@3.22.4) + abitype: 0.3.0(typescript@5.3.3) ethers: 5.7.2 eventemitter3: 4.0.7 typescript: 5.3.3 @@ -8746,7 +8684,7 @@ packages: - utf-8-validate dev: false - /@walletconnect/core@2.10.0(lokijs@1.5.12): + /@walletconnect/core@2.10.0: resolution: {integrity: sha512-Z8pdorfIMueuiBXLdnf7yloiO9JIiobuxN3j0OTal+MYc4q5/2O7d+jdD1DAXbLi1taJx3x60UXT/FPVkjIqIQ==} dependencies: '@walletconnect/heartbeat': 1.2.1 @@ -8754,14 +8692,14 @@ packages: '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/jsonrpc-ws-connection': 1.0.13 - '@walletconnect/keyvaluestorage': 1.0.2(lokijs@1.5.12) + '@walletconnect/keyvaluestorage': 1.0.2 '@walletconnect/logger': 2.0.1 '@walletconnect/relay-api': 1.0.9 '@walletconnect/relay-auth': 1.0.4 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.10.0(lokijs@1.5.12) - '@walletconnect/utils': 2.10.0(lokijs@1.5.12) + '@walletconnect/types': 2.10.0 + '@walletconnect/utils': 2.10.0 events: 3.3.0 lodash.isequal: 4.5.0 uint8arrays: 3.1.1 @@ -8772,8 +8710,8 @@ packages: - utf-8-validate dev: false - /@walletconnect/core@2.8.4: - resolution: {integrity: sha512-3CQHud4As0kPRvlW1w/wSWS2F3yXlAo5kSEJyRWLRPqXG+aSCVWM8cVM8ch5yoeyNIfOHhEINdsYMuJG1+yIJQ==} + /@walletconnect/core@2.10.0(lokijs@1.5.12): + resolution: {integrity: sha512-Z8pdorfIMueuiBXLdnf7yloiO9JIiobuxN3j0OTal+MYc4q5/2O7d+jdD1DAXbLi1taJx3x60UXT/FPVkjIqIQ==} dependencies: '@walletconnect/heartbeat': 1.2.1 '@walletconnect/jsonrpc-provider': 1.0.13 @@ -8786,8 +8724,8 @@ packages: '@walletconnect/relay-auth': 1.0.4 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.8.4 - '@walletconnect/utils': 2.8.4 + '@walletconnect/types': 2.10.0(lokijs@1.5.12) + '@walletconnect/utils': 2.10.0(lokijs@1.5.12) events: 3.3.0 lodash.isequal: 4.5.0 uint8arrays: 3.1.1 @@ -8798,22 +8736,74 @@ packages: - utf-8-validate dev: false - /@walletconnect/core@2.9.0(lokijs@1.5.12): - resolution: {integrity: sha512-MZYJghS9YCvGe32UOgDj0mCasaOoGHQaYXWeQblXE/xb8HuaM6kAWhjIQN9P+MNp5QP134BHP5olQostcCotXQ==} + /@walletconnect/core@2.8.4: + resolution: {integrity: sha512-3CQHud4As0kPRvlW1w/wSWS2F3yXlAo5kSEJyRWLRPqXG+aSCVWM8cVM8ch5yoeyNIfOHhEINdsYMuJG1+yIJQ==} dependencies: '@walletconnect/heartbeat': 1.2.1 '@walletconnect/jsonrpc-provider': 1.0.13 '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/jsonrpc-ws-connection': 1.0.12 - '@walletconnect/keyvaluestorage': 1.0.2(lokijs@1.5.12) + '@walletconnect/jsonrpc-ws-connection': 1.0.13 + '@walletconnect/keyvaluestorage': 1.0.2 '@walletconnect/logger': 2.0.1 '@walletconnect/relay-api': 1.0.9 '@walletconnect/relay-auth': 1.0.4 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.9.0(lokijs@1.5.12) - '@walletconnect/utils': 2.9.0(lokijs@1.5.12) + '@walletconnect/types': 2.8.4 + '@walletconnect/utils': 2.8.4 + events: 3.3.0 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - lokijs + - utf-8-validate + dev: false + + /@walletconnect/core@2.9.0: + resolution: {integrity: sha512-MZYJghS9YCvGe32UOgDj0mCasaOoGHQaYXWeQblXE/xb8HuaM6kAWhjIQN9P+MNp5QP134BHP5olQostcCotXQ==} + dependencies: + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.12 + '@walletconnect/keyvaluestorage': 1.0.2 + '@walletconnect/logger': 2.0.1 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/relay-auth': 1.0.4 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.9.0 + '@walletconnect/utils': 2.9.0 + events: 3.3.0 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - lokijs + - utf-8-validate + dev: false + + /@walletconnect/core@2.9.0(lokijs@1.5.12): + resolution: {integrity: sha512-MZYJghS9YCvGe32UOgDj0mCasaOoGHQaYXWeQblXE/xb8HuaM6kAWhjIQN9P+MNp5QP134BHP5olQostcCotXQ==} + dependencies: + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.12 + '@walletconnect/keyvaluestorage': 1.0.2(lokijs@1.5.12) + '@walletconnect/logger': 2.0.1 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/relay-auth': 1.0.4 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.9.0(lokijs@1.5.12) + '@walletconnect/utils': 2.9.0(lokijs@1.5.12) events: 3.3.0 lodash.isequal: 4.5.0 uint8arrays: 3.1.1 @@ -8887,6 +8877,32 @@ packages: - utf-8-validate dev: false + /@walletconnect/ethereum-provider@2.10.0(@walletconnect/modal@2.6.1): + resolution: {integrity: sha512-NyTm7RcrtAiSaYQPh6G4sOtr1kg/pL5Z3EDE6rBTV3Se5pMsYvtuwMiSol7MidsQpf4ux9HFhthTO3imcoWImw==} + peerDependencies: + '@walletconnect/modal': '>=2' + peerDependenciesMeta: + '@walletconnect/modal': + optional: true + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/modal': 2.6.1(react@18.2.0) + '@walletconnect/sign-client': 2.10.0 + '@walletconnect/types': 2.10.0 + '@walletconnect/universal-provider': 2.10.0 + '@walletconnect/utils': 2.10.0 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - encoding + - lokijs + - utf-8-validate + dev: false + /@walletconnect/ethereum-provider@2.10.0(@walletconnect/modal@2.6.1)(lokijs@1.5.12): resolution: {integrity: sha512-NyTm7RcrtAiSaYQPh6G4sOtr1kg/pL5Z3EDE6rBTV3Se5pMsYvtuwMiSol7MidsQpf4ux9HFhthTO3imcoWImw==} peerDependencies: @@ -8939,6 +8955,32 @@ packages: - utf-8-validate dev: false + /@walletconnect/ethereum-provider@2.9.0(@walletconnect/modal@2.6.1): + resolution: {integrity: sha512-rSXkC0SXMigJRdIi/M2RMuEuATY1AwtlTWQBnqyxoht7xbO2bQNPCXn0XL4s/GRNrSUtoKSY4aPMHXV4W4yLBA==} + peerDependencies: + '@walletconnect/modal': '>=2' + peerDependenciesMeta: + '@walletconnect/modal': + optional: true + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/modal': 2.6.1(react@18.2.0) + '@walletconnect/sign-client': 2.9.0 + '@walletconnect/types': 2.9.0 + '@walletconnect/universal-provider': 2.9.0 + '@walletconnect/utils': 2.9.0 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - encoding + - lokijs + - utf-8-validate + dev: false + /@walletconnect/ethereum-provider@2.9.0(@walletconnect/modal@2.6.1)(lokijs@1.5.12): resolution: {integrity: sha512-rSXkC0SXMigJRdIi/M2RMuEuATY1AwtlTWQBnqyxoht7xbO2bQNPCXn0XL4s/GRNrSUtoKSY4aPMHXV4W4yLBA==} peerDependencies: @@ -9029,7 +9071,7 @@ packages: '@walletconnect/safe-json': 1.0.2 events: 3.3.0 tslib: 1.14.1 - ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 7.5.9 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -9042,12 +9084,27 @@ packages: '@walletconnect/safe-json': 1.0.2 events: 3.3.0 tslib: 1.14.1 - ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 7.5.9 transitivePeerDependencies: - bufferutil - utf-8-validate dev: false + /@walletconnect/keyvaluestorage@1.0.2: + resolution: {integrity: sha512-U/nNG+VLWoPFdwwKx0oliT4ziKQCEoQ27L5Hhw8YOFGA2Po9A9pULUYNWhDgHkrb0gYDNt//X7wABcEWWBd3FQ==} + peerDependencies: + '@react-native-async-storage/async-storage': 1.x + lokijs: 1.x + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + lokijs: + optional: true + dependencies: + safe-json-utils: 1.1.1 + tslib: 1.14.1 + dev: false + /@walletconnect/keyvaluestorage@1.0.2(lokijs@1.5.12): resolution: {integrity: sha512-U/nNG+VLWoPFdwwKx0oliT4ziKQCEoQ27L5Hhw8YOFGA2Po9A9pULUYNWhDgHkrb0gYDNt//X7wABcEWWBd3FQ==} peerDependencies: @@ -9210,6 +9267,25 @@ packages: tslib: 1.14.1 dev: false + /@walletconnect/sign-client@2.10.0: + resolution: {integrity: sha512-hbDljDS53kR/It3oXD91UkcOsT6diNnW5+Zzksm0YEfwww5dop/YfNlcdnc8+jKUhWOL/YDPNQCjzsCSNlVzbw==} + dependencies: + '@walletconnect/core': 2.10.0 + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.0.1 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.10.0 + '@walletconnect/utils': 2.10.0 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - lokijs + - utf-8-validate + dev: false + /@walletconnect/sign-client@2.10.0(lokijs@1.5.12): resolution: {integrity: sha512-hbDljDS53kR/It3oXD91UkcOsT6diNnW5+Zzksm0YEfwww5dop/YfNlcdnc8+jKUhWOL/YDPNQCjzsCSNlVzbw==} dependencies: @@ -9248,6 +9324,25 @@ packages: - utf-8-validate dev: false + /@walletconnect/sign-client@2.9.0: + resolution: {integrity: sha512-mEKc4LlLMebCe45qzqh+MX4ilQK4kOEBzLY6YJpG8EhyT45eX4JMNA7qQoYa9MRMaaVb/7USJcc4e3ZrjZvQmA==} + dependencies: + '@walletconnect/core': 2.9.0 + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.0.1 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.9.0 + '@walletconnect/utils': 2.9.0 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - lokijs + - utf-8-validate + dev: false + /@walletconnect/sign-client@2.9.0(lokijs@1.5.12): resolution: {integrity: sha512-mEKc4LlLMebCe45qzqh+MX4ilQK4kOEBzLY6YJpG8EhyT45eX4JMNA7qQoYa9MRMaaVb/7USJcc4e3ZrjZvQmA==} dependencies: @@ -9303,6 +9398,20 @@ packages: deprecated: 'WalletConnect''s v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/' dev: false + /@walletconnect/types@2.10.0: + resolution: {integrity: sha512-kSTA/WZnbKdEbvbXSW16Ty6dOSzOZCHnGg6JH7q1MuraalD2HuNg00lVVu7QAZ/Rj1Gn9DAkrgP5Wd5a8Xq//Q==} + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/keyvaluestorage': 1.0.2 + '@walletconnect/logger': 2.0.1 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - lokijs + dev: false + /@walletconnect/types@2.10.0(lokijs@1.5.12): resolution: {integrity: sha512-kSTA/WZnbKdEbvbXSW16Ty6dOSzOZCHnGg6JH7q1MuraalD2HuNg00lVVu7QAZ/Rj1Gn9DAkrgP5Wd5a8Xq//Q==} dependencies: @@ -9323,7 +9432,21 @@ packages: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.1 '@walletconnect/jsonrpc-types': 1.0.3 - '@walletconnect/keyvaluestorage': 1.0.2(lokijs@1.5.12) + '@walletconnect/keyvaluestorage': 1.0.2 + '@walletconnect/logger': 2.0.1 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - lokijs + dev: false + + /@walletconnect/types@2.9.0: + resolution: {integrity: sha512-ORopsMfSRvUYqtjKKd6scfg8o4/aGebipLxx92AuuUgMTERSU6cGmIrK6rdLu7W6FBJkmngPLEGc9mRqAb9Lug==} + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/keyvaluestorage': 1.0.2 '@walletconnect/logger': 2.0.1 events: 3.3.0 transitivePeerDependencies: @@ -9345,6 +9468,26 @@ packages: - lokijs dev: false + /@walletconnect/universal-provider@2.10.0: + resolution: {integrity: sha512-jtVWf+AeTCqBcB3lCmWkv3bvSmdRCkQdo67GNoT5y6/pvVHMxfjgrJNBOUsWQMxpREpWDpZ993X0JRjsYVsMcA==} + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.0.1 + '@walletconnect/sign-client': 2.10.0 + '@walletconnect/types': 2.10.0 + '@walletconnect/utils': 2.10.0 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - encoding + - lokijs + - utf-8-validate + dev: false + /@walletconnect/universal-provider@2.10.0(lokijs@1.5.12): resolution: {integrity: sha512-jtVWf+AeTCqBcB3lCmWkv3bvSmdRCkQdo67GNoT5y6/pvVHMxfjgrJNBOUsWQMxpREpWDpZ993X0JRjsYVsMcA==} dependencies: @@ -9385,6 +9528,26 @@ packages: - utf-8-validate dev: false + /@walletconnect/universal-provider@2.9.0: + resolution: {integrity: sha512-k3nkSBkF69sJJVoe17IVoPtnhp/sgaa2t+x7BvA/BKeMxE0DGdtRJdEXotTc8DBmI7o2tkq6l8+HyFBGjQ/CjQ==} + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.0.1 + '@walletconnect/sign-client': 2.9.0 + '@walletconnect/types': 2.9.0 + '@walletconnect/utils': 2.9.0 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - encoding + - lokijs + - utf-8-validate + dev: false + /@walletconnect/universal-provider@2.9.0(lokijs@1.5.12): resolution: {integrity: sha512-k3nkSBkF69sJJVoe17IVoPtnhp/sgaa2t+x7BvA/BKeMxE0DGdtRJdEXotTc8DBmI7o2tkq6l8+HyFBGjQ/CjQ==} dependencies: @@ -9417,6 +9580,28 @@ packages: query-string: 6.13.5 dev: false + /@walletconnect/utils@2.10.0: + resolution: {integrity: sha512-9GRyEz/7CJW+G04RvrjPET5k7hOEsB9b3fF9cWDk/iDCxSWpbkU/hv/urRB36C+gvQMAZgIZYX3dHfzJWkY/2g==} + dependencies: + '@stablelib/chacha20poly1305': 1.0.1 + '@stablelib/hkdf': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/sha256': 1.0.1 + '@stablelib/x25519': 1.0.3 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.10.0 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - lokijs + dev: false + /@walletconnect/utils@2.10.0(lokijs@1.5.12): resolution: {integrity: sha512-9GRyEz/7CJW+G04RvrjPET5k7hOEsB9b3fF9cWDk/iDCxSWpbkU/hv/urRB36C+gvQMAZgIZYX3dHfzJWkY/2g==} dependencies: @@ -9461,6 +9646,28 @@ packages: - lokijs dev: false + /@walletconnect/utils@2.9.0: + resolution: {integrity: sha512-7Tu3m6dZL84KofrNBcblsgpSqU2vdo9ImLD7zWimLXERVGNQ8smXG+gmhQYblebIBhsPzjy9N38YMC3nPlfQNw==} + dependencies: + '@stablelib/chacha20poly1305': 1.0.1 + '@stablelib/hkdf': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/sha256': 1.0.1 + '@stablelib/x25519': 1.0.3 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.9.0 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - lokijs + dev: false + /@walletconnect/utils@2.9.0(lokijs@1.5.12): resolution: {integrity: sha512-7Tu3m6dZL84KofrNBcblsgpSqU2vdo9ImLD7zWimLXERVGNQ8smXG+gmhQYblebIBhsPzjy9N38YMC3nPlfQNw==} dependencies: @@ -9653,6 +9860,19 @@ packages: zod: 3.22.4 dev: false + /abitype@0.3.0(typescript@5.3.3): + resolution: {integrity: sha512-0YokyAV4hKMcy97Pl+6QgZBlBdZJN2llslOs7kiFY+cu7kMlVXDBpxMExfv0krzBCQt2t7hNovpQ3y/zvEm18A==} + engines: {pnpm: '>=7'} + peerDependencies: + typescript: '>=4.9.4' + zod: '>=3.19.1' + peerDependenciesMeta: + zod: + optional: true + dependencies: + typescript: 5.3.3 + dev: false + /abitype@0.3.0(typescript@5.3.3)(zod@3.22.4): resolution: {integrity: sha512-0YokyAV4hKMcy97Pl+6QgZBlBdZJN2llslOs7kiFY+cu7kMlVXDBpxMExfv0krzBCQt2t7hNovpQ3y/zvEm18A==} engines: {pnpm: '>=7'} @@ -9725,20 +9945,6 @@ packages: zod: 3.22.4 dev: false - /abitype@1.0.0(typescript@5.3.3): - resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - dependencies: - typescript: 5.3.3 - dev: false - /abortable-iterator@3.0.2: resolution: {integrity: sha512-qVP8HFfTpUQI2F+f1tpTriKDIZ4XrmwCrBCrQeRKO7DKWF3kgoT6NXiNDv2krrGcHxPwmI63eGQiec81sEaWIw==} dependencies: @@ -9859,10 +10065,8 @@ packages: resolution: {integrity: sha512-hCOfMzbFx5IDutmWLAt6MZwOUjIfSM9G9FyVxytmE4Rs/5YDPWQrD/+IR1w+FweD9H2oOZEnv36TmkjhNURBVA==} dev: false - /ajv-formats@2.1.1(ajv@8.12.0): + /ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 peerDependenciesMeta: ajv: optional: true @@ -10242,12 +10446,30 @@ packages: resolution: {integrity: sha512-ZtlVZobOeDQhb/y2lMK6mznDw7TJHDNcKx5/bbBkFvArIQ5CVFhSI6hWWQnMx9I8cNmNmZ30wpDyOC2E2nvgbQ==} engines: {node: '>=4'} + /axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + dependencies: + follow-redirects: 1.15.2 + transitivePeerDependencies: + - debug + dev: false + /axios@0.21.4(debug@4.3.4): resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.2(debug@4.3.4) + follow-redirects: 1.15.2 + transitivePeerDependencies: + - debug + dev: true + + /axios@0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 transitivePeerDependencies: - debug + dev: false /axios@0.27.2(debug@4.3.4): resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} @@ -10298,19 +10520,33 @@ packages: transitivePeerDependencies: - supports-color + /babel-loader@8.3.0(@babel/core@7.22.15): + resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} + engines: {node: '>= 8.9'} + peerDependencies: + '@babel/core': ^7.0.0 + webpack: '>=2' + dependencies: + '@babel/core': 7.22.15 + find-cache-dir: 3.3.2 + loader-utils: 2.0.4 + make-dir: 3.1.0 + schema-utils: 2.7.1 + dev: false + /babel-loader@8.3.0(@babel/core@7.22.15)(webpack@5.88.2): resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} peerDependencies: '@babel/core': ^7.0.0 - webpack: ^5 + webpack: '>=2' dependencies: '@babel/core': 7.22.15 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 /babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} @@ -10810,6 +11046,7 @@ packages: requiresBuild: true dependencies: node-gyp-build: 4.6.1 + dev: false /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} @@ -11441,12 +11678,11 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - /cosmiconfig-typescript-loader@1.0.9(@types/node@17.0.45)(cosmiconfig@7.1.0)(typescript@5.2.2): + /cosmiconfig-typescript-loader@1.0.9(@types/node@17.0.45)(typescript@5.2.2): resolution: {integrity: sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@types/node': '*' - cosmiconfig: '>=7' typescript: '>=3' dependencies: '@types/node': 17.0.45 @@ -11458,12 +11694,11 @@ packages: - '@swc/wasm' dev: false - /cosmiconfig-typescript-loader@1.0.9(@types/node@17.0.45)(cosmiconfig@7.1.0)(typescript@5.3.3): + /cosmiconfig-typescript-loader@1.0.9(@types/node@17.0.45)(typescript@5.3.3): resolution: {integrity: sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@types/node': '*' - cosmiconfig: '>=7' typescript: '>=3' dependencies: '@types/node': 17.0.45 @@ -11475,12 +11710,11 @@ packages: - '@swc/wasm' dev: false - /cosmiconfig-typescript-loader@1.0.9(@types/node@18.17.14)(cosmiconfig@7.1.0)(typescript@5.3.3): + /cosmiconfig-typescript-loader@1.0.9(@types/node@18.17.14)(typescript@5.3.3): resolution: {integrity: sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@types/node': '*' - cosmiconfig: '>=7' typescript: '>=3' dependencies: '@types/node': 18.17.14 @@ -11542,16 +11776,31 @@ packages: typescript: 5.3.3 dev: true - /craco-esbuild@0.5.2(@craco/craco@7.1.0)(esbuild@0.18.20)(react-scripts@5.0.1)(webpack@5.88.2): + /craco-esbuild@0.5.2(@craco/craco@7.1.0): + resolution: {integrity: sha512-5NCHz2gFT8MkVo36t22KOBL53JvDrw8R2PHmGxxfaTa8LFZNKmvOI6e8zCzPdY9LeKMdF3svBjMVyXG53pGO1Q==} + peerDependencies: + '@craco/craco': ^6.0.0 || ^7.0.0 || ^7.0.0-alpha + react-scripts: ^5.0.0 + dependencies: + '@craco/craco': 7.1.0(@types/node@17.0.45)(postcss@8.4.29)(typescript@5.2.2) + esbuild-jest: 0.5.0 + esbuild-loader: 2.21.0 + transitivePeerDependencies: + - esbuild + - supports-color + - webpack + dev: false + + /craco-esbuild@0.5.2(@craco/craco@7.1.0)(react-scripts@5.0.1): resolution: {integrity: sha512-5NCHz2gFT8MkVo36t22KOBL53JvDrw8R2PHmGxxfaTa8LFZNKmvOI6e8zCzPdY9LeKMdF3svBjMVyXG53pGO1Q==} peerDependencies: '@craco/craco': ^6.0.0 || ^7.0.0 || ^7.0.0-alpha react-scripts: ^5.0.0 dependencies: '@craco/craco': 7.1.0(@types/node@18.17.14)(postcss@8.4.29)(react-scripts@5.0.1)(typescript@5.3.3) - esbuild-jest: 0.5.0(esbuild@0.18.20) - esbuild-loader: 2.21.0(webpack@5.88.2) - react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(esbuild@0.18.20)(eslint@8.48.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.3.3) + esbuild-jest: 0.5.0 + esbuild-loader: 2.21.0 + react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0)(react@18.2.0)(typescript@5.3.3) transitivePeerDependencies: - esbuild - supports-color @@ -11687,7 +11936,7 @@ packages: resolution: {integrity: sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==} engines: {node: '>= 12.13.0'} peerDependencies: - webpack: ^5 + webpack: ^5.0.0 dependencies: icss-utils: 5.1.0(postcss@8.4.29) postcss: 8.4.29 @@ -11697,9 +11946,9 @@ packages: postcss-modules-values: 4.0.0(postcss@8.4.29) postcss-value-parser: 4.2.0 semver: 7.5.4 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 - /css-minimizer-webpack-plugin@3.4.1(esbuild@0.18.20)(webpack@5.88.2): + /css-minimizer-webpack-plugin@3.4.1(webpack@5.88.2): resolution: {integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -11707,7 +11956,7 @@ packages: clean-css: '*' csso: '*' esbuild: '*' - webpack: ^5 + webpack: ^5.0.0 peerDependenciesMeta: '@parcel/css': optional: true @@ -11719,13 +11968,12 @@ packages: optional: true dependencies: cssnano: 5.1.15(postcss@8.4.29) - esbuild: 0.18.20 jest-worker: 27.5.1 postcss: 8.4.29 schema-utils: 4.2.0 serialize-javascript: 6.0.1 source-map: 0.6.1 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 /css-prefers-color-scheme@6.0.3(postcss@8.4.29): resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} @@ -12728,7 +12976,7 @@ packages: engines: {node: '>=6'} dev: false - /esbuild-jest@0.5.0(esbuild@0.18.20): + /esbuild-jest@0.5.0: resolution: {integrity: sha512-AMZZCdEpXfNVOIDvURlqYyHwC8qC1/BFjgsrOiSL1eyiIArVtHL8YAC83Shhn16cYYoAWEW17yZn0W/RJKJKHQ==} peerDependencies: esbuild: '>=0.8.50' @@ -12736,21 +12984,19 @@ packages: '@babel/core': 7.22.15 '@babel/plugin-transform-modules-commonjs': 7.22.15(@babel/core@7.22.15) babel-jest: 26.6.3(@babel/core@7.22.15) - esbuild: 0.18.20 transitivePeerDependencies: - supports-color - /esbuild-loader@2.21.0(webpack@5.88.2): + /esbuild-loader@2.21.0: resolution: {integrity: sha512-k7ijTkCT43YBSZ6+fBCW1Gin7s46RrJ0VQaM8qA7lq7W+OLsGgtLyFV8470FzYi/4TeDexniTBTPTwZUnXXR5g==} peerDependencies: - webpack: ^5 + webpack: ^4.40.0 || ^5.0.0 dependencies: esbuild: 0.16.17 joycon: 3.1.1 json5: 2.2.3 loader-utils: 2.0.4 tapable: 2.2.1 - webpack: 5.88.2(esbuild@0.18.20) webpack-sources: 1.4.3 /esbuild@0.16.17: @@ -12921,41 +13167,6 @@ packages: eslint: 8.50.0 dev: true - /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0)(jest@27.5.1)(typescript@5.2.2): - resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} - engines: {node: '>=14.0.0'} - peerDependencies: - eslint: ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@babel/core': 7.22.15 - '@babel/eslint-parser': 7.22.15(@babel/core@7.22.15)(eslint@8.48.0) - '@rushstack/eslint-patch': 1.3.3 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)(typescript@5.2.2) - '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.2.2) - babel-preset-react-app: 10.0.1 - confusing-browser-globals: 1.0.11 - eslint: 8.48.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.48.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.48.0)(jest@27.5.1)(typescript@5.2.2) - eslint-plugin-jsx-a11y: 6.7.1(eslint@8.48.0) - eslint-plugin-react: 7.33.2(eslint@8.48.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.48.0) - eslint-plugin-testing-library: 5.11.1(eslint@8.48.0)(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - '@babel/plugin-syntax-flow' - - '@babel/plugin-transform-react-jsx' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - jest - - supports-color - dev: false - /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0)(jest@27.5.1)(typescript@5.3.3): resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} engines: {node: '>=14.0.0'} @@ -12990,7 +13201,7 @@ packages: - jest - supports-color - /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.50.0)(jest@27.5.1)(typescript@5.3.3): + /eslint-config-react-app@7.0.1(jest@27.5.1)(typescript@5.3.3): resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -13001,20 +13212,19 @@ packages: optional: true dependencies: '@babel/core': 7.22.15 - '@babel/eslint-parser': 7.22.15(@babel/core@7.22.15)(eslint@8.50.0) + '@babel/eslint-parser': 7.22.15(@babel/core@7.22.15) '@rushstack/eslint-patch': 1.3.3 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.50.0)(typescript@5.3.3) - '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@5.3.3) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(typescript@5.3.3) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 - eslint: 8.50.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.50.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.50.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.50.0)(jest@27.5.1)(typescript@5.3.3) - eslint-plugin-jsx-a11y: 6.7.1(eslint@8.50.0) - eslint-plugin-react: 7.33.2(eslint@8.50.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.50.0) - eslint-plugin-testing-library: 5.11.1(eslint@8.50.0)(typescript@5.3.3) + eslint-plugin-flowtype: 8.0.3 + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(jest@27.5.1)(typescript@5.3.3) + eslint-plugin-jsx-a11y: 6.7.1 + eslint-plugin-react: 7.33.2 + eslint-plugin-react-hooks: 4.6.0 + eslint-plugin-testing-library: 5.11.1(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - '@babel/plugin-syntax-flow' @@ -13043,7 +13253,7 @@ packages: transitivePeerDependencies: - supports-color - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -13064,14 +13274,14 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(typescript@5.3.3) debug: 3.2.7 - eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color + dev: false - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.50.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -13092,13 +13302,12 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.3.3) debug: 3.2.7 - eslint: 8.50.0 + eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - dev: false /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.7.2)(eslint-import-resolver-node@0.3.9)(eslint@8.50.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} @@ -13129,7 +13338,7 @@ packages: - supports-color dev: true - /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0): + /eslint-plugin-flowtype@8.0.3: resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -13137,13 +13346,11 @@ packages: '@babel/plugin-transform-react-jsx': ^7.14.9 eslint: ^8.1.0 dependencies: - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.15) - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.22.15) - eslint: 8.48.0 lodash: 4.17.21 string-natural-compare: 3.0.1 + dev: false - /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.50.0): + /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0): resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -13153,12 +13360,11 @@ packages: dependencies: '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.15) '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.22.15) - eslint: 8.50.0 + eslint: 8.48.0 lodash: 4.17.21 string-natural-compare: 3.0.1 - dev: false - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.48.0): + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: @@ -13168,16 +13374,15 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(typescript@5.3.3) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -13191,8 +13396,9 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + dev: false - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.50.0): + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.48.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: @@ -13202,16 +13408,16 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.3.3) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.50.0 + eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.50.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -13225,7 +13431,6 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: false /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.7.2)(eslint@8.50.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} @@ -13262,28 +13467,6 @@ packages: - supports-color dev: true - /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.48.0)(jest@27.5.1)(typescript@5.2.2): - resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^4.0.0 || ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true - dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)(typescript@5.2.2) - '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.48.0)(typescript@5.2.2) - eslint: 8.48.0 - jest: 27.5.1(ts-node@10.9.1) - transitivePeerDependencies: - - supports-color - - typescript - dev: false - /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.48.0)(jest@27.5.1)(typescript@5.3.3): resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -13300,12 +13483,12 @@ packages: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.48.0)(typescript@5.3.3) '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.48.0)(typescript@5.3.3) eslint: 8.48.0 - jest: 27.5.1(ts-node@10.9.1) + jest: 27.5.1 transitivePeerDependencies: - supports-color - typescript - /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.50.0)(jest@27.5.1)(typescript@5.3.3): + /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(jest@27.5.1)(typescript@5.3.3): resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} peerDependencies: @@ -13318,16 +13501,15 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.50.0)(typescript@5.3.3) - '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.50.0)(typescript@5.3.3) - eslint: 8.50.0 - jest: 27.5.1(ts-node@10.9.1) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(typescript@5.3.3) + '@typescript-eslint/experimental-utils': 5.62.0(typescript@5.3.3) + jest: 27.5.1 transitivePeerDependencies: - supports-color - typescript dev: false - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.48.0): + /eslint-plugin-jsx-a11y@6.7.1: resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} peerDependencies: @@ -13342,7 +13524,6 @@ packages: axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.48.0 has: 1.0.3 jsx-ast-utils: 3.3.5 language-tags: 1.0.5 @@ -13350,8 +13531,9 @@ packages: object.entries: 1.1.7 object.fromentries: 2.0.7 semver: 6.3.1 + dev: false - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.50.0): + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.48.0): resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} peerDependencies: @@ -13366,7 +13548,7 @@ packages: axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.50.0 + eslint: 8.48.0 has: 1.0.3 jsx-ast-utils: 3.3.5 language-tags: 1.0.5 @@ -13374,7 +13556,6 @@ packages: object.entries: 1.1.7 object.fromentries: 2.0.7 semver: 6.3.1 - dev: false /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.48.0)(prettier@2.8.8): resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} @@ -13414,6 +13595,13 @@ packages: synckit: 0.8.5 dev: true + /eslint-plugin-react-hooks@4.6.0: + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dev: false + /eslint-plugin-react-hooks@4.6.0(eslint@8.48.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} @@ -13431,6 +13619,30 @@ packages: eslint: 8.50.0 dev: false + /eslint-plugin-react@7.33.2: + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.7 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.1 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.14 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.7 + object.fromentries: 2.0.7 + object.hasown: 1.1.3 + object.values: 1.1.7 + prop-types: 15.8.1 + resolve: 2.0.0-next.4 + semver: 6.3.1 + string.prototype.matchall: 4.0.9 + dev: false + /eslint-plugin-react@7.33.2(eslint@8.48.0): resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} engines: {node: '>=4'} @@ -13480,19 +13692,6 @@ packages: string.prototype.matchall: 4.0.9 dev: false - /eslint-plugin-testing-library@5.11.1(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} - peerDependencies: - eslint: ^7.5.0 || ^8.0.0 - dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@5.2.2) - eslint: 8.48.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - /eslint-plugin-testing-library@5.11.1(eslint@8.48.0)(typescript@5.3.3): resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} @@ -13505,14 +13704,13 @@ packages: - supports-color - typescript - /eslint-plugin-testing-library@5.11.1(eslint@8.50.0)(typescript@5.3.3): + /eslint-plugin-testing-library@5.11.1(typescript@5.3.3): resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@5.3.3) - eslint: 8.50.0 + '@typescript-eslint/utils': 5.62.0(typescript@5.3.3) transitivePeerDependencies: - supports-color - typescript @@ -13576,7 +13774,7 @@ packages: engines: {node: '>= 12.13.0'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 - webpack: ^5 + webpack: ^5.0.0 dependencies: '@types/eslint': 8.44.2 eslint: 8.48.0 @@ -13584,22 +13782,21 @@ packages: micromatch: 4.0.5 normalize-path: 3.0.0 schema-utils: 4.2.0 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 - /eslint-webpack-plugin@3.2.0(eslint@8.50.0)(webpack@5.88.2): + /eslint-webpack-plugin@3.2.0(webpack@5.88.2): resolution: {integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==} engines: {node: '>= 12.13.0'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 - webpack: ^5 + webpack: ^5.0.0 dependencies: '@types/eslint': 8.44.2 - eslint: 8.50.0 jest-worker: 28.1.3 micromatch: 4.0.5 normalize-path: 3.0.0 schema-utils: 4.2.0 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 dev: false /eslint@8.48.0: @@ -13815,7 +14012,7 @@ packages: '@ethersproject/networks': 5.7.1 '@ethersproject/pbkdf2': 5.7.0 '@ethersproject/properties': 5.7.0 - '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/providers': 5.7.2 '@ethersproject/random': 5.7.0 '@ethersproject/rlp': 5.7.0 '@ethersproject/sha2': 5.7.0 @@ -14097,11 +14294,11 @@ packages: resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} engines: {node: '>= 10.13.0'} peerDependencies: - webpack: ^5 + webpack: ^4.0.0 || ^5.0.0 dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 /file-selector@0.6.0: resolution: {integrity: sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==} @@ -14224,6 +14421,15 @@ packages: tslib: 2.6.2 dev: false + /follow-redirects@1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + /follow-redirects@1.15.2(debug@4.3.4): resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} @@ -14256,38 +14462,6 @@ packages: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: false - /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.48.0)(typescript@5.2.2)(webpack@5.88.2): - resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} - engines: {node: '>=10', yarn: '>=1.0.0'} - peerDependencies: - eslint: '>= 6' - typescript: '>= 2.7' - vue-template-compiler: '*' - webpack: ^5 - peerDependenciesMeta: - eslint: - optional: true - vue-template-compiler: - optional: true - dependencies: - '@babel/code-frame': 7.22.13 - '@types/json-schema': 7.0.12 - chalk: 4.1.2 - chokidar: 3.5.3 - cosmiconfig: 6.0.0 - deepmerge: 4.3.1 - eslint: 8.48.0 - fs-extra: 9.1.0 - glob: 7.2.3 - memfs: 3.5.3 - minimatch: 3.1.2 - schema-utils: 2.7.0 - semver: 7.5.4 - tapable: 1.1.3 - typescript: 5.2.2 - webpack: 5.88.2(esbuild@0.18.20) - dev: false - /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.48.0)(typescript@5.3.3)(webpack@5.88.2): resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} @@ -14295,7 +14469,7 @@ packages: eslint: '>= 6' typescript: '>= 2.7' vue-template-compiler: '*' - webpack: ^5 + webpack: '>= 4' peerDependenciesMeta: eslint: optional: true @@ -14317,16 +14491,16 @@ packages: semver: 7.5.4 tapable: 1.1.3 typescript: 5.3.3 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 - /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.50.0)(typescript@5.3.3)(webpack@5.88.2): + /fork-ts-checker-webpack-plugin@6.5.3(typescript@5.3.3)(webpack@5.88.2): resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: eslint: '>= 6' typescript: '>= 2.7' vue-template-compiler: '*' - webpack: ^5 + webpack: '>= 4' peerDependenciesMeta: eslint: optional: true @@ -14339,7 +14513,6 @@ packages: chokidar: 3.5.3 cosmiconfig: 6.0.0 deepmerge: 4.3.1 - eslint: 8.50.0 fs-extra: 9.1.0 glob: 7.2.3 memfs: 3.5.3 @@ -14348,7 +14521,7 @@ packages: semver: 7.5.4 tapable: 1.1.3 typescript: 5.3.3 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 dev: false /form-data@2.3.3: @@ -14423,6 +14596,23 @@ packages: '@emotion/is-prop-valid': 0.8.8 dev: false + /framer-motion@10.16.4(react@18.2.0): + resolution: {integrity: sha512-p9V9nGomS3m6/CALXqv6nFGMuFOxbWsmaOrdmhyQimMIlLl3LC7h7l86wge/Js/8cRu5ktutS/zlzgR7eBOtFA==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + react: 18.2.0 + tslib: 2.6.2 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 + dev: false + /framer-motion@6.5.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==} peerDependencies: @@ -14786,14 +14976,13 @@ packages: /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - /graphql-request@6.1.0(graphql@16.8.0): + /graphql-request@6.1.0: resolution: {integrity: sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==} peerDependencies: graphql: 14 - 16 dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.0) + '@graphql-typed-document-node/core': 3.2.0 cross-fetch: 3.1.8 - graphql: 16.8.0 transitivePeerDependencies: - encoding dev: false @@ -14801,6 +14990,7 @@ packages: /graphql@16.8.0: resolution: {integrity: sha512-0oKGaR+y3qcS5mCu1vb7KG+a89vjn06C7Ihq/dDl3jA+A8B3TKomvi3CiEcVLJQGalbu8F52LxkOym7U5sSfbg==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + dev: true /gzip-size@6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} @@ -14859,7 +15049,7 @@ packages: '@ethersproject/bytes': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/contracts': 5.7.0 - '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/providers': 5.7.2 '@ethersproject/solidity': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wallet': 5.7.0 @@ -15069,14 +15259,14 @@ packages: resolution: {integrity: sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==} engines: {node: '>=10.13.0'} peerDependencies: - webpack: ^5 + webpack: ^5.20.0 dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 /htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -15153,7 +15343,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2(debug@4.3.4) + follow-redirects: 1.15.2 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -15195,6 +15385,12 @@ packages: ms: 2.1.3 dev: false + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + dev: true + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -16234,7 +16430,7 @@ packages: peerDependencies: ws: '*' dependencies: - ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 7.5.9 dev: false /isomorphic-ws@5.0.0(ws@8.13.0): @@ -16482,7 +16678,7 @@ packages: buffer: 6.0.3 event-iterator: 2.0.0 iso-url: 1.2.1 - ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 7.5.9 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -16536,7 +16732,7 @@ packages: isomorphic-ws: 4.0.1(ws@7.5.9) json-stringify-safe: 5.0.1 uuid: 8.3.2 - ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 7.5.9 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -16576,7 +16772,7 @@ packages: transitivePeerDependencies: - supports-color - /jest-cli@27.5.1(ts-node@10.9.1): + /jest-cli@27.5.1: resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -16586,14 +16782,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 27.5.1(ts-node@10.9.1) + '@jest/core': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 27.5.1(ts-node@10.9.1) + jest-config: 27.5.1 jest-util: 27.5.1 jest-validate: 27.5.1 prompts: 2.4.2 @@ -16605,7 +16801,7 @@ packages: - ts-node - utf-8-validate - /jest-config@27.5.1(ts-node@10.9.1): + /jest-config@27.5.1: resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: @@ -16638,7 +16834,6 @@ packages: pretty-format: 27.5.1 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@20.4.7)(typescript@5.3.3) transitivePeerDependencies: - bufferutil - canvas @@ -17034,7 +17229,7 @@ packages: dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 - jest: 27.5.1(ts-node@10.9.1) + jest: 27.5.1 jest-regex-util: 28.0.2 jest-watcher: 28.1.3 slash: 4.0.0 @@ -17071,7 +17266,7 @@ packages: peerDependencies: jest: '>= 25' dependencies: - jest: 27.5.1(ts-node@10.9.1) + jest: 27.5.1 dev: true /jest-worker@26.6.2: @@ -17098,7 +17293,7 @@ packages: merge-stream: 2.0.0 supports-color: 8.1.1 - /jest@27.5.1(ts-node@10.9.1): + /jest@27.5.1: resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -17108,9 +17303,9 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 27.5.1(ts-node@10.9.1) + '@jest/core': 27.5.1 import-local: 3.1.0 - jest-cli: 27.5.1(ts-node@10.9.1) + jest-cli: 27.5.1 transitivePeerDependencies: - bufferutil - canvas @@ -17192,7 +17387,7 @@ packages: whatwg-encoding: 1.0.5 whatwg-mimetype: 2.3.0 whatwg-url: 8.7.0 - ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 7.5.9 xml-name-validator: 3.0.0 transitivePeerDependencies: - bufferutil @@ -18445,10 +18640,10 @@ packages: resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} engines: {node: '>= 12.13.0'} peerDependencies: - webpack: ^5 + webpack: ^5.0.0 dependencies: schema-utils: 4.2.0 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 /mini-svg-data-uri@1.4.4: resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} @@ -18885,6 +19080,7 @@ packages: /node-gyp-build@4.6.1: resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==} hasBin: true + dev: false /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -19851,7 +20047,7 @@ packages: postcss: 8.4.29 postcss-value-parser: 4.2.0 - /postcss-load-config@4.0.1(postcss@8.4.29)(ts-node@10.9.1): + /postcss-load-config@4.0.1(postcss@8.4.29): resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} engines: {node: '>= 14'} peerDependencies: @@ -19865,7 +20061,6 @@ packages: dependencies: lilconfig: 2.1.0 postcss: 8.4.29 - ts-node: 10.9.1(@types/node@20.4.7)(typescript@5.3.3) yaml: 2.3.2 /postcss-loader@6.2.1(postcss@8.4.29)(webpack@5.88.2): @@ -19873,13 +20068,13 @@ packages: engines: {node: '>= 12.13.0'} peerDependencies: postcss: ^7.0.0 || ^8.0.1 - webpack: ^5 + webpack: ^5.0.0 dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 postcss: 8.4.29 semver: 7.5.4 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 /postcss-logical@5.0.4(postcss@8.4.29): resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==} @@ -20697,55 +20892,13 @@ packages: /react-datetime@3.2.0(moment@2.29.4)(react@18.2.0): resolution: {integrity: sha512-w5XdeNIGzBht9CadaZIJhKUhEcDTgH0XokKxGPCxeeJRYL7B3HIKA8CM6Q0xej2JFJt0n5d+zi3maMwaY3262A==} - peerDependencies: - moment: ^2.16.0 - react: ^16.5.0 || ^17.0.0 || ^18.0.0 - dependencies: - moment: 2.29.4 - prop-types: 15.8.1 - react: 18.2.0 - dev: false - - /react-dev-utils@12.0.1(eslint@8.48.0)(typescript@5.2.2)(webpack@5.88.2): - resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=2.7' - webpack: ^5 - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@babel/code-frame': 7.22.13 - address: 1.2.2 - browserslist: 4.21.10 - chalk: 4.1.2 - cross-spawn: 7.0.3 - detect-port-alt: 1.1.6 - escape-string-regexp: 4.0.0 - filesize: 8.0.7 - find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.48.0)(typescript@5.2.2)(webpack@5.88.2) - global-modules: 2.0.0 - globby: 11.1.0 - gzip-size: 6.0.0 - immer: 9.0.21 - is-root: 2.1.0 - loader-utils: 3.2.1 - open: 8.4.2 - pkg-up: 3.1.0 - prompts: 2.4.2 - react-error-overlay: 6.0.11 - recursive-readdir: 2.2.3 - shell-quote: 1.8.1 - strip-ansi: 6.0.1 - text-table: 0.2.0 - typescript: 5.2.2 - webpack: 5.88.2(esbuild@0.18.20) - transitivePeerDependencies: - - eslint - - supports-color - - vue-template-compiler + peerDependencies: + moment: ^2.16.0 + react: ^16.5.0 || ^17.0.0 || ^18.0.0 + dependencies: + moment: 2.29.4 + prop-types: 15.8.1 + react: 18.2.0 dev: false /react-dev-utils@12.0.1(eslint@8.48.0)(typescript@5.3.3)(webpack@5.88.2): @@ -20753,7 +20906,7 @@ packages: engines: {node: '>=14'} peerDependencies: typescript: '>=2.7' - webpack: ^5 + webpack: '>=4' peerDependenciesMeta: typescript: optional: true @@ -20783,18 +20936,18 @@ packages: strip-ansi: 6.0.1 text-table: 0.2.0 typescript: 5.3.3 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 transitivePeerDependencies: - eslint - supports-color - vue-template-compiler - /react-dev-utils@12.0.1(eslint@8.50.0)(typescript@5.3.3)(webpack@5.88.2): + /react-dev-utils@12.0.1(typescript@5.3.3)(webpack@5.88.2): resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: typescript: '>=2.7' - webpack: ^5 + webpack: '>=4' peerDependenciesMeta: typescript: optional: true @@ -20808,7 +20961,7 @@ packages: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.50.0)(typescript@5.3.3)(webpack@5.88.2) + fork-ts-checker-webpack-plugin: 6.5.3(typescript@5.3.3)(webpack@5.88.2) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -20824,7 +20977,7 @@ packages: strip-ansi: 6.0.1 text-table: 0.2.0 typescript: 5.3.3 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 transitivePeerDependencies: - eslint - supports-color @@ -21058,114 +21211,29 @@ packages: react-router: 6.15.0(react@18.2.0) dev: false - /react-router@6.15.0(react@18.2.0): - resolution: {integrity: sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==} + /react-router-dom@6.15.0(react@18.2.0): + resolution: {integrity: sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' + react-dom: '>=16.8' dependencies: '@remix-run/router': 1.8.0 react: 18.2.0 + react-router: 6.15.0(react@18.2.0) dev: false - /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(esbuild@0.18.20)(eslint@8.48.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.2.2): - resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} + /react-router@6.15.0(react@18.2.0): + resolution: {integrity: sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==} engines: {node: '>=14.0.0'} - hasBin: true peerDependencies: - eslint: '*' - react: '>= 16' - typescript: ^3.2.1 || ^4 - peerDependenciesMeta: - typescript: - optional: true + react: '>=16.8' dependencies: - '@babel/core': 7.22.15 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.11(react-refresh@0.11.0)(webpack-dev-server@4.15.1)(webpack@5.88.2) - '@svgr/webpack': 5.5.0 - babel-jest: 27.5.1(@babel/core@7.22.15) - babel-loader: 8.3.0(@babel/core@7.22.15)(webpack@5.88.2) - babel-plugin-named-asset-import: 0.3.8(@babel/core@7.22.15) - babel-preset-react-app: 10.0.1 - bfj: 7.1.0 - browserslist: 4.21.10 - camelcase: 6.3.0 - case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.8.1(webpack@5.88.2) - css-minimizer-webpack-plugin: 3.4.1(esbuild@0.18.20)(webpack@5.88.2) - dotenv: 10.0.0 - dotenv-expand: 5.1.0 - eslint: 8.48.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0)(jest@27.5.1)(typescript@5.2.2) - eslint-webpack-plugin: 3.2.0(eslint@8.48.0)(webpack@5.88.2) - file-loader: 6.2.0(webpack@5.88.2) - fs-extra: 10.1.0 - html-webpack-plugin: 5.5.3(webpack@5.88.2) - identity-obj-proxy: 3.0.0 - jest: 27.5.1(ts-node@10.9.1) - jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1) - mini-css-extract-plugin: 2.7.6(webpack@5.88.2) - postcss: 8.4.29 - postcss-flexbugs-fixes: 5.0.2(postcss@8.4.29) - postcss-loader: 6.2.1(postcss@8.4.29)(webpack@5.88.2) - postcss-normalize: 10.0.1(browserslist@4.21.10)(postcss@8.4.29) - postcss-preset-env: 7.8.3(postcss@8.4.29) - prompts: 2.4.2 + '@remix-run/router': 1.8.0 react: 18.2.0 - react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.48.0)(typescript@5.2.2)(webpack@5.88.2) - react-refresh: 0.11.0 - resolve: 1.22.4 - resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.88.2) - semver: 7.5.4 - source-map-loader: 3.0.2(webpack@5.88.2) - style-loader: 3.3.3(webpack@5.88.2) - tailwindcss: 3.3.3(ts-node@10.9.1) - terser-webpack-plugin: 5.3.9(esbuild@0.18.20)(webpack@5.88.2) - typescript: 5.2.2 - webpack: 5.88.2(esbuild@0.18.20) - webpack-dev-server: 4.15.1(webpack@5.88.2) - webpack-manifest-plugin: 4.1.1(webpack@5.88.2) - workbox-webpack-plugin: 6.6.0(webpack@5.88.2) - optionalDependencies: - fsevents: 2.3.3 - transitivePeerDependencies: - - '@babel/plugin-syntax-flow' - - '@babel/plugin-transform-react-jsx' - - '@parcel/css' - - '@swc/core' - - '@types/babel__core' - - '@types/webpack' - - bufferutil - - canvas - - clean-css - - csso - - debug - - esbuild - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - fibers - - node-notifier - - node-sass - - rework - - rework-visit - - sass - - sass-embedded - - sockjs-client - - supports-color - - ts-node - - type-fest - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - webpack-hot-middleware - - webpack-plugin-serve dev: false - /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(esbuild@0.18.20)(eslint@8.48.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.3.3): + /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.48.0)(react@18.2.0)(typescript@5.3.3): resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} engines: {node: '>=14.0.0'} hasBin: true @@ -21189,7 +21257,7 @@ packages: camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 css-loader: 6.8.1(webpack@5.88.2) - css-minimizer-webpack-plugin: 3.4.1(esbuild@0.18.20)(webpack@5.88.2) + css-minimizer-webpack-plugin: 3.4.1(webpack@5.88.2) dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.48.0 @@ -21199,7 +21267,7 @@ packages: fs-extra: 10.1.0 html-webpack-plugin: 5.5.3(webpack@5.88.2) identity-obj-proxy: 3.0.0 - jest: 27.5.1(ts-node@10.9.1) + jest: 27.5.1 jest-resolve: 27.5.1 jest-watch-typeahead: 1.1.0(jest@27.5.1) mini-css-extract-plugin: 2.7.6(webpack@5.88.2) @@ -21219,10 +21287,10 @@ packages: semver: 7.5.4 source-map-loader: 3.0.2(webpack@5.88.2) style-loader: 3.3.3(webpack@5.88.2) - tailwindcss: 3.3.3(ts-node@10.9.1) - terser-webpack-plugin: 5.3.9(esbuild@0.18.20)(webpack@5.88.2) + tailwindcss: 3.3.3 + terser-webpack-plugin: 5.3.9(webpack@5.88.2) typescript: 5.3.3 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 webpack-dev-server: 4.15.1(webpack@5.88.2) webpack-manifest-plugin: 4.1.1(webpack@5.88.2) workbox-webpack-plugin: 6.6.0(webpack@5.88.2) @@ -21261,7 +21329,7 @@ packages: - webpack-hot-middleware - webpack-plugin-serve - /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(esbuild@0.18.20)(eslint@8.50.0)(react@18.2.0)(ts-node@10.9.1)(typescript@5.3.3): + /react-scripts@5.0.1(react@18.2.0)(typescript@5.3.3): resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} engines: {node: '>=14.0.0'} hasBin: true @@ -21285,17 +21353,16 @@ packages: camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 css-loader: 6.8.1(webpack@5.88.2) - css-minimizer-webpack-plugin: 3.4.1(esbuild@0.18.20)(webpack@5.88.2) + css-minimizer-webpack-plugin: 3.4.1(webpack@5.88.2) dotenv: 10.0.0 dotenv-expand: 5.1.0 - eslint: 8.50.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(eslint@8.50.0)(jest@27.5.1)(typescript@5.3.3) - eslint-webpack-plugin: 3.2.0(eslint@8.50.0)(webpack@5.88.2) + eslint-config-react-app: 7.0.1(jest@27.5.1)(typescript@5.3.3) + eslint-webpack-plugin: 3.2.0(webpack@5.88.2) file-loader: 6.2.0(webpack@5.88.2) fs-extra: 10.1.0 html-webpack-plugin: 5.5.3(webpack@5.88.2) identity-obj-proxy: 3.0.0 - jest: 27.5.1(ts-node@10.9.1) + jest: 27.5.1 jest-resolve: 27.5.1 jest-watch-typeahead: 1.1.0(jest@27.5.1) mini-css-extract-plugin: 2.7.6(webpack@5.88.2) @@ -21307,7 +21374,7 @@ packages: prompts: 2.4.2 react: 18.2.0 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.50.0)(typescript@5.3.3)(webpack@5.88.2) + react-dev-utils: 12.0.1(typescript@5.3.3)(webpack@5.88.2) react-refresh: 0.11.0 resolve: 1.22.4 resolve-url-loader: 4.0.0 @@ -21315,10 +21382,10 @@ packages: semver: 7.5.4 source-map-loader: 3.0.2(webpack@5.88.2) style-loader: 3.3.3(webpack@5.88.2) - tailwindcss: 3.3.3(ts-node@10.9.1) - terser-webpack-plugin: 5.3.9(esbuild@0.18.20)(webpack@5.88.2) + tailwindcss: 3.3.3 + terser-webpack-plugin: 5.3.9(webpack@5.88.2) typescript: 5.3.3 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 webpack-dev-server: 4.15.1(webpack@5.88.2) webpack-manifest-plugin: 4.1.1(webpack@5.88.2) workbox-webpack-plugin: 6.6.0(webpack@5.88.2) @@ -21902,7 +21969,7 @@ packages: node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 sass: ^1.3.0 sass-embedded: '*' - webpack: ^5 + webpack: ^5.0.0 peerDependenciesMeta: fibers: optional: true @@ -21915,7 +21982,7 @@ packages: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 /sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} @@ -21961,7 +22028,7 @@ packages: dependencies: '@types/json-schema': 7.0.12 ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) + ajv-formats: 2.1.1 ajv-keywords: 5.1.0(ajv@8.12.0) /scrypt-js@3.0.1: @@ -22236,12 +22303,12 @@ packages: resolution: {integrity: sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==} engines: {node: '>= 12.13.0'} peerDependencies: - webpack: ^5 + webpack: ^5.0.0 dependencies: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.0.2 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 /source-map-resolve@0.5.3: resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} @@ -22641,9 +22708,9 @@ packages: resolution: {integrity: sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==} engines: {node: '>= 12.13.0'} peerDependencies: - webpack: ^5 + webpack: ^5.0.0 dependencies: - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 /style-to-js@1.1.3: resolution: {integrity: sha512-zKI5gN/zb7LS/Vm0eUwjmjrXWw8IMtyA8aPBJZdYiQTXj4+wQ3IucOLIOnF7zCHxvW8UhIGh/uZh/t9zEHXNTQ==} @@ -22819,8 +22886,19 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tailwind-merge: 1.14.0 + dev: true + + /tailwind-styled-components@2.2.0(react@18.2.0): + resolution: {integrity: sha512-Ogemwk0p69aU8WE/ooJZHjqstdJgT5R6HGU6TFz2uSnveSEtvW+C6aWOjGCvCr5H/bREv0IbbQ4yODknRrLBRQ==} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + dependencies: + react: 18.2.0 + tailwind-merge: 1.14.0 + dev: false - /tailwindcss@3.3.3(ts-node@10.9.1): + /tailwindcss@3.3.3: resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} engines: {node: '>=14.0.0'} hasBin: true @@ -22842,7 +22920,7 @@ packages: postcss: 8.4.29 postcss-import: 15.1.0(postcss@8.4.29) postcss-js: 4.0.1(postcss@8.4.29) - postcss-load-config: 4.0.1(postcss@8.4.29)(ts-node@10.9.1) + postcss-load-config: 4.0.1(postcss@8.4.29) postcss-nested: 6.0.1(postcss@8.4.29) postcss-selector-parser: 6.0.13 resolve: 1.22.4 @@ -22878,14 +22956,14 @@ packages: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - /terser-webpack-plugin@5.3.9(esbuild@0.18.20)(webpack@5.88.2): + /terser-webpack-plugin@5.3.9(webpack@5.88.2): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' esbuild: '*' uglify-js: '*' - webpack: ^5 + webpack: ^5.1.0 peerDependenciesMeta: '@swc/core': optional: true @@ -22895,12 +22973,11 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.19 - esbuild: 0.18.20 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 terser: 5.19.4 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 /terser@5.19.4: resolution: {integrity: sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==} @@ -23175,7 +23252,7 @@ packages: resolution: {integrity: sha512-cA5MPLWGWYXvnlJb4TamUUx858HVHBsxxdy8l7jxODOLDyGYnQOllob2A2jyDghGa5iJHs2gzFNHvwGJ0ZfR8g==} dev: false - /ts-jest@27.1.5(@babel/core@7.22.15)(@types/jest@27.5.2)(esbuild@0.18.20)(jest@27.5.1)(typescript@5.3.3): + /ts-jest@27.1.5(@babel/core@7.22.15)(@types/jest@27.5.2)(jest@27.5.1)(typescript@5.3.3): resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -23199,9 +23276,8 @@ packages: '@babel/core': 7.22.15 '@types/jest': 27.5.2 bs-logger: 0.2.6 - esbuild: 0.18.20 fast-json-stable-stringify: 2.1.0 - jest: 27.5.1(ts-node@10.9.1) + jest: 27.5.1 jest-util: 27.5.1 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -23332,6 +23408,7 @@ packages: typescript: 5.3.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + dev: true /ts-unused-exports@10.0.1(typescript@5.2.2): resolution: {integrity: sha512-nWG8Y96pKem01Hw4j4+Mwuy+L0/9sKT7D61Q+OS3cii9ocQACuV6lu00B9qpiPhF4ReVWw3QYHDqV8+to2wbsg==} @@ -23381,16 +23458,6 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - /tsutils@3.21.0(typescript@5.2.2): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.2.2 - dev: false - /tsutils@3.21.0(typescript@5.3.3): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -23411,6 +23478,14 @@ packages: fsevents: 2.3.3 dev: true + /tulons@0.0.7: + resolution: {integrity: sha512-JyL9Vn4PPG2TTEJS35yqQgAMLd3IX9pFIlbiLmv47HuHTo2F3ihYg2yfMqde4hqGY1nGk77iJ/lvsTbAURJ8rg==} + dependencies: + axios: 0.27.2 + transitivePeerDependencies: + - debug + dev: false + /tulons@0.0.7(debug@4.3.4): resolution: {integrity: sha512-JyL9Vn4PPG2TTEJS35yqQgAMLd3IX9pFIlbiLmv47HuHTo2F3ihYg2yfMqde4hqGY1nGk77iJ/lvsTbAURJ8rg==} dependencies: @@ -23854,6 +23929,7 @@ packages: requiresBuild: true dependencies: node-gyp-build: 4.6.1 + dev: false /utf8-byte-length@1.0.4: resolution: {integrity: sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==} @@ -24088,29 +24164,6 @@ packages: - zod dev: false - /viem@2.7.1(typescript@5.3.3): - resolution: {integrity: sha512-izAX2KedTFnI2l0ZshtnlK2ZuDvSlKeuaanWyNwC4ffDgrCGtwX1bvVXO3Krh53lZgqvjd8UGpjGaBl3WqJ4yQ==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@adraffy/ens-normalize': 1.10.0 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/bip32': 1.3.2 - '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.3.3) - isows: 1.0.3(ws@8.13.0) - typescript: 5.3.3 - ws: 8.13.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - dev: false - /vite-node@0.34.3(@types/node@20.9.0): resolution: {integrity: sha512-+0TzJf1g0tYXj6tR2vEyiA42OPq68QkRZCu/ERSo2PtsDJfBpDyEfuKbRvLmZqi/CgC7SCBtyC+WjTGNMRIaig==} engines: {node: '>=v14.18.0'} @@ -24274,6 +24327,71 @@ packages: - encoding dev: true + /vitest@0.34.3: + resolution: {integrity: sha512-7+VA5Iw4S3USYk+qwPxHl8plCMhA5rtfwMjgoQXMT7rO5ldWcdsdo3U1QD289JgglGK4WeOzgoLTsGFu6VISyQ==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.6 + '@types/chai-subset': 1.3.3 + '@types/node': 20.9.0 + '@vitest/expect': 0.34.3 + '@vitest/runner': 0.34.3 + '@vitest/snapshot': 0.34.3 + '@vitest/spy': 0.34.3 + '@vitest/utils': 0.34.3 + acorn: 8.10.0 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.8 + debug: 4.3.4 + local-pkg: 0.4.3 + magic-string: 0.30.3 + pathe: 1.1.1 + picocolors: 1.0.0 + std-env: 3.4.3 + strip-literal: 1.3.0 + tinybench: 2.5.0 + tinypool: 0.7.0 + vite: 4.4.9(@types/node@20.9.0) + vite-node: 0.34.3(@types/node@20.9.0) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vitest@0.34.3(happy-dom@11.0.2): resolution: {integrity: sha512-7+VA5Iw4S3USYk+qwPxHl8plCMhA5rtfwMjgoQXMT7rO5ldWcdsdo3U1QD289JgglGK4WeOzgoLTsGFu6VISyQ==} engines: {node: '>=v14.18.0'} @@ -24431,7 +24549,7 @@ packages: '@tanstack/react-query': 4.35.0(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query-persist-client': 4.35.0(@tanstack/react-query@4.35.0) '@wagmi/core': 0.10.16(@types/react@18.2.21)(ethers@5.7.2)(react@18.2.0)(typescript@5.3.3) - abitype: 0.3.0(typescript@5.3.3)(zod@3.22.4) + abitype: 0.3.0(typescript@5.3.3) ethers: 5.7.2 react: 18.2.0 typescript: 5.3.3 @@ -24483,7 +24601,7 @@ packages: - zod dev: false - /wagmi@0.12.19(@types/react@18.2.21)(ethers@5.7.2)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(zod@3.22.4): + /wagmi@0.12.19(@types/react@18.2.21)(ethers@5.7.2)(react@18.2.0)(typescript@5.3.3)(zod@3.22.4): resolution: {integrity: sha512-S/el9BDb/HNeQWh1v8TvntMPX/CgKLDAoJqDb8i7jifLfWPqFL7gor3vnI1Vs6ZlB8uh7m+K1Qyg+mKhbITuDQ==} peerDependencies: ethers: '>=5.5.1 <6' @@ -24494,7 +24612,7 @@ packages: optional: true dependencies: '@tanstack/query-sync-storage-persister': 4.35.0 - '@tanstack/react-query': 4.35.0(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query': 4.35.0(react@18.2.0) '@tanstack/react-query-persist-client': 4.35.0(@tanstack/react-query@4.35.0) '@wagmi/core': 0.10.17(@types/react@18.2.21)(ethers@5.7.2)(react@18.2.0)(typescript@5.3.3)(zod@3.22.4) abitype: 0.3.0(typescript@5.3.3)(zod@3.22.4) @@ -24612,21 +24730,21 @@ packages: resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} engines: {node: '>= 12.13.0'} peerDependencies: - webpack: ^5 + webpack: ^4.0.0 || ^5.0.0 dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 /webpack-dev-server@4.15.1(webpack@5.88.2): resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} engines: {node: '>= 12.13.0'} hasBin: true peerDependencies: - webpack: ^5 + webpack: ^4.37.0 || ^5.0.0 webpack-cli: '*' peerDependenciesMeta: webpack: @@ -24662,9 +24780,9 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 webpack-dev-middleware: 5.3.3(webpack@5.88.2) - ws: 8.14.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 8.14.0 transitivePeerDependencies: - bufferutil - debug @@ -24675,10 +24793,10 @@ packages: resolution: {integrity: sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==} engines: {node: '>=12.22.0'} peerDependencies: - webpack: ^5 + webpack: ^4.44.2 || ^5.47.0 dependencies: tapable: 2.2.1 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 webpack-sources: 2.3.1 /webpack-merge@5.9.0: @@ -24705,7 +24823,7 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - /webpack@5.88.2(esbuild@0.18.20): + /webpack@5.88.2: resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} engines: {node: '>=10.13.0'} hasBin: true @@ -24736,7 +24854,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(esbuild@0.18.20)(webpack@5.88.2) + terser-webpack-plugin: 5.3.9(webpack@5.88.2) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -25021,12 +25139,12 @@ packages: resolution: {integrity: sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==} engines: {node: '>=10.0.0'} peerDependencies: - webpack: ^5 + webpack: ^4.4.0 || ^5.9.0 dependencies: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.88.2(esbuild@0.18.20) + webpack: 5.88.2 webpack-sources: 1.4.3 workbox-build: 6.6.0 transitivePeerDependencies: @@ -25084,6 +25202,18 @@ packages: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 + /ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + /ws@7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10): resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} engines: {node: '>=8.3.0'} @@ -25098,6 +25228,7 @@ packages: dependencies: bufferutil: 4.0.8 utf-8-validate: 5.0.10 + dev: false /ws@7.5.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): resolution: {integrity: sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==} @@ -25115,6 +25246,18 @@ packages: utf-8-validate: 5.0.10 dev: false + /ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + /ws@7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10): resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} engines: {node: '>=8.3.0'} @@ -25129,6 +25272,7 @@ packages: dependencies: bufferutil: 4.0.8 utf-8-validate: 5.0.10 + dev: false /ws@8.11.0: resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} @@ -25156,6 +25300,18 @@ packages: optional: true dev: false + /ws@8.14.0: + resolution: {integrity: sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + /ws@8.14.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): resolution: {integrity: sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg==} engines: {node: '>=10.0.0'} @@ -25170,6 +25326,7 @@ packages: dependencies: bufferutil: 4.0.8 utf-8-validate: 5.0.10 + dev: false /xml-name-validator@3.0.0: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} @@ -25367,3 +25524,7 @@ packages: dependencies: '@types/node': 18.17.14 dev: false + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false