From 0a1255257a0a919a1061fd44e874e2a10fe1bcf2 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 27 Jan 2025 11:21:38 +0100 Subject: [PATCH 1/6] fix(validator): replace metadata validator with SDK Replaces local implementation of metadata validation with SDK version --- src/parsing/parseUriEvent.ts | 65 +++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/src/parsing/parseUriEvent.ts b/src/parsing/parseUriEvent.ts index 4549612..6ca0b84 100644 --- a/src/parsing/parseUriEvent.ts +++ b/src/parsing/parseUriEvent.ts @@ -1,12 +1,13 @@ import { z } from "zod"; import { ParserMethod } from "@/indexer/LogParser.js"; -import { HypercertMetadataValidator, Metadata } from "@/utils/metadata.zod.js"; +import { Metadata } from "@/utils/metadata.zod.js"; import { parseToOzMerkleTree } from "@/utils/parseToOzMerkleTree.js"; import { StandardMerkleTreeData } from "@openzeppelin/merkle-tree/dist/standard.js"; import { Tables } from "@/types/database.types.js"; import { supabase } from "@/clients/supabaseClient.js"; import { getAddress, isAddress } from "viem"; import { messages } from "@/utils/validation.js"; +import { HypercertMetadata, validateMetaData } from "@hypercerts-org/sdk"; const DO_NOT_PARSE = [ "ipfs://null", @@ -55,57 +56,61 @@ export const parseUriEvent: ParserMethod = async ({ } // Get and validate metadata - const data = await getData({ uri }); - if (!data) { + const ipfsData = await getData({ uri }); + if (!ipfsData) { console.warn(`[parseUriEvent] Metadata fetching failed. [uri: ${uri}]`); return [{ metadata: { uri, parsed: false } }]; } - const res = HypercertMetadataValidator.safeParse(data); - - if (!res.success) { - console.warn( - `[parseUriEvent] Metadata validation failed`, - res.error.message, - ); - for (const error of res.error.issues) { - console.log("error", error.message); + const { valid, data, errors } = validateMetaData(ipfsData); + + if (!valid) { + console.warn(`[parseUriEvent] Metadata validation failed`, errors); + if (errors) { + Object.values(errors).forEach((error) => { + console.log("error", error); + }); } return [{ metadata: { uri, parsed: false } }]; } + const fetchedMetadata = data as HypercertMetadata; + const metadata = { - name: res.data.name, - description: res.data.description, - external_url: res.data.external_url, - image: res.data.image, - properties: res.data.properties, - contributors: res.data.hypercert?.contributors.value, - impact_scope: res.data.hypercert?.impact_scope.value, - impact_timeframe_from: res.data.hypercert?.impact_timeframe?.value?.[0], - impact_timeframe_to: res.data.hypercert?.impact_timeframe?.value?.[1], - work_scope: res.data.hypercert?.work_scope.value, - work_timeframe_from: res.data.hypercert?.work_timeframe?.value?.[0], - work_timeframe_to: res.data.hypercert?.work_timeframe?.value?.[1], - rights: res.data.hypercert?.rights?.value, - allow_list_uri: res.data.allowList, + name: fetchedMetadata.name, + description: fetchedMetadata.description, + external_url: fetchedMetadata.external_url, + image: fetchedMetadata.image, + properties: fetchedMetadata.properties, + contributors: fetchedMetadata.hypercert?.contributors.value, + impact_scope: fetchedMetadata.hypercert?.impact_scope.value, + impact_timeframe_from: + fetchedMetadata.hypercert?.impact_timeframe?.value?.[0], + impact_timeframe_to: + fetchedMetadata.hypercert?.impact_timeframe?.value?.[1], + work_scope: fetchedMetadata.hypercert?.work_scope.value, + work_timeframe_from: fetchedMetadata.hypercert?.work_timeframe?.value?.[0], + work_timeframe_to: fetchedMetadata.hypercert?.work_timeframe?.value?.[1], + rights: fetchedMetadata.hypercert?.rights?.value, + allow_list_uri: fetchedMetadata.allowList, parsed: true, uri, }; // If allowlist is present, fetch and parse it if (metadata.allow_list_uri) { + const uri = metadata.allow_list_uri; const res = await getData({ - uri: metadata.allow_list_uri, + uri, }); if (res) { - const tree = parseToOzMerkleTree(res, metadata.allow_list_uri); + const tree = parseToOzMerkleTree(res, uri); if (tree) { allow_list = { data: tree.dump(), root: tree.root, - uri: metadata.allow_list_uri, + uri, parsed: true, }; @@ -124,7 +129,7 @@ export const parseUriEvent: ParserMethod = async ({ hypercert_allow_list = { id: crypto.randomUUID(), claims_id: claim_id, - allow_list_data_uri: metadata.allow_list_uri, + allow_list_data_uri: uri, parsed: true, }; } From dde9cbee79b6ba1c53189cd6a30d54ca4da029b4 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Mon, 27 Jan 2025 11:25:59 +0100 Subject: [PATCH 2/6] chore(cleanup): remove unused validator lib remove unused metadata zod validator and update coverage thresholds --- src/parsing/parseUriEvent.ts | 3 +- src/utils/metadata.zod.ts | 72 ------------------------------------ vitest.config.ts | 4 +- 3 files changed, 3 insertions(+), 76 deletions(-) delete mode 100644 src/utils/metadata.zod.ts diff --git a/src/parsing/parseUriEvent.ts b/src/parsing/parseUriEvent.ts index 6ca0b84..ee631c2 100644 --- a/src/parsing/parseUriEvent.ts +++ b/src/parsing/parseUriEvent.ts @@ -1,6 +1,5 @@ import { z } from "zod"; import { ParserMethod } from "@/indexer/LogParser.js"; -import { Metadata } from "@/utils/metadata.zod.js"; import { parseToOzMerkleTree } from "@/utils/parseToOzMerkleTree.js"; import { StandardMerkleTreeData } from "@openzeppelin/merkle-tree/dist/standard.js"; import { Tables } from "@/types/database.types.js"; @@ -33,7 +32,7 @@ export type AllowListData = { }; export type MetadataResult = { - metadata: Partial; + metadata: Partial; allow_list?: AllowListData; hypercert_allow_list?: Tables<"hypercert_allow_lists">; }; diff --git a/src/utils/metadata.zod.ts b/src/utils/metadata.zod.ts deleted file mode 100644 index 405b7a5..0000000 --- a/src/utils/metadata.zod.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { HypercertMetadata, HypercertClaimdata } from "@hypercerts-org/sdk"; -import { z } from "zod"; - -const claimData: z.ZodType = z.object({ - impact_scope: z.object({ - name: z.string().optional(), - value: z.array(z.string()), - excludes: z.array(z.string()).optional(), - display_value: z.string().optional(), - }), - work_scope: z.object({ - name: z.string().optional(), - value: z.array(z.string()), - excludes: z.array(z.string()).optional(), - display_value: z.string().optional(), - }), - work_timeframe: z.object({ - name: z.string().optional(), - value: z.array(z.number()), - display_value: z.string().optional(), - }), - impact_timeframe: z.object({ - name: z.string().optional(), - value: z.array(z.number()), - display_value: z.string().optional(), - }), - contributors: z.object({ - name: z.string().optional(), - value: z.array(z.string()), - display_value: z.string().optional(), - }), - rights: z.object({ - name: z.string().optional(), - value: z.array(z.string()), - excludes: z.array(z.string()).optional(), - display_value: z.string().optional(), - }), -}); - -export const HypercertMetadataValidator: z.ZodType = - z.object({ - name: z.string({ message: "Name is required" }), - description: z.string({ message: "Description is required" }), - external_url: z - .string({ message: "External URL is not a string" }) - .optional(), - image: z.string({ message: "Image is required" }), - version: z.string({ message: "Version is not a string" }).optional(), - ref: z.string({ message: "Ref is not a string" }).optional(), - allowList: z.string({ message: "Allow List is not a string" }).optional(), - properties: z - .array( - z - .object({ - trait_type: z - .string({ message: "Trait type is not a string" }) - .optional(), - value: z.string({ message: "Value is not a string" }).optional(), - data: z.any().optional(), - }) - .partial() - .and( - z.record( - z.string().or(z.number()).or(z.boolean()).or(z.any()).optional(), - ), - ), - ) - .optional(), - hypercert: claimData, - }); - -export type Metadata = z.infer; diff --git a/vitest.config.ts b/vitest.config.ts index 6c85cc0..cfb914f 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -21,10 +21,10 @@ export default defineConfig({ // If you want a coverage reports even if your tests are failing, include the reportOnFailure option reportOnFailure: true, thresholds: { - lines: 27, + lines: 26, branches: 72, functions: 70, - statements: 27, + statements: 26, }, include: ["src/**/*.ts"], exclude: [ From e01dfcccee372ab53f7c5989aa336b5f10d480f1 Mon Sep 17 00:00:00 2001 From: jipstavenuiter Date: Fri, 24 Jan 2025 12:23:29 -0300 Subject: [PATCH 3/6] chore: update viem and supabase dependencies --- package.json | 4 +- pnpm-lock.yaml | 908 +++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 730 insertions(+), 182 deletions(-) diff --git a/package.json b/package.json index 7ea824f..b84b851 100644 --- a/package.json +++ b/package.json @@ -53,14 +53,14 @@ "prool": "^0.0.15", "rimraf": "^5.0.5", "sinon": "^17.0.1", - "supabase": "^2.2.1", + "supabase": "^2.6.8", "supertest": "^6.3.4", "ts-mockito": "^2.6.1", "tsx": "^4.7.1", "typescript": "^5.5.2", "typescript-eslint": "^7.0.2", "vite-tsconfig-paths": "^4.3.1", - "vitest": "^1.3.1", + "vitest": "^1.6.0", "vitest-mock-extended": "^1.3.1", "wait-on": "^7.2.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3ef933b..4a61e25 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,13 +13,13 @@ importers: version: 1.0.24(zod@3.23.8) '@hypercerts-org/contracts': specifier: 2.0.0-alpha.11 - version: 2.0.0-alpha.11(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)))(@swc/core@1.10.4)(@types/node@20.11.19)(ethers@6.13.1)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.4))(typescript@5.5.2) + version: 2.0.0-alpha.11(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)))(@swc/core@1.10.4)(@types/node@20.11.19)(ethers@6.13.1)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2) '@hypercerts-org/marketplace-sdk': specifier: ^0.3.37 - version: 0.3.37(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)))(@types/node@20.11.19)(ethers@6.13.1)(graphql@16.8.1)(rollup@4.12.0)(svelte@4.2.18)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.4))(typescript@5.5.2) + version: 0.3.37(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)))(@types/node@20.11.19)(ethers@6.13.1)(graphql@16.8.1)(rollup@4.32.0)(svelte@4.2.18)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.4))(typescript@5.5.2) '@hypercerts-org/sdk': specifier: ^2.3.0 - version: 2.3.0(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)))(@types/node@20.11.19)(ethers@6.13.1)(graphql@16.8.1)(rollup@4.12.0)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.4))(typescript@5.5.2) + version: 2.3.0(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)))(@types/node@20.11.19)(ethers@6.13.1)(graphql@16.8.1)(rollup@4.32.0)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.4))(typescript@5.5.2) '@opentelemetry/instrumentation': specifier: ^0.52.1 version: 0.52.1(@opentelemetry/api@1.9.0) @@ -37,7 +37,7 @@ importers: version: 4.17.6 axios: specifier: ^1.7.2 - version: 1.7.2(debug@4.3.5) + version: 1.7.2 ethers: specifier: ^6.13.1 version: 6.13.1 @@ -113,7 +113,7 @@ importers: version: 0.0.10 '@vitest/coverage-v8': specifier: ^1.3.1 - version: 1.3.1(vitest@1.3.1(@types/node@20.11.19)) + version: 1.3.1(vitest@1.6.0(@types/node@20.11.19)) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -128,7 +128,7 @@ importers: version: 2.0.0(kysely@0.27.4)(postgres@3.4.4) kysely-supabase: specifier: ^0.2.0 - version: 0.2.0(@supabase/supabase-js@2.47.10)(kysely@0.27.4)(supabase@2.2.1) + version: 0.2.0(@supabase/supabase-js@2.47.10)(kysely@0.27.4)(supabase@2.6.8) msw: specifier: ^2.2.2 version: 2.2.2(typescript@5.5.2) @@ -151,8 +151,8 @@ importers: specifier: ^17.0.1 version: 17.0.1 supabase: - specifier: ^2.2.1 - version: 2.2.1 + specifier: ^2.6.8 + version: 2.6.8 supertest: specifier: ^6.3.4 version: 6.3.4 @@ -170,13 +170,13 @@ importers: version: 7.0.2(eslint@8.56.0)(typescript@5.5.2) vite-tsconfig-paths: specifier: ^4.3.1 - version: 4.3.1(typescript@5.5.2)(vite@5.1.4(@types/node@20.11.19)) + version: 4.3.1(typescript@5.5.2)(vite@5.4.14(@types/node@20.11.19)) vitest: - specifier: ^1.3.1 - version: 1.3.1(@types/node@20.11.19) + specifier: ^1.6.0 + version: 1.6.0(@types/node@20.11.19) vitest-mock-extended: specifier: ^1.3.1 - version: 1.3.1(typescript@5.5.2)(vitest@1.3.1(@types/node@20.11.19)) + version: 1.3.1(typescript@5.5.2)(vitest@1.6.0(@types/node@20.11.19)) wait-on: specifier: ^7.2.0 version: 7.2.0 @@ -295,6 +295,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.19.12': resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} @@ -307,6 +313,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.19.12': resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} @@ -319,6 +331,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.19.12': resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} @@ -331,6 +349,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.19.12': resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} @@ -343,6 +367,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.19.12': resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} @@ -355,6 +385,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.19.12': resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} @@ -367,6 +403,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.19.12': resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} @@ -379,6 +421,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.19.12': resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} @@ -391,6 +439,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.19.12': resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} @@ -403,6 +457,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.19.12': resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} @@ -415,6 +475,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.19.12': resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} @@ -427,6 +493,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.19.12': resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} @@ -439,6 +511,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.19.12': resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} @@ -451,6 +529,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.19.12': resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} @@ -463,6 +547,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.19.12': resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} @@ -475,6 +565,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.19.12': resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} @@ -487,6 +583,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-x64@0.19.12': resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} @@ -499,6 +601,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-x64@0.19.12': resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} @@ -511,6 +619,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.19.12': resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} @@ -523,6 +637,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.19.12': resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} @@ -535,6 +655,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.19.12': resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} @@ -547,6 +673,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.19.12': resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} @@ -559,6 +691,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -776,8 +914,8 @@ packages: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': @@ -795,6 +933,9 @@ packages: '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/trace-mapping@0.3.22': resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} @@ -1277,66 +1418,161 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.32.0': + resolution: {integrity: sha512-G2fUQQANtBPsNwiVFg4zKiPQyjVKZCUdQUol53R8E71J7AsheRMV/Yv/nB8giOcOVqP7//eB5xPqieBYZe9bGg==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.12.0': resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.32.0': + resolution: {integrity: sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.12.0': resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.32.0': + resolution: {integrity: sha512-44n/X3lAlWsEY6vF8CzgCx+LQaoqWGN7TzUfbJDiTIOjJm4+L2Yq+r5a8ytQRGyPqgJDs3Rgyo8eVL7n9iW6AQ==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.12.0': resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.32.0': + resolution: {integrity: sha512-F9ct0+ZX5Np6+ZDztxiGCIvlCaW87HBdHcozUfsHnj1WCUTBUubAoanhHUfnUHZABlElyRikI0mgcw/qdEm2VQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.32.0': + resolution: {integrity: sha512-JpsGxLBB2EFXBsTLHfkZDsXSpSmKD3VxXCgBQtlPcuAqB8TlqtLcbeMhxXQkCDv1avgwNjF8uEIbq5p+Cee0PA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.32.0': + resolution: {integrity: sha512-wegiyBT6rawdpvnD9lmbOpx5Sph+yVZKHbhnSP9MqUEDX08G4UzMU+D87jrazGE7lRSyTRs6NEYHtzfkJ3FjjQ==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.12.0': resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.32.0': + resolution: {integrity: sha512-3pA7xecItbgOs1A5H58dDvOUEboG5UfpTq3WzAdF54acBbUM+olDJAPkgj1GRJ4ZqE12DZ9/hNS2QZk166v92A==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.32.0': + resolution: {integrity: sha512-Y7XUZEVISGyge51QbYyYAEHwpGgmRrAxQXO3siyYo2kmaj72USSG8LtlQQgAtlGfxYiOwu+2BdbPjzEpcOpRmQ==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.12.0': resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.32.0': + resolution: {integrity: sha512-r7/OTF5MqeBrZo5omPXcTnjvv1GsrdH8a8RerARvDFiDwFpDVDnJyByYM/nX+mvks8XXsgPUxkwe/ltaX2VH7w==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.12.0': resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.32.0': + resolution: {integrity: sha512-HJbifC9vex9NqnlodV2BHVFNuzKL5OnsV2dvTw6e1dpZKkNjPG6WUq+nhEYV6Hv2Bv++BXkwcyoGlXnPrjAKXw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.32.0': + resolution: {integrity: sha512-VAEzZTD63YglFlWwRj3taofmkV1V3xhebDXffon7msNz4b14xKsz7utO6F8F4cqt8K/ktTl9rm88yryvDpsfOw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.32.0': + resolution: {integrity: sha512-Sts5DST1jXAc9YH/iik1C9QRsLcCoOScf3dfbY5i4kH9RJpKxiTBXqm7qU5O6zTXBTEZry69bGszr3SMgYmMcQ==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.12.0': resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.32.0': + resolution: {integrity: sha512-qhlXeV9AqxIyY9/R1h1hBD6eMvQCO34ZmdYvry/K+/MBs6d1nRFLm6BOiITLVI+nFAAB9kUB6sdJRKyVHXnqZw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.32.0': + resolution: {integrity: sha512-8ZGN7ExnV0qjXa155Rsfi6H8M4iBBwNLBM9lcVS+4NcSzOFaNqmt7djlox8pN1lWrRPMRRQ8NeDlozIGx3Omsw==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.12.0': resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.32.0': + resolution: {integrity: sha512-VDzNHtLLI5s7xd/VubyS10mq6TxvZBp+4NRWoW+Hi3tgV05RtVm4qK99+dClwTN1McA6PHwob6DEJ6PlXbY83A==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.12.0': resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.32.0': + resolution: {integrity: sha512-qcb9qYDlkxz9DxJo7SDhWxTWV1gFuwznjbTiov289pASxlfGbaOD54mgbs9+z94VwrXtKTu+2RqwlSTbiOqxGg==} + cpu: [x64] + os: [linux] + '@rollup/rollup-win32-arm64-msvc@4.12.0': resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.32.0': + resolution: {integrity: sha512-pFDdotFDMXW2AXVbfdUEfidPAk/OtwE/Hd4eYMTNVVaCQ6Yl8et0meDaKNL63L44Haxv4UExpv9ydSf3aSayDg==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.12.0': resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.32.0': + resolution: {integrity: sha512-/TG7WfrCAjeRNDvI4+0AAMoHxea/USWhAzf9PVDFHbcqrQ7hMMKp4jZIy4VEjk72AAfN5k4TiSMRXRKf/0akSw==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.12.0': resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.32.0': + resolution: {integrity: sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA==} + cpu: [x64] + os: [win32] + '@scure/base@1.1.7': resolution: {integrity: sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==} @@ -1661,6 +1897,9 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/express-serve-static-core@4.17.43': resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} @@ -1859,32 +2098,32 @@ packages: '@vitest/expect@0.34.6': resolution: {integrity: sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==} - '@vitest/expect@1.3.1': - resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} + '@vitest/expect@1.6.0': + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} '@vitest/runner@0.34.6': resolution: {integrity: sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==} - '@vitest/runner@1.3.1': - resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==} + '@vitest/runner@1.6.0': + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} '@vitest/snapshot@0.34.6': resolution: {integrity: sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==} - '@vitest/snapshot@1.3.1': - resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==} + '@vitest/snapshot@1.6.0': + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} '@vitest/spy@0.34.6': resolution: {integrity: sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==} - '@vitest/spy@1.3.1': - resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} + '@vitest/spy@1.6.0': + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} '@vitest/utils@0.34.6': resolution: {integrity: sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==} - '@vitest/utils@1.3.1': - resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} + '@vitest/utils@1.6.0': + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} '@volar/language-core@2.3.4': resolution: {integrity: sha512-wXBhY11qG6pCDAqDnbBRFIDSIwbqkWI7no+lj5+L7IlA7HRIjRP7YQLGzT0LF4lS6eHkMSsclXqy9DwYJasZTQ==} @@ -2020,6 +2259,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + adm-zip@0.4.16: resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} engines: {node: '>=0.3.0'} @@ -2103,8 +2347,9 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} @@ -2157,8 +2402,9 @@ packages: axios@1.7.7: resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} - axobject-query@4.0.0: - resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} b4a@1.6.7: resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} @@ -2309,6 +2555,10 @@ packages: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -2535,6 +2785,15 @@ packages: supports-color: optional: true + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize@4.0.0: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} @@ -2585,10 +2844,6 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -2706,6 +2961,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -3381,8 +3641,8 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} @@ -3579,6 +3839,7 @@ packages: lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -3618,8 +3879,8 @@ packages: resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==} engines: {node: '>=12'} - magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} magic-string@0.30.7: resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} @@ -3803,6 +4064,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} @@ -4128,6 +4394,10 @@ packages: resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -4255,8 +4525,8 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} read-cmd-shim@5.0.0: resolution: {integrity: sha512-SEbJV7tohp3DAAILbEMPXavBjAnMN0tVnh4+9G8ihV4Pq3HYF9h8QNez9zkJ1ILkv9G2BjdzwctznGZXgu/HGw==} @@ -4362,6 +4632,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.32.0: + resolution: {integrity: sha512-JmrhfQR31Q4AuNBjjAX4s+a/Pu/Q8Q9iwjWBsjRH1q52SPFE2NqRMK6fUZKKnvKO6id+h7JIRf0oYsph53eATg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-async@3.0.0: resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} engines: {node: '>=0.12.0'} @@ -4528,6 +4803,10 @@ packages: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -4636,8 +4915,8 @@ packages: resolution: {integrity: sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==} engines: {node: '>=16'} - supabase@2.2.1: - resolution: {integrity: sha512-uTu8f4kT9wE3EEQTAJAWFlHyu8ymauFxWEz2FDGIQ2MzlD1Xb1NCHtsj/xvmJWqrGI1jnBYcPuatZVTHj1jR1g==} + supabase@2.6.8: + resolution: {integrity: sha512-rgz9DVLso6LQ9VLKYXPDkvKgyFCYi6os1+3QS439yKkq4etbYn3KsedFBen0m4lgrHylBNL6W2qOB4+J/kgOLQ==} engines: {npm: '>=8'} hasBin: true @@ -4738,8 +5017,8 @@ packages: resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} engines: {node: '>=14.0.0'} - tinypool@0.8.2: - resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} engines: {node: '>=14.0.0'} tinyspy@2.2.1: @@ -4863,6 +5142,10 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -5022,8 +5305,8 @@ packages: engines: {node: '>=v14.18.0'} hasBin: true - vite-node@1.3.1: - resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} + vite-node@1.6.0: + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -5063,6 +5346,37 @@ packages: terser: optional: true + vite@5.4.14: + resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + vitest-mock-extended@1.3.1: resolution: {integrity: sha512-OpghYjh4BDuQ/Mzs3lFMQ1QRk9D8/2O9T47MLUA5eLn7K4RWIy+MfIivYOWEyxjTENjsBnzgMihDjyNalN/K0Q==} peerDependencies: @@ -5100,15 +5414,15 @@ packages: webdriverio: optional: true - vitest@1.3.1: - resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==} + vitest@1.6.0: + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.3.1 - '@vitest/ui': 1.3.1 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -5312,8 +5626,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} yoctocolors@2.0.2: @@ -5353,7 +5667,7 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 '@aws-crypto/sha256-js@1.2.2': @@ -5432,138 +5746,207 @@ snapshots: '@esbuild/aix-ppc64@0.20.1': optional: true + '@esbuild/aix-ppc64@0.21.5': + optional: true + '@esbuild/android-arm64@0.19.12': optional: true '@esbuild/android-arm64@0.20.1': optional: true + '@esbuild/android-arm64@0.21.5': + optional: true + '@esbuild/android-arm@0.19.12': optional: true '@esbuild/android-arm@0.20.1': optional: true + '@esbuild/android-arm@0.21.5': + optional: true + '@esbuild/android-x64@0.19.12': optional: true '@esbuild/android-x64@0.20.1': optional: true + '@esbuild/android-x64@0.21.5': + optional: true + '@esbuild/darwin-arm64@0.19.12': optional: true '@esbuild/darwin-arm64@0.20.1': optional: true + '@esbuild/darwin-arm64@0.21.5': + optional: true + '@esbuild/darwin-x64@0.19.12': optional: true '@esbuild/darwin-x64@0.20.1': optional: true + '@esbuild/darwin-x64@0.21.5': + optional: true + '@esbuild/freebsd-arm64@0.19.12': optional: true '@esbuild/freebsd-arm64@0.20.1': optional: true + '@esbuild/freebsd-arm64@0.21.5': + optional: true + '@esbuild/freebsd-x64@0.19.12': optional: true '@esbuild/freebsd-x64@0.20.1': optional: true + '@esbuild/freebsd-x64@0.21.5': + optional: true + '@esbuild/linux-arm64@0.19.12': optional: true '@esbuild/linux-arm64@0.20.1': optional: true + '@esbuild/linux-arm64@0.21.5': + optional: true + '@esbuild/linux-arm@0.19.12': optional: true '@esbuild/linux-arm@0.20.1': optional: true + '@esbuild/linux-arm@0.21.5': + optional: true + '@esbuild/linux-ia32@0.19.12': optional: true '@esbuild/linux-ia32@0.20.1': optional: true + '@esbuild/linux-ia32@0.21.5': + optional: true + '@esbuild/linux-loong64@0.19.12': optional: true '@esbuild/linux-loong64@0.20.1': optional: true + '@esbuild/linux-loong64@0.21.5': + optional: true + '@esbuild/linux-mips64el@0.19.12': optional: true '@esbuild/linux-mips64el@0.20.1': optional: true + '@esbuild/linux-mips64el@0.21.5': + optional: true + '@esbuild/linux-ppc64@0.19.12': optional: true '@esbuild/linux-ppc64@0.20.1': optional: true + '@esbuild/linux-ppc64@0.21.5': + optional: true + '@esbuild/linux-riscv64@0.19.12': optional: true '@esbuild/linux-riscv64@0.20.1': optional: true + '@esbuild/linux-riscv64@0.21.5': + optional: true + '@esbuild/linux-s390x@0.19.12': optional: true '@esbuild/linux-s390x@0.20.1': optional: true + '@esbuild/linux-s390x@0.21.5': + optional: true + '@esbuild/linux-x64@0.19.12': optional: true '@esbuild/linux-x64@0.20.1': optional: true + '@esbuild/linux-x64@0.21.5': + optional: true + '@esbuild/netbsd-x64@0.19.12': optional: true '@esbuild/netbsd-x64@0.20.1': optional: true + '@esbuild/netbsd-x64@0.21.5': + optional: true + '@esbuild/openbsd-x64@0.19.12': optional: true '@esbuild/openbsd-x64@0.20.1': optional: true + '@esbuild/openbsd-x64@0.21.5': + optional: true + '@esbuild/sunos-x64@0.19.12': optional: true '@esbuild/sunos-x64@0.20.1': optional: true + '@esbuild/sunos-x64@0.21.5': + optional: true + '@esbuild/win32-arm64@0.19.12': optional: true '@esbuild/win32-arm64@0.20.1': optional: true + '@esbuild/win32-arm64@0.21.5': + optional: true + '@esbuild/win32-ia32@0.19.12': optional: true '@esbuild/win32-ia32@0.20.1': optional: true + '@esbuild/win32-ia32@0.21.5': + optional: true + '@esbuild/win32-x64@0.19.12': optional: true '@esbuild/win32-x64@0.20.1': optional: true + '@esbuild/win32-x64@0.21.5': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@8.56.0)': dependencies: eslint: 8.56.0 @@ -5574,7 +5957,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -5897,7 +6280,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.2 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -5936,6 +6319,7 @@ snapshots: - playwright - safaridriver - sass + - sass-embedded - stylus - sugarss - supports-color @@ -5944,7 +6328,7 @@ snapshots: - webdriverio - zod - '@hypercerts-org/contracts@2.0.0-alpha.11(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)))(@swc/core@1.10.4)(@types/node@20.11.19)(ethers@6.13.1)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.4))(typescript@5.5.2)': + '@hypercerts-org/contracts@2.0.0-alpha.11(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)))(@swc/core@1.10.4)(@types/node@20.11.19)(ethers@6.13.1)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)': dependencies: '@starboardventures/hardhat-verify': 1.0.1(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)) '@tenderly/hardhat-tenderly': 2.3.0(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)))(@swc/core@1.10.4)(@types/node@20.11.19)(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)) @@ -5964,9 +6348,9 @@ snapshots: - typescript - utf-8-validate - '@hypercerts-org/marketplace-sdk@0.3.37(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)))(@types/node@20.11.19)(ethers@6.13.1)(graphql@16.8.1)(rollup@4.12.0)(svelte@4.2.18)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.4))(typescript@5.5.2)': + '@hypercerts-org/marketplace-sdk@0.3.37(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)))(@types/node@20.11.19)(ethers@6.13.1)(graphql@16.8.1)(rollup@4.32.0)(svelte@4.2.18)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.4))(typescript@5.5.2)': dependencies: - '@hypercerts-org/sdk': 2.3.0(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)))(@types/node@20.11.19)(ethers@6.13.1)(graphql@16.8.1)(rollup@4.12.0)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.4))(typescript@5.5.2) + '@hypercerts-org/sdk': 2.3.0(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)))(@types/node@20.11.19)(ethers@6.13.1)(graphql@16.8.1)(rollup@4.32.0)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.4))(typescript@5.5.2) '@supabase/supabase-js': 2.47.10 '@urql/core': 5.0.4(graphql@16.8.1) ethers: 6.13.1 @@ -5989,16 +6373,16 @@ snapshots: - typescript - utf-8-validate - '@hypercerts-org/sdk@2.3.0(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)))(@types/node@20.11.19)(ethers@6.13.1)(graphql@16.8.1)(rollup@4.12.0)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.4))(typescript@5.5.2)': + '@hypercerts-org/sdk@2.3.0(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)))(@types/node@20.11.19)(ethers@6.13.1)(graphql@16.8.1)(rollup@4.32.0)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.4))(typescript@5.5.2)': dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - '@hypercerts-org/contracts': 2.0.0-alpha.11(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)))(@swc/core@1.10.4)(@types/node@20.11.19)(ethers@6.13.1)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.4))(typescript@5.5.2) + '@hypercerts-org/contracts': 2.0.0-alpha.11(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)))(@swc/core@1.10.4)(@types/node@20.11.19)(ethers@6.13.1)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2) '@openzeppelin/merkle-tree': 1.0.7 '@swc/core': 1.10.4 ajv: 8.16.0 axios: 1.7.7 dotenv: 16.4.5 - rollup-plugin-swc3: 0.11.2(@swc/core@1.10.4)(rollup@4.12.0) + rollup-plugin-swc3: 0.11.2(@swc/core@1.10.4)(rollup@4.32.0) viem: 2.22.9(typescript@5.5.2)(zod@3.23.8) zod: 3.23.8 transitivePeerDependencies: @@ -6067,10 +6451,10 @@ snapshots: '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.22 - '@jridgewell/gen-mapping@0.3.5': + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} @@ -6081,6 +6465,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/trace-mapping@0.3.22': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -6089,12 +6475,12 @@ snapshots: '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@metamask/eth-sig-util@4.0.1': dependencies: @@ -6199,7 +6585,7 @@ snapshots: '@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2))': dependencies: - debug: 4.3.5 + debug: 4.4.0 ethers: 6.13.1 hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2) lodash.isequal: 4.5.0 @@ -6212,7 +6598,7 @@ snapshots: '@nomicfoundation/ignition-core': 0.15.5 '@nomicfoundation/ignition-ui': 0.15.5 chalk: 4.1.2 - debug: 4.3.5 + debug: 4.4.0 fs-extra: 10.1.0 hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2) prompts: 2.4.2 @@ -6227,7 +6613,7 @@ snapshots: '@ethersproject/address': 5.7.0 cbor: 8.1.0 chalk: 2.4.2 - debug: 4.3.5 + debug: 4.4.0 hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2) lodash.clonedeep: 4.5.0 semver: 6.3.1 @@ -6241,7 +6627,7 @@ snapshots: '@ethersproject/address': 5.6.1 '@nomicfoundation/solidity-analyzer': 0.1.1 cbor: 9.0.2 - debug: 4.3.5 + debug: 4.4.0 ethers: 6.13.1 fs-extra: 10.1.0 immer: 10.0.2 @@ -6562,19 +6948,19 @@ snapshots: transitivePeerDependencies: - encoding - '@openzeppelin/defender-sdk-deploy-client@1.14.3(debug@4.3.5)': + '@openzeppelin/defender-sdk-deploy-client@1.14.3(debug@4.4.0)': dependencies: '@openzeppelin/defender-sdk-base-client': 1.14.3 - axios: 1.7.2(debug@4.3.5) + axios: 1.7.2(debug@4.4.0) lodash: 4.17.21 transitivePeerDependencies: - debug - encoding - '@openzeppelin/defender-sdk-network-client@1.14.3(debug@4.3.5)': + '@openzeppelin/defender-sdk-network-client@1.14.3(debug@4.4.0)': dependencies: '@openzeppelin/defender-sdk-base-client': 1.14.3 - axios: 1.7.2(debug@4.3.5) + axios: 1.7.2(debug@4.4.0) lodash: 4.17.21 transitivePeerDependencies: - debug @@ -6584,11 +6970,11 @@ snapshots: dependencies: '@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)) '@openzeppelin/defender-sdk-base-client': 1.14.3 - '@openzeppelin/defender-sdk-deploy-client': 1.14.3(debug@4.3.5) - '@openzeppelin/defender-sdk-network-client': 1.14.3(debug@4.3.5) + '@openzeppelin/defender-sdk-deploy-client': 1.14.3(debug@4.4.0) + '@openzeppelin/defender-sdk-network-client': 1.14.3(debug@4.4.0) '@openzeppelin/upgrades-core': 1.35.1 chalk: 4.1.2 - debug: 4.3.5 + debug: 4.4.0 ethereumjs-util: 7.1.5 ethers: 6.13.1 hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2) @@ -6613,7 +6999,7 @@ snapshots: cbor: 9.0.2 chalk: 4.1.2 compare-versions: 6.1.1 - debug: 4.3.5 + debug: 4.4.0 ethereumjs-util: 7.1.5 minimist: 1.2.8 proper-lockfile: 4.1.2 @@ -6632,53 +7018,110 @@ snapshots: transitivePeerDependencies: - supports-color - '@rollup/pluginutils@5.1.0(rollup@4.12.0)': + '@rollup/pluginutils@5.1.0(rollup@4.32.0)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.12.0 + rollup: 4.32.0 '@rollup/rollup-android-arm-eabi@4.12.0': optional: true + '@rollup/rollup-android-arm-eabi@4.32.0': + optional: true + '@rollup/rollup-android-arm64@4.12.0': optional: true + '@rollup/rollup-android-arm64@4.32.0': + optional: true + '@rollup/rollup-darwin-arm64@4.12.0': optional: true + '@rollup/rollup-darwin-arm64@4.32.0': + optional: true + '@rollup/rollup-darwin-x64@4.12.0': optional: true + '@rollup/rollup-darwin-x64@4.32.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.32.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.32.0': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.12.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.32.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.32.0': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.12.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.32.0': + optional: true + '@rollup/rollup-linux-arm64-musl@4.12.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.32.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.32.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.32.0': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.12.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.32.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.32.0': + optional: true + '@rollup/rollup-linux-x64-gnu@4.12.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.32.0': + optional: true + '@rollup/rollup-linux-x64-musl@4.12.0': optional: true + '@rollup/rollup-linux-x64-musl@4.32.0': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.12.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.32.0': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.12.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.32.0': + optional: true + '@rollup/rollup-win32-x64-msvc@4.12.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.32.0': + optional: true + '@scure/base@1.1.7': {} '@scure/base@1.2.4': {} @@ -7033,12 +7476,12 @@ snapshots: '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)) '@openzeppelin/hardhat-upgrades': 3.2.1(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)))(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)))(ethers@6.13.1)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2)) '@openzeppelin/upgrades-core': 1.35.1 - axios: 1.7.2(debug@4.3.5) + axios: 1.7.2 ethers: 6.13.1 fs-extra: 10.1.0 hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.2) hardhat-deploy: 0.11.45 - tenderly: 0.9.1(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.4))(typescript@5.5.4) + tenderly: 0.9.1(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.4) ts-node: 10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.4) tslog: 4.9.3 typescript: 5.5.4 @@ -7109,6 +7552,8 @@ snapshots: '@types/estree@1.0.5': {} + '@types/estree@1.0.6': {} + '@types/express-serve-static-core@4.17.43': dependencies: '@types/node': 20.11.19 @@ -7262,7 +7707,7 @@ snapshots: '@typescript-eslint/type-utils': 7.0.2(eslint@8.56.0)(typescript@5.5.2) '@typescript-eslint/utils': 7.0.2(eslint@8.56.0)(typescript@5.5.2) '@typescript-eslint/visitor-keys': 7.0.2 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 eslint: 8.56.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -7280,7 +7725,7 @@ snapshots: '@typescript-eslint/types': 7.0.2 '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.5.2) '@typescript-eslint/visitor-keys': 7.0.2 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 eslint: 8.56.0 optionalDependencies: typescript: 5.5.2 @@ -7296,7 +7741,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.5.2) '@typescript-eslint/utils': 7.0.2(eslint@8.56.0)(typescript@5.5.2) - debug: 4.3.5 + debug: 4.3.4 eslint: 8.56.0 ts-api-utils: 1.2.1(typescript@5.5.2) optionalDependencies: @@ -7310,7 +7755,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.0.2 '@typescript-eslint/visitor-keys': 7.0.2 - debug: 4.3.5 + debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -7360,11 +7805,11 @@ snapshots: - debug - utf-8-validate - '@vitest/coverage-v8@1.3.1(vitest@1.3.1(@types/node@20.11.19))': + '@vitest/coverage-v8@1.3.1(vitest@1.6.0(@types/node@20.11.19))': dependencies: '@ampproject/remapping': 2.2.1 '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 @@ -7375,7 +7820,7 @@ snapshots: std-env: 3.7.0 test-exclude: 6.0.0 v8-to-istanbul: 9.2.0 - vitest: 1.3.1(@types/node@20.11.19) + vitest: 1.6.0(@types/node@20.11.19) transitivePeerDependencies: - supports-color @@ -7383,12 +7828,12 @@ snapshots: dependencies: '@vitest/spy': 0.34.6 '@vitest/utils': 0.34.6 - chai: 4.4.1 + chai: 4.5.0 - '@vitest/expect@1.3.1': + '@vitest/expect@1.6.0': dependencies: - '@vitest/spy': 1.3.1 - '@vitest/utils': 1.3.1 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 chai: 4.4.1 '@vitest/runner@0.34.6': @@ -7397,19 +7842,19 @@ snapshots: p-limit: 4.0.0 pathe: 1.1.2 - '@vitest/runner@1.3.1': + '@vitest/runner@1.6.0': dependencies: - '@vitest/utils': 1.3.1 + '@vitest/utils': 1.6.0 p-limit: 5.0.0 pathe: 1.1.2 '@vitest/snapshot@0.34.6': dependencies: - magic-string: 0.30.10 + magic-string: 0.30.17 pathe: 1.1.2 pretty-format: 29.7.0 - '@vitest/snapshot@1.3.1': + '@vitest/snapshot@1.6.0': dependencies: magic-string: 0.30.7 pathe: 1.1.2 @@ -7419,7 +7864,7 @@ snapshots: dependencies: tinyspy: 2.2.1 - '@vitest/spy@1.3.1': + '@vitest/spy@1.6.0': dependencies: tinyspy: 2.2.1 @@ -7429,7 +7874,7 @@ snapshots: loupe: 2.3.7 pretty-format: 29.7.0 - '@vitest/utils@1.3.1': + '@vitest/utils@1.6.0': dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 @@ -7584,6 +8029,8 @@ snapshots: acorn@8.12.0: {} + acorn@8.14.0: {} + adm-zip@0.4.16: {} aes-js@3.0.0: {} @@ -7670,9 +8117,7 @@ snapshots: argparse@2.0.1: {} - aria-query@5.3.0: - dependencies: - dequal: 2.0.3 + aria-query@5.3.2: {} array-buffer-byte-length@1.0.1: dependencies: @@ -7719,38 +8164,44 @@ snapshots: dependencies: possible-typed-array-names: 1.0.0 - axios@0.21.4(debug@4.3.5): + axios@0.21.4(debug@4.4.0): dependencies: - follow-redirects: 1.15.6(debug@4.3.5) + follow-redirects: 1.15.6(debug@4.4.0) transitivePeerDependencies: - debug axios@0.27.2: dependencies: - follow-redirects: 1.15.6(debug@4.3.5) + follow-redirects: 1.15.6 form-data: 4.0.0 transitivePeerDependencies: - debug - axios@1.7.2(debug@4.3.5): + axios@1.7.2: dependencies: - follow-redirects: 1.15.6(debug@4.3.5) + follow-redirects: 1.15.6 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axios@1.7.7: + axios@1.7.2(debug@4.4.0): dependencies: - follow-redirects: 1.15.6(debug@4.3.5) + follow-redirects: 1.15.6(debug@4.4.0) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axobject-query@4.0.0: + axios@1.7.7: dependencies: - dequal: 2.0.3 + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + axobject-query@4.1.0: {} b4a@1.6.7: {} @@ -7942,6 +8393,16 @@ snapshots: pathval: 1.1.1 type-detect: 4.0.8 + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -8030,9 +8491,9 @@ snapshots: code-red@1.0.4: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - '@types/estree': 1.0.5 - acorn: 8.12.0 + '@jridgewell/sourcemap-codec': 1.5.0 + '@types/estree': 1.0.6 + acorn: 8.14.0 estree-walker: 3.0.3 periscopic: 3.1.0 @@ -8130,7 +8591,7 @@ snapshots: css-tree@2.3.1: dependencies: mdn-data: 2.0.30 - source-map-js: 1.2.0 + source-map-js: 1.2.1 data-uri-to-buffer@4.0.1: {} @@ -8162,6 +8623,10 @@ snapshots: dependencies: ms: 2.0.0 + debug@4.3.4: + dependencies: + ms: 2.1.2 + debug@4.3.4(supports-color@5.5.0): dependencies: ms: 2.1.2 @@ -8178,6 +8643,10 @@ snapshots: dependencies: ms: 2.1.2 + debug@4.4.0: + dependencies: + ms: 2.1.3 + decamelize@4.0.0: {} decompress-response@6.0.0: @@ -8216,8 +8685,6 @@ snapshots: depd@2.0.0: {} - dequal@2.0.3: {} - destroy@1.2.0: {} detect-libc@2.0.2: {} @@ -8409,6 +8876,32 @@ snapshots: '@esbuild/win32-ia32': 0.20.1 '@esbuild/win32-x64': 0.20.1 + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + escalade@3.1.2: {} escape-html@1.0.3: {} @@ -8437,7 +8930,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -8487,7 +8980,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 esutils@2.0.3: {} @@ -8819,10 +9312,16 @@ snapshots: follow-redirects@1.15.5: {} + follow-redirects@1.15.6: {} + follow-redirects@1.15.6(debug@4.3.5): optionalDependencies: debug: 4.3.5 + follow-redirects@1.15.6(debug@4.4.0): + optionalDependencies: + debug: 4.4.0 + for-each@0.3.3: dependencies: is-callable: 1.2.7 @@ -9036,10 +9535,10 @@ snapshots: '@ethersproject/transactions': 5.7.0 '@ethersproject/wallet': 5.7.0 '@types/qs': 6.9.11 - axios: 0.21.4(debug@4.3.5) + axios: 0.21.4(debug@4.4.0) chalk: 4.1.2 chokidar: 3.6.0 - debug: 4.3.5 + debug: 4.4.0 enquirer: 2.4.1 ethers: 5.7.2 form-data: 4.0.0 @@ -9331,9 +9830,9 @@ snapshots: is-plain-obj@4.1.0: {} - is-reference@3.0.2: + is-reference@3.0.3: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 is-regex@1.1.4: dependencies: @@ -9405,7 +9904,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.5 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -9485,11 +9984,11 @@ snapshots: kysely: 0.27.4 postgres: 3.4.4 - kysely-supabase@0.2.0(@supabase/supabase-js@2.47.10)(kysely@0.27.4)(supabase@2.2.1): + kysely-supabase@0.2.0(@supabase/supabase-js@2.47.10)(kysely@0.27.4)(supabase@2.6.8): dependencies: '@supabase/supabase-js': 2.47.10 kysely: 0.27.4 - supabase: 2.2.1 + supabase: 2.6.8 kysely@0.27.4: {} @@ -9548,9 +10047,9 @@ snapshots: luxon@3.4.4: {} - magic-string@0.30.10: + magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 magic-string@0.30.7: dependencies: @@ -9734,6 +10233,8 @@ snapshots: nanoid@3.3.7: {} + nanoid@3.3.8: {} + napi-build-utils@1.0.2: {} natural-compare@1.4.0: {} @@ -9911,11 +10412,11 @@ snapshots: p-limit@4.0.0: dependencies: - yocto-queue: 1.0.0 + yocto-queue: 1.1.1 p-limit@5.0.0: dependencies: - yocto-queue: 1.0.0 + yocto-queue: 1.1.1 p-locate@5.0.0: dependencies: @@ -9979,9 +10480,9 @@ snapshots: periscopic@3.1.0: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 estree-walker: 3.0.3 - is-reference: 3.0.2 + is-reference: 3.0.3 pg-cloudflare@1.1.1: optional: true @@ -10058,6 +10559,12 @@ snapshots: picocolors: 1.0.0 source-map-js: 1.0.2 + postcss@8.5.1: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postgres-array@2.0.0: {} postgres-array@3.0.2: {} @@ -10105,7 +10612,7 @@ snapshots: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 - react-is: 18.2.0 + react-is: 18.3.1 pretty-ms@9.0.0: dependencies: @@ -10181,7 +10688,7 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-is@18.2.0: {} + react-is@18.3.1: {} read-cmd-shim@5.0.0: {} @@ -10212,7 +10719,7 @@ snapshots: require-in-the-middle@7.3.0: dependencies: - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 module-details-from-path: 1.0.3 resolve: 1.22.8 transitivePeerDependencies: @@ -10263,19 +10770,19 @@ snapshots: dependencies: bn.js: 5.2.1 - rollup-plugin-swc3@0.11.2(@swc/core@1.10.4)(rollup@4.12.0): + rollup-plugin-swc3@0.11.2(@swc/core@1.10.4)(rollup@4.32.0): dependencies: '@fastify/deepmerge': 1.3.0 - '@rollup/pluginutils': 5.1.0(rollup@4.12.0) + '@rollup/pluginutils': 5.1.0(rollup@4.32.0) '@swc/core': 1.10.4 get-tsconfig: 4.7.5 - rollup: 4.12.0 - rollup-preserve-directives: 1.1.1(rollup@4.12.0) + rollup: 4.32.0 + rollup-preserve-directives: 1.1.1(rollup@4.32.0) - rollup-preserve-directives@1.1.1(rollup@4.12.0): + rollup-preserve-directives@1.1.1(rollup@4.32.0): dependencies: - magic-string: 0.30.10 - rollup: 4.12.0 + magic-string: 0.30.17 + rollup: 4.32.0 rollup@4.12.0: dependencies: @@ -10296,6 +10803,31 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.12.0 fsevents: 2.3.3 + rollup@4.32.0: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.32.0 + '@rollup/rollup-android-arm64': 4.32.0 + '@rollup/rollup-darwin-arm64': 4.32.0 + '@rollup/rollup-darwin-x64': 4.32.0 + '@rollup/rollup-freebsd-arm64': 4.32.0 + '@rollup/rollup-freebsd-x64': 4.32.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.32.0 + '@rollup/rollup-linux-arm-musleabihf': 4.32.0 + '@rollup/rollup-linux-arm64-gnu': 4.32.0 + '@rollup/rollup-linux-arm64-musl': 4.32.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.32.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.32.0 + '@rollup/rollup-linux-riscv64-gnu': 4.32.0 + '@rollup/rollup-linux-s390x-gnu': 4.32.0 + '@rollup/rollup-linux-x64-gnu': 4.32.0 + '@rollup/rollup-linux-x64-musl': 4.32.0 + '@rollup/rollup-win32-arm64-msvc': 4.32.0 + '@rollup/rollup-win32-ia32-msvc': 4.32.0 + '@rollup/rollup-win32-x64-msvc': 4.32.0 + fsevents: 2.3.3 + run-async@3.0.0: {} run-parallel@1.2.0: @@ -10489,6 +11021,8 @@ snapshots: source-map-js@1.2.0: {} + source-map-js@1.2.1: {} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -10601,7 +11135,7 @@ snapshots: '@tokenizer/token': 0.3.0 peek-readable: 5.3.1 - supabase@2.2.1: + supabase@2.6.8: dependencies: bin-links: 5.0.0 https-proxy-agent: 7.0.5 @@ -10614,7 +11148,7 @@ snapshots: dependencies: component-emitter: 1.3.1 cookiejar: 2.1.4 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 fast-safe-stringify: 2.1.1 form-data: 4.0.0 formidable: 2.1.2 @@ -10656,18 +11190,18 @@ snapshots: svelte@4.2.18: dependencies: '@ampproject/remapping': 2.3.0 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 - '@types/estree': 1.0.5 - acorn: 8.12.0 - aria-query: 5.3.0 - axobject-query: 4.0.0 + '@types/estree': 1.0.6 + acorn: 8.14.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 code-red: 1.0.4 css-tree: 2.3.1 estree-walker: 3.0.3 - is-reference: 3.0.2 + is-reference: 3.0.3 locate-character: 3.0.0 - magic-string: 0.30.10 + magic-string: 0.30.17 periscopic: 3.1.0 table@6.8.2: @@ -10717,7 +11251,7 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 - tenderly@0.9.1(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.4))(typescript@5.5.4): + tenderly@0.9.1(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.11.19)(typescript@5.5.2))(typescript@5.5.4): dependencies: axios: 0.27.2 cli-table3: 0.6.5 @@ -10761,7 +11295,7 @@ snapshots: tinypool@0.7.0: {} - tinypool@0.8.2: {} + tinypool@0.8.4: {} tinyspy@2.2.1: {} @@ -10861,6 +11395,8 @@ snapshots: type-detect@4.0.8: {} + type-detect@4.1.0: {} + type-fest@0.20.2: {} type-fest@0.21.3: {} @@ -11021,25 +11557,26 @@ snapshots: vite-node@0.34.6(@types/node@20.14.2): dependencies: cac: 6.7.14 - debug: 4.3.5 + debug: 4.4.0 mlly: 1.6.0 pathe: 1.1.2 - picocolors: 1.0.0 - vite: 5.1.4(@types/node@20.14.2) + picocolors: 1.1.1 + vite: 5.4.14(@types/node@20.14.2) transitivePeerDependencies: - '@types/node' - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - vite-node@1.3.1(@types/node@20.11.19): + vite-node@1.6.0(@types/node@20.11.19): dependencies: cac: 6.7.14 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 vite: 5.1.4(@types/node@20.11.19) @@ -11053,13 +11590,13 @@ snapshots: - supports-color - terser - vite-tsconfig-paths@4.3.1(typescript@5.5.2)(vite@5.1.4(@types/node@20.11.19)): + vite-tsconfig-paths@4.3.1(typescript@5.5.2)(vite@5.4.14(@types/node@20.11.19)): dependencies: - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 globrex: 0.1.2 tsconfck: 3.0.2(typescript@5.5.2) optionalDependencies: - vite: 5.1.4(@types/node@20.11.19) + vite: 5.4.14(@types/node@20.11.19) transitivePeerDependencies: - supports-color - typescript @@ -11073,20 +11610,30 @@ snapshots: '@types/node': 20.11.19 fsevents: 2.3.3 - vite@5.1.4(@types/node@20.14.2): + vite@5.4.14(@types/node@20.11.19): dependencies: - esbuild: 0.19.12 - postcss: 8.4.35 - rollup: 4.12.0 + esbuild: 0.21.5 + postcss: 8.5.1 + rollup: 4.32.0 + optionalDependencies: + '@types/node': 20.11.19 + fsevents: 2.3.3 + optional: true + + vite@5.4.14(@types/node@20.14.2): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.1 + rollup: 4.32.0 optionalDependencies: '@types/node': 20.14.2 fsevents: 2.3.3 - vitest-mock-extended@1.3.1(typescript@5.5.2)(vitest@1.3.1(@types/node@20.11.19)): + vitest-mock-extended@1.3.1(typescript@5.5.2)(vitest@1.6.0(@types/node@20.11.19)): dependencies: ts-essentials: 9.4.2(typescript@5.5.2) typescript: 5.5.2 - vitest: 1.3.1(@types/node@20.11.19) + vitest: 1.6.0(@types/node@20.11.19) vitest@0.34.6: dependencies: @@ -11101,38 +11648,39 @@ snapshots: acorn: 8.12.0 acorn-walk: 8.3.3 cac: 6.7.14 - chai: 4.4.1 - debug: 4.3.5 + chai: 4.5.0 + debug: 4.4.0 local-pkg: 0.4.3 - magic-string: 0.30.10 + magic-string: 0.30.17 pathe: 1.1.2 - picocolors: 1.0.0 + picocolors: 1.1.1 std-env: 3.7.0 strip-literal: 1.3.0 tinybench: 2.6.0 tinypool: 0.7.0 - vite: 5.1.4(@types/node@20.14.2) + vite: 5.4.14(@types/node@20.14.2) vite-node: 0.34.6(@types/node@20.14.2) why-is-node-running: 2.2.2 transitivePeerDependencies: - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - vitest@1.3.1(@types/node@20.11.19): + vitest@1.6.0(@types/node@20.11.19): dependencies: - '@vitest/expect': 1.3.1 - '@vitest/runner': 1.3.1 - '@vitest/snapshot': 1.3.1 - '@vitest/spy': 1.3.1 - '@vitest/utils': 1.3.1 + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 acorn-walk: 8.3.2 chai: 4.4.1 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 execa: 8.0.1 local-pkg: 0.5.0 magic-string: 0.30.7 @@ -11141,9 +11689,9 @@ snapshots: std-env: 3.7.0 strip-literal: 2.0.0 tinybench: 2.6.0 - tinypool: 0.8.2 + tinypool: 0.8.4 vite: 5.1.4(@types/node@20.11.19) - vite-node: 1.3.1(@types/node@20.11.19) + vite-node: 1.6.0(@types/node@20.11.19) why-is-node-running: 2.2.2 optionalDependencies: '@types/node': 20.11.19 @@ -11163,7 +11711,7 @@ snapshots: wait-on@7.2.0: dependencies: - axios: 1.7.2(debug@4.3.5) + axios: 1.7.2 joi: 17.13.1 lodash: 4.17.21 minimist: 1.2.8 @@ -11309,7 +11857,7 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.0.0: {} + yocto-queue@1.1.1: {} yoctocolors@2.0.2: {} From 0bd284f3aa66e7978d5d4a1430311c49f9c1e1e9 Mon Sep 17 00:00:00 2001 From: jipstavenuiter Date: Wed, 22 Jan 2025 20:59:36 -0300 Subject: [PATCH 4/6] feat(migrations): add currency_amount, fee_amounts, and fee_recipients columns to sales table - Introduced new columns to the sales table to store currency amounts, fee amounts as an array, and fee recipients as an array. --- src/types/database-generated.types.ts | 9 +++++++++ ...rency_admount_fee_amounts_fee_recipients_to_sales.sql | 5 +++++ 2 files changed, 14 insertions(+) create mode 100644 supabase/migrations/20250122235527_add_currency_admount_fee_amounts_fee_recipients_to_sales.sql diff --git a/src/types/database-generated.types.ts b/src/types/database-generated.types.ts index a5979c1..f647505 100644 --- a/src/types/database-generated.types.ts +++ b/src/types/database-generated.types.ts @@ -466,6 +466,9 @@ export type Database = { creation_block_number: number creation_block_timestamp: number currency: string + currency_amount: number + fee_amounts: number[] + fee_recipients: string[] hypercert_id: string id: string item_ids: number[] @@ -480,6 +483,9 @@ export type Database = { creation_block_number: number creation_block_timestamp: number currency: string + currency_amount?: number + fee_amounts?: number[] + fee_recipients?: string[] hypercert_id: string id?: string item_ids: number[] @@ -494,6 +500,9 @@ export type Database = { creation_block_number?: number creation_block_timestamp?: number currency?: string + currency_amount?: number + fee_amounts?: number[] + fee_recipients?: string[] hypercert_id?: string id?: string item_ids?: number[] diff --git a/supabase/migrations/20250122235527_add_currency_admount_fee_amounts_fee_recipients_to_sales.sql b/supabase/migrations/20250122235527_add_currency_admount_fee_amounts_fee_recipients_to_sales.sql new file mode 100644 index 0000000..77616e4 --- /dev/null +++ b/supabase/migrations/20250122235527_add_currency_admount_fee_amounts_fee_recipients_to_sales.sql @@ -0,0 +1,5 @@ +alter table "public"."sales" add column "currency_amount" numeric(78, 0) not null default '0'::numeric(78, 0); + +alter table "public"."sales" add column "fee_amounts" numeric(78, 0)[] not null default '{}'::numeric(78, 0)[]; + +alter table "public"."sales" add column "fee_recipients" text[] not null default '{}'::text[]; \ No newline at end of file From 14fb9d48ba6d242b12d4fc8d485fa15043dcca08 Mon Sep 17 00:00:00 2001 From: jipstavenuiter Date: Wed, 22 Jan 2025 16:49:44 -0300 Subject: [PATCH 5/6] feat(parser): enhance TakerBid event parsing with currency and fee details - Updated `parseTakerBidEvent` to include parsing of currency amount, fee amounts, and fee recipients. - Refactored transaction log handling to support HypercertExchange and ERC20 ABI. - Expanded `TakerBid` schema in `storeTakerBid` to accommodate new fields for currency and fees. --- src/parsing/parseTakerBidEvent.ts | 138 ++++++++++++++++++++--------- src/storage/storeTakerBid.ts | 4 +- test/parsing/takerBidEvent.test.ts | 134 +++++++++++++++++++++++----- 3 files changed, 212 insertions(+), 64 deletions(-) diff --git a/src/parsing/parseTakerBidEvent.ts b/src/parsing/parseTakerBidEvent.ts index 8f7fac6..ec3d225 100644 --- a/src/parsing/parseTakerBidEvent.ts +++ b/src/parsing/parseTakerBidEvent.ts @@ -1,8 +1,14 @@ -import { getAddress, isAddress, parseEventLogs } from "viem"; +import { + erc20Abi, + getAddress, + isAddress, + parseEventLogs, + zeroAddress, +} from "viem"; import { z } from "zod"; import { messages } from "@/utils/validation.js"; import { getEvmClient } from "@/clients/evmClient.js"; -import { HypercertMinterAbi } from "@hypercerts-org/sdk"; +import { HypercertExchangeAbi, HypercertMinterAbi } from "@hypercerts-org/sdk"; import { getDeployment } from "@/utils/getDeployment.js"; import { TakerBid } from "@/storage/storeTakerBid.js"; import { ParserMethod } from "@/indexer/LogParser.js"; @@ -40,7 +46,7 @@ import { getHypercertTokenId } from "@/utils/tokenIds.js"; * console.log(parsedEvent); // { bidUser: "0x5678", bidRecipient: "0x5678", strategyId: 1234n, ... }/ **/ -const TakerBidEventSchema = z.object({ +export const TakerBidEventSchema = z.object({ address: z.string().refine(isAddress, { message: messages.INVALID_ADDRESS }), params: z.object({ nonceInvalidationParameters: z.object({ @@ -83,52 +89,95 @@ export const parseTakerBidEvent: ParserMethod = async ({ const bid = TakerBidEventSchema.parse(event); // parse logs to get claimID, contractAddress and cid - const transactionLogs = await client - .getTransactionReceipt({ + const transactionReceipt = await client.getTransactionReceipt({ + hash: bid.transactionHash as `0x${string}`, + }); + + // parse logs to get claimID, contractAddress and cid + const transactionLogsHypercertMinter = transactionReceipt.logs.filter( + (log) => + log.address.toLowerCase() === + addresses?.HypercertMinterUUPS?.toLowerCase(), + ); + + const parsedLogs = parseEventLogs({ + abi: HypercertMinterAbi, + logs: transactionLogsHypercertMinter, + }); + + // Look for both BatchValueTransfer and TransferSingle events + const batchValueTransferLog = parsedLogs.find( + // @ts-expect-error eventName is missing in the type + (log) => log.eventName === "BatchValueTransfer", + ); + const transferSingleLog = parsedLogs.find( + // @ts-expect-error eventName is missing in the type + (log) => log.eventName === "TransferSingle", + ); + + // Get the claim ID from either event type + let claimId; + // @ts-expect-error args is missing in the type + if (batchValueTransferLog?.args?.claimIDs?.[0]) { + // @ts-expect-error args is missing in the type + claimId = batchValueTransferLog.args.claimIDs[0]; + // @ts-expect-error args is missing in the type + } else if (transferSingleLog?.args?.id) { + // In this case, the ID from the transferSingleLog is a fraction token ID + // We need to get the claim ID from the fraction token ID + // @ts-expect-error args is missing in the type + claimId = getHypercertTokenId(transferSingleLog.args.id); + } + + if (!claimId) { + throw new Error( + "Failed to find claim ID in BatchValueTransfer or TransferSingle events", + ); + } + + const hypercertId = `${chain_id}-${getAddress(bid.params?.collection)}-${claimId}`; + + let currencyAmount = 0n; + const currency = getAddress(bid.params.currency); + if (currency === zeroAddress) { + // Get value of the transaction + const transaction = await client.getTransaction({ hash: bid.transactionHash as `0x${string}`, - }) - .then((res) => { - return res.logs.filter( - (log) => - log.address.toLowerCase() === - addresses?.HypercertMinterUUPS?.toLowerCase(), - ); }); - - const parsedLogs = parseEventLogs({ - abi: HypercertMinterAbi, - logs: transactionLogs, + currencyAmount = transaction.value; + } else { + const currencyLogs = transactionReceipt.logs.filter( + (log) => log.address.toLowerCase() === currency.toLowerCase(), + ); + const parsedCurrencyLogs = parseEventLogs({ + abi: erc20Abi, + logs: currencyLogs, }); - - // Look for both BatchValueTransfer and TransferSingle events - const batchValueTransferLog = parsedLogs.find( - // @ts-expect-error eventName is missing in the type - (log) => log.eventName === "BatchValueTransfer" + const transferLogs = parsedCurrencyLogs.filter( + (log) => log.eventName === "Transfer", ); - const transferSingleLog = parsedLogs.find( - // @ts-expect-error eventName is missing in the type - (log) => log.eventName === "TransferSingle" + currencyAmount = transferLogs.reduce( + (acc, transferLog) => acc + (transferLog?.args?.value ?? 0n), + 0n, ); + } + + const exchangeLogs = transactionReceipt.logs.filter( + (log) => + log.address.toLowerCase() === + addresses?.HypercertExchange?.toLowerCase(), + ); + + const parsedExchangeLog = parseEventLogs({ + abi: HypercertExchangeAbi, + logs: exchangeLogs, + // @ts-expect-error eventName is missing in the type + }).find((log) => log.eventName === "TakerBid"); - // Get the claim ID from either event type - let claimId; - if (batchValueTransferLog?.args?.claimIDs?.[0]) { - // @ts-expect-error args is missing in the type - claimId = batchValueTransferLog.args.claimIDs[0]; - } else if (transferSingleLog?.args?.id) { - // In this case, the ID from the transferSingleLog is a fraction token ID - // We need to get the claim ID from the fraction token ID - // @ts-expect-error args is missing in the type - claimId = getHypercertTokenId(transferSingleLog.args.id); - } - - if (!claimId) { - throw new Error( - "Failed to find claim ID in BatchValueTransfer or TransferSingle events" - ); - } - - const hypercertId = `${chain_id}-${getAddress(bid.params?.collection)}-${claimId}`; + // @ts-expect-error args is missing in the type + const fee_amounts = parsedExchangeLog?.args?.feeAmounts; + // @ts-expect-error args is missing in the type + const fee_recipients = parsedExchangeLog?.args?.feeRecipients; return [ TakerBid.parse({ @@ -141,6 +190,9 @@ export const parseTakerBidEvent: ParserMethod = async ({ strategy_id: bid.params.strategyId, hypercert_id: hypercertId, transaction_hash: bid.transactionHash, + currency_amount: currencyAmount, + fee_amounts: fee_amounts, + fee_recipients: fee_recipients, }), ]; } catch (e) { diff --git a/src/storage/storeTakerBid.ts b/src/storage/storeTakerBid.ts index 01b1d3b..1e186ce 100644 --- a/src/storage/storeTakerBid.ts +++ b/src/storage/storeTakerBid.ts @@ -25,6 +25,9 @@ export const TakerBid = z.object({ hypercert_id: z.string(), amounts: z.array(z.bigint()), transaction_hash: z.string(), + currency_amount: z.bigint(), + fee_amounts: z.array(z.bigint()), + fee_recipients: z.array(z.string().refine(isAddress, { message: "Invalid fee recipient address" })), }); export type TakerBid = z.infer; @@ -100,7 +103,6 @@ export const storeTakerBid: StorageMethod = async ({ const rpcUrl = getRpcUrl(Number(chain_id)); const hypercertsExchange = new HypercertExchangeClient( Number(chain_id), - // @ts-expect-error - No types available new ethers.JsonRpcProvider(rpcUrl), ); diff --git a/test/parsing/takerBidEvent.test.ts b/test/parsing/takerBidEvent.test.ts index e2ef546..64bc55f 100644 --- a/test/parsing/takerBidEvent.test.ts +++ b/test/parsing/takerBidEvent.test.ts @@ -2,24 +2,29 @@ import { describe, expect, it, vi, beforeEach } from "vitest"; import { parseTakerBidEvent } from "../../src/parsing/parseTakerBidEvent.js"; import { faker } from "@faker-js/faker"; import { Block } from "@hypercerts-org/chainsauce"; -import { getAddress } from "viem"; +import { getAddress, zeroAddress } from "viem"; import { getEvmClient } from "../../src/clients/evmClient.js"; import { getHypercertTokenId } from "../../src/utils/tokenIds.js"; const mocks = vi.hoisted(() => ({ getTransactionReceipt: vi.fn(), + getTransaction: vi.fn(), })); vi.mock("../../src/clients/evmClient", () => ({ getEvmClient: () => ({ getTransactionReceipt: mocks.getTransactionReceipt, + getTransaction: mocks.getTransaction, }), })); describe("parseTakerBidEvent", () => { const chainId = 11155111; const collection = getAddress("0xa16dfb32eb140a6f3f2ac68f41dad8c7e83c4941"); + // Sepolia exchange + const exchange = getAddress("0xB1991E985197d14669852Be8e53ee95A1f4621c0"); const minterAddress = getAddress(faker.finance.ethereumAddress()); + const value = 20n; const block: Block = { chainId, @@ -55,10 +60,10 @@ describe("parseTakerBidEvent", () => { itemIds: [faker.number.bigInt()], amounts: [faker.number.bigInt()], feeRecipients: [ - getAddress(faker.finance.ethereumAddress()), - getAddress(faker.finance.ethereumAddress()), + getAddress("0xB522133dBd9C8B424429D89d821aeb2a115dB678"), + getAddress("0x0000000000000000000000000000000000000000"), ], - feeAmounts: [faker.number.bigInt(), faker.number.bigInt()], + feeAmounts: [495000000000n, 0n, 5000000000n], }, blockNumber: faker.number.bigInt(), transactionHash: faker.string.hexadecimal({ @@ -82,6 +87,21 @@ describe("parseTakerBidEvent", () => { removed: false, }); + const createExchangeLog = () => ({ + eventName: "TakerBid", + address: exchange, + topics: [ + "0x3ee3de4684413690dee6fff1a0a4f92916a1b97d1c5a83cdf24671844306b2e3", + ], + data: "0x6a5602672d2849055abe12d68382f4f2799f5a6668846088e0c8a7d2b95b26f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008dc78d23f722b648a36a162ad126b4fd6a24e3e20000000000000000000000008dc78d23f722b648a36a162ad126b4fd6a24e3e200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2d179166bc9dbb00a03686a5b17ece2224c270400000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000b522133dbd9c8b424429d89d821aeb2a115db678000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073404c96000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012a05f2000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000160000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000002faf080", + blockNumber: faker.number.bigInt(), + blockHash: faker.string.hexadecimal({ length: 64 }) as `0x${string}`, + transactionHash: faker.string.hexadecimal({ length: 64 }) as `0x${string}`, + transactionIndex: faker.number.int(), + logIndex: faker.number.int(), + removed: false, + }); + const createTransferSingleLog = (tokenId: bigint) => ({ eventName: "TransferSingle", address: collection, @@ -103,18 +123,27 @@ describe("parseTakerBidEvent", () => { removed: false, }); + const createCurrencyLog = () => ({ + eventName: "Transfer", + address: event.params.currency, + topics: [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x000000000000000000000000c3593524e2744e547f013e17e6b0776bc27fc614", + "0x000000000000000000000000c3593524e2744e547f013e17e6b0776bc27fc614", + ], + data: "0x0000000000000000000000000000000000000000000000000000000000000014", + }); + describe("hypercert ID construction", () => { it("correctly constructs hypercert ID from BatchValueTransfer event", async () => { const claimId = 238878221578498801351288974417101284442112n; mocks.getTransactionReceipt.mockResolvedValue({ - logs: [createBatchValueTransferLog()], + logs: [createBatchValueTransferLog(), createExchangeLog()], }); const [bid] = await parseTakerBidEvent({ event, context }); - expect(bid.hypercert_id).toEqual( - `${chainId}-${collection}-${claimId}`, - ); + expect(bid.hypercert_id).toEqual(`${chainId}-${collection}-${claimId}`); }); it("correctly constructs hypercert ID from TransferSingle event with fraction token ID", async () => { @@ -123,28 +152,24 @@ describe("parseTakerBidEvent", () => { const fractionId = 34368519059014784809800835350608589357056n; mocks.getTransactionReceipt.mockResolvedValue({ - logs: [createTransferSingleLog(fractionId)], + logs: [createTransferSingleLog(fractionId), createExchangeLog()], }); const [bid] = await parseTakerBidEvent({ event, context }); - expect(bid.hypercert_id).toBe( - `${chainId}-${collection}-${claimId}`, - ); + expect(bid.hypercert_id).toBe(`${chainId}-${collection}-${claimId}`); expect(getHypercertTokenId(fractionId)).toBe(claimId); }); it("uses the first claim ID when BatchValueTransfer contains multiple IDs", async () => { const firstClaimId = 238878221578498801351288974417101284442112n; mocks.getTransactionReceipt.mockResolvedValue({ - logs: [createBatchValueTransferLog()], + logs: [createBatchValueTransferLog(), createExchangeLog()], }); const [bid] = await parseTakerBidEvent({ event, context }); - expect(bid.hypercert_id).toBe( - `${chainId}-${collection}-${firstClaimId}`, - ); + expect(bid.hypercert_id).toBe(`${chainId}-${collection}-${firstClaimId}`); }); it("throws when BatchValueTransfer has empty claimIDs array", async () => { @@ -174,10 +199,18 @@ describe("parseTakerBidEvent", () => { }); describe("event parsing", () => { - it("successfully parses event with BatchValueTransfer log", async () => { + it("successfully parses event with BatchValueTransfer log for ERC20 currency", async () => { const claimId = 238878221578498801351288974417101284442112n; mocks.getTransactionReceipt.mockResolvedValue({ - logs: [createBatchValueTransferLog()], + logs: [ + createBatchValueTransferLog(), + createExchangeLog(), + createCurrencyLog(), + ], + }); + + mocks.getTransaction.mockResolvedValue({ + value, }); const [bid] = await parseTakerBidEvent({ event, context }); @@ -185,12 +218,46 @@ describe("parseTakerBidEvent", () => { expect(bid).toBeDefined(); expect(bid.buyer).toBe(getAddress(event.params.bidRecipient)); expect(bid.seller).toBe(getAddress(event.params.feeRecipients[0])); + expect(bid.fee_amounts).toEqual(event.params.feeAmounts); + expect(bid.fee_recipients).toEqual(event.params.feeRecipients); + expect(bid.currency_amount).toEqual(value); }); - it("successfully parses event with TransferSingle log", async () => { + it("successfully parses event with BatchValueTransfer log for native currency", async () => { + const claimId = 238878221578498801351288974417101284442112n; + mocks.getTransactionReceipt.mockResolvedValue({ + logs: [createBatchValueTransferLog(), createExchangeLog()], + }); + + const value = faker.number.bigInt(); + mocks.getTransaction.mockResolvedValue({ + value, + }); + + const [bid] = await parseTakerBidEvent({ + event: { + ...event, + params: { ...event.params, currency: zeroAddress }, + }, + context, + }); + + expect(bid).toBeDefined(); + expect(bid.buyer).toBe(getAddress(event.params.bidRecipient)); + expect(bid.seller).toBe(getAddress(event.params.feeRecipients[0])); + expect(bid.fee_amounts).toEqual(event.params.feeAmounts); + expect(bid.fee_recipients).toEqual(event.params.feeRecipients); + expect(bid.currency_amount).toEqual(value); + }); + + it("successfully parses event with TransferSingle log for ERC20 currency", async () => { const fractionId = 34368519059014784809800835350608589357056n; mocks.getTransactionReceipt.mockResolvedValue({ - logs: [createTransferSingleLog(fractionId)], + logs: [ + createTransferSingleLog(fractionId), + createExchangeLog(), + createCurrencyLog(), + ], }); const [bid] = await parseTakerBidEvent({ event, context }); @@ -198,6 +265,33 @@ describe("parseTakerBidEvent", () => { expect(bid).toBeDefined(); expect(bid.transaction_hash).toBe(event.transactionHash); expect(bid.strategy_id).toBe(event.params.strategyId); + expect(bid.currency_amount).toBe(value); + }); + + it("successfully parses event with TransferSingle log for native currency", async () => { + const fractionId = 34368519059014784809800835350608589357056n; + mocks.getTransactionReceipt.mockResolvedValue({ + logs: [createTransferSingleLog(fractionId), createExchangeLog()], + }); + + mocks.getTransaction.mockResolvedValue({ + value, + }); + + const [bid] = await parseTakerBidEvent({ + event: { + ...event, + params: { ...event.params, currency: zeroAddress }, + }, + context, + }); + + expect(bid).toBeDefined(); + expect(bid.buyer).toBe(getAddress(event.params.bidRecipient)); + expect(bid.seller).toBe(getAddress(event.params.feeRecipients[0])); + expect(bid.fee_amounts).toEqual(event.params.feeAmounts); + expect(bid.fee_recipients).toEqual(event.params.feeRecipients); + expect(bid.currency_amount).toEqual(value); }); it("throws when no transfer logs are found", async () => { From 3e7924515e9085973771acb5c5eaa51c7e0eef3e Mon Sep 17 00:00:00 2001 From: jipstavenuiter Date: Wed, 22 Jan 2025 16:51:29 -0300 Subject: [PATCH 6/6] feat(scripts): implement sales values updater for Hypercerts - this script will retroactively update existing rows in the sales table of supabase to contain fee_amounts, fee_recipients and currency_amount - it will also update any hypercert_id's that erronously ended up with an 'undefined' for the token ID --- scripts/update_sales_values.ts | 190 +++++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 scripts/update_sales_values.ts diff --git a/scripts/update_sales_values.ts b/scripts/update_sales_values.ts new file mode 100644 index 0000000..7f17983 --- /dev/null +++ b/scripts/update_sales_values.ts @@ -0,0 +1,190 @@ +import "dotenv/config"; + +import { createClient } from "@supabase/supabase-js"; +import { parseClaimOrFractionId } from "@hypercerts-org/sdk"; +import { createPublicClient, erc20Abi, zeroAddress } from "viem"; +import { http } from "viem"; +import { + arbitrum, + arbitrumSepolia, + base, + baseSepolia, + celo, + filecoin, + filecoinCalibration, + optimism, +} from "viem/chains"; +import { Chain } from "viem"; +import { sepolia } from "viem/chains"; +import { HypercertMinterAbi } from "@hypercerts-org/sdk"; +import { parseEventLogs } from "viem"; +import { TakerBid } from "../src/storage/storeTakerBid.js"; +import { getAddress } from "viem"; +import { getDeployment } from "../src/utils/getDeployment.js"; +import { getHypercertTokenId } from "../src/utils/tokenIds.js"; +import { HypercertExchangeAbi } from "@hypercerts-org/sdk"; +import { EvmClientFactory } from "../src/clients/evmClient.js"; + +const getChain = (chainId: number) => { + const chains: Record = { + 10: optimism, + 314: filecoin, + 8453: base, + 42161: arbitrum, + 42220: celo, + 84532: baseSepolia, + 314159: filecoinCalibration, + 421614: arbitrumSepolia, + 11155111: sepolia, + }; + + const chain = chains[chainId]; + if (!chain) throw new Error(`Unsupported chain ID: ${chainId}`); + return chain; +}; + +const main = async () => { + console.log("update_sales_values"); + // Get all sales rows + // Create supabase client + const supabase = createClient( + process.env.SUPABASE_CACHING_DB_URL!, + process.env.SUPABASE_CACHING_SERVICE_API_KEY!, + ); + const salesResponse = await supabase.from("sales").select("*"); + const sales = salesResponse.data; + + if (!sales) { + console.log("No sales found"); + return; + } + + const results: TakerBid[] = []; + for (const sale of sales) { + const tokenId = BigInt(sale.item_ids[0]); + const claimId = getHypercertTokenId(tokenId); + const hypercert_id = sale.hypercert_id.replace("undefined", claimId); + const chainId = parseClaimOrFractionId(hypercert_id).chainId; + + if (!chainId) { + throw new Error( + `No chainId found for sale ${sale.transaction_hash} ${hypercert_id}`, + ); + } + + // Get transaction and parse logs using viem + const client = EvmClientFactory.createClient(Number(chainId)); + const { addresses } = getDeployment(Number(chainId)); + const { currency } = sale; + + try { + const transactionReceipt = await client.getTransactionReceipt({ + hash: sale.transaction_hash as `0x${string}`, + }); + + // parse logs to get claimID, contractAddress and cid + const transactionLogsHypercertMinter = transactionReceipt.logs.filter( + (log) => + log.address.toLowerCase() === + addresses?.HypercertMinterUUPS?.toLowerCase(), + ); + + let currencyAmount = 0n; + if (currency === zeroAddress) { + // Get value of the transaction + const transaction = await client.getTransaction({ + hash: sale.transaction_hash as `0x${string}`, + }); + currencyAmount = transaction.value; + } else { + const currencyLogs = transactionReceipt.logs.filter( + (log) => log.address.toLowerCase() === currency.toLowerCase(), + ); + const parsedCurrencyLogs = parseEventLogs({ + abi: erc20Abi, + logs: currencyLogs, + }); + const transferLogs = parsedCurrencyLogs.filter( + (log) => log.eventName === "Transfer", + ); + currencyAmount = transferLogs.reduce( + (acc, transferLog) => acc + (transferLog?.args?.value ?? 0n), + 0n, + ); + } + + const exchangeLogs = transactionReceipt.logs.filter( + (log) => + log.address.toLowerCase() === + addresses?.HypercertExchange?.toLowerCase(), + ); + + const parsedExchangeLog = parseEventLogs({ + abi: HypercertExchangeAbi, + logs: exchangeLogs, + // @ts-expect-error eventName is missing in the type + }).find((log) => log.eventName === "TakerBid"); + + // @ts-expect-error args is missing in the type + const fee_amounts = parsedExchangeLog?.args?.feeAmounts; + // @ts-expect-error args is missing in the type + const fee_recipients = parsedExchangeLog?.args?.feeRecipients; + + results.push( + TakerBid.parse({ + amounts: sale.amounts.map((amount) => BigInt(amount)), + seller: getAddress(sale.seller), + buyer: getAddress(sale.buyer), + currency: getAddress(sale.currency), + collection: getAddress(sale.collection), + item_ids: sale.item_ids.map((item_id) => BigInt(item_id)), + strategy_id: BigInt(sale.strategy_id), + hypercert_id: hypercert_id, + transaction_hash: sale.transaction_hash, + currency_amount: currencyAmount, + fee_amounts: fee_amounts, + fee_recipients: fee_recipients, + }), + ); + } catch (e) { + console.log("Error parsing transaction", JSON.stringify(sale, null, 2)); + console.log(e); + continue; + } + } + + // Combine parsed results with original sales data by matching transaction hashes + const rowsToUpsert = results.map((result) => { + const originalSale = sales.find( + (sale) => sale.transaction_hash === result.transaction_hash, + ); + if (!originalSale) { + throw new Error( + `Could not find original sale for transaction ${result.transaction_hash}`, + ); + } + return { + ...originalSale, + ...result, + strategy_id: result.strategy_id.toString(), + item_ids: result.item_ids.map((id) => id.toString()), + amounts: result.amounts.map((amount) => amount.toString()), + currency_amount: result.currency_amount.toString(), + fee_amounts: result.fee_amounts.map((amount) => amount.toString()), + }; + }); + + + // Upsert rows + console.log("Upserting rows"); + console.log(JSON.stringify(rowsToUpsert, null, 2)); + const res = await supabase + .from("sales") + .upsert(rowsToUpsert) + .select("*") + .throwOnError(); + console.log("Rows after upsert"); + console.log(JSON.stringify(res.data, null, 2)); +}; + +main();